forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			101 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			101 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								Bullet Continuous Collision Detection and Physics Library
							 | 
						||
| 
								 | 
							
								Copyright (c) 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.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef BT_MULTIBODY_CONSTRAINT_SOLVER_H
							 | 
						||
| 
								 | 
							
								#define BT_MULTIBODY_CONSTRAINT_SOLVER_H
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h"
							 | 
						||
| 
								 | 
							
								#include "btMultiBodySolverConstraint.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class btMultiBody;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "btMultiBodyConstraint.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ATTRIBUTE_ALIGNED16(class) btMultiBodyConstraintSolver : public btSequentialImpulseConstraintSolver
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								protected:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									btMultiBodyConstraintArray			m_multiBodyNonContactConstraints;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									btMultiBodyConstraintArray			m_multiBodyNormalContactConstraints;
							 | 
						||
| 
								 | 
							
									btMultiBodyConstraintArray			m_multiBodyFrictionContactConstraints;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									btMultiBodyJacobianData				m_data;
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									//temp storage for multi body constraints for a specific island/group called by 'solveGroup'
							 | 
						||
| 
								 | 
							
									btMultiBodyConstraint**					m_tmpMultiBodyConstraints;
							 | 
						||
| 
								 | 
							
									int										m_tmpNumMultiBodyConstraints;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									btScalar resolveSingleConstraintRowGeneric(const btMultiBodySolverConstraint& c);
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									void convertContacts(btPersistentManifold** manifoldPtr,int numManifolds, const btContactSolverInfo& infoGlobal);
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    btMultiBodySolverConstraint&	addMultiBodyFrictionConstraint(const btVector3& normalAxis,btPersistentManifold* manifold,int frictionIndex,btManifoldPoint& cp,btCollisionObject* colObj0,btCollisionObject* colObj1, btScalar relaxation, const btContactSolverInfo& infoGlobal, btScalar desiredVelocity=0, btScalar cfmSlip=0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    btMultiBodySolverConstraint&	addMultiBodyTorsionalFrictionConstraint(const btVector3& normalAxis,btPersistentManifold* manifold,int frictionIndex,btManifoldPoint& cp,
							 | 
						||
| 
								 | 
							
								                                                            btScalar combinedTorsionalFriction,
							 | 
						||
| 
								 | 
							
								                                                            btCollisionObject* colObj0,btCollisionObject* colObj1, btScalar relaxation, const btContactSolverInfo& infoGlobal, btScalar desiredVelocity=0, btScalar cfmSlip=0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									void setupMultiBodyJointLimitConstraint(btMultiBodySolverConstraint& constraintRow, 
							 | 
						||
| 
								 | 
							
																								 btScalar* jacA,btScalar* jacB,
							 | 
						||
| 
								 | 
							
																								 btScalar penetration,btScalar combinedFrictionCoeff, btScalar combinedRestitutionCoeff,
							 | 
						||
| 
								 | 
							
																								 const btContactSolverInfo& infoGlobal);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									void setupMultiBodyContactConstraint(btMultiBodySolverConstraint& solverConstraint, 
							 | 
						||
| 
								 | 
							
																								 const btVector3& contactNormal,
							 | 
						||
| 
								 | 
							
																								 btManifoldPoint& cp, const btContactSolverInfo& infoGlobal,
							 | 
						||
| 
								 | 
							
																								 btScalar& relaxation,
							 | 
						||
| 
								 | 
							
																								 bool isFriction, btScalar desiredVelocity=0, btScalar cfmSlip=0);
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    //either rolling or spinning friction
							 | 
						||
| 
								 | 
							
								    void setupMultiBodyTorsionalFrictionConstraint(btMultiBodySolverConstraint& solverConstraint,
							 | 
						||
| 
								 | 
							
								                                         const btVector3& contactNormal,
							 | 
						||
| 
								 | 
							
								                                         btManifoldPoint& cp,
							 | 
						||
| 
								 | 
							
								                                        btScalar combinedTorsionalFriction,
							 | 
						||
| 
								 | 
							
								                                        const btContactSolverInfo& infoGlobal,
							 | 
						||
| 
								 | 
							
								                                         btScalar& relaxation,
							 | 
						||
| 
								 | 
							
								                                         bool isFriction, btScalar desiredVelocity=0, btScalar cfmSlip=0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									void convertMultiBodyContact(btPersistentManifold* manifold,const btContactSolverInfo& infoGlobal);
							 | 
						||
| 
								 | 
							
									virtual btScalar solveGroupCacheFriendlySetup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer);
							 | 
						||
| 
								 | 
							
								//	virtual btScalar solveGroupCacheFriendlyIterations(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual btScalar solveSingleIteration(int iteration, btCollisionObject** bodies ,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer);
							 | 
						||
| 
								 | 
							
									void	applyDeltaVee(btScalar* deltaV, btScalar impulse, int velocityIndex, int ndof);
							 | 
						||
| 
								 | 
							
									void writeBackSolverBodyToMultiBody(btMultiBodySolverConstraint& constraint, btScalar deltaTime);
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									BT_DECLARE_ALIGNED_ALLOCATOR();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									///this method should not be called, it was just used during porting/integration of Featherstone btMultiBody, providing backwards compatibility but no support for btMultiBodyConstraint (only contact constraints)
							 | 
						||
| 
								 | 
							
									virtual btScalar solveGroup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifold,int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& info, btIDebugDraw* debugDrawer,btDispatcher* dispatcher);
							 | 
						||
| 
								 | 
							
									virtual btScalar solveGroupCacheFriendlyFinish(btCollisionObject** bodies,int numBodies,const btContactSolverInfo& infoGlobal);
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									virtual void solveMultiBodyGroup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifold,int numManifolds,btTypedConstraint** constraints,int numConstraints,btMultiBodyConstraint** multiBodyConstraints, int numMultiBodyConstraints, const btContactSolverInfo& info, btIDebugDraw* debugDrawer,btDispatcher* dispatcher);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif //BT_MULTIBODY_CONSTRAINT_SOLVER_H
							 | 
						||
| 
								 | 
							
								
							 |