00001 #ifndef CDCOLLISIONENGINE_H
00002 #define CDCOLLISIONENGINE_H
00003
00004 #pragma once
00005 #include <SceneGraph/SGBehaviorEngine.h>
00006 #include <Collision/CDFramePair.h>
00007 #include <Collision/CDDetectorImp.h>
00008 #include <WinBasis/WBPreciseTimer.h>
00009
00010 namespace Spr{;
00011
00012
00013
00014 class CDCollisionListener{
00015 public:
00016
00017 virtual void BeforeAll(SGScene* scene){}
00018
00019
00020 virtual void Before(SGScene* scene, CDFramePairWithRecord* fr){}
00021
00022 virtual void Analyzed(SGScene* scene, CDFramePairWithRecord* fr, CDGeometryPair* geom, CDConvexPairWithRecord* conv, CDContactAnalysis* analyzer){}
00023
00024 virtual void After(SGScene* scene, CDFramePairWithRecord* fr){}
00025
00026
00027 virtual void AfterAll(SGScene* scene){}
00028 };
00029
00030 class CDCollisionListeners:public std::vector<CDCollisionListener*>{
00031 public:
00032
00033 void BeforeAll(SGScene* scene){
00034 for(unsigned i=0; i<size(); ++i){
00035 at(i)->BeforeAll(scene);
00036 }
00037 }
00038
00039 void Before(SGScene* scene, CDFramePairWithRecord* fr){
00040 for(unsigned i=0; i<size(); ++i){
00041 if (fr->IsActive(i)) begin()[i]->Before(scene, fr);
00042 }
00043 }
00044
00045 void Analyzed(SGScene* scene, CDFramePairWithRecord* fr, CDGeometryPair* geom, CDConvexPairWithRecord* conv, CDContactAnalysis* analyzer){
00046 for(unsigned i=0; i<size(); ++i){
00047 if (fr->IsActive(i)) begin()[i]->Analyzed(scene, fr, geom, conv, analyzer);
00048 }
00049 }
00050
00051 void After(SGScene* scene, CDFramePairWithRecord* fr){
00052 for(unsigned i=0; i<size(); ++i){
00053 if (fr->IsActive(i)) begin()[i]->After(scene, fr);
00054 }
00055 }
00056 void AfterAll(SGScene* scene){
00057 for(unsigned i=0; i<size(); ++i){
00058 at(i)->AfterAll(scene);
00059 }
00060 }
00061 };
00062
00063
00064
00065 class CDCollisionEngine: public SGBehaviorEngine
00066 {
00067 protected:
00068
00069 struct ActivePair{
00070 int pos;
00071 int frame[2];
00072 };
00073 typedef std::vector<ActivePair> TActivePairs;
00074 TActivePairs activeList;
00075 TActivePairs inactiveList;
00076 std::vector<bool> defaults;
00077
00078
00079 CDFramePairWithRecords pairs;
00080
00081 CDContactAnalysis analyzer;
00082
00083 int nFrameRecords;
00084
00085 int nFramePairRecords;
00086
00087 int nConvexPairRecords;
00088
00089 typedef std::vector< UTRef<CDFrame> > Frames;
00090
00091 Frames frames;
00092
00093 CDCollisionListeners listeners;
00094
00095
00096 void Render(GRRender* render, SGScene* scene);
00097
00098 std::map<SGFrame*, int> frameMap;
00099
00100 public:
00101
00102 typedef CDFramePairWithRecords::iterator TFrameIt;
00103
00104 struct GetGeom{
00105 CDGeometryPairs* operator()(TFrameIt it){ return *it ? &(*it)->geometryPairs : NULL; }
00106 };
00107
00108 class TGeometryIt: public UTComposedIterator<CDGeometryPair*, TFrameIt, CDGeometryPairs::iterator, GetGeom>{
00109 friend class CDCollisionEngine;
00110 friend class TConvexIt;
00111 public:
00112 TGeometryIt(){}
00113 TGeometryIt(CDFramePairWithRecords::iterator b, CDFramePairWithRecords::iterator e, CDGeometryPairs::iterator g){
00114 Init(b, e, g);
00115 }
00116 };
00117
00118
00119 struct GetConv{
00120 CDConvexPairs* operator()(TGeometryIt it){ return &it->convexPairs; }
00121 };
00122
00123 class TConvexIt: public UTComposedIterator<CDConvexPairWithRecord*, TGeometryIt, CDConvexPairs::iterator, GetConv>{
00124 friend class CDCollisionEngine;
00125 TConvexIt(){}
00126 TConvexIt(TGeometryIt b, TGeometryIt e, CDConvexPairs::iterator c){
00127 Init(b, e, c);
00128 }
00129 };
00130
00131 public:
00132 WBPreciseTimer timerGjk, timerQhull, timerNormal;
00133
00134 SGOBJECTDEF(CDCollisionEngine);
00135
00136 CDCollisionEngine();
00137
00138
00139
00140
00141 int GetPriority() const { return SGBP_COLLISIONENGINE; }
00142
00143 virtual void Step(SGScene* s);
00144
00145 virtual void Clear(SGScene* s);
00146
00147 void Init();
00148
00149
00150
00151
00152
00153 CDCollisionListener* GetListener(int pos){ return listeners[pos]; }
00154
00155 size_t NListener(){ return listeners.size(); }
00156
00157
00158 int GetFrameID(SGFrame* fr){ return frameMap[fr]; }
00159
00160 CDFramePairWithRecord* GetFramePair(int f1, int f2){
00161 return pairs.item(f1, f2);
00162 }
00163
00164 CDFramePairWithRecord* GetFramePair(SGFrame* f1, SGFrame*f2){ return GetFramePair(GetFrameID(f1), GetFrameID(f2)); }
00165
00166 SGFrame* GetFrame(int id){ return frames[id]->frame; }
00167
00168 CDUserRecord* GetFrameRecord(int id, int pos){ return frames[id]->records[pos]; }
00169 #if defined _MSC_VER && _MSC_VER >= 1300
00170
00171 TFrameIt FramePairBegin() const { return (TFrameIt&)pairs.begin(); }
00172
00173 TFrameIt FramePairEnd() const { return (TFrameIt&)pairs.end(); }
00174 #else
00175
00176 TFrameIt FramePairBegin() const { return (TFrameIt)pairs.begin(); }
00177
00178 TFrameIt FramePairEnd() const { return (TFrameIt)pairs.end(); }
00179 #endif
00180
00181 TGeometryIt GeometryPairBegin() const{
00182 TGeometryIt rv;
00183 rv.InitAsBegin(FramePairBegin(), FramePairEnd());
00184 return rv;
00185 }
00186
00187 TGeometryIt GeometryPairEnd() const{
00188 TGeometryIt rv;
00189 rv.InitAsEnd(FramePairBegin(), FramePairEnd());
00190 return rv;
00191 }
00192
00193 TConvexIt ConvexPairBegin() const {
00194 TConvexIt rv;
00195 rv.InitAsBegin(GeometryPairBegin(), GeometryPairEnd());
00196 return rv;
00197 }
00198
00199 TConvexIt ConvexPairEnd() const{
00200 TConvexIt rv;
00201 rv.InitAsEnd(GeometryPairBegin(), GeometryPairEnd());
00202 return rv;
00203 }
00204
00205
00206
00207
00208
00209 void AddFrame(SGFrame* frame, CDUserRecord* rec=NULL, int pos=-1);
00210
00211 size_t NFrame(){ return frames.size(); }
00212
00213 int AddListener(CDCollisionListener* l);
00214
00215 bool AddInactive(int f1, int f2, int pos);
00216
00217 bool AddInactive(SGFrame* f1, SGFrame* f2, int pos){ return AddInactive(GetFrameID(f1), GetFrameID(f2), pos); }
00218
00219 int ClearInactive(int pos);
00220
00221 bool AddActive(int f1, int f2, int pos);
00222
00223 bool AddActive(SGFrame* f1, SGFrame* f2, int pos){ return AddActive(GetFrameID(f1), GetFrameID(f2), pos); }
00224
00225 int ClearActive(int pos);
00226
00227 int ReserveFrameRecord();
00228
00229 int ReserveFramePairRecord();
00230
00231 int ReserveConvexPairRecord();
00232
00233
00234 void RayCheck(Vec3f from, Vec3f dir);
00235
00236
00237 virtual void LoadState(const SGBehaviorStates& states);
00238
00239 virtual void SaveState(SGBehaviorStates& states) const;
00240 };
00241
00242 }
00243
00244 #endif
00245