00001 #ifndef _KdTree_H__ 00002 #define _KdTree_H__ 00003 00004 #include "Containers.h" 00005 #include "AxisAlignedBox3.h" 00006 00007 namespace GtpVisibilityPreprocessor { 00008 00009 class KdNode; 00011 class KdTree { 00012 public: 00013 00015 virtual void InsertOccluder(Mesh *occluder) { 00016 // mRoot->mOccluders.push_back(occluder); 00017 } 00018 00020 virtual void InsertOccludee(Mesh *occludee) { 00021 // mRoot->mOccludees.push_back(occludee); 00022 } 00023 00025 virtual void InsertViewCell(ViewCell *viewCell) { 00026 // mRoot->mViewcells.push_back(viewCell); 00027 } 00028 00039 virtual bool Subdivide(KdNode *subtree); 00040 00042 KdNode *GetRoot() const { 00043 return mRoot; 00044 } 00045 00046 protected: 00048 KdNode *mRoot; 00050 AxisAlignedBox3 mBox; 00051 }; 00052 00053 00054 class KdInterior; 00056 class KdNode { 00057 00061 virtual bool IsLeaf() const = 0; 00062 00066 virtual bool IsRoot() const { 00067 return mParent == NULL; 00068 } 00069 00070 protected: 00073 KdInterior *mParent; 00074 }; 00075 00077 class KdInterior : public KdNode { 00078 00079 public: 00081 virtual bool IsLeaf() const { return false; } 00082 00083 protected: 00085 int axis; 00087 float mPosition; 00088 00090 KdNode *mBack; 00092 KdNode *mFront; 00093 00094 }; 00095 00096 00098 class KdLeaf : public KdNode { 00099 public: 00101 virtual bool IsLeaf() const { return true; } 00102 00103 protected: 00105 MeshContainer mOccluders; 00107 MeshContainer mOccludees; 00109 ViewCellContainer mViewCells; 00110 }; 00111 00112 00113 00114 }; 00115 00116 00117 00118 00119 #endif