//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void IVP_Controller_Raycast_Airboat::DoSimulationTurbine(IVP_Event_Sim *pEventSim) { IVP_Core *pAirboatCore = m_pAirboatBody->get_core(); IVP_FLOAT thrust = m_flThrust; if (m_bAirborneIdle || (m_bAirborne && (thrust < 0.0f))) thrust *= 0.5f; IVP_U_Float_Point vecImpulse; pAirboatCore->get_m_world_f_core_PSI()->get_col(IVP_COORDINATE_INDEX(index_z), &vecImpulse); IVP_FLOAT flForwardY = vecImpulse.k[1]; if ((flForwardY < -0.5f) && (thrust > 0.0f)) thrust *= 1.0f + flForwardY; else if ((flForwardY > 0.5f) && (thrust < 0.0f)) thrust *= 1.0f - flForwardY; vecImpulse.mult(pAirboatCore->get_mass() * thrust * pEventSim->delta_time); pAirboatCore->center_push_core_multiple_ws(&vecImpulse); }
void CPhysicsMotionController::do_simulation_controller(IVP_Event_Sim *event,IVP_U_Vector<IVP_Core> *core_list) { if ( m_handler ) { for ( int i = 0; i < core_list->len(); i++ ) { IVP_U_Float_Point ivpSpeed, ivpRot; IVP_Core *pCore = core_list->element_at(i); Vector speed; AngularImpulse rot; IVP_Real_Object *pivp = pCore->objects.element_at(0); IPhysicsObject *pPhys = static_cast<IPhysicsObject *>(pivp->client_data); IMotionEvent::simresult_e ret = m_handler->Simulate( this, pPhys, event->delta_time, speed, rot ); switch( ret ) { case IMotionEvent::SIM_NOTHING: break; case IMotionEvent::SIM_LOCAL_ACCELERATION: { ConvertForceImpulseToIVP( speed, ivpSpeed ); ConvertAngularImpulseToIVP( rot, ivpRot ); const IVP_U_Matrix *m_world_f_core = pCore->get_m_world_f_core_PSI(); // transform to world space m_world_f_core->inline_vmult3( &ivpSpeed, &ivpSpeed ); // UNDONE: Put these values into speed change / rot_speed_change instead? pCore->speed.add_multiple( &ivpSpeed, event->delta_time ); pCore->rot_speed.add_multiple( &ivpRot, event->delta_time ); } break; case IMotionEvent::SIM_LOCAL_FORCE: { ConvertForceImpulseToIVP( speed, ivpSpeed ); ConvertAngularImpulseToIVP( rot, ivpRot ); const IVP_U_Matrix *m_world_f_core = pCore->get_m_world_f_core_PSI(); // transform to world space m_world_f_core->inline_vmult3( &ivpSpeed, &ivpSpeed ); pCore->center_push_core_multiple_ws( &ivpSpeed, event->delta_time ); pCore->rot_push_core_multiple_cs( &ivpRot, event->delta_time ); } break; case IMotionEvent::SIM_GLOBAL_ACCELERATION: { ConvertAngularImpulseToIVP( rot, ivpRot ); ConvertForceImpulseToIVP( speed, ivpSpeed ); pCore->speed.add_multiple( &ivpSpeed, event->delta_time ); pCore->rot_speed.add_multiple( &ivpRot, event->delta_time ); } break; case IMotionEvent::SIM_GLOBAL_FORCE: { ConvertAngularImpulseToIVP( rot, ivpRot ); ConvertForceImpulseToIVP( speed, ivpSpeed ); pCore->center_push_core_multiple_ws( &ivpSpeed, event->delta_time ); pCore->rot_push_core_multiple_cs( &ivpRot, event->delta_time ); } break; } } } }