#ifndef PHYSICS_COMMAND_PROCESSOR_INTERFACE_H
#define PHYSICS_COMMAND_PROCESSOR_INTERFACE_H

enum PhysicsCommandRenderFlags
{
	COV_DISABLE_SYNC_RENDERING=1
};

class PhysicsCommandProcessorInterface
{

public:
	virtual ~PhysicsCommandProcessorInterface() {}

	virtual bool connect()=0;

	virtual void disconnect() = 0;

	virtual bool isConnected() const = 0;

	virtual bool processCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes) = 0;

	virtual bool receiveStatus(struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes) = 0;

	virtual void renderScene(int renderFlags) = 0;
	virtual void   physicsDebugDraw(int debugDrawFlags) = 0;
	virtual void setGuiHelper(struct GUIHelperInterface* guiHelper) = 0;
	virtual void setTimeOut(double timeOutInSeconds) = 0;

};


class btVector3;
class btQuaternion;

class CommandProcessorInterface : public PhysicsCommandProcessorInterface
{

public:
	virtual ~CommandProcessorInterface(){}

	virtual void syncPhysicsToGraphics()=0;
	virtual void stepSimulationRealTime(double dtInSec,const struct b3VRControllerEvent* vrEvents, int numVREvents, const struct b3KeyboardEvent* keyEvents, int numKeyEvents)=0;
	virtual void enableRealTimeSimulation(bool enableRealTimeSim)=0;
	virtual bool isRealTimeSimulationEnabled() const=0;

	virtual void enableCommandLogging(bool enable, const char* fileName)=0;
	virtual void replayFromLogFile(const char* fileName)=0;
	virtual void replayLogCommand(char* bufferServerToClient, int bufferSizeInBytes )=0;

	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 const btVector3& getVRTeleportPosition() const=0;
	virtual void setVRTeleportPosition(const btVector3& vrReleportPos)=0;

	virtual const btQuaternion& getVRTeleportOrientation() const=0;
	virtual void setVRTeleportOrientation(const btQuaternion& vrReleportOrn)=0;
};

#endif //PHYSICS_COMMAND_PROCESSOR_INTERFACE_H
