From 7cac46df0294198c07579d1b9ac91f31cfedd7b6 Mon Sep 17 00:00:00 2001 From: Jano211 <107213310+Jano211@users.noreply.github.com> Date: Fri, 11 Aug 2023 21:34:09 +0200 Subject: [PATCH] Changes in camera shaking, and others: clatter sounds, csm stage boundaries, particles physics and hiding log panel when in launcher mode. --- DynObj.cpp | 58 ++++++++++++++++++------- DynObj.h | 2 +- Globals.cpp | 2 +- Track.cpp | 4 ++ application.cpp | 1 + launcher/scenery_list.cpp | 1 + opengl33renderer.cpp | 14 +++--- particles.cpp | 90 ++++++++++++++++++++++++++++++--------- 8 files changed, 129 insertions(+), 43 deletions(-) diff --git a/DynObj.cpp b/DynObj.cpp index d3571f05..11ccd413 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -3491,17 +3491,17 @@ bool TDynamicObject::Update(double dt, double dt1) interpolate( 0.8, 1.2, clamp( - MyTrack->iQualityFlag / 20.0, - 0.0, 1.0 ) ); + MyTrack->iQualityFlag / 10.0, + 0.0, 1.5 ) ); switch( MyTrack->eEnvironment ) { case e_tunnel: { - volume *= 1.1; + volume *= 1.3; break; } case e_bridge: { - volume *= 1.2; - break; - } + volume *= 1.5; + break; + } default: { break; } @@ -3530,15 +3530,28 @@ bool TDynamicObject::Update(double dt, double dt1) .gain( volume ) .play(); // crude bump simulation, drop down on even axles, move back up on the odd ones - MoverParameters->AccVert += - interpolate( - 0.01, 0.05, - clamp( - GetVelocity() / ( 1 + MoverParameters->Vmax ), - 0.0, 1.0 ) ) - * ( ( axleindex % 2 ) != 0 ? - 1 : - -1 ); + //MoverParameters->AccVert += (MoverParameters->Vel*0.1f) * + MoverParameters->AccVert += + clamp(-1.0, 1.0, (MoverParameters->Vel / ( 1 + MoverParameters->Vmax )) * MyTrack->iDamageFlag * ((axleindex % 2) != 0 ? 1 : -1)); + + if (MyTrack->eType == tt_Switch){ + MoverParameters->AccSVBased += clamp( + -1.0, 1.0, + (MoverParameters->Vel / (1 + MoverParameters->Vmax)) * + MyTrack->iDamageFlag * ((axleindex % 2) != 0 ? 1 : -1)); + MoverParameters->AccS += clamp( + -1.0, 1.0, + (MoverParameters->Vel / (1 + MoverParameters->Vmax)) * + MyTrack->iDamageFlag * ((axleindex % 2) != 0 ? 1 : -1)); + MoverParameters->AccN += clamp( + -1.0, 1.0, + (MoverParameters->Vel / (1 + MoverParameters->Vmax)) * + MyTrack->iDamageFlag * ((axleindex % 2) != 0 ? 1 : -1)); + MoverParameters->AccVert += clamp( + -1.0, 1.0, + (MoverParameters->Vel / (1 + MoverParameters->Vmax)) * + MyTrack->iDamageFlag * ((axleindex % 2) != 0 ? 1 : -1)); + } } } ++axleindex; @@ -4694,6 +4707,19 @@ void TDynamicObject::RenderSounds() { MoverParameters->Vel / 40.0, 0.0, 1.0 ) ); } + switch( MyTrack->eEnvironment ) { + case e_tunnel: { + volume *= 1.3; + break; + } + case e_bridge: { + volume *= 1.5; + break; + } + default: { + break; + } + } if( volume > 0.05 ) { // apply calculated parameters to all motor instances @@ -7622,7 +7648,7 @@ TDynamicObject::update_shake( double const Timedelta ) { shakevector += Math3D::vector3( -MoverParameters->AccN * Timedelta * 5.0, // highlight side sway -MoverParameters->AccVert * Timedelta, - -MoverParameters->AccSVBased * Timedelta * 1.25 ); // accent acceleration/deceleration + -MoverParameters->AccSVBased * Timedelta * 1.5); // accent acceleration/deceleration } auto shake { 1.25 * ShakeSpring.ComputateForces( shakevector, ShakeState.offset ) }; diff --git a/DynObj.h b/DynObj.h index 32207ab9..5462d5ff 100644 --- a/DynObj.h +++ b/DynObj.h @@ -790,7 +790,7 @@ public: struct baseshake_config { Math3D::vector3 angle_scale { 0.05, 0.0, 0.1 }; // roll, yaw, pitch Math3D::vector3 jolt_scale { 0.2, 0.2, 0.1 }; - double jolt_limit { 0.15 }; + double jolt_limit { 2.0f }; } BaseShake; struct engineshake_config { float scale { 2.f }; diff --git a/Globals.cpp b/Globals.cpp index 79256ea0..186aaac1 100644 --- a/Globals.cpp +++ b/Globals.cpp @@ -320,7 +320,7 @@ global_settings::ConfigParse(cParser &Parser) { Parser.getTokens(1, false); int size; Parser >> size; - iMaxTextureSize = clamp_power_of_two(size, 512, 8192); + iMaxTextureSize = clamp_power_of_two(size, 64, 8192); } else if (token == "maxcabtexturesize") { diff --git a/Track.cpp b/Track.cpp index 80d33310..bf80b949 100644 --- a/Track.cpp +++ b/Track.cpp @@ -447,6 +447,10 @@ void TTrack::Load(cParser *parser, glm::dvec3 const &pOrigin) >> fTrackWidth >> fFriction >> fSoundDistance; + if (eType == tt_Switch) + { + fSoundDistance = 10.0f; + } fTrackWidth2 = fTrackWidth; // rozstaw/szerokość w punkcie 2, na razie taka sama parser->getTokens(2); *parser diff --git a/application.cpp b/application.cpp index ccd49af3..d2a486e0 100644 --- a/application.cpp +++ b/application.cpp @@ -519,6 +519,7 @@ eu07_application::push_mode( eu07_application::mode const Mode ) { if (!m_modes[Mode]) { if (Mode == mode::launcher) + Global.loading_log = false; m_modes[Mode] = std::make_shared(); if (Mode == mode::scenarioloader) m_modes[Mode] = std::make_shared(); diff --git a/launcher/scenery_list.cpp b/launcher/scenery_list.cpp index 3db32ac0..848afc30 100644 --- a/launcher/scenery_list.cpp +++ b/launcher/scenery_list.cpp @@ -100,6 +100,7 @@ void ui::scenerylist_panel::draw_launch_box() ImGui::TextWrapped(selected_trainset->description.c_str()); if (ImGui::Button(STR_C("Launch"), ImVec2(-1, 0))) { + Global.loading_log = !Global.loading_log; if (!launch_simulation()) ImGui::OpenPopup("missing_driver"); } diff --git a/opengl33renderer.cpp b/opengl33renderer.cpp index 281e362f..aeada261 100644 --- a/opengl33renderer.cpp +++ b/opengl33renderer.cpp @@ -984,14 +984,18 @@ void opengl33_renderer::Render_pass(viewport_config &vp, rendermode const Mode) setup_drawing( false ); glViewport(0, 0, m_shadowbuffersize, m_shadowbuffersize); - - float csmstageboundaries[] = { 0.0f, 5.0f, 25.0f, 1.0f }; + float csmstageboundaries[] = {0.0f, + Global.shadowtune.range / 32, + Global.shadowtune.range / 8, + Global.shadowtune.range}; if( Global.shadowtune.map_size > 2048 ) { // increase coverage if our shadow map is large enough to produce decent results - csmstageboundaries[ 1 ] *= Global.shadowtune.map_size / 2048; - csmstageboundaries[ 2 ] *= Global.shadowtune.map_size / 2048; + csmstageboundaries[1] *= Global.shadowtune.map_size / 2048; + csmstageboundaries[2] *= Global.shadowtune.map_size / 2048; + csmstageboundaries[3] *= Global.shadowtune.map_size / 2048; } + for( auto idx = 0; idx < m_shadowpass.size(); ++idx ) { m_shadow_fb->attach( *m_shadow_tex, GL_DEPTH_ATTACHMENT, idx ); @@ -1003,7 +1007,7 @@ void opengl33_renderer::Render_pass(viewport_config &vp, rendermode const Mode) setup_matrices(); scene_ubs.projection = OpenGLMatrices.data( GL_PROJECTION ); auto const csmstagezfar { - ( csmstageboundaries[ idx + 1 ] > 1.f ? csmstageboundaries[ idx + 1 ] : Global.shadowtune.range ) + (csmstageboundaries[ idx + 1 ]) + ( m_shadowpass.size() - idx ) }; // we can fairly safely add some extra padding in the early stages scene_ubs.cascade_end[ idx ] = csmstagezfar * csmstagezfar; // store squared to allow semi-optimized length2 comparisons in the shader scene_ubo->update( scene_ubs ); diff --git a/particles.cpp b/particles.cpp index 4b839031..361f2b8c 100644 --- a/particles.cpp +++ b/particles.cpp @@ -170,15 +170,46 @@ smoke_source::update( double const Timedelta, bool const Onlydespawn ) { m_max_particles ) ); // consider special spawn rate cases if( m_ownertype == owner_type::vehicle ) { - // HACK: don't spawn particles in tunnels, to prevent smoke clipping through 'terrain' outside - if( m_owner.vehicle->RaTrackGet()->eEnvironment == e_tunnel ) { - m_spawncount = 0.f; - } - if( false == m_owner.vehicle->bEnabled ) { - // don't spawn particles for vehicles which left the scenario - m_spawncount = 0.f; - } - } + + if (Global.AirTemperature <= 5.f || m_owner.vehicle->MoverParameters->dizel_heat.Ts < 45.f) + { + m_emitter.color == glm::vec3{128, 128, 128}; + } + + if (m_owner.vehicle->MoverParameters->dizel_spinup == true) + { + m_spawncount = + ((false == Global.Smoke) || (true == Onlydespawn)) ? + 0.f : + std::min( + // m_spawncount + ( m_spawnrate * Timedelta * Global.SmokeFidelity ), + m_spawncount +(m_spawnrate * Timedelta * Global.SmokeFidelity * (((m_owner.vehicle->MoverParameters->enrot) / 4 ) * 0.01)), m_max_particles); + } + else + { + if (m_owner.vehicle->MoverParameters->DirAbsolute == 0 || + m_owner.vehicle->MoverParameters->Im == 0) + { + m_spawncount = + ((false == Global.Smoke) || (true == Onlydespawn)) ? + 0.f : + std::min( + // m_spawncount + ( m_spawnrate * Timedelta * Global.SmokeFidelity ), + m_spawncount + (m_spawnrate * Timedelta * Global.SmokeFidelity * ((((m_owner.vehicle->MoverParameters->DElist[m_owner.vehicle->MoverParameters->MainCtrlPosNo].RPM -m_owner.vehicle->MoverParameters->enrot) /60) *0.02) *(m_owner.vehicle->MoverParameters->EnginePower * 0.005))), m_max_particles); + } + else + { + + m_spawncount = + ((false == Global.Smoke) || (true == Onlydespawn)) ? + 0.f : + std::min( + // m_spawncount + ( m_spawnrate * Timedelta * Global.SmokeFidelity ), + m_spawncount + (m_spawnrate * Timedelta * Global.SmokeFidelity * ((((m_owner.vehicle->MoverParameters->DElist[m_owner.vehicle->MoverParameters->MainCtrlPosNo].RPM -m_owner.vehicle->MoverParameters->enrot) /60) * (sqrt(m_owner.vehicle->MoverParameters->Im) * 0.01) * 0.02) *(m_owner.vehicle->MoverParameters->EnginePower * 0.005))), m_max_particles); + } + } + } + // update spawned particles for( auto particleiterator { std::begin( m_particles ) }; particleiterator != std::end( m_particles ); ++particleiterator ) { @@ -301,14 +332,21 @@ smoke_source::initialize( smoke_particle &Particle ) { if( m_ownertype == owner_type::vehicle ) { Particle.opacity *= m_owner.vehicle->MoverParameters->dizel_fill; - auto const enginerevolutionsfactor { 0.5f }; // high engine revolutions increase initial particle velocity + auto const enginerevolutionsfactor { 1.5f }; // high engine revolutions increase initial particle velocity switch( m_owner.vehicle->MoverParameters->EngineType ) { - case TEngineType::DieselElectric: { - Particle.velocity *= 1.0 + enginerevolutionsfactor * m_owner.vehicle->MoverParameters->enrot / ( m_owner.vehicle->MoverParameters->DElist[ m_owner.vehicle->MoverParameters->MainCtrlPosNo ].RPM / 60.0 ); - break; - } - case TEngineType::DieselEngine: { - Particle.velocity *= 1.0 + enginerevolutionsfactor * m_owner.vehicle->MoverParameters->enrot / m_owner.vehicle->MoverParameters->nmax; + case TEngineType::DieselElectric: { + if (m_owner.vehicle->MoverParameters->dizel_spinup == true) + { + Particle.velocity *= 0.38*(((m_owner.vehicle->MoverParameters->enrot)/2)*0.5); // / m_owner.vehicle->MoverParameters->dizel_fill *0.01)) ; + + } + else + { + + Particle.velocity *= ((((m_owner.vehicle->MoverParameters->enrot)/60)*0.6) * (m_owner.vehicle->MoverParameters->EnginePower *0.03)); // / m_owner.vehicle->MoverParameters->dizel_fill *0.01)) ; + //Particle.velocity *= m_owner.vehicle->GetVelocity(); // / m_owner.vehicle->MoverParameters->dizel_fill *0.01)) ; + } + break; } default: { @@ -330,10 +368,23 @@ smoke_source::update( smoke_particle &Particle, bounding_box &Boundingbox, doubl // crude smoke dispersion simulation // http://www.auburn.edu/academic/forestry_wildlife/fire/smoke_guide/smoke_dispersion.htm - Particle.velocity.y += ( 0.005 * Particle.velocity.y ) * std::min( 0.f, Global.AirTemperature - 10 ) * Timedelta; // decelerate faster in cold weather + switch (m_ownertype) + { + case owner_type::vehicle: + { + Particle.velocity.y += ( 0.025 * Particle.velocity.y ) * std::min( 0.f, Global.AirTemperature - 90 ) * Timedelta; // decelerate faster in cold weather + Particle.velocity.y -= ( (0.05 * (pow(m_owner.vehicle->GetVelocity()*1,0.4))) * Particle.velocity.y ) * Global.Overcast * Timedelta; // decelerate faster with high air humidity and/or precipitation + break; + } + default: + { + Particle.velocity.y += ( 0.005 * Particle.velocity.y ) * std::min( 0.f, Global.AirTemperature - 10 ) * Timedelta; // decelerate faster in cold weather Particle.velocity.y -= ( 0.050 * Particle.velocity.y ) * Global.Overcast * Timedelta; // decelerate faster with high air humidity and/or precipitation Particle.velocity.y = std::max( 0.25 * ( 2.f - Global.Overcast ), Particle.velocity.y ); // put a cap on deceleration - + break; + } + } + Particle.position += Particle.velocity * static_cast( Timedelta ); Particle.position += 0.1f * Particle.age * simulation::Environment.wind() * static_cast( Timedelta ); // m_velocitymodifier.update( Particle.velocity, Timedelta ); @@ -423,8 +474,7 @@ particle_manager::find( std::string const &Template ) { } // ... and if it fails try to add the template to the database from a data file smoke_source source; - cParser sound_parser( templatepath + templatename + ".txt", cParser::buffer_FILE ); - if( source.deserialize( sound_parser ) ) { + if( source.deserialize( cParser( templatepath + templatename + ".txt", cParser::buffer_FILE ) ) ) { // if deserialization didn't fail finish source setup... source.m_opacitymodifier.bind( &Global.SmokeFidelity ); // ...then cache the source as template for future instances