void CPlayerController::Tick(float deltaTime) { if (!m_enable && !IsInContact()) return; m_ticksSinceUpdate++; btRigidBody *body = m_pObject->GetObject(); btMassCenterMotionState *motionState = (btMassCenterMotionState *)body->getMotionState(); // Don't let the player controller travel too far away from the target position. btTransform transform; motionState->getGraphicTransform(transform); btVector3 delta_position = m_targetPosition - transform.getOrigin(); btScalar qdist = delta_position.length2(); if (qdist > m_maxDeltaPosition * m_maxDeltaPosition && TryTeleportObject()) { return; } m_linVelocity.setZero(); CalculateVelocity(deltaTime); // Integrate the velocity into our world transform btVector3 deltaPos = m_linVelocity * deltaTime; if (!deltaPos.fuzzyZero()) { btTransform trans; motionState->getGraphicTransform(trans); trans.setOrigin(trans.getOrigin() + deltaPos); motionState->setGraphicTransform(trans); } }
void CPlayerController::do_simulation_controller( IVP_Event_Sim *es,IVP_U_Vector<IVP_Core> *) { if ( !m_enable ) return; IVP_Real_Object *pivp = m_pObject->GetObject(); IVP_Environment *pIVPEnv = pivp->get_environment(); CPhysicsEnvironment *pVEnv = (CPhysicsEnvironment *)pIVPEnv->client_data; float psiScale = pVEnv->GetInvPSIScale(); if ( !psiScale ) return; IVP_Core *pCore = pivp->get_core(); // current situation const IVP_U_Matrix *m_world_f_core = pCore->get_m_world_f_core_PSI(); const IVP_U_Point *cur_pos_ws = m_world_f_core->get_position(); // --------------------------------------------------------- // Translation // --------------------------------------------------------- IVP_U_Float_Point delta_position; delta_position.subtract( &m_targetPosition, cur_pos_ws); if (!pivp->flags.shift_core_f_object_is_zero) { IVP_U_Float_Point shift_cs_os_ws; m_world_f_core->vmult3( pivp->get_shift_core_f_object(), &shift_cs_os_ws); delta_position.subtract( &shift_cs_os_ws ); } IVP_DOUBLE qdist = delta_position.quad_length(); // UNDONE: This is totally bogus! Measure error using last known estimate // not current position! if ( qdist > m_maxDeltaPosition * m_maxDeltaPosition ) { if ( TryTeleportObject() ) return; } // float to allow stepping if ( m_onground ) { const IVP_U_Point *pgrav = es->environment->get_gravity(); IVP_U_Float_Point gravSpeed; gravSpeed.set_multiple( pgrav, es->delta_time ); pCore->speed.subtract( &gravSpeed ); } ComputeController( pCore->speed, delta_position, m_maxSpeed, psiScale / es->delta_time, m_dampFactor ); }