680 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			680 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
| Bullet Continuous Collision Detection and Physics Library
 | |
| Copyright (c) 2003-2006 Erwin Coumans  http://continuousphysics.com/Bullet/
 | |
| 
 | |
| 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_COLLISION_OBJECT_H
 | |
| #define BT_COLLISION_OBJECT_H
 | |
| 
 | |
| #include "LinearMath/btTransform.h"
 | |
| 
 | |
| //island management, m_activationState1
 | |
| #define ACTIVE_TAG 1
 | |
| #define ISLAND_SLEEPING 2
 | |
| #define WANTS_DEACTIVATION 3
 | |
| #define DISABLE_DEACTIVATION 4
 | |
| #define DISABLE_SIMULATION 5
 | |
| 
 | |
| struct	btBroadphaseProxy;
 | |
| class	btCollisionShape;
 | |
| struct btCollisionShapeData;
 | |
| #include "LinearMath/btMotionState.h"
 | |
| #include "LinearMath/btAlignedAllocator.h"
 | |
| #include "LinearMath/btAlignedObjectArray.h"
 | |
| 
 | |
| typedef btAlignedObjectArray<class btCollisionObject*> btCollisionObjectArray;
 | |
| 
 | |
| #ifdef BT_USE_DOUBLE_PRECISION
 | |
| #define btCollisionObjectData btCollisionObjectDoubleData
 | |
| #define btCollisionObjectDataName "btCollisionObjectDoubleData"
 | |
| #else
 | |
| #define btCollisionObjectData btCollisionObjectFloatData
 | |
| #define btCollisionObjectDataName "btCollisionObjectFloatData"
 | |
| #endif
 | |
| 
 | |
| 
 | |
| /// btCollisionObject can be used to manage collision detection objects. 
 | |
| /// btCollisionObject maintains all information that is needed for a collision detection: Shape, Transform and AABB proxy.
 | |
| /// They can be added to the btCollisionWorld.
 | |
| ATTRIBUTE_ALIGNED16(class)	btCollisionObject
 | |
| {
 | |
| 
 | |
| protected:
 | |
| 
 | |
| 	btTransform	m_worldTransform;
 | |
| 
 | |
| 	///m_interpolationWorldTransform is used for CCD and interpolation
 | |
| 	///it can be either previous or future (predicted) transform
 | |
| 	btTransform	m_interpolationWorldTransform;
 | |
| 	//those two are experimental: just added for bullet time effect, so you can still apply impulses (directly modifying velocities) 
 | |
| 	//without destroying the continuous interpolated motion (which uses this interpolation velocities)
 | |
| 	btVector3	m_interpolationLinearVelocity;
 | |
| 	btVector3	m_interpolationAngularVelocity;
 | |
| 	
 | |
| 	btVector3	m_anisotropicFriction;
 | |
| 	int			m_hasAnisotropicFriction;
 | |
| 	btScalar	m_contactProcessingThreshold;	
 | |
| 
 | |
| 	btBroadphaseProxy*		m_broadphaseHandle;
 | |
| 	btCollisionShape*		m_collisionShape;
 | |
| 	///m_extensionPointer is used by some internal low-level Bullet extensions.
 | |
| 	void*					m_extensionPointer;
 | |
| 	
 | |
| 	///m_rootCollisionShape is temporarily used to store the original collision shape
 | |
| 	///The m_collisionShape might be temporarily replaced by a child collision shape during collision detection purposes
 | |
| 	///If it is NULL, the m_collisionShape is not temporarily replaced.
 | |
| 	btCollisionShape*		m_rootCollisionShape;
 | |
| 
 | |
| 	int				m_collisionFlags;
 | |
| 
 | |
| 	int				m_islandTag1;
 | |
| 	int				m_companionId;
 | |
|     int             m_worldArrayIndex;  // index of object in world's collisionObjects array
 | |
| 
 | |
| 	mutable int				m_activationState1;
 | |
| 	mutable btScalar			m_deactivationTime;
 | |
| 
 | |
| 	btScalar		m_friction;
 | |
| 	btScalar		m_restitution;
 | |
| 	btScalar		m_rollingFriction;//torsional friction orthogonal to contact normal (useful to stop spheres rolling forever)
 | |
|     btScalar        m_spinningFriction; // torsional friction around the contact normal (useful for grasping)
 | |
| 	btScalar		m_contactDamping;
 | |
| 	btScalar		m_contactStiffness;
 | |
| 	
 | |
| 	
 | |
| 
 | |
| 	///m_internalType is reserved to distinguish Bullet's btCollisionObject, btRigidBody, btSoftBody, btGhostObject etc.
 | |
| 	///do not assign your own m_internalType unless you write a new dynamics object class.
 | |
| 	int				m_internalType;
 | |
| 
 | |
| 	///users can point to their objects, m_userPointer is not used by Bullet, see setUserPointer/getUserPointer
 | |
| 
 | |
| 	void*			m_userObjectPointer;
 | |
| 
 | |
| 	int				m_userIndex2;
 | |
| 	
 | |
|     int	m_userIndex;
 | |
| 
 | |
| 	///time of impact calculation
 | |
| 	btScalar		m_hitFraction; 
 | |
| 	
 | |
| 	///Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm::
 | |
| 	btScalar		m_ccdSweptSphereRadius;
 | |
| 
 | |
| 	/// Don't do continuous collision detection if the motion (in one step) is less then m_ccdMotionThreshold
 | |
| 	btScalar		m_ccdMotionThreshold;
 | |
| 	
 | |
| 	/// If some object should have elaborate collision filtering by sub-classes
 | |
| 	int			m_checkCollideWith;
 | |
| 
 | |
| 	btAlignedObjectArray<const btCollisionObject*> m_objectsWithoutCollisionCheck;
 | |
| 
 | |
| 	///internal update revision number. It will be increased when the object changes. This allows some subsystems to perform lazy evaluation.
 | |
| 	int			m_updateRevision;
 | |
| 
 | |
| 	btVector3	m_customDebugColorRGB;
 | |
| 
 | |
| public:
 | |
| 
 | |
| 	BT_DECLARE_ALIGNED_ALLOCATOR();
 | |
| 
 | |
| 	enum CollisionFlags
 | |
| 	{
 | |
| 		CF_STATIC_OBJECT= 1,
 | |
| 		CF_KINEMATIC_OBJECT= 2,
 | |
| 		CF_NO_CONTACT_RESPONSE = 4,
 | |
| 		CF_CUSTOM_MATERIAL_CALLBACK = 8,//this allows per-triangle material (friction/restitution)
 | |
| 		CF_CHARACTER_OBJECT = 16,
 | |
| 		CF_DISABLE_VISUALIZE_OBJECT = 32, //disable debug drawing
 | |
| 		CF_DISABLE_SPU_COLLISION_PROCESSING = 64,//disable parallel/SPU processing
 | |
| 		CF_HAS_CONTACT_STIFFNESS_DAMPING = 128,
 | |
| 		CF_HAS_CUSTOM_DEBUG_RENDERING_COLOR = 256,
 | |
| 		CF_HAS_FRICTION_ANCHOR = 512,
 | |
| 		CF_HAS_COLLISION_SOUND_TRIGGER = 1024
 | |
| 	};
 | |
| 
 | |
| 	enum	CollisionObjectTypes
 | |
| 	{
 | |
| 		CO_COLLISION_OBJECT =1,
 | |
| 		CO_RIGID_BODY=2,
 | |
| 		///CO_GHOST_OBJECT keeps track of all objects overlapping its AABB and that pass its collision filter
 | |
| 		///It is useful for collision sensors, explosion objects, character controller etc.
 | |
| 		CO_GHOST_OBJECT=4,
 | |
| 		CO_SOFT_BODY=8,
 | |
| 		CO_HF_FLUID=16,
 | |
| 		CO_USER_TYPE=32,
 | |
| 		CO_FEATHERSTONE_LINK=64
 | |
| 	};
 | |
| 
 | |
| 	enum AnisotropicFrictionFlags
 | |
| 	{
 | |
| 		CF_ANISOTROPIC_FRICTION_DISABLED=0,
 | |
| 		CF_ANISOTROPIC_FRICTION = 1,
 | |
| 		CF_ANISOTROPIC_ROLLING_FRICTION = 2
 | |
| 	};
 | |
| 
 | |
| 	SIMD_FORCE_INLINE bool mergesSimulationIslands() const
 | |
| 	{
 | |
| 		///static objects, kinematic and object without contact response don't merge islands
 | |
| 		return  ((m_collisionFlags & (CF_STATIC_OBJECT | CF_KINEMATIC_OBJECT | CF_NO_CONTACT_RESPONSE) )==0);
 | |
| 	}
 | |
| 
 | |
| 	const btVector3& getAnisotropicFriction() const
 | |
| 	{
 | |
| 		return m_anisotropicFriction;
 | |
| 	}
 | |
| 	void	setAnisotropicFriction(const btVector3& anisotropicFriction, int frictionMode = CF_ANISOTROPIC_FRICTION)
 | |
| 	{
 | |
| 		m_anisotropicFriction = anisotropicFriction;
 | |
| 		bool isUnity = (anisotropicFriction[0]!=1.f) || (anisotropicFriction[1]!=1.f) || (anisotropicFriction[2]!=1.f);
 | |
| 		m_hasAnisotropicFriction = isUnity?frictionMode : 0;
 | |
| 	}
 | |
| 	bool	hasAnisotropicFriction(int frictionMode = CF_ANISOTROPIC_FRICTION) const
 | |
| 	{
 | |
| 		return (m_hasAnisotropicFriction&frictionMode)!=0;
 | |
| 	}
 | |
| 
 | |
| 	///the constraint solver can discard solving contacts, if the distance is above this threshold. 0 by default.
 | |
| 	///Note that using contacts with positive distance can improve stability. It increases, however, the chance of colliding with degerate contacts, such as 'interior' triangle edges
 | |
| 	void	setContactProcessingThreshold( btScalar contactProcessingThreshold)
 | |
| 	{
 | |
| 		m_contactProcessingThreshold = contactProcessingThreshold;
 | |
| 	}
 | |
| 	btScalar	getContactProcessingThreshold() const
 | |
| 	{
 | |
| 		return m_contactProcessingThreshold;
 | |
| 	}
 | |
| 
 | |
| 	SIMD_FORCE_INLINE bool		isStaticObject() const {
 | |
| 		return (m_collisionFlags & CF_STATIC_OBJECT) != 0;
 | |
| 	}
 | |
| 
 | |
| 	SIMD_FORCE_INLINE bool		isKinematicObject() const
 | |
| 	{
 | |
| 		return (m_collisionFlags & CF_KINEMATIC_OBJECT) != 0;
 | |
| 	}
 | |
| 
 | |
| 	SIMD_FORCE_INLINE bool		isStaticOrKinematicObject() const
 | |
| 	{
 | |
| 		return (m_collisionFlags & (CF_KINEMATIC_OBJECT | CF_STATIC_OBJECT)) != 0 ;
 | |
| 	}
 | |
| 
 | |
| 	SIMD_FORCE_INLINE bool		hasContactResponse() const {
 | |
| 		return (m_collisionFlags & CF_NO_CONTACT_RESPONSE)==0;
 | |
| 	}
 | |
| 
 | |
| 	
 | |
| 	btCollisionObject();
 | |
| 
 | |
| 	virtual ~btCollisionObject();
 | |
| 
 | |
| 	virtual void	setCollisionShape(btCollisionShape* collisionShape)
 | |
| 	{
 | |
| 		m_updateRevision++;
 | |
| 		m_collisionShape = collisionShape;
 | |
| 		m_rootCollisionShape = collisionShape;
 | |
| 	}
 | |
| 
 | |
| 	SIMD_FORCE_INLINE const btCollisionShape*	getCollisionShape() const
 | |
| 	{
 | |
| 		return m_collisionShape;
 | |
| 	}
 | |
| 
 | |
| 	SIMD_FORCE_INLINE btCollisionShape*	getCollisionShape()
 | |
| 	{
 | |
| 		return m_collisionShape;
 | |
| 	}
 | |
| 
 | |
| 	void	setIgnoreCollisionCheck(const btCollisionObject* co, bool ignoreCollisionCheck)
 | |
| 	{
 | |
| 		if (ignoreCollisionCheck)
 | |
| 		{
 | |
| 			//We don't check for duplicates. Is it ok to leave that up to the user of this API?
 | |
| 			//int index = m_objectsWithoutCollisionCheck.findLinearSearch(co);
 | |
| 			//if (index == m_objectsWithoutCollisionCheck.size())
 | |
| 			//{
 | |
| 			m_objectsWithoutCollisionCheck.push_back(co);
 | |
| 			//}
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			m_objectsWithoutCollisionCheck.remove(co);
 | |
| 		}
 | |
| 		m_checkCollideWith = m_objectsWithoutCollisionCheck.size() > 0;
 | |
| 	}
 | |
| 
 | |
| 	virtual bool	checkCollideWithOverride(const btCollisionObject*  co) const
 | |
| 	{
 | |
| 		int index = m_objectsWithoutCollisionCheck.findLinearSearch(co);
 | |
| 		if (index < m_objectsWithoutCollisionCheck.size())
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	
 | |
| 
 | |
| 	///Avoid using this internal API call, the extension pointer is used by some Bullet extensions. 
 | |
| 	///If you need to store your own user pointer, use 'setUserPointer/getUserPointer' instead.
 | |
| 	void*		internalGetExtensionPointer() const
 | |
| 	{
 | |
| 		return m_extensionPointer;
 | |
| 	}
 | |
| 	///Avoid using this internal API call, the extension pointer is used by some Bullet extensions
 | |
| 	///If you need to store your own user pointer, use 'setUserPointer/getUserPointer' instead.
 | |
| 	void	internalSetExtensionPointer(void* pointer)
 | |
| 	{
 | |
| 		m_extensionPointer = pointer;
 | |
| 	}
 | |
| 
 | |
| 	SIMD_FORCE_INLINE	int	getActivationState() const { return m_activationState1;}
 | |
| 	
 | |
| 	void setActivationState(int newState) const;
 | |
| 
 | |
| 	void	setDeactivationTime(btScalar time)
 | |
| 	{
 | |
| 		m_deactivationTime = time;
 | |
| 	}
 | |
| 	btScalar	getDeactivationTime() const
 | |
| 	{
 | |
| 		return m_deactivationTime;
 | |
| 	}
 | |
| 
 | |
| 	void forceActivationState(int newState) const;
 | |
| 
 | |
| 	void	activate(bool forceActivation = false) const;
 | |
| 
 | |
| 	SIMD_FORCE_INLINE bool isActive() const
 | |
| 	{
 | |
| 		return ((getActivationState() != ISLAND_SLEEPING) && (getActivationState() != DISABLE_SIMULATION));
 | |
| 	}
 | |
| 
 | |
| 	void	setRestitution(btScalar rest)
 | |
| 	{
 | |
| 		m_updateRevision++;
 | |
| 		m_restitution = rest;
 | |
| 	}
 | |
| 	btScalar	getRestitution() const
 | |
| 	{
 | |
| 		return m_restitution;
 | |
| 	}
 | |
| 	void	setFriction(btScalar frict)
 | |
| 	{
 | |
| 		m_updateRevision++;
 | |
| 		m_friction = frict;
 | |
| 	}
 | |
| 	btScalar	getFriction() const
 | |
| 	{
 | |
| 		return m_friction;
 | |
| 	}
 | |
| 
 | |
| 	void	setRollingFriction(btScalar frict)
 | |
| 	{
 | |
| 		m_updateRevision++;
 | |
| 		m_rollingFriction = frict;
 | |
| 	}
 | |
| 	btScalar	getRollingFriction() const
 | |
| 	{
 | |
| 		return m_rollingFriction;
 | |
| 	}
 | |
|     void	setSpinningFriction(btScalar frict)
 | |
|     {
 | |
|         m_updateRevision++;
 | |
|         m_spinningFriction = frict;
 | |
|     }
 | |
|     btScalar	getSpinningFriction() const
 | |
|     {
 | |
|         return m_spinningFriction;
 | |
|     }
 | |
|     void	setContactStiffnessAndDamping(btScalar stiffness, btScalar damping)
 | |
| 	{
 | |
| 		m_updateRevision++;
 | |
| 		m_contactStiffness = stiffness;
 | |
| 		m_contactDamping = damping;
 | |
| 		
 | |
| 		m_collisionFlags |=CF_HAS_CONTACT_STIFFNESS_DAMPING;
 | |
| 		
 | |
|         //avoid divisions by zero...
 | |
| 		if (m_contactStiffness< SIMD_EPSILON)
 | |
|         {
 | |
|             m_contactStiffness = SIMD_EPSILON;
 | |
|         }
 | |
| 	}
 | |
| 	
 | |
| 	btScalar	getContactStiffness() const
 | |
| 	{
 | |
| 		return m_contactStiffness;
 | |
| 	}
 | |
| 	
 | |
| 	btScalar	getContactDamping() const
 | |
| 	{
 | |
| 		return m_contactDamping;
 | |
| 	}
 | |
|     
 | |
| 	///reserved for Bullet internal usage
 | |
| 	int	getInternalType() const
 | |
| 	{
 | |
| 		return m_internalType;
 | |
| 	}
 | |
| 
 | |
| 	btTransform&	getWorldTransform()
 | |
| 	{
 | |
| 		return m_worldTransform;
 | |
| 	}
 | |
| 
 | |
| 	const btTransform&	getWorldTransform() const
 | |
| 	{
 | |
| 		return m_worldTransform;
 | |
| 	}
 | |
| 
 | |
| 	void	setWorldTransform(const btTransform& worldTrans)
 | |
| 	{
 | |
| 		m_updateRevision++;
 | |
| 		m_worldTransform = worldTrans;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	SIMD_FORCE_INLINE btBroadphaseProxy*	getBroadphaseHandle()
 | |
| 	{
 | |
| 		return m_broadphaseHandle;
 | |
| 	}
 | |
| 
 | |
| 	SIMD_FORCE_INLINE const btBroadphaseProxy*	getBroadphaseHandle() const
 | |
| 	{
 | |
| 		return m_broadphaseHandle;
 | |
| 	}
 | |
| 
 | |
| 	void	setBroadphaseHandle(btBroadphaseProxy* handle)
 | |
| 	{
 | |
| 		m_broadphaseHandle = handle;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	const btTransform&	getInterpolationWorldTransform() const
 | |
| 	{
 | |
| 		return m_interpolationWorldTransform;
 | |
| 	}
 | |
| 
 | |
| 	btTransform&	getInterpolationWorldTransform()
 | |
| 	{
 | |
| 		return m_interpolationWorldTransform;
 | |
| 	}
 | |
| 
 | |
| 	void	setInterpolationWorldTransform(const btTransform&	trans)
 | |
| 	{
 | |
| 		m_updateRevision++;
 | |
| 		m_interpolationWorldTransform = trans;
 | |
| 	}
 | |
| 
 | |
| 	void	setInterpolationLinearVelocity(const btVector3& linvel)
 | |
| 	{
 | |
| 		m_updateRevision++;
 | |
| 		m_interpolationLinearVelocity = linvel;
 | |
| 	}
 | |
| 
 | |
| 	void	setInterpolationAngularVelocity(const btVector3& angvel)
 | |
| 	{
 | |
| 		m_updateRevision++;
 | |
| 		m_interpolationAngularVelocity = angvel;
 | |
| 	}
 | |
| 
 | |
| 	const btVector3&	getInterpolationLinearVelocity() const
 | |
| 	{
 | |
| 		return m_interpolationLinearVelocity;
 | |
| 	}
 | |
| 
 | |
| 	const btVector3&	getInterpolationAngularVelocity() const
 | |
| 	{
 | |
| 		return m_interpolationAngularVelocity;
 | |
| 	}
 | |
| 
 | |
| 	SIMD_FORCE_INLINE int getIslandTag() const
 | |
| 	{
 | |
| 		return	m_islandTag1;
 | |
| 	}
 | |
| 
 | |
| 	void	setIslandTag(int tag)
 | |
| 	{
 | |
| 		m_islandTag1 = tag;
 | |
| 	}
 | |
| 
 | |
| 	SIMD_FORCE_INLINE int getCompanionId() const
 | |
| 	{
 | |
| 		return	m_companionId;
 | |
| 	}
 | |
| 
 | |
| 	void	setCompanionId(int id)
 | |
| 	{
 | |
| 		m_companionId = id;
 | |
| 	}
 | |
| 
 | |
|     SIMD_FORCE_INLINE int getWorldArrayIndex() const
 | |
|     {
 | |
|         return	m_worldArrayIndex;
 | |
|     }
 | |
| 
 | |
|     // only should be called by CollisionWorld
 | |
|     void setWorldArrayIndex(int ix)
 | |
|     {
 | |
|         m_worldArrayIndex = ix;
 | |
|     }
 | |
| 
 | |
|     SIMD_FORCE_INLINE btScalar			getHitFraction() const
 | |
| 	{
 | |
| 		return m_hitFraction; 
 | |
| 	}
 | |
| 
 | |
| 	void	setHitFraction(btScalar hitFraction)
 | |
| 	{
 | |
| 		m_hitFraction = hitFraction;
 | |
| 	}
 | |
| 
 | |
| 	
 | |
| 	SIMD_FORCE_INLINE int	getCollisionFlags() const
 | |
| 	{
 | |
| 		return m_collisionFlags;
 | |
| 	}
 | |
| 
 | |
| 	void	setCollisionFlags(int flags)
 | |
| 	{
 | |
| 		m_collisionFlags = flags;
 | |
| 	}
 | |
| 	
 | |
| 	///Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm::
 | |
| 	btScalar			getCcdSweptSphereRadius() const
 | |
| 	{
 | |
| 		return m_ccdSweptSphereRadius;
 | |
| 	}
 | |
| 
 | |
| 	///Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm::
 | |
| 	void	setCcdSweptSphereRadius(btScalar radius)
 | |
| 	{
 | |
| 		m_ccdSweptSphereRadius = radius;
 | |
| 	}
 | |
| 
 | |
| 	btScalar 	getCcdMotionThreshold() const
 | |
| 	{
 | |
| 		return m_ccdMotionThreshold;
 | |
| 	}
 | |
| 
 | |
| 	btScalar 	getCcdSquareMotionThreshold() const
 | |
| 	{
 | |
| 		return m_ccdMotionThreshold*m_ccdMotionThreshold;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 
 | |
| 	/// Don't do continuous collision detection if the motion (in one step) is less then m_ccdMotionThreshold
 | |
| 	void	setCcdMotionThreshold(btScalar ccdMotionThreshold)
 | |
| 	{
 | |
| 		m_ccdMotionThreshold = ccdMotionThreshold;
 | |
| 	}
 | |
| 
 | |
| 	///users can point to their objects, userPointer is not used by Bullet
 | |
| 	void*	getUserPointer() const
 | |
| 	{
 | |
| 		return m_userObjectPointer;
 | |
| 	}
 | |
| 
 | |
| 	int	getUserIndex() const
 | |
| 	{
 | |
| 		return m_userIndex;
 | |
| 	}
 | |
| 	
 | |
| 	int	getUserIndex2() const
 | |
| 	{
 | |
| 		return m_userIndex2;
 | |
| 	}
 | |
| 	
 | |
| 	///users can point to their objects, userPointer is not used by Bullet
 | |
| 	void	setUserPointer(void* userPointer)
 | |
| 	{
 | |
| 		m_userObjectPointer = userPointer;
 | |
| 	}
 | |
| 
 | |
| 	///users can point to their objects, userPointer is not used by Bullet
 | |
| 	void	setUserIndex(int index)
 | |
| 	{
 | |
| 		m_userIndex = index;
 | |
| 	}
 | |
| 	
 | |
| 	void	setUserIndex2(int index)
 | |
| 	{
 | |
| 		m_userIndex2 = index;
 | |
| 	}
 | |
| 
 | |
| 	int	getUpdateRevisionInternal() const
 | |
| 	{
 | |
| 		return m_updateRevision;
 | |
| 	}
 | |
| 
 | |
| 	void	setCustomDebugColor(const btVector3& colorRGB)
 | |
| 	{
 | |
| 		m_customDebugColorRGB = colorRGB;
 | |
| 		m_collisionFlags |= CF_HAS_CUSTOM_DEBUG_RENDERING_COLOR;
 | |
| 	}
 | |
| 
 | |
| 	void	removeCustomDebugColor()
 | |
| 	{
 | |
| 		m_collisionFlags &= ~CF_HAS_CUSTOM_DEBUG_RENDERING_COLOR;
 | |
| 	}
 | |
| 
 | |
| 	bool getCustomDebugColor(btVector3& colorRGB) const
 | |
| 	{
 | |
| 		bool hasCustomColor = (0!=(m_collisionFlags&CF_HAS_CUSTOM_DEBUG_RENDERING_COLOR));
 | |
| 		if (hasCustomColor)
 | |
| 		{
 | |
| 			colorRGB = m_customDebugColorRGB;
 | |
| 		}
 | |
| 		return hasCustomColor;
 | |
| 	}
 | |
| 
 | |
| 	inline bool checkCollideWith(const btCollisionObject* co) const
 | |
| 	{
 | |
| 		if (m_checkCollideWith)
 | |
| 			return checkCollideWithOverride(co);
 | |
| 
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	virtual	int	calculateSerializeBufferSize()	const;
 | |
| 
 | |
| 	///fills the dataBuffer and returns the struct name (and 0 on failure)
 | |
| 	virtual	const char*	serialize(void* dataBuffer, class btSerializer* serializer) const;
 | |
| 
 | |
| 	virtual void serializeSingleObject(class btSerializer* serializer) const;
 | |
| 
 | |
| };
 | |
| 
 | |
| ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
 | |
| struct	btCollisionObjectDoubleData
 | |
| {
 | |
| 	void					*m_broadphaseHandle;
 | |
| 	void					*m_collisionShape;
 | |
| 	btCollisionShapeData	*m_rootCollisionShape;
 | |
| 	char					*m_name;
 | |
| 
 | |
| 	btTransformDoubleData	m_worldTransform;
 | |
| 	btTransformDoubleData	m_interpolationWorldTransform;
 | |
| 	btVector3DoubleData		m_interpolationLinearVelocity;
 | |
| 	btVector3DoubleData		m_interpolationAngularVelocity;
 | |
| 	btVector3DoubleData		m_anisotropicFriction;
 | |
| 	double					m_contactProcessingThreshold;	
 | |
| 	double					m_deactivationTime;
 | |
| 	double					m_friction;
 | |
| 	double					m_rollingFriction;
 | |
| 	double                  m_contactDamping;
 | |
| 	double                  m_contactStiffness;
 | |
| 	double					m_restitution;
 | |
| 	double					m_hitFraction; 
 | |
| 	double					m_ccdSweptSphereRadius;
 | |
| 	double					m_ccdMotionThreshold;
 | |
| 
 | |
| 	int						m_hasAnisotropicFriction;
 | |
| 	int						m_collisionFlags;
 | |
| 	int						m_islandTag1;
 | |
| 	int						m_companionId;
 | |
| 	int						m_activationState1;
 | |
| 	int						m_internalType;
 | |
| 	int						m_checkCollideWith;
 | |
| 
 | |
| 	char	m_padding[4];
 | |
| };
 | |
| 
 | |
| ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
 | |
| struct	btCollisionObjectFloatData
 | |
| {
 | |
| 	void					*m_broadphaseHandle;
 | |
| 	void					*m_collisionShape;
 | |
| 	btCollisionShapeData	*m_rootCollisionShape;
 | |
| 	char					*m_name;
 | |
| 
 | |
| 	btTransformFloatData	m_worldTransform;
 | |
| 	btTransformFloatData	m_interpolationWorldTransform;
 | |
| 	btVector3FloatData		m_interpolationLinearVelocity;
 | |
| 	btVector3FloatData		m_interpolationAngularVelocity;
 | |
| 	btVector3FloatData		m_anisotropicFriction;
 | |
| 	float					m_contactProcessingThreshold;	
 | |
| 	float					m_deactivationTime;
 | |
| 	float					m_friction;
 | |
| 	float					m_rollingFriction;
 | |
|     float                   m_contactDamping;
 | |
|     float                   m_contactStiffness;
 | |
| 	float					m_restitution;
 | |
| 	float					m_hitFraction; 
 | |
| 	float					m_ccdSweptSphereRadius;
 | |
| 	float					m_ccdMotionThreshold;
 | |
| 
 | |
| 	int						m_hasAnisotropicFriction;
 | |
| 	int						m_collisionFlags;
 | |
| 	int						m_islandTag1;
 | |
| 	int						m_companionId;
 | |
| 	int						m_activationState1;
 | |
| 	int						m_internalType;
 | |
| 	int						m_checkCollideWith;
 | |
| 	char					m_padding[4];
 | |
| };
 | |
| 
 | |
| 
 | |
| 
 | |
| SIMD_FORCE_INLINE	int	btCollisionObject::calculateSerializeBufferSize() const
 | |
| {
 | |
| 	return sizeof(btCollisionObjectData);
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| #endif //BT_COLLISION_OBJECT_H
 |