Changes in camera shaking, and others:

clatter sounds, csm stage boundaries, particles physics and hiding log panel when in launcher mode.
This commit is contained in:
Jano211
2023-08-11 21:34:09 +02:00
committed by Hirek
parent 9ff3ff195d
commit 797045e8ae
8 changed files with 129 additions and 43 deletions

View File

@@ -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
@@ -7621,7 +7647,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 ) };

View File

@@ -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 };

View File

@@ -318,7 +318,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")
{

View File

@@ -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

View File

@@ -518,6 +518,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<launcher_mode>();
if (Mode == mode::scenarioloader)
m_modes[Mode] = std::make_shared<scenarioloader_mode>();

View File

@@ -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");
}

View File

@@ -985,14 +985,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 );
@@ -1004,7 +1008,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 );

View File

@@ -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<float>(
// 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<float>(
// 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<float>(
// 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<float>( 0.25 * ( 2.f - Global.Overcast ), Particle.velocity.y ); // put a cap on deceleration
break;
}
}
Particle.position += Particle.velocity * static_cast<float>( Timedelta );
Particle.position += 0.1f * Particle.age * simulation::Environment.wind() * static_cast<float>( 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