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