//============================================================================ // 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. // // Copyright 2015 Sandia Corporation. // Copyright 2015 UT-Battelle, LLC. // Copyright 2015 Los Alamos National Security. // // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // the U.S. Government retains certain rights in this software. // // Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National // Laboratory (LANL), the U.S. Government retains certain rights in // this software. //============================================================================ #ifndef vtk_m_rendering_raytracing_Ray_h #define vtk_m_rendering_raytracing_Ray_h #include #include #include namespace vtkm { namespace rendering { namespace raytracing { class RayBase { public: RayBase() {} virtual ~RayBase(); virtual void resize(const vtkm::Int32 vtkmNotUsed(newSize)){} }; template class Ray : public RayBase { public: // composite vectors to hold array handles vtkm::cont::ArrayHandleCompositeVectorType, vtkm::cont::ArrayHandle, vtkm::cont::ArrayHandle >::type Intersection; vtkm::cont::ArrayHandleCompositeVectorType, vtkm::cont::ArrayHandle, vtkm::cont::ArrayHandle >::type Normal; vtkm::cont::ArrayHandleCompositeVectorType, vtkm::cont::ArrayHandle, vtkm::cont::ArrayHandle >::type Origin; vtkm::cont::ArrayHandleCompositeVectorType, vtkm::cont::ArrayHandle, vtkm::cont::ArrayHandle >::type Dir; vtkm::cont::ArrayHandle IntersectionX; //ray Normal vtkm::cont::ArrayHandle IntersectionY; vtkm::cont::ArrayHandle IntersectionZ; vtkm::cont::ArrayHandle NormalX; //ray Normal vtkm::cont::ArrayHandle NormalY; vtkm::cont::ArrayHandle NormalZ; 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 Distance; //distance to hit vtkm::cont::ArrayHandle Scalar; //scalar vtkm::cont::ArrayHandle HitIdx; vtkm::Int32 NumRays; VTKM_CONT Ray() { NumRays = 0; vtkm::IdComponent inComp[3]; inComp[0] = 0; inComp[1] = 1; inComp[2] = 2; Intersection = vtkm::cont::make_ArrayHandleCompositeVector( IntersectionX, inComp[0], IntersectionY, inComp[1], IntersectionZ, inComp[2]); Normal = vtkm::cont::make_ArrayHandleCompositeVector( NormalX, inComp[0], NormalY, inComp[1], NormalZ, inComp[2]); Origin = vtkm::cont::make_ArrayHandleCompositeVector( OriginX, inComp[0], OriginY, inComp[1], OriginZ, inComp[2]); Dir = vtkm::cont::make_ArrayHandleCompositeVector( DirX, inComp[0], DirY, inComp[1], DirZ, inComp[2]); } VTKM_CONT Ray( const vtkm::Int32 size) { NumRays = size; IntersectionX.PrepareForOutput( NumRays, DeviceAdapter() ); IntersectionY.PrepareForOutput( NumRays , DeviceAdapter() ); IntersectionZ.PrepareForOutput( NumRays , DeviceAdapter() ); NormalX.PrepareForOutput( NumRays , DeviceAdapter() ); NormalY.PrepareForOutput( NumRays , DeviceAdapter() ); NormalZ.PrepareForOutput( NumRays , DeviceAdapter() ); OriginX.PrepareForOutput( NumRays , DeviceAdapter() ); OriginY.PrepareForOutput( NumRays , DeviceAdapter() ); OriginZ.PrepareForOutput( NumRays , DeviceAdapter() ); DirX.PrepareForOutput( NumRays , DeviceAdapter() ); DirY.PrepareForOutput( NumRays , DeviceAdapter() ); DirZ.PrepareForOutput( NumRays , DeviceAdapter() ); U.PrepareForOutput( NumRays , DeviceAdapter() ); V.PrepareForOutput( NumRays , DeviceAdapter() ); Distance.PrepareForOutput( NumRays , DeviceAdapter() ); Scalar.PrepareForOutput( NumRays , DeviceAdapter() ); HitIdx.PrepareForOutput( NumRays , DeviceAdapter() ); vtkm::IdComponent inComp[3]; inComp[0] = 0; inComp[1] = 1; inComp[2] = 2; Intersection = vtkm::cont::make_ArrayHandleCompositeVector( IntersectionX, inComp[0], IntersectionY, inComp[1], IntersectionZ, inComp[2]); Normal = vtkm::cont::make_ArrayHandleCompositeVector( NormalX, inComp[0], NormalY, inComp[1], NormalZ, inComp[2]); Origin = vtkm::cont::make_ArrayHandleCompositeVector( OriginX, inComp[0], OriginY, inComp[1], OriginZ, inComp[2]); Dir = vtkm::cont::make_ArrayHandleCompositeVector( DirX, inComp[0], DirY, inComp[1], DirZ, inComp[2]); } VTKM_CONT virtual void resize( const vtkm::Int32 newSize) { if(newSize == NumRays) return; //nothing to do NumRays = newSize; IntersectionX.PrepareForOutput( NumRays , DeviceAdapter() ); IntersectionY.PrepareForOutput( NumRays , DeviceAdapter() ); IntersectionZ.PrepareForOutput( NumRays , DeviceAdapter() ); NormalX.PrepareForOutput( NumRays , DeviceAdapter() ); NormalY.PrepareForOutput( NumRays , DeviceAdapter() ); NormalZ.PrepareForOutput( NumRays , DeviceAdapter() ); OriginX.PrepareForOutput( NumRays , DeviceAdapter() ); OriginY.PrepareForOutput( NumRays , DeviceAdapter() ); OriginZ.PrepareForOutput( NumRays , DeviceAdapter() ); DirX.PrepareForOutput( NumRays , DeviceAdapter() ); DirY.PrepareForOutput( NumRays , DeviceAdapter() ); DirZ.PrepareForOutput( NumRays , DeviceAdapter() ); U.PrepareForOutput( NumRays , DeviceAdapter() ); V.PrepareForOutput( NumRays , DeviceAdapter() ); Distance.PrepareForOutput( NumRays , DeviceAdapter() ); Scalar.PrepareForOutput( NumRays , DeviceAdapter() ); HitIdx.PrepareForOutput( NumRays , DeviceAdapter() ); } };// class ray template class VolumeRay : public RayBase { public: vtkm::cont::ArrayHandleCompositeVectorType, vtkm::cont::ArrayHandle, vtkm::cont::ArrayHandle >::type Dir; vtkm::cont::ArrayHandle DirX; //ray Dir vtkm::cont::ArrayHandle DirY; vtkm::cont::ArrayHandle DirZ; vtkm::cont::ArrayHandle MinDistance; //distance to hit vtkm::cont::ArrayHandle MaxDistance; //distance to hit vtkm::cont::ArrayHandle HitIndex; vtkm::Int32 NumRays; VTKM_CONT VolumeRay() { NumRays = 0; vtkm::IdComponent inComp[3]; inComp[0] = 0; inComp[1] = 1; inComp[2] = 2; Dir = vtkm::cont::make_ArrayHandleCompositeVector( DirX, inComp[0], DirY, inComp[1], DirZ, inComp[2]); } VTKM_CONT VolumeRay( const vtkm::Int32 size) { NumRays = size; DirX.PrepareForOutput( NumRays , DeviceAdapter() ); DirY.PrepareForOutput( NumRays , DeviceAdapter() ); DirZ.PrepareForOutput( NumRays , DeviceAdapter() ); MinDistance.PrepareForOutput( NumRays , DeviceAdapter() ); MaxDistance.PrepareForOutput( NumRays , DeviceAdapter() ); HitIndex.PrepareForOutput( NumRays , DeviceAdapter() ); vtkm::IdComponent inComp[3]; inComp[0] = 0; inComp[1] = 1; inComp[2] = 2; Dir = vtkm::cont::make_ArrayHandleCompositeVector( DirX, inComp[0], DirY, inComp[1], DirZ, inComp[2]); } VTKM_CONT virtual void resize( const vtkm::Int32 newSize) { if(newSize == NumRays) return; //nothing to do NumRays = newSize; DirX.PrepareForOutput( NumRays , DeviceAdapter() ); DirY.PrepareForOutput( NumRays , DeviceAdapter() ); DirZ.PrepareForOutput( NumRays , DeviceAdapter() ); MinDistance.PrepareForOutput( NumRays , DeviceAdapter() ); MaxDistance.PrepareForOutput( NumRays , DeviceAdapter() ); HitIndex.PrepareForOutput( NumRays , DeviceAdapter() ); } };// class ray }}}//namespace vtkm::rendering::raytracing #endif //vtk_m_rendering_raytracing_Ray_h