#include "SerializeSetup.h"
#include "../Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.h"


#include "../CommonInterfaces/CommonRigidBodyBase.h"

class SerializeSetup : public CommonRigidBodyBase
{
	
	char m_fileName[1024];

public:
	SerializeSetup(struct GUIHelperInterface* helper, const char* fileName);
	virtual ~SerializeSetup();
	
	virtual void initPhysics();
	virtual void stepSimulation(float deltaTime);
	virtual void setFileName(const char* fileName)
	{
		memcpy(m_fileName,fileName,strlen(fileName)+1);
	}
	virtual void resetCamera()
	{
		float dist = 9.5;
		float pitch = -2.8;
		float yaw = 20;
		float targetPos[3]={-0.2,-1.4,3.5};
		m_guiHelper->resetCamera(dist,pitch,yaw,targetPos[0],targetPos[1],targetPos[2]);
	}

};


SerializeSetup::SerializeSetup(struct GUIHelperInterface* helper, const char* fileName)
:CommonRigidBodyBase(helper)
{
	if (fileName)
	{
		setFileName(fileName);
	} else
	{
		setFileName("spider.bullet");
	}
}
SerializeSetup::~SerializeSetup()
{

}

void SerializeSetup::initPhysics()
{
    this->createEmptyDynamicsWorld();
   m_guiHelper->createPhysicsDebugDrawer(m_dynamicsWorld);
    m_dynamicsWorld->getDebugDrawer()->setDebugMode(btIDebugDraw::DBG_DrawWireframe+btIDebugDraw::DBG_DrawContactPoints);
    btBulletWorldImporter* importer = new btBulletWorldImporter(m_dynamicsWorld);
	

    const char* prefix[]={"","./","./data/","../data/","../../data/","../../../data/","../../../../data/"};
        int numPrefixes = sizeof(prefix)/sizeof(const char*);
        char relativeFileName[1024];
        FILE* f=0;

        for (int i=0;!f && i<numPrefixes;i++)
        {
                sprintf(relativeFileName,"%s%s",prefix[i],m_fileName);
                f = fopen(relativeFileName,"rb");
                if (f)
                {
                    break;
                }
        }
        if (f)
        {
                fclose(f);
        }


    importer->loadFile(relativeFileName);

	//for now, guess the up axis from gravity
	if (m_dynamicsWorld->getGravity()[1] == 0.f)
	{
		m_guiHelper->setUpAxis(2);
	} else
	{
		m_guiHelper->setUpAxis(1);
	}


	//example code to export the dynamics world to a .bullet file


	btDefaultSerializer*	serializer = new btDefaultSerializer();
	m_dynamicsWorld->serialize(serializer);

	FILE* file = fopen("SerializeSetupTestFile.bullet","wb");
	fwrite(serializer->getBufferPointer(),serializer->getCurrentBufferSize(),1, file);
	fclose(file);

	


	m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld);
}

void SerializeSetup::stepSimulation(float deltaTime)
{
    CommonRigidBodyBase::stepSimulation(deltaTime);
}

class CommonExampleInterface*    SerializeBulletCreateFunc(struct CommonExampleOptions& options)
{
	return new SerializeSetup(options.m_guiHelper, options.m_fileName);
}
