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:
ejcoumans
2007-09-30 00:09:32 +00:00
parent 65b9fbe16e
commit fcfdb96e54
4 changed files with 821 additions and 656 deletions

View File

@@ -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;