2016-01-20 22:40:54 +00:00
|
|
|
//============================================================================
|
|
|
|
// 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 <vtkm/cont/ArrayHandle.h>
|
|
|
|
#include <vtkm/cont/ArrayHandleCompositeVector.h>
|
|
|
|
#include <vtkm/cont/DeviceAdapter.h>
|
2017-05-18 14:29:41 +00:00
|
|
|
namespace vtkm
|
|
|
|
{
|
|
|
|
namespace rendering
|
|
|
|
{
|
|
|
|
namespace raytracing
|
|
|
|
{
|
2016-01-20 22:40:54 +00:00
|
|
|
|
2016-05-18 05:13:36 +00:00
|
|
|
class RayBase
|
|
|
|
{
|
|
|
|
public:
|
2016-12-16 21:34:36 +00:00
|
|
|
RayBase() {}
|
|
|
|
|
|
|
|
virtual ~RayBase();
|
2016-05-18 05:13:36 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
virtual void resize(const vtkm::Int32 vtkmNotUsed(newSize)) {}
|
2016-05-18 05:13:36 +00:00
|
|
|
};
|
2017-05-18 14:29:41 +00:00
|
|
|
template <typename DeviceAdapter>
|
2016-05-18 05:13:36 +00:00
|
|
|
class Ray : public RayBase
|
2016-01-20 22:40:54 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
// composite vectors to hold array handles
|
2017-05-26 17:53:28 +00:00
|
|
|
vtkm::cont::ArrayHandleCompositeVectorType<vtkm::cont::ArrayHandle<vtkm::Float32>,
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32>,
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32>>::type
|
|
|
|
Intersection;
|
2016-01-20 22:40:54 +00:00
|
|
|
|
|
|
|
vtkm::cont::ArrayHandleCompositeVectorType<vtkm::cont::ArrayHandle<vtkm::Float32>,
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32>,
|
2017-05-18 14:29:41 +00:00
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32>>::type Normal;
|
2016-05-19 23:15:06 +00:00
|
|
|
|
2016-01-20 22:40:54 +00:00
|
|
|
vtkm::cont::ArrayHandleCompositeVectorType<vtkm::cont::ArrayHandle<vtkm::Float32>,
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32>,
|
2017-05-18 14:29:41 +00:00
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32>>::type Origin;
|
2016-05-19 23:15:06 +00:00
|
|
|
|
2016-01-20 22:40:54 +00:00
|
|
|
vtkm::cont::ArrayHandleCompositeVectorType<vtkm::cont::ArrayHandle<vtkm::Float32>,
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32>,
|
2017-05-18 14:29:41 +00:00
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32>>::type Dir;
|
2016-01-20 22:40:54 +00:00
|
|
|
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> IntersectionX; //ray Normal
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> IntersectionY;
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> IntersectionZ;
|
|
|
|
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> NormalX; //ray Normal
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> NormalY;
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> NormalZ;
|
|
|
|
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> OriginX; //ray Origin
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> OriginY;
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> OriginZ;
|
|
|
|
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> DirX; //ray Dir
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> DirY;
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> DirZ;
|
|
|
|
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> U; //barycentric coordinates
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> V;
|
|
|
|
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> Distance; //distance to hit
|
|
|
|
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> Scalar; //scalar
|
|
|
|
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Id> HitIdx;
|
|
|
|
|
|
|
|
vtkm::Int32 NumRays;
|
2016-10-19 22:42:58 +00:00
|
|
|
VTKM_CONT
|
2016-01-20 22:40:54 +00:00
|
|
|
Ray()
|
2016-05-19 23:15:06 +00:00
|
|
|
{
|
2016-01-20 22:40:54 +00:00
|
|
|
NumRays = 0;
|
|
|
|
vtkm::IdComponent inComp[3];
|
2016-05-19 23:15:06 +00:00
|
|
|
inComp[0] = 0;
|
|
|
|
inComp[1] = 1;
|
2016-01-20 22:40:54 +00:00
|
|
|
inComp[2] = 2;
|
2017-05-18 14:29:41 +00:00
|
|
|
Intersection = vtkm::cont::make_ArrayHandleCompositeVector(
|
|
|
|
IntersectionX, inComp[0], IntersectionY, inComp[1], IntersectionZ, inComp[2]);
|
2016-01-20 22:40:54 +00:00
|
|
|
|
2017-05-26 17:53:28 +00:00
|
|
|
Normal = vtkm::cont::make_ArrayHandleCompositeVector(
|
|
|
|
NormalX, inComp[0], NormalY, inComp[1], NormalZ, inComp[2]);
|
2016-01-20 22:40:54 +00:00
|
|
|
|
2017-05-26 17:53:28 +00:00
|
|
|
Origin = vtkm::cont::make_ArrayHandleCompositeVector(
|
|
|
|
OriginX, inComp[0], OriginY, inComp[1], OriginZ, inComp[2]);
|
2016-01-20 22:40:54 +00:00
|
|
|
|
2017-05-26 17:53:28 +00:00
|
|
|
Dir = vtkm::cont::make_ArrayHandleCompositeVector(
|
|
|
|
DirX, inComp[0], DirY, inComp[1], DirZ, inComp[2]);
|
2016-01-20 22:40:54 +00:00
|
|
|
}
|
2016-10-19 22:42:58 +00:00
|
|
|
VTKM_CONT
|
2017-05-18 14:29:41 +00:00
|
|
|
Ray(const vtkm::Int32 size)
|
2016-01-20 22:40:54 +00:00
|
|
|
{
|
|
|
|
NumRays = size;
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
IntersectionX.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
IntersectionY.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
IntersectionZ.PrepareForOutput(NumRays, DeviceAdapter());
|
2016-01-20 22:40:54 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
NormalX.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
NormalY.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
NormalZ.PrepareForOutput(NumRays, DeviceAdapter());
|
2016-01-20 22:40:54 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
OriginX.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
OriginY.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
OriginZ.PrepareForOutput(NumRays, DeviceAdapter());
|
2016-01-20 22:40:54 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
DirX.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
DirY.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
DirZ.PrepareForOutput(NumRays, DeviceAdapter());
|
2016-01-20 22:40:54 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
U.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
V.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
Distance.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
Scalar.PrepareForOutput(NumRays, DeviceAdapter());
|
2016-01-20 22:40:54 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
HitIdx.PrepareForOutput(NumRays, DeviceAdapter());
|
2016-01-20 22:40:54 +00:00
|
|
|
|
|
|
|
vtkm::IdComponent inComp[3];
|
2016-05-19 23:15:06 +00:00
|
|
|
inComp[0] = 0;
|
|
|
|
inComp[1] = 1;
|
2016-01-20 22:40:54 +00:00
|
|
|
inComp[2] = 2;
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
Intersection = vtkm::cont::make_ArrayHandleCompositeVector(
|
|
|
|
IntersectionX, inComp[0], IntersectionY, inComp[1], IntersectionZ, inComp[2]);
|
2016-05-19 23:15:06 +00:00
|
|
|
|
2017-05-26 17:53:28 +00:00
|
|
|
Normal = vtkm::cont::make_ArrayHandleCompositeVector(
|
|
|
|
NormalX, inComp[0], NormalY, inComp[1], NormalZ, inComp[2]);
|
2016-05-19 23:15:06 +00:00
|
|
|
|
2017-05-26 17:53:28 +00:00
|
|
|
Origin = vtkm::cont::make_ArrayHandleCompositeVector(
|
|
|
|
OriginX, inComp[0], OriginY, inComp[1], OriginZ, inComp[2]);
|
2016-05-19 23:15:06 +00:00
|
|
|
|
2017-05-26 17:53:28 +00:00
|
|
|
Dir = vtkm::cont::make_ArrayHandleCompositeVector(
|
|
|
|
DirX, inComp[0], DirY, inComp[1], DirZ, inComp[2]);
|
2016-01-20 22:40:54 +00:00
|
|
|
}
|
2016-10-19 22:42:58 +00:00
|
|
|
VTKM_CONT
|
2017-05-18 14:29:41 +00:00
|
|
|
virtual void resize(const vtkm::Int32 newSize)
|
2016-01-20 22:40:54 +00:00
|
|
|
{
|
2017-05-18 14:29:41 +00:00
|
|
|
if (newSize == NumRays)
|
|
|
|
return; //nothing to do
|
2016-01-20 22:40:54 +00:00
|
|
|
|
|
|
|
NumRays = newSize;
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
IntersectionX.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
IntersectionY.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
IntersectionZ.PrepareForOutput(NumRays, DeviceAdapter());
|
2016-01-20 22:40:54 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
NormalX.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
NormalY.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
NormalZ.PrepareForOutput(NumRays, DeviceAdapter());
|
2016-01-20 22:40:54 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
OriginX.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
OriginY.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
OriginZ.PrepareForOutput(NumRays, DeviceAdapter());
|
2016-01-20 22:40:54 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
DirX.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
DirY.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
DirZ.PrepareForOutput(NumRays, DeviceAdapter());
|
2016-01-20 22:40:54 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
U.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
V.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
Distance.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
Scalar.PrepareForOutput(NumRays, DeviceAdapter());
|
2016-01-20 22:40:54 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
HitIdx.PrepareForOutput(NumRays, DeviceAdapter());
|
2016-01-20 22:40:54 +00:00
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
}; // class ray
|
|
|
|
template <typename DeviceAdapter>
|
2016-05-18 05:13:36 +00:00
|
|
|
class VolumeRay : public RayBase
|
2016-01-20 22:40:54 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
vtkm::cont::ArrayHandleCompositeVectorType<vtkm::cont::ArrayHandle<vtkm::Float32>,
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32>,
|
2017-05-18 14:29:41 +00:00
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32>>::type Dir;
|
2016-01-20 22:40:54 +00:00
|
|
|
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> DirX; //ray Dir
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> DirY;
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> DirZ;
|
|
|
|
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> MinDistance; //distance to hit
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> MaxDistance; //distance to hit
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Id> HitIndex;
|
|
|
|
vtkm::Int32 NumRays;
|
2016-10-19 22:42:58 +00:00
|
|
|
VTKM_CONT
|
2016-01-20 22:40:54 +00:00
|
|
|
VolumeRay()
|
2016-05-19 23:15:06 +00:00
|
|
|
{
|
2016-01-20 22:40:54 +00:00
|
|
|
NumRays = 0;
|
|
|
|
vtkm::IdComponent inComp[3];
|
2016-05-19 23:15:06 +00:00
|
|
|
inComp[0] = 0;
|
|
|
|
inComp[1] = 1;
|
2016-01-20 22:40:54 +00:00
|
|
|
inComp[2] = 2;
|
|
|
|
|
2017-05-26 17:53:28 +00:00
|
|
|
Dir = vtkm::cont::make_ArrayHandleCompositeVector(
|
|
|
|
DirX, inComp[0], DirY, inComp[1], DirZ, inComp[2]);
|
2016-01-20 22:40:54 +00:00
|
|
|
}
|
2016-10-19 22:42:58 +00:00
|
|
|
VTKM_CONT
|
2017-05-18 14:29:41 +00:00
|
|
|
VolumeRay(const vtkm::Int32 size)
|
2016-01-20 22:40:54 +00:00
|
|
|
{
|
|
|
|
NumRays = size;
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
DirX.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
DirY.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
DirZ.PrepareForOutput(NumRays, DeviceAdapter());
|
2016-01-20 22:40:54 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
MinDistance.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
MaxDistance.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
HitIndex.PrepareForOutput(NumRays, DeviceAdapter());
|
2016-01-20 22:40:54 +00:00
|
|
|
|
|
|
|
vtkm::IdComponent inComp[3];
|
2016-05-19 23:15:06 +00:00
|
|
|
inComp[0] = 0;
|
|
|
|
inComp[1] = 1;
|
2016-01-20 22:40:54 +00:00
|
|
|
inComp[2] = 2;
|
|
|
|
|
2017-05-26 17:53:28 +00:00
|
|
|
Dir = vtkm::cont::make_ArrayHandleCompositeVector(
|
|
|
|
DirX, inComp[0], DirY, inComp[1], DirZ, inComp[2]);
|
2016-01-20 22:40:54 +00:00
|
|
|
}
|
2016-10-19 22:42:58 +00:00
|
|
|
VTKM_CONT
|
2017-05-18 14:29:41 +00:00
|
|
|
virtual void resize(const vtkm::Int32 newSize)
|
2016-01-20 22:40:54 +00:00
|
|
|
{
|
2017-05-18 14:29:41 +00:00
|
|
|
if (newSize == NumRays)
|
|
|
|
return; //nothing to do
|
2016-01-20 22:40:54 +00:00
|
|
|
|
|
|
|
NumRays = newSize;
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
DirX.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
DirY.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
DirZ.PrepareForOutput(NumRays, DeviceAdapter());
|
2016-01-20 22:40:54 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
MinDistance.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
MaxDistance.PrepareForOutput(NumRays, DeviceAdapter());
|
|
|
|
HitIndex.PrepareForOutput(NumRays, DeviceAdapter());
|
2016-01-20 22:40:54 +00:00
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
}; // class ray
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} //namespace vtkm::rendering::raytracing
|
2016-05-18 05:13:36 +00:00
|
|
|
#endif //vtk_m_rendering_raytracing_Ray_h
|