From 88c19b2817d9e6f07d0dafffe6817bd089247230 Mon Sep 17 00:00:00 2001 From: tmj-fstate Date: Mon, 15 Jan 2018 23:05:17 +0100 Subject: [PATCH] build 180115. cab indicators for selected brake acting speed, support for multi-part revving sound, minor emu brake sound fixes --- DynObj.cpp | 35 ++++++++------ Train.cpp | 132 ++++++++++++++++++----------------------------------- Train.h | 8 +++- version.h | 2 +- 4 files changed, 74 insertions(+), 103 deletions(-) diff --git a/DynObj.cpp b/DynObj.cpp index 9c49d2c7..bb10ed2d 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -5560,15 +5560,11 @@ TDynamicObject::powertrain_sounds::render( TMoverParameters const &Vehicle, doub } if( engine_volume >= 0.05 ) { - engine - .pitch( frequency ) - .gain( engine_volume ) - .play( sound_flags::exclusive | sound_flags::looping ); + auto enginerevvolume { 0.f }; if( ( Vehicle.EngineType == DieselElectric ) || ( Vehicle.EngineType == DieselEngine ) ) { - // diesel engine revolutions increase - float enginerevvolume { 0 }; + // diesel engine revolutions increase; it can potentially decrease volume of base engine sound if( engine_revs_last != -1.f ) { // calculate potential recent increase of engine revolutions auto const revolutionsperminute { Vehicle.enrot * 60 }; @@ -5583,25 +5579,36 @@ TDynamicObject::powertrain_sounds::render( TMoverParameters const &Vehicle, doub && ( revolutionsdifference > 1.0 * Deltatime ) ) { engine_revs_change = clamp( engine_revs_change + 5.0 * Deltatime, 0.0, 1.25 ); } - enginerevvolume = engine_revs_change; + enginerevvolume = 0.8 * engine_revs_change; } engine_revs_last = Vehicle.enrot * 60; - if( false == engine_revving.is_combined() ) { - // if the sound comes with multiple samples we reuse rpm-based calculation from the engine - frequency = engine_revving.m_frequencyoffset + engine_revving.m_frequencyfactor * 1.0; - } + auto const enginerevfrequency { ( + false == engine_revving.is_combined() ? + // if the sound contains multiple samples we reuse rpm-based calculation from the engine + frequency : + engine_revving.m_frequencyoffset + 1.f * engine_revving.m_frequencyfactor ) }; if( enginerevvolume > 0.02 ) { engine_revving - .pitch( frequency ) + .pitch( enginerevfrequency ) .gain( enginerevvolume ) - .play( sound_flags::exclusive | sound_flags::looping ); + .play( sound_flags::exclusive ); } else { engine_revving.stop(); } - } + } // diesel engines + + // multi-part revving sound pieces replace base engine sound, single revving simply gets mixed with the base + auto const enginevolume { ( + ( ( enginerevvolume > 0.02 ) && ( true == engine_revving.is_combined() ) ) ? + std::max( 0.0, engine_volume - enginerevvolume ) : + engine_volume ) }; + engine + .pitch( frequency ) + .gain( enginevolume ) + .play( sound_flags::exclusive | sound_flags::looping ); } // enginevolume > 0.05 } else { diff --git a/Train.cpp b/Train.cpp index 604a2dbc..c192f001 100644 --- a/Train.cpp +++ b/Train.cpp @@ -321,7 +321,6 @@ TTrain::TTrain() { pMechOffset = vector3(0, 0, 0); fBlinkTimer = 0; fHaslerTimer = 0; - keybrakecount = 0; DynamicSet(NULL); // ustawia wszystkie mv* iCabLightFlag = 0; // hunter-091012 @@ -546,6 +545,24 @@ bool TTrain::is_eztoer() const { && ( mvControlled->ActiveDir != 0 ) ); // od yB } +// moves train brake lever to specified position, potentially emits switch sound if conditions are met +void TTrain::set_train_brake( int const Position ) { + + auto const originalbrakeposition { mvOccupied->BrakeCtrlPos }; + + mvOccupied->BrakeLevelSet( Position ); + + if( mvOccupied->BrakeCtrlPos == originalbrakeposition ) { return; } + + if( ( true == is_eztoer() ) + && ( false == ( + ( ( originalbrakeposition == 0 ) || ( originalbrakeposition >= 5 ) ) + && ( ( mvOccupied->BrakeCtrlPos == 0 ) || ( mvOccupied->BrakeCtrlPos >= 5 ) ) ) ) ) { + // sound feedback if the lever movement activates one of the switches + dsbPneumaticSwitch.play(); + } +} + // locates nearest vehicle belonging to the consist TDynamicObject * TTrain::find_nearest_consist_vehicle() const { @@ -795,14 +812,7 @@ void TTrain::OnCommand_trainbrakeincrease( TTrain *Train, command_data const &Co Train->mvOccupied->BrakeLevelAdd( 0.1 /*15.0 * Command.time_delta*/ ); } else { - if( Train->mvOccupied->BrakeLevelAdd( Global::fBrakeStep ) ) { - // nieodpowiedni warunek; true, jeśli można dalej kręcić - Train->keybrakecount = 0; - if( ( Train->is_eztoer() ) && ( Train->mvOccupied->BrakeCtrlPos < 3 ) ) { - // Ra: uzależnić dźwięk od zmiany stanu EP, nie od klawisza - Train->dsbPneumaticSwitch.play(); - } - } + Train->set_train_brake( Train->mvOccupied->BrakeCtrlPos + Global::fBrakeStep ); } } } @@ -815,21 +825,7 @@ void TTrain::OnCommand_trainbrakedecrease( TTrain *Train, command_data const &Co Train->mvOccupied->BrakeLevelAdd( -0.1 /*-15.0 * Command.time_delta*/ ); } else { - // nową wersję dostarczył ZiomalCl ("fixed looped sound in ezt when using NUM_9 key") - if( ( Train->mvOccupied->BrakeCtrlPos > -1 ) - || ( Train->keybrakecount > 1 ) ) { - - if( ( Train->is_eztoer() ) - && ( Train->mvControlled->Mains ) - && ( Train->mvOccupied->BrakeCtrlPos != -1 ) ) { - // Ra: uzależnić dźwięk od zmiany stanu EP, nie od klawisza - Train->dsbPneumaticSwitch.play(); - } - Train->mvOccupied->BrakeLevelAdd( -Global::fBrakeStep ); - } - else - Train->keybrakecount += 1; - // koniec wersji dostarczonej przez ZiomalCl + Train->set_train_brake( Train->mvOccupied->BrakeCtrlPos - Global::fBrakeStep ); } } else { @@ -837,16 +833,9 @@ void TTrain::OnCommand_trainbrakedecrease( TTrain *Train, command_data const &Co if( ( Train->mvOccupied->BrakeCtrlPos == -1 ) && ( Train->mvOccupied->BrakeHandle == FVel6 ) && ( Train->DynamicObject->Controller != AIdriver ) - && ( Global::iFeedbackMode != 4 ) - && ( !( Global::bMWDmasterEnable && Global::bMWDBreakEnable ) ) ) { + && ( Global::iFeedbackMode < 3 ) ) { // Odskakiwanie hamulce EP - Train->mvOccupied->BrakeLevelSet( Train->mvOccupied->BrakeCtrlPos + 1 ); - Train->keybrakecount = 0; - if( ( Train->mvOccupied->TrainType == dt_EZT ) - && ( Train->mvControlled->Mains ) - && ( Train->mvControlled->ActiveDir != 0 ) ) { - Train->dsbPneumaticSwitch.play(); - } + Train->set_train_brake( 0 ); } } } @@ -855,30 +844,16 @@ void TTrain::OnCommand_trainbrakecharging( TTrain *Train, command_data const &Co if( Command.action != GLFW_RELEASE ) { // press or hold - // sound feedback - if( ( Train->is_eztoer() ) - && ( Train->mvControlled->Mains ) - && ( Train->mvOccupied->BrakeCtrlPos != -1 ) ) { - Train->dsbPneumaticSwitch.play(); - } - - Train->mvOccupied->BrakeLevelSet( -1 ); + Train->set_train_brake( -1 ); } else { // release if( ( Train->mvOccupied->BrakeCtrlPos == -1 ) && ( Train->mvOccupied->BrakeHandle == FVel6 ) && ( Train->DynamicObject->Controller != AIdriver ) - && ( Global::iFeedbackMode != 4 ) - && ( !( Global::bMWDmasterEnable && Global::bMWDBreakEnable ) ) ) { + && ( Global::iFeedbackMode < 3 ) ) { // Odskakiwanie hamulce EP - Train->mvOccupied->BrakeLevelSet( Train->mvOccupied->BrakeCtrlPos + 1 ); - Train->keybrakecount = 0; - if( ( Train->mvOccupied->TrainType == dt_EZT ) - && ( Train->mvControlled->Mains ) - && ( Train->mvControlled->ActiveDir != 0 ) ) { - Train->dsbPneumaticSwitch.play(); - } + Train->set_train_brake( 0 ); } } } @@ -887,14 +862,7 @@ void TTrain::OnCommand_trainbrakerelease( TTrain *Train, command_data const &Com if( Command.action == GLFW_PRESS ) { - // sound feedback - if( ( Train->is_eztoer() ) - && ( ( Train->mvOccupied->BrakeCtrlPos == 1 ) - || ( Train->mvOccupied->BrakeCtrlPos == -1 ) ) ) { - Train->dsbPneumaticSwitch.play(); - } - - Train->mvOccupied->BrakeLevelSet( 0 ); + Train->set_train_brake( 0 ); } } @@ -902,14 +870,7 @@ void TTrain::OnCommand_trainbrakefirstservice( TTrain *Train, command_data const if( Command.action == GLFW_PRESS ) { - // sound feedback - if( ( Train->is_eztoer() ) - && ( Train->mvControlled->Mains ) - && ( Train->mvOccupied->BrakeCtrlPos != 1 ) ) { - Train->dsbPneumaticSwitch.play(); - } - - Train->mvOccupied->BrakeLevelSet( 1 ); + Train->set_train_brake( 1 ); } } @@ -917,19 +878,11 @@ void TTrain::OnCommand_trainbrakeservice( TTrain *Train, command_data const &Com if( Command.action == GLFW_PRESS ) { - // sound feedback - if( ( Train->is_eztoer() ) - && ( Train->mvControlled->Mains ) - && ( ( Train->mvOccupied->BrakeCtrlPos == 1 ) - || ( Train->mvOccupied->BrakeCtrlPos == -1 ) ) ) { - Train->dsbPneumaticSwitch.play(); - } - - Train->mvOccupied->BrakeLevelSet( + Train->set_train_brake( ( Train->mvOccupied->BrakeCtrlPosNo / 2 + ( Train->mvOccupied->BrakeHandle == FV4a ? - 1 : - 0 ) ); + 1 : + 0 ) ) ); } } @@ -937,14 +890,7 @@ void TTrain::OnCommand_trainbrakefullservice( TTrain *Train, command_data const if( Command.action == GLFW_PRESS ) { - // sound feedback - if( ( Train->is_eztoer() ) - && ( Train->mvControlled->Mains ) - && ( ( Train->mvOccupied->BrakeCtrlPos == 1 ) - || ( Train->mvOccupied->BrakeCtrlPos == -1 ) ) ) { - Train->dsbPneumaticSwitch.play(); - } - Train->mvOccupied->BrakeLevelSet( Train->mvOccupied->BrakeCtrlPosNo - 1 ); + Train->set_train_brake( Train->mvOccupied->BrakeCtrlPosNo - 1 ); } } @@ -952,7 +898,7 @@ void TTrain::OnCommand_trainbrakehandleoff( TTrain *Train, command_data const &C if( Command.action == GLFW_PRESS ) { - Train->mvOccupied->BrakeLevelSet( Train->mvOccupied->Handle->GetPos( bh_NP ) ); + Train->set_train_brake( Train->mvOccupied->Handle->GetPos( bh_NP ) ); } } @@ -960,7 +906,7 @@ void TTrain::OnCommand_trainbrakeemergency( TTrain *Train, command_data const &C if( Command.action == GLFW_PRESS ) { - Train->mvOccupied->BrakeLevelSet( Train->mvOccupied->Handle->GetPos( bh_EB ) ); + Train->set_train_brake( Train->mvOccupied->Handle->GetPos( bh_EB ) ); /* if( Train->mvOccupied->BrakeCtrlPosNo <= 0.1 ) { // hamulec bezpieczeństwa dla wagonów @@ -3988,6 +3934,9 @@ bool TTrain::Update( double const Deltatime ) btLampkaForward.Turn(mvControlled->ActiveDir > 0); // jazda do przodu btLampkaBackward.Turn(mvControlled->ActiveDir < 0); // jazda do tyłu btLampkaED.Turn(mvControlled->DynamicBrakeFlag); // hamulec ED + btLampkaBrakeProfileG.Turn( TestFlag( mvOccupied->BrakeDelayFlag, bdelay_G ) ); + btLampkaBrakeProfileP.Turn( TestFlag( mvOccupied->BrakeDelayFlag, bdelay_P ) ); + btLampkaBrakeProfileR.Turn( TestFlag( mvOccupied->BrakeDelayFlag, bdelay_R ) ); // light indicators // NOTE: sides are hardcoded to deal with setups where single cab is equipped with all indicators btLampkaUpperLight.Turn( ( mvOccupied->iLights[ side::front ] & light::headlight_upper ) != 0 ); @@ -4005,6 +3954,9 @@ bool TTrain::Update( double const Deltatime ) { // gdy bateria wyłączona btLampkaHamienie.Turn( false ); btLampkaBrakingOff.Turn( false ); + btLampkaBrakeProfileG.Turn( false ); + btLampkaBrakeProfileP.Turn( false ); + btLampkaBrakeProfileR.Turn( false ); btLampkaMaxSila.Turn( false ); btLampkaPrzekrMaxSila.Turn( false ); btLampkaRadio.Turn( false ); @@ -5267,6 +5219,9 @@ void TTrain::clear_cab_controls() btLampkaRadiotelefon.Clear(); btLampkaHamienie.Clear(); btLampkaBrakingOff.Clear(); + btLampkaBrakeProfileG.Clear(); + btLampkaBrakeProfileP.Clear(); + btLampkaBrakeProfileR.Clear(); btLampkaSprezarka.Clear(); btLampkaSprezarkaB.Clear(); btLampkaSprezarkaOff.Clear(); @@ -5544,6 +5499,9 @@ bool TTrain::initialize_button(cParser &Parser, std::string const &Label, int co { "i-braking:", btLampkaHamienie }, { "i-brakingoff:", btLampkaBrakingOff }, { "i-dynamicbrake:", btLampkaED }, + { "i-brakeprofileg:", btLampkaBrakeProfileG }, + { "i-brakeprofilep:", btLampkaBrakeProfileP }, + { "i-brakeprofiler:", btLampkaBrakeProfileR }, { "i-braking-ezt:", btLampkaHamowanie1zes }, { "i-braking-ezt2:", btLampkaHamowanie2zes }, { "i-compressor:", btLampkaSprezarka }, diff --git a/Train.h b/Train.h index c04f7f23..54f8ec85 100644 --- a/Train.h +++ b/Train.h @@ -114,6 +114,9 @@ class TTrain bool is_eztoer() const; // locates nearest vehicle belonging to the consist TDynamicObject *find_nearest_consist_vehicle() const; + // moves train brake lever to specified position, potentially emits switch sound if conditions are met + void set_train_brake( int const Position ); + // command handlers // NOTE: we're currently using universal handlers and static handler map but it may be beneficial to have these implemented on individual class instance basis @@ -377,6 +380,10 @@ public: // reszta może by?publiczna TButton btLampkaHamienie; TButton btLampkaBrakingOff; TButton btLampkaED; // Stele 161228 hamowanie elektrodynamiczne + TButton btLampkaBrakeProfileG; // cargo train brake acting speed + TButton btLampkaBrakeProfileP; // passenger train brake acting speed + TButton btLampkaBrakeProfileR; // rapid brake acting speed + // KURS90 TButton btLampkaBoczniki; TButton btLampkaMaxSila; @@ -468,7 +475,6 @@ private: double fPoslizgTimer; TTrack *tor; - int keybrakecount; // McZapkie-240302 - przyda sie do tachometru float fTachoVelocity{ 0.0f }; float fTachoVelocityJump{ 0.0f }; // ze skakaniem diff --git a/version.h b/version.h index a3cd5520..36e55658 100644 --- a/version.h +++ b/version.h @@ -1,5 +1,5 @@ #pragma once #define VERSION_MAJOR 18 -#define VERSION_MINOR 114 +#define VERSION_MINOR 115 #define VERSION_REVISION 0