00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef CCollisionAABBTreeH
00024 #define CCollisionAABBTreeH
00025
00026 #include "collisions/CCollisionBasics.h"
00027 #include "collisions/CCollisionAABBBox.h"
00028
00029
00030
00038
00039
00040
00042 typedef enum
00043 {
00044 AABB_NODE_INTERNAL=0,
00045 AABB_NODE_LEAF,
00046 AABB_NODE_GENERIC
00047 } aabb_node_types;
00048
00049
00050
00051
00061
00062 class cCollisionAABBNode
00063 {
00064 public:
00065
00066
00067
00068
00069
00071 cCollisionAABBNode() : m_parent(0), m_depth(0), m_nodeType(AABB_NODE_GENERIC) {}
00072
00074 cCollisionAABBNode(aabb_node_types a_nodeType, int a_depth) : m_parent(0),
00075 m_nodeType(a_nodeType), m_depth(a_depth) {}
00076
00078 virtual ~cCollisionAABBNode() {}
00079
00080
00081
00082
00083
00084
00086 virtual void fitBBox(double a_radius = 0) {}
00087
00089 virtual void render(int a_depth = -1) = 0;
00090
00092 virtual bool computeCollision(cVector3d& a_segmentPointA,
00093 cVector3d& a_segmentDirection,
00094 cCollisionAABBBox &a_lineBox,
00095 cCollisionRecorder& a_recorder,
00096 cCollisionSettings& a_settings) = 0;
00097
00099 virtual bool contains_triangle(int a_tag) = 0;
00100
00102 virtual void setParent(cCollisionAABBNode* a_parent, int a_recusive) = 0;
00103
00104
00105
00106
00107
00108
00110 cCollisionAABBBox m_bbox;
00111
00113 int m_depth;
00114
00116 cCollisionAABBNode* m_parent;
00117
00119 int m_nodeType;
00120 };
00121
00122
00123
00132
00133 class cCollisionAABBLeaf : public cCollisionAABBNode
00134 {
00135 public:
00136
00137
00138
00139
00140
00142 cCollisionAABBLeaf() : cCollisionAABBNode(AABB_NODE_LEAF, 0) {}
00143
00145 virtual ~cCollisionAABBLeaf() {}
00146
00147
00148
00149
00150
00151
00153 void initialize(cTriangle *a_triangle, double a_radius) { m_triangle = a_triangle; fitBBox(a_radius); }
00154
00156 void fitBBox(double a_radius = 0);
00157
00159 void render(int a_depth = -1);
00160
00162 bool computeCollision(cVector3d& a_segmentPointA,
00163 cVector3d& a_segmentPointB,
00164 cCollisionAABBBox& a_lineBox,
00165 cCollisionRecorder& a_recorder,
00166 cCollisionSettings& a_settings);
00167
00169 virtual bool contains_triangle(int a_tag)
00170 { return (m_triangle != 0 && m_triangle->m_tag == a_tag); }
00171
00173 virtual void setParent(cCollisionAABBNode* a_parent, int a_recusive)
00174 { m_parent = a_parent; }
00175
00176
00177
00178
00179
00180
00182 cTriangle *m_triangle;
00183 };
00184
00185
00186
00195
00196 class cCollisionAABBInternal : public cCollisionAABBNode
00197 {
00198 public:
00199
00200
00201
00202
00203
00205 cCollisionAABBInternal() : cCollisionAABBNode(AABB_NODE_INTERNAL, 0) { }
00206
00208 virtual ~cCollisionAABBInternal() {};
00209
00210
00211
00212
00213
00214
00216 void initialize(unsigned int a_numLeaves, cCollisionAABBLeaf *a_leaves,
00217 unsigned int a_depth = -1);
00218
00220 void fitBBox(double a_radius = 0) {m_bbox.enclose(m_leftSubTree->m_bbox, m_rightSubTree->m_bbox);}
00221
00223 void render(int a_depth = -1);
00224
00226 bool computeCollision(cVector3d& a_segmentPointA,
00227 cVector3d& a_segmentPointB,
00228 cCollisionAABBBox &a_lineBox,
00229 cCollisionRecorder& a_recorder,
00230 cCollisionSettings& a_settings);
00231
00233 virtual bool contains_triangle(int a_tag);
00234
00236 virtual void setParent(cCollisionAABBNode* a_parent, int a_recursive);
00237
00238
00239
00240
00241
00242
00244 cCollisionAABBNode *m_leftSubTree;
00245
00247 cCollisionAABBNode *m_rightSubTree;
00248
00250 bool m_testLineBox;
00251 };
00252
00253
00254 #endif
00255
00256