From d4305c04350c9eb4acde5198084d67a64a8494a0 Mon Sep 17 00:00:00 2001 From: mclarsen Date: Fri, 7 Feb 2020 15:16:09 -0800 Subject: [PATCH 01/12] remove unused variable --- vtkm/rendering/raytracing/RayTracer.h | 1 - 1 file changed, 1 deletion(-) diff --git a/vtkm/rendering/raytracing/RayTracer.h b/vtkm/rendering/raytracing/RayTracer.h index b7923ff33..dffbeafae 100644 --- a/vtkm/rendering/raytracing/RayTracer.h +++ b/vtkm/rendering/raytracing/RayTracer.h @@ -30,7 +30,6 @@ protected: std::vector> Intersectors; Camera camera; vtkm::cont::Field ScalarField; - vtkm::cont::ArrayHandle Scalars; vtkm::Id NumberOfShapes; vtkm::cont::ArrayHandle ColorMap; vtkm::Range ScalarRange; From 9e77a8b4cdf78381541196aa4c27a964f0ec0074 Mon Sep 17 00:00:00 2001 From: mclarsen Date: Fri, 7 Feb 2020 20:30:55 -0800 Subject: [PATCH 02/12] add files for a scalar renderer --- vtkm/rendering/CMakeLists.txt | 1 + vtkm/rendering/raytracing/CMakeLists.txt | 1 + vtkm/rendering/raytracing/ScalarRenderer.cxx | 131 +++++++++++++++++++ vtkm/rendering/raytracing/ScalarRenderer.h | 69 ++++++++++ 4 files changed, 202 insertions(+) create mode 100644 vtkm/rendering/raytracing/ScalarRenderer.cxx create mode 100644 vtkm/rendering/raytracing/ScalarRenderer.h diff --git a/vtkm/rendering/CMakeLists.txt b/vtkm/rendering/CMakeLists.txt index 00e6ca254..0bfb98b6a 100644 --- a/vtkm/rendering/CMakeLists.txt +++ b/vtkm/rendering/CMakeLists.txt @@ -133,6 +133,7 @@ set(device_sources raytracing/QuadIntersector.cxx raytracing/RayTracer.cxx raytracing/RayOperations.cxx + raytracing/ScalarRenderer.cxx raytracing/ShapeIntersector.cxx raytracing/SphereExtractor.cxx raytracing/SphereIntersector.cxx diff --git a/vtkm/rendering/raytracing/CMakeLists.txt b/vtkm/rendering/raytracing/CMakeLists.txt index a32655078..8823c51e9 100644 --- a/vtkm/rendering/raytracing/CMakeLists.txt +++ b/vtkm/rendering/raytracing/CMakeLists.txt @@ -33,6 +33,7 @@ set(headers RayTracer.h RayTracingTypeDefs.h Sampler.h + ScalarRenderer.h ShapeIntersector.h SphereExtractor.h SphereIntersector.h diff --git a/vtkm/rendering/raytracing/ScalarRenderer.cxx b/vtkm/rendering/raytracing/ScalarRenderer.cxx new file mode 100644 index 000000000..b8caee2dc --- /dev/null +++ b/vtkm/rendering/raytracing/ScalarRenderer.cxx @@ -0,0 +1,131 @@ +//============================================================================ +// Copyright (c) Kitware, Inc. +// All rights reserved. +// See LICENSE.txt for details. +// +// This software is distributed WITHOUT ANY WARRANTY; without even +// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +// PURPOSE. See the above copyright notice for more information. +//============================================================================ +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace vtkm +{ +namespace rendering +{ +namespace raytracing +{ + +namespace detail +{ + + +} // namespace detail + +ScalarRenderer::ScalarRenderer() + : NumberOfShapes(0) +{ +} + +ScalarRenderer::~ScalarRenderer() +{ + Clear(); +} + +Camera& ScalarRenderer::GetCamera() +{ + return camera; +} + + +void ScalarRenderer::AddShapeIntersector(std::shared_ptr intersector) +{ + NumberOfShapes += intersector->GetNumberOfShapes(); + Intersectors.push_back(intersector); +} + +void ScalarRenderer::AddField(const vtkm::cont::Field& scalarField) +{ + Fields.push_back(scalar_field); +} + +void ScalarRenderer::Render(Ray& rays) +{ + RenderOnDevice(rays); +} + +void ScalarRenderer::Render(Ray& rays) +{ + RenderOnDevice(rays); +} + +vtkm::Id ScalarRenderer::GetNumberOfShapes() const +{ + return NumberOfShapes; +} + +void ScalarRenderer::Clear() +{ + Intersectors.clear(); +} + +template +void ScalarRenderer::RenderOnDevice(Ray& rays) +{ + using Timer = vtkm::cont::Timer; + + Logger* logger = Logger::GetInstance(); + Timer renderTimer; + renderTimer.Start(); + vtkm::Float64 time = 0.; + logger->OpenLogEntry("ray_tracer"); + logger->AddLogData("device", GetDeviceString()); + + logger->AddLogData("shapes", NumberOfShapes); + logger->AddLogData("num_rays", rays.NumRays); + size_t numShapes = Intersectors.size(); + if (NumberOfShapes > 0) + { + Timer timer; + timer.Start(); + + for (size_t i = 0; i < numShapes; ++i) + { + Intersectors[i]->IntersectRays(rays); + time = timer.GetElapsedTime(); + logger->AddLogData("intersect", time); + + timer.Start(); + Intersectors[i]->IntersectionData(rays, ScalarField, ScalarRange); + time = timer.GetElapsedTime(); + logger->AddLogData("intersection_data", time); + timer.Start(); + + // Calculate the color at the intersection point + //detail::SurfaceColor surfaceColor; + //surfaceColor.run(rays, ColorMap, camera, this->Shade); + + time = timer.GetElapsedTime(); + logger->AddLogData("shade", time); + } + } + + time = renderTimer.GetElapsedTime(); + logger->CloseLogEntry(time); +} // RenderOnDevice +} +} +} // namespace vtkm::rendering::raytracing diff --git a/vtkm/rendering/raytracing/ScalarRenderer.h b/vtkm/rendering/raytracing/ScalarRenderer.h new file mode 100644 index 000000000..8039a3e70 --- /dev/null +++ b/vtkm/rendering/raytracing/ScalarRenderer.h @@ -0,0 +1,69 @@ +//============================================================================ +// Copyright (c) Kitware, Inc. +// All rights reserved. +// See LICENSE.txt for details. +// +// This software is distributed WITHOUT ANY WARRANTY; without even +// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +// PURPOSE. See the above copyright notice for more information. +//============================================================================ +#ifndef vtk_m_rendering_raytracing_ScalarRenderer_h +#define vtk_m_rendering_raytracing_ScalarRenderer_h + +#include +#include + +#include + +#include +#include +namespace vtkm +{ +namespace rendering +{ +namespace raytracing +{ + +class VTKM_RENDERING_EXPORT ScalarRenderer +{ +protected: + std::vector> Intersectors; + std::vector Fields; + Camera camera; + vtkm::Id NumberOfShapes; + + template + void RenderOnDevice(Ray& rays); + +public: + VTKM_CONT + ScalarRenderer(); + VTKM_CONT + ~ScalarRenderer(); + + VTKM_CONT + Camera& GetCamera(); + + VTKM_CONT + void AddShapeIntersector(std::shared_ptr intersector); + + VTKM_CONT + void AddField(const vtkm::cont::Field& scalarField); + + VTKM_CONT + void Render(vtkm::rendering::raytracing::Ray& rays); + + VTKM_CONT + void Render(vtkm::rendering::raytracing::Ray& rays); + + VTKM_CONT + vtkm::Id GetNumberOfShapes() const; + + VTKM_CONT + void Clear(); + +}; //class RayTracer +} +} +} // namespace vtkm::rendering::raytracing +#endif //vtk_m_rendering_raytracing_RayTracer_h From 1fc064dcf8fc033e38d44ec9e6b8dbb40fda0e71 Mon Sep 17 00:00:00 2001 From: Matt Larsen Date: Sun, 9 Feb 2020 08:57:32 -0800 Subject: [PATCH 03/12] create scalar renderer --- vtkm/rendering/raytracing/ScalarRenderer.cxx | 161 +++++++++++++------ vtkm/rendering/raytracing/ScalarRenderer.h | 29 ++-- 2 files changed, 121 insertions(+), 69 deletions(-) diff --git a/vtkm/rendering/raytracing/ScalarRenderer.cxx b/vtkm/rendering/raytracing/ScalarRenderer.cxx index b8caee2dc..7bff525df 100644 --- a/vtkm/rendering/raytracing/ScalarRenderer.cxx +++ b/vtkm/rendering/raytracing/ScalarRenderer.cxx @@ -16,7 +16,6 @@ #include #include -#include #include #include #include @@ -31,59 +30,88 @@ namespace raytracing namespace detail { +template +class WriteBuffer : public vtkm::worklet::WorkletMapField +{ +private: + Precision MissScalar; +public: + VTKM_CONT + WriteBuffer(const Precision missScalar) + : MissScalar(missScalar) + { + } + typedef void ControlSignature(FieldIn, FieldIn, FieldOut); + + typedef void ExecutionSignature(_1, _2, _3); + VTKM_EXEC void operator()(const vtkm::Id& hitIndex, + const Precision& scalar, + Precision& output) const + { + Precision value = scalar; + if (hitIndex < 0) + { + value = MissScalar; + } + + output = value; + } +}; //class WriteBuffer + +template +class WriteDepthBuffer : public vtkm::worklet::WorkletMapField +{ +public: + VTKM_CONT + WriteDepthBuffer() {} + + typedef void ControlSignature(FieldIn, FieldOut); + + typedef void ExecutionSignature(_1, _2); + VTKM_EXEC void operator()(const Precision& depth, Precision& output) const { output = depth; } +}; //class WriteDepthBuffer } // namespace detail ScalarRenderer::ScalarRenderer() - : NumberOfShapes(0) + : IntersectorValid(false) { } ScalarRenderer::~ScalarRenderer() { - Clear(); } -Camera& ScalarRenderer::GetCamera() +void ScalarRenderer::SetShapeIntersector(std::shared_ptr intersector) { - return camera; -} - - -void ScalarRenderer::AddShapeIntersector(std::shared_ptr intersector) -{ - NumberOfShapes += intersector->GetNumberOfShapes(); - Intersectors.push_back(intersector); + Intersector = intersector; + IntersectorValid = true; } void ScalarRenderer::AddField(const vtkm::cont::Field& scalarField) { - Fields.push_back(scalar_field); + vtkm::cont::ArrayHandle ranges = scalarField.GetRange(); + if (ranges.GetNumberOfValues() != 1) + { + throw vtkm::cont::ErrorBadValue("ScalarRenderer(AddField): field must be a scalar"); + } + Ranges.push_back(ranges.GetPortalControl().Get(0)); + Fields.push_back(scalarField); } -void ScalarRenderer::Render(Ray& rays) +void ScalarRenderer::Render(Ray& rays, vtkm::Float32 missScalar) { - RenderOnDevice(rays); + RenderOnDevice(rays, missScalar); } -void ScalarRenderer::Render(Ray& rays) +void ScalarRenderer::Render(Ray& rays, vtkm::Float64 missScalar) { - RenderOnDevice(rays); -} - -vtkm::Id ScalarRenderer::GetNumberOfShapes() const -{ - return NumberOfShapes; -} - -void ScalarRenderer::Clear() -{ - Intersectors.clear(); + RenderOnDevice(rays, missScalar); } template -void ScalarRenderer::RenderOnDevice(Ray& rays) +void ScalarRenderer::RenderOnDevice(Ray& rays, Precision missScalar) { using Timer = vtkm::cont::Timer; @@ -91,41 +119,68 @@ void ScalarRenderer::RenderOnDevice(Ray& rays) Timer renderTimer; renderTimer.Start(); vtkm::Float64 time = 0.; - logger->OpenLogEntry("ray_tracer"); + logger->OpenLogEntry("scalar_renderer"); logger->AddLogData("device", GetDeviceString()); - logger->AddLogData("shapes", NumberOfShapes); logger->AddLogData("num_rays", rays.NumRays); - size_t numShapes = Intersectors.size(); - if (NumberOfShapes > 0) + const size_t numFields = Fields.size(); + + if (numFields == 0) + { + throw vtkm::cont::ErrorBadValue("ScalarRenderer: no fields added"); + } + if (!IntersectorValid) + { + throw vtkm::cont::ErrorBadValue("ScalarRenderer: intersector never set"); + } + + Timer timer; + timer.Start(); + + Intersector->IntersectRays(rays); + time = timer.GetElapsedTime(); + logger->AddLogData("intersect", time); + + for (size_t f = 0; f < numFields; ++f) { - Timer timer; timer.Start(); - - for (size_t i = 0; i < numShapes; ++i) - { - Intersectors[i]->IntersectRays(rays); - time = timer.GetElapsedTime(); - logger->AddLogData("intersect", time); - - timer.Start(); - Intersectors[i]->IntersectionData(rays, ScalarField, ScalarRange); - time = timer.GetElapsedTime(); - logger->AddLogData("intersection_data", time); - timer.Start(); - - // Calculate the color at the intersection point - //detail::SurfaceColor surfaceColor; - //surfaceColor.run(rays, ColorMap, camera, this->Shade); - - time = timer.GetElapsedTime(); - logger->AddLogData("shade", time); - } + Intersector->IntersectionData(rays, Fields[f], Ranges[f]); + time = timer.GetElapsedTime(); + logger->AddLogData("intersection_data", time); + AddBuffer(rays, missScalar, Fields[f].GetName()); } time = renderTimer.GetElapsedTime(); logger->CloseLogEntry(time); } // RenderOnDevice + +template +void ScalarRenderer::AddBuffer(Ray& rays, Precision missScalar, const std::string name) +{ + const vtkm::Int32 numChannels = 1; + ChannelBuffer buffer(numChannels, rays.NumRays); + + vtkm::worklet::DispatcherMapField>( + detail::WriteBuffer(missScalar)) + .Invoke(rays.HitIdx, rays.Scalar, buffer.Buffer); + + buffer.SetName(name); + rays.Buffers.push_back(buffer); +} + +template +void ScalarRenderer::AddDepthBuffer(Ray& rays) +{ + const vtkm::Int32 numChannels = 1; + ChannelBuffer buffer(numChannels, rays.NumRays); + + vtkm::worklet::DispatcherMapField>( + detail::WriteDepthBuffer()) + .Invoke(rays.Depth, buffer.Buffer); + + buffer.SetName("depth"); + rays.Buffers.push_back(buffer); +} } } } // namespace vtkm::rendering::raytracing diff --git a/vtkm/rendering/raytracing/ScalarRenderer.h b/vtkm/rendering/raytracing/ScalarRenderer.h index 8039a3e70..caf6b7b8a 100644 --- a/vtkm/rendering/raytracing/ScalarRenderer.h +++ b/vtkm/rendering/raytracing/ScalarRenderer.h @@ -27,13 +27,19 @@ namespace raytracing class VTKM_RENDERING_EXPORT ScalarRenderer { protected: - std::vector> Intersectors; + std::shared_ptr Intersector; std::vector Fields; - Camera camera; - vtkm::Id NumberOfShapes; + std::vector Ranges; + bool IntersectorValid; template - void RenderOnDevice(Ray& rays); + void RenderOnDevice(Ray& rays, Precision missScalar); + + template + void AddBuffer(Ray& rays, Precision missScalar, const std::string name); + + template + void AddDepthBuffer(Ray& rays); public: VTKM_CONT @@ -42,25 +48,16 @@ public: ~ScalarRenderer(); VTKM_CONT - Camera& GetCamera(); - - VTKM_CONT - void AddShapeIntersector(std::shared_ptr intersector); + void SetShapeIntersector(std::shared_ptr intersector); VTKM_CONT void AddField(const vtkm::cont::Field& scalarField); VTKM_CONT - void Render(vtkm::rendering::raytracing::Ray& rays); + void Render(vtkm::rendering::raytracing::Ray& rays, vtkm::Float32 missScalar); VTKM_CONT - void Render(vtkm::rendering::raytracing::Ray& rays); - - VTKM_CONT - vtkm::Id GetNumberOfShapes() const; - - VTKM_CONT - void Clear(); + void Render(vtkm::rendering::raytracing::Ray& rays, vtkm::Float64 missScalar); }; //class RayTracer } From b4b7519584429cbcd5de6b11cdb3b3ed461a3c41 Mon Sep 17 00:00:00 2001 From: Matt Larsen Date: Mon, 17 Feb 2020 19:00:09 -0800 Subject: [PATCH 04/12] let there be scalar things --- vtkm/rendering/CMakeLists.txt | 2 + vtkm/rendering/ConnectivityProxy.cxx | 2 +- vtkm/rendering/MapperCylinder.cxx | 7 +- vtkm/rendering/MapperPoint.cxx | 7 +- vtkm/rendering/MapperQuad.cxx | 7 +- vtkm/rendering/MapperRayTracer.cxx | 7 +- vtkm/rendering/MapperRayTracer.h | 2 - vtkm/rendering/MapperVolume.cxx | 6 +- vtkm/rendering/ScalarRenderer.cxx | 218 ++++++++++++++++++ vtkm/rendering/ScalarRenderer.h | 57 +++++ vtkm/rendering/raytracing/Camera.cxx | 8 +- vtkm/rendering/raytracing/Camera.h | 4 +- vtkm/rendering/raytracing/ScalarRenderer.cxx | 32 +++ vtkm/rendering/testing/CMakeLists.txt | 1 + .../testing/UnitTestScalarRenderer.cxx | 41 ++++ 15 files changed, 378 insertions(+), 23 deletions(-) create mode 100644 vtkm/rendering/ScalarRenderer.cxx create mode 100644 vtkm/rendering/ScalarRenderer.h create mode 100644 vtkm/rendering/testing/UnitTestScalarRenderer.cxx diff --git a/vtkm/rendering/CMakeLists.txt b/vtkm/rendering/CMakeLists.txt index 0bfb98b6a..cae304028 100644 --- a/vtkm/rendering/CMakeLists.txt +++ b/vtkm/rendering/CMakeLists.txt @@ -63,6 +63,7 @@ set(headers MapperConnectivity.h MapperWireframer.h Quadralizer.h + ScalarRenderer.h TextAnnotation.h TextAnnotationBillboard.h TextAnnotationScreen.h @@ -109,6 +110,7 @@ set(device_sources MapperRayTracer.cxx MapperVolume.cxx MapperWireframer.cxx + ScalarRenderer.cxx Scene.cxx TextAnnotation.cxx TextAnnotationBillboard.cxx diff --git a/vtkm/rendering/ConnectivityProxy.cxx b/vtkm/rendering/ConnectivityProxy.cxx index 88ff2ff88..11d67c803 100644 --- a/vtkm/rendering/ConnectivityProxy.cxx +++ b/vtkm/rendering/ConnectivityProxy.cxx @@ -210,7 +210,7 @@ public: throw vtkm::cont::ErrorBadValue("Conn Proxy: null canvas"); } vtkm::rendering::raytracing::Camera rayCamera; - rayCamera.SetParameters(camera, *canvas); + rayCamera.SetParameters(camera, canvas->GetWidth(), canvas->GetHeight()); vtkm::rendering::raytracing::Ray rays; rayCamera.CreateRays(rays, this->Coords.GetBounds()); rays.Buffers.at(0).InitConst(0.f); diff --git a/vtkm/rendering/MapperCylinder.cxx b/vtkm/rendering/MapperCylinder.cxx index dfbbc7e5e..91c224c1a 100644 --- a/vtkm/rendering/MapperCylinder.cxx +++ b/vtkm/rendering/MapperCylinder.cxx @@ -182,9 +182,10 @@ void MapperCylinder::RenderCells(const vtkm::cont::DynamicCellSet& cellset, // // Create rays // - vtkm::rendering::raytracing::Camera& cam = this->Internals->Tracer.GetCamera(); - cam.SetParameters(camera, *this->Internals->Canvas); - this->Internals->RayCamera.SetParameters(camera, *this->Internals->Canvas); + vtkm::Int32 width = this->Internals->Canvas->GetWidth(); + vtkm::Int32 height = this->Internals->Canvas->GetHeight(); + + this->Internals->RayCamera.SetParameters(camera, width, height); this->Internals->RayCamera.CreateRays(this->Internals->Rays, shapeBounds); this->Internals->Rays.Buffers.at(0).InitConst(0.f); diff --git a/vtkm/rendering/MapperPoint.cxx b/vtkm/rendering/MapperPoint.cxx index 3b4a3d0cf..c5b2d728d 100644 --- a/vtkm/rendering/MapperPoint.cxx +++ b/vtkm/rendering/MapperPoint.cxx @@ -181,9 +181,10 @@ void MapperPoint::RenderCells(const vtkm::cont::DynamicCellSet& cellset, // // Create rays // - vtkm::rendering::raytracing::Camera& cam = this->Internals->Tracer.GetCamera(); - cam.SetParameters(camera, *this->Internals->Canvas); - this->Internals->RayCamera.SetParameters(camera, *this->Internals->Canvas); + vtkm::Int32 width = this->Internals->Canvas->GetWidth(); + vtkm::Int32 height = this->Internals->Canvas->GetHeight(); + + this->Internals->RayCamera.SetParameters(camera, width, height); this->Internals->RayCamera.CreateRays(this->Internals->Rays, shapeBounds); this->Internals->Rays.Buffers.at(0).InitConst(0.f); diff --git a/vtkm/rendering/MapperQuad.cxx b/vtkm/rendering/MapperQuad.cxx index 3f15b070d..7632dc618 100644 --- a/vtkm/rendering/MapperQuad.cxx +++ b/vtkm/rendering/MapperQuad.cxx @@ -103,9 +103,10 @@ void MapperQuad::RenderCells(const vtkm::cont::DynamicCellSet& cellset, // // Create rays // - vtkm::rendering::raytracing::Camera& cam = this->Internals->Tracer.GetCamera(); - cam.SetParameters(camera, *this->Internals->Canvas); - this->Internals->RayCamera.SetParameters(camera, *this->Internals->Canvas); + vtkm::Int32 width = this->Internals->Canvas->GetWidth(); + vtkm::Int32 height = this->Internals->Canvas->GetHeight(); + + this->Internals->RayCamera.SetParameters(camera, width, height); this->Internals->RayCamera.CreateRays(this->Internals->Rays, shapeBounds); this->Internals->Rays.Buffers.at(0).InitConst(0.f); diff --git a/vtkm/rendering/MapperRayTracer.cxx b/vtkm/rendering/MapperRayTracer.cxx index b8769f597..991a825fc 100644 --- a/vtkm/rendering/MapperRayTracer.cxx +++ b/vtkm/rendering/MapperRayTracer.cxx @@ -107,9 +107,10 @@ void MapperRayTracer::RenderCells(const vtkm::cont::DynamicCellSet& cellset, // // Create rays // - vtkm::rendering::raytracing::Camera& cam = this->Internals->Tracer.GetCamera(); - cam.SetParameters(camera, *this->Internals->Canvas); - this->Internals->RayCamera.SetParameters(camera, *this->Internals->Canvas); + vtkm::Int32 width = this->Internals->Canvas->GetWidth(); + vtkm::Int32 height = this->Internals->Canvas->GetHeight(); + + this->Internals->RayCamera.SetParameters(camera, width, height); this->Internals->RayCamera.CreateRays(this->Internals->Rays, shapeBounds); this->Internals->Rays.Buffers.at(0).InitConst(0.f); diff --git a/vtkm/rendering/MapperRayTracer.h b/vtkm/rendering/MapperRayTracer.h index 97464ba65..d552350a4 100644 --- a/vtkm/rendering/MapperRayTracer.h +++ b/vtkm/rendering/MapperRayTracer.h @@ -47,8 +47,6 @@ public: private: struct InternalsType; std::shared_ptr Internals; - - struct RenderFunctor; }; } } //namespace vtkm::rendering diff --git a/vtkm/rendering/MapperVolume.cxx b/vtkm/rendering/MapperVolume.cxx index 06e4dfeeb..e289ba399 100644 --- a/vtkm/rendering/MapperVolume.cxx +++ b/vtkm/rendering/MapperVolume.cxx @@ -14,7 +14,6 @@ #include #include - #include #include #include @@ -103,7 +102,10 @@ void MapperVolume::RenderCells(const vtkm::cont::DynamicCellSet& cellset, vtkm::rendering::raytracing::Camera rayCamera; vtkm::rendering::raytracing::Ray rays; - rayCamera.SetParameters(camera, *this->Internals->Canvas); + vtkm::Int32 width = this->Internals->Canvas->GetWidth(); + vtkm::Int32 height = this->Internals->Canvas->GetHeight(); + + rayCamera.SetParameters(camera, width, height); rayCamera.CreateRays(rays, coords.GetBounds()); rays.Buffers.at(0).InitConst(0.f); diff --git a/vtkm/rendering/ScalarRenderer.cxx b/vtkm/rendering/ScalarRenderer.cxx new file mode 100644 index 000000000..72a527186 --- /dev/null +++ b/vtkm/rendering/ScalarRenderer.cxx @@ -0,0 +1,218 @@ +//============================================================================ +// Copyright (c) Kitware, Inc. +// All rights reserved. +// See LICENSE.txt for details. +// +// This software is distributed WITHOUT ANY WARRANTY; without even +// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +// PURPOSE. See the above copyright notice for more information. +//============================================================================ + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace vtkm +{ +namespace rendering +{ + +struct ScalarRenderer::InternalsType +{ + bool ValidDataSet; + vtkm::Int32 Width; + vtkm::Int32 Height; + vtkm::Float32 DefaultValue; + vtkm::cont::DataSet DataSet; + vtkm::rendering::raytracing::ScalarRenderer Tracer; + vtkm::Bounds ShapeBounds; + + VTKM_CONT + InternalsType() + : ValidDataSet(false) + , Width(1024) + , Height(1024) + , DefaultValue(vtkm::Nan32()) + { + } +}; + +ScalarRenderer::ScalarRenderer() + : Internals(new InternalsType) +{ +} + +ScalarRenderer::~ScalarRenderer() +{ +} + +void ScalarRenderer::SetWidth(const vtkm::Int32 width) +{ + if (width < 1) + { + throw vtkm::cont::ErrorBadValue("ScalarRenderer: width must be greater than 0"); + } + Internals->Width = width; +} + +void ScalarRenderer::SetDefaultValue(const vtkm::Float32 value) +{ + Internals->DefaultValue = value; +} + +void ScalarRenderer::SetHeight(const vtkm::Int32 height) +{ + if (height < 1) + { + throw vtkm::cont::ErrorBadValue("ScalarRenderer: height must be greater than 0"); + } + Internals->Height = height; +} + +void ScalarRenderer::SetInput(vtkm::cont::DataSet& dataSet) +{ + this->Internals->DataSet = dataSet; + this->Internals->ValidDataSet = true; + + raytracing::TriangleExtractor triExtractor; + vtkm::cont::DynamicCellSet cellSet = this->Internals->DataSet.GetCellSet(); + vtkm::cont::CoordinateSystem coords = this->Internals->DataSet.GetCoordinateSystem(); + triExtractor.ExtractCells(cellSet); + + if (triExtractor.GetNumberOfTriangles() > 0) + { + auto triIntersector = std::make_shared(); + triIntersector->SetData(coords, triExtractor.GetTriangles()); + this->Internals->Tracer.SetShapeIntersector(triIntersector); + this->Internals->ShapeBounds = triIntersector->GetShapeBounds(); + } +} + +ScalarRenderer::Result ScalarRenderer::Render(const vtkm::rendering::Camera& camera) +{ + + if (Internals->ValidDataSet) + { + throw vtkm::cont::ErrorBadValue("ScalarRenderer: input never set"); + } + + raytracing::Logger* logger = raytracing::Logger::GetInstance(); + logger->OpenLogEntry("scalar_render"); + vtkm::cont::Timer tot_timer; + tot_timer.Start(); + vtkm::cont::Timer timer; + timer.Start(); + + // + // Create rays + // + vtkm::rendering::raytracing::Camera cam; + cam.SetParameters(camera, this->Internals->Width, this->Internals->Height); + + vtkm::rendering::raytracing::Ray rays; + cam.CreateRays(rays, this->Internals->ShapeBounds); + rays.Buffers.at(0).InitConst(0.f); + + // add fields + const vtkm::Id numFields = this->Internals->DataSet.GetNumberOfFields(); + std::map rangeMap; + for (vtkm::Id i = 0; i < numFields; ++i) + { + vtkm::cont::Field field = this->Internals->DataSet.GetField(i); + vtkm::cont::ArrayHandle ranges; + ranges = field.GetRange(); + vtkm::Id comps = ranges.GetNumberOfValues(); + if (comps == 1) + { + rangeMap[field.GetName()] = ranges.GetPortalControl().Get(0); + this->Internals->Tracer.AddField(field); + } + } + + this->Internals->Tracer.Render(rays, Internals->DefaultValue); + + using ArrayF32 = vtkm::cont::ArrayHandle; + std::vector res; + std::vector names; + const size_t numBuffers = rays.Buffers.size(); + vtkm::Id expandSize = Internals->Width * Internals->Height; + + for (size_t i = 0; i < numBuffers; ++i) + { + const std::string name = rays.Buffers[i].GetName(); + if (name == "default") + continue; + raytracing::ChannelBuffer buffer = rays.Buffers[i]; + raytracing::ChannelBuffer expanded = + buffer.ExpandBuffer(rays.PixelIdx, expandSize, Internals->DefaultValue); + res.push_back(expanded.Buffer); + names.push_back(name); + } + + raytracing::ChannelBuffer depthChannel(1, rays.NumRays); + depthChannel.Buffer = rays.Distance; + raytracing::ChannelBuffer depthExpanded = + depthChannel.ExpandBuffer(rays.PixelIdx, expandSize, Internals->DefaultValue); + + res.push_back(depthExpanded.Buffer); + names.push_back("depth"); + + Result result; + result.Width = Internals->Width; + result.Height = Internals->Height; + result.Scalars = res; + result.ScalarNames = names; + result.Ranges = rangeMap; + + vtkm::Float64 time = timer.GetElapsedTime(); + logger->AddLogData("write_to_canvas", time); + time = tot_timer.GetElapsedTime(); + logger->CloseLogEntry(time); + + return result; +} + +void ScalarRenderer::Result::SaveVTK(const std::string filename) +{ + if (Scalars.size() == 0) + { + throw vtkm::cont::ErrorBadValue("ScalarRenderer: result empty"); + } + + VTKM_ASSERT(Width > 0); + VTKM_ASSERT(Height > 0); + + vtkm::cont::DataSet result; + vtkm::Vec origin(0.f, 0.f, 0.f); + vtkm::Vec spacing(1.f, 1.f, 1.f); + vtkm::Id3 dims(Width + 1, Height + 1, 1); + result.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coords", dims, origin, spacing)); + vtkm::Id2 dims2(dims[0], dims[1]); + vtkm::cont::CellSetStructured<2> resCellSet; + resCellSet.SetPointDimensions(dims2); + result.SetCellSet(resCellSet); + + const size_t fieldSize = Scalars.size(); + for (size_t i = 0; i < fieldSize; ++i) + { + result.AddField( + vtkm::cont::Field(ScalarNames[i], vtkm::cont::Field::Association::CELL_SET, Scalars[i])); + } + + vtkm::io::writer::VTKDataSetWriter writer(filename + ".vtk"); + writer.WriteDataSet(result); +} +} +} // vtkm::rendering diff --git a/vtkm/rendering/ScalarRenderer.h b/vtkm/rendering/ScalarRenderer.h new file mode 100644 index 000000000..6a5794c67 --- /dev/null +++ b/vtkm/rendering/ScalarRenderer.h @@ -0,0 +1,57 @@ +//============================================================================ +// Copyright (c) Kitware, Inc. +// All rights reserved. +// See LICENSE.txt for details. +// +// This software is distributed WITHOUT ANY WARRANTY; without even +// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +// PURPOSE. See the above copyright notice for more information. +//============================================================================ +#ifndef vtk_m_rendering_ScalarRenderer_h +#define vtk_m_rendering_ScalarRenderer_h + +#include +#include + +#include + +namespace vtkm +{ +namespace rendering +{ + +class VTKM_RENDERING_EXPORT ScalarRenderer +{ +public: + ScalarRenderer(); + + ~ScalarRenderer(); + + void SetInput(vtkm::cont::DataSet& dataSet); + + void SetWidth(const vtkm::Int32 width); + void SetHeight(const vtkm::Int32 height); + void SetDefaultValue(vtkm::Float32 value); + + struct Result + { + vtkm::Int32 Width; + vtkm::Int32 Height; + std::vector> Scalars; + std::vector ScalarNames; + std::map Ranges; + + void SaveVTK(const std::string filename); + }; + + ScalarRenderer::Result Render(const vtkm::rendering::Camera& camera); + + +private: + struct InternalsType; + std::shared_ptr Internals; +}; +} +} //namespace vtkm::rendering + +#endif //vtk_m_rendering_ScalarRenderer_h diff --git a/vtkm/rendering/raytracing/Camera.cxx b/vtkm/rendering/raytracing/Camera.cxx index aedd737b9..08920aee0 100644 --- a/vtkm/rendering/raytracing/Camera.cxx +++ b/vtkm/rendering/raytracing/Camera.cxx @@ -494,17 +494,17 @@ Camera::~Camera() VTKM_CONT void Camera::SetParameters(const vtkm::rendering::Camera& camera, - vtkm::rendering::CanvasRayTracer& canvas) + const vtkm::Int32 width, + const vtkm::Int32 height) { this->SetUp(camera.GetViewUp()); this->SetLookAt(camera.GetLookAt()); this->SetPosition(camera.GetPosition()); this->SetZoom(camera.GetZoom()); this->SetFieldOfView(camera.GetFieldOfView()); - this->SetHeight(static_cast(canvas.GetHeight())); - this->SetWidth(static_cast(canvas.GetWidth())); + this->SetHeight(height); + this->SetWidth(width); this->CameraView = camera; - Canvas = canvas; } diff --git a/vtkm/rendering/raytracing/Camera.h b/vtkm/rendering/raytracing/Camera.h index 7fca702d2..cd1515e18 100644 --- a/vtkm/rendering/raytracing/Camera.h +++ b/vtkm/rendering/raytracing/Camera.h @@ -27,7 +27,6 @@ class VTKM_RENDERING_EXPORT Camera private: struct PixelDataFunctor; - vtkm::rendering::CanvasRayTracer Canvas; vtkm::Int32 Height; vtkm::Int32 Width; vtkm::Int32 SubsetWidth; @@ -61,7 +60,8 @@ public: VTKM_CONT void SetParameters(const vtkm::rendering::Camera& camera, - vtkm::rendering::CanvasRayTracer& canvas); + const vtkm::Int32 width, + const vtkm::Int32 height); VTKM_CONT diff --git a/vtkm/rendering/raytracing/ScalarRenderer.cxx b/vtkm/rendering/raytracing/ScalarRenderer.cxx index 7bff525df..2147896e6 100644 --- a/vtkm/rendering/raytracing/ScalarRenderer.cxx +++ b/vtkm/rendering/raytracing/ScalarRenderer.cxx @@ -30,6 +30,34 @@ namespace raytracing namespace detail { +template +class FilterDepth : public vtkm::worklet::WorkletMapField +{ +private: + Precision MissScalar; + +public: + VTKM_CONT + FilterDepth(const Precision missScalar) + : MissScalar(missScalar) + { + } + + typedef void ControlSignature(FieldIn, FieldInOut); + + typedef void ExecutionSignature(_1, _2); + VTKM_EXEC void operator()(const vtkm::Id& hitIndex, Precision& scalar) const + { + Precision value = scalar; + if (hitIndex < 0) + { + value = MissScalar; + } + + scalar = value; + } +}; //class WriteBuffer + template class WriteBuffer : public vtkm::worklet::WorkletMapField { @@ -150,6 +178,10 @@ void ScalarRenderer::RenderOnDevice(Ray& rays, Precision missScalar) AddBuffer(rays, missScalar, Fields[f].GetName()); } + vtkm::worklet::DispatcherMapField>( + detail::FilterDepth(missScalar)) + .Invoke(rays.HitIdx, rays.Distance); + time = renderTimer.GetElapsedTime(); logger->CloseLogEntry(time); } // RenderOnDevice diff --git a/vtkm/rendering/testing/CMakeLists.txt b/vtkm/rendering/testing/CMakeLists.txt index 2ac2556b3..2ab5d75bd 100644 --- a/vtkm/rendering/testing/CMakeLists.txt +++ b/vtkm/rendering/testing/CMakeLists.txt @@ -24,6 +24,7 @@ set(unit_tests UnitTestMapperRayTracer.cxx UnitTestMapperWireframer.cxx UnitTestMapperVolume.cxx + UnitTestScalarRenderer.cxx ) vtkm_unit_tests(SOURCES ${unit_tests} ALL_BACKENDS LIBRARIES vtkm_rendering) diff --git a/vtkm/rendering/testing/UnitTestScalarRenderer.cxx b/vtkm/rendering/testing/UnitTestScalarRenderer.cxx new file mode 100644 index 000000000..05fa633f0 --- /dev/null +++ b/vtkm/rendering/testing/UnitTestScalarRenderer.cxx @@ -0,0 +1,41 @@ +//============================================================================ +// Copyright (c) Kitware, Inc. +// All rights reserved. +// See LICENSE.txt for details. +// +// This software is distributed WITHOUT ANY WARRANTY; without even +// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +// PURPOSE. See the above copyright notice for more information. +//============================================================================ + +#include +#include +#include + +namespace +{ + +void RenderTests() +{ + vtkm::cont::testing::MakeTestDataSet maker; + vtkm::cont::DataSet dataset = maker.Make3DRegularDataSet0(); + vtkm::Bounds bounds = dataset.GetCoordinateSystem().GetBounds(); + + vtkm::rendering::Camera camera; + camera.ResetToBounds(bounds); + camera.Azimuth(-40.f); + camera.Elevation(15.f); + + vtkm::rendering::ScalarRenderer renderer; + renderer.SetInput(dataset); + vtkm::rendering::ScalarRenderer::Result res = renderer.Render(camera); + + res.SaveVTK("scalar"); +} + +} //namespace + +int UnitTestScalarRenderer(int argc, char* argv[]) +{ + return vtkm::cont::testing::Testing::Run(RenderTests, argc, argv); +} From 458be65e9b1a7e8da6a518f87e9e038c8dc662d1 Mon Sep 17 00:00:00 2001 From: Matt Larsen Date: Mon, 17 Feb 2020 19:06:28 -0800 Subject: [PATCH 05/12] fix logic error --- vtkm/rendering/ScalarRenderer.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vtkm/rendering/ScalarRenderer.cxx b/vtkm/rendering/ScalarRenderer.cxx index 72a527186..3b66da4d9 100644 --- a/vtkm/rendering/ScalarRenderer.cxx +++ b/vtkm/rendering/ScalarRenderer.cxx @@ -103,7 +103,7 @@ void ScalarRenderer::SetInput(vtkm::cont::DataSet& dataSet) ScalarRenderer::Result ScalarRenderer::Render(const vtkm::rendering::Camera& camera) { - if (Internals->ValidDataSet) + if (!Internals->ValidDataSet) { throw vtkm::cont::ErrorBadValue("ScalarRenderer: input never set"); } From 70584ac8f66379ef847b2057fd663a52389fa647 Mon Sep 17 00:00:00 2001 From: Matt Larsen Date: Mon, 17 Feb 2020 19:46:59 -0800 Subject: [PATCH 06/12] fix benchmarks --- benchmarking/BenchmarkRayTracing.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarking/BenchmarkRayTracing.cxx b/benchmarking/BenchmarkRayTracing.cxx index e29b13c66..03c6e2a36 100644 --- a/benchmarking/BenchmarkRayTracing.cxx +++ b/benchmarking/BenchmarkRayTracing.cxx @@ -64,7 +64,7 @@ void BenchRayTracing(::benchmark::State& state) vtkm::rendering::CanvasRayTracer canvas(1920, 1080); vtkm::rendering::raytracing::Camera rayCamera; - rayCamera.SetParameters(camera, canvas); + rayCamera.SetParameters(camera, canvas.GetWidth(), canvas.GetHeight()); vtkm::rendering::raytracing::Ray rays; rayCamera.CreateRays(rays, coords.GetBounds()); From 094758e55a324586fbf341fc936d2c8ed0d6f0d2 Mon Sep 17 00:00:00 2001 From: Matt Larsen Date: Mon, 17 Feb 2020 19:50:40 -0800 Subject: [PATCH 07/12] make result public? --- vtkm/rendering/ScalarRenderer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vtkm/rendering/ScalarRenderer.h b/vtkm/rendering/ScalarRenderer.h index 6a5794c67..d684967f4 100644 --- a/vtkm/rendering/ScalarRenderer.h +++ b/vtkm/rendering/ScalarRenderer.h @@ -33,7 +33,7 @@ public: void SetHeight(const vtkm::Int32 height); void SetDefaultValue(vtkm::Float32 value); - struct Result + struct VTKM_RENDERING_EXPORT Result { vtkm::Int32 Width; vtkm::Int32 Height; From 0943784c22c5f7e3d1bd32dadea8767977da5683 Mon Sep 17 00:00:00 2001 From: Matt Larsen Date: Mon, 17 Feb 2020 19:53:54 -0800 Subject: [PATCH 08/12] fix warning --- vtkm/rendering/raytracing/Camera.cxx | 8 ++++---- vtkm/rendering/raytracing/Camera.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/vtkm/rendering/raytracing/Camera.cxx b/vtkm/rendering/raytracing/Camera.cxx index 08920aee0..35c1855b0 100644 --- a/vtkm/rendering/raytracing/Camera.cxx +++ b/vtkm/rendering/raytracing/Camera.cxx @@ -494,16 +494,16 @@ Camera::~Camera() VTKM_CONT void Camera::SetParameters(const vtkm::rendering::Camera& camera, - const vtkm::Int32 width, - const vtkm::Int32 height) + const vtkm::Id width, + const vtkm::Id height) { this->SetUp(camera.GetViewUp()); this->SetLookAt(camera.GetLookAt()); this->SetPosition(camera.GetPosition()); this->SetZoom(camera.GetZoom()); this->SetFieldOfView(camera.GetFieldOfView()); - this->SetHeight(height); - this->SetWidth(width); + this->SetHeight(vtkm::Int32(height)); + this->SetWidth(vtkm::Int32(width)); this->CameraView = camera; } diff --git a/vtkm/rendering/raytracing/Camera.h b/vtkm/rendering/raytracing/Camera.h index cd1515e18..4da827e4a 100644 --- a/vtkm/rendering/raytracing/Camera.h +++ b/vtkm/rendering/raytracing/Camera.h @@ -60,8 +60,8 @@ public: VTKM_CONT void SetParameters(const vtkm::rendering::Camera& camera, - const vtkm::Int32 width, - const vtkm::Int32 height); + const vtkm::Id width, + const vtkm::Id height); VTKM_CONT From aa468f5c0008015cff57c1912ffdb85330ee97d1 Mon Sep 17 00:00:00 2001 From: Matt Larsen Date: Mon, 17 Feb 2020 20:09:51 -0800 Subject: [PATCH 09/12] more warning fixes --- benchmarking/BenchmarkRayTracing.cxx | 2 +- vtkm/rendering/raytracing/Camera.cxx | 8 ++++---- vtkm/rendering/raytracing/Camera.h | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/benchmarking/BenchmarkRayTracing.cxx b/benchmarking/BenchmarkRayTracing.cxx index 03c6e2a36..1d4e33fce 100644 --- a/benchmarking/BenchmarkRayTracing.cxx +++ b/benchmarking/BenchmarkRayTracing.cxx @@ -64,7 +64,7 @@ void BenchRayTracing(::benchmark::State& state) vtkm::rendering::CanvasRayTracer canvas(1920, 1080); vtkm::rendering::raytracing::Camera rayCamera; - rayCamera.SetParameters(camera, canvas.GetWidth(), canvas.GetHeight()); + rayCamera.SetParameters(camera, vtkm::Int32(canvas.GetWidth()), vtkm::Int32(canvas.GetHeight())); vtkm::rendering::raytracing::Ray rays; rayCamera.CreateRays(rays, coords.GetBounds()); diff --git a/vtkm/rendering/raytracing/Camera.cxx b/vtkm/rendering/raytracing/Camera.cxx index 35c1855b0..08920aee0 100644 --- a/vtkm/rendering/raytracing/Camera.cxx +++ b/vtkm/rendering/raytracing/Camera.cxx @@ -494,16 +494,16 @@ Camera::~Camera() VTKM_CONT void Camera::SetParameters(const vtkm::rendering::Camera& camera, - const vtkm::Id width, - const vtkm::Id height) + const vtkm::Int32 width, + const vtkm::Int32 height) { this->SetUp(camera.GetViewUp()); this->SetLookAt(camera.GetLookAt()); this->SetPosition(camera.GetPosition()); this->SetZoom(camera.GetZoom()); this->SetFieldOfView(camera.GetFieldOfView()); - this->SetHeight(vtkm::Int32(height)); - this->SetWidth(vtkm::Int32(width)); + this->SetHeight(height); + this->SetWidth(width); this->CameraView = camera; } diff --git a/vtkm/rendering/raytracing/Camera.h b/vtkm/rendering/raytracing/Camera.h index 4da827e4a..cd1515e18 100644 --- a/vtkm/rendering/raytracing/Camera.h +++ b/vtkm/rendering/raytracing/Camera.h @@ -60,8 +60,8 @@ public: VTKM_CONT void SetParameters(const vtkm::rendering::Camera& camera, - const vtkm::Id width, - const vtkm::Id height); + const vtkm::Int32 width, + const vtkm::Int32 height); VTKM_CONT From 5fc77cb585f28b901e94d9107647d3efaea19e19 Mon Sep 17 00:00:00 2001 From: Matt Larsen Date: Tue, 18 Feb 2020 07:25:00 -0800 Subject: [PATCH 10/12] warnings and store depth separately --- vtkm/rendering/ConnectivityProxy.cxx | 3 ++- vtkm/rendering/MapperCylinder.cxx | 4 ++-- vtkm/rendering/MapperPoint.cxx | 4 ++-- vtkm/rendering/MapperQuad.cxx | 4 ++-- vtkm/rendering/MapperRayTracer.cxx | 4 ++-- vtkm/rendering/MapperVolume.cxx | 4 ++-- vtkm/rendering/ScalarRenderer.cxx | 5 +++-- vtkm/rendering/ScalarRenderer.h | 1 + 8 files changed, 16 insertions(+), 13 deletions(-) diff --git a/vtkm/rendering/ConnectivityProxy.cxx b/vtkm/rendering/ConnectivityProxy.cxx index 11d67c803..539f1d9ca 100644 --- a/vtkm/rendering/ConnectivityProxy.cxx +++ b/vtkm/rendering/ConnectivityProxy.cxx @@ -210,7 +210,8 @@ public: throw vtkm::cont::ErrorBadValue("Conn Proxy: null canvas"); } vtkm::rendering::raytracing::Camera rayCamera; - rayCamera.SetParameters(camera, canvas->GetWidth(), canvas->GetHeight()); + rayCamera.SetParameters( + camera, (vtkm::Int32)canvas->GetWidth(), (vtkm::Int32)canvas->GetHeight()); vtkm::rendering::raytracing::Ray rays; rayCamera.CreateRays(rays, this->Coords.GetBounds()); rays.Buffers.at(0).InitConst(0.f); diff --git a/vtkm/rendering/MapperCylinder.cxx b/vtkm/rendering/MapperCylinder.cxx index 91c224c1a..38ae8dc39 100644 --- a/vtkm/rendering/MapperCylinder.cxx +++ b/vtkm/rendering/MapperCylinder.cxx @@ -182,8 +182,8 @@ void MapperCylinder::RenderCells(const vtkm::cont::DynamicCellSet& cellset, // // Create rays // - vtkm::Int32 width = this->Internals->Canvas->GetWidth(); - vtkm::Int32 height = this->Internals->Canvas->GetHeight(); + vtkm::Int32 width = (vtkm::Int32) this->Internals->Canvas->GetWidth(); + vtkm::Int32 height = (vtkm::Int32) this->Internals->Canvas->GetHeight(); this->Internals->RayCamera.SetParameters(camera, width, height); diff --git a/vtkm/rendering/MapperPoint.cxx b/vtkm/rendering/MapperPoint.cxx index c5b2d728d..cbbb0fc7d 100644 --- a/vtkm/rendering/MapperPoint.cxx +++ b/vtkm/rendering/MapperPoint.cxx @@ -181,8 +181,8 @@ void MapperPoint::RenderCells(const vtkm::cont::DynamicCellSet& cellset, // // Create rays // - vtkm::Int32 width = this->Internals->Canvas->GetWidth(); - vtkm::Int32 height = this->Internals->Canvas->GetHeight(); + vtkm::Int32 width = (vtkm::Int32) this->Internals->Canvas->GetWidth(); + vtkm::Int32 height = (vtkm::Int32) this->Internals->Canvas->GetHeight(); this->Internals->RayCamera.SetParameters(camera, width, height); diff --git a/vtkm/rendering/MapperQuad.cxx b/vtkm/rendering/MapperQuad.cxx index 7632dc618..127cf638d 100644 --- a/vtkm/rendering/MapperQuad.cxx +++ b/vtkm/rendering/MapperQuad.cxx @@ -103,8 +103,8 @@ void MapperQuad::RenderCells(const vtkm::cont::DynamicCellSet& cellset, // // Create rays // - vtkm::Int32 width = this->Internals->Canvas->GetWidth(); - vtkm::Int32 height = this->Internals->Canvas->GetHeight(); + vtkm::Int32 width = (vtkm::Int32) this->Internals->Canvas->GetWidth(); + vtkm::Int32 height = (vtkm::Int32) this->Internals->Canvas->GetHeight(); this->Internals->RayCamera.SetParameters(camera, width, height); diff --git a/vtkm/rendering/MapperRayTracer.cxx b/vtkm/rendering/MapperRayTracer.cxx index 991a825fc..92582fb48 100644 --- a/vtkm/rendering/MapperRayTracer.cxx +++ b/vtkm/rendering/MapperRayTracer.cxx @@ -107,8 +107,8 @@ void MapperRayTracer::RenderCells(const vtkm::cont::DynamicCellSet& cellset, // // Create rays // - vtkm::Int32 width = this->Internals->Canvas->GetWidth(); - vtkm::Int32 height = this->Internals->Canvas->GetHeight(); + vtkm::Int32 width = (vtkm::Int32) this->Internals->Canvas->GetWidth(); + vtkm::Int32 height = (vtkm::Int32) this->Internals->Canvas->GetHeight(); this->Internals->RayCamera.SetParameters(camera, width, height); diff --git a/vtkm/rendering/MapperVolume.cxx b/vtkm/rendering/MapperVolume.cxx index e289ba399..86f1cbb1b 100644 --- a/vtkm/rendering/MapperVolume.cxx +++ b/vtkm/rendering/MapperVolume.cxx @@ -102,8 +102,8 @@ void MapperVolume::RenderCells(const vtkm::cont::DynamicCellSet& cellset, vtkm::rendering::raytracing::Camera rayCamera; vtkm::rendering::raytracing::Ray rays; - vtkm::Int32 width = this->Internals->Canvas->GetWidth(); - vtkm::Int32 height = this->Internals->Canvas->GetHeight(); + vtkm::Int32 width = (vtkm::Int32) this->Internals->Canvas->GetWidth(); + vtkm::Int32 height = (vtkm::Int32) this->Internals->Canvas->GetHeight(); rayCamera.SetParameters(camera, width, height); diff --git a/vtkm/rendering/ScalarRenderer.cxx b/vtkm/rendering/ScalarRenderer.cxx index 3b66da4d9..8ca5e8ee3 100644 --- a/vtkm/rendering/ScalarRenderer.cxx +++ b/vtkm/rendering/ScalarRenderer.cxx @@ -166,8 +166,6 @@ ScalarRenderer::Result ScalarRenderer::Render(const vtkm::rendering::Camera& cam raytracing::ChannelBuffer depthExpanded = depthChannel.ExpandBuffer(rays.PixelIdx, expandSize, Internals->DefaultValue); - res.push_back(depthExpanded.Buffer); - names.push_back("depth"); Result result; result.Width = Internals->Width; @@ -175,6 +173,7 @@ ScalarRenderer::Result ScalarRenderer::Render(const vtkm::rendering::Camera& cam result.Scalars = res; result.ScalarNames = names; result.Ranges = rangeMap; + result.Depths = depthExpanded.Buffer; vtkm::Float64 time = timer.GetElapsedTime(); logger->AddLogData("write_to_canvas", time); @@ -211,6 +210,8 @@ void ScalarRenderer::Result::SaveVTK(const std::string filename) vtkm::cont::Field(ScalarNames[i], vtkm::cont::Field::Association::CELL_SET, Scalars[i])); } + result.AddField(vtkm::cont::Field("depth", vtkm::cont::Field::Association::CELL_SET, Depths)); + vtkm::io::writer::VTKDataSetWriter writer(filename + ".vtk"); writer.WriteDataSet(result); } diff --git a/vtkm/rendering/ScalarRenderer.h b/vtkm/rendering/ScalarRenderer.h index d684967f4..656ee112a 100644 --- a/vtkm/rendering/ScalarRenderer.h +++ b/vtkm/rendering/ScalarRenderer.h @@ -37,6 +37,7 @@ public: { vtkm::Int32 Width; vtkm::Int32 Height; + vtkm::cont::ArrayHandle Depths; std::vector> Scalars; std::vector ScalarNames; std::map Ranges; From a7363c283c8497f473ed6ab29a07f8546383b9ea Mon Sep 17 00:00:00 2001 From: Matt Larsen Date: Tue, 18 Feb 2020 09:45:31 -0800 Subject: [PATCH 11/12] alter interface of scalar renderer result --- vtkm/rendering/ScalarRenderer.cxx | 6 ++---- vtkm/rendering/ScalarRenderer.h | 2 +- vtkm/rendering/testing/UnitTestScalarRenderer.cxx | 6 ++++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/vtkm/rendering/ScalarRenderer.cxx b/vtkm/rendering/ScalarRenderer.cxx index 8ca5e8ee3..93ecac096 100644 --- a/vtkm/rendering/ScalarRenderer.cxx +++ b/vtkm/rendering/ScalarRenderer.cxx @@ -22,7 +22,6 @@ #include #include -#include namespace vtkm { @@ -183,7 +182,7 @@ ScalarRenderer::Result ScalarRenderer::Render(const vtkm::rendering::Camera& cam return result; } -void ScalarRenderer::Result::SaveVTK(const std::string filename) +vtkm::cont::DataSet ScalarRenderer::Result::ToDataSet() { if (Scalars.size() == 0) { @@ -212,8 +211,7 @@ void ScalarRenderer::Result::SaveVTK(const std::string filename) result.AddField(vtkm::cont::Field("depth", vtkm::cont::Field::Association::CELL_SET, Depths)); - vtkm::io::writer::VTKDataSetWriter writer(filename + ".vtk"); - writer.WriteDataSet(result); + return result; } } } // vtkm::rendering diff --git a/vtkm/rendering/ScalarRenderer.h b/vtkm/rendering/ScalarRenderer.h index 656ee112a..b414991e8 100644 --- a/vtkm/rendering/ScalarRenderer.h +++ b/vtkm/rendering/ScalarRenderer.h @@ -42,7 +42,7 @@ public: std::vector ScalarNames; std::map Ranges; - void SaveVTK(const std::string filename); + vtkm::cont::DataSet ToDataSet(); }; ScalarRenderer::Result Render(const vtkm::rendering::Camera& camera); diff --git a/vtkm/rendering/testing/UnitTestScalarRenderer.cxx b/vtkm/rendering/testing/UnitTestScalarRenderer.cxx index 05fa633f0..4e6392d40 100644 --- a/vtkm/rendering/testing/UnitTestScalarRenderer.cxx +++ b/vtkm/rendering/testing/UnitTestScalarRenderer.cxx @@ -8,9 +8,9 @@ // PURPOSE. See the above copyright notice for more information. //============================================================================ +#include #include #include -#include namespace { @@ -30,7 +30,9 @@ void RenderTests() renderer.SetInput(dataset); vtkm::rendering::ScalarRenderer::Result res = renderer.Render(camera); - res.SaveVTK("scalar"); + vtkm::cont::DataSet result = res.ToDataSet(); + vtkm::io::writer::VTKDataSetWriter writer("scalar.vtk"); + writer.WriteDataSet(result); } } //namespace From 33a154337a83f7310793dd76cf42b5d96c928764 Mon Sep 17 00:00:00 2001 From: Matt Larsen Date: Tue, 18 Feb 2020 09:51:56 -0800 Subject: [PATCH 12/12] add deprecation --- vtkm/rendering/raytracing/Camera.cxx | 14 ++++++++++++++ vtkm/rendering/raytracing/Camera.h | 3 +++ 2 files changed, 17 insertions(+) diff --git a/vtkm/rendering/raytracing/Camera.cxx b/vtkm/rendering/raytracing/Camera.cxx index 08920aee0..7d6e5bbae 100644 --- a/vtkm/rendering/raytracing/Camera.cxx +++ b/vtkm/rendering/raytracing/Camera.cxx @@ -507,6 +507,20 @@ void Camera::SetParameters(const vtkm::rendering::Camera& camera, this->CameraView = camera; } +VTKM_DEPRECATED(1.6, "Use the canvas width and height rather than the canvas itself.") +VTKM_CONT void Camera::SetParameters(const vtkm::rendering::Camera& camera, + vtkm::rendering::CanvasRayTracer& canvas) +{ + this->SetUp(camera.GetViewUp()); + this->SetLookAt(camera.GetLookAt()); + this->SetPosition(camera.GetPosition()); + this->SetZoom(camera.GetZoom()); + this->SetFieldOfView(camera.GetFieldOfView()); + this->SetHeight(vtkm::Int32(canvas.GetHeight())); + this->SetWidth(vtkm::Int32(canvas.GetWidth())); + this->CameraView = camera; +} + VTKM_CONT void Camera::SetHeight(const vtkm::Int32& height) diff --git a/vtkm/rendering/raytracing/Camera.h b/vtkm/rendering/raytracing/Camera.h index cd1515e18..d4a457a19 100644 --- a/vtkm/rendering/raytracing/Camera.h +++ b/vtkm/rendering/raytracing/Camera.h @@ -63,6 +63,9 @@ public: const vtkm::Int32 width, const vtkm::Int32 height); + VTKM_CONT + void SetParameters(const vtkm::rendering::Camera& camera, + vtkm::rendering::CanvasRayTracer& canvas); VTKM_CONT void SetHeight(const vtkm::Int32& height);