int pVehicle::getGear() { if (isValidEngine()) { return GetGearBox()->GetGear(); } }
void CustomVehicleControllerComponentEngine::Update (dFloat timestep) { CustomVehicleControllerBodyStateChassis& chassis = m_controller->m_chassisState; CustomVehicleControllerComponentEngine::dGearBox* const gearBox = GetGearBox(); gearBox->Update (timestep); int gear = gearBox->GetGear(); #ifdef __TEST_VEHICLE_XXX__ if (gear > (CustomVehicleControllerComponentEngine::dGearBox::m_firstGear)) { gearBox->SetGear (CustomVehicleControllerComponentEngine::dGearBox::m_firstGear); // gearBox->SetGear (CustomVehicleControllerComponentEngine::dGearBox::m_reverseGear); gear = gearBox->GetGear(); } #endif if (m_engineSwitch) { if (gear == CustomVehicleControllerComponentEngine::dGearBox::m_newtralGear) { dFloat param = dMax (GetParam(), 0.05f); m_engineToque = GetTorque (m_engineRPS) * param - m_engineIdleResistance1 * m_engineRPS - m_engineIdleResistance2 * m_engineRPS * m_engineRPS; dFloat alpha = m_engineIdleInvInertia * m_engineToque; m_engineRPS = dMin (dMax (m_engineRPS + alpha * timestep, 0.0f), m_radiansPerSecundsAtRedLine); } else { dFloat gearRatio = gearBox->GetGearRatio(gear); dFloat shaftOmega = m_differencial->GetShaftOmega(); m_engineRPS = shaftOmega * gearRatio; dFloat torqueResistance = - m_engineInternalFriction * m_engineRPS; dFloat param = GetParam(); dFloat nominalTorque = -GetTorque (dMax (-m_engineRPS, 0.0f)) * param; dFloat engineTorque = nominalTorque + torqueResistance; m_engineToque = m_engineToque + (engineTorque - m_engineToque) * timestep / m_clutchTorqueCouplingTime; dFloat shaftTorque = m_engineToque * gearRatio; m_differencial->ApplyTireTorque(shaftTorque, shaftOmega); } } else { m_engineRPS = m_engineRPS * 0.95f; if (m_engineRPS < 0.001f) { m_engineRPS = 0.0f; } m_engineToque = 0.0f; } dVector front (chassis.m_matrix.RotateVector(chassis.m_localFrame[0])); m_speedMPS = chassis.m_veloc % front; }