00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00015
00016 #ifndef _collision_detection_H__
00017 #define _collision_detection_H__
00018
00019 #include "../../core/src/scenemodule.h"
00020 #include "../../core/src/geometrytriangles.h"
00021 #include "collision_detectors.h"
00022 #include "CollisionDetection_BVH.h"
00023
00024
00025
00026
00027
00028 #include <vector>
00029 #include <wx/list.h>
00030 #include <map>
00031
00032
00033
00034
00035
00036 using namespace CollisionDetectionNamespace;
00037
00038 namespace VRUT
00039 {
00041 const int MODULE_VERSION = 1;
00042
00043
00045 class Collision_detection: public SceneModule
00046 {
00047 public:
00049 Collision_detection(const MODULE_ID & _id, const wxString & _name, EventHandler * msgSink);
00050
00052 virtual ~Collision_detection();
00053
00055 virtual wxString GetDesc() const
00056 {
00057 return wxT("Module to support collision detection");
00058 }
00059
00060 protected:
00062 bool bModuleEnabled;
00064 Parameter::ParameterIdentificator bEnabledParamID;
00065
00066
00068 std::vector<NODE_ID> targer1IDs;
00070 std::vector<NODE_ID> targer1TabuIDs;
00072 wxString strTarget1;
00074 Parameter::ParameterIdentificator idTargerNodeID1ParamID;
00075
00076
00079 std::vector<NODE_ID> targer2IDs;
00081 std::vector<NODE_ID> targer2TabuIDs;
00083 wxString strTarget2;
00085 Parameter::ParameterIdentificator idTargerNodeID2ParamID;
00086
00087
00089 float fSepareteDistance;
00091 Parameter::ParameterIdentificator fSepareteDistanceParamID;
00092
00094 bool bCalculateCollisionPoint;
00096 Parameter::ParameterIdentificator bCalculateCollisionPointParamID;
00097
00098
00100 bool bWriteEventsToLog;
00102 Parameter::ParameterIdentificator bWriteEventsToLogParamID;
00103
00104
00106 bool bWriteComputeTimeToLog;
00108 Parameter::ParameterIdentificator bWriteComputeTimeToLogParamID;
00109
00110
00111
00113 bool bStopTargetNode1;
00115 Parameter::ParameterIdentificator bStopTargetNode1ParamID;
00116
00117
00119 bool bBVHCreated;
00120
00122 BVH* node1BVH;
00123
00125 BVH* node2BVH;
00126
00128 std::map<NODE_ID,CollisionDetection_BVH*> mapOfBVHs;
00129
00131 typedef std::pair <NODE_ID, CollisionDetection_BVH*> bvh_Pair;
00132
00133
00135 vector3 actualCollisionPlaneNormal;
00136
00138 MATRIX oldTarget1WorldMATRIX;
00139
00141 MATRIX target1WorldMATRIX;
00142
00143
00144
00148 void getGeometryNodesFromSceneNode(const SceneNode* node, std::deque<NODE_ID>* nodeList);
00149
00150
00154 void getGeometryNodesFromBVHNode(const BVHNode* pNode, std::deque<NODE_ID>* nodeList);
00155
00157 void parseTargetStrings(wxString strToParse, std::vector<NODE_ID>* IDs, std::vector<NODE_ID>* tabuIDs);
00158
00160 void createBVHs();
00161
00166 void findCollisionPairsInGeometries(CollisionDetection_BVHNode * pNode1, CollisionDetection_BVHNode * pNode2,std::vector<CollisionDetection_CollisionPair>* CollisionNodes);
00167
00172 bool findIntersection(const BVHNode * pNode1, const BVHNode * pNode2);
00173
00174
00178 void reportCollision(const BVHNode * pNode1, const BVHNode * pNode2);
00179
00180
00185 void testPrimitives(const BVHNode * pNode1, const BVHNode * pNode2, CollisionReport* collisionReport);
00186
00187
00193 int assignCollisionTrianglesToAreas(std::vector<CollisionArea>* CollisionAreas, Triangle tr1, Triangle tr2);
00194
00198 void calculateCollisionPlane(std::vector<CollisionArea> *CollisionAreas, CollisionReport *report);
00199
00203 void calculateCollisionPoint(std::vector<CollisionArea> *CollisionAreas, CollisionReport *report);
00204
00208 void calculateCollisionRadiuses(std::vector<CollisionArea> *CollisionAreas, CollisionReport *report);
00209
00210
00212 virtual void processEvent(wxCommandEvent & evt);
00213
00215 virtual void run();
00216
00217
00221
00222 bool bTansformTargetNode1;
00223 Parameter::ParameterIdentificator bTansformTargetNode1ParamID;
00224
00225
00226 float fTansformAxisX;
00227 Parameter::ParameterIdentificator fTansformAxisXParamID;
00228
00229 float fTansformAxisY;
00230 Parameter::ParameterIdentificator fTansformAxisYParamID;
00231
00232
00233 float fTansformAxisZ;
00234 Parameter::ParameterIdentificator fTansformAxisZParamID;
00235
00236
00237
00238
00242
00243
00244
00245
00246 };
00247 };
00248
00249
00250 EXPORT_VRUT_MODULE_FUNCTIONS( Collision_detection )
00251
00252
00253 #endif