/*
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
typedef void (*btInternalTickCallback)(btDynamicsWorld *world, btScalar timeStep);

enum btDynamicsWorldType
{
	BT_SIMPLE_DYNAMICS_WORLD=1,
	BT_DISCRETE_DYNAMICS_WORLD=2,
	BT_CONTINUOUS_DYNAMICS_WORLD=3
};

///The btDynamicsWorld is the interface class for several dynamics implementation, basic, discrete, parallel, and continuous etc.
class btDynamicsWorld : public btCollisionWorld
{

protected:
		btInternalTickCallback m_internalTickCallback;
		btInternalTickCallback m_internalPreTickCallback;
		void*	m_worldUserInfo;

		btContactSolverInfo	m_solverInfo;

public:
		

		btDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* broadphase,btCollisionConfiguration* collisionConfiguration)
		:btCollisionWorld(dispatcher,broadphase,collisionConfiguration), m_internalTickCallback(0),m_internalPreTickCallback(0), m_worldUserInfo(0)
		{
		}

		virtual ~btDynamicsWorld()
		{
		}
		
		///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;
			
		virtual void	debugDrawWorld() = 0;
				
		virtual void	addConstraint(btTypedConstraint* constraint, bool disableCollisionsBetweenLinkedBodies=false) 
		{ 
			(void)constraint; (void)disableCollisionsBetweenLinkedBodies;
		}

		virtual void	removeConstraint(btTypedConstraint* constraint) {(void)constraint;}

		virtual void	addAction(btActionInterface* action) = 0;

		virtual void	removeAction(btActionInterface* action) = 0;

		//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;

		virtual void	synchronizeMotionStates() = 0;

		virtual void	addRigidBody(btRigidBody* body) = 0;

		virtual void	removeRigidBody(btRigidBody* body) = 0;

		virtual void	setConstraintSolver(btConstraintSolver* solver) = 0;

		virtual btConstraintSolver* getConstraintSolver() = 0;
		
		virtual	int		getNumConstraints() const {	return 0;		}
		
		virtual btTypedConstraint* getConstraint(int index)		{	(void)index;		return 0;		}
		
		virtual const btTypedConstraint* getConstraint(int index) const	{	(void)index;	return 0;	}

		virtual btDynamicsWorldType	getWorldType() const=0;

		virtual void	clearForces() = 0;

		/// 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)
			{
				m_internalPreTickCallback = cb;
			} else
			{
				m_internalTickCallback = cb; 
			}
			m_worldUserInfo = worldUserInfo;
		}

		void	setWorldUserInfo(void* worldUserInfo)
		{
			m_worldUserInfo = worldUserInfo;
		}

		void*	getWorldUserInfo() const
		{
			return m_worldUserInfo;
		}

		btContactSolverInfo& getSolverInfo()
		{
			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;}


};

#endif //BT_DYNAMICS_WORLD_H


