123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- /*
- Bullet Continuous Collision Detection and Physics Library
- Copyright (c) 2003-2008 Erwin Coumans http://bulletphysics.com
- This software is provided 'as-is', without any express or implied warranty.
- In no event will the authors be held liable for any damages arising from the use of this software.
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it freely,
- subject to the following restrictions:
- 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
- */
- #ifndef BT_GHOST_OBJECT_H
- #define BT_GHOST_OBJECT_H
- #include "btCollisionObject.h"
- #include "bullet/BulletCollision//BroadphaseCollision/btOverlappingPairCallback.h"
- #include "bullet/LinearMath/btAlignedAllocator.h"
- #include "bullet/BulletCollision//BroadphaseCollision/btOverlappingPairCache.h"
- #include "btCollisionWorld.h"
- class btConvexShape;
- class btDispatcher;
- ///The btGhostObject can keep track of all objects that are overlapping
- ///By default, this overlap is based on the AABB
- ///This is useful for creating a character controller, collision sensors/triggers, explosions etc.
- ///We plan on adding rayTest and other queries for the btGhostObject
- ATTRIBUTE_ALIGNED16(class) btGhostObject : public btCollisionObject
- {
- protected:
- btAlignedObjectArray<btCollisionObject*> m_overlappingObjects;
- public:
- btGhostObject();
- virtual ~btGhostObject();
- void convexSweepTest(const class btConvexShape* castShape, const btTransform& convexFromWorld, const btTransform& convexToWorld, btCollisionWorld::ConvexResultCallback& resultCallback, btScalar allowedCcdPenetration = 0.f) const;
- void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, btCollisionWorld::RayResultCallback& resultCallback) const;
- ///this method is mainly for expert/internal use only.
- virtual void addOverlappingObjectInternal(btBroadphaseProxy* otherProxy, btBroadphaseProxy* thisProxy=0);
- ///this method is mainly for expert/internal use only.
- virtual void removeOverlappingObjectInternal(btBroadphaseProxy* otherProxy,btDispatcher* dispatcher,btBroadphaseProxy* thisProxy=0);
- int getNumOverlappingObjects() const
- {
- return m_overlappingObjects.size();
- }
- btCollisionObject* getOverlappingObject(int index)
- {
- return m_overlappingObjects[index];
- }
- const btCollisionObject* getOverlappingObject(int index) const
- {
- return m_overlappingObjects[index];
- }
- btAlignedObjectArray<btCollisionObject*>& getOverlappingPairs()
- {
- return m_overlappingObjects;
- }
- const btAlignedObjectArray<btCollisionObject*> getOverlappingPairs() const
- {
- return m_overlappingObjects;
- }
- //
- // internal cast
- //
- static const btGhostObject* upcast(const btCollisionObject* colObj)
- {
- if (colObj->getInternalType()==CO_GHOST_OBJECT)
- return (const btGhostObject*)colObj;
- return 0;
- }
- static btGhostObject* upcast(btCollisionObject* colObj)
- {
- if (colObj->getInternalType()==CO_GHOST_OBJECT)
- return (btGhostObject*)colObj;
- return 0;
- }
- };
- class btPairCachingGhostObject : public btGhostObject
- {
- btHashedOverlappingPairCache* m_hashPairCache;
- public:
- btPairCachingGhostObject();
- virtual ~btPairCachingGhostObject();
- ///this method is mainly for expert/internal use only.
- virtual void addOverlappingObjectInternal(btBroadphaseProxy* otherProxy, btBroadphaseProxy* thisProxy=0);
- virtual void removeOverlappingObjectInternal(btBroadphaseProxy* otherProxy,btDispatcher* dispatcher,btBroadphaseProxy* thisProxy=0);
- btHashedOverlappingPairCache* getOverlappingPairCache()
- {
- return m_hashPairCache;
- }
- };
- ///The btGhostPairCallback interfaces and forwards adding and removal of overlapping pairs from the btBroadphaseInterface to btGhostObject.
- class btGhostPairCallback : public btOverlappingPairCallback
- {
-
- public:
- btGhostPairCallback()
- {
- }
- virtual ~btGhostPairCallback()
- {
-
- }
- virtual btBroadphasePair* addOverlappingPair(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1)
- {
- btCollisionObject* colObj0 = (btCollisionObject*) proxy0->m_clientObject;
- btCollisionObject* colObj1 = (btCollisionObject*) proxy1->m_clientObject;
- btGhostObject* ghost0 = btGhostObject::upcast(colObj0);
- btGhostObject* ghost1 = btGhostObject::upcast(colObj1);
- if (ghost0)
- ghost0->addOverlappingObjectInternal(proxy1, proxy0);
- if (ghost1)
- ghost1->addOverlappingObjectInternal(proxy0, proxy1);
- return 0;
- }
- virtual void* removeOverlappingPair(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1,btDispatcher* dispatcher)
- {
- btCollisionObject* colObj0 = (btCollisionObject*) proxy0->m_clientObject;
- btCollisionObject* colObj1 = (btCollisionObject*) proxy1->m_clientObject;
- btGhostObject* ghost0 = btGhostObject::upcast(colObj0);
- btGhostObject* ghost1 = btGhostObject::upcast(colObj1);
- if (ghost0)
- ghost0->removeOverlappingObjectInternal(proxy1,dispatcher,proxy0);
- if (ghost1)
- ghost1->removeOverlappingObjectInternal(proxy0,dispatcher,proxy1);
- return 0;
- }
- virtual void removeOverlappingPairsContainingProxy(btBroadphaseProxy* /*proxy0*/,btDispatcher* /*dispatcher*/)
- {
- btAssert(0);
- //need to keep track of all ghost objects and call them here
- //m_hashPairCache->removeOverlappingPairsContainingProxy(proxy0,dispatcher);
- }
-
- };
- #endif
|