forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			529 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			529 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
| Bullet Continuous Collision Detection and Physics Library
 | |
| Copyright (c) 2003-2013 Erwin Coumans  http://bulletphysics.org
 | |
| 
 | |
| 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.
 | |
| */
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * @mainpage Bullet Documentation
 | |
|  *
 | |
|  * @section intro_sec Introduction
 | |
|  * Bullet is a Collision Detection and Rigid Body Dynamics Library. The Library is Open Source and free for commercial use, under the ZLib license ( http://opensource.org/licenses/zlib-license.php ).
 | |
|  *
 | |
|  * The main documentation is Bullet_User_Manual.pdf, included in the source code distribution.
 | |
|  * There is the Physics Forum for feedback and general Collision Detection and Physics discussions.
 | |
|  * Please visit http://www.bulletphysics.org
 | |
|  *
 | |
|  * @section install_sec Installation
 | |
|  *
 | |
|  * @subsection step1 Step 1: Download
 | |
|  * You can download the Bullet Physics Library from the github repository: https://github.com/bulletphysics/bullet3/releases 
 | |
|  *
 | |
|  * @subsection step2 Step 2: Building
 | |
|  * Bullet has multiple build systems, including premake, cmake and autotools. Premake and cmake support all platforms.
 | |
|  * Premake is included in the Bullet/build folder for Windows, Mac OSX and Linux. 
 | |
|  * Under Windows you can click on Bullet/build/vs2010.bat to create Microsoft Visual Studio projects. 
 | |
|  * On Mac OSX and Linux you can open a terminal and generate Makefile, codeblocks or Xcode4 projects:
 | |
|  * cd Bullet/build
 | |
|  * ./premake4_osx gmake or ./premake4_linux gmake or ./premake4_linux64 gmake or (for Mac) ./premake4_osx xcode4
 | |
|  * cd Bullet/build/gmake
 | |
|  * make
 | |
|  * 
 | |
|  * An alternative to premake is cmake. You can download cmake from http://www.cmake.org
 | |
|  * cmake can autogenerate projectfiles for Microsoft Visual Studio, Apple Xcode, KDevelop and Unix Makefiles.
 | |
|  * The easiest is to run the CMake cmake-gui graphical user interface and choose the options and generate projectfiles.
 | |
|  * You can also use cmake in the command-line. Here are some examples for various platforms:
 | |
|  * cmake . -G "Visual Studio 9 2008"
 | |
|  * cmake . -G Xcode
 | |
|  * cmake . -G "Unix Makefiles"
 | |
|  * Although cmake is recommended, you can also use autotools for UNIX: ./autogen.sh ./configure to create a Makefile and then run make.
 | |
|  * 
 | |
|  * @subsection step3 Step 3: Testing demos
 | |
|  * Try to run and experiment with BasicDemo executable as a starting point.
 | |
|  * Bullet can be used in several ways, as Full Rigid Body simulation, as Collision Detector Library or Low Level / Snippets like the GJK Closest Point calculation.
 | |
|  * The Dependencies can be seen in this documentation under Directories
 | |
|  * 
 | |
|  * @subsection step4 Step 4: Integrating in your application, full Rigid Body and Soft Body simulation
 | |
|  * Check out BasicDemo how to create a btDynamicsWorld, btRigidBody and btCollisionShape, Stepping the simulation and synchronizing your graphics object transform.
 | |
|  * Check out SoftDemo how to use soft body dynamics, using btSoftRigidDynamicsWorld.
 | |
|  * @subsection step5 Step 5 : Integrate the Collision Detection Library (without Dynamics and other Extras)
 | |
|  * Bullet Collision Detection can also be used without the Dynamics/Extras.
 | |
|  * Check out btCollisionWorld and btCollisionObject, and the CollisionInterfaceDemo.
 | |
|  * @subsection step6 Step 6 : Use Snippets like the GJK Closest Point calculation.
 | |
|  * Bullet has been designed in a modular way keeping dependencies to a minimum. The ConvexHullDistance demo demonstrates direct use of btGjkPairDetector.
 | |
|  *
 | |
|  * @section copyright Copyright
 | |
|  * For up-to-data information and copyright and contributors list check out the Bullet_User_Manual.pdf
 | |
|  * 
 | |
|  */
 | |
|  
 | |
|  
 | |
| 
 | |
| #ifndef BT_COLLISION_WORLD_H
 | |
| #define BT_COLLISION_WORLD_H
 | |
| 
 | |
| class btCollisionShape;
 | |
| class btConvexShape;
 | |
| class btBroadphaseInterface;
 | |
| class btSerializer;
 | |
| 
 | |
| #include "LinearMath/btVector3.h"
 | |
| #include "LinearMath/btTransform.h"
 | |
| #include "btCollisionObject.h"
 | |
| #include "btCollisionDispatcher.h"
 | |
| #include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h"
 | |
| #include "LinearMath/btAlignedObjectArray.h"
 | |
| 
 | |
| ///CollisionWorld is interface and container for the collision detection
 | |
| class btCollisionWorld
 | |
| {
 | |
| 
 | |
| 	
 | |
| protected:
 | |
| 
 | |
| 	btAlignedObjectArray<btCollisionObject*>	m_collisionObjects;
 | |
| 	
 | |
| 	btDispatcher*	m_dispatcher1;
 | |
| 
 | |
| 	btDispatcherInfo	m_dispatchInfo;
 | |
| 
 | |
| 	btBroadphaseInterface*	m_broadphasePairCache;
 | |
| 
 | |
| 	btIDebugDraw*	m_debugDrawer;
 | |
| 
 | |
| 	///m_forceUpdateAllAabbs can be set to false as an optimization to only update active object AABBs
 | |
| 	///it is true by default, because it is error-prone (setting the position of static objects wouldn't update their AABB)
 | |
| 	bool m_forceUpdateAllAabbs;
 | |
| 
 | |
| 	void	serializeCollisionObjects(btSerializer* serializer);
 | |
| 
 | |
| public:
 | |
| 
 | |
| 	//this constructor doesn't own the dispatcher and paircache/broadphase
 | |
| 	btCollisionWorld(btDispatcher* dispatcher,btBroadphaseInterface* broadphasePairCache, btCollisionConfiguration* collisionConfiguration);
 | |
| 
 | |
| 	virtual ~btCollisionWorld();
 | |
| 
 | |
| 	void	setBroadphase(btBroadphaseInterface*	pairCache)
 | |
| 	{
 | |
| 		m_broadphasePairCache = pairCache;
 | |
| 	}
 | |
| 
 | |
| 	const btBroadphaseInterface*	getBroadphase() const
 | |
| 	{
 | |
| 		return m_broadphasePairCache;
 | |
| 	}
 | |
| 
 | |
| 	btBroadphaseInterface*	getBroadphase()
 | |
| 	{
 | |
| 		return m_broadphasePairCache;
 | |
| 	}
 | |
| 
 | |
| 	btOverlappingPairCache*	getPairCache()
 | |
| 	{
 | |
| 		return m_broadphasePairCache->getOverlappingPairCache();
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	btDispatcher*	getDispatcher()
 | |
| 	{
 | |
| 		return m_dispatcher1;
 | |
| 	}
 | |
| 
 | |
| 	const btDispatcher*	getDispatcher() const
 | |
| 	{
 | |
| 		return m_dispatcher1;
 | |
| 	}
 | |
| 
 | |
| 	void	updateSingleAabb(btCollisionObject* colObj);
 | |
| 
 | |
| 	virtual void	updateAabbs();
 | |
| 
 | |
| 	///the computeOverlappingPairs is usually already called by performDiscreteCollisionDetection (or stepSimulation)
 | |
| 	///it can be useful to use if you perform ray tests without collision detection/simulation
 | |
| 	virtual void	computeOverlappingPairs();
 | |
| 
 | |
| 	
 | |
| 	virtual void	setDebugDrawer(btIDebugDraw*	debugDrawer)
 | |
| 	{
 | |
| 			m_debugDrawer = debugDrawer;
 | |
| 	}
 | |
| 
 | |
| 	virtual btIDebugDraw*	getDebugDrawer()
 | |
| 	{
 | |
| 		return m_debugDrawer;
 | |
| 	}
 | |
| 
 | |
| 	virtual void	debugDrawWorld();
 | |
| 
 | |
| 	virtual void debugDrawObject(const btTransform& worldTransform, const btCollisionShape* shape, const btVector3& color);
 | |
| 
 | |
| 
 | |
| 	///LocalShapeInfo gives extra information for complex shapes
 | |
| 	///Currently, only btTriangleMeshShape is available, so it just contains triangleIndex and subpart
 | |
| 	struct	LocalShapeInfo
 | |
| 	{
 | |
| 		int	m_shapePart;
 | |
| 		int	m_triangleIndex;
 | |
| 		
 | |
| 		//const btCollisionShape*	m_shapeTemp;
 | |
| 		//const btTransform*	m_shapeLocalTransform;
 | |
| 	};
 | |
| 
 | |
| 	struct	LocalRayResult
 | |
| 	{
 | |
| 		LocalRayResult(const btCollisionObject*	collisionObject, 
 | |
| 			LocalShapeInfo*	localShapeInfo,
 | |
| 			const btVector3&		hitNormalLocal,
 | |
| 			btScalar hitFraction)
 | |
| 		:m_collisionObject(collisionObject),
 | |
| 		m_localShapeInfo(localShapeInfo),
 | |
| 		m_hitNormalLocal(hitNormalLocal),
 | |
| 		m_hitFraction(hitFraction)
 | |
| 		{
 | |
| 		}
 | |
| 
 | |
| 		const btCollisionObject*		m_collisionObject;
 | |
| 		LocalShapeInfo*			m_localShapeInfo;
 | |
| 		btVector3				m_hitNormalLocal;
 | |
| 		btScalar				m_hitFraction;
 | |
| 
 | |
| 	};
 | |
| 
 | |
| 	///RayResultCallback is used to report new raycast results
 | |
| 	struct	RayResultCallback
 | |
| 	{
 | |
| 		btScalar	m_closestHitFraction;
 | |
| 		const btCollisionObject*		m_collisionObject;
 | |
| 		int	m_collisionFilterGroup;
 | |
| 		int	m_collisionFilterMask;
 | |
| 		//@BP Mod - Custom flags, currently used to enable backface culling on tri-meshes, see btRaycastCallback.h. Apply any of the EFlags defined there on m_flags here to invoke.
 | |
| 		unsigned int m_flags;
 | |
| 
 | |
| 		virtual ~RayResultCallback()
 | |
| 		{
 | |
| 		}
 | |
| 		bool	hasHit() const
 | |
| 		{
 | |
| 			return (m_collisionObject != 0);
 | |
| 		}
 | |
| 
 | |
| 		RayResultCallback()
 | |
| 			:m_closestHitFraction(btScalar(1.)),
 | |
| 			m_collisionObject(0),
 | |
| 			m_collisionFilterGroup(btBroadphaseProxy::DefaultFilter),
 | |
| 			m_collisionFilterMask(btBroadphaseProxy::AllFilter),
 | |
| 			//@BP Mod
 | |
| 			m_flags(0)
 | |
| 		{
 | |
| 		}
 | |
| 
 | |
| 		virtual bool needsCollision(btBroadphaseProxy* proxy0) const
 | |
| 		{
 | |
| 			bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0;
 | |
| 			collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask);
 | |
| 			return collides;
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		virtual	btScalar	addSingleResult(LocalRayResult& rayResult,bool normalInWorldSpace) = 0;
 | |
| 	};
 | |
| 
 | |
| 	struct	ClosestRayResultCallback : public RayResultCallback
 | |
| 	{
 | |
| 		ClosestRayResultCallback(const btVector3&	rayFromWorld,const btVector3&	rayToWorld)
 | |
| 		:m_rayFromWorld(rayFromWorld),
 | |
| 		m_rayToWorld(rayToWorld)
 | |
| 		{
 | |
| 		}
 | |
| 
 | |
| 		btVector3	m_rayFromWorld;//used to calculate hitPointWorld from hitFraction
 | |
| 		btVector3	m_rayToWorld;
 | |
| 
 | |
| 		btVector3	m_hitNormalWorld;
 | |
| 		btVector3	m_hitPointWorld;
 | |
| 			
 | |
| 		virtual	btScalar	addSingleResult(LocalRayResult& rayResult,bool normalInWorldSpace)
 | |
| 		{
 | |
| 			//caller already does the filter on the m_closestHitFraction
 | |
| 			btAssert(rayResult.m_hitFraction <= m_closestHitFraction);
 | |
| 			
 | |
| 			m_closestHitFraction = rayResult.m_hitFraction;
 | |
| 			m_collisionObject = rayResult.m_collisionObject;
 | |
| 			if (normalInWorldSpace)
 | |
| 			{
 | |
| 				m_hitNormalWorld = rayResult.m_hitNormalLocal;
 | |
| 			} else
 | |
| 			{
 | |
| 				///need to transform normal into worldspace
 | |
| 				m_hitNormalWorld = m_collisionObject->getWorldTransform().getBasis()*rayResult.m_hitNormalLocal;
 | |
| 			}
 | |
| 			m_hitPointWorld.setInterpolate3(m_rayFromWorld,m_rayToWorld,rayResult.m_hitFraction);
 | |
| 			return rayResult.m_hitFraction;
 | |
| 		}
 | |
| 	};
 | |
| 
 | |
| 	struct	AllHitsRayResultCallback : public RayResultCallback
 | |
| 	{
 | |
| 		AllHitsRayResultCallback(const btVector3&	rayFromWorld,const btVector3&	rayToWorld)
 | |
| 		:m_rayFromWorld(rayFromWorld),
 | |
| 		m_rayToWorld(rayToWorld)
 | |
| 		{
 | |
| 		}
 | |
| 
 | |
| 		btAlignedObjectArray<const btCollisionObject*>		m_collisionObjects;
 | |
| 
 | |
| 		btVector3	m_rayFromWorld;//used to calculate hitPointWorld from hitFraction
 | |
| 		btVector3	m_rayToWorld;
 | |
| 
 | |
| 		btAlignedObjectArray<btVector3>	m_hitNormalWorld;
 | |
| 		btAlignedObjectArray<btVector3>	m_hitPointWorld;
 | |
| 		btAlignedObjectArray<btScalar> m_hitFractions;
 | |
| 			
 | |
| 		virtual	btScalar	addSingleResult(LocalRayResult& rayResult,bool normalInWorldSpace)
 | |
| 		{
 | |
| 			m_collisionObject = rayResult.m_collisionObject;
 | |
| 			m_collisionObjects.push_back(rayResult.m_collisionObject);
 | |
| 			btVector3 hitNormalWorld;
 | |
| 			if (normalInWorldSpace)
 | |
| 			{
 | |
| 				hitNormalWorld = rayResult.m_hitNormalLocal;
 | |
| 			} else
 | |
| 			{
 | |
| 				///need to transform normal into worldspace
 | |
| 				hitNormalWorld = m_collisionObject->getWorldTransform().getBasis()*rayResult.m_hitNormalLocal;
 | |
| 			}
 | |
| 			m_hitNormalWorld.push_back(hitNormalWorld);
 | |
| 			btVector3 hitPointWorld;
 | |
| 			hitPointWorld.setInterpolate3(m_rayFromWorld,m_rayToWorld,rayResult.m_hitFraction);
 | |
| 			m_hitPointWorld.push_back(hitPointWorld);
 | |
| 			m_hitFractions.push_back(rayResult.m_hitFraction);
 | |
| 			return m_closestHitFraction;
 | |
| 		}
 | |
| 	};
 | |
| 
 | |
| 
 | |
| 	struct LocalConvexResult
 | |
| 	{
 | |
| 		LocalConvexResult(const btCollisionObject*	hitCollisionObject, 
 | |
| 			LocalShapeInfo*	localShapeInfo,
 | |
| 			const btVector3&		hitNormalLocal,
 | |
| 			const btVector3&		hitPointLocal,
 | |
| 			btScalar hitFraction
 | |
| 			)
 | |
| 		:m_hitCollisionObject(hitCollisionObject),
 | |
| 		m_localShapeInfo(localShapeInfo),
 | |
| 		m_hitNormalLocal(hitNormalLocal),
 | |
| 		m_hitPointLocal(hitPointLocal),
 | |
| 		m_hitFraction(hitFraction)
 | |
| 		{
 | |
| 		}
 | |
| 
 | |
| 		const btCollisionObject*		m_hitCollisionObject;
 | |
| 		LocalShapeInfo*			m_localShapeInfo;
 | |
| 		btVector3				m_hitNormalLocal;
 | |
| 		btVector3				m_hitPointLocal;
 | |
| 		btScalar				m_hitFraction;
 | |
| 	};
 | |
| 
 | |
| 	///RayResultCallback is used to report new raycast results
 | |
| 	struct	ConvexResultCallback
 | |
| 	{
 | |
| 		btScalar	m_closestHitFraction;
 | |
| 		int	m_collisionFilterGroup;
 | |
| 		int	m_collisionFilterMask;
 | |
| 		
 | |
| 		ConvexResultCallback()
 | |
| 			:m_closestHitFraction(btScalar(1.)),
 | |
| 			m_collisionFilterGroup(btBroadphaseProxy::DefaultFilter),
 | |
| 			m_collisionFilterMask(btBroadphaseProxy::AllFilter)
 | |
| 		{
 | |
| 		}
 | |
| 
 | |
| 		virtual ~ConvexResultCallback()
 | |
| 		{
 | |
| 		}
 | |
| 		
 | |
| 		bool	hasHit() const
 | |
| 		{
 | |
| 			return (m_closestHitFraction < btScalar(1.));
 | |
| 		}
 | |
| 
 | |
| 		
 | |
| 
 | |
| 		virtual bool needsCollision(btBroadphaseProxy* proxy0) const
 | |
| 		{
 | |
| 			bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0;
 | |
| 			collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask);
 | |
| 			return collides;
 | |
| 		}
 | |
| 
 | |
| 		virtual	btScalar	addSingleResult(LocalConvexResult& convexResult,bool normalInWorldSpace) = 0;
 | |
| 	};
 | |
| 
 | |
| 	struct	ClosestConvexResultCallback : public ConvexResultCallback
 | |
| 	{
 | |
| 		ClosestConvexResultCallback(const btVector3&	convexFromWorld,const btVector3&	convexToWorld)
 | |
| 		:m_convexFromWorld(convexFromWorld),
 | |
| 		m_convexToWorld(convexToWorld),
 | |
| 		m_hitCollisionObject(0)
 | |
| 		{
 | |
| 		}
 | |
| 
 | |
| 		btVector3	m_convexFromWorld;//used to calculate hitPointWorld from hitFraction
 | |
| 		btVector3	m_convexToWorld;
 | |
| 
 | |
| 		btVector3	m_hitNormalWorld;
 | |
| 		btVector3	m_hitPointWorld;
 | |
| 		const btCollisionObject*	m_hitCollisionObject;
 | |
| 		
 | |
| 		virtual	btScalar	addSingleResult(LocalConvexResult& convexResult,bool normalInWorldSpace)
 | |
| 		{
 | |
| //caller already does the filter on the m_closestHitFraction
 | |
| 			btAssert(convexResult.m_hitFraction <= m_closestHitFraction);
 | |
| 						
 | |
| 			m_closestHitFraction = convexResult.m_hitFraction;
 | |
| 			m_hitCollisionObject = convexResult.m_hitCollisionObject;
 | |
| 			if (normalInWorldSpace)
 | |
| 			{
 | |
| 				m_hitNormalWorld = convexResult.m_hitNormalLocal;
 | |
| 			} else
 | |
| 			{
 | |
| 				///need to transform normal into worldspace
 | |
| 				m_hitNormalWorld = m_hitCollisionObject->getWorldTransform().getBasis()*convexResult.m_hitNormalLocal;
 | |
| 			}
 | |
| 			m_hitPointWorld = convexResult.m_hitPointLocal;
 | |
| 			return convexResult.m_hitFraction;
 | |
| 		}
 | |
| 	};
 | |
| 
 | |
| 	///ContactResultCallback is used to report contact points
 | |
| 	struct	ContactResultCallback
 | |
| 	{
 | |
| 		int	m_collisionFilterGroup;
 | |
| 		int	m_collisionFilterMask;
 | |
| 		btScalar	m_closestDistanceThreshold;
 | |
| 
 | |
| 		ContactResultCallback()
 | |
| 			:m_collisionFilterGroup(btBroadphaseProxy::DefaultFilter),
 | |
| 			m_collisionFilterMask(btBroadphaseProxy::AllFilter),
 | |
| 			m_closestDistanceThreshold(0)
 | |
| 		{
 | |
| 		}
 | |
| 
 | |
| 		virtual ~ContactResultCallback()
 | |
| 		{
 | |
| 		}
 | |
| 		
 | |
| 		virtual bool needsCollision(btBroadphaseProxy* proxy0) const
 | |
| 		{
 | |
| 			bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0;
 | |
| 			collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask);
 | |
| 			return collides;
 | |
| 		}
 | |
| 
 | |
| 		virtual	btScalar	addSingleResult(btManifoldPoint& cp,	const btCollisionObjectWrapper* colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId1,int index1) = 0;
 | |
| 	};
 | |
| 
 | |
| 
 | |
| 
 | |
| 	int	getNumCollisionObjects() const
 | |
| 	{
 | |
| 		return int(m_collisionObjects.size());
 | |
| 	}
 | |
| 
 | |
| 	/// rayTest performs a raycast on all objects in the btCollisionWorld, and calls the resultCallback
 | |
| 	/// This allows for several queries: first hit, all hits, any hit, dependent on the value returned by the callback.
 | |
| 	virtual void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback) const; 
 | |
| 
 | |
| 	/// convexTest performs a swept convex cast on all objects in the btCollisionWorld, and calls the resultCallback
 | |
| 	/// This allows for several queries: first hit, all hits, any hit, dependent on the value return by the callback.
 | |
| 	void    convexSweepTest (const btConvexShape* castShape, const btTransform& from, const btTransform& to, ConvexResultCallback& resultCallback,  btScalar allowedCcdPenetration = btScalar(0.)) const;
 | |
| 
 | |
| 	///contactTest performs a discrete collision test between colObj against all objects in the btCollisionWorld, and calls the resultCallback.
 | |
| 	///it reports one or more contact points for every overlapping object (including the one with deepest penetration)
 | |
| 	void	contactTest(btCollisionObject* colObj, ContactResultCallback& resultCallback);
 | |
| 
 | |
| 	///contactTest performs a discrete collision test between two collision objects and calls the resultCallback if overlap if detected.
 | |
| 	///it reports one or more contact points (including the one with deepest penetration)
 | |
| 	void	contactPairTest(btCollisionObject* colObjA, btCollisionObject* colObjB, ContactResultCallback& resultCallback);
 | |
| 
 | |
| 
 | |
| 	/// rayTestSingle performs a raycast call and calls the resultCallback. It is used internally by rayTest.
 | |
| 	/// In a future implementation, we consider moving the ray test as a virtual method in btCollisionShape.
 | |
| 	/// This allows more customization.
 | |
| 	static void	rayTestSingle(const btTransform& rayFromTrans,const btTransform& rayToTrans,
 | |
| 					  btCollisionObject* collisionObject,
 | |
| 					  const btCollisionShape* collisionShape,
 | |
| 					  const btTransform& colObjWorldTransform,
 | |
| 					  RayResultCallback& resultCallback);
 | |
| 
 | |
| 	static void	rayTestSingleInternal(const btTransform& rayFromTrans,const btTransform& rayToTrans,
 | |
| 					  const btCollisionObjectWrapper* collisionObjectWrap,
 | |
| 					  RayResultCallback& resultCallback);
 | |
| 
 | |
| 	/// objectQuerySingle performs a collision detection query and calls the resultCallback. It is used internally by rayTest.
 | |
| 	static void	objectQuerySingle(const btConvexShape* castShape, const btTransform& rayFromTrans,const btTransform& rayToTrans,
 | |
| 					  btCollisionObject* collisionObject,
 | |
| 					  const btCollisionShape* collisionShape,
 | |
| 					  const btTransform& colObjWorldTransform,
 | |
| 					  ConvexResultCallback& resultCallback, btScalar	allowedPenetration);
 | |
| 
 | |
| 	static void	objectQuerySingleInternal(const btConvexShape* castShape,const btTransform& convexFromTrans,const btTransform& convexToTrans,
 | |
| 											const btCollisionObjectWrapper* colObjWrap,
 | |
| 											ConvexResultCallback& resultCallback, btScalar allowedPenetration);
 | |
| 
 | |
| 	virtual void	addCollisionObject(btCollisionObject* collisionObject, int collisionFilterGroup=btBroadphaseProxy::DefaultFilter, int collisionFilterMask=btBroadphaseProxy::AllFilter);
 | |
| 
 | |
| 	btCollisionObjectArray& getCollisionObjectArray()
 | |
| 	{
 | |
| 		return m_collisionObjects;
 | |
| 	}
 | |
| 
 | |
| 	const btCollisionObjectArray& getCollisionObjectArray() const
 | |
| 	{
 | |
| 		return m_collisionObjects;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	virtual void	removeCollisionObject(btCollisionObject* collisionObject);
 | |
| 
 | |
| 	virtual void	performDiscreteCollisionDetection();
 | |
| 
 | |
| 	btDispatcherInfo& getDispatchInfo()
 | |
| 	{
 | |
| 		return m_dispatchInfo;
 | |
| 	}
 | |
| 
 | |
| 	const btDispatcherInfo& getDispatchInfo() const
 | |
| 	{
 | |
| 		return m_dispatchInfo;
 | |
| 	}
 | |
| 	
 | |
| 	bool	getForceUpdateAllAabbs() const
 | |
| 	{
 | |
| 		return m_forceUpdateAllAabbs;
 | |
| 	}
 | |
| 	void setForceUpdateAllAabbs( bool forceUpdateAllAabbs)
 | |
| 	{
 | |
| 		m_forceUpdateAllAabbs = forceUpdateAllAabbs;
 | |
| 	}
 | |
| 
 | |
| 	///Preliminary serialization test for Bullet 2.76. Loading those files requires a separate parser (Bullet/Demos/SerializeDemo)
 | |
| 	virtual	void	serialize(btSerializer* serializer);
 | |
| 
 | |
| };
 | |
| 
 | |
| 
 | |
| #endif //BT_COLLISION_WORLD_H
 |