00001 #ifndef H_BOX 00002 #define H_BOX 00003 00004 #include <vector> 00005 #include "math3d.h" 00006 #include "sysdep.h" 00007 00008 __CD__BEGIN 00009 00012 class RotationState 00013 { 00014 public: 00015 RotationState(const Matrix3D& transform); 00016 Vector3D N[3]; 00017 Matrix3D t; 00018 }; 00019 00021 class Box 00022 { 00023 public: 00025 Box() {} 00027 Box(float x, float y, float z, float sx, float sy, float sz) 00028 : m_Pos(x,y,z), m_Size(sx,sy,sz), 00029 m_Center(x+0.5f*sx,y+0.5f*sy,z+0.5f*sz) {} 00031 Box(const Vector3D& pos, const Vector3D& size) 00032 : m_Pos(pos), m_Size(size), m_Center(pos+0.5f*size) {} 00034 Box(const Box& b) : m_Pos(b.m_Pos), m_Size(b.m_Size), m_Center(b.m_Center) {} 00035 virtual ~Box() {} 00037 const Vector3D& getPosition() const { return m_Pos; } 00039 const Vector3D& getSize() const { return m_Size; } 00041 const Vector3D& getCenter() const { return m_Center; } 00043 float getVolume() const { return m_Size.x*m_Size.y*m_Size.z; } 00045 bool intersect(const Vector3D& O, const Vector3D& D); 00047 bool intersect(const Vector3D& O, const Vector3D& D, float segmax); 00049 bool intersect(const Vector3D& O, float radius); 00051 bool intersect(const Vector3D& p) const; 00053 bool intersect(const Box& b); 00055 bool intersect(const Box& b, RotationState& rs); 00056 00058 Vector3D m_Pos; 00060 Vector3D m_Size; 00062 Vector3D m_Center; 00063 }; 00064 00066 class Triangle 00067 { 00068 public: 00070 Triangle() {} 00072 Triangle(const Vector3D& _1, const Vector3D& _2, const Vector3D& _3); 00074 bool intersect(const Triangle& t) const; 00084 bool intersect(const Vector3D& O, const Vector3D& D, Vector3D& cp, 00085 float& tparm, float segmax); 00090 bool intersect(const Vector3D& O, float radius, Vector3D& cp); 00091 00092 Vector3D v1,v2,v3; 00093 Vector3D center; 00094 }; 00095 00096 class BoxedTriangle; 00097 00099 class BoxTreeNode : public Box 00100 { 00101 public: 00103 BoxTreeNode() : Box() {} 00105 BoxTreeNode(const Vector3D& pos, const Vector3D& size) 00106 : Box(pos,size) {} 00108 virtual bool isLeaf() const = 0; 00110 virtual int getSonsNumber() = 0; 00112 virtual BoxTreeNode* getSon(int which) = 0; 00115 virtual int getTrianglesNumber() = 0; 00119 virtual BoxedTriangle* getTriangle(int which) = 0; 00120 }; 00121 00123 class BoxTreeInnerNode : public BoxTreeNode 00124 { 00125 public: 00126 BoxTreeInnerNode(const Vector3D& pos, const Vector3D& size, int logdepth) 00127 : BoxTreeNode(pos,size), m_First(NULL), m_Second(NULL), 00128 m_logdepth(logdepth) {}; 00129 virtual bool isLeaf() const { return false; } 00131 int createSons(const Vector3D& center); 00135 void recalcBounds(Vector3D& center); 00137 int divide(int p_depth); 00138 00139 int getSonsNumber() 00140 { 00141 int n=0; 00142 if (m_First!=NULL) n++; 00143 if (m_Second!=NULL) n++; 00144 return n; 00145 } 00146 00147 int getTrianglesNumber(); 00148 BoxedTriangle* getTriangle(int which); 00149 00150 BoxTreeNode* getSon(int which) 00151 { 00152 if (which==0) return m_First; 00153 if (which==1) return m_Second; 00154 return NULL; 00155 } 00156 00157 BoxTreeNode* m_First; 00158 BoxTreeNode* m_Second; 00159 int m_logdepth; 00160 std::vector<BoxedTriangle*> m_Boxes; 00161 }; 00162 00164 class BoxedTriangle : public BoxTreeNode, public Triangle 00165 { 00166 public: 00167 BoxedTriangle(const Vector3D& _1, const Vector3D& _2, const Vector3D& _3); 00168 virtual bool isLeaf() const { return true; } 00169 int getSonsNumber() { return 0; } 00170 BoxTreeNode* getSon(int which) { return NULL; } 00171 int getTrianglesNumber() { return 1; } 00172 BoxedTriangle* getTriangle(int which) 00173 { 00174 if (which==0) return this; 00175 return NULL; 00176 } 00177 00178 }; 00179 00180 __CD__END 00181 00182 #endif // H_BOX