True Axis Physics SDK 1.2.0.1 Beta Documentation
www.trueaxis.com

PhysicsCollisionGroupMgr.h

00001 //---------------------------------------------------------------------------------
00002 // File Name: PhysicsCollisionGroupMgr.h
00003 // Description: Used to separate objects into groups colliding with each other.
00004 //
00005 // Copyright (C) 2004 - 2006 True Axis Pty Ltd, Australia. 
00006 // All Rights Reserved.
00007 //
00008 // History:
00009 //      Created File.
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     //bool AddCollision(Collision& collision);
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); // Makes a copy of the passed in collision
00143     void Attach(Collision& attachTo, const Collision& collision); // Makes a copy of the passed in collision
00144     void AddGhostCollision(DynamicObjectPair& pair, Collision& collision); // Makes a copy of the passed in collision
00145     void GroupCollisions();
00146 
00147     void ReusePairCollisions(DynamicObjectPair& pair);
00148 
00149     Iterator GetIterator() { return m_groupList.GetIterator(); }
00150     //GhostCollisionIterator GetGhostCollisionIterator() { return m_ghostCollisionList.GetIterator(); }
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     //Pool<Collision>::ActiveList m_ghostCollisionList;
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.