/*
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 BENCHMARK_DEMO_H
#define BENCHMARK_DEMO_H


#include "LinearMath/btAlignedObjectArray.h"
#include "LinearMath/btTransform.h"

class btDynamicsWorld;

#define NUMRAYS 500

class btRigidBody;
class btBroadphaseInterface;
class btCollisionShape;
class btOverlappingPairCache;
class btCollisionDispatcher;
class btConstraintSolver;
struct btCollisionAlgorithmCreateFunc;
class btDefaultCollisionConfiguration;

#ifndef USE_GLUT_DEMO_APPLICATION
///empty placeholder
class DemoApplication
{
protected:

	btDynamicsWorld* m_dynamicsWorld;
public:
	virtual void myinit() {}
	virtual btDynamicsWorld* getDynamicsWorld()
	{
		return m_dynamicsWorld;
	}

	btScalar	getDeltaTimeMicroseconds()
	{
		return 1.f;
	}

	void	renderme() {}
	void	setCameraDistance(btScalar dist){}
	void	clientResetScene(){}
	btRigidBody*	localCreateRigidBody(float mass, const btTransform& startTransform,btCollisionShape* shape);

};
///BenchmarkDemo is provides several performance tests
class BenchmarkDemo : public DemoApplication
#else
#include "GlutDemoApplication.h"
class BenchmarkDemo : public GlutDemoApplication
#endif


{

	//keep the collision shapes, for deletion/cleanup
	btAlignedObjectArray<btCollisionShape*>	m_collisionShapes;

	btAlignedObjectArray<class RagDoll*>	m_ragdolls;

	btBroadphaseInterface*	m_overlappingPairCache;

	btCollisionDispatcher*	m_dispatcher;

	btConstraintSolver*	m_solver;

	btDefaultCollisionConfiguration* m_collisionConfiguration;
	
	int	m_benchmark;

	void	createTest1();
	void	createTest2();
	void	createTest3();
	void	createTest4();
	void	createTest5();
	void	createTest6();
	void	createTest7();

	void createWall(const btVector3& offsetPosition,int stackSize,const btVector3& boxSize);
	void createPyramid(const btVector3& offsetPosition,int stackSize,const btVector3& boxSize);
	void createTowerCircle(const btVector3& offsetPosition,int stackSize,int rotSize,const btVector3& boxSize);
	void createLargeMeshBody();


	class SpuBatchRaycaster* m_batchRaycaster;
	class btThreadSupportInterface* m_batchRaycasterThreadSupport;

	void castRays();
	void initRays();

	public:

	BenchmarkDemo(int benchmark)
	:m_benchmark(benchmark)
	{
	}
	virtual ~BenchmarkDemo()
	{
		exitPhysics();
	}
	void	initPhysics();

	void	exitPhysics();

	virtual void clientMoveAndDisplay();

	virtual void displayCallback();
	


	
};

class BenchmarkDemo1 : public BenchmarkDemo
{
public:
	BenchmarkDemo1()
		:BenchmarkDemo(1)
	{
	}

	static DemoApplication* Create()
	{
		BenchmarkDemo1* demo = new BenchmarkDemo1;
		demo->myinit();
		demo->initPhysics();
		return demo;
	}
};

class BenchmarkDemo2 : public BenchmarkDemo
{
public:
	BenchmarkDemo2()
		:BenchmarkDemo(2)
	{
	}

	static DemoApplication* Create()
	{
		BenchmarkDemo2* demo = new BenchmarkDemo2;
		demo->myinit();
		demo->initPhysics();
		return demo;
	}
};

class BenchmarkDemo3 : public BenchmarkDemo
{
public:
	BenchmarkDemo3()
		:BenchmarkDemo(3)
	{
	}

	static DemoApplication* Create()
	{
		BenchmarkDemo3* demo = new BenchmarkDemo3;
		demo->myinit();
		demo->initPhysics();
		return demo;
	}
};

class BenchmarkDemo4 : public BenchmarkDemo
{
public:
	BenchmarkDemo4()
		:BenchmarkDemo(4)
	{
	}

	static DemoApplication* Create()
	{
		BenchmarkDemo4* demo = new BenchmarkDemo4;
		demo->myinit();
		demo->initPhysics();
		return demo;
	}
};


class BenchmarkDemo5 : public BenchmarkDemo
{
public:
	BenchmarkDemo5()
		:BenchmarkDemo(5)
	{
	}

	static DemoApplication* Create()
	{
		BenchmarkDemo5* demo = new BenchmarkDemo5;
		demo->myinit();
		demo->initPhysics();
		return demo;
	}
};


class BenchmarkDemo6 : public BenchmarkDemo
{
public:
	BenchmarkDemo6()
		:BenchmarkDemo(6)
	{
	}

	static DemoApplication* Create()
	{
		BenchmarkDemo6* demo = new BenchmarkDemo6;
		demo->myinit();
		demo->initPhysics();
		return demo;
	}
};

class BenchmarkDemo7 : public BenchmarkDemo
{
public:
	BenchmarkDemo7()
		:BenchmarkDemo(7)
	{
	}

	static DemoApplication* Create()
	{
		BenchmarkDemo7* demo = new BenchmarkDemo7;
		demo->myinit();
		demo->initPhysics();
		return demo;
	}
};

#endif //BENCHMARK_DEMO_H

