161 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			161 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /*
 | ||
|  | Bullet Continuous Collision Detection and Physics Library | ||
|  | Copyright (c) 2012 Advanced Micro Devices, Inc.  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. | ||
|  | */ | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #ifndef BT_GEAR_CONSTRAINT_H
 | ||
|  | #define BT_GEAR_CONSTRAINT_H
 | ||
|  | 
 | ||
|  | #include "BulletDynamics/ConstraintSolver/btTypedConstraint.h"
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #ifdef BT_USE_DOUBLE_PRECISION
 | ||
|  | #define btGearConstraintData	btGearConstraintDoubleData
 | ||
|  | #define btGearConstraintDataName	"btGearConstraintDoubleData"
 | ||
|  | #else
 | ||
|  | #define btGearConstraintData	btGearConstraintFloatData
 | ||
|  | #define btGearConstraintDataName	"btGearConstraintFloatData"
 | ||
|  | #endif //BT_USE_DOUBLE_PRECISION
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | ///The btGeatConstraint will couple the angular velocity for two bodies around given local axis and ratio.
 | ||
|  | ///See Bullet/Demos/ConstraintDemo for an example use.
 | ||
|  | class btGearConstraint : public btTypedConstraint | ||
|  | { | ||
|  | protected: | ||
|  | 	btVector3	m_axisInA; | ||
|  | 	btVector3	m_axisInB; | ||
|  | 	bool		m_useFrameA; | ||
|  | 	btScalar	m_ratio; | ||
|  | 
 | ||
|  | public: | ||
|  | 	btGearConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& axisInA,const btVector3& axisInB, btScalar ratio=1.f); | ||
|  | 	virtual ~btGearConstraint (); | ||
|  | 
 | ||
|  | 	///internal method used by the constraint solver, don't use them directly
 | ||
|  | 	virtual void getInfo1 (btConstraintInfo1* info); | ||
|  | 
 | ||
|  | 	///internal method used by the constraint solver, don't use them directly
 | ||
|  | 	virtual void getInfo2 (btConstraintInfo2* info); | ||
|  | 
 | ||
|  | 	void setAxisA(btVector3& axisA)  | ||
|  | 	{ | ||
|  | 		m_axisInA = axisA; | ||
|  | 	} | ||
|  | 	void setAxisB(btVector3& axisB) | ||
|  | 	{ | ||
|  | 		m_axisInB = axisB; | ||
|  | 	} | ||
|  | 	void setRatio(btScalar ratio) | ||
|  | 	{ | ||
|  | 		m_ratio = ratio; | ||
|  | 	} | ||
|  | 	const btVector3& getAxisA() const | ||
|  | 	{ | ||
|  | 		return m_axisInA; | ||
|  | 	} | ||
|  | 	const btVector3& getAxisB() const | ||
|  | 	{ | ||
|  | 		return m_axisInB; | ||
|  | 	} | ||
|  | 	btScalar getRatio() const | ||
|  | 	{ | ||
|  | 		return m_ratio; | ||
|  | 	} | ||
|  | 
 | ||
|  | 
 | ||
|  | 	virtual	void	setParam(int num, btScalar value, int axis = -1)  | ||
|  | 	{ | ||
|  | 		(void) num; | ||
|  | 		(void) value; | ||
|  | 		(void) axis; | ||
|  | 		btAssert(0); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	///return the local value of parameter
 | ||
|  | 	virtual	btScalar getParam(int num, int axis = -1) const  | ||
|  | 	{  | ||
|  | 		(void) num; | ||
|  | 		(void) axis; | ||
|  | 		btAssert(0); | ||
|  | 		return 0.f; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	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 btGearConstraintFloatData | ||
|  | { | ||
|  | 	btTypedConstraintFloatData	m_typeConstraintData; | ||
|  | 
 | ||
|  | 	btVector3FloatData			m_axisInA; | ||
|  | 	btVector3FloatData			m_axisInB; | ||
|  | 
 | ||
|  | 	float							m_ratio; | ||
|  | 	char							m_padding[4]; | ||
|  | }; | ||
|  | 
 | ||
|  | struct btGearConstraintDoubleData | ||
|  | { | ||
|  | 	btTypedConstraintDoubleData	m_typeConstraintData; | ||
|  | 
 | ||
|  | 	btVector3DoubleData			m_axisInA; | ||
|  | 	btVector3DoubleData			m_axisInB; | ||
|  | 
 | ||
|  | 	double						m_ratio; | ||
|  | }; | ||
|  | 
 | ||
|  | SIMD_FORCE_INLINE	int	btGearConstraint::calculateSerializeBufferSize() const | ||
|  | { | ||
|  | 	return sizeof(btGearConstraintData); | ||
|  | } | ||
|  | 
 | ||
|  | 	///fills the dataBuffer and returns the struct name (and 0 on failure)
 | ||
|  | SIMD_FORCE_INLINE	const char*	btGearConstraint::serialize(void* dataBuffer, btSerializer* serializer) const | ||
|  | { | ||
|  | 	btGearConstraintData* gear = (btGearConstraintData*)dataBuffer; | ||
|  | 	btTypedConstraint::serialize(&gear->m_typeConstraintData,serializer); | ||
|  | 
 | ||
|  | 	m_axisInA.serialize( gear->m_axisInA ); | ||
|  | 	m_axisInB.serialize( gear->m_axisInB ); | ||
|  | 
 | ||
|  | 	gear->m_ratio = m_ratio; | ||
|  | 
 | ||
|  | 	// Fill padding with zeros to appease msan.
 | ||
|  | #ifndef BT_USE_DOUBLE_PRECISION
 | ||
|  | 	gear->m_padding[0] = 0; | ||
|  | 	gear->m_padding[1] = 0; | ||
|  | 	gear->m_padding[2] = 0; | ||
|  | 	gear->m_padding[3] = 0; | ||
|  | #endif
 | ||
|  | 
 | ||
|  | 	return btGearConstraintDataName; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #endif //BT_GEAR_CONSTRAINT_H
 |