mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-22 03:29:19 +02:00
Replace clamp with std::clamp
This commit is contained in:
@@ -128,7 +128,7 @@ TCamera::OnCommand( command_data const &Command ) {
|
||||
|
||||
static void UpdateVelocityAxis(double& velocity, double moverate, double deltatime)
|
||||
{
|
||||
velocity = clamp(velocity + moverate * 10.0 * deltatime, -std::abs(moverate), std::abs(moverate));
|
||||
velocity = std::clamp(velocity + moverate * 10.0 * deltatime, -std::abs(moverate), std::abs(moverate));
|
||||
}
|
||||
|
||||
|
||||
@@ -155,7 +155,7 @@ void TCamera::Update()
|
||||
Angle.y = std::remainder(Angle.y, 2.0 * M_PI);
|
||||
|
||||
// Limit the camera pitch to +/- 90°.
|
||||
Angle.x = clamp(Angle.x - (m_rotationoffsets.x * rotationfactor), -M_PI_2, M_PI_2);
|
||||
Angle.x = std::clamp(Angle.x - (m_rotationoffsets.x * rotationfactor), -M_PI_2, M_PI_2);
|
||||
m_rotationoffsets.x *= ( 1.0 - rotationfactor );
|
||||
|
||||
// update position
|
||||
|
||||
@@ -935,7 +935,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
if( brakingdistance > 0.0 ) {
|
||||
// maintain desired acc while we have enough room to brake safely, when close enough start paying attention
|
||||
// try to make a smooth transition instead of sharp change
|
||||
a = interpolate( a, AccPreferred, clamp( ( d - brakingdistance ) / brakingdistance, 0.0, 1.0 ) );
|
||||
a = interpolate( a, AccPreferred, std::clamp( ( d - brakingdistance ) / brakingdistance, 0.0, 1.0 ) );
|
||||
}
|
||||
}
|
||||
if( ( d < fMinProximityDist )
|
||||
@@ -1738,7 +1738,7 @@ TController::braking_distance_multiplier( float const Targetvelocity ) const {
|
||||
if( ( is_dmu() )
|
||||
&& ( mvOccupied->Vel < 40.0 )
|
||||
&& ( Targetvelocity == 0.f ) ) {
|
||||
auto const multiplier { clamp( 1.f + iVehicles * 0.5f, 2.f, 4.f ) };
|
||||
auto const multiplier { std::clamp( 1.f + iVehicles * 0.5f, 2.f, 4.f ) };
|
||||
return (
|
||||
interpolate(
|
||||
multiplier, 1.f,
|
||||
@@ -1752,7 +1752,7 @@ TController::braking_distance_multiplier( float const Targetvelocity ) const {
|
||||
return (
|
||||
interpolate(
|
||||
1.f, 2.f,
|
||||
clamp(
|
||||
std::clamp(
|
||||
( fBrake_a0[ 1 ] - 0.2 ) / 0.2,
|
||||
0.0, 1.0 ) )
|
||||
* frictionmultiplier );
|
||||
@@ -3183,7 +3183,7 @@ bool TController::IncBrake()
|
||||
interpolate(
|
||||
mvOccupied->Handle->GetPos( bh_EPR ),
|
||||
mvOccupied->Handle->GetPos( bh_EPB ),
|
||||
clamp( -AccDesired / AccMax * mvOccupied->AIHintLocalBrakeAccFactor, 0.0, 1.0 ) ) );
|
||||
std::clamp( -AccDesired / AccMax * mvOccupied->AIHintLocalBrakeAccFactor, 0.0, 1.0 ) ) );
|
||||
OK = ( mvOccupied->fBrakeCtrlPos != initialbrakeposition );
|
||||
}
|
||||
else if( mvOccupied->fBrakeCtrlPos != mvOccupied->Handle->GetPos( bh_EPB ) ) {
|
||||
@@ -3211,7 +3211,7 @@ bool TController::IncBrakeEIM()
|
||||
auto const maxpos{mvOccupied->EIMCtrlEmergency ? 0.9 : 1.0 };
|
||||
auto const brakelimit{ -2.2 * AccDesired / fMedAmax - 1.0}; //additional limit when hinted is too low
|
||||
auto const brakehinted{ -1.0 * mvOccupied->AIHintLocalBrakeAccFactor * AccDesired / fMedAmax }; //preffered by AI
|
||||
auto const brakeposition{ maxpos * clamp(std::max(brakelimit, brakehinted), 0.0, 1.0)};
|
||||
auto const brakeposition{ maxpos * std::clamp(std::max(brakelimit, brakehinted), 0.0, 1.0)};
|
||||
OK = ( brakeposition != mvOccupied->LocalBrakePosA );
|
||||
mvOccupied->LocalBrakePosA = brakeposition;
|
||||
}
|
||||
@@ -3315,7 +3315,7 @@ bool TController::DecBrake() {
|
||||
interpolate(
|
||||
mvOccupied->Handle->GetPos( bh_EPR ),
|
||||
mvOccupied->Handle->GetPos( bh_EPB ),
|
||||
clamp( -AccDesired / AccMax * mvOccupied->AIHintLocalBrakeAccFactor, 0.0, 1.0 ) ) );
|
||||
std::clamp( -AccDesired / AccMax * mvOccupied->AIHintLocalBrakeAccFactor, 0.0, 1.0 ) ) );
|
||||
OK = ( mvOccupied->fBrakeCtrlPos != initialbrakeposition );
|
||||
}
|
||||
else {
|
||||
@@ -3372,7 +3372,7 @@ bool TController::DecBrakeEIM()
|
||||
case 0: {
|
||||
if( mvOccupied->MED_amax != 9.81 ) {
|
||||
auto const desiredacceleration { ( mvOccupied->Vel > EU07_AI_NOMOVEMENT ? AccDesired : std::max( 0.0, AccDesired ) ) };
|
||||
auto const brakeposition { clamp( -1.0 * mvOccupied->AIHintLocalBrakeAccFactor * desiredacceleration / mvOccupied->MED_amax, 0.0, 1.0 ) };
|
||||
auto const brakeposition { std::clamp( -1.0 * mvOccupied->AIHintLocalBrakeAccFactor * desiredacceleration / mvOccupied->MED_amax, 0.0, 1.0 ) };
|
||||
OK = ( brakeposition != mvOccupied->LocalBrakePosA );
|
||||
mvOccupied->LocalBrakePosA = brakeposition;
|
||||
}
|
||||
@@ -3774,7 +3774,7 @@ bool TController::IncSpeedEIM() {
|
||||
// TBD, TODO: set position based on desired acceleration?
|
||||
OK = mvControlling->MainCtrlPos < mvControlling->MainCtrlPosNo;
|
||||
if( OK ) {
|
||||
mvControlling->MainCtrlPos = clamp( mvControlling->MainCtrlPos + 1, 6, mvControlling->MainCtrlPosNo );
|
||||
mvControlling->MainCtrlPos = std::clamp( mvControlling->MainCtrlPos + 1, 6, mvControlling->MainCtrlPosNo );
|
||||
}
|
||||
*/
|
||||
break;
|
||||
@@ -3830,7 +3830,7 @@ void TController::BrakeLevelSet(double b)
|
||||
// jedyny dopuszczalny sposób przestawienia hamulca zasadniczego
|
||||
if (BrakeCtrlPosition == b)
|
||||
return; // nie przeliczać, jak nie ma zmiany
|
||||
BrakeCtrlPosition = clamp(b, (double)gbh_MIN, (double)gbh_MAX);
|
||||
BrakeCtrlPosition = std::clamp(b, (double)gbh_MIN, (double)gbh_MAX);
|
||||
}
|
||||
|
||||
bool TController::BrakeLevelAdd(double b)
|
||||
@@ -4143,7 +4143,7 @@ void TController::SetTimeControllers()
|
||||
else if (VelDesired > MinVel) //more power for faster ride
|
||||
{
|
||||
auto const Factor{ 10 * (mvControlling->Vmax) / (mvControlling->Vmax + 3 * mvControlling->Vel) };
|
||||
auto DesiredPercentage{ clamp(
|
||||
auto DesiredPercentage{ std::clamp(
|
||||
(VelDesired > mvControlling->Vel ?
|
||||
(VelDesired - mvControlling->Vel) / Factor :
|
||||
0),
|
||||
@@ -6026,7 +6026,7 @@ TController::determine_consist_state() {
|
||||
fBrake_a1[0] = fBrake_a1[index];
|
||||
|
||||
if ((is_emu()) || (is_dmu())) {
|
||||
auto Coeff = clamp( mvOccupied->Vel*0.015 , 0.5 , 1.0);
|
||||
auto Coeff = std::clamp( mvOccupied->Vel*0.015 , 0.5 , 1.0);
|
||||
fAccThreshold = fNominalAccThreshold * Coeff - fBrake_a0[BrakeAccTableSize] * (1.0 - Coeff);
|
||||
}
|
||||
|
||||
@@ -6742,8 +6742,8 @@ TController::determine_proximity_ranges() {
|
||||
// na jaka odleglosc i z jaka predkoscia ma podjechac do przeszkody
|
||||
// jeśli pociąg
|
||||
if( is_train() ) {
|
||||
fMinProximityDist = clamp( 5 + iVehicles, 10, 15 );
|
||||
fMaxProximityDist = clamp( 10 + iVehicles, 15, 40 );
|
||||
fMinProximityDist = std::clamp( 5 + iVehicles, 10, 15 );
|
||||
fMaxProximityDist = std::clamp( 10 + iVehicles, 15, 40 );
|
||||
|
||||
if( IsCargoTrain ) {
|
||||
// increase distances for cargo trains to take into account slower reaction to brakes
|
||||
@@ -6778,10 +6778,10 @@ TController::determine_proximity_ranges() {
|
||||
else {
|
||||
// gdy nie musi się sprężać
|
||||
// margines prędkości powodujący załączenie napędu; min 1.0 żeby nie ruszał przy 0.1
|
||||
fVelMinus = clamp( std::round( 0.05 * VelDesired ), 1.0, 5.0 );
|
||||
fVelMinus = std::clamp( std::round( 0.05 * VelDesired ), 1.0, 5.0 );
|
||||
// normalnie dopuszczalne przekroczenie to 5% prędkości ale nie więcej niż 5km/h
|
||||
// bottom margin raised to 2 km/h to give the AI more leeway at low speed limits
|
||||
fVelPlus = clamp( std::ceil( 0.05 * VelDesired ), 2.0, 5.0 );
|
||||
fVelPlus = std::clamp( std::ceil( 0.05 * VelDesired ), 2.0, 5.0 );
|
||||
}
|
||||
}
|
||||
// samochod (sokista też)
|
||||
@@ -7392,7 +7392,7 @@ TController::pick_optimal_speed( double const Range ) {
|
||||
|
||||
// last step sanity check, until the whole calculation is straightened out
|
||||
AccDesired = std::min( AccDesired, AccPreferred );
|
||||
AccDesired = clamp(
|
||||
AccDesired = std::clamp(
|
||||
AccDesired,
|
||||
( is_car() ? -2.0 : -0.9 ),
|
||||
( is_car() ? 2.0 : 0.9 ) );
|
||||
@@ -7760,7 +7760,7 @@ TController::adjust_desired_speed_for_current_speed() {
|
||||
// HACK: for cargo trains with high braking threshold ensure we cross that threshold
|
||||
if( ( true == IsCargoTrain )
|
||||
&& ( fBrake_a0[ 0 ] > 0.2 ) ) {
|
||||
AccDesired -= clamp( fBrake_a0[ 0 ] - 0.2, 0.0, 0.15 );
|
||||
AccDesired -= std::clamp( fBrake_a0[ 0 ] - 0.2, 0.0, 0.15 );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7770,22 +7770,22 @@ TController::adjust_desired_speed_for_current_speed() {
|
||||
AccDesired, // but don't override decceleration for VelNext
|
||||
interpolate( // ease off as you close to the target velocity
|
||||
EU07_AI_NOACCELERATION, AccPreferred,
|
||||
clamp( VelDesired - speedestimate, 0.0, fVelMinus ) / fVelMinus ) );
|
||||
std::clamp( VelDesired - speedestimate, 0.0, fVelMinus ) / fVelMinus ) );
|
||||
}
|
||||
// final tweaks
|
||||
if( vel > EU07_AI_NOMOVEMENT ) {
|
||||
// going downhill also take into account impact of gravity
|
||||
AccDesired -= fAccGravity;
|
||||
// HACK: if the max allowed speed was exceeded something went wrong; brake harder
|
||||
AccDesired -= 0.15 * clamp( vel - VelDesired, 0.0, 5.0 );
|
||||
AccDesired -= 0.15 * std::clamp( vel - VelDesired, 0.0, 5.0 );
|
||||
}
|
||||
}
|
||||
// HACK: limit acceleration for cargo trains, to reduce probability of breaking couplers on sudden jolts
|
||||
auto MaxAcc{ 0.5 * mvOccupied->Couplers[(mvOccupied->DirAbsolute >= 0 ? end::rear : end::front)].FmaxC / fMass };
|
||||
if( iVehicles - ControlledEnginesCount > 0 ) {
|
||||
MaxAcc *= clamp( vel * 0.025, 0.2, 1.0 );
|
||||
MaxAcc *= std::clamp( vel * 0.025, 0.2, 1.0 );
|
||||
}
|
||||
AccDesired = std::min(AccDesired, clamp(MaxAcc, HeavyCargoTrainAcceleration, AccPreferred));
|
||||
AccDesired = std::min(AccDesired, std::clamp(MaxAcc, HeavyCargoTrainAcceleration, AccPreferred));
|
||||
// TBD: expand this behaviour to all trains with car(s) exceeding certain weight?
|
||||
/*
|
||||
if( ( IsPassengerTrain ) && ( iVehicles - ControlledEnginesCount > 0 ) ) {
|
||||
@@ -7887,7 +7887,7 @@ TController::adjust_desired_speed_for_braking_test() {
|
||||
break;
|
||||
}
|
||||
case 3: {
|
||||
AccDesired = clamp( -AbsAccS, fAccThreshold * 1.01, fAccThreshold * 1.21 );
|
||||
AccDesired = std::clamp( -AbsAccS, fAccThreshold * 1.01, fAccThreshold * 1.21 );
|
||||
VelDesired = DBT_VelocityBrake;
|
||||
if( vel <= DBT_VelocityRelease ) {
|
||||
DynamicBrakeTest = 4;
|
||||
@@ -8285,7 +8285,7 @@ void TController::control_main_pipe() {
|
||||
|
||||
BrakeLevelSet( gbh_FS );
|
||||
// don't charge the brakes too often, or we risk overcharging
|
||||
BrakeChargingCooldown = -1 * clamp( iVehicles * 3, 30, 90 );
|
||||
BrakeChargingCooldown = -1 * std::clamp( iVehicles * 3, 30, 90 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1077,7 +1077,7 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
|
||||
continue;
|
||||
}
|
||||
|
||||
auto const dist { clamp( MoverParameters->Couplers[ i ].Dist / 2.0, -MoverParameters->Couplers[ i ].DmaxB, 0.0 ) };
|
||||
auto const dist { std::clamp( MoverParameters->Couplers[ i ].Dist / 2.0, -MoverParameters->Couplers[ i ].DmaxB, 0.0 ) };
|
||||
|
||||
if( dist >= 0.0 ) { continue; }
|
||||
|
||||
@@ -2496,7 +2496,7 @@ TDynamicObject::Init(std::string Name, // nazwa pojazdu, np. "EU07-424"
|
||||
initial_track = MyTrack;
|
||||
iNumAxles = 2;
|
||||
// McZapkie-090402: odleglosc miedzy czopami skretu lub osiami
|
||||
fAxleDist = clamp(
|
||||
fAxleDist = std::clamp(
|
||||
std::max( MoverParameters->BDist, MoverParameters->ADist ),
|
||||
0.2, //żeby się dało wektory policzyć
|
||||
MoverParameters->Dim.L - 0.2 ); // nie mogą być za daleko bo będzie "walenie w mur"
|
||||
@@ -3076,7 +3076,7 @@ TDynamicObject::update_load_offset() {
|
||||
0.0 :
|
||||
100.0 * MoverParameters->LoadAmount / MoverParameters->MaxLoad ) };
|
||||
|
||||
LoadOffset = interpolate( MoverParameters->LoadType.offset_min, 0.f, clamp( 0.0, 1.0, loadpercentage * 0.01 ) );
|
||||
LoadOffset = interpolate( MoverParameters->LoadType.offset_min, 0.f, std::clamp( 0.0, 1.0, loadpercentage * 0.01 ) );
|
||||
}
|
||||
|
||||
void
|
||||
@@ -3528,7 +3528,7 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
else
|
||||
p->MoverParameters->MED_EPVC_CurrentTime += dt1;
|
||||
bool EPVC = ((p->MoverParameters->MED_EPVC) && ((p->MoverParameters->MED_EPVC_Time < 0) || (p->MoverParameters->MED_EPVC_CurrentTime < p->MoverParameters->MED_EPVC_Time)));
|
||||
float VelC = (EPVC ? clamp(p->MoverParameters->Vel, p->MoverParameters->MED_Vmin, p->MoverParameters->MED_Vmax) : p->MoverParameters->MED_Vref);//korekcja EP po prędkości
|
||||
float VelC = (EPVC ? std::clamp(p->MoverParameters->Vel, p->MoverParameters->MED_Vmin, p->MoverParameters->MED_Vmax) : p->MoverParameters->MED_Vref);//korekcja EP po prędkości
|
||||
float FmaxPoj = Nmax *
|
||||
p->MoverParameters->Hamulec->GetFC(
|
||||
Nmax / (p->MoverParameters->NAxles * p->MoverParameters->NBpA), VelC) *
|
||||
@@ -3685,7 +3685,7 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
auto volume =
|
||||
interpolate(
|
||||
0.8, 1.2,
|
||||
clamp(
|
||||
std::clamp(
|
||||
MyTrack->iQualityFlag / 10.0,
|
||||
0.0, 1.5 ) );
|
||||
switch( MyTrack->eEnvironment ) {
|
||||
@@ -3730,8 +3730,8 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
if(MyTrack->eType == tt_Normal)
|
||||
{
|
||||
MoverParameters->AccVert +=
|
||||
clamp(0.0, 4.0,
|
||||
(clamp(0.0, MoverParameters->Vmax,
|
||||
std::clamp(0.0, 4.0,
|
||||
(std::clamp(0.0, MoverParameters->Vmax,
|
||||
MoverParameters->Vmax -
|
||||
(MoverParameters->Vel +
|
||||
MoverParameters->Vmax * 0.32f))) *
|
||||
@@ -3739,24 +3739,24 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
}
|
||||
if (MyTrack->eType == tt_Switch){
|
||||
MoverParameters->AccS +=
|
||||
clamp(0.0, 1.0,
|
||||
(clamp(0.0, MoverParameters->Vmax,
|
||||
std::clamp(0.0, 1.0,
|
||||
(std::clamp(0.0, MoverParameters->Vmax,
|
||||
MoverParameters->Vmax -
|
||||
(MoverParameters->Vel +
|
||||
MoverParameters->Vmax * 0.32f))) *
|
||||
.05f * (MyTrack->iDamageFlag * 0.25f)) *
|
||||
((axleindex % 2) != 0 ? 1 : -1);
|
||||
MoverParameters->AccN +=
|
||||
clamp(0.0, 1.0,
|
||||
(clamp(0.0, MoverParameters->Vmax,
|
||||
std::clamp(0.0, 1.0,
|
||||
(std::clamp(0.0, MoverParameters->Vmax,
|
||||
MoverParameters->Vmax -
|
||||
(MoverParameters->Vel +
|
||||
MoverParameters->Vmax * 0.32f))) *
|
||||
.05f * (MyTrack->iDamageFlag * 0.25f)) *
|
||||
((axleindex % 2) != 0 ? 1 : -1);
|
||||
MoverParameters->AccVert +=
|
||||
clamp(0.0, 2.0,
|
||||
(clamp(0.0, MoverParameters->Vmax,
|
||||
std::clamp(0.0, 2.0,
|
||||
(std::clamp(0.0, MoverParameters->Vmax,
|
||||
MoverParameters->Vmax -
|
||||
(MoverParameters->Vel +
|
||||
MoverParameters->Vmax * 0.32f))) *
|
||||
@@ -4455,12 +4455,12 @@ void TDynamicObject::RenderSounds() {
|
||||
// NOTE: we do sound modulation here to avoid sudden jump on voltage loss
|
||||
frequency = ( voltage / ( MoverParameters->NominalVoltage * MoverParameters->RList[ MoverParameters->RlistSize ].Mn ) );
|
||||
frequency *= sConverter.m_frequencyfactor + sConverter.m_frequencyoffset;
|
||||
sConverter.pitch( clamp( frequency, 0.75, 1.25 ) ); // arbitrary limits )
|
||||
sConverter.pitch( std::clamp( frequency, 0.75, 1.25 ) ); // arbitrary limits )
|
||||
}
|
||||
}
|
||||
else {
|
||||
frequency = sConverter.m_frequencyoffset + sConverter.m_frequencyfactor * frequency;
|
||||
sConverter.pitch( clamp( frequency, 0.75, 1.25 ) ); // arbitrary limits )
|
||||
sConverter.pitch( std::clamp( frequency, 0.75, 1.25 ) ); // arbitrary limits )
|
||||
}
|
||||
sConverter.play( sound_flags::exclusive | sound_flags::looping );
|
||||
}
|
||||
@@ -4491,7 +4491,7 @@ void TDynamicObject::RenderSounds() {
|
||||
// presume the compressor sound is recorded for idle revolutions
|
||||
// increase the pitch according to increase of engine revolutions
|
||||
auto const enginefactor {
|
||||
clamp( // try to keep the sound pitch in semi-reasonable range
|
||||
std::clamp( // try to keep the sound pitch in semi-reasonable range
|
||||
MoverParameters->EngineMaxRPM() / MoverParameters->EngineIdleRPM() * MoverParameters->EngineRPMRatio(),
|
||||
0.5, 2.5 ) };
|
||||
sCompressor.pitch( enginefactor );
|
||||
@@ -4636,10 +4636,10 @@ void TDynamicObject::RenderSounds() {
|
||||
MoverParameters->EmergencyValveFlow :
|
||||
interpolate( m_emergencybrakeflow, MoverParameters->EmergencyValveFlow, 0.1 ) );
|
||||
// scale volume based on the flow rate and on the pressure in the main pipe
|
||||
auto const flowpressure { clamp( m_emergencybrakeflow, 0.0, 1.0 ) + clamp( 0.1 * MoverParameters->PipePress, 0.0, 0.5 ) };
|
||||
auto const flowpressure { std::clamp( m_emergencybrakeflow, 0.0, 1.0 ) + std::clamp( 0.1 * MoverParameters->PipePress, 0.0, 0.5 ) };
|
||||
m_emergencybrake
|
||||
.pitch( m_emergencybrake.m_frequencyoffset + 1.0 * m_emergencybrake.m_frequencyfactor )
|
||||
.gain( m_emergencybrake.m_amplitudeoffset + clamp( flowpressure, 0.0, 1.0 ) * m_emergencybrake.m_amplitudefactor )
|
||||
.gain( m_emergencybrake.m_amplitudeoffset + std::clamp( flowpressure, 0.0, 1.0 ) * m_emergencybrake.m_amplitudefactor )
|
||||
.play( sound_flags::exclusive | sound_flags::looping );
|
||||
}
|
||||
else if( MoverParameters->EmergencyValveFlow < 0.015 ) {
|
||||
@@ -4674,9 +4674,9 @@ void TDynamicObject::RenderSounds() {
|
||||
if( MoverParameters->Hamulec->Releaser() ) {
|
||||
sReleaser
|
||||
.gain(
|
||||
clamp<float>(
|
||||
MoverParameters->BrakePress * 1.25f, // arbitrary multiplier
|
||||
0.f, 1.f ) )
|
||||
std::clamp(
|
||||
MoverParameters->BrakePress * 1.25, // arbitrary multiplier
|
||||
0., 1. ) )
|
||||
.play( sound_flags::exclusive | sound_flags::looping );
|
||||
}
|
||||
else {
|
||||
@@ -4714,7 +4714,7 @@ void TDynamicObject::RenderSounds() {
|
||||
&& ( MoverParameters->Vel > 0.05 ) ) {
|
||||
|
||||
brakeforceratio =
|
||||
clamp(
|
||||
std::clamp(
|
||||
MoverParameters->UnitBrakeForce / std::max( 1.0, MoverParameters->BrakeForceR( 1.0, MoverParameters->Vel ) / ( MoverParameters->NAxles * std::max( 1, MoverParameters->NBpA ) ) ),
|
||||
0.0, 1.0 );
|
||||
rsBrake
|
||||
@@ -4966,7 +4966,7 @@ void TDynamicObject::RenderSounds() {
|
||||
volume *=
|
||||
interpolate(
|
||||
0.8, 1.2,
|
||||
clamp(
|
||||
std::clamp(
|
||||
MyTrack->iQualityFlag / 20.0,
|
||||
0.0, 1.0 ) );
|
||||
// for single sample sounds muffle the playback at low speeds
|
||||
@@ -4974,7 +4974,7 @@ void TDynamicObject::RenderSounds() {
|
||||
volume *=
|
||||
interpolate(
|
||||
0.0, 1.0,
|
||||
clamp(
|
||||
std::clamp(
|
||||
MoverParameters->Vel / 40.0,
|
||||
0.0, 1.0 ) );
|
||||
}
|
||||
@@ -5036,7 +5036,7 @@ void TDynamicObject::RenderSounds() {
|
||||
&& ( MoverParameters->WheelFlat > 5.0 ) ) {
|
||||
m_wheelflat
|
||||
.pitch( m_wheelflat.m_frequencyoffset + std::abs( MoverParameters->nrot ) * m_wheelflat.m_frequencyfactor )
|
||||
.gain( m_wheelflat.m_amplitudeoffset + m_wheelflat.m_amplitudefactor * ( ( 1.0 + ( MoverParameters->Vel / MoverParameters->Vmax ) + clamp( MoverParameters->WheelFlat / 60.0, 0.0, 1.0 ) ) / 3.0 ) )
|
||||
.gain( m_wheelflat.m_amplitudeoffset + m_wheelflat.m_amplitudefactor * ( ( 1.0 + ( MoverParameters->Vel / MoverParameters->Vmax ) + std::clamp( MoverParameters->WheelFlat / 60.0, 0.0, 1.0 ) ) / 3.0 ) )
|
||||
.play( sound_flags::exclusive | sound_flags::looping );
|
||||
}
|
||||
else {
|
||||
@@ -5053,7 +5053,7 @@ void TDynamicObject::RenderSounds() {
|
||||
std::abs( MoverParameters->AccN ) // * MoverParameters->AccN
|
||||
* interpolate(
|
||||
0.5, 1.0,
|
||||
clamp(
|
||||
std::clamp(
|
||||
MoverParameters->Vel / 40.0,
|
||||
0.0, 1.0 ) )
|
||||
* ( ( ( MyTrack->eType == tt_Switch ) && ( std::abs( ts.R ) < 1500.0 ) ) ? 100.0 : 1.0 );
|
||||
@@ -5310,7 +5310,7 @@ void TDynamicObject::LoadMMediaFile( std::string const &TypeName, std::string co
|
||||
if( i < asModel.length() ) {
|
||||
m_materialdata.multi_textures = asModel[ i + 1 ] - '0';
|
||||
}
|
||||
m_materialdata.multi_textures = clamp( m_materialdata.multi_textures, 0, 1 ); // na razie ustawiamy na 1
|
||||
m_materialdata.multi_textures = std::clamp( m_materialdata.multi_textures, 0, 1 ); // na razie ustawiamy na 1
|
||||
}
|
||||
*/
|
||||
asModel = asBaseDir + asModel; // McZapkie 2002-07-20: dynamics maja swoje modele w dynamics/basedir
|
||||
@@ -6563,7 +6563,7 @@ void TDynamicObject::LoadMMediaFile( std::string const &TypeName, std::string co
|
||||
>> soundproofing[ 5 ];
|
||||
for( auto & soundproofingelement : soundproofing ) {
|
||||
if( soundproofingelement != -1.f ) {
|
||||
soundproofingelement = std::sqrt( clamp( soundproofingelement, 0.f, 1.f ) );
|
||||
soundproofingelement = std::sqrt( std::clamp( soundproofingelement, 0.f, 1.f ) );
|
||||
}
|
||||
}
|
||||
m_pasystem.soundproofing = soundproofing;
|
||||
@@ -7017,7 +7017,7 @@ void TDynamicObject::LoadMMediaFile( std::string const &TypeName, std::string co
|
||||
for( auto &soundproofingelement : soundproofingtable ) {
|
||||
auto const value { parser.getToken<float>( false ) };
|
||||
if( value != -1.f ) {
|
||||
soundproofingelement = std::sqrt( clamp( value, 0.f, 1.f ) );
|
||||
soundproofingelement = std::sqrt( std::clamp( value, 0.f, 1.f ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8086,13 +8086,13 @@ TDynamicObject::update_shake( double const Timedelta ) {
|
||||
shakevector.x +=
|
||||
( std::sin( MoverParameters->eAngle * 4.0 ) * Timedelta * EngineShake.scale )
|
||||
// fade in with rpm above threshold
|
||||
* clamp(
|
||||
* std::clamp(
|
||||
( MoverParameters->enrot - EngineShake.fadein_offset ) * EngineShake.fadein_factor,
|
||||
0.0, 1.0 )
|
||||
// fade out with rpm above threshold
|
||||
* interpolate(
|
||||
1.0, 0.0,
|
||||
clamp(
|
||||
std::clamp(
|
||||
( MoverParameters->enrot - EngineShake.fadeout_offset ) * EngineShake.fadeout_factor,
|
||||
0.0, 1.0 ) );
|
||||
}
|
||||
@@ -8105,7 +8105,7 @@ TDynamicObject::update_shake( double const Timedelta ) {
|
||||
auto const huntingamount =
|
||||
interpolate(
|
||||
0.0, 1.0,
|
||||
clamp(
|
||||
std::clamp(
|
||||
( MoverParameters->Vel - HuntingShake.fadein_begin ) / ( HuntingShake.fadein_end - HuntingShake.fadein_begin ),
|
||||
0.0, 1.0 ) );
|
||||
shakevector.x +=
|
||||
@@ -8325,7 +8325,7 @@ TDynamicObject::powertrain_sounds::render( TMoverParameters const &Vehicle, doub
|
||||
engine_revs_change = std::max( 0.0, engine_revs_change - 2.5 * Deltatime );
|
||||
if( ( revolutionsperminute > idlerevolutionsthreshold )
|
||||
&& ( revolutionsdifference > 1.0 * Deltatime ) ) {
|
||||
engine_revs_change = clamp( engine_revs_change + 5.0 * Deltatime, 0.0, 1.25 );
|
||||
engine_revs_change = std::clamp( engine_revs_change + 5.0 * Deltatime, 0.0, 1.25 );
|
||||
}
|
||||
enginerevvolume = 0.8 * engine_revs_change;
|
||||
}
|
||||
@@ -8513,7 +8513,7 @@ TDynamicObject::powertrain_sounds::render( TMoverParameters const &Vehicle, doub
|
||||
}
|
||||
// scale motor volume based on whether they're active
|
||||
motor_momentum =
|
||||
clamp(
|
||||
std::clamp(
|
||||
motor_momentum
|
||||
- 1.0 * Deltatime // smooth out decay
|
||||
+ std::abs( Vehicle.Mm ) / 60.0 * Deltatime,
|
||||
|
||||
@@ -459,7 +459,7 @@ float TGauge::GetScaledValue() const {
|
||||
m_value
|
||||
* interpolate(
|
||||
m_scale, m_endscale,
|
||||
clamp(
|
||||
std::clamp(
|
||||
m_value / m_endvalue,
|
||||
0.f, 1.f ) )
|
||||
+ m_offset );
|
||||
|
||||
@@ -1108,7 +1108,7 @@ void TTrain::OnCommand_jointcontrollerset( TTrain *Train, command_data const &Co
|
||||
}
|
||||
else {
|
||||
Train->mvOccupied->LocalBrakePosA = (
|
||||
clamp(
|
||||
std::clamp(
|
||||
1.0 - ( Command.param1 * 2 ),
|
||||
0.0, 1.0 ) );
|
||||
if( Train->mvControlled->MainCtrlPowerPos() > 0 ) {
|
||||
@@ -1223,7 +1223,7 @@ void TTrain::OnCommand_secondcontrollerincrease( TTrain *Train, command_data con
|
||||
&& ( true == Train->mvControlled->ShuntModeAllow )
|
||||
&& ( true == Train->mvControlled->ShuntMode ) ) {
|
||||
if( Command.action != GLFW_RELEASE ) {
|
||||
Train->mvControlled->AnPos = clamp(
|
||||
Train->mvControlled->AnPos = std::clamp(
|
||||
Train->mvControlled->AnPos + 0.025,
|
||||
0.0, 1.0 );
|
||||
}
|
||||
@@ -1393,7 +1393,7 @@ void TTrain::OnCommand_secondcontrollerdecrease( TTrain *Train, command_data con
|
||||
if( ( Train->mvControlled->EngineType == TEngineType::DieselElectric )
|
||||
&& ( true == Train->mvControlled->ShuntMode ) ) {
|
||||
if( Command.action != GLFW_RELEASE ) {
|
||||
Train->mvControlled->AnPos = clamp(
|
||||
Train->mvControlled->AnPos = std::clamp(
|
||||
Train->mvControlled->AnPos - 0.025,
|
||||
0.0, 1.0 );
|
||||
}
|
||||
@@ -1577,7 +1577,7 @@ void TTrain::OnCommand_independentbrakeset( TTrain *Train, command_data const &C
|
||||
if( Command.action != GLFW_RELEASE ) {
|
||||
|
||||
Train->mvOccupied->LocalBrakePosA = (
|
||||
clamp(
|
||||
std::clamp(
|
||||
Command.param1,
|
||||
0.0, 1.0 ) );
|
||||
}
|
||||
@@ -1587,7 +1587,7 @@ void TTrain::OnCommand_independentbrakeset( TTrain *Train, command_data const &C
|
||||
interpolate<double>(
|
||||
0.0,
|
||||
LocalBrakePosNo,
|
||||
clamp(
|
||||
std::clamp(
|
||||
Command.param1,
|
||||
0.0, 1.0 ) ) ) );
|
||||
*/
|
||||
@@ -1716,7 +1716,7 @@ void TTrain::OnCommand_trainbrakeset( TTrain *Train, command_data const &Command
|
||||
interpolate(
|
||||
Train->mvOccupied->Handle->GetPos( bh_MIN ),
|
||||
Train->mvOccupied->Handle->GetPos( bh_MAX ),
|
||||
clamp(
|
||||
std::clamp(
|
||||
Command.param1,
|
||||
0.0, 1.0 ) ) );
|
||||
} else {
|
||||
@@ -1801,7 +1801,7 @@ void TTrain::OnCommand_trainbrakebasepressureincrease( TTrain *Train, command_da
|
||||
|
||||
switch( Train->mvOccupied->BrakeHandle ) {
|
||||
case TBrakeHandle::FV4a: {
|
||||
Train->mvOccupied->BrakeCtrlPos2 = clamp( Train->mvOccupied->BrakeCtrlPos2 - 0.01, -1.5, 2.0 );
|
||||
Train->mvOccupied->BrakeCtrlPos2 = std::clamp( Train->mvOccupied->BrakeCtrlPos2 - 0.01, -1.5, 2.0 );
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
@@ -1818,7 +1818,7 @@ void TTrain::OnCommand_trainbrakebasepressuredecrease( TTrain *Train, command_da
|
||||
|
||||
switch( Train->mvOccupied->BrakeHandle ) {
|
||||
case TBrakeHandle::FV4a: {
|
||||
Train->mvOccupied->BrakeCtrlPos2 = clamp( Train->mvOccupied->BrakeCtrlPos2 + 0.01, -1.5, 2.0 );
|
||||
Train->mvOccupied->BrakeCtrlPos2 = std::clamp( Train->mvOccupied->BrakeCtrlPos2 + 0.01, -1.5, 2.0 );
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
@@ -3032,7 +3032,7 @@ void TTrain::change_pantograph_selection( int const Change ) {
|
||||
auto const &presets { mvOccupied->PantsPreset.first };
|
||||
auto &selection { mvOccupied->PantsPreset.second[ cab_to_end() ] };
|
||||
auto const initialstate { selection };
|
||||
selection = clamp<int>( selection + Change, 0, std::max<int>( presets.size() - 1, 0 ) );
|
||||
selection = std::clamp( selection + Change, 0, std::max<int>( presets.size() - 1, 0 ) );
|
||||
|
||||
if( selection == initialstate ) { return; } // no change, nothing to do
|
||||
|
||||
@@ -5125,7 +5125,7 @@ void TTrain::OnCommand_redmarkerstoggle( TTrain *Train, command_data const &Comm
|
||||
auto locationHead = vehicle->HeadPosition() - glm::dvec3(Command.location); // TODO: Maybe command_data should be dvec3?
|
||||
auto locationRear = vehicle->RearPosition() - glm::dvec3(Command.location);
|
||||
int const CouplNr {
|
||||
clamp(vehicle->DirectionGet() * (glm::dot(locationHead, locationHead) > glm::dot(locationRear, locationRear) ?
|
||||
std::clamp(vehicle->DirectionGet() * (glm::dot(locationHead, locationHead) > glm::dot(locationRear, locationRear) ?
|
||||
1 :
|
||||
-1 ),
|
||||
0, 1 ) }; // z [-1,1] zrobić [0,1]
|
||||
@@ -5148,7 +5148,7 @@ void TTrain::OnCommand_endsignalstoggle( TTrain *Train, command_data const &Comm
|
||||
|
||||
if( vehicle == nullptr ) { return; }
|
||||
int const CouplNr {
|
||||
clamp(
|
||||
std::clamp(
|
||||
vehicle->DirectionGet()
|
||||
* ( glm::length2( vehicle->HeadPosition() - glm::dvec3(Command.location) ) > glm::length2( vehicle->RearPosition() - glm::dvec3(Command.location) ) ?
|
||||
1 :
|
||||
@@ -6859,7 +6859,7 @@ void TTrain::OnCommand_radiochanneldecrease( TTrain *Train, command_data const &
|
||||
void TTrain::OnCommand_radiochannelset(TTrain *Train, command_data const &Command) {
|
||||
if( Command.action != GLFW_RELEASE ) {
|
||||
// on press or hold
|
||||
Train->RadioChannel() = clamp((int) Command.param1, 1, 10);
|
||||
Train->RadioChannel() = std::clamp((int) Command.param1, 1, 10);
|
||||
Train->ggRadioChannelSelector.UpdateValue( Train->RadioChannel() - 1 );
|
||||
}
|
||||
}
|
||||
@@ -6981,7 +6981,7 @@ void TTrain::OnCommand_radiovolumedecrease(TTrain *Train, command_data const &Co
|
||||
void TTrain::OnCommand_radiovolumeset(TTrain *Train, command_data const &Command) {
|
||||
if( Command.action != GLFW_RELEASE ) {
|
||||
// on press or hold
|
||||
Train->m_radiovolume = clamp(Command.param1, 0.0, 1.0);
|
||||
Train->m_radiovolume = std::clamp(Command.param1, 0.0, 1.0);
|
||||
Train->ggRadioVolumeSelector.UpdateValue(Train->m_radiovolume);
|
||||
audio::event_volume_change = true;
|
||||
}
|
||||
@@ -8218,7 +8218,7 @@ bool TTrain::Update( double const Deltatime )
|
||||
{
|
||||
double b = Console::AnalogCalibrateGet(0);
|
||||
b = b * 8.0 - 2.0;
|
||||
b = clamp<double>( b, -2.0, mvOccupied->BrakeCtrlPosNo ); // przycięcie zmiennej do granic
|
||||
b = std::clamp( b, -2.0, (double)mvOccupied->BrakeCtrlPosNo ); // przycięcie zmiennej do granic
|
||||
ggBrakeCtrl.UpdateValue(b); // przesów bez zaokrąglenia
|
||||
mvOccupied->BrakeLevelSet(b);
|
||||
}
|
||||
@@ -8226,14 +8226,14 @@ bool TTrain::Update( double const Deltatime )
|
||||
{
|
||||
double b = Console::AnalogCalibrateGet(0);
|
||||
b = b * 7.0 - 1.0;
|
||||
b = clamp<double>( b, -1.0, mvOccupied->BrakeCtrlPosNo ); // przycięcie zmiennej do granic
|
||||
b = std::clamp(b, -1.0, (double)mvOccupied->BrakeCtrlPosNo); // przycięcie zmiennej do granic
|
||||
ggBrakeCtrl.UpdateValue(b); // przesów bez zaokrąglenia
|
||||
mvOccupied->BrakeLevelSet(b);
|
||||
}
|
||||
else {
|
||||
double b = Console::AnalogCalibrateGet( 0 );
|
||||
b = b * ( mvOccupied->Handle->GetPos( bh_MAX ) - mvOccupied->Handle->GetPos( bh_MIN ) ) + mvOccupied->Handle->GetPos( bh_MIN );
|
||||
b = clamp<double>( b, mvOccupied->Handle->GetPos( bh_MIN ), mvOccupied->Handle->GetPos( bh_MAX ) ); // przycięcie zmiennej do granic
|
||||
b = std::clamp(b, mvOccupied->Handle->GetPos(bh_MIN), mvOccupied->Handle->GetPos(bh_MAX)); // przycięcie zmiennej do granic
|
||||
ggBrakeCtrl.UpdateValue( b ); // przesów bez zaokrąglenia
|
||||
mvOccupied->BrakeLevelSet( b );
|
||||
}
|
||||
@@ -8257,8 +8257,8 @@ bool TTrain::Update( double const Deltatime )
|
||||
/* || ( Global.bMWDmasterEnable && Global.bMWDBreakEnable )*/ ) ) {
|
||||
// Ra: nie najlepsze miejsce, ale na początek gdzieś to dać trzeba
|
||||
// Firleju: dlatego kasujemy i zastepujemy funkcją w Console
|
||||
auto const b = clamp<double>(
|
||||
Console::AnalogCalibrateGet( 1 ),
|
||||
auto const b = std::clamp(
|
||||
(double)Console::AnalogCalibrateGet( 1 ),
|
||||
0.0,
|
||||
1.0 );
|
||||
mvOccupied->LocalBrakePosA = b;
|
||||
@@ -8559,7 +8559,7 @@ TTrain::update_sounds( double const Deltatime ) {
|
||||
if( rsSBHiss ) {
|
||||
if( ( m_localbrakepressurechange < -0.05f )
|
||||
&& ( mvOccupied->LocBrakePress > mvOccupied->BrakePress - 0.05 ) ) {
|
||||
rsSBHiss->gain( clamp( rsSBHiss->m_amplitudeoffset + rsSBHiss->m_amplitudefactor * -m_localbrakepressurechange * 0.05, 0.0, 1.5 ) );
|
||||
rsSBHiss->gain( std::clamp( rsSBHiss->m_amplitudeoffset + rsSBHiss->m_amplitudefactor * -m_localbrakepressurechange * 0.05, 0.0, 1.5 ) );
|
||||
rsSBHiss->play( sound_flags::exclusive | sound_flags::looping );
|
||||
}
|
||||
else {
|
||||
@@ -8574,7 +8574,7 @@ TTrain::update_sounds( double const Deltatime ) {
|
||||
// local brake, engage
|
||||
if( rsSBHissU ) {
|
||||
if( m_localbrakepressurechange > 0.05f ) {
|
||||
rsSBHissU->gain( clamp( rsSBHissU->m_amplitudeoffset + rsSBHissU->m_amplitudefactor * m_localbrakepressurechange * 0.05, 0.0, 1.5 ) );
|
||||
rsSBHissU->gain( std::clamp( rsSBHissU->m_amplitudeoffset + rsSBHissU->m_amplitudefactor * m_localbrakepressurechange * 0.05, 0.0, 1.5 ) );
|
||||
rsSBHissU->play( sound_flags::exclusive | sound_flags::looping );
|
||||
}
|
||||
else {
|
||||
@@ -8695,7 +8695,7 @@ TTrain::update_sounds( double const Deltatime ) {
|
||||
&& ( mvOccupied->Vel > 0.05 ) ) {
|
||||
|
||||
auto const brakeforceratio{
|
||||
clamp(
|
||||
std::clamp(
|
||||
mvOccupied->UnitBrakeForce / std::max( 1.0, mvOccupied->BrakeForceR( 1.0, mvOccupied->Vel ) / ( mvOccupied->NAxles * std::max( 1, mvOccupied->NBpA ) ) ),
|
||||
0.0, 1.0 ) };
|
||||
// HACK: in external view mute the sound rather than stop it, in case there's an opening bookend it'd (re)play on sound restart after returning inside
|
||||
@@ -8778,7 +8778,7 @@ TTrain::update_sounds( double const Deltatime ) {
|
||||
auto const huntingamount =
|
||||
interpolate(
|
||||
0.0, 1.0,
|
||||
clamp(
|
||||
std::clamp(
|
||||
( mvOccupied->Vel - DynamicObject->HuntingShake.fadein_begin ) / ( DynamicObject->HuntingShake.fadein_end - DynamicObject->HuntingShake.fadein_begin ),
|
||||
0.0, 1.0 ) );
|
||||
|
||||
@@ -8936,7 +8936,7 @@ void TTrain::update_sounds_runningnoise( sound_source &Sound ) {
|
||||
if( std::abs( mvOccupied->nrot ) > 0.01 ) {
|
||||
// hamulce wzmagaja halas
|
||||
auto const brakeforceratio { (
|
||||
clamp(
|
||||
std::clamp(
|
||||
mvOccupied->UnitBrakeForce / std::max( 1.0, mvOccupied->BrakeForceR( 1.0, mvOccupied->Vel ) / ( mvOccupied->NAxles * std::max( 1, mvOccupied->NBpA ) ) ),
|
||||
0.0, 1.0 ) ) };
|
||||
|
||||
@@ -8947,7 +8947,7 @@ void TTrain::update_sounds_runningnoise( sound_source &Sound ) {
|
||||
volume *=
|
||||
interpolate(
|
||||
0.8, 1.2,
|
||||
clamp(
|
||||
std::clamp(
|
||||
DynamicObject->MyTrack->iQualityFlag / 20.0,
|
||||
0.0, 1.0 ) );
|
||||
// for single sample sounds muffle the playback at low speeds
|
||||
@@ -8955,7 +8955,7 @@ void TTrain::update_sounds_runningnoise( sound_source &Sound ) {
|
||||
volume *=
|
||||
interpolate(
|
||||
0.0, 1.0,
|
||||
clamp(
|
||||
std::clamp(
|
||||
mvOccupied->Vel / 25.0,
|
||||
0.0, 1.0 ) );
|
||||
}
|
||||
@@ -9728,9 +9728,9 @@ glm::dvec3 TTrain::clamp_inside(glm::dvec3 const &Point) const
|
||||
if( DebugModeFlag ) { return Point; }
|
||||
|
||||
return {
|
||||
clamp( Point.x, (double)Cabine[ iCabn ].CabPos1.x, (double)Cabine[ iCabn ].CabPos2.x ),
|
||||
clamp( Point.y, (double)Cabine[ iCabn ].CabPos1.y + 0.5, (double)Cabine[ iCabn ].CabPos2.y + 1.8 ),
|
||||
clamp( Point.z, (double)Cabine[ iCabn ].CabPos1.z, (double)Cabine[ iCabn ].CabPos2.z ) };
|
||||
std::clamp( Point.x, (double)Cabine[ iCabn ].CabPos1.x, (double)Cabine[ iCabn ].CabPos2.x ),
|
||||
std::clamp( Point.y, (double)Cabine[ iCabn ].CabPos1.y + 0.5, (double)Cabine[ iCabn ].CabPos2.y + 1.8 ),
|
||||
std::clamp( Point.z, (double)Cabine[ iCabn ].CabPos1.z, (double)Cabine[ iCabn ].CabPos2.z ) };
|
||||
}
|
||||
|
||||
const TTrain::screenentry_sequence& TTrain::get_screens() {
|
||||
@@ -10966,7 +10966,7 @@ bool TTrain::initialize_gauge(cParser &Parser, std::string const &Label, int con
|
||||
Parser >> i >> j;
|
||||
auto &gauge = Cabine[Cabindex].Gauge(-1); // pierwsza wolna gałka
|
||||
gauge.Load(Parser, DynamicObject, 0.1);
|
||||
gauge.AssignFloat(&fPress[clamp(i, 1, 20) - 1][clamp(j, 0, 3)]);
|
||||
gauge.AssignFloat(&fPress[std::clamp(i, 1, 20) - 1][std::clamp(j, 0, 3)]);
|
||||
}
|
||||
else if ((Label == "brakepress:") || (Label == "brakepressb:"))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user