updated demos to show debug display with new AllBulletDemos (AllInOne),
added btDynamicsWorld::getWorldType
This commit is contained in:
@@ -24,6 +24,12 @@
|
|||||||
|
|
||||||
#include "DemoApplication.h"
|
#include "DemoApplication.h"
|
||||||
#include "DemoEntries.h"
|
#include "DemoEntries.h"
|
||||||
|
#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h"
|
||||||
|
|
||||||
|
#include "GLDebugDrawer.h"
|
||||||
|
|
||||||
|
static GLDebugDrawer gDebugDrawer;
|
||||||
|
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
@@ -42,8 +48,13 @@ namespace
|
|||||||
float viewX = 0.0f;
|
float viewX = 0.0f;
|
||||||
float viewY = 0.0f;
|
float viewY = 0.0f;
|
||||||
int tx, ty, tw, th;
|
int tx, ty, tw, th;
|
||||||
|
int gDrawAabb=0;
|
||||||
|
int gDebugDraw=0;
|
||||||
|
int gDebugContacts=0;
|
||||||
|
int gDebugNoDeactivation = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Resize(int w, int h)
|
void Resize(int w, int h)
|
||||||
{
|
{
|
||||||
width = w;
|
width = w;
|
||||||
@@ -61,6 +72,18 @@ void Resize(int w, int h)
|
|||||||
demo->reshape(w, h);
|
demo->reshape(w, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DemoApplication* CreatDemo(btDemoEntry* entry)
|
||||||
|
{
|
||||||
|
DemoApplication* demo = entry->createFcn();
|
||||||
|
btAssert(demo);
|
||||||
|
if (demo->getDynamicsWorld())
|
||||||
|
{
|
||||||
|
demo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer);
|
||||||
|
}
|
||||||
|
return demo;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/*b2Vec2 ConvertScreenToWorld(int x, int y)
|
/*b2Vec2 ConvertScreenToWorld(int x, int y)
|
||||||
{
|
{
|
||||||
b2Vec2 p;
|
b2Vec2 p;
|
||||||
@@ -91,6 +114,45 @@ void SimulationLoop()
|
|||||||
|
|
||||||
//test->SetTextLine(30);
|
//test->SetTextLine(30);
|
||||||
//test->Step(&settings);
|
//test->Step(&settings);
|
||||||
|
//sync debugging options
|
||||||
|
if (gDrawAabb)
|
||||||
|
{
|
||||||
|
demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawAabb);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawAabb));
|
||||||
|
}
|
||||||
|
if (gDebugDraw)
|
||||||
|
{
|
||||||
|
demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawWireframe);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawWireframe));
|
||||||
|
|
||||||
|
}
|
||||||
|
if (gDebugContacts)
|
||||||
|
{
|
||||||
|
demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawContactPoints);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawContactPoints));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gDebugNoDeactivation)
|
||||||
|
{
|
||||||
|
demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_NoDeactivation);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_NoDeactivation));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (demo->getDynamicsWorld()->getWorldType() == BT_DISCRETE_DYNAMICS_WORLD)
|
||||||
|
{
|
||||||
|
btDiscreteDynamicsWorld* discreteWorld = (btDiscreteDynamicsWorld*) demo->getDynamicsWorld();
|
||||||
|
discreteWorld->getSolverInfo().m_numIterations = iterationCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
demo->clientMoveAndDisplay();
|
demo->clientMoveAndDisplay();
|
||||||
|
|
||||||
|
|
||||||
@@ -103,7 +165,7 @@ void SimulationLoop()
|
|||||||
testIndex = testSelection;
|
testIndex = testSelection;
|
||||||
delete demo;
|
delete demo;
|
||||||
entry = g_demoEntries + testIndex;
|
entry = g_demoEntries + testIndex;
|
||||||
demo = entry->createFcn();
|
demo = CreatDemo(entry);
|
||||||
viewZoom = 20.0f;
|
viewZoom = 20.0f;
|
||||||
viewX = 0.0f;
|
viewX = 0.0f;
|
||||||
viewY = 0.0f;
|
viewY = 0.0f;
|
||||||
@@ -123,7 +185,7 @@ void Keyboard(unsigned char key, int x, int y)
|
|||||||
// Press 'r' to reset.
|
// Press 'r' to reset.
|
||||||
case 'r':
|
case 'r':
|
||||||
delete demo;
|
delete demo;
|
||||||
demo = entry->createFcn();
|
demo = CreatDemo(entry);
|
||||||
Resize(width,height);
|
Resize(width,height);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -170,7 +232,7 @@ int main(int argc, char** argv)
|
|||||||
//glutSetOption (GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS);
|
//glutSetOption (GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS);
|
||||||
|
|
||||||
entry = g_demoEntries + testIndex;
|
entry = g_demoEntries + testIndex;
|
||||||
demo = entry->createFcn();
|
demo = CreatDemo(entry);
|
||||||
|
|
||||||
glutDisplayFunc(SimulationLoop);
|
glutDisplayFunc(SimulationLoop);
|
||||||
GLUI_Master.set_glutReshapeFunc(Resize);
|
GLUI_Master.set_glutReshapeFunc(Resize);
|
||||||
@@ -193,22 +255,27 @@ int main(int argc, char** argv)
|
|||||||
glui->add_spinner("Iterations", GLUI_SPINNER_INT, &iterationCount);
|
glui->add_spinner("Iterations", GLUI_SPINNER_INT, &iterationCount);
|
||||||
iterationSpinner->set_int_limits(1, 100);
|
iterationSpinner->set_int_limits(1, 100);
|
||||||
|
|
||||||
GLUI_Spinner* hertzSpinner =
|
/* GLUI_Spinner* hertzSpinner =
|
||||||
glui->add_spinner("Hertz", GLUI_SPINNER_FLOAT, &hz);
|
glui->add_spinner("Hertz", GLUI_SPINNER_FLOAT, &hz);
|
||||||
hertzSpinner->set_float_limits(5.0f, 200.0f);
|
hertzSpinner->set_float_limits(5.0f, 200.0f);
|
||||||
|
*/
|
||||||
|
|
||||||
// glui->add_checkbox("Position Correction", &settings.enablePositionCorrection);
|
// glui->add_checkbox("Position Correction", &settings.enablePositionCorrection);
|
||||||
// glui->add_checkbox("Warm Starting", &settings.enablePositionCorrection);
|
// glui->add_checkbox("Warm Starting", &settings.enablePositionCorrection);
|
||||||
|
glui->add_checkbox("DisableDeactivation", &gDebugNoDeactivation);
|
||||||
|
|
||||||
glui->add_separator();
|
glui->add_separator();
|
||||||
|
|
||||||
GLUI_Panel* drawPanel = glui->add_panel("Draw");
|
GLUI_Panel* drawPanel = glui->add_panel("Draw");
|
||||||
// glui->add_checkbox_to_panel(drawPanel, "AABBs", &settings.drawAABBs);
|
|
||||||
// glui->add_checkbox_to_panel(drawPanel, "Pairs", &settings.drawPairs);
|
glui->add_checkbox_to_panel(drawPanel, "AABBs", &gDrawAabb);
|
||||||
// glui->add_checkbox_to_panel(drawPanel, "Contacts", &settings.drawContacts);
|
glui->add_checkbox_to_panel(drawPanel, "DebugDrawer", &gDebugDraw);
|
||||||
|
glui->add_checkbox_to_panel(drawPanel, "Contacts", &gDebugContacts);
|
||||||
|
|
||||||
// glui->add_checkbox_to_panel(drawPanel, "Impulses", &settings.drawImpulses);
|
// glui->add_checkbox_to_panel(drawPanel, "Impulses", &settings.drawImpulses);
|
||||||
// glui->add_checkbox_to_panel(drawPanel, "Statistics", &settings.drawStats);
|
// glui->add_checkbox_to_panel(drawPanel, "Statistics", &settings.drawStats);
|
||||||
|
|
||||||
|
|
||||||
int testCount = 0;
|
int testCount = 0;
|
||||||
btDemoEntry* e = g_demoEntries;
|
btDemoEntry* e = g_demoEntries;
|
||||||
while (e->createFcn)
|
while (e->createFcn)
|
||||||
|
|||||||
@@ -121,6 +121,9 @@ void BasicDemo::displayCallback(void) {
|
|||||||
void BasicDemo::initPhysics()
|
void BasicDemo::initPhysics()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
setCameraDistance(btScalar(50.));
|
||||||
|
|
||||||
|
|
||||||
btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
|
btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
|
||||||
|
|
||||||
#ifdef USE_PARALLEL_DISPATCHER
|
#ifdef USE_PARALLEL_DISPATCHER
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ int main(int argc,char** argv)
|
|||||||
|
|
||||||
BasicDemo ccdDemo;
|
BasicDemo ccdDemo;
|
||||||
ccdDemo.initPhysics();
|
ccdDemo.initPhysics();
|
||||||
ccdDemo.setCameraDistance(btScalar(50.));
|
|
||||||
|
|
||||||
#ifdef CHECK_MEMORY_LEAKS
|
#ifdef CHECK_MEMORY_LEAKS
|
||||||
ccdDemo.exitPhysics();
|
ccdDemo.exitPhysics();
|
||||||
|
|||||||
@@ -101,6 +101,8 @@ void BspDemo::initPhysics(char* bspfilename)
|
|||||||
m_cameraUp = btVector3(0,0,1);
|
m_cameraUp = btVector3(0,0,1);
|
||||||
m_forwardAxis = 1;
|
m_forwardAxis = 1;
|
||||||
|
|
||||||
|
setCameraDistance(22.f);
|
||||||
|
|
||||||
///Setup a Physics Simulation Environment
|
///Setup a Physics Simulation Environment
|
||||||
|
|
||||||
btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
|
btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ int main(int argc,char** argv)
|
|||||||
// Enrico: TODO: Should change parameter type of initPhysics() to std::string or at least const char *
|
// Enrico: TODO: Should change parameter type of initPhysics() to std::string or at least const char *
|
||||||
bspDemo->initPhysics((char*)bspfilename);
|
bspDemo->initPhysics((char*)bspfilename);
|
||||||
|
|
||||||
bspDemo->setCameraDistance(22.f);
|
|
||||||
|
|
||||||
return glutmain(argc, argv,640,480,"Bullet Quake BSP Physics Viewer http://bullet.sourceforge.net",bspDemo);
|
return glutmain(argc, argv,640,480,"Bullet Quake BSP Physics Viewer http://bullet.sourceforge.net",bspDemo);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,6 +63,8 @@ void drawLimit()
|
|||||||
|
|
||||||
void ConstraintDemo::initPhysics()
|
void ConstraintDemo::initPhysics()
|
||||||
{
|
{
|
||||||
|
setCameraDistance(26.f);
|
||||||
|
|
||||||
// btCollisionShape* groundShape = new btBoxShape(btVector3(50,3,50));
|
// btCollisionShape* groundShape = new btBoxShape(btVector3(50,3,50));
|
||||||
btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
|
btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
|
||||||
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
|
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ int main(int argc,char** argv)
|
|||||||
|
|
||||||
constraintDemo->initPhysics();
|
constraintDemo->initPhysics();
|
||||||
|
|
||||||
constraintDemo->setCameraDistance(26.f);
|
|
||||||
|
|
||||||
return glutmain(argc, argv,640,480,"Constraint Demo. http://www.continuousphysics.com/Bullet/phpBB2/",constraintDemo);
|
return glutmain(argc, argv,640,480,"Constraint Demo. http://www.continuousphysics.com/Bullet/phpBB2/",constraintDemo);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,6 +66,8 @@ GLDebugDrawer debugDrawer;
|
|||||||
|
|
||||||
void ConvexDecompositionDemo::initPhysics(const char* filename)
|
void ConvexDecompositionDemo::initPhysics(const char* filename)
|
||||||
{
|
{
|
||||||
|
setCameraDistance(26.f);
|
||||||
|
|
||||||
ConvexDecomposition::WavefrontObj wo;
|
ConvexDecomposition::WavefrontObj wo;
|
||||||
|
|
||||||
tcount = wo.loadObj(filename);
|
tcount = wo.loadObj(filename);
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ int main(int argc,char** argv)
|
|||||||
|
|
||||||
convexDecompDemo->clientResetScene();
|
convexDecompDemo->clientResetScene();
|
||||||
|
|
||||||
convexDecompDemo->setCameraDistance(26.f);
|
|
||||||
|
|
||||||
return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://www.continuousphysics.com/Bullet/phpBB2/",convexDecompDemo);
|
return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://www.continuousphysics.com/Bullet/phpBB2/",convexDecompDemo);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -405,6 +405,9 @@ btCollisionShape * GimpactConcaveDemo::createBunnyShape()
|
|||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
void GimpactConcaveDemo::initPhysics()
|
void GimpactConcaveDemo::initPhysics()
|
||||||
{
|
{
|
||||||
|
setCameraDistance(45.f);
|
||||||
|
|
||||||
|
|
||||||
gContactAddedCallback = CustomMaterialCombinerCallback;
|
gContactAddedCallback = CustomMaterialCombinerCallback;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ int main(int argc,char** argv)
|
|||||||
|
|
||||||
GimpactConcaveDemo* concaveDemo = new GimpactConcaveDemo(); /// This will not be Deleted!!!
|
GimpactConcaveDemo* concaveDemo = new GimpactConcaveDemo(); /// This will not be Deleted!!!
|
||||||
concaveDemo->initPhysics();
|
concaveDemo->initPhysics();
|
||||||
concaveDemo->setCameraDistance(45.f);
|
|
||||||
|
|
||||||
return glutmain(argc, argv,640,480,"DevO,s GIMPACT Test Demo",concaveDemo);
|
return glutmain(argc, argv,640,480,"DevO,s GIMPACT Test Demo",concaveDemo);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,7 +60,8 @@ void DrawRasterizerLine(float const* , float const*, int)
|
|||||||
|
|
||||||
void LinearConvexCastDemo::initPhysics()
|
void LinearConvexCastDemo::initPhysics()
|
||||||
{
|
{
|
||||||
setCameraDistance(30.f);
|
|
||||||
|
setCameraDistance(50.f);
|
||||||
tr[0].setOrigin(btVector3(0,0,0));
|
tr[0].setOrigin(btVector3(0,0,0));
|
||||||
tr[1].setOrigin(btVector3(0,10,0));
|
tr[1].setOrigin(btVector3(0,10,0));
|
||||||
|
|
||||||
|
|||||||
@@ -372,6 +372,14 @@ void DemoApplication::keyboardCallback(unsigned char key, int x, int y)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DemoApplication::setDebugMode(int mode)
|
||||||
|
{
|
||||||
|
m_debugMode = mode;
|
||||||
|
if (getDynamicsWorld() && getDynamicsWorld()->getDebugDrawer())
|
||||||
|
getDynamicsWorld()->getDebugDrawer()->setDebugMode(mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void DemoApplication::specialKeyboardUp(int key, int x, int y)
|
void DemoApplication::specialKeyboardUp(int key, int x, int y)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -100,10 +100,7 @@ public:
|
|||||||
return m_debugMode ;
|
return m_debugMode ;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setDebugMode(int mode)
|
void setDebugMode(int mode);
|
||||||
{
|
|
||||||
m_debugMode = mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void setCameraUp(const btVector3& camUp)
|
void setCameraUp(const btVector3& camUp)
|
||||||
|
|||||||
@@ -307,6 +307,8 @@ void RagdollDemo::initPhysics()
|
|||||||
{
|
{
|
||||||
// Setup the basic world
|
// Setup the basic world
|
||||||
|
|
||||||
|
setCameraDistance(btScalar(5.));
|
||||||
|
|
||||||
btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
|
btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
|
||||||
|
|
||||||
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
|
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ int main(int argc,char* argv[])
|
|||||||
RagdollDemo demoApp;
|
RagdollDemo demoApp;
|
||||||
|
|
||||||
demoApp.initPhysics();
|
demoApp.initPhysics();
|
||||||
demoApp.setCameraDistance(btScalar(10.));
|
|
||||||
|
|
||||||
return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bullet.sf.net",&demoApp);
|
return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bullet.sf.net",&demoApp);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -541,11 +541,13 @@ void VehicleDemo::specialKeyboard(int key, int x, int y)
|
|||||||
case GLUT_KEY_UP :
|
case GLUT_KEY_UP :
|
||||||
{
|
{
|
||||||
gEngineForce = maxEngineForce;
|
gEngineForce = maxEngineForce;
|
||||||
|
gBreakingForce = 0.f;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GLUT_KEY_DOWN :
|
case GLUT_KEY_DOWN :
|
||||||
{
|
{
|
||||||
gBreakingForce = maxBreakingForce;
|
gBreakingForce = maxBreakingForce;
|
||||||
|
gEngineForce = 0.f;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -36,6 +36,11 @@ class btContinuousDynamicsWorld : public btDiscreteDynamicsWorld
|
|||||||
|
|
||||||
virtual void calculateTimeOfImpacts(btScalar timeStep);
|
virtual void calculateTimeOfImpacts(btScalar timeStep);
|
||||||
|
|
||||||
|
virtual btDynamicsWorldType getWorldType() const
|
||||||
|
{
|
||||||
|
return BT_CONTINUOUS_DYNAMICS_WORLD;
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //BT_CONTINUOUS_DYNAMICS_WORLD_H
|
#endif //BT_CONTINUOUS_DYNAMICS_WORLD_H
|
||||||
|
|||||||
@@ -153,6 +153,11 @@ public:
|
|||||||
return m_solverInfo;
|
return m_solverInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual btDynamicsWorldType getWorldType() const
|
||||||
|
{
|
||||||
|
return BT_DISCRETE_DYNAMICS_WORLD;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,13 @@ class btRaycastVehicle;
|
|||||||
class btConstraintSolver;
|
class btConstraintSolver;
|
||||||
|
|
||||||
|
|
||||||
|
enum btDynamicsWorldType
|
||||||
|
{
|
||||||
|
BT_SIMPLE_DYNAMICS_WORLD=1,
|
||||||
|
BT_DISCRETE_DYNAMICS_WORLD=2,
|
||||||
|
BT_CONTINUOUS_DYNAMICS_WORLD=3
|
||||||
|
};
|
||||||
|
|
||||||
///btDynamicsWorld is the baseclass for several dynamics implementation, basic, discrete, parallel, and continuous
|
///btDynamicsWorld is the baseclass for several dynamics implementation, basic, discrete, parallel, and continuous
|
||||||
class btDynamicsWorld : public btCollisionWorld
|
class btDynamicsWorld : public btCollisionWorld
|
||||||
{
|
{
|
||||||
@@ -74,6 +81,8 @@ class btDynamicsWorld : public btCollisionWorld
|
|||||||
|
|
||||||
virtual const btTypedConstraint* getConstraint(int index) const { (void)index; return 0; }
|
virtual const btTypedConstraint* getConstraint(int index) const { (void)index; return 0; }
|
||||||
|
|
||||||
|
virtual btDynamicsWorldType getWorldType() const=0;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //BT_DYNAMICS_WORLD_H
|
#endif //BT_DYNAMICS_WORLD_H
|
||||||
|
|||||||
@@ -79,6 +79,11 @@ public:
|
|||||||
|
|
||||||
virtual btConstraintSolver* getConstraintSolver();
|
virtual btConstraintSolver* getConstraintSolver();
|
||||||
|
|
||||||
|
virtual btDynamicsWorldType getWorldType() const
|
||||||
|
{
|
||||||
|
return BT_SIMPLE_DYNAMICS_WORLD;
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //BT_SIMPLE_DYNAMICS_WORLD_H
|
#endif //BT_SIMPLE_DYNAMICS_WORLD_H
|
||||||
|
|||||||
Reference in New Issue
Block a user