diff --git a/Demos/BasicDemo/BasicDemo.cpp b/Demos/BasicDemo/BasicDemo.cpp index 5abf33ceb..db4061180 100644 --- a/Demos/BasicDemo/BasicDemo.cpp +++ b/Demos/BasicDemo/BasicDemo.cpp @@ -19,6 +19,16 @@ subject to the following restrictions: //#define CHECK_MEMORY_LEAKS 1 //#define USE_PARALLEL_DISPATCHER 1 +#define START_POS_X -5 +#define START_POS_Y -5 +#define START_POS_Z -3 + + +///create 1000 (10x10x10) dynamic objects +#define ARRAY_SIZE_X 10 +#define ARRAY_SIZE_Y 10 +#define ARRAY_SIZE_Z 10 + //#define USE_SIMPLE_DYNAMICS_WORLD 1 @@ -201,34 +211,42 @@ void BasicDemo::initPhysics() btTransform groundTransform; groundTransform.setIdentity(); - groundTransform.setOrigin(btVector3(0,-50,0)); + groundTransform.setOrigin(btVector3(0,-56,0)); localCreateRigidBody(btScalar(0.),groundTransform,groundShape); //create a few dynamic sphere rigidbodies (re-using the same sphere shape) //btCollisionShape* sphereShape = new btBoxShape(btVector3(1,1,1)); - btCollisionShape* sphereShape = new btSphereShape(btScalar(1.)); - m_collisionShapes.push_back(sphereShape); + btCollisionShape* colShape = new btSphereShape(btScalar(1.)); + m_collisionShapes.push_back(colShape); + + /// Create Dynamic Objects + btTransform startTransform; + startTransform.setIdentity(); - int i; - for (i=0;isetMargin(gCollisionMargin); - btTransform trans; - trans.setIdentity(); - //stack them - int colsize = 2; - int row = (int)((i*HALF_EXTENTS*2)/(colsize*2*HALF_EXTENTS)); - int row2 = row; - int col = (i)%(colsize)-colsize/2; - btVector3 pos(col*2*HALF_EXTENTS + (row2%2)*HALF_EXTENTS, - row*2*HALF_EXTENTS+HALF_EXTENTS,0); - trans.setOrigin(pos); - //btRigidBody* body = localCreateRigidBody(btScalar(1.),trans,sphereShape); - localCreateRigidBody(btScalar(1.),trans,sphereShape); + float start_x = START_POS_X - ARRAY_SIZE_X/2; + float start_y = START_POS_Y; + float start_z = START_POS_Z - ARRAY_SIZE_Z/2; + + for (int k=0;km_collisionFlags |= btCollisionObject::customMaterialCallback; -inline btScalar calculateCombinedFriction(float friction0,float friction1) -{ - btScalar friction = friction0 * friction1; - - const btScalar MAX_FRICTION = 10.f; - if (friction < -MAX_FRICTION) - friction = -MAX_FRICTION; - if (friction > MAX_FRICTION) - friction = MAX_FRICTION; - return friction; - -} - -//------------------------------------------------------------------------------ -inline btScalar calculateCombinedRestitution(float restitution0,float restitution1) -{ - return restitution0 * restitution1; -} - - -//------------------------------------------------------------------------------ -bool CustomMaterialCombinerCallback(btManifoldPoint& cp, const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1) -{ - - float friction0 = colObj0->getFriction(); - float friction1 = colObj1->getFriction(); - float restitution0 = colObj0->getRestitution(); - float restitution1 = colObj1->getRestitution(); - - if (colObj0->getCollisionFlags() & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK) - { - friction0 = 1.0;//partId0,index0 - restitution0 = 0.f; - } - if (colObj1->getCollisionFlags() & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK) - { - if (index1&1) - { - friction1 = 1.0f;//partId1,index1 - } else - { - friction1 = 0.f; - } - restitution1 = 0.f; - } - - cp.m_combinedFriction = calculateCombinedFriction(friction0,friction1); - cp.m_combinedRestitution = calculateCombinedRestitution(restitution0,restitution1); - - //this return value is currently ignored, but to be on the safe side: return false if you don't calculate friction - return true; -} - -extern ContactAddedCallback gContactAddedCallback; - - - -//################################## main ##################################### -int main(int argc,char** argv) -{ - //gContactAddedCallback = CustomMaterialCombinerCallback; - - int sizeofbp = sizeof(btBroadphaseProxy); - - StressTestDemo* concaveDemo = new StressTestDemo(); /// This will not be Deleted!!! - concaveDemo->initPhysics(); - concaveDemo->setCameraDistance(45.f); - -//cannot run stepFront yet, the OpenGL context is not opened (stepFront updates camera...) -// concaveDemo->stepFront(); -// concaveDemo->stepFront(); -// concaveDemo->stepFront(); -// concaveDemo->stepFront(); - - return glutmain(argc, argv,640,480,"DevO,s GIMPACT Test Demo",concaveDemo); -} - -//-------------------------- -//------------------------------------------------------------------------------ -void StressTestDemo::initPhysics() -{ - /// Init Bullet - m_collisionConfiguration = new btDefaultCollisionConfiguration(); - - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); - -#ifdef REGISTER_BOX_BOX - m_dispatcher->registerCollisionCreateFunc(BOX_SHAPE_PROXYTYPE,BOX_SHAPE_PROXYTYPE,new BoxBoxCollisionAlgorithm::CreateFunc); -#endif //REGISTER_BOX_BOX - - - LONG maxProxies = 4096; - btVector3 worldAabbMin(-1000,-1000,-1000); - btVector3 worldAabbMax( 1000, 1000, 1000); - m_broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies); - //m_broadphase = new btMultiSapBroadphase(); - //m_broadphase = new btSimpleBroadphase(); - - btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver();; - m_constraintSolver = solver; - - btDiscreteDynamicsWorld* world = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_constraintSolver); - world->getSolverInfo().m_numIterations = 4; -// solver->setSolverMode(btSequentialImpulseConstraintSolver::SOLVER_CACHE_FRIENDLY);//btSequentialImpulseConstraintSolver::SOLVER_RANDMIZE_ORDER); -// solver->setSolverMode(btSequentialImpulseConstraintSolver::SOLVER_RANDMIZE_ORDER); - - m_dynamicsWorld = world; - m_dynamicsWorld->setDebugDrawer(&debugDrawer); - - - - // register algorithm - if(0) - { - m_spheresphere_collisionCreateFunc = new btSphereSphereCollisionAlgorithm::CreateFunc; /// NEW - - m_dispatcher->registerCollisionCreateFunc(SPHERE_SHAPE_PROXYTYPE,SPHERE_SHAPE_PROXYTYPE,m_spheresphere_collisionCreateFunc); - - m_spherebox_collisionCreateFunc = new btSphereBoxCollisionAlgorithm::CreateFunc; - - m_dispatcher->registerCollisionCreateFunc(SPHERE_SHAPE_PROXYTYPE,BOX_SHAPE_PROXYTYPE,m_spherebox_collisionCreateFunc); - - m_dispatcher->registerCollisionCreateFunc(SPHERE_SHAPE_PROXYTYPE,BOX_SHAPE_PROXYTYPE,m_spherebox_collisionCreateFunc); - - } - - - - //create trimesh model and shape - - - - - /// Create Scene - float mass = 0.f; - btTransform startTransform; - startTransform.setIdentity(); - - btCollisionShape* staticboxShape1 = new btBoxShape(btVector3(20,1,20));//floor - btCollisionShape* staticboxShape2 = new btBoxShape(btVector3(1,50,200));//left wall - btCollisionShape* staticboxShape3 = new btBoxShape(btVector3(1,50,200));//right wall - btCollisionShape* staticboxShape4 = new btBoxShape(btVector3(200,50,1));//front wall - btCollisionShape* staticboxShape5 = new btBoxShape(btVector3(200,50,1));//back wall -#ifdef USE_COMPOUND - - btCompoundShape* staticScenario = new btCompoundShape();//static scenario - - startTransform.setOrigin(btVector3(0,-10,0)); - staticScenario->addChildShape(startTransform,staticboxShape1); - startTransform.setOrigin(btVector3(-200,15,0)); - staticScenario->addChildShape(startTransform,staticboxShape2); - startTransform.setOrigin(btVector3(200,15,0)); - staticScenario->addChildShape(startTransform,staticboxShape3); - startTransform.setOrigin(btVector3(0,15,200)); - staticScenario->addChildShape(startTransform,staticboxShape4); - startTransform.setOrigin(btVector3(0,15,-200)); - staticScenario->addChildShape(startTransform,staticboxShape5); - - startTransform.setOrigin(btVector3(0,0,0)); - - btRigidBody* staticBody = localCreateRigidBody(mass, startTransform,staticScenario); -#else - startTransform.setOrigin(btVector3(0,-7,0));//;//-10,0)); - btRigidBody* staticBody = localCreateRigidBody(mass, startTransform,staticboxShape1); - /*startTransform.setOrigin(btVector3(-200,15,0)); - staticBody = localCreateRigidBody(mass, startTransform,staticboxShape2); - startTransform.setOrigin(btVector3(200,15,0)); - staticBody = localCreateRigidBody(mass, startTransform,staticboxShape3); - startTransform.setOrigin(btVector3(0,15,200)); - staticBody = localCreateRigidBody(mass, startTransform,staticboxShape4); - startTransform.setOrigin(btVector3(0,15,-200)); - staticBody = localCreateRigidBody(mass, startTransform,staticboxShape5); - */ - -#endif //USE_COMPOUND - - //enable custom material callback -// staticBody->setCollisionFlags(staticBody->getCollisionFlags()|btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); - - startTransform.setIdentity(); - btCollisionShape* sphShape = new btSphereShape(1); - btScalar radii[1] = {btScalar(1)}; - btVector3 poss[1]={btVector3(0,0,0)}; - -// btCollisionShape* sphShape = new btMultiSphereShape(btVector3(1,1,1),&poss[0],&radii[0],1); - - btScalar margin(0.04); - btCollisionShape* boxShape = new btBoxShape(btVector3(1,1,1));//1.-margin,1.-margin,1.-margin)); - boxShape->setMargin(margin); - - - /// Create Dynamic Boxes - { - - float start_x = START_POS_X - ARRAY_SIZE_X/2; - float start_y = START_POS_Y; - float start_z = START_POS_Z - ARRAY_SIZE_Z/2; - - for (int k=0;kstepSimulation(dt,1); - m_steps_done++; - - end = glutGet(GLUT_ELAPSED_TIME); - printf("Time %d \n", end-start); - - renderme(); - - glFlush(); - glutSwapBuffers(); - -} - -//------------------------------------------------------------------------------ -void StressTestDemo::displayCallback(void) { - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - renderme(); - - glFlush(); - glutSwapBuffers(); -} - -//------------------------------------------------------------------------------ -void StressTestDemo::clientResetScene() -{ - m_steps_done = 0; - DemoApplication::clientResetScene(); -} - -#define KEY_ESCAPE 0x1B - - -//------------------------------------------------------------------------------ -void StressTestDemo::keyboardCallback(unsigned char key, int x, int y) -{ - switch (key) - { - case '.': - { - break; - } - - case '2': - { - dts += 0.000001f; - break; - } - case '3': - { - dts -= 0.000001f; if(dts<0.000001f) dts = 0.000001f; - break; - } - - default: - DemoApplication::keyboardCallback(key, x, y); - } -} - - diff --git a/Demos/StressTest/StressTestDemo.h b/Demos/StressTest/StressTestDemo.h deleted file mode 100644 index 913ea55b8..000000000 --- a/Demos/StressTest/StressTestDemo.h +++ /dev/null @@ -1,99 +0,0 @@ -/* -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 TEST_CONCAVE_DEMO_H -#define TEST_CONCAVE_DEMO_H - -#include "DemoApplication.h" - - - - -struct btCollisionAlgorithmCreateFunc; - -///StressTestDemo shows usage of static concave triangle meshes -///It also shows per-triangle material (friction/restitution) through CustomMaterialCombinerCallback -class StressTestDemo : public DemoApplication -{ - -public: - StressTestDemo() - : m_collisionConfiguration(NULL), - m_dispatcher(NULL), - m_broadphase(NULL), - m_constraintSolver(NULL), - m_steps_done(0), - m_spheresphere_collisionCreateFunc(0), - m_spherebox_collisionCreateFunc(0) - { - } - - virtual ~StressTestDemo() - { - delete m_spheresphere_collisionCreateFunc; - delete m_spherebox_collisionCreateFunc; - - delete m_collisionConfiguration; - delete m_dispatcher; - delete m_broadphase; - delete m_constraintSolver; - - delete m_dynamicsWorld; - } - - void initGImpactCollision(); - void initPhysics(); - - virtual void clientMoveAndDisplay(); - - virtual void displayCallback(); - - virtual void clientResetScene(); - - virtual void keyboardCallback(unsigned char key, int x, int y); - - - -public: ///data - unsigned int m_steps_done; - - - btVector3 kinTorusTran; - btQuaternion kinTorusRot; - btRigidBody *kinematicTorus; - - - btCollisionAlgorithmCreateFunc* m_spheresphere_collisionCreateFunc; - btCollisionAlgorithmCreateFunc* m_spherebox_collisionCreateFunc; - - btDefaultCollisionConfiguration* m_collisionConfiguration; - btCollisionDispatcher* m_dispatcher; - btBroadphaseInterface* m_broadphase; - btConstraintSolver* m_constraintSolver; -}; - - -#define SPHERES 1 - -#define START_POS_X -5 -#define START_POS_Y -5 -#define START_POS_Z -3 - - -#define ARRAY_SIZE_X 10 -#define ARRAY_SIZE_Y 10 -#define ARRAY_SIZE_Z 10 - -#endif //CONCAVE_DEMO_H - diff --git a/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp b/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp index 418895af5..6268b4aba 100644 --- a/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp +++ b/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp @@ -43,25 +43,25 @@ m_localScaling(btScalar(1.),btScalar(1.),btScalar(1.)) case 0: { halfExtents.setValue( - m_maxHeight, - m_width, - m_length); + btScalar(m_maxHeight), + btScalar(m_width), + btScalar(m_length)); break; } case 1: { halfExtents.setValue( - m_width, - m_maxHeight, - m_length); + btScalar(m_width), + btScalar(m_maxHeight), + btScalar(m_length)); break; }; case 2: { halfExtents.setValue( - m_width, - m_length, - m_maxHeight + btScalar(m_width), + btScalar(m_length), + btScalar(m_maxHeight) ); break; }