vtk-m/vtkm/rendering/raytracing/Ray.h

258 lines
8.8 KiB
C
Raw Normal View History

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:
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
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-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-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;
VTKM_CONT
2016-01-20 22:40:54 +00:00
Ray()
{
2016-01-20 22:40:54 +00:00
NumRays = 0;
vtkm::IdComponent inComp[3];
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
Normal = vtkm::cont::make_ArrayHandleCompositeVector(
NormalX, inComp[0], NormalY, inComp[1], NormalZ, inComp[2]);
2016-01-20 22:40:54 +00:00
Origin = vtkm::cont::make_ArrayHandleCompositeVector(
OriginX, inComp[0], OriginY, inComp[1], OriginZ, inComp[2]);
2016-01-20 22:40:54 +00:00
Dir = vtkm::cont::make_ArrayHandleCompositeVector(
DirX, inComp[0], DirY, inComp[1], DirZ, inComp[2]);
2016-01-20 22:40:54 +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];
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]);
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]);
2016-01-20 22:40:54 +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;
VTKM_CONT
2016-01-20 22:40:54 +00:00
VolumeRay()
{
2016-01-20 22:40:54 +00:00
NumRays = 0;
vtkm::IdComponent inComp[3];
inComp[0] = 0;
inComp[1] = 1;
2016-01-20 22:40:54 +00:00
inComp[2] = 2;
Dir = vtkm::cont::make_ArrayHandleCompositeVector(
DirX, inComp[0], DirY, inComp[1], DirZ, inComp[2]);
2016-01-20 22:40:54 +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];
inComp[0] = 0;
inComp[1] = 1;
2016-01-20 22:40:54 +00:00
inComp[2] = 2;
Dir = vtkm::cont::make_ArrayHandleCompositeVector(
DirX, inComp[0], DirY, inComp[1], DirZ, inComp[2]);
2016-01-20 22:40:54 +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