//============================================================================ // 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_Ray_h #define vtk_m_rendering_raytracing_Ray_h #include #include #include #include #include #define RAY_ACTIVE 0 #define RAY_COMPLETE 1 #define RAY_TERMINATED 2 #define RAY_EXITED_MESH 3 #define RAY_EXITED_DOMAIN 4 #define RAY_LOST 5 #define RAY_ABANDONED 6 #define RAY_TUG_EPSILON 0.001 namespace vtkm { namespace rendering { namespace raytracing { template class Ray { protected: bool IntersectionDataEnabled; public: // composite vectors to hold array handles typename //tell the compiler we have a dependent type vtkm::cont::ArrayHandleCompositeVector, vtkm::cont::ArrayHandle, vtkm::cont::ArrayHandle> Intersection; typename //tell the compiler we have a dependent type vtkm::cont::ArrayHandleCompositeVector, vtkm::cont::ArrayHandle, vtkm::cont::ArrayHandle> Normal; typename //tell the compiler we have a dependent type vtkm::cont::ArrayHandleCompositeVector, vtkm::cont::ArrayHandle, vtkm::cont::ArrayHandle> Origin; typename //tell the compiler we have a dependent type vtkm::cont::ArrayHandleCompositeVector, vtkm::cont::ArrayHandle, vtkm::cont::ArrayHandle> Dir; vtkm::cont::ArrayHandle IntersectionX; //ray Intersection vtkm::cont::ArrayHandle IntersectionY; vtkm::cont::ArrayHandle IntersectionZ; vtkm::cont::ArrayHandle OriginX; //ray Origin vtkm::cont::ArrayHandle OriginY; vtkm::cont::ArrayHandle OriginZ; vtkm::cont::ArrayHandle DirX; //ray Dir vtkm::cont::ArrayHandle DirY; vtkm::cont::ArrayHandle DirZ; vtkm::cont::ArrayHandle U; //barycentric coordinates vtkm::cont::ArrayHandle V; vtkm::cont::ArrayHandle NormalX; //ray Normal vtkm::cont::ArrayHandle NormalY; vtkm::cont::ArrayHandle NormalZ; vtkm::cont::ArrayHandle Scalar; //scalar vtkm::cont::ArrayHandle Distance; //distance to hit vtkm::cont::ArrayHandle HitIdx; vtkm::cont::ArrayHandle PixelIdx; vtkm::cont::ArrayHandle MinDistance; // distance to hit vtkm::cont::ArrayHandle MaxDistance; // distance to hit vtkm::cont::ArrayHandle Status; // 0 = active 1 = miss 2 = lost std::vector> Buffers; vtkm::Id DebugWidth; vtkm::Id DebugHeight; vtkm::Id NumRays; VTKM_CONT Ray() { IntersectionDataEnabled = false; NumRays = 0; Intersection = vtkm::cont::make_ArrayHandleCompositeVector(IntersectionX, IntersectionY, IntersectionZ); Normal = vtkm::cont::make_ArrayHandleCompositeVector(NormalX, NormalY, NormalZ); Origin = vtkm::cont::make_ArrayHandleCompositeVector(OriginX, OriginY, OriginZ); Dir = vtkm::cont::make_ArrayHandleCompositeVector(DirX, DirY, DirZ); ChannelBuffer buffer; buffer.Resize(NumRays); Buffers.push_back(buffer); DebugWidth = -1; DebugHeight = -1; } void EnableIntersectionData() { if (IntersectionDataEnabled) { return; } IntersectionDataEnabled = true; IntersectionX.Allocate(NumRays); IntersectionY.Allocate(NumRays); IntersectionZ.Allocate(NumRays); U.Allocate(NumRays); V.Allocate(NumRays); Scalar.Allocate(NumRays); NormalX.Allocate(NumRays); NormalY.Allocate(NumRays); NormalZ.Allocate(NumRays); } void DisableIntersectionData() { if (!IntersectionDataEnabled) { return; } IntersectionDataEnabled = false; IntersectionX.ReleaseResources(); IntersectionY.ReleaseResources(); IntersectionZ.ReleaseResources(); U.ReleaseResources(); V.ReleaseResources(); Scalar.ReleaseResources(); NormalX.ReleaseResources(); NormalY.ReleaseResources(); NormalZ.ReleaseResources(); } VTKM_CONT void AddBuffer(const vtkm::Int32 numChannels, const std::string name) { ChannelBuffer buffer(numChannels, this->NumRays); buffer.SetName(name); this->Buffers.push_back(buffer); } VTKM_CONT bool HasBuffer(const std::string name) { for (const auto& buffer : this->Buffers) { if (buffer.GetName() == name) return true; } return false; } VTKM_CONT ChannelBuffer& GetBuffer(const std::string name) { for (auto&& buffer : this->Buffers) { if (buffer.GetName() == name) return buffer; } throw vtkm::cont::ErrorBadValue("No channel buffer with requested name: " + name); } void PrintRay(vtkm::Id pixelId) { for (vtkm::Id i = 0; i < NumRays; ++i) { if (PixelIdx.WritePortal().Get(i) == pixelId) { std::cout << "Ray " << pixelId << "\n"; std::cout << "Origin " << "[" << OriginX.WritePortal().Get(i) << "," << OriginY.WritePortal().Get(i) << "," << OriginZ.WritePortal().Get(i) << "]\n"; std::cout << "Dir " << "[" << DirX.WritePortal().Get(i) << "," << DirY.WritePortal().Get(i) << "," << DirZ.WritePortal().Get(i) << "]\n"; } } } friend class RayOperations; }; // class ray } } } //namespace vtkm::rendering::raytracing #endif //vtk_m_rendering_raytracing_Ray_h