
#ifndef COMMON_PHYSICS_SETUP_H
#define COMMON_PHYSICS_SETUP_H

class btRigidBody;
class btCollisionObject;
class btBoxShape;
class btTransform;
class btCollisionShape;
#include "LinearMath/btVector3.h"
#include "CommonParameterInterface.h"

class btDiscreteDynamicsWorld;

///The Bullet 2 GraphicsPhysicsBridge let's the graphics engine create graphics representation and synchronize
struct GraphicsPhysicsBridge
{
	virtual ~GraphicsPhysicsBridge() {}

	virtual void createRigidBodyGraphicsObject(btRigidBody* body,const btVector3& color)
	{
	}

	virtual void createCollisionObjectGraphicsObject(btCollisionObject* obj,const btVector3& color)
	{
	}
	virtual void createCollisionShapeGraphicsObject(btCollisionShape* collisionShape)
	{
	}
	virtual void syncPhysicsToGraphics(const btDiscreteDynamicsWorld* rbWorld)
	{
	}
	virtual void createPhysicsDebugDrawer( btDiscreteDynamicsWorld* rbWorld)
	{
	}

	virtual int registerGraphicsShape(const float* vertices, int numvertices, const int* indices, int numIndices) { return -1; }//, int primitiveType = B3_GL_TRIANGLES, int textureIndex = -1);

	virtual int registerGraphicsInstance(int shapeIndex, const float* position, const float* quaternion, const float* color, const float* scaling) { return -1;}

	virtual struct Common2dCanvasInterface* get2dCanvasInterface()
	{
		return 0;
	}
	
	virtual CommonParameterInterface* getParameterInterface()
	{
		return 0;
	}

	virtual struct CommonRenderInterface* getRenderInterface()
	{
		return 0;
	}
	virtual void setUpAxis(int axis)
	{
	}

	virtual void autogenerateGraphicsObjects(btDiscreteDynamicsWorld* rbWorld) 
	{
	}
    
    virtual void drawText3D( const char* txt, float posX, float posZY, float posZ, float size)
    {
        
    }
};

///Bullet 2 specific physics setup, that allows to share code between old and new demo frameworks
struct CommonPhysicsSetup
{
public:

	virtual ~CommonPhysicsSetup() {}

	virtual void initPhysics(GraphicsPhysicsBridge& gfxBridge) = 0;

	virtual void exitPhysics()=0;

	virtual void stepSimulation(float deltaTime)=0;

    virtual void    debugDraw(int debugDrawFlags)=0;

	virtual void renderScene(GraphicsPhysicsBridge& gfxBridge){};
	
	virtual bool pickBody(const btVector3& rayFromWorld, const btVector3& rayToWorld) = 0;
	virtual bool movePickedBody(const btVector3& rayFromWorld, const btVector3& rayToWorld)=0;
	virtual void removePickingConstraint() = 0;

	virtual void syncPhysicsToGraphics(GraphicsPhysicsBridge& gfxBridge) = 0;
/*
	virtual btRigidBody*	createRigidBody(float mass, const btTransform& startTransform,btCollisionShape* shape, const btVector4& color=btVector4(1,0,0,1))=0;

	virtual btBoxShape* createBoxShape(const btVector3& halfExtents)=0;
 */
};



#endif //COMMON_PHYSICS_SETUP_H


