2017-08-01 14:30:58 +02:00
/*
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_DYNAMICS_WORLD_H
# define BT_DYNAMICS_WORLD_H
# include "BulletCollision/CollisionDispatch/btCollisionWorld.h"
# include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h"
class btTypedConstraint ;
class btActionInterface ;
class btConstraintSolver ;
class btDynamicsWorld ;
/// Type for the callback for each tick
2019-01-03 14:26:51 +01:00
typedef void ( * btInternalTickCallback ) ( btDynamicsWorld * world , btScalar timeStep ) ;
2017-08-01 14:30:58 +02:00
enum btDynamicsWorldType
{
2019-01-03 14:26:51 +01:00
BT_SIMPLE_DYNAMICS_WORLD = 1 ,
BT_DISCRETE_DYNAMICS_WORLD = 2 ,
BT_CONTINUOUS_DYNAMICS_WORLD = 3 ,
BT_SOFT_RIGID_DYNAMICS_WORLD = 4 ,
BT_GPU_DYNAMICS_WORLD = 5 ,
BT_SOFT_MULTIBODY_DYNAMICS_WORLD = 6
2017-08-01 14:30:58 +02:00
} ;
///The btDynamicsWorld is the interface class for several dynamics implementation, basic, discrete, parallel, and continuous etc.
class btDynamicsWorld : public btCollisionWorld
{
protected :
2019-01-03 14:26:51 +01:00
btInternalTickCallback m_internalTickCallback ;
btInternalTickCallback m_internalPreTickCallback ;
void * m_worldUserInfo ;
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
btContactSolverInfo m_solverInfo ;
2017-08-01 14:30:58 +02:00
public :
2019-01-03 14:26:51 +01:00
btDynamicsWorld ( btDispatcher * dispatcher , btBroadphaseInterface * broadphase , btCollisionConfiguration * collisionConfiguration )
: btCollisionWorld ( dispatcher , broadphase , collisionConfiguration ) , m_internalTickCallback ( 0 ) , m_internalPreTickCallback ( 0 ) , m_worldUserInfo ( 0 )
{
}
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
virtual ~ btDynamicsWorld ( )
{
}
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
///stepSimulation proceeds the simulation over 'timeStep', units in preferably in seconds.
///By default, Bullet will subdivide the timestep in constant substeps of each 'fixedTimeStep'.
///in order to keep the simulation real-time, the maximum number of substeps can be clamped to 'maxSubSteps'.
///You can disable subdividing the timestep/substepping by passing maxSubSteps=0 as second argument to stepSimulation, but in that case you have to keep the timeStep constant.
virtual int stepSimulation ( btScalar timeStep , int maxSubSteps = 1 , btScalar fixedTimeStep = btScalar ( 1. ) / btScalar ( 60. ) ) = 0 ;
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
virtual void debugDrawWorld ( ) = 0 ;
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
virtual void addConstraint ( btTypedConstraint * constraint , bool disableCollisionsBetweenLinkedBodies = false )
{
( void ) constraint ;
( void ) disableCollisionsBetweenLinkedBodies ;
}
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
virtual void removeConstraint ( btTypedConstraint * constraint ) { ( void ) constraint ; }
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
virtual void addAction ( btActionInterface * action ) = 0 ;
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
virtual void removeAction ( btActionInterface * action ) = 0 ;
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
//once a rigidbody is added to the dynamics world, it will get this gravity assigned
//existing rigidbodies in the world get gravity assigned too, during this method
virtual void setGravity ( const btVector3 & gravity ) = 0 ;
virtual btVector3 getGravity ( ) const = 0 ;
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
virtual void synchronizeMotionStates ( ) = 0 ;
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
virtual void addRigidBody ( btRigidBody * body ) = 0 ;
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
virtual void addRigidBody ( btRigidBody * body , int group , int mask ) = 0 ;
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
virtual void removeRigidBody ( btRigidBody * body ) = 0 ;
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
virtual void setConstraintSolver ( btConstraintSolver * solver ) = 0 ;
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
virtual btConstraintSolver * getConstraintSolver ( ) = 0 ;
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
virtual int getNumConstraints ( ) const { return 0 ; }
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
virtual btTypedConstraint * getConstraint ( int index )
{
( void ) index ;
return 0 ;
}
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
virtual const btTypedConstraint * getConstraint ( int index ) const
{
( void ) index ;
return 0 ;
}
virtual btDynamicsWorldType getWorldType ( ) const = 0 ;
virtual void clearForces ( ) = 0 ;
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
/// Set the callback for when an internal tick (simulation substep) happens, optional user info
void setInternalTickCallback ( btInternalTickCallback cb , void * worldUserInfo = 0 , bool isPreTick = false )
{
if ( isPreTick )
2017-08-01 14:30:58 +02:00
{
2019-01-03 14:26:51 +01:00
m_internalPreTickCallback = cb ;
2017-08-01 14:30:58 +02:00
}
2019-01-03 14:26:51 +01:00
else
2017-08-01 14:30:58 +02:00
{
2019-01-03 14:26:51 +01:00
m_internalTickCallback = cb ;
2017-08-01 14:30:58 +02:00
}
2019-01-03 14:26:51 +01:00
m_worldUserInfo = worldUserInfo ;
}
void setWorldUserInfo ( void * worldUserInfo )
{
m_worldUserInfo = worldUserInfo ;
}
void * getWorldUserInfo ( ) const
{
return m_worldUserInfo ;
}
btContactSolverInfo & getSolverInfo ( )
{
return m_solverInfo ;
}
const btContactSolverInfo & getSolverInfo ( ) const
{
return m_solverInfo ;
}
///obsolete, use addAction instead.
virtual void addVehicle ( btActionInterface * vehicle ) { ( void ) vehicle ; }
///obsolete, use removeAction instead
virtual void removeVehicle ( btActionInterface * vehicle ) { ( void ) vehicle ; }
///obsolete, use addAction instead.
virtual void addCharacter ( btActionInterface * character ) { ( void ) character ; }
///obsolete, use removeAction instead
virtual void removeCharacter ( btActionInterface * character ) { ( void ) character ; }
2017-08-01 14:30:58 +02:00
} ;
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
struct btDynamicsWorldDoubleData
{
2019-01-03 14:26:51 +01:00
btContactSolverInfoDoubleData m_solverInfo ;
btVector3DoubleData m_gravity ;
2017-08-01 14:30:58 +02:00
} ;
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
struct btDynamicsWorldFloatData
{
2019-01-03 14:26:51 +01:00
btContactSolverInfoFloatData m_solverInfo ;
btVector3FloatData m_gravity ;
2017-08-01 14:30:58 +02:00
} ;
2019-01-03 14:26:51 +01:00
# endif //BT_DYNAMICS_WORLD_H