diff --git a/vtkm/rendering/raytracing/CylinderIntersector.cxx b/vtkm/rendering/raytracing/CylinderIntersector.cxx index 6ba21c854..0a2dc04fa 100644 --- a/vtkm/rendering/raytracing/CylinderIntersector.cxx +++ b/vtkm/rendering/raytracing/CylinderIntersector.cxx @@ -371,18 +371,30 @@ class GetScalar : public vtkm::worklet::WorkletMapField private: Precision MinScalar; Precision invDeltaScalar; + bool Normalize; public: VTKM_CONT GetScalar(const vtkm::Float32& minScalar, const vtkm::Float32& maxScalar) : MinScalar(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); + Normalize = true; + if (minScalar > maxScalar) + { + // support the scalar renderer + Normalize = false; + MinScalar = 0; + invDeltaScalar = 1; + } 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 ExecutionSignature(_1, _2, _3, _4); @@ -399,8 +411,10 @@ public: vtkm::Id3 pointId = indicesPortal.Get(hitIndex); scalar = Precision(scalars.Get(pointId[0])); - //normalize - scalar = (scalar - MinScalar) * invDeltaScalar; + if (Normalize) + { + scalar = (scalar - MinScalar) * invDeltaScalar; + } } }; //class GetScalar diff --git a/vtkm/rendering/raytracing/CylinderIntersector.h b/vtkm/rendering/raytracing/CylinderIntersector.h index 555940b26..343ee2dde 100644 --- a/vtkm/rendering/raytracing/CylinderIntersector.h +++ b/vtkm/rendering/raytracing/CylinderIntersector.h @@ -53,11 +53,11 @@ public: void IntersectionData(Ray& rays, const vtkm::cont::Field scalarField, - const vtkm::Range& scalarRange) override; + const vtkm::Range& scalarRange = vtkm::Range()) override; void IntersectionData(Ray& rays, const vtkm::cont::Field scalarField, - const vtkm::Range& scalarRange) override; + const vtkm::Range& scalarRange = vtkm::Range()) override; vtkm::Id GetNumberOfShapes() const override; }; // class ShapeIntersector diff --git a/vtkm/rendering/raytracing/QuadIntersector.cxx b/vtkm/rendering/raytracing/QuadIntersector.cxx index 2117fe583..a79b1607b 100644 --- a/vtkm/rendering/raytracing/QuadIntersector.cxx +++ b/vtkm/rendering/raytracing/QuadIntersector.cxx @@ -358,18 +358,30 @@ class GetScalar : public vtkm::worklet::WorkletMapField private: Precision MinScalar; Precision invDeltaScalar; + bool Normalize; public: VTKM_CONT GetScalar(const vtkm::Float32& minScalar, const vtkm::Float32& maxScalar) : MinScalar(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); + Normalize = true; + if (minScalar > maxScalar) + { + // support the scalar renderer + Normalize = false; + MinScalar = 0; + invDeltaScalar = 1; + } 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 ExecutionSignature(_1, _2, _3, _4); @@ -386,8 +398,10 @@ public: vtkm::Vec pointId = indicesPortal.Get(hitIndex); scalar = Precision(scalars.Get(pointId[0])); - //normalize - scalar = (scalar - MinScalar) * invDeltaScalar; + if (Normalize) + { + scalar = (scalar - MinScalar) * invDeltaScalar; + } } }; //class GetScalar diff --git a/vtkm/rendering/raytracing/QuadIntersector.h b/vtkm/rendering/raytracing/QuadIntersector.h index b23bf81f9..fb04d7573 100644 --- a/vtkm/rendering/raytracing/QuadIntersector.h +++ b/vtkm/rendering/raytracing/QuadIntersector.h @@ -51,11 +51,11 @@ public: void IntersectionData(Ray& rays, const vtkm::cont::Field scalarField, - const vtkm::Range& scalarRange) override; + const vtkm::Range& scalarRange = vtkm::Range()) override; void IntersectionData(Ray& rays, const vtkm::cont::Field scalarField, - const vtkm::Range& scalarRange) override; + const vtkm::Range& scalarRange = vtkm::Range()) override; vtkm::Id GetNumberOfShapes() const override; }; // class ShapeIntersector diff --git a/vtkm/rendering/raytracing/ScalarRenderer.cxx b/vtkm/rendering/raytracing/ScalarRenderer.cxx index 74c9f8836..55e06b9a0 100644 --- a/vtkm/rendering/raytracing/ScalarRenderer.cxx +++ b/vtkm/rendering/raytracing/ScalarRenderer.cxx @@ -124,7 +124,6 @@ void ScalarRenderer::AddField(const vtkm::cont::Field& scalarField) { throw vtkm::cont::ErrorBadValue("ScalarRenderer(AddField): field must be a scalar"); } - Ranges.push_back(ranges.ReadPortal().Get(0)); Fields.push_back(scalarField); } @@ -172,7 +171,7 @@ void ScalarRenderer::RenderOnDevice(Ray& rays, Precision missScalar) for (size_t f = 0; f < numFields; ++f) { timer.Start(); - Intersector->IntersectionData(rays, Fields[f], Ranges[f]); + Intersector->IntersectionData(rays, Fields[f]); time = timer.GetElapsedTime(); logger->AddLogData("intersection_data", time); AddBuffer(rays, missScalar, Fields[f].GetName()); diff --git a/vtkm/rendering/raytracing/ScalarRenderer.h b/vtkm/rendering/raytracing/ScalarRenderer.h index caf6b7b8a..71335769e 100644 --- a/vtkm/rendering/raytracing/ScalarRenderer.h +++ b/vtkm/rendering/raytracing/ScalarRenderer.h @@ -29,7 +29,6 @@ class VTKM_RENDERING_EXPORT ScalarRenderer protected: std::shared_ptr Intersector; std::vector Fields; - std::vector Ranges; bool IntersectorValid; template diff --git a/vtkm/rendering/raytracing/ShapeIntersector.h b/vtkm/rendering/raytracing/ShapeIntersector.h index 85145b6ad..fd80ae4a2 100644 --- a/vtkm/rendering/raytracing/ShapeIntersector.h +++ b/vtkm/rendering/raytracing/ShapeIntersector.h @@ -54,11 +54,11 @@ public: // virtual void IntersectionData(Ray& rays, const vtkm::cont::Field scalarField, - const vtkm::Range& scalarRange) = 0; + const vtkm::Range& scalarRange = vtkm::Range()) = 0; virtual void IntersectionData(Ray& rays, const vtkm::cont::Field scalarField, - const vtkm::Range& scalarRange) = 0; + const vtkm::Range& scalarRange = vtkm::Range()) = 0; template diff --git a/vtkm/rendering/raytracing/SphereIntersector.cxx b/vtkm/rendering/raytracing/SphereIntersector.cxx index a9d8ffd7f..1c3cfe180 100644 --- a/vtkm/rendering/raytracing/SphereIntersector.cxx +++ b/vtkm/rendering/raytracing/SphereIntersector.cxx @@ -249,18 +249,30 @@ class GetScalar : public vtkm::worklet::WorkletMapField private: Precision MinScalar; Precision invDeltaScalar; + bool Normalize; public: VTKM_CONT GetScalar(const vtkm::Float32& minScalar, const vtkm::Float32& maxScalar) : MinScalar(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); + Normalize = true; + if (minScalar > maxScalar) + { + // support the scalar renderer + Normalize = false; + MinScalar = 0; + invDeltaScalar = 1; + } 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 ExecutionSignature(_1, _2, _3, _4); @@ -276,8 +288,10 @@ public: vtkm::Id pointId = indicesPortal.Get(hitIndex); scalar = Precision(scalars.Get(pointId)); - //normalize - scalar = (scalar - MinScalar) * invDeltaScalar; + if (Normalize) + { + scalar = (scalar - MinScalar) * invDeltaScalar; + } } }; //class GetScalar diff --git a/vtkm/rendering/raytracing/TriangleIntersector.cxx b/vtkm/rendering/raytracing/TriangleIntersector.cxx index dd71f072a..56cc42a5e 100644 --- a/vtkm/rendering/raytracing/TriangleIntersector.cxx +++ b/vtkm/rendering/raytracing/TriangleIntersector.cxx @@ -243,18 +243,30 @@ public: private: Precision MinScalar; Precision invDeltaScalar; + bool Normalize; public: VTKM_CONT LerpScalar(const vtkm::Float32& minScalar, const vtkm::Float32& maxScalar) : MinScalar(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); + Normalize = true; + if (minScalar > maxScalar) + { + // support the scalar renderer + Normalize = false; + MinScalar = 0; + invDeltaScalar = 1; + } 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, FieldIn, @@ -282,7 +294,10 @@ public: Precision cScalar = Precision(scalars.Get(indices[3])); lerpedScalar = aScalar * n + bScalar * u + cScalar * v; //normalize - lerpedScalar = (lerpedScalar - MinScalar) * invDeltaScalar; + if (Normalize) + { + lerpedScalar = (lerpedScalar - MinScalar) * invDeltaScalar; + } } }; //class LerpScalar diff --git a/vtkm/rendering/raytracing/TriangleIntersector.h b/vtkm/rendering/raytracing/TriangleIntersector.h index 73c397905..ed55aa364 100644 --- a/vtkm/rendering/raytracing/TriangleIntersector.h +++ b/vtkm/rendering/raytracing/TriangleIntersector.h @@ -46,11 +46,11 @@ public: VTKM_CONT void IntersectionData(Ray& rays, const vtkm::cont::Field scalarField, - const vtkm::Range& scalarRange) override; + const vtkm::Range& scalarRange = vtkm::Range()) override; VTKM_CONT void IntersectionData(Ray& rays, const vtkm::cont::Field scalarField, - const vtkm::Range& scalarRange) override; + const vtkm::Range& scalarRange = vtkm::Range()) override; template VTKM_CONT void IntersectRaysImp(Ray& rays, bool returnCellIndex);