Path: blob/master/thirdparty/jolt_physics/Jolt/Physics/Vehicle/VehicleTransmission.cpp
9912 views
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)1// SPDX-FileCopyrightText: 2021 Jorrit Rouwe2// SPDX-License-Identifier: MIT34#include <Jolt/Jolt.h>56#include <Jolt/Physics/Vehicle/VehicleTransmission.h>7#include <Jolt/ObjectStream/TypeDeclarations.h>89JPH_NAMESPACE_BEGIN1011JPH_IMPLEMENT_SERIALIZABLE_NON_VIRTUAL(VehicleTransmissionSettings)12{13JPH_ADD_ENUM_ATTRIBUTE(VehicleTransmissionSettings, mMode)14JPH_ADD_ATTRIBUTE(VehicleTransmissionSettings, mGearRatios)15JPH_ADD_ATTRIBUTE(VehicleTransmissionSettings, mReverseGearRatios)16JPH_ADD_ATTRIBUTE(VehicleTransmissionSettings, mSwitchTime)17JPH_ADD_ATTRIBUTE(VehicleTransmissionSettings, mClutchReleaseTime)18JPH_ADD_ATTRIBUTE(VehicleTransmissionSettings, mSwitchLatency)19JPH_ADD_ATTRIBUTE(VehicleTransmissionSettings, mShiftUpRPM)20JPH_ADD_ATTRIBUTE(VehicleTransmissionSettings, mShiftDownRPM)21JPH_ADD_ATTRIBUTE(VehicleTransmissionSettings, mClutchStrength)22}2324void VehicleTransmissionSettings::SaveBinaryState(StreamOut &inStream) const25{26inStream.Write(mMode);27inStream.Write(mGearRatios);28inStream.Write(mReverseGearRatios);29inStream.Write(mSwitchTime);30inStream.Write(mClutchReleaseTime);31inStream.Write(mSwitchLatency);32inStream.Write(mShiftUpRPM);33inStream.Write(mShiftDownRPM);34inStream.Write(mClutchStrength);35}3637void VehicleTransmissionSettings::RestoreBinaryState(StreamIn &inStream)38{39inStream.Read(mMode);40inStream.Read(mGearRatios);41inStream.Read(mReverseGearRatios);42inStream.Read(mSwitchTime);43inStream.Read(mClutchReleaseTime);44inStream.Read(mSwitchLatency);45inStream.Read(mShiftUpRPM);46inStream.Read(mShiftDownRPM);47inStream.Read(mClutchStrength);48}4950void VehicleTransmission::Update(float inDeltaTime, float inCurrentRPM, float inForwardInput, bool inCanShiftUp)51{52// Update current gear and calculate clutch friction53if (mMode == ETransmissionMode::Auto)54{55// Switch gears based on rpm56int old_gear = mCurrentGear;57if (mCurrentGear == 0 // In neutral58|| inForwardInput * float(mCurrentGear) < 0.0f) // Changing between forward / reverse59{60// Switch to first gear or reverse depending on input61mCurrentGear = inForwardInput > 0.0f? 1 : (inForwardInput < 0.0f? -1 : 0);62}63else if (mGearSwitchLatencyTimeLeft == 0.0f) // If not in the timout after switching gears64{65if (inCanShiftUp && inCurrentRPM > mShiftUpRPM)66{67if (mCurrentGear < 0)68{69// Shift up, reverse70if (mCurrentGear > -(int)mReverseGearRatios.size())71mCurrentGear--;72}73else74{75// Shift up, forward76if (mCurrentGear < (int)mGearRatios.size())77mCurrentGear++;78}79}80else if (inCurrentRPM < mShiftDownRPM)81{82if (mCurrentGear < 0)83{84// Shift down, reverse85int max_gear = inForwardInput != 0.0f? -1 : 0;86if (mCurrentGear < max_gear)87mCurrentGear++;88}89else90{91// Shift down, forward92int min_gear = inForwardInput != 0.0f? 1 : 0;93if (mCurrentGear > min_gear)94mCurrentGear--;95}96}97}9899if (old_gear != mCurrentGear)100{101// We've shifted gear, start switch countdown102mGearSwitchTimeLeft = old_gear != 0? mSwitchTime : 0.0f;103mClutchReleaseTimeLeft = mClutchReleaseTime;104mGearSwitchLatencyTimeLeft = mSwitchLatency;105mClutchFriction = 0.0f;106}107else if (mGearSwitchTimeLeft > 0.0f)108{109// If still switching gears, count down110mGearSwitchTimeLeft = max(0.0f, mGearSwitchTimeLeft - inDeltaTime);111mClutchFriction = 0.0f;112}113else if (mClutchReleaseTimeLeft > 0.0f)114{115// After switching the gears we slowly release the clutch116mClutchReleaseTimeLeft = max(0.0f, mClutchReleaseTimeLeft - inDeltaTime);117mClutchFriction = 1.0f - mClutchReleaseTimeLeft / mClutchReleaseTime;118}119else120{121// Clutch has full friction122mClutchFriction = 1.0f;123124// Count down switch latency125mGearSwitchLatencyTimeLeft = max(0.0f, mGearSwitchLatencyTimeLeft - inDeltaTime);126}127}128}129130float VehicleTransmission::GetCurrentRatio() const131{132if (mCurrentGear < 0)133return mReverseGearRatios[-mCurrentGear - 1];134else if (mCurrentGear == 0)135return 0.0f;136else137return mGearRatios[mCurrentGear - 1];138}139140void VehicleTransmission::SaveState(StateRecorder &inStream) const141{142inStream.Write(mCurrentGear);143inStream.Write(mClutchFriction);144inStream.Write(mGearSwitchTimeLeft);145inStream.Write(mClutchReleaseTimeLeft);146inStream.Write(mGearSwitchLatencyTimeLeft);147}148149void VehicleTransmission::RestoreState(StateRecorder &inStream)150{151inStream.Read(mCurrentGear);152inStream.Read(mClutchFriction);153inStream.Read(mGearSwitchTimeLeft);154inStream.Read(mClutchReleaseTimeLeft);155inStream.Read(mGearSwitchLatencyTimeLeft);156}157158JPH_NAMESPACE_END159160161