176 lines
5.5 KiB
C++
176 lines
5.5 KiB
C++
|
/*
|
||
|
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 "BulletCollision/BroadphaseCollision/btOverlappingPairCallback.h"
|
||
|
#include "LinearMath/btAlignedAllocator.h"
|
||
|
#include "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
|
||
|
|