Example #1
0
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);

}
Example #2
0
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();

}