void CCharacterController::CharacterMovement(btCollisionWorld* pCollisionWorld, btScalar deltaTime) { // Grab the new player transform before doing movement steps in case the player has been moved, // such as by a platform or teleported. No need to do a physics trace for it, the penetration // functions should handle that. btTransform mCharacter; CPhysicsEntity* pPhysicsEntity = static_cast<CBulletPhysics*>(GamePhysics())->GetPhysicsEntity(m_hEntity); pPhysicsEntity->m_oMotionState.getWorldTransform(mCharacter); #ifdef _DEBUG Matrix4x4 mTest; mCharacter.getOpenGLMatrix(mTest); TAssert(mTest.GetForwardVector().Cross(mTest.GetLeftVector()).Equals(mTest.GetUpVector(), 0.001f)); TAssert(mTest.GetUpVector().Equals(m_hEntity->GetUpVector(), 0.001f)); #endif m_pGhostObject->setWorldTransform(mCharacter); PreStep(pCollisionWorld); if (m_hEntity->IsFlying()) PlayerFly(pCollisionWorld, deltaTime); else if (!m_hEntity->GetGroundEntity()) PlayerFall(pCollisionWorld, deltaTime); else PlayerWalk(pCollisionWorld, deltaTime); FindGround(pCollisionWorld); btVector3 vecOrigin = m_pGhostObject->getWorldTransform().getOrigin(); TAssert(vecOrigin.x() < 999999); TAssert(vecOrigin.x() > -999999); TAssert(vecOrigin.y() < 999999); TAssert(vecOrigin.y() > -999999); TAssert(vecOrigin.z() < 999999); TAssert(vecOrigin.z() > -999999); if ((mCharacter.getOrigin() - vecOrigin).length2() > 0.0001f) pPhysicsEntity->m_oMotionState.setWorldTransform(m_pGhostObject->getWorldTransform()); }