src/Node.h

Go to the documentation of this file.
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 

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