src/Ray.h

Go to the documentation of this file.
00001 #ifndef RAY_H
00002 #define RAY_H
00003 
00004 
00005 #include <cassert>
00006 #include <iosfwd>
00007 
00008 #include "Vec3f.h"
00009 #include "defines.h"
00010 
00011 
00012 class Primitive;
00013 class Object;
00014 
00015 
00022 class Ray
00023 {
00024 public:
00027     Ray()
00028         : mOrg(),
00029             mDir(),
00030             mT(INFINITY),
00031             mHit(NULL),
00032             mHitObj(NULL),
00033             mU(0.0f),
00034             mV(0.0f),
00035             mInfluence(1.0f),
00036             mRecursionDeep(0)
00037     {
00038     }
00039 
00046     void init(  const Vec3f &   origin,
00047                 const Vec3f &   direction,
00048                 float           t = INFINITY )
00049     {
00050         assert(0.0f <= t);
00051         mOrg            = origin;
00052         mDir            = direction.normal();
00053         mT              = t + EPSILON;
00054         mHit            = NULL;
00055         mHitObj         = NULL;
00056         mU              = 0.0f;
00057         mV              = 0.0f;
00058         mInfluence      = 1.0f;
00059         mRecursionDeep  = 0;
00060     }
00061 
00064     const Vec3f & org() const
00065     {
00066         return mOrg;
00067     }
00068 
00071     const Vec3f & dir() const
00072     {
00073         return mDir;
00074     }
00075 
00078     float t() const
00079     {
00080         return mT;
00081     }
00082 
00087     Vec3f hitPoint(float eps) const
00088     {
00089         return mOrg + (mT + eps) * mDir;
00090     }
00091 
00094     const Primitive * hit() const
00095     {
00096         return mHit;
00097     }
00098 
00101     void setHit(const Primitive * hit, float t)
00102     {
00103         mHit    = hit;
00104         mT      = t;
00105     }
00106 
00109     const Object * obj() const
00110     {
00111         return mHitObj;
00112     }
00113 
00116     void setObj(const Object * object)
00117     {
00118         assert(mHit || !object);
00119         mHitObj = object;
00120     }
00121 
00124     float u() const
00125     {
00126         return mU;
00127     }
00128 
00131     float v() const
00132     {
00133         return mV;
00134     }
00135 
00138     void setUV(float u, float v)
00139     {
00140         mU = u;
00141         mV = v;
00142     }
00143 
00146     float influence() const
00147     {
00148         return mInfluence;
00149     }
00150 
00153     int recDeep() const
00154     {
00155         return mRecursionDeep;
00156     }
00157 
00163     void setInfluence(float infl, int recursionDeep)
00164     {
00165         assert(0.0f <= infl && infl <= 1.0f);
00166         assert(0 <= recursionDeep);
00167         mInfluence      = infl;
00168         mRecursionDeep  = recursionDeep;
00169     }
00170 
00177     void updateInfluence(const Ray & ray, float infl = 1.0f)
00178     {
00179         assert(0.0f <= infl && infl <= 1.0f);
00180         mInfluence      = ray.influence() * infl;
00181         mRecursionDeep  = ray.recDeep() + 1;
00182     }
00183 
00184 private:
00186     Vec3f               mOrg;
00187 
00189     Vec3f               mDir;
00190 
00192     float               mT;
00193 
00195     const Primitive *   mHit;
00196 
00198     const Object *      mHitObj;
00199 
00201     float               mU;
00202 
00204     float               mV;
00205 
00207     float               mInfluence;
00208 
00210     int                 mRecursionDeep;
00211 };
00212 
00213 
00216 std::ostream & operator<<(std::ostream & o, const Ray & ray);
00217 
00218 
00219 #endif
00220 

Generated on Fri Feb 1 00:01:42 2008 for Grayfall by  doxygen 1.5.1