10#ifndef OPENVDB_MATH_RAY_HAS_BEEN_INCLUDED
11#define OPENVDB_MATH_RAY_HAS_BEEN_INCLUDED
25template<
typename RealT =
double>
29 static_assert(std::is_floating_point<RealT>::value,
30 "math::Ray requires a floating-point value type");
41 TimeSpan(RealT _t0, RealT _t1) : t0(_t0), t1(_t1) {}
43 inline void set(RealT _t0, RealT _t1) { t0=_t0; t1=_t1; }
45 inline void get(RealT& _t0, RealT& _t1)
const { _t0=t0; _t1=t1; }
49 inline RealT
mid()
const {
return 0.5*(t0 + t1); }
51 inline void scale(RealT s) {assert(s>0); t0*=s; t1*=s; }
53 inline bool test(RealT t)
const {
return (t>=t0 && t<=t1); }
59 RealT t1 = std::numeric_limits<RealT>::max())
60 : mEye(eye), mDir(direction), mInvDir(1/mDir), mTimeSpan(t0, t1)
72 inline void setMinTime(RealT t0) { assert(t0>0); mTimeSpan.t0 = t0; }
74 inline void setMaxTime(RealT t1) { assert(t1>0); mTimeSpan.t1 = t1; }
78 RealT t1 = std::numeric_limits<RealT>::max())
81 mTimeSpan.set(t0, t1);
90 RealT t1 = std::numeric_limits<RealT>::max())
93 this->setDir(direction);
94 this->setTimes(t0, t1);
103 inline RealT
t0()
const {
return mTimeSpan.t0;}
105 inline RealT
t1()
const {
return mTimeSpan.t1;}
114 inline Vec3R end()
const {
return (*
this)(mTimeSpan.t1); }
117 inline Vec3R mid()
const {
return (*
this)(mTimeSpan.mid()); }
123 inline bool test(RealT time)
const {
return mTimeSpan.test(time); }
131 template<
typename MapType>
134 assert(map.isLinear());
135 assert(math::isRelOrApproxEqual(mDir.length(), RealT(1),
137 const Vec3T eye = map.applyMap(mEye);
138 const Vec3T dir = map.applyJacobian(mDir);
139 const RealT length = dir.
length();
140 return Ray(eye, dir/length, length*mTimeSpan.t0, length*mTimeSpan.t1);
149 template<
typename MapType>
152 assert(map.isLinear());
154 const Vec3T eye = map.applyInverseMap(mEye);
155 const Vec3T dir = map.applyInverseJacobian(mDir);
156 const RealT length = dir.
length();
157 return Ray(eye, dir/length, length*mTimeSpan.t0, length*mTimeSpan.t1);
162 template<
typename Gr
idType>
165 return this->applyMap(*(grid.transform().baseMap()));
170 template<
typename Gr
idType>
173 return this->applyInverseMap(*(grid.transform().baseMap()));
185 const Vec3T origin = mEye - center;
187 const RealT B = 2 * mDir.dot(origin);
188 const RealT C = origin.
lengthSqr() - radius * radius;
189 const RealT D = B * B - 4 * A * C;
191 if (D < 0)
return false;
193 const RealT Q = RealT(-0.5)*(B<0 ? (B +
Sqrt(D)) : (B -
Sqrt(D)));
198 if (t0 > t1) std::swap(t0, t1);
199 if (t0 < mTimeSpan.t0) t0 = mTimeSpan.t0;
200 if (t1 > mTimeSpan.t1) t1 = mTimeSpan.t1;
210 return this->intersects(center, radius, t0, t1)>0;
220 const bool hit = this->intersects(center, radius, t0, t1);
221 if (hit) mTimeSpan.set(t0, t1);
232 template<
typename BBoxT>
233 inline bool intersects(
const BBoxT& bbox, RealT& t0, RealT& t1)
const
235 mTimeSpan.get(t0, t1);
236 for (
int i = 0; i < 3; ++i) {
237 RealT a = (bbox.min()[i] - mEye[i]) * mInvDir[i];
238 RealT b = (bbox.max()[i] - mEye[i]) * mInvDir[i];
239 if (a > b) std::swap(a, b);
242 if (t0 > t1)
return false;
249 template<
typename BBoxT>
253 return this->intersects(bbox, t0, t1);
259 template<
typename BBoxT>
260 inline bool clip(
const BBoxT& bbox)
263 const bool hit = this->intersects(bbox, t0, t1);
264 if (hit) mTimeSpan.set(t0, t1);
275 const RealT cosAngle = mDir.dot(normal);
276 if (math::isApproxZero(cosAngle))
return false;
277 t = (distance - mEye.dot(normal))/cosAngle;
278 return this->test(t);
288 return this->intersects(normal, point.
dot(normal), t);
292 Vec3T mEye, mDir, mInvDir;
299template<
typename RealT>
302 os <<
"eye=" << r.
eye() <<
" dir=" << r.
dir() <<
" 1/dir="<<r.
invDir()
303 <<
" t0=" << r.
t0() <<
" t1=" << r.
t1();
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:123
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:56
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:273
Ray applyInverseMap(const MapType &map) const
Return a new Ray that is transformed with the inverse of the specified map.
Definition Ray.h:150
const Vec3T & dir() const
Definition Ray.h:99
bool clip(const BBoxT &bbox)
Return true if this ray intersects the specified bounding box.
Definition Ray.h:260
void setEye(const Vec3Type &eye)
Definition Ray.h:64
const Vec3T & eye() const
Definition Ray.h:97
bool intersects(const BBoxT &bbox) const
Return true if this ray intersects the specified bounding box.
Definition Ray.h:250
Ray applyMap(const MapType &map) const
Return a new Ray that is transformed with the specified map.
Definition Ray.h:132
RealT RealType
Definition Ray.h:32
Vec3R operator()(RealT time) const
Return the position along the ray at the specified time.
Definition Ray.h:108
void setDir(const Vec3Type &dir)
Definition Ray.h:66
bool intersects(const Vec3T ¢er, RealT radius) const
Return true if this ray intersects the specified sphere.
Definition Ray.h:207
bool valid(RealT eps=math::Delta< float >::value()) const
Return true if t1 is larger than t0 by at least eps.
Definition Ray.h:120
void scaleTimes(RealT scale)
Definition Ray.h:84
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:171
void setTimes(RealT t0=math::Delta< RealT >::value(), RealT t1=std::numeric_limits< RealT >::max())
Definition Ray.h:76
Vec3R start() const
Return the starting point of the ray.
Definition Ray.h:111
const Vec3T & invDir() const
Definition Ray.h:101
void setMaxTime(RealT t1)
Definition Ray.h:74
bool clip(const Vec3T ¢er, RealT radius)
Return true if this ray intersects the specified sphere.
Definition Ray.h:217
bool intersects(const BBoxT &bbox, RealT &t0, RealT &t1) const
Return true if the Ray intersects the specified axisaligned bounding box.
Definition Ray.h:233
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:286
RealT t0() const
Definition Ray.h:103
void reset(const Vec3Type &eye, const Vec3Type &direction, RealT t0=math::Delta< RealT >::value(), RealT t1=std::numeric_limits< RealT >::max())
Definition Ray.h:86
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:163
RealT t1() const
Definition Ray.h:105
Vec3R end() const
Return the endpoint of the ray.
Definition Ray.h:114
bool intersects(const Vec3T ¢er, RealT radius, RealT &t0, RealT &t1) const
Return true if this ray intersects the specified sphere.
Definition Ray.h:183
Vec3R mid() const
Return the midpoint of the ray.
Definition Ray.h:117
void setMinTime(RealT t0)
Definition Ray.h:72
T length() const
Length of the vector.
Definition Vec3.h:200
T dot(const Vec3< T > &v) const
Dot product.
Definition Vec3.h:191
T lengthSqr() const
Definition Vec3.h:211
float Sqrt(float x)
Return the square root of a floating-point value.
Definition Math.h:761
MatType scale(const Vec3< typename MatType::value_type > &s)
Return a matrix that scales by s.
Definition Mat.h:615
std::ostream & operator<<(std::ostream &ostr, const Metadata &metadata)
Write a Metadata to an output stream.
Definition Metadata.h:351
Definition Exceptions.h:13
Delta for small floating-point offsets.
Definition Math.h:155
TimeSpan(RealT _t0, RealT _t1)
Constructor.
Definition Ray.h:41
RealT mid() const
Return the midpoint of the ray.
Definition Ray.h:49
TimeSpan()
Default constructor.
Definition Ray.h:39
bool test(RealT t) const
Return true if time is inclusive.
Definition Ray.h:53
void scale(RealT s)
Multiplies both times.
Definition Ray.h:51
bool valid(RealT eps=math::Delta< RealT >::value()) const
Return true if t1 is larger than t0 by at least eps.
Definition Ray.h:47
RealT t0
Definition Ray.h:37
void set(RealT _t0, RealT _t1)
Set both times.
Definition Ray.h:43
void get(RealT &_t0, RealT &_t1) const
Get both times.
Definition Ray.h:45
Tolerance for floating-point comparison.
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:212