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
OPENVDB_API std::ostream & operator<<(std::ostream &os, half h)
Output h to os, formatted as a float.
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
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
bool isApproxZero(const Type &x)
Return true if x is equal to zero to within the default floating-point comparison tolerance.
Definition Math.h:349
float Sqrt(float x)
Return the square root of a floating-point value.
Definition Math.h:761
bool isRelOrApproxEqual(const Type &a, const Type &b, const Type &absTol, const Type &relTol)
Definition Math.h:453
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:72
Definition Exceptions.h:13
static T value()
Definition Math.h:155
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:148
#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:218