demo for testing GIMPACT 0.3, thanks to Francisco Leon for the update. GIMPACT demo/build system will be fixed today.
This commit is contained in:
@@ -16,14 +16,16 @@ subject to the following restrictions:
|
||||
#include "btBulletDynamicsCommon.h"
|
||||
#include "GimpactTestDemo.h"
|
||||
|
||||
#define SHOW_NUM_DEEP_PENETRATIONS
|
||||
|
||||
#include "LinearMath/btDefaultMotionState.h"
|
||||
#include "LinearMath/btIDebugDraw.h"
|
||||
#include "LinearMath/btQuickprof.h"
|
||||
#include "LinearMath/btDefaultMotionState.h"
|
||||
|
||||
/// Including GIMPACT here
|
||||
#include "GIMPACT/Bullet/btGImpactShape.h"
|
||||
#include "GIMPACT/Bullet/btGImpactCollisionAlgorithm.h"
|
||||
|
||||
|
||||
|
||||
#include "BMF_Api.h"
|
||||
|
||||
@@ -32,10 +34,17 @@ subject to the following restrictions:
|
||||
#include "GL_ShapeDrawer.h"
|
||||
#include "GlutStuff.h"
|
||||
|
||||
/// Include Torus Mesh here
|
||||
/// Include Torus Mesh here
|
||||
#include "TorusMesh.h"
|
||||
#include "BunnyMesh.h"
|
||||
|
||||
#ifdef SHOW_NUM_DEEP_PENETRATIONS
|
||||
extern int gNumDeepPenetrationChecks;
|
||||
extern int gNumGjkChecks;
|
||||
#endif //
|
||||
|
||||
|
||||
|
||||
GLDebugDrawer debugDrawer;
|
||||
//Real dts = 0.000001f;
|
||||
Real dts = 1.0 / 60.0;
|
||||
@@ -43,10 +52,10 @@ Real dts = 1.0 / 60.0;
|
||||
|
||||
///**************************************************************************************
|
||||
/// GIMPACT Test Demo made by DevO
|
||||
///
|
||||
///
|
||||
///**************************************************************************************
|
||||
|
||||
#define TEST_GIMPACT_TORUS
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
///User can override this material combiner by implementing gContactAddedCallback and setting body0->m_collisionFlags |= btCollisionObject::customMaterialCallback;
|
||||
@@ -130,7 +139,7 @@ void GimpactConcaveDemo::renderme()
|
||||
{
|
||||
updateCamera();
|
||||
|
||||
|
||||
|
||||
btScalar m[16];
|
||||
|
||||
if (m_dynamicsWorld)
|
||||
@@ -255,6 +264,21 @@ void GimpactConcaveDemo::renderme()
|
||||
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
|
||||
yStart += yIncr;
|
||||
|
||||
#ifdef SHOW_NUM_DEEP_PENETRATIONS
|
||||
|
||||
glRasterPos3f(xOffset,yStart,0);
|
||||
sprintf(buf,"gNumDeepPenetrationChecks = %d",gNumDeepPenetrationChecks);
|
||||
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
|
||||
yStart += yIncr;
|
||||
|
||||
glRasterPos3f(xOffset,yStart,0);
|
||||
sprintf(buf,"gNumGjkChecks= %d",gNumGjkChecks);
|
||||
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
|
||||
yStart += yIncr;
|
||||
|
||||
#endif //SHOW_NUM_DEEP_PENETRATIONS
|
||||
|
||||
|
||||
resetPerspectiveProjection();
|
||||
|
||||
|
||||
@@ -274,11 +298,29 @@ void GimpactConcaveDemo::initGImpactCollision()
|
||||
NUM_VERTICES,
|
||||
(Real*) &gVertices[0],sizeof(Real)*3);
|
||||
|
||||
btGImpactMeshShape * trimesh = new btGImpactMeshShape(m_indexVertexArrays);
|
||||
trimesh->setLocalScaling(btVector3(1.f,1.f,1.f));
|
||||
trimesh->updateBound();
|
||||
trimesh->setMargin(0.01); ///?????
|
||||
#ifdef BULLET_GIMPACT
|
||||
#ifdef BULLET_GIMPACT_CONVEX_DECOMPOSITION
|
||||
btGImpactConvexDecompositionShape * trimesh = new
|
||||
btGImpactConvexDecompositionShape(
|
||||
m_indexVertexArrays, btVector3(1.f,1.f,1.f),btScalar(0.01));
|
||||
trimesh->updateBound();
|
||||
#else
|
||||
btGImpactMeshShape * trimesh = new btGImpactMeshShape(m_indexVertexArrays);
|
||||
trimesh->setLocalScaling(btVector3(1.f,1.f,1.f));
|
||||
#ifdef BULLET_TRIANGLE_COLLISION
|
||||
trimesh->setMargin(0.07f); ///?????
|
||||
#else
|
||||
trimesh->setMargin(0.0f);
|
||||
#endif
|
||||
trimesh->updateBound();
|
||||
#endif
|
||||
|
||||
m_trimeshShape = trimesh;
|
||||
|
||||
#else
|
||||
m_trimeshShape = new btGIMPACTMeshData(m_indexVertexArrays);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
/// Create Bunny Shape
|
||||
@@ -289,32 +331,73 @@ void GimpactConcaveDemo::initGImpactCollision()
|
||||
3*sizeof(int),
|
||||
BUNNY_NUM_VERTICES,
|
||||
(Real*) &gVerticesBunny[0],sizeof(Real)*3);
|
||||
#ifdef BULLET_GIMPACT
|
||||
|
||||
#ifdef BULLET_GIMPACT_CONVEX_DECOMPOSITION
|
||||
btGImpactConvexDecompositionShape * trimesh2 = new
|
||||
btGImpactConvexDecompositionShape(
|
||||
m_indexVertexArrays2, btVector3(4.f,4.f,4.f),btScalar(0.01));
|
||||
trimesh2->updateBound();
|
||||
#else
|
||||
btGImpactMeshShape * trimesh2 = new btGImpactMeshShape(m_indexVertexArrays2);
|
||||
trimesh2->setLocalScaling(btVector3(4.f,4.f,4.f));
|
||||
#ifdef BULLET_TRIANGLE_COLLISION
|
||||
trimesh2->setMargin(0.07f); ///?????
|
||||
#else
|
||||
trimesh2->setMargin(0.0f);
|
||||
#endif
|
||||
trimesh2->updateBound();
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
btGImpactMeshShape * trimesh2 = new btGImpactMeshShape(m_indexVertexArrays2);
|
||||
trimesh2->setLocalScaling(btVector3(4.f,4.f,4.f));
|
||||
trimesh2->updateBound();
|
||||
trimesh2->setMargin(0.01); ///?????
|
||||
m_trimeshShape2 = trimesh2;
|
||||
#else
|
||||
m_trimeshShape2 = new btGIMPACTMeshData(m_indexVertexArrays2);
|
||||
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
///register GIMPACT algorithm
|
||||
btCollisionDispatcher * dispatcher = static_cast<btCollisionDispatcher *>(m_dynamicsWorld ->getDispatcher());
|
||||
{
|
||||
//btGImpactCollisionAlgorithm::registerAlgorithm(dispatcher); /// Register GIMPACT !!!
|
||||
if(!m_gimpactCollisionCreateFunc) m_gimpactCollisionCreateFunc = new btGImpactCollisionAlgorithm::CreateFunc; /// NEW
|
||||
|
||||
for (GUINT i = 0;i < MAX_BROADPHASE_COLLISION_TYPES ;i++ )
|
||||
{
|
||||
m_dispatcher->registerCollisionCreateFunc(GIMPACT_SHAPE_PROXYTYPE,i ,m_gimpactCollisionCreateFunc);
|
||||
}
|
||||
for (GUINT i = 0;i < MAX_BROADPHASE_COLLISION_TYPES ;i++ )
|
||||
{
|
||||
m_dispatcher->registerCollisionCreateFunc(i,GIMPACT_SHAPE_PROXYTYPE ,m_gimpactCollisionCreateFunc);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef BULLET_GIMPACT
|
||||
btGImpactCollisionAlgorithm::registerAlgorithm(dispatcher);
|
||||
#else
|
||||
btConcaveConcaveCollisionAlgorithm::registerAlgorithm(dispatcher);
|
||||
#endif
|
||||
|
||||
// {
|
||||
// //btGImpactCollisionAlgorithm::registerAlgorithm(dispatcher); /// Register GIMPACT !!!
|
||||
// if(!m_gimpactCollisionCreateFunc) m_gimpactCollisionCreateFunc = new btGImpactCollisionAlgorithm::CreateFunc; /// NEW
|
||||
//
|
||||
// for (int i = 0;i < MAX_BROADPHASE_COLLISION_TYPES ;i++ )
|
||||
// {
|
||||
// m_dispatcher->registerCollisionCreateFunc(GIMPACT_SHAPE_PROXYTYPE,i ,m_gimpactCollisionCreateFunc);
|
||||
// }
|
||||
// for (int i = 0;i < MAX_BROADPHASE_COLLISION_TYPES ;i++ )
|
||||
// {
|
||||
// m_dispatcher->registerCollisionCreateFunc(i,GIMPACT_SHAPE_PROXYTYPE ,m_gimpactCollisionCreateFunc);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
#ifndef BULLET_GIMPACT
|
||||
btCollisionShape * GimpactConcaveDemo::createTorusShape()
|
||||
{
|
||||
btGIMPACTMeshShape * newtrimeshShape = new btGIMPACTMeshShape(m_trimeshShape);
|
||||
newtrimeshShape->setLocalScaling(btVector3(1.f,1.f,1.f));
|
||||
return newtrimeshShape;
|
||||
}
|
||||
btCollisionShape * GimpactConcaveDemo::createBunnyShape()
|
||||
{
|
||||
btGIMPACTMeshShape * newtrimeshShape = new btGIMPACTMeshShape(m_trimeshShape2);
|
||||
newtrimeshShape->setLocalScaling(btVector3(4.f,4.f,4.f));
|
||||
return newtrimeshShape;
|
||||
}
|
||||
#endif
|
||||
//------------------------------------------------------------------------------
|
||||
void GimpactConcaveDemo::initPhysics()
|
||||
{
|
||||
@@ -325,7 +408,7 @@ void GimpactConcaveDemo::initPhysics()
|
||||
//btOverlappingPairCache* broadphase = new btSimpleBroadphase();
|
||||
//m_broadphase = new btSimpleBroadphase();
|
||||
|
||||
int maxProxies = 1024;
|
||||
LONG maxProxies = 1024;
|
||||
btVector3 worldAabbMin(-10000,-10000,-10000);
|
||||
btVector3 worldAabbMax( 10000, 10000, 10000);
|
||||
m_broadphase = new bt32BitAxisSweep3(worldAabbMin,worldAabbMax,maxProxies);
|
||||
@@ -365,7 +448,7 @@ void GimpactConcaveDemo::initPhysics()
|
||||
startTransform.setOrigin(btVector3(0,15,-200));
|
||||
staticScenario->addChildShape(startTransform,staticboxShape5);
|
||||
|
||||
startTransform.setOrigin(btVector3(0,-10,0));
|
||||
startTransform.setOrigin(btVector3(0,0,0));
|
||||
|
||||
btRigidBody* staticBody = localCreateRigidBody(mass, startTransform,staticScenario);
|
||||
|
||||
@@ -377,29 +460,47 @@ void GimpactConcaveDemo::initPhysics()
|
||||
|
||||
|
||||
//static plane
|
||||
/*
|
||||
btVector3 normal(0.4,1.5,-0.4);
|
||||
|
||||
btVector3 normal(-0.5,0.5,0.0);
|
||||
normal.normalize();
|
||||
btCollisionShape* staticplaneShape6 = new btStaticPlaneShape(normal,0.0);// A plane
|
||||
|
||||
startTransform.setOrigin(btVector3(0,-20,0));
|
||||
startTransform.setOrigin(btVector3(0,-9,0));
|
||||
|
||||
btRigidBody* staticBody2 = localCreateRigidBody(mass, startTransform,staticplaneShape6 );
|
||||
|
||||
staticBody2->setCollisionFlags(staticBody2->getCollisionFlags()|btCollisionObject::CF_STATIC_OBJECT);
|
||||
staticBody2->setActivationState(ISLAND_SLEEPING);
|
||||
*/
|
||||
|
||||
|
||||
//another static plane
|
||||
|
||||
normal.setValue(0.5,0.7,0.0);
|
||||
//normal.normalize();
|
||||
btCollisionShape* staticplaneShape7 = new btStaticPlaneShape(normal,0.0);// A plane
|
||||
|
||||
startTransform.setOrigin(btVector3(0,-10,0));
|
||||
|
||||
staticBody2 = localCreateRigidBody(mass, startTransform,staticplaneShape7 );
|
||||
|
||||
staticBody2->setCollisionFlags(staticBody2->getCollisionFlags()|btCollisionObject::CF_STATIC_OBJECT);
|
||||
staticBody2->setActivationState(ISLAND_SLEEPING);
|
||||
|
||||
|
||||
/// Create Static Torus
|
||||
float height = 32;
|
||||
float height = 28;
|
||||
float step = 2.5;
|
||||
float massT = 1.0;
|
||||
|
||||
startTransform.setOrigin(btVector3(0,height,-5));
|
||||
startTransform.setRotation(btQuaternion(3.14159265*0.5,0,3.14159265*0.5));
|
||||
#ifdef BULLET_GIMPACT
|
||||
kinematicTorus = localCreateRigidBody(0.0, startTransform,m_trimeshShape);
|
||||
//kinematicTorus->setCollisionFlags(kinematicTorus->getCollisionFlags()|btCollisionObject::CF_STATIC_OBJECT);
|
||||
|
||||
#else
|
||||
kinematicTorus = localCreateRigidBody(0.0, startTransform,createTorusShape());
|
||||
|
||||
#endif //kinematicTorus->setCollisionFlags(kinematicTorus->getCollisionFlags()|btCollisionObject::CF_STATIC_OBJECT);
|
||||
//kinematicTorus->setActivationState(ISLAND_SLEEPING);
|
||||
|
||||
kinematicTorus->setCollisionFlags( kinematicTorus->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
|
||||
@@ -411,12 +512,14 @@ void GimpactConcaveDemo::initPhysics()
|
||||
|
||||
#ifdef TEST_GIMPACT_TORUS
|
||||
|
||||
#ifdef BULLET_GIMPACT
|
||||
/// Create dynamic Torus
|
||||
for (int i=0;i<8;i++)
|
||||
for (int i=0;i<6;i++)
|
||||
{
|
||||
height -= step;
|
||||
startTransform.setOrigin(btVector3(0,height,-5));
|
||||
startTransform.setRotation(btQuaternion(0,0,3.14159265*0.5));
|
||||
|
||||
btRigidBody* bodyA = localCreateRigidBody(massT, startTransform,m_trimeshShape);
|
||||
|
||||
height -= step;
|
||||
@@ -425,6 +528,24 @@ void GimpactConcaveDemo::initPhysics()
|
||||
btRigidBody* bodyB = localCreateRigidBody(massT, startTransform,m_trimeshShape);
|
||||
|
||||
}
|
||||
#else
|
||||
|
||||
/// Create dynamic Torus
|
||||
for (int i=0;i<6;i++)
|
||||
{
|
||||
height -= step;
|
||||
startTransform.setOrigin(btVector3(0,height,-5));
|
||||
startTransform.setRotation(btQuaternion(0,0,3.14159265*0.5));
|
||||
|
||||
btRigidBody* bodyA = localCreateRigidBody(massT, startTransform,createTorusShape());
|
||||
|
||||
height -= step;
|
||||
startTransform.setOrigin(btVector3(0,height,-5));
|
||||
startTransform.setRotation(btQuaternion(3.14159265*0.5,0,3.14159265*0.5));
|
||||
btRigidBody* bodyB = localCreateRigidBody(massT, startTransform,createTorusShape());
|
||||
|
||||
}
|
||||
#endif //no BULLET_GIMPACT
|
||||
#endif
|
||||
|
||||
startTransform.setIdentity();
|
||||
@@ -432,7 +553,7 @@ void GimpactConcaveDemo::initPhysics()
|
||||
|
||||
/// Create Dynamic Boxes
|
||||
{
|
||||
for (int i=0;i<9;i++)
|
||||
for (int i=0;i<8;i++)
|
||||
{
|
||||
btCollisionShape* boxShape = new btBoxShape(btVector3(1,1,1));
|
||||
startTransform.setOrigin(btVector3(2*i-5,2,-3));
|
||||
@@ -455,9 +576,11 @@ void GimpactConcaveDemo::shootTrimesh(const btVector3& destination)
|
||||
startTransform.setIdentity();
|
||||
btVector3 camPos = getCameraPosition();
|
||||
startTransform.setOrigin(camPos);
|
||||
|
||||
#ifdef BULLET_GIMPACT
|
||||
btRigidBody* body = this->localCreateRigidBody(mass, startTransform,m_trimeshShape2);
|
||||
|
||||
#else
|
||||
btRigidBody* body = this->localCreateRigidBody(mass, startTransform,createBunnyShape());
|
||||
#endif
|
||||
btVector3 linVel(destination[0]-camPos[0],destination[1]-camPos[1],destination[2]-camPos[2]);
|
||||
linVel.normalize();
|
||||
linVel*=m_ShootBoxInitialSpeed*0.25;
|
||||
@@ -487,7 +610,7 @@ void GimpactConcaveDemo::clientMoveAndDisplay()
|
||||
btTransform newTrans;
|
||||
btRigidBody::upcast(colObj)->getMotionState()->getWorldTransform(newTrans);
|
||||
|
||||
newTrans.getOrigin() += kinTorusTran;
|
||||
newTrans.getOrigin() += kinTorusTran;
|
||||
newTrans.getBasis() = newTrans.getBasis() * btMatrix3x3(kinTorusRot);
|
||||
if(newTrans.getOrigin().getX() > 6.0){
|
||||
newTrans.getOrigin().setX(6.0);
|
||||
@@ -511,11 +634,20 @@ void GimpactConcaveDemo::clientMoveAndDisplay()
|
||||
|
||||
#endif //USE_KINEMATIC_GROUND
|
||||
|
||||
|
||||
unsigned long int time = m_clock.getTimeMilliseconds();
|
||||
printf("%i time %i ms \n",m_steps_done,time);
|
||||
|
||||
//#ifdef BULLET_GIMPACT
|
||||
// printf("%i time %.1f ms \n",m_steps_done,btGImpactCollisionAlgorithm::getAverageTreeCollisionTime());
|
||||
//#else
|
||||
// printf("%i time %.1f ms \n",m_steps_done,btConcaveConcaveCollisionAlgorithm::getAverageTreeCollisionTime());
|
||||
//#endif
|
||||
|
||||
//float dt = float(m_clock.getTimeMicroseconds()) * dts; //0.000001f;
|
||||
float dt = float(m_clock.getTimeMicroseconds()) * 0.000001f;
|
||||
|
||||
printf("%i time %i ms \n",m_steps_done,time);
|
||||
|
||||
|
||||
m_clock.reset();
|
||||
m_dynamicsWorld->stepSimulation(dt);
|
||||
@@ -564,10 +696,10 @@ void GimpactConcaveDemo::keyboardCallback(unsigned char key, int x, int y)
|
||||
|
||||
case '2':
|
||||
{
|
||||
dts += 0.000001f;
|
||||
dts += 0.000001f;
|
||||
break;
|
||||
}
|
||||
case '3':
|
||||
case '3':
|
||||
{
|
||||
dts -= 0.000001f; if(dts<0.000001f) dts = 0.000001f;
|
||||
break;
|
||||
@@ -586,7 +718,7 @@ void GimpactConcaveDemo::keyboardCallback(unsigned char key, int x, int y)
|
||||
|
||||
switch (key)
|
||||
{
|
||||
case 'q' :
|
||||
case 'q' :
|
||||
case KEY_ESCAPE :
|
||||
exit(0); break;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user