don't always normalize scalars

This commit is contained in:
Matt Larsen 2020-04-23 10:31:39 -07:00
parent d2ebecdb27
commit 4c0a3858b2
10 changed files with 93 additions and 38 deletions

@ -371,18 +371,30 @@ class GetScalar : public vtkm::worklet::WorkletMapField
private: private:
Precision MinScalar; Precision MinScalar;
Precision invDeltaScalar; Precision invDeltaScalar;
bool Normalize;
public: public:
VTKM_CONT VTKM_CONT
GetScalar(const vtkm::Float32& minScalar, const vtkm::Float32& maxScalar) GetScalar(const vtkm::Float32& minScalar, const vtkm::Float32& maxScalar)
: MinScalar(minScalar) : MinScalar(minScalar)
{ {
//Make sure the we don't divide by zero on Normalize = true;
//something like an iso-surface if (minScalar > maxScalar)
if (maxScalar - MinScalar != 0.f) {
invDeltaScalar = 1.f / (maxScalar - MinScalar); // support the scalar renderer
Normalize = false;
MinScalar = 0;
invDeltaScalar = 1;
}
else else
invDeltaScalar = 1.f / minScalar; {
//Make sure the we don't divide by zero on
//something like an iso-surface
if (maxScalar - MinScalar != 0.f)
invDeltaScalar = 1.f / (maxScalar - MinScalar);
else
invDeltaScalar = 1.f / minScalar;
}
} }
typedef void ControlSignature(FieldIn, FieldInOut, WholeArrayIn, WholeArrayIn); typedef void ControlSignature(FieldIn, FieldInOut, WholeArrayIn, WholeArrayIn);
typedef void ExecutionSignature(_1, _2, _3, _4); typedef void ExecutionSignature(_1, _2, _3, _4);
@ -399,8 +411,10 @@ public:
vtkm::Id3 pointId = indicesPortal.Get(hitIndex); vtkm::Id3 pointId = indicesPortal.Get(hitIndex);
scalar = Precision(scalars.Get(pointId[0])); scalar = Precision(scalars.Get(pointId[0]));
//normalize if (Normalize)
scalar = (scalar - MinScalar) * invDeltaScalar; {
scalar = (scalar - MinScalar) * invDeltaScalar;
}
} }
}; //class GetScalar }; //class GetScalar

@ -53,11 +53,11 @@ public:
void IntersectionData(Ray<vtkm::Float32>& rays, void IntersectionData(Ray<vtkm::Float32>& rays,
const vtkm::cont::Field scalarField, const vtkm::cont::Field scalarField,
const vtkm::Range& scalarRange) override; const vtkm::Range& scalarRange = vtkm::Range()) override;
void IntersectionData(Ray<vtkm::Float64>& rays, void IntersectionData(Ray<vtkm::Float64>& rays,
const vtkm::cont::Field scalarField, const vtkm::cont::Field scalarField,
const vtkm::Range& scalarRange) override; const vtkm::Range& scalarRange = vtkm::Range()) override;
vtkm::Id GetNumberOfShapes() const override; vtkm::Id GetNumberOfShapes() const override;
}; // class ShapeIntersector }; // class ShapeIntersector

@ -358,18 +358,30 @@ class GetScalar : public vtkm::worklet::WorkletMapField
private: private:
Precision MinScalar; Precision MinScalar;
Precision invDeltaScalar; Precision invDeltaScalar;
bool Normalize;
public: public:
VTKM_CONT VTKM_CONT
GetScalar(const vtkm::Float32& minScalar, const vtkm::Float32& maxScalar) GetScalar(const vtkm::Float32& minScalar, const vtkm::Float32& maxScalar)
: MinScalar(minScalar) : MinScalar(minScalar)
{ {
//Make sure the we don't divide by zero on Normalize = true;
//something like an iso-surface if (minScalar > maxScalar)
if (maxScalar - MinScalar != 0.f) {
invDeltaScalar = 1.f / (maxScalar - MinScalar); // support the scalar renderer
Normalize = false;
MinScalar = 0;
invDeltaScalar = 1;
}
else else
invDeltaScalar = 1.f / minScalar; {
//Make sure the we don't divide by zero on
//something like an iso-surface
if (maxScalar - MinScalar != 0.f)
invDeltaScalar = 1.f / (maxScalar - MinScalar);
else
invDeltaScalar = 1.f / minScalar;
}
} }
typedef void ControlSignature(FieldIn, FieldOut, WholeArrayIn, WholeArrayIn); typedef void ControlSignature(FieldIn, FieldOut, WholeArrayIn, WholeArrayIn);
typedef void ExecutionSignature(_1, _2, _3, _4); typedef void ExecutionSignature(_1, _2, _3, _4);
@ -386,8 +398,10 @@ public:
vtkm::Vec<vtkm::Id, 5> pointId = indicesPortal.Get(hitIndex); vtkm::Vec<vtkm::Id, 5> pointId = indicesPortal.Get(hitIndex);
scalar = Precision(scalars.Get(pointId[0])); scalar = Precision(scalars.Get(pointId[0]));
//normalize if (Normalize)
scalar = (scalar - MinScalar) * invDeltaScalar; {
scalar = (scalar - MinScalar) * invDeltaScalar;
}
} }
}; //class GetScalar }; //class GetScalar

@ -51,11 +51,11 @@ public:
void IntersectionData(Ray<vtkm::Float32>& rays, void IntersectionData(Ray<vtkm::Float32>& rays,
const vtkm::cont::Field scalarField, const vtkm::cont::Field scalarField,
const vtkm::Range& scalarRange) override; const vtkm::Range& scalarRange = vtkm::Range()) override;
void IntersectionData(Ray<vtkm::Float64>& rays, void IntersectionData(Ray<vtkm::Float64>& rays,
const vtkm::cont::Field scalarField, const vtkm::cont::Field scalarField,
const vtkm::Range& scalarRange) override; const vtkm::Range& scalarRange = vtkm::Range()) override;
vtkm::Id GetNumberOfShapes() const override; vtkm::Id GetNumberOfShapes() const override;
}; // class ShapeIntersector }; // class ShapeIntersector

@ -124,7 +124,6 @@ void ScalarRenderer::AddField(const vtkm::cont::Field& scalarField)
{ {
throw vtkm::cont::ErrorBadValue("ScalarRenderer(AddField): field must be a scalar"); throw vtkm::cont::ErrorBadValue("ScalarRenderer(AddField): field must be a scalar");
} }
Ranges.push_back(ranges.ReadPortal().Get(0));
Fields.push_back(scalarField); Fields.push_back(scalarField);
} }
@ -172,7 +171,7 @@ void ScalarRenderer::RenderOnDevice(Ray<Precision>& rays, Precision missScalar)
for (size_t f = 0; f < numFields; ++f) for (size_t f = 0; f < numFields; ++f)
{ {
timer.Start(); timer.Start();
Intersector->IntersectionData(rays, Fields[f], Ranges[f]); Intersector->IntersectionData(rays, Fields[f]);
time = timer.GetElapsedTime(); time = timer.GetElapsedTime();
logger->AddLogData("intersection_data", time); logger->AddLogData("intersection_data", time);
AddBuffer(rays, missScalar, Fields[f].GetName()); AddBuffer(rays, missScalar, Fields[f].GetName());

@ -29,7 +29,6 @@ class VTKM_RENDERING_EXPORT ScalarRenderer
protected: protected:
std::shared_ptr<ShapeIntersector> Intersector; std::shared_ptr<ShapeIntersector> Intersector;
std::vector<vtkm::cont::Field> Fields; std::vector<vtkm::cont::Field> Fields;
std::vector<vtkm::Range> Ranges;
bool IntersectorValid; bool IntersectorValid;
template <typename Precision> template <typename Precision>

@ -54,11 +54,11 @@ public:
// //
virtual void IntersectionData(Ray<vtkm::Float32>& rays, virtual void IntersectionData(Ray<vtkm::Float32>& rays,
const vtkm::cont::Field scalarField, const vtkm::cont::Field scalarField,
const vtkm::Range& scalarRange) = 0; const vtkm::Range& scalarRange = vtkm::Range()) = 0;
virtual void IntersectionData(Ray<vtkm::Float64>& rays, virtual void IntersectionData(Ray<vtkm::Float64>& rays,
const vtkm::cont::Field scalarField, const vtkm::cont::Field scalarField,
const vtkm::Range& scalarRange) = 0; const vtkm::Range& scalarRange = vtkm::Range()) = 0;
template <typename Precision> template <typename Precision>

@ -249,18 +249,30 @@ class GetScalar : public vtkm::worklet::WorkletMapField
private: private:
Precision MinScalar; Precision MinScalar;
Precision invDeltaScalar; Precision invDeltaScalar;
bool Normalize;
public: public:
VTKM_CONT VTKM_CONT
GetScalar(const vtkm::Float32& minScalar, const vtkm::Float32& maxScalar) GetScalar(const vtkm::Float32& minScalar, const vtkm::Float32& maxScalar)
: MinScalar(minScalar) : MinScalar(minScalar)
{ {
//Make sure the we don't divide by zero on Normalize = true;
//something like an iso-surface if (minScalar > maxScalar)
if (maxScalar - MinScalar != 0.f) {
invDeltaScalar = 1.f / (maxScalar - MinScalar); // support the scalar renderer
Normalize = false;
MinScalar = 0;
invDeltaScalar = 1;
}
else else
invDeltaScalar = 1.f / minScalar; {
//Make sure the we don't divide by zero on
//something like an iso-surface
if (maxScalar - MinScalar != 0.f)
invDeltaScalar = 1.f / (maxScalar - MinScalar);
else
invDeltaScalar = 1.f / minScalar;
}
} }
typedef void ControlSignature(FieldIn, FieldOut, WholeArrayIn, WholeArrayIn); typedef void ControlSignature(FieldIn, FieldOut, WholeArrayIn, WholeArrayIn);
typedef void ExecutionSignature(_1, _2, _3, _4); typedef void ExecutionSignature(_1, _2, _3, _4);
@ -276,8 +288,10 @@ public:
vtkm::Id pointId = indicesPortal.Get(hitIndex); vtkm::Id pointId = indicesPortal.Get(hitIndex);
scalar = Precision(scalars.Get(pointId)); scalar = Precision(scalars.Get(pointId));
//normalize if (Normalize)
scalar = (scalar - MinScalar) * invDeltaScalar; {
scalar = (scalar - MinScalar) * invDeltaScalar;
}
} }
}; //class GetScalar }; //class GetScalar

@ -243,18 +243,30 @@ public:
private: private:
Precision MinScalar; Precision MinScalar;
Precision invDeltaScalar; Precision invDeltaScalar;
bool Normalize;
public: public:
VTKM_CONT VTKM_CONT
LerpScalar(const vtkm::Float32& minScalar, const vtkm::Float32& maxScalar) LerpScalar(const vtkm::Float32& minScalar, const vtkm::Float32& maxScalar)
: MinScalar(minScalar) : MinScalar(minScalar)
{ {
//Make sure the we don't divide by zero on Normalize = true;
//something like an iso-surface if (minScalar > maxScalar)
if (maxScalar - MinScalar != 0.f) {
invDeltaScalar = 1.f / (maxScalar - MinScalar); // support the scalar renderer
Normalize = false;
MinScalar = 0;
invDeltaScalar = 1;
}
else else
invDeltaScalar = 0.f; {
//Make sure the we don't divide by zero on
//something like an iso-surface
if (maxScalar - MinScalar != 0.f)
invDeltaScalar = 1.f / (maxScalar - MinScalar);
else
invDeltaScalar = 1.f / minScalar;
}
} }
typedef void ControlSignature(FieldIn, typedef void ControlSignature(FieldIn,
FieldIn, FieldIn,
@ -282,7 +294,10 @@ public:
Precision cScalar = Precision(scalars.Get(indices[3])); Precision cScalar = Precision(scalars.Get(indices[3]));
lerpedScalar = aScalar * n + bScalar * u + cScalar * v; lerpedScalar = aScalar * n + bScalar * u + cScalar * v;
//normalize //normalize
lerpedScalar = (lerpedScalar - MinScalar) * invDeltaScalar; if (Normalize)
{
lerpedScalar = (lerpedScalar - MinScalar) * invDeltaScalar;
}
} }
}; //class LerpScalar }; //class LerpScalar

@ -46,11 +46,11 @@ public:
VTKM_CONT void IntersectionData(Ray<vtkm::Float32>& rays, VTKM_CONT void IntersectionData(Ray<vtkm::Float32>& rays,
const vtkm::cont::Field scalarField, const vtkm::cont::Field scalarField,
const vtkm::Range& scalarRange) override; const vtkm::Range& scalarRange = vtkm::Range()) override;
VTKM_CONT void IntersectionData(Ray<vtkm::Float64>& rays, VTKM_CONT void IntersectionData(Ray<vtkm::Float64>& rays,
const vtkm::cont::Field scalarField, const vtkm::cont::Field scalarField,
const vtkm::Range& scalarRange) override; const vtkm::Range& scalarRange = vtkm::Range()) override;
template <typename Precision> template <typename Precision>
VTKM_CONT void IntersectRaysImp(Ray<Precision>& rays, bool returnCellIndex); VTKM_CONT void IntersectRaysImp(Ray<Precision>& rays, bool returnCellIndex);