mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-22 16:19:19 +02:00
engine revolutions change rate tweak for diesel-electric vehicles, support for combined engine revving sound, alerter ui indicator
This commit is contained in:
18
DynObj.cpp
18
DynObj.cpp
@@ -4596,6 +4596,12 @@ void TDynamicObject::LoadMMediaFile( std::string BaseDir, std::string TypeName,
|
|||||||
m_powertrainsounds.engine.m_amplitudefactor /= amplitudedivisor;
|
m_powertrainsounds.engine.m_amplitudefactor /= amplitudedivisor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if( token == "dieselinc:" ) {
|
||||||
|
// dzwiek przy wlazeniu na obroty woodwarda
|
||||||
|
m_powertrainsounds.engine_revving.deserialize( parser, sound_type::single, sound_parameters::range );
|
||||||
|
m_powertrainsounds.engine_revving.owner( this );
|
||||||
|
}
|
||||||
|
|
||||||
else if( ( token == "tractionmotor:" )
|
else if( ( token == "tractionmotor:" )
|
||||||
&& ( MoverParameters->Power > 0 ) ) {
|
&& ( MoverParameters->Power > 0 ) ) {
|
||||||
// plik z dzwiekiem silnika, mnozniki i ofsety amp. i czest.
|
// plik z dzwiekiem silnika, mnozniki i ofsety amp. i czest.
|
||||||
@@ -4659,12 +4665,6 @@ void TDynamicObject::LoadMMediaFile( std::string BaseDir, std::string TypeName,
|
|||||||
rsDerailment.owner( this );
|
rsDerailment.owner( this );
|
||||||
}
|
}
|
||||||
|
|
||||||
else if( token == "dieselinc:" ) {
|
|
||||||
// dzwiek przy wlazeniu na obroty woodwarda
|
|
||||||
m_powertrainsounds.engine_revving.deserialize( parser, sound_type::single, sound_parameters::range );
|
|
||||||
m_powertrainsounds.engine_revving.owner( this );
|
|
||||||
}
|
|
||||||
|
|
||||||
else if( token == "curve:" ) {
|
else if( token == "curve:" ) {
|
||||||
rscurve.deserialize( parser, sound_type::single, sound_parameters::range );
|
rscurve.deserialize( parser, sound_type::single, sound_parameters::range );
|
||||||
rscurve.owner( this );
|
rscurve.owner( this );
|
||||||
@@ -5595,8 +5595,14 @@ TDynamicObject::powertrain_sounds::render( TMoverParameters const &Vehicle, doub
|
|||||||
}
|
}
|
||||||
engine_revs_last = Vehicle.enrot * 60;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
if( enginerevvolume > 0.02 ) {
|
if( enginerevvolume > 0.02 ) {
|
||||||
engine_revving
|
engine_revving
|
||||||
|
.pitch( frequency )
|
||||||
.gain( enginerevvolume )
|
.gain( enginerevvolume )
|
||||||
.play( sound_flags::exclusive | sound_flags::looping );
|
.play( sound_flags::exclusive | sound_flags::looping );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4191,43 +4191,59 @@ double TMoverParameters::CouplerForce(int CouplerN, double dt)
|
|||||||
// *************************************************************************************************
|
// *************************************************************************************************
|
||||||
double TMoverParameters::TractionForce(double dt)
|
double TMoverParameters::TractionForce(double dt)
|
||||||
{
|
{
|
||||||
double PosRatio, dmoment, dtrans, tmp;// , tmpV;
|
double PosRatio, dmoment, dtrans, tmp;
|
||||||
int i;
|
|
||||||
|
|
||||||
Ft = 0;
|
Ft = 0;
|
||||||
dtrans = 0;
|
dtrans = 0;
|
||||||
dmoment = 0;
|
dmoment = 0;
|
||||||
// tmpV =Abs(nrot * WheelDiameter / 2);
|
|
||||||
// youBy
|
// youBy
|
||||||
if (EngineType == DieselElectric)
|
switch( EngineType ) {
|
||||||
{
|
case DieselElectric: {
|
||||||
|
if( true == ConverterFlag ) {
|
||||||
|
// NOTE: converter is currently a stand-in for a fuel pump
|
||||||
tmp = DElist[ MainCtrlPos ].RPM / 60.0;
|
tmp = DElist[ MainCtrlPos ].RPM / 60.0;
|
||||||
if ((Heating) && (HeatingPower > 0) && (MainCtrlPosNo > MainCtrlPos))
|
|
||||||
{
|
if( ( true == Heating )
|
||||||
i = MainCtrlPosNo;
|
&& ( HeatingPower > 0 )
|
||||||
while (DElist[i - 2].RPM / 60.0 > tmp)
|
&& ( MainCtrlPosNo > MainCtrlPos ) ) {
|
||||||
i--;
|
|
||||||
|
int i = MainCtrlPosNo;
|
||||||
|
while( DElist[ i - 2 ].RPM / 60.0 > tmp ) {
|
||||||
|
--i;
|
||||||
|
}
|
||||||
tmp = DElist[ i ].RPM / 60.0;
|
tmp = DElist[ i ].RPM / 60.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enrot != tmp * int(ConverterFlag))
|
|
||||||
if (abs(tmp * int(ConverterFlag) - enrot) < 0.001)
|
|
||||||
enrot = tmp * int(ConverterFlag);
|
|
||||||
else if ((enrot < DElist[0].RPM * 0.01) && (ConverterFlag))
|
|
||||||
enrot += (tmp * int(ConverterFlag) - enrot) * dt / 5.0;
|
|
||||||
else
|
|
||||||
enrot += (tmp * int(ConverterFlag) - enrot) * 1.5 * dt;
|
|
||||||
}
|
}
|
||||||
else if (EngineType != DieselEngine)
|
else {
|
||||||
enrot = Transmision.Ratio * nrot;
|
tmp = 0.0;
|
||||||
else // dla DieselEngine
|
}
|
||||||
{
|
|
||||||
|
if( enrot != tmp ) {
|
||||||
|
enrot = clamp(
|
||||||
|
enrot + ( dt / 1.25 ) * ( // TODO: equivalent of dizel_aim instead of fixed inertia
|
||||||
|
enrot < tmp ?
|
||||||
|
1.0 :
|
||||||
|
-2.0 ), // NOTE: revolutions drop faster than they rise, maybe? TBD: maybe not
|
||||||
|
0.0, std::max( tmp, enrot ) );
|
||||||
|
if( std::abs( tmp - enrot ) < 0.001 ) {
|
||||||
|
enrot = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DieselEngine: {
|
||||||
if( ShuntMode ) // dodatkowa przekładnia np. dla 2Ls150
|
if( ShuntMode ) // dodatkowa przekładnia np. dla 2Ls150
|
||||||
dtrans = AnPos * Transmision.Ratio * MotorParam[ ScndCtrlActualPos ].mIsat;
|
dtrans = AnPos * Transmision.Ratio * MotorParam[ ScndCtrlActualPos ].mIsat;
|
||||||
else
|
else
|
||||||
dtrans = Transmision.Ratio * MotorParam[ ScndCtrlActualPos ].mIsat;
|
dtrans = Transmision.Ratio * MotorParam[ ScndCtrlActualPos ].mIsat;
|
||||||
dmoment = dizel_Momentum(dizel_fill, dtrans * nrot * ActiveDir, dt); // oblicza tez
|
|
||||||
// enrot
|
dmoment = dizel_Momentum( dizel_fill, dtrans * nrot * ActiveDir, dt ); // oblicza tez enrot
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
enrot = Transmision.Ratio * nrot;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
eAngle += enrot * dt;
|
eAngle += enrot * dt;
|
||||||
@@ -4252,7 +4268,7 @@ double TMoverParameters::TractionForce(double dt)
|
|||||||
&& ( ( std::abs( eimv[ eimv_If ] ) > 1.0 )
|
&& ( ( std::abs( eimv[ eimv_If ] ) > 1.0 )
|
||||||
|| ( tmpV > 0.1 ) ) ) {
|
|| ( tmpV > 0.1 ) ) ) {
|
||||||
|
|
||||||
i = 0;
|
int i = 0;
|
||||||
while( ( i < RlistSize - 1 )
|
while( ( i < RlistSize - 1 )
|
||||||
&& ( DElist[ i + 1 ].RPM < tmpV ) ) {
|
&& ( DElist[ i + 1 ].RPM < tmpV ) ) {
|
||||||
++i;
|
++i;
|
||||||
@@ -4891,7 +4907,7 @@ double TMoverParameters::TractionForce(double dt)
|
|||||||
dizel_fill = 0;
|
dizel_fill = 0;
|
||||||
EnginePower = 0;
|
EnginePower = 0;
|
||||||
{
|
{
|
||||||
for (i = 0; i < 21; i++)
|
for (int i = 0; i < 21; ++i)
|
||||||
eimv[i] = 0;
|
eimv[i] = 0;
|
||||||
}
|
}
|
||||||
Hamulec->SetED(0);
|
Hamulec->SetED(0);
|
||||||
@@ -5647,7 +5663,7 @@ bool TMoverParameters::dizel_Update(double dt)
|
|||||||
|
|
||||||
enrot = std::max(
|
enrot = std::max(
|
||||||
enrot,
|
enrot,
|
||||||
0.1 * ( // TODO: dac zaleznie od temperatury i baterii
|
0.35 * ( // TODO: dac zaleznie od temperatury i baterii
|
||||||
EngineType == DieselEngine ?
|
EngineType == DieselEngine ?
|
||||||
dizel_nmin :
|
dizel_nmin :
|
||||||
DElist[ 0 ].RPM / 60.0 ) );
|
DElist[ 0 ].RPM / 60.0 ) );
|
||||||
|
|||||||
@@ -5306,8 +5306,8 @@ TTrain::update_sounds( double const Deltatime ) {
|
|||||||
&& ( false == Global::CabWindowOpen )
|
&& ( false == Global::CabWindowOpen )
|
||||||
&& ( DynamicObject->GetVelocity() > 0.5 ) ) {
|
&& ( DynamicObject->GetVelocity() > 0.5 ) ) {
|
||||||
|
|
||||||
volume = rsRunningNoise.m_amplitudefactor * mvOccupied->Vel + rsRunningNoise.m_amplitudeoffset;
|
volume = rsRunningNoise.m_amplitudeoffset + rsRunningNoise.m_amplitudefactor * mvOccupied->Vel;
|
||||||
auto frequency { rsRunningNoise.m_frequencyfactor * mvOccupied->Vel + rsRunningNoise.m_frequencyoffset };
|
auto frequency { rsRunningNoise.m_frequencyoffset + rsRunningNoise.m_frequencyfactor * mvOccupied->Vel };
|
||||||
|
|
||||||
if( std::abs( mvOccupied->nrot ) > 0.01 ) {
|
if( std::abs( mvOccupied->nrot ) > 0.01 ) {
|
||||||
// hamulce wzmagaja halas
|
// hamulce wzmagaja halas
|
||||||
|
|||||||
35
World.cpp
35
World.cpp
@@ -688,25 +688,26 @@ void TWorld::OnKeyDown(int cKey)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (cKey == Global::Keys[k_EndSign])
|
else if (cKey == Global::Keys[k_EndSign]) {
|
||||||
{ // Ra 2014-07: zabrane z kabiny
|
// Ra 2014-07: zabrane z kabiny
|
||||||
auto *vehicle { std::get<TDynamicObject *>( simulation::Region->find_vehicle( Global::pCameraPosition, 10, false, true ) ) };
|
auto *vehicle { std::get<TDynamicObject *>( simulation::Region->find_vehicle( Global::pCameraPosition, 10, false, true ) ) };
|
||||||
if (vehicle)
|
|
||||||
{
|
if( vehicle == nullptr ) { return; }
|
||||||
int CouplNr = (LengthSquared3(vehicle->HeadPosition() - Camera.Pos) >
|
|
||||||
LengthSquared3(vehicle->RearPosition() - Camera.Pos) ?
|
int const CouplNr {
|
||||||
|
clamp(
|
||||||
|
vehicle->DirectionGet()
|
||||||
|
* ( LengthSquared3( vehicle->HeadPosition() - Camera.Pos ) > LengthSquared3( vehicle->RearPosition() - Camera.Pos ) ?
|
||||||
1 :
|
1 :
|
||||||
-1) *
|
-1 ),
|
||||||
vehicle->DirectionGet();
|
0, 1 ) }; // z [-1,1] zrobić [0,1]
|
||||||
if (CouplNr < 0)
|
|
||||||
CouplNr = 0; // z [-1,1] zrobić [0,1]
|
|
||||||
int mask, set = 0; // Ra: [Shift]+[Ctrl]+[T] odpala mi jakąś idiotyczną zmianę tapety pulpitu :/
|
int mask, set = 0; // Ra: [Shift]+[Ctrl]+[T] odpala mi jakąś idiotyczną zmianę tapety pulpitu :/
|
||||||
if (Global::shiftState) // z [Shift] zapalanie
|
if (Global::shiftState) // z [Shift] zapalanie
|
||||||
set = mask = light::rearendsignals; // bez [Ctrl] założyć tabliczki
|
set = mask = light::rearendsignals; // bez [Ctrl] założyć tabliczki
|
||||||
else if (Global::ctrlState)
|
else if (Global::ctrlState)
|
||||||
set = mask = ( light::redmarker_left | light::redmarker_right ); // z [Ctrl] zapalić światła czerwone
|
set = mask = ( light::redmarker_left | light::redmarker_right ); // z [Ctrl] zapalić światła czerwone
|
||||||
else
|
else
|
||||||
mask = 2 + 32 + 64; // wyłączanie ściąga wszystko
|
mask = ( light::rearendsignals | light::redmarker_left | light::redmarker_right ); // wyłączanie ściąga wszystko
|
||||||
if (((vehicle->iLights[CouplNr]) & mask) != set)
|
if (((vehicle->iLights[CouplNr]) & mask) != set)
|
||||||
{
|
{
|
||||||
vehicle->iLights[CouplNr] = (vehicle->iLights[CouplNr] & ~mask) | set;
|
vehicle->iLights[CouplNr] = (vehicle->iLights[CouplNr] & ~mask) | set;
|
||||||
@@ -716,7 +717,6 @@ void TWorld::OnKeyDown(int cKey)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else if (cKey == Global::Keys[k_IncLocalBrakeLevel])
|
else if (cKey == Global::Keys[k_IncLocalBrakeLevel])
|
||||||
{ // zahamowanie dowolnego pojazdu
|
{ // zahamowanie dowolnego pojazdu
|
||||||
auto *vehicle { std::get<TDynamicObject *>( simulation::Region->find_vehicle( Global::pCameraPosition, 10, false, false ) ) };
|
auto *vehicle { std::get<TDynamicObject *>( simulation::Region->find_vehicle( Global::pCameraPosition, 10, false, false ) ) };
|
||||||
@@ -1252,6 +1252,15 @@ TWorld::Update_UI() {
|
|||||||
|
|
||||||
uitextline3 = "Brakes:" + to_string( mover->fBrakeCtrlPos, 1, 5 ) + "+" + std::to_string( mover->LocalBrakePos ) + ( mover->SlippingWheels ? " !" : " " );
|
uitextline3 = "Brakes:" + to_string( mover->fBrakeCtrlPos, 1, 5 ) + "+" + std::to_string( mover->LocalBrakePos ) + ( mover->SlippingWheels ? " !" : " " );
|
||||||
|
|
||||||
|
uitextline4 = (
|
||||||
|
true == TestFlag( mover->SecuritySystem.Status, s_aware ) ?
|
||||||
|
"!ALERTER! " :
|
||||||
|
" " );
|
||||||
|
uitextline4 += (
|
||||||
|
true == TestFlag( mover->SecuritySystem.Status, s_active ) ?
|
||||||
|
"!SHP! " :
|
||||||
|
" " );
|
||||||
|
|
||||||
if( Global::iScreenMode[ Global::iTextMode - GLFW_KEY_F1 ] == 1 ) {
|
if( Global::iScreenMode[ Global::iTextMode - GLFW_KEY_F1 ] == 1 ) {
|
||||||
// detail mode on second key press
|
// detail mode on second key press
|
||||||
uitextline2 +=
|
uitextline2 +=
|
||||||
@@ -1265,7 +1274,7 @@ TWorld::Update_UI() {
|
|||||||
|
|
||||||
auto const trackblockdistance{ std::abs( Controlled->Mechanik->TrackBlock() ) };
|
auto const trackblockdistance{ std::abs( Controlled->Mechanik->TrackBlock() ) };
|
||||||
if( trackblockdistance <= 75.0 ) {
|
if( trackblockdistance <= 75.0 ) {
|
||||||
uitextline4 = " Another vehicle ahead (distance: " + to_string( trackblockdistance, 1 ) + " m)";
|
uitextline4 += " Another vehicle ahead (distance: " + to_string( trackblockdistance, 1 ) + " m)";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user