16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-20 09:09:19 +02:00

build 171204. separate vehicle movement noise for external and internal view, flexible parsing of wheel_clatter parameter, minor tweaks to air leak and wheel clatter playback

This commit is contained in:
tmj-fstate
2017-12-04 15:39:15 +01:00
parent 5645c13362
commit 4f9464499c
11 changed files with 196 additions and 140 deletions

View File

@@ -559,7 +559,7 @@ TDynamicObject::toggle_lights() {
( compartmentname.find( "compartment" ) != std::string::npos )
|| ( compartmentname.find( "przedzial" ) != std::string::npos ) ) {
// compartments are lit with 75% probability
sectionlight.level = ( Random() < 0.75 ? 0.75f : 0.05f );
sectionlight.level = ( Random() < 0.75 ? 0.75f : 0.15f );
}
}
SectionLightsActive = true;
@@ -1611,9 +1611,7 @@ void TDynamicObject::ABuScanObjects( int Direction, double Distance )
}
//----------ABu: koniec skanowania pojazdow
TDynamicObject::TDynamicObject() :
rsStukot( MaxAxles, sound_source( sound_placement::external ) )
{
TDynamicObject::TDynamicObject() {
modelShake = vector3(0, 0, 0);
fTrackBlock = 10000.0; // brak przeszkody na drodze
btnOn = false;
@@ -1634,12 +1632,14 @@ TDynamicObject::TDynamicObject() :
bEnabled = true;
MyTrack = NULL;
// McZapkie-260202
/*
dRailLength = 25.0;
for (int i = 0; i < MaxAxles; i++)
dRailPosition[i] = 0.0;
for (int i = 0; i < MaxAxles; i++)
dWheelsPosition[i] = 0.0; // będzie wczytane z MMD
iAxles = 0;
*/
dWheelAngle[0] = 0.0;
dWheelAngle[1] = 0.0;
dWheelAngle[2] = 0.0;
@@ -1985,8 +1985,9 @@ TDynamicObject::Init(std::string Name, // nazwa pojazdu, np. "EU07-424"
create_controller( DriverType, !TrainName.empty() );
// McZapkie-250202
/*
iAxles = std::min( MoverParameters->NAxles, MaxAxles ); // ilość osi
rsStukot.resize( iAxles, sound_source( sound_placement::external ) );
*/
// wczytywanie z pliku nazwatypu.mmd, w tym model
LoadMMediaFile(asBaseDir, Type_Name, asReplacableSkin);
// McZapkie-100402: wyszukiwanie submodeli sprzegów
@@ -2093,12 +2094,12 @@ TDynamicObject::Init(std::string Name, // nazwa pojazdu, np. "EU07-424"
smBuforPrawy[ i ]->WillBeAnimated();
}
}
for( int i = 0; i < iAxles; i++ ) {
for( auto &axle : m_axlesounds ) {
// wyszukiwanie osi (0 jest na końcu, dlatego dodajemy długość?)
dRailPosition[ i ] = (
axle.distance = (
Reversed ?
-dWheelsPosition[ i ] :
( dWheelsPosition[ i ] + MoverParameters->Dim.L ) ) + fDist;
-axle.offset :
( axle.offset + MoverParameters->Dim.L ) ) + fDist;
}
// McZapkie-250202 end.
Track->AddDynamicObject(this); // wstawiamy do toru na pozycję 0, a potem przesuniemy
@@ -3063,12 +3064,12 @@ bool TDynamicObject::Update(double dt, double dt1)
if( MyTrack->fSoundDistance != dRailLength ) {
dRailLength = MyTrack->fSoundDistance;
for( int i = 0; i < iAxles; ++i ) {
dRailPosition[ i ] = dWheelsPosition[ i ] + MoverParameters->Dim.L;
for( auto &axle : m_axlesounds ) {
axle.distance = axle.offset + MoverParameters->Dim.L;
}
}
if( dRailLength != -1 ) {
if( std::abs( MoverParameters->V ) > 0 ) {
if( MoverParameters->Vel > 0 ) {
double volume = ( 20.0 + MyTrack->iDamageFlag ) / 21;
switch( MyTrack->eEnvironment ) {
@@ -3085,9 +3086,10 @@ bool TDynamicObject::Update(double dt, double dt1)
}
}
for( int i = 0; i < iAxles; ++i ) {
dRailPosition[ i ] -= dDOMoveLen * Sign( dDOMoveLen );
if( dRailPosition[ i ] < 0 ) {
for( auto &axle : m_axlesounds ) {
axle.distance -= dDOMoveLen * Sign( dDOMoveLen );
if( axle.distance < 0 ) {
axle.distance += dRailLength;
/*
// McZapkie-040302
if( i == iAxles - 1 ) {
@@ -3101,8 +3103,9 @@ bool TDynamicObject::Update(double dt, double dt1)
MoverParameters->AccV -= 0.5 * GetVelocity() / ( 1 + MoverParameters->Vmax );
}
*/
rsStukot[ i ].gain( volume ).play();
dRailPosition[ i ] += dRailLength;
if( MoverParameters->Vel > 2.5 ) {
axle.clatter.gain( volume ).play();
}
}
}
}
@@ -3602,10 +3605,10 @@ void TDynamicObject::RenderSounds() {
// McZapkie-010302: ulepszony dzwiek silnika
double frequency { 1.0 };
double volume { 1.0 };
double volume { 0.0 };
double const dt { Timer::GetDeltaRenderTime() };
if( dt == 0.0 ) { return; }
if( Global::iPause != 0 ) { return; }
// engine sounds
if( MoverParameters->Power > 0 ) {
@@ -3652,6 +3655,7 @@ void TDynamicObject::RenderSounds() {
+ rsSilnik.m_amplitudeoffset;
break;
}
// NOTE: default case also covers electric motors
default: {
volume =
rsSilnik.m_amplitudefactor * ( MoverParameters->EnginePower / 1000 + std::fabs( MoverParameters->enrot ) * 60.0 )
@@ -3950,13 +3954,14 @@ void TDynamicObject::RenderSounds() {
if( m_lastbrakepressure != -1.f ) {
// calculate rate of pressure drop in brake cylinder, once it's been initialized
auto const brakepressuredifference { m_lastbrakepressure - MoverParameters->BrakePress };
m_brakepressurechange = interpolate<float>( m_brakepressurechange, 10 * ( brakepressuredifference / dt ), 0.1f );
m_brakepressurechange = interpolate<float>( m_brakepressurechange, brakepressuredifference / dt, 0.005f );
}
m_lastbrakepressure = MoverParameters->BrakePress;
if( m_brakepressurechange > 0.05f ) {
// NOTE: can't use the leak rate directly due to irregular results produced by some brake type implementations
// ensure some basic level of volume and scale it up depending on pressure in the cylinder; scale this by the leak rate
volume = 20 * m_brakepressurechange * ( 0.25 + 0.75 * ( std::max( MoverParameters->BrakePress, 0.0 ) / MoverParameters->MaxBrakePress[ 3 ] ) );
if( volume > 0.075f ) {
rsUnbrake
.gain( static_cast<float>( 1.25 * std::max( MoverParameters->BrakePress, 0.0 ) / MoverParameters->MaxBrakePress[ 3 ] ) )
.gain( volume )
.play( sound_flags::exclusive | sound_flags::looping );
}
else {
@@ -4009,7 +4014,7 @@ void TDynamicObject::RenderSounds() {
&& ( GetVelocity() > 0.05 ) ) {
rsBrake
.pitch( clamp( rsBrake.m_frequencyfactor * GetVelocity() + rsBrake.m_frequencyoffset, 0.5, 1.15 ) ) // arbitrary limits
.pitch( rsBrake.m_frequencyfactor * GetVelocity() + rsBrake.m_frequencyoffset )
.gain( rsBrake.m_amplitudefactor * std::sqrt( ( GetVelocity() * MoverParameters->UnitBrakeForce ) ) + rsBrake.m_amplitudeoffset )
.play( sound_flags::exclusive | sound_flags::looping );
}
@@ -4115,8 +4120,8 @@ void TDynamicObject::RenderSounds() {
// szum w czasie jazdy
if( GetVelocity() > 0.5 ) {
volume = rsRunningNoise.m_amplitudefactor * MoverParameters->Vel + rsRunningNoise.m_amplitudeoffset;
frequency = rsRunningNoise.m_frequencyfactor * MoverParameters->Vel + rsRunningNoise.m_frequencyoffset;
volume = rsOuterNoise.m_amplitudefactor * MoverParameters->Vel + rsOuterNoise.m_amplitudeoffset;
frequency = rsOuterNoise.m_frequencyfactor * MoverParameters->Vel + rsOuterNoise.m_frequencyoffset;
if( false == TestFlag( MoverParameters->DamageFlag, dtrain_wheelwear ) ) {
// McZpakie-221103: halas zalezny od kola
@@ -4174,13 +4179,13 @@ void TDynamicObject::RenderSounds() {
clamp(
MoverParameters->Vel / 60.0,
0.0, 1.0 ) );
rsRunningNoise
rsOuterNoise
.pitch( clamp( frequency, 0.5, 1.15 ) ) // arbitrary limits to prevent the pitch going out of whack
.gain( volume )
.play( sound_flags::exclusive | sound_flags::looping );
}
else {
rsRunningNoise.stop();
rsOuterNoise.stop();
}
// youBy: dzwiek ostrych lukow i ciasnych zwrotek
@@ -4200,7 +4205,7 @@ void TDynamicObject::RenderSounds() {
}
if( volume > 0.05 ) {
rscurve
.gain( 2.0 * volume )
.gain( 2.5 * volume )
.play( sound_flags::exclusive | sound_flags::looping );
}
else {
@@ -4274,17 +4279,17 @@ void TDynamicObject::RenderSounds() {
// TODO: dedicated sound, played alongside regular noise
if( true == TestFlag( MoverParameters->DamageFlag, dtrain_wheelwear ) ) {
#ifdef EU07_USE_OLD_SOUNDCODE
if( rsRunningNoise.AM != 0 ) {
rsRunningNoise.Stop();
float am = rsRunningNoise.AM;
float fa = rsRunningNoise.FA;
float fm = rsRunningNoise.FM;
rsRunningNoise.Init( "lomotpodkucia.wav", -1, 0, 0, 0, true ); // MC: zmiana szumu na lomot
if( rsRunningNoise.AM == 1 )
rsRunningNoise.AM = am;
rsRunningNoise.AA = 0.7;
rsRunningNoise.FA = fa;
rsRunningNoise.FM = fm;
if( rsOuterNoise.AM != 0 ) {
rsOuterNoise.Stop();
float am = rsOuterNoise.AM;
float fa = rsOuterNoise.FA;
float fm = rsOuterNoise.FM;
rsOuterNoise.Init( "lomotpodkucia.wav", -1, 0, 0, 0, true ); // MC: zmiana szumu na lomot
if( rsOuterNoise.AM == 1 )
rsOuterNoise.AM = am;
rsOuterNoise.AA = 0.7;
rsOuterNoise.FA = fa;
rsOuterNoise.FM = fm;
}
#else
#endif
@@ -5004,21 +5009,23 @@ void TDynamicObject::LoadMMediaFile( std::string BaseDir, std::string TypeName,
// polozenia osi w/m srodka pojazdu
parser.getTokens( 1, false );
parser >> dSDist;
for( int i = 0; i < iAxles; ++i ) {
parser.getTokens( 1, false );
parser >> dWheelsPosition[ i ];
parser.getTokens();
parser >> token;
if( token != "end" ) {
rsStukot[ i ].deserialize( token + " " + std::to_string( dSDist ), sound_type::single, sound_parameters::range );
rsStukot[ i ].owner( this );
rsStukot[ i ].offset( { 0, 0, -dWheelsPosition[ i ] } );
}
while( ( ( token = parser.getToken<std::string>() ) != "" )
&& ( token != "end" ) ) {
// add another axle entry to the list
axle_sounds axle {
0,
std::atof( token.c_str() ),
{ sound_placement::external, static_cast<float>( dSDist ) } };
axle.clatter.deserialize( parser, sound_type::single );
axle.clatter.owner( this );
axle.clatter.offset( { 0, 0, -axle.offset } );
m_axlesounds.emplace_back( axle );
}
if( token != "end" ) {
// TODO: check if this if() and/or retrieval makes sense here
parser.getTokens( 1, false ); parser >> token;
}
// arrange the axles in case they're listed out of order
std::sort(
std::begin( m_axlesounds ), std::end( m_axlesounds ),
[]( axle_sounds const &Left, axle_sounds const &Right ) {
return ( Left.offset < Right.offset ); } );
}
else if( ( token == "engine:" )
@@ -5193,6 +5200,15 @@ void TDynamicObject::LoadMMediaFile( std::string BaseDir, std::string TypeName,
sReleaser.owner( this );
}
else if( token == "outernoise:" ) {
// szum podczas jazdy:
rsOuterNoise.deserialize( parser, sound_type::single, sound_parameters::amplitude | sound_parameters::frequency );
rsOuterNoise.owner( this );
rsOuterNoise.m_amplitudefactor /= ( 1 + MoverParameters->Vmax );
rsOuterNoise.m_frequencyfactor /= ( 1 + MoverParameters->Vmax );
}
} while( ( token != "" )
&& ( token != "endsounds" ) );
@@ -5301,14 +5317,6 @@ void TDynamicObject::LoadMMediaFile( std::string BaseDir, std::string TypeName,
couplersounds.dsbBufferClamp = bufferclash;
}
}
else if( token == "runningnoise:" ) {
// szum podczas jazdy:
rsRunningNoise.deserialize( parser, sound_type::single, sound_parameters::amplitude | sound_parameters::frequency );
rsRunningNoise.owner( this );
rsRunningNoise.m_amplitudefactor /= ( 1 + MoverParameters->Vmax );
rsRunningNoise.m_frequencyfactor /= ( 1 + MoverParameters->Vmax );
}
} while( token != "" );