00001 #include "Ray.h"
00002 #include <limits>
00003
00004 using namespace std;
00005
00006 namespace rcrt
00007 {
00008
00009
00010 Ray::Ray(const Point3D& o, const Vec3D& dir, int d, float w, bool cull):origin(o),direction(dir.normalized()),
00011 invdir(1/dir.x(),1/dir.y(),1/dir.z()),
00012 minDistance(numeric_limits<float>::epsilon()),
00013 maxDistance(numeric_limits<float>::infinity()),
00014 currDistance(numeric_limits<float>::infinity()),
00015 depth(d),cullBackFaces(cull), lastIOR(1,0)
00016 ,lastObject(0),weight(w),tris(0),bihnodes(0)
00017 {
00018 dirsign[0] = (direction.x() < 0) ? 1 : 0;
00019 dirsign[1] = (direction.y() < 0) ? 1 : 0;
00020 dirsign[2] = (direction.z() < 0) ? 1 : 0;
00021
00022 tris = 0;
00023 }
00024
00025
00026 Ray::~Ray()
00027 {
00028 }
00029
00030
00031 const Point3D& Ray::org() const
00032 {
00033 return origin;
00034 }
00035
00036
00037 const Vec3D& Ray::dir() const
00038 {
00039 return direction;
00040 }
00041
00042 const Vec3D& Ray::invDir() const
00043 {
00044 return invdir;
00045 }
00046
00047 const int* Ray::dirSign() const
00048 {
00049 return dirsign;
00050 }
00051
00052 void Ray::setMinDist(float minD)
00053 {
00054 minDistance = minD;
00055 }
00056
00057
00058 void Ray::setMaxDist(float maxD)
00059 {
00060 maxDistance = maxD;
00061 }
00062
00063
00064 void Ray::setCurrDist(float currD)
00065 {
00066 currDistance = currD;
00067 }
00068
00069 void Ray::setDepth(int d)
00070 {
00071 depth = d;
00072 }
00073
00074
00075 float Ray::minDist() const
00076 {
00077 return minDistance;
00078 }
00079
00080
00081 float Ray::maxDist() const
00082 {
00083 return maxDistance;
00084 }
00085
00086
00087 float Ray::currDist() const
00088 {
00089 return currDistance;
00090 }
00091
00092 int Ray::getDepth() const
00093 {
00094 return depth;
00095 }
00096
00097 Point3D Ray::atDistance(float d) const
00098 {
00099 return origin + direction * d;
00100 }
00101
00102 const bool& Ray::cull() const
00103 {
00104 return cullBackFaces;
00105 }
00106
00107 void Ray::setLastIOR(const std::complex<float> ior)
00108 {
00109 lastIOR = ior;
00110 }
00111
00112 const complex<float>& Ray::getLastIOR() const
00113 {
00114 return lastIOR;
00115 }
00116
00117 void Ray::setLastObject(Object* obj)
00118 {
00119 lastObject = obj;
00120 }
00121
00122 Object* Ray::getLastObject()
00123 {
00124 return lastObject;
00125 }
00126
00127 const float& Ray::getWeight() const
00128 {
00129 return weight;
00130 }
00131
00132 }