10#ifndef OPENVDB_MATH_RAY_HAS_BEEN_INCLUDED
11#define OPENVDB_MATH_RAY_HAS_BEEN_INCLUDED
26template<
typename RealT =
double>
30 static_assert(std::is_floating_point<RealT>::value,
31 "math::Ray requires a floating-point value type");
44 inline void set(RealT _t0, RealT _t1) {
t0=_t0;
t1=_t1; }
46 inline void get(RealT& _t0, RealT& _t1)
const { _t0=
t0; _t1=
t1; }
50 inline RealT
mid()
const {
return 0.5*(
t0 +
t1); }
54 inline bool test(RealT t)
const {
return (t>=
t0 && t<=
t1); }
60 RealT
t1 = std::numeric_limits<RealT>::max())
61 : mEye(
eye), mDir(direction), mInvDir(1/mDir), mTimeSpan(
t0,
t1)
79 RealT
t1 = std::numeric_limits<RealT>::max())
82 mTimeSpan.set(
t0,
t1);
91 RealT
t1 = std::numeric_limits<RealT>::max())
104 inline RealT
t0()
const {
return mTimeSpan.t0;}
106 inline RealT
t1()
const {
return mTimeSpan.t1;}
115 inline Vec3R end()
const {
return (*
this)(mTimeSpan.t1); }
118 inline Vec3R mid()
const {
return (*
this)(mTimeSpan.mid()); }
124 inline bool test(RealT time)
const {
return mTimeSpan.test(time); }
132 template<
typename MapType>
138 const Vec3T eye = map.applyMap(mEye);
139 const Vec3T dir = map.applyJacobian(mDir);
140 const RealT length =
dir.length();
141 return Ray(
eye,
dir/length, length*mTimeSpan.t0, length*mTimeSpan.t1);
150 template<
typename MapType>
155 const Vec3T eye = map.applyInverseMap(mEye);
156 const Vec3T dir = map.applyInverseJacobian(mDir);
157 const RealT length =
dir.length();
158 return Ray(
eye,
dir/length, length*mTimeSpan.t0, length*mTimeSpan.t1);
163 template<
typename Gr
idType>
166 return this->
applyMap(*(grid.transform().baseMap()));
171 template<
typename Gr
idType>
186 const Vec3T origin = mEye - center;
188 const RealT B = 2 * mDir.dot(origin);
189 const RealT C = origin.
lengthSqr() - radius * radius;
190 const RealT D = B * B - 4 * A * C;
192 if (D < 0)
return false;
194 const RealT Q = RealT(-0.5)*(B<0 ? (B +
Sqrt(D)) : (B -
Sqrt(D)));
200 if (
t0 < mTimeSpan.t0)
t0 = mTimeSpan.t0;
201 if (
t1 > mTimeSpan.t1)
t1 = mTimeSpan.t1;
222 if (hit) mTimeSpan.set(
t0,
t1);
233 template<
typename BBoxT>
236 mTimeSpan.get(
t0,
t1);
237 for (
int i = 0; i < 3; ++i) {
238 RealT a = (bbox.min()[i] - mEye[i]) * mInvDir[i];
239 RealT b = (bbox.max()[i] - mEye[i]) * mInvDir[i];
240 if (a > b) std::swap(a, b);
243 if (
t0 >
t1)
return false;
250 template<
typename BBoxT>
260 template<
typename BBoxT>
261 inline bool clip(
const BBoxT& bbox)
265 if (hit) mTimeSpan.set(
t0,
t1);
276 const RealT cosAngle = mDir.dot(normal);
278 t = (distance - mEye.dot(normal))/cosAngle;
279 return this->
test(t);
293 Vec3T mEye, mDir, mInvDir;
300template<
typename RealT>
303 os <<
"eye=" << r.
eye() <<
" dir=" << r.
dir() <<
" 1/dir="<<r.
invDir()
304 <<
" t0=" << r.
t0() <<
" t1=" << r.
t1();
#define OPENVDB_ASSERT(X)
Definition Assert.h:41
bool test(RealT time) const
Return true if time is within t0 and t1, both inclusive.
Definition Ray.h:124
Ray(const Vec3Type &eye=Vec3Type(0, 0, 0), const Vec3Type &direction=Vec3Type(1, 0, 0), RealT t0=math::Delta< RealT >::value(), RealT t1=std::numeric_limits< RealT >::max())
Definition Ray.h:57
bool intersects(const Vec3T &normal, RealT distance, RealT &t) const
Return true if the Ray intersects the plane specified by a normal and distance from the origin.
Definition Ray.h:274
Ray applyInverseMap(const MapType &map) const
Return a new Ray that is transformed with the inverse of the specified map.
Definition Ray.h:151
const Vec3T & dir() const
Definition Ray.h:100
bool clip(const BBoxT &bbox)
Return true if this ray intersects the specified bounding box.
Definition Ray.h:261
Vec3< RealT > Vec3Type
Definition Ray.h:34
void setEye(const Vec3Type &eye)
Definition Ray.h:65
const Vec3T & eye() const
Definition Ray.h:98
bool intersects(const BBoxT &bbox) const
Return true if this ray intersects the specified bounding box.
Definition Ray.h:251
Ray applyMap(const MapType &map) const
Return a new Ray that is transformed with the specified map.
Definition Ray.h:133
RealT RealType
Definition Ray.h:33
Vec3R operator()(RealT time) const
Return the position along the ray at the specified time.
Definition Ray.h:109
void setDir(const Vec3Type &dir)
Definition Ray.h:67
bool intersects(const Vec3T ¢er, RealT radius) const
Return true if this ray intersects the specified sphere.
Definition Ray.h:208
bool valid(RealT eps=math::Delta< float >::value()) const
Return true if t1 is larger than t0 by at least eps.
Definition Ray.h:121
void scaleTimes(RealT scale)
Definition Ray.h:85
Ray worldToIndex(const GridType &grid) const
Return a new ray in the index space of the specified grid, assuming the existing ray is represented i...
Definition Ray.h:172
void setTimes(RealT t0=math::Delta< RealT >::value(), RealT t1=std::numeric_limits< RealT >::max())
Definition Ray.h:77
Vec3R start() const
Return the starting point of the ray.
Definition Ray.h:112
const Vec3T & invDir() const
Definition Ray.h:102
void setMaxTime(RealT t1)
Definition Ray.h:75
Vec3Type Vec3T
Definition Ray.h:35
bool clip(const Vec3T ¢er, RealT radius)
Return true if this ray intersects the specified sphere.
Definition Ray.h:218
bool intersects(const BBoxT &bbox, RealT &t0, RealT &t1) const
Return true if the Ray intersects the specified axisaligned bounding box.
Definition Ray.h:234
bool intersects(const Vec3T &normal, const Vec3T &point, RealT &t) const
Return true if the Ray intersects the plane specified by a normal and point.
Definition Ray.h:287
RealT t0() const
Definition Ray.h:104
void reset(const Vec3Type &eye, const Vec3Type &direction, RealT t0=math::Delta< RealT >::value(), RealT t1=std::numeric_limits< RealT >::max())
Definition Ray.h:87
Ray indexToWorld(const GridType &grid) const
Return a new ray in world space, assuming the existing ray is represented in the index space of the s...
Definition Ray.h:164
RealT t1() const
Definition Ray.h:106
Vec3R end() const
Return the endpoint of the ray.
Definition Ray.h:115
bool intersects(const Vec3T ¢er, RealT radius, RealT &t0, RealT &t1) const
Return true if this ray intersects the specified sphere.
Definition Ray.h:184
Vec3R mid() const
Return the midpoint of the ray.
Definition Ray.h:118
void setMinTime(RealT t0)
Definition Ray.h:73
T dot(const Vec3< T > &v) const
Dot product.
Definition Vec3.h:192
T lengthSqr() const
Definition Vec3.h:212
std::ostream & operator<<(std::ostream &os, const nanovdb::math::BBox< nanovdb::math::Vec3< T > > &b)
Definition IO.h:744
bool isApproxZero(const Type &x, const Type &tolerance)
Return true if x is equal to zero to within the given tolerance.
Definition Math.h:360
float Sqrt(float x)
Return the square root of a floating-point value.
Definition Math.h:829
bool isRelOrApproxEqual(const Type &a, const Type &b, const Type &absTol, const Type &relTol)
Definition Math.h:475
MatType scale(const Vec3< typename MatType::value_type > &s)
Return a matrix that scales by s.
Definition Mat.h:615
math::Vec3< Real > Vec3R
Definition Types.h:53
Definition Exceptions.h:13
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
static T value()
Definition Math.h:167
TimeSpan(RealT _t0, RealT _t1)
Constructor.
Definition Ray.h:42
RealT mid() const
Return the midpoint of the ray.
Definition Ray.h:50
TimeSpan()
Default constructor.
Definition Ray.h:40
bool test(RealT t) const
Return true if time is inclusive.
Definition Ray.h:54
void scale(RealT s)
Multiplies both times.
Definition Ray.h:52
RealT t1
Definition Ray.h:38
bool valid(RealT eps=math::Delta< RealT >::value()) const
Return true if t1 is larger than t0 by at least eps.
Definition Ray.h:48
RealT t0
Definition Ray.h:38
void set(RealT _t0, RealT _t1)
Set both times.
Definition Ray.h:44
void get(RealT &_t0, RealT &_t1) const
Get both times.
Definition Ray.h:46
static T value()
Definition Math.h:159
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition version.h.in:121
#define OPENVDB_USE_VERSION_NAMESPACE
Definition version.h.in:291