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
 |