void CharacterDemo::initPhysics() { btCollisionShape* groundShape = new btBoxShape(btVector3(50,3,50)); m_collisionShapes.push_back(groundShape); m_collisionConfiguration = new btDefaultCollisionConfiguration(); m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); btVector3 worldMin(-1000,-1000,-1000); btVector3 worldMax(1000,1000,1000); btAxisSweep3* sweepBP = new btAxisSweep3(worldMin,worldMax); m_overlappingPairCache = sweepBP; m_constraintSolver = new btSequentialImpulseConstraintSolver(); m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_constraintSolver,m_collisionConfiguration); m_dynamicsWorld->getDispatchInfo().m_allowedCcdPenetration=0.0001f; #ifdef DYNAMIC_CHARACTER_CONTROLLER m_character = new DynamicCharacterController (); #else btTransform startTransform; startTransform.setIdentity (); //startTransform.setOrigin (btVector3(0.0, 4.0, 0.0)); startTransform.setOrigin (btVector3(10.210098,-1.6433364,16.453260)); m_ghostObject = new btPairCachingGhostObject(); m_ghostObject->setWorldTransform(startTransform); sweepBP->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback()); btScalar characterHeight=1.75; btScalar characterWidth =1.75; btConvexShape* capsule = new btCapsuleShape(characterWidth,characterHeight); m_ghostObject->setCollisionShape (capsule); m_ghostObject->setCollisionFlags (btCollisionObject::CF_CHARACTER_OBJECT); btScalar stepHeight = btScalar(0.35); m_character = new btKinematicCharacterController (m_ghostObject,capsule,stepHeight); #endif //////////////// /// Create some basic environment from a Quake level //m_dynamicsWorld->setGravity(btVector3(0,0,0)); btTransform tr; tr.setIdentity(); const char* bspfilename = "BspDemo.bsp"; void* memoryBuffer = 0; FILE* file = fopen(bspfilename,"r"); if (!file) { //cmake generated visual studio projects need 4 levels back bspfilename = "../../../../BspDemo.bsp"; file = fopen(bspfilename,"r"); } if (!file) { //visual studio leaves the current working directory in the projectfiles folder bspfilename = "../../BspDemo.bsp"; file = fopen(bspfilename,"r"); } if (!file) { //visual studio leaves the current working directory in the projectfiles folder bspfilename = "BspDemo.bsp"; file = fopen(bspfilename,"r"); } if (file) { BspLoader bspLoader; int size=0; if (fseek(file, 0, SEEK_END) || (size = ftell(file)) == EOF || fseek(file, 0, SEEK_SET)) { /* File operations denied? ok, just close and return failure */ printf("Error: cannot get filesize from %s\n", bspfilename); } else { //how to detect file size? memoryBuffer = malloc(size+1); fread(memoryBuffer,1,size,file); bspLoader.loadBSPFile( memoryBuffer); BspToBulletConverter bsp2bullet(this); float bspScaling = 0.1f; bsp2bullet.convertBsp(bspLoader,bspScaling); } fclose(file); } ///only collide with static for now (no interaction with dynamic objects) m_dynamicsWorld->addCollisionObject(m_ghostObject,btBroadphaseProxy::CharacterFilter, btBroadphaseProxy::StaticFilter|btBroadphaseProxy::DefaultFilter); m_dynamicsWorld->addAction(m_character); /////////////// clientResetScene(); setCameraDistance(56.f); }
void BspDemo::initPhysics(char* bspfilename) { m_cameraUp = SimdVector3(0,0,1); m_forwardAxis = 1; ///Setup a Physics Simulation Environment CollisionDispatcher* dispatcher = new CollisionDispatcher(); SimdVector3 worldAabbMin(-10000,-10000,-10000); SimdVector3 worldAabbMax(10000,10000,10000); OverlappingPairCache* broadphase = new AxisSweep3(worldAabbMin,worldAabbMax); //BroadphaseInterface* broadphase = new SimpleBroadphase(); m_physicsEnvironmentPtr = new CcdPhysicsEnvironment(dispatcher,broadphase); m_physicsEnvironmentPtr->setDeactivationTime(2.f); m_physicsEnvironmentPtr->setGravity(0,0,-10); m_physicsEnvironmentPtr->setDebugDrawer(&debugDrawer); #ifdef QUAKE_BSP_IMPORTING void* memoryBuffer = 0; FILE* file = fopen(bspfilename,"r"); if (!file) { //try again other path, //sight... visual studio leaves the current working directory in the projectfiles folder //instead of executable folder. who wants this default behaviour?!? bspfilename = "../../BspDemo.bsp"; file = fopen(bspfilename,"r"); } if (file) { BspLoader bspLoader; int size=0; if (fseek(file, 0, SEEK_END) || (size = ftell(file)) == EOF || fseek(file, 0, SEEK_SET)) { /* File operations denied? ok, just close and return failure */ printf("Error: cannot get filesize from %s\n", bspfilename); } else { //how to detect file size? memoryBuffer = malloc(size+1); fread(memoryBuffer,1,size,file); bspLoader.LoadBSPFile( memoryBuffer); BspToBulletConverter bsp2bullet(this); float bspScaling = 0.1f; bsp2bullet.convertBsp(bspLoader,bspScaling); } fclose(file); } #endif clientResetScene(); }