181 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			181 lines
		
	
	
		
			5.4 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_POINT2POINTCONSTRAINT_H
 | ||
|  | #define BT_POINT2POINTCONSTRAINT_H
 | ||
|  | 
 | ||
|  | #include "LinearMath/btVector3.h"
 | ||
|  | #include "btJacobianEntry.h"
 | ||
|  | #include "btTypedConstraint.h"
 | ||
|  | 
 | ||
|  | class btRigidBody; | ||
|  | 
 | ||
|  | 
 | ||
|  | #ifdef BT_USE_DOUBLE_PRECISION
 | ||
|  | #define btPoint2PointConstraintData2	btPoint2PointConstraintDoubleData2
 | ||
|  | #define btPoint2PointConstraintDataName	"btPoint2PointConstraintDoubleData2"
 | ||
|  | #else
 | ||
|  | #define btPoint2PointConstraintData2	btPoint2PointConstraintFloatData
 | ||
|  | #define btPoint2PointConstraintDataName	"btPoint2PointConstraintFloatData"
 | ||
|  | #endif //BT_USE_DOUBLE_PRECISION
 | ||
|  | 
 | ||
|  | struct	btConstraintSetting | ||
|  | { | ||
|  | 	btConstraintSetting()	: | ||
|  | 		m_tau(btScalar(0.3)), | ||
|  | 		m_damping(btScalar(1.)), | ||
|  | 		m_impulseClamp(btScalar(0.)) | ||
|  | 	{ | ||
|  | 	} | ||
|  | 	btScalar		m_tau; | ||
|  | 	btScalar		m_damping; | ||
|  | 	btScalar		m_impulseClamp; | ||
|  | }; | ||
|  | 
 | ||
|  | enum btPoint2PointFlags | ||
|  | { | ||
|  | 	BT_P2P_FLAGS_ERP = 1, | ||
|  | 	BT_P2P_FLAGS_CFM = 2 | ||
|  | }; | ||
|  | 
 | ||
|  | /// point to point constraint between two rigidbodies each with a pivotpoint that descibes the 'ballsocket' location in local space
 | ||
|  | ATTRIBUTE_ALIGNED16(class) btPoint2PointConstraint : public btTypedConstraint | ||
|  | { | ||
|  | #ifdef IN_PARALLELL_SOLVER
 | ||
|  | public: | ||
|  | #endif
 | ||
|  | 	btJacobianEntry	m_jac[3]; //3 orthogonal linear constraints
 | ||
|  | 	 | ||
|  | 	btVector3	m_pivotInA; | ||
|  | 	btVector3	m_pivotInB; | ||
|  | 	 | ||
|  | 	int			m_flags; | ||
|  | 	btScalar	m_erp; | ||
|  | 	btScalar	m_cfm; | ||
|  | 	 | ||
|  | public: | ||
|  | 
 | ||
|  | 	BT_DECLARE_ALIGNED_ALLOCATOR(); | ||
|  | 
 | ||
|  | 	///for backwards compatibility during the transition to 'getInfo/getInfo2'
 | ||
|  | 	bool		m_useSolveConstraintObsolete; | ||
|  | 
 | ||
|  | 	btConstraintSetting	m_setting; | ||
|  | 
 | ||
|  | 	btPoint2PointConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3& pivotInB); | ||
|  | 
 | ||
|  | 	btPoint2PointConstraint(btRigidBody& rbA,const btVector3& pivotInA); | ||
|  | 
 | ||
|  | 
 | ||
|  | 	virtual void	buildJacobian(); | ||
|  | 
 | ||
|  | 	virtual void getInfo1 (btConstraintInfo1* info); | ||
|  | 
 | ||
|  | 	void getInfo1NonVirtual (btConstraintInfo1* info); | ||
|  | 
 | ||
|  | 	virtual void getInfo2 (btConstraintInfo2* info); | ||
|  | 
 | ||
|  | 	void getInfo2NonVirtual (btConstraintInfo2* info, const btTransform& body0_trans, const btTransform& body1_trans); | ||
|  | 
 | ||
|  | 	void	updateRHS(btScalar	timeStep); | ||
|  | 
 | ||
|  | 	void	setPivotA(const btVector3& pivotA) | ||
|  | 	{ | ||
|  | 		m_pivotInA = pivotA; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	void	setPivotB(const btVector3& pivotB) | ||
|  | 	{ | ||
|  | 		m_pivotInB = pivotB; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	const btVector3& getPivotInA() const | ||
|  | 	{ | ||
|  | 		return m_pivotInA; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	const btVector3& getPivotInB() const | ||
|  | 	{ | ||
|  | 		return m_pivotInB; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5). 
 | ||
|  | 	///If no axis is provided, it uses the default axis for this constraint.
 | ||
|  | 	virtual	void	setParam(int num, btScalar value, int axis = -1); | ||
|  | 	///return the local value of parameter
 | ||
|  | 	virtual	btScalar getParam(int num, int axis = -1) const; | ||
|  | 	 | ||
|  | 	virtual	int getFlags() const | ||
|  | 	{ | ||
|  |         	return m_flags; | ||
|  |     	} | ||
|  | 
 | ||
|  | 	virtual	int	calculateSerializeBufferSize() const; | ||
|  | 
 | ||
|  | 	///fills the dataBuffer and returns the struct name (and 0 on failure)
 | ||
|  | 	virtual	const char*	serialize(void* dataBuffer, btSerializer* serializer) const; | ||
|  | 
 | ||
|  | 
 | ||
|  | }; | ||
|  | 
 | ||
|  | ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
 | ||
|  | struct	btPoint2PointConstraintFloatData | ||
|  | { | ||
|  | 	btTypedConstraintData	m_typeConstraintData; | ||
|  | 	btVector3FloatData	m_pivotInA; | ||
|  | 	btVector3FloatData	m_pivotInB; | ||
|  | }; | ||
|  | 
 | ||
|  | ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
 | ||
|  | struct	btPoint2PointConstraintDoubleData2 | ||
|  | { | ||
|  | 	btTypedConstraintDoubleData	m_typeConstraintData; | ||
|  | 	btVector3DoubleData	m_pivotInA; | ||
|  | 	btVector3DoubleData	m_pivotInB; | ||
|  | }; | ||
|  | 
 | ||
|  | #ifdef BT_BACKWARDS_COMPATIBLE_SERIALIZATION
 | ||
|  | ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
 | ||
|  | ///this structure is not used, except for loading pre-2.82 .bullet files
 | ||
|  | ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
 | ||
|  | struct	btPoint2PointConstraintDoubleData | ||
|  | { | ||
|  | 	btTypedConstraintData	m_typeConstraintData; | ||
|  | 	btVector3DoubleData	m_pivotInA; | ||
|  | 	btVector3DoubleData	m_pivotInB; | ||
|  | }; | ||
|  | #endif //BT_BACKWARDS_COMPATIBLE_SERIALIZATION
 | ||
|  | 
 | ||
|  | 
 | ||
|  | SIMD_FORCE_INLINE	int	btPoint2PointConstraint::calculateSerializeBufferSize() const | ||
|  | { | ||
|  | 	return sizeof(btPoint2PointConstraintData2); | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | 	///fills the dataBuffer and returns the struct name (and 0 on failure)
 | ||
|  | SIMD_FORCE_INLINE	const char*	btPoint2PointConstraint::serialize(void* dataBuffer, btSerializer* serializer) const | ||
|  | { | ||
|  | 	btPoint2PointConstraintData2* p2pData = (btPoint2PointConstraintData2*)dataBuffer; | ||
|  | 
 | ||
|  | 	btTypedConstraint::serialize(&p2pData->m_typeConstraintData,serializer); | ||
|  | 	m_pivotInA.serialize(p2pData->m_pivotInA); | ||
|  | 	m_pivotInB.serialize(p2pData->m_pivotInB); | ||
|  | 
 | ||
|  | 	return btPoint2PointConstraintDataName; | ||
|  | } | ||
|  | 
 | ||
|  | #endif //BT_POINT2POINTCONSTRAINT_H
 |