00001 #pragma once 00002 00003 #include "../../core/src/bvhnode.h" 00004 #include "../../core/src/geometry.h" 00005 #include "CollisionDetection_BVHNode.h" 00006 #include <deque> 00007 00008 #define TRIANGLES_IN_LEAF 5 00009 00010 00011 namespace CollisionDetectionNamespace 00012 { 00014 struct CollisionDetection_CollisionPair 00015 { 00016 CollisionDetection_BVHNode* pNodeR; 00017 CollisionDetection_BVHNode* pNodeL; 00018 CollisionDetection_CollisionPair(CollisionDetection_BVHNode* pNode1,CollisionDetection_BVHNode* pNode2) 00019 { 00020 pNodeL = pNode1; 00021 pNodeR = pNode2; 00022 } 00023 CollisionDetection_CollisionPair(){} 00024 00025 }; 00026 00028 struct CollisionPair 00029 { 00030 const BVHNode* pNodeR; 00031 const BVHNode* pNodeL; 00032 CollisionPair(const BVHNode* pNode1,const BVHNode* pNode2) 00033 { 00034 pNodeL = pNode1; 00035 pNodeR = pNode2; 00036 } 00037 CollisionPair(){} 00038 00039 }; 00040 00041 00043 class CollisionDetection_BVH 00044 { 00045 00046 private: 00048 enum AXIS { X_AXIS, Y_AXIS, Z_AXIS }; 00049 00050 00054 void splitGeometry(CollisionDetection_BVHNode* pNode, const std::vector<Triangle> * geometry, 00055 std::vector<Triangle> * geometryL, 00056 std::vector<Triangle> * geometryR); 00057 00061 void calculateNode(CollisionDetection_BVHNode* node,Triangle triangle); 00062 00063 00064 public: 00067 void UpdateBVH(CollisionDetection_BVHNode * node); 00068 00070 CollisionDetection_BVHNode * root; 00071 00074 void SetCurrentMatrix(const MATRIX &matrix) 00075 { 00076 OldMatrix = MATRIX(CurrMatrix); 00077 CurrMatrix = MATRIX(matrix); 00078 } 00079 00081 MATRIX CurrMatrix; 00083 MATRIX OldMatrix; 00084 00088 CollisionDetection_BVH(NODE_ID _targetGeometryNode,const MATRIX& _transfMatrix = NULL){TargetGeometryNode = _targetGeometryNode;root = NULL; CurrMatrix = OldMatrix = MATRIX(_transfMatrix);} 00089 00091 CollisionDetection_BVH(){TargetGeometryNode = NODE_ID_NONE;root = NULL; CurrMatrix = OldMatrix = MATRIX();} 00092 ~CollisionDetection_BVH(void); 00093 00094 00097 void Build(std::vector<Triangle> * items); 00098 00100 void Destroy() { SAFE_DELETE(root); } 00101 00103 NODE_ID TargetGeometryNode; 00104 00105 00106 }; 00107 };
1.5.5