00001 #ifndef NODE_H 00002 #define NODE_H 00003 00004 00005 #include <vector> 00006 #include <cassert> 00007 00008 #include "Axis.h" 00009 #include "Ray.h" 00010 00011 00012 class Primitive; 00013 00014 00019 class Node 00020 { 00021 public: 00024 Node() 00025 : mSplitAxis(NO_AXIS), 00026 mSplitPlane(INFINITY), 00027 mLeft(NULL), 00028 mRight(NULL), 00029 mPrimitives() 00030 { 00031 } 00032 00037 Node(const std::vector<Primitive *> primitives) 00038 : mSplitAxis(NO_AXIS), 00039 mSplitPlane(INFINITY), 00040 mLeft(NULL), 00041 mRight(NULL), 00042 mPrimitives(primitives) 00043 { 00044 } 00045 00048 ~Node() 00049 { 00050 delete mLeft; 00051 delete mRight; 00052 } 00053 00056 Node * left() const 00057 { 00058 return mLeft; 00059 } 00060 00063 Node * right() const 00064 { 00065 return mRight; 00066 } 00067 00073 void setLeftRight(Node * newleft, Node * newright) 00074 { 00075 assert(newleft); 00076 assert(newright); 00077 00078 mLeft = newleft; 00079 mRight = newright; 00080 } 00081 00084 Axis splitAxis() const 00085 { 00086 return mSplitAxis; 00087 } 00088 00091 void setSplitAxis(Axis splitaxis) 00092 { 00093 mSplitAxis = splitaxis; 00094 } 00095 00098 float splitPlane() const 00099 { 00100 return mSplitPlane; 00101 } 00102 00105 void setSplitPlane(float plane) 00106 { 00107 mSplitPlane = plane; 00108 } 00109 00114 void add(Primitive * primitive) 00115 { 00116 mPrimitives.push_back(primitive); 00117 } 00118 00124 Primitive * primitive(unsigned int index) const 00125 { 00126 return mPrimitives[index]; 00127 } 00128 00131 void clear_primitives() 00132 { 00133 mPrimitives.clear(); 00134 } 00135 00140 unsigned int primitives_count() const 00141 { 00142 return mPrimitives.size(); 00143 } 00144 00147 bool isLeafNode() const 00148 { 00149 return mSplitAxis == NO_AXIS; 00150 } 00151 00160 bool leafIntersect(Ray & ray, float min, float max) const; 00161 00169 inline void nearFar(const Ray & r, Node *& near, Node *& far) const 00170 { 00171 if (mSplitPlane >= r.org()[mSplitAxis]) 00172 { 00173 near = mLeft; 00174 far = mRight; 00175 } 00176 else 00177 { 00178 near = mRight; 00179 far = mLeft; 00180 } 00181 } 00182 00187 inline float distanceToSplitPlane(const Ray & ray) const 00188 { 00189 return (mSplitPlane - ray.org()[mSplitAxis]) / ray.dir()[mSplitAxis]; 00190 } 00191 00192 private: 00194 Axis mSplitAxis; 00195 00197 float mSplitPlane; 00198 00200 Node * mLeft; 00201 00203 Node * mRight; 00204 00206 std::vector<Primitive *> mPrimitives; 00207 }; 00208 00209 00210 #endif 00211