Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00008
00010
00016
00017
00019
00020 #ifndef __OPC_TREECOLLIDER_H__
00021 #define __OPC_TREECOLLIDER_H__
00022
00023 #include"../config.h"
00030 struct OPCODE_API BVTCache : Pair
00031 {
00033 inline_ BVTCache()
00034 {
00035 ResetCache();
00036 ResetCountDown();
00037 }
00038
00039 void ResetCache()
00040 {
00041 Model0 = null;
00042 Model1 = null;
00043 id0 = 0;
00044 id1 = 1;
00045 #ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE !
00046 HullTest = true;
00047 SepVector.pid = 0;
00048 SepVector.qid = 0;
00049 SepVector.SV = Point(1.0f, 0.0f, 0.0f);
00050 #endif // __MESHMERIZER_H__
00051 }
00052
00053 inline_ void ResetCountDown()
00054 {
00055 #ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE !
00056 CountDown = 50;
00057 #endif // __MESHMERIZER_H__
00058 }
00059
00060 const Model* Model0;
00061 const Model* Model1;
00062
00063 #ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE !
00064 SVCache SepVector;
00065 udword CountDown;
00066 bool HullTest;
00067 #endif // __MESHMERIZER_H__
00068 };
00069
00070 class OPCODE_API AABBTreeCollider : public Collider
00071 {
00072 public:
00073
00074 AABBTreeCollider();
00075 virtual ~AABBTreeCollider();
00076
00077 inline void setCollisionPairInserter(hrp::CollisionPairInserterBase* collisionPairInserter) {
00078 this->collisionPairInserter = collisionPairInserter;
00079 }
00080
00081
00082
00083
00085
00097
00098 bool Collide(BVTCache& cache, const Matrix4x4* world0=null, const Matrix4x4* world1=null);
00099
00100
00101 bool Collide(const AABBCollisionTree* tree0, const AABBCollisionTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null);
00102 bool Collide(const AABBNoLeafTree* tree0, const AABBNoLeafTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null);
00103 bool Collide(const AABBQuantizedTree* tree0, const AABBQuantizedTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null);
00104 bool Collide(const AABBQuantizedNoLeafTree* tree0, const AABBQuantizedNoLeafTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null);
00105
00106
00108
00113
00114 inline_ void SetFullBoxBoxTest(bool flag) { mFullBoxBoxTest = flag; }
00115
00117
00122
00123 inline_ void SetFullPrimBoxTest(bool flag) { mFullPrimBoxTest = flag; }
00124
00125
00126
00128
00134
00135 inline_ udword GetNbBVBVTests() const { return mNbBVBVTests; }
00136
00138
00144
00145 inline_ udword GetNbPrimPrimTests() const { return mNbPrimPrimTests; }
00146
00148
00154
00155 inline_ udword GetNbBVPrimTests() const { return mNbBVPrimTests; }
00156
00157
00158
00160
00166
00167 inline_ udword GetNbPairs() const { return mPairs.GetNbEntries()>>1; }
00168
00170
00176
00177 inline_ const Pair* GetPairs() const { return (const Pair*)mPairs.GetEntries(); }
00178
00180
00184
00185 override(Collider) HRP_COLLISION_EXPORT const char* ValidateSettings();
00186
00187 protected:
00188
00189 Container mPairs;
00190
00191 const MeshInterface* mIMesh0;
00192 const MeshInterface* mIMesh1;
00193
00194 udword mNbBVBVTests;
00195 udword mNbPrimPrimTests;
00196 udword mNbBVPrimTests;
00197
00198 Matrix3x3 mAR;
00199 Matrix3x3 mR0to1;
00200 Matrix3x3 mR1to0;
00201 Point mT0to1;
00202 Point mT1to0;
00203
00204 Point mCenterCoeff0;
00205 Point mExtentsCoeff0;
00206 Point mCenterCoeff1;
00207 Point mExtentsCoeff1;
00208
00209
00210 udword mId0;
00211 udword mId1;
00212 const AABBCollisionNode* mNowNode0;
00213 const AABBCollisionNode* mNowNode1;
00214
00215 Point mLeafVerts[3];
00216 udword mLeafIndex;
00217
00218 bool mFullBoxBoxTest;
00219 bool mFullPrimBoxTest;
00220 hrp::CollisionPairInserterBase* collisionPairInserter;
00221
00222
00223
00224 void _Collide(const AABBCollisionNode* b0, const AABBCollisionNode* b1);
00225
00226 void _Collide(const AABBQuantizedNode* b0, const AABBQuantizedNode* b1, const Point& a, const Point& Pa, const Point& b, const Point& Pb);
00227
00228 void _CollideTriBox(const AABBNoLeafNode* b);
00229 void _CollideBoxTri(const AABBNoLeafNode* b);
00230 void _Collide(const AABBNoLeafNode* a, const AABBNoLeafNode* b);
00231
00232 void _CollideTriBox(const AABBQuantizedNoLeafNode* b);
00233 void _CollideBoxTri(const AABBQuantizedNoLeafNode* b);
00234 void _Collide(const AABBQuantizedNoLeafNode* a, const AABBQuantizedNoLeafNode* b);
00235
00236 void PrimTest(udword id0, udword id1);
00237 inline_ void PrimTestTriIndex(udword id1);
00238 inline_ void PrimTestIndexTri(udword id0);
00239
00240 inline_ BOOL BoxBoxOverlap(const Point& ea, const Point& ca, const Point& eb, const Point& cb);
00241 inline_ BOOL TriBoxOverlap(const Point& center, const Point& extents);
00242 BOOL TriTriOverlap(const Point& V0, const Point& V1, const Point& V2, const Point& U0, const Point& U1, const Point& U2);
00243
00244 HRP_COLLISION_EXPORT void InitQuery(const Matrix4x4* world0=null, const Matrix4x4* world1=null);
00245 bool CheckTemporalCoherence(Pair* cache);
00246
00247 inline_ BOOL Setup(const MeshInterface* mi0, const MeshInterface* mi1)
00248 {
00249 mIMesh0 = mi0;
00250 mIMesh1 = mi1;
00251
00252 if(!mIMesh0 || !mIMesh1) return FALSE;
00253
00254 return TRUE;
00255 }
00256 };
00257
00258 #endif // __OPC_TREECOLLIDER_H__