00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef TA_PHYSICSCOLLISIONGROUPMGR_H
00013 #define TA_PHYSICSCOLLISIONGROUPMGR_H
00014
00015 #ifndef TA_POOL_H
00016 #include "../Common/Pool.h"
00017 #endif // TA_POOL_H
00018
00019 #ifndef TA_PHYSICS_H
00020 #include "Physics.h"
00021 #endif // TA_PHYSICS_H
00022
00023 #ifndef TA_DYNAMICOBJECT_H
00024 #include "DynamicObject.h"
00025 #endif // TA_DYNAMICOBJECT_H
00026
00027 namespace TA
00028 {
00029
00030 class StaticObject;
00031 struct Globals;
00032
00033
00034
00035 class CollisionGroup
00036 {
00037 public:
00038 typedef Pool<DynamicObjectPair>::ActiveList::Iterator PairIterator;
00039 typedef Pool<DynamicObject*>::ActiveList::Iterator ObjectPtrIterator;
00040 class Iterator
00041 {
00042 public:
00043 Iterator() {}
00044 void operator ++()
00045 {
00046 ++m_itCollision;
00047 if (m_itCollision.AtEnd())
00048 {
00049 ++m_itPair;
00050 if (!m_itPair.AtEnd())
00051 m_itCollision = (*m_itPair).collisionList.GetIterator();
00052 }
00053 }
00054 bool AtEnd()
00055 {
00056 return (m_itPair.AtEnd() && m_itCollision.AtEnd());
00057 }
00058 Collision& operator *() { return *m_itCollision; }
00059 Iterator& operator = (const Iterator& that) { m_itCollision = that.m_itCollision; m_itPair = that.m_itPair; return *this; }
00060 bool operator == (const Iterator& that) const { return m_itPair == that.m_itPair && m_itCollision == that.m_itCollision; }
00061 void Finalise()
00062 {
00063 m_itCollision.Finalise();
00064 m_itPair.Finalise();
00065 }
00066
00067 private:
00068 friend class CollisionGroup;
00069 typedef Pool<DynamicObjectPair>::ActiveList::Iterator PairIterator;
00070 typedef Pool<Collision>::ActiveList::Iterator CollisionIterator;
00071
00072 CollisionIterator m_itCollision;
00073 Pool<DynamicObjectPair>::ActiveList::Iterator m_itPair;
00074 Iterator(Pool<DynamicObjectPair>::ActiveList m_pairList)
00075 {
00076 m_itPair = m_pairList.GetIterator();
00077 if (!m_itPair.AtEnd())
00078 m_itCollision = (*m_itPair).collisionList.GetIterator();
00079 }
00080 };
00081
00082 CollisionGroup();
00083 ~CollisionGroup();
00084
00085 Iterator GetIterator() { return Iterator(m_pairList); }
00086 PairIterator GetPairIterator() { return m_pairList.GetIterator(); }
00087
00088 ObjectPtrIterator GetObjectPtrIterator() { return m_objectPtrList.GetIterator(); }
00089 int GetNumCollisions() const { return m_nNumCollisions; }
00090 int GetNumObjects() const { return m_nNumObjects; }
00091
00092 void SetFastSolver(bool bFastSolver) { m_bFastSolver = bFastSolver; }
00093 bool IsFastSolver() { return m_bFastSolver; }
00094
00095 void SortCollisions(bool bReduceCollisions, int nPass);
00096 void DoCollisionReduction();
00097 bool ShouldWeUseHackedFastPhysicsResponse();
00098
00099 bool ContainsPair(const DynamicObjectPair* pPair);
00100
00101
00102 #ifdef _DEBUG
00103 void TestNumCollisions();
00104 #else
00105 void TestNumCollisions() {}
00106 #endif // _DEBUG
00107
00108 private:
00109 friend class CollisionGroupMgr;
00110
00111 Globals* m_pGlobals;
00112 Pool<Collision>::ActiveList m_collisionList;
00113 Pool<DynamicObjectPair>::ActiveList m_pairList;
00114 Pool<DynamicObject*>::ActiveList m_objectPtrList;
00115 int m_nNumCollisions;
00116 int m_nNumObjects;
00117 Iterator m_addBefore;
00118 CollisionGroupMgr* m_pCollisionGroupMgr;
00119 bool m_bFastSolver;
00120
00121 void Initialise(Globals* pGlobals, CollisionGroupMgr* pCollisionGroupMgr);
00122 void Finalise();
00123
00124 void AddPair(DynamicObjectPair& pair);
00125 };
00126
00127
00128
00129 class CollisionGroupMgr
00130 {
00131 public:
00132 typedef Pool<CollisionGroup>::ActiveList::Iterator Iterator;
00133 typedef Pool<Collision>::ActiveList::Iterator GhostCollisionIterator;
00134 typedef Pool<DynamicObjectPair>::ActiveListHeadAndTail::Iterator PairIterator;
00135
00136 CollisionGroupMgr();
00137 ~CollisionGroupMgr();
00138
00139 void Initialise(Globals* pGlobals, int nMaxNumCollisionsPerGroup);
00140 void Finalise();
00141
00142 Collision* AddCollision(DynamicObjectPair& pair, const Collision& collision);
00143 void Attach(Collision& attachTo, const Collision& collision);
00144 void AddGhostCollision(DynamicObjectPair& pair, Collision& collision);
00145 void GroupCollisions();
00146
00147 void ReusePairCollisions(DynamicObjectPair& pair);
00148
00149 Iterator GetIterator() { return m_groupList.GetIterator(); }
00150
00151
00152
00153 void Clear(bool bKeepUnchangedCollisions = false);
00154
00155 void FreeAllCollisionsForPair(DynamicObjectPair& pair);
00156 void FreePair(DynamicObjectPair& pair);
00157 DynamicObjectPair* GetCurrentPair() { return m_pCurrentPair; }
00158 DynamicObjectPair* AllocatePair();
00159 void AddPair(DynamicObjectPair* pPair);
00160 DynamicObjectPair* PopNewPairToProcess();
00161 DynamicObjectPair* PeekNewPairToProcess();
00162
00163
00164 private:
00165 friend class CollisionGroup;
00166
00167 Globals* m_pGlobals;
00168 Pool<Collision> m_collisionPool;
00169
00170 Pool<DynamicObject*> m_objectPtrPool;
00171 Pool<CollisionGroup> m_groupPool;
00172 Pool<CollisionGroup>::ActiveList m_groupList;
00173 Pool<DynamicObjectPair> m_dynamicObjectPairPool;
00174 Pool<DynamicObjectPair>::ActiveListHeadAndTail m_pairList;
00175 Pool<DynamicObjectPair>::ActiveListHeadAndTail m_newPairList;
00176 DynamicObjectPair* m_pCurrentPair;
00177 int m_nMaxNumCollisionsPerGroup;
00178
00179
00180 CollisionGroup* MergeCollisionGroups(CollisionGroup* pGroupA, CollisionGroup* pGroupB);
00181 CollisionGroup* CreateCollisionGroup(DynamicObject* pDynamicObjectA, DynamicObject* pDynamicObjectB);
00182 void AddObjectToGroup(DynamicObject* pDynamicObjectA, CollisionGroup* pGroup);
00183 void FreeGroupsCollisions(CollisionGroup& group);
00184 void FreeCollision(Collision* pCollision);
00185 };
00186
00187 }
00188
00189 #endif // TA_PHYSICSCOLLISIONGROUPMGR_H
© Copyright 2004-2006 TRUE AXIS PTY LTD Australia. All rights reserved.