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
 | ||
|  | 
 |