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