37 #ifndef OPENVDB_MATH_DDA_HAS_BEEN_INCLUDED 38 #define OPENVDB_MATH_DDA_HAS_BEEN_INCLUDED 59 template<
typename RayT, Index Log2Dim = 0>
71 DDA(
const RayT& ray) { this->init(ray); }
73 DDA(
const RayT& ray, RealT startTime) { this->init(ray, startTime); }
75 DDA(
const RayT& ray, RealT startTime, RealT maxTime) { this->init(ray, startTime, maxTime); }
77 inline void init(
const RayT& ray, RealT startTime, RealT maxTime)
79 assert(startTime <= maxTime);
80 static const int DIM = 1 << Log2Dim;
83 const Vec3T &pos = ray(mT0), &dir = ray.dir(), &inv = ray.invDir();
85 for (
int axis = 0; axis < 3; ++axis) {
90 }
else if (inv[axis] > 0) {
92 mNext[axis] = mT0 + (mVoxel[axis] + DIM - pos[axis]) * inv[axis];
93 mDelta[axis] = mStep[axis] * inv[axis];
96 mNext[axis] = mT0 + (mVoxel[axis] - pos[axis]) * inv[axis];
97 mDelta[axis] = mStep[axis] * inv[axis];
102 inline void init(
const RayT& ray) { this->
init(ray, ray.t0(), ray.t1()); }
104 inline void init(
const RayT& ray, RealT startTime) { this->
init(ray, startTime, ray.t1()); }
111 mT0 = mNext[stepAxis];
112 mNext[stepAxis] += mDelta[stepAxis];
113 mVoxel[stepAxis] += mStep[stepAxis];
129 inline RealType
time()
const {
return mT0; }
132 inline RealType
maxTime()
const {
return mT1; }
137 inline RealType
next()
const {
return math::Min(mT1, mNext[0], mNext[1], mNext[2]); }
141 void print(std::ostream& os = std::cout)
const 143 os <<
"Dim=" << (1<<Log2Dim) <<
" time=" << mT0 <<
" next()=" 144 << this->next() <<
" voxel=" << mVoxel <<
" next=" << mNext
145 <<
" delta=" << mDelta <<
" step=" << mStep << std::endl;
156 template<
typename RayT, Index Log2Dim>
157 inline std::ostream& operator<<(std::ostream& os, const DDA<RayT, Log2Dim>& dda)
159 os <<
"Dim=" << (1<<Log2Dim) <<
" time=" << dda.time()
160 <<
" next()=" << dda.next() <<
" voxel=" << dda.voxel();
169 template<
typename TreeT,
int NodeLevel>
172 typedef typename TreeT::RootNodeType::NodeChainType
ChainT;
173 typedef typename boost::mpl::at<ChainT, boost::mpl::int_<NodeLevel> >::type
NodeT;
175 template <
typename TesterT>
176 static bool test(TesterT& tester)
180 if (tester.template hasNode<NodeT>(dda.voxel())) {
181 tester.setRange(dda.time(), dda.next());
191 template<
typename TreeT>
194 template <
typename TesterT>
195 static bool test(TesterT& tester)
198 tester.
init(dda.time());
199 do {
if (tester(dda.voxel(), dda.next()))
return true; }
while(dda.step());
212 template <
typename TreeT,
typename RayT,
int ChildNodeLevel>
217 typedef typename TreeT::RootNodeType::NodeChainType
ChainT;
218 typedef typename boost::mpl::at<ChainT, boost::mpl::int_<ChildNodeLevel> >::type
NodeT;
223 template <
typename AccessorT>
224 TimeSpanT
march(RayT& ray, AccessorT &acc)
227 if (ray.valid()) this->march(ray, acc, t);
235 template <
typename AccessorT,
typename ListT>
236 void hits(RayT& ray, AccessorT &acc, ListT& times)
240 this->hits(ray, acc, times, t);
241 if (t.valid()) times.push_back(t);
248 template <
typename AccessorT>
249 bool march(RayT& ray, AccessorT &acc, TimeSpanT& t)
253 if (acc.template probeConstNode<NodeT>(mDDA.voxel()) != NULL) {
254 ray.setTimes(mDDA.time(), mDDA.next());
255 if (mHDDA.march(ray, acc, t))
return true;
256 }
else if (acc.isValueOn(mDDA.voxel())) {
257 if (t.t0<0) t.t0 = mDDA.time();
258 }
else if (t.t0>=0) {
260 if (t.valid())
return true;
263 }
while (mDDA.step());
264 if (t.t0>=0) t.t1 = mDDA.maxTime();
272 template <
typename AccessorT,
typename ListT>
273 void hits(RayT& ray, AccessorT &acc, ListT& times, TimeSpanT& t)
277 if (acc.template probeConstNode<NodeT>(mDDA.voxel()) != NULL) {
278 ray.setTimes(mDDA.time(), mDDA.next());
279 mHDDA.
hits(ray, acc, times, t);
280 }
else if (acc.isValueOn(mDDA.voxel())) {
281 if (t.t0<0) t.t0 = mDDA.time();
282 }
else if (t.t0>=0) {
284 if (t.valid()) times.push_back(t);
287 }
while (mDDA.step());
288 if (t.t0>=0) t.t1 = mDDA.maxTime();
292 VolumeHDDA<TreeT, RayT, ChildNodeLevel-1> mHDDA;
297 template <
typename TreeT,
typename RayT>
302 typedef typename TreeT::LeafNodeType
LeafT;
307 template <
typename AccessorT>
308 TimeSpanT
march(RayT& ray, AccessorT &acc)
311 if (ray.valid()) this->march(ray, acc, t);
315 template <
typename AccessorT,
typename ListT>
316 void hits(RayT& ray, AccessorT &acc, ListT& times)
320 this->hits(ray, acc, times, t);
321 if (t.valid()) times.push_back(t);
328 template <
typename AccessorT>
329 bool march(RayT& ray, AccessorT &acc, TimeSpanT& t)
333 if (acc.template probeConstNode<LeafT>(mDDA.voxel()) ||
334 acc.isValueOn(mDDA.voxel())) {
335 if (t.t0<0) t.t0 = mDDA.time();
336 }
else if (t.t0>=0) {
338 if (t.valid())
return true;
341 }
while (mDDA.step());
342 if (t.t0>=0) t.t1 = mDDA.maxTime();
346 template <
typename AccessorT,
typename ListT>
347 void hits(RayT& ray, AccessorT &acc, ListT& times, TimeSpanT& t)
351 if (acc.template probeConstNode<LeafT>(mDDA.voxel()) ||
352 acc.isValueOn(mDDA.voxel())) {
353 if (t.t0<0) t.t0 = mDDA.time();
354 }
else if (t.t0>=0) {
356 if (t.valid()) times.push_back(t);
359 }
while (mDDA.step());
360 if (t.t0>=0) t.t1 = mDDA.maxTime();
369 #endif // OPENVDB_MATH_DDA_HAS_BEEN_INCLUDED Helper class that implements Hierarchical Digital Differential Analyzers and is specialized for ray i...
Definition: DDA.h:170
static bool test(TesterT &tester)
Definition: DDA.h:195
RealType next() const
Return the time (parameterized along the Ray) of the second (i.e. next) hit of a tree node of size 2^...
Definition: DDA.h:137
RayT::TimeSpan TimeSpanT
Definition: DDA.h:303
Helper class that implements Hierarchical Digital Differential Analyzers for ray intersections agains...
Definition: DDA.h:213
RayT::TimeSpan TimeSpanT
Definition: DDA.h:219
static bool test(TesterT &tester)
Definition: DDA.h:176
TreeT::RootNodeType::NodeChainType ChainT
Definition: DDA.h:172
RealType RealT
Definition: DDA.h:64
RayT::Vec3Type Vec3Type
Definition: DDA.h:65
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
VolumeHDDA()
Definition: DDA.h:305
static Coord floor(const Vec3< T > &xyz)
Return the largest integer coordinates that are not greater than xyz (node centered conversion)...
Definition: Coord.h:83
void hits(RayT &ray, AccessorT &acc, ListT ×)
Definition: DDA.h:236
size_t MinIndex(const Vec3T &v)
Return the index [0,1,2] of the smallest value in a 3D vector.
Definition: Math.h:886
const Coord & voxel() const
Return the index coordinates of the next node or voxel intersected by the ray. If Log2Dim = 0 the ret...
Definition: DDA.h:122
DDA()
uninitialized constructor
Definition: DDA.h:69
void print(std::ostream &os=std::cout) const
Print information about this DDA for debugging.
Definition: DDA.h:141
Signed (x, y, z) 32-bit integer coordinates.
Definition: Coord.h:51
TreeT::RootNodeType::NodeChainType ChainT
Definition: DDA.h:217
VolumeHDDA()
Definition: DDA.h:221
RealType time() const
Return the time (parameterized along the Ray) of the first hit of a tree node of size 2^Log2Dim...
Definition: DDA.h:129
void init(const RayT &ray, RealT startTime, RealT maxTime)
Definition: DDA.h:77
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h:136
void hits(RayT &ray, AccessorT &acc, ListT ×)
Definition: DDA.h:316
RealType maxTime() const
Return the maximum time (parameterized along the Ray).
Definition: DDA.h:132
Definition: Exceptions.h:39
TreeT::LeafNodeType LeafT
Definition: DDA.h:302
TimeSpanT march(RayT &ray, AccessorT &acc)
Definition: DDA.h:308
boost::mpl::at< ChainT, boost::mpl::int_< ChildNodeLevel > >::type NodeT
Definition: DDA.h:218
bool isZero(const Type &x)
Return true if x is exactly equal to zero.
Definition: Math.h:308
A Digital Differential Analyzer specialized for OpenVDB grids.
Definition: DDA.h:60
const Type & Min(const Type &a, const Type &b)
Return the minimum of two values.
Definition: Math.h:606
void init(const RayT &ray, RealT startTime)
Definition: DDA.h:104
bool step()
Increment the voxel index to next intersected voxel or node and returns true if the step in time does...
Definition: DDA.h:108
DDA(const RayT &ray)
Definition: DDA.h:71
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:188
TimeSpanT march(RayT &ray, AccessorT &acc)
Definition: DDA.h:224
Vec3Type Vec3T
Definition: DDA.h:66
void init(const RayT &ray)
Definition: DDA.h:102
DDA(const RayT &ray, RealT startTime)
Definition: DDA.h:73
DDA(const RayT &ray, RealT startTime, RealT maxTime)
Definition: DDA.h:75
boost::mpl::at< ChainT, boost::mpl::int_< NodeLevel > >::type NodeT
Definition: DDA.h:173
RayT::RealType RealType
Definition: DDA.h:63