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()); }
void CChunkTrees::Render() const { if (!m_bTreesGenerated) return; if (!m_avecOrigins.size()) return; CreateTreeVBO(); float flScale = (float)CScalableFloat::ConvertUnits(1, m_pManager->m_pPlanet->GetScale(), SCALE_METER); Matrix4x4 mTransform = m_mChunk; CRenderingContext r(GameServer()->GetRenderer(), true); r.UseMaterial("textures/tree.mat"); r.SetUniform("vecColor", Vector4D(1, 1, 1, 1)); size_t iTrees = m_avecOrigins.size(); for (size_t i = 0; i < iTrees; i++) { if (!m_abActive[i]) continue; DoubleVector vecTree = m_avecOrigins[i]; DoubleVector vecToTree = vecTree - m_pManager->m_pPlanet->GetCharacterLocalOrigin(); mTransform.SetRightVector(vecToTree.Cross(mTransform.GetUpVector()).Normalized()); mTransform.SetTranslation(vecToTree*flScale - mTransform.GetUpVector()); r.LoadTransform(mTransform); r.BeginRenderVertexArray(s_iTreeVBO); r.SetPositionBuffer(0u, 5*sizeof(float)); r.SetTexCoordBuffer(3*sizeof(float), 5*sizeof(float), 0); r.EndRenderVertexArray(s_iTreeVBOSize); } }