mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-03-22 15:05:03 +01:00
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:
58
DynObj.cpp
58
DynObj.cpp
@@ -3491,17 +3491,17 @@ bool TDynamicObject::Update(double dt, double dt1)
|
|||||||
interpolate(
|
interpolate(
|
||||||
0.8, 1.2,
|
0.8, 1.2,
|
||||||
clamp(
|
clamp(
|
||||||
MyTrack->iQualityFlag / 20.0,
|
MyTrack->iQualityFlag / 10.0,
|
||||||
0.0, 1.0 ) );
|
0.0, 1.5 ) );
|
||||||
switch( MyTrack->eEnvironment ) {
|
switch( MyTrack->eEnvironment ) {
|
||||||
case e_tunnel: {
|
case e_tunnel: {
|
||||||
volume *= 1.1;
|
volume *= 1.3;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case e_bridge: {
|
case e_bridge: {
|
||||||
volume *= 1.2;
|
volume *= 1.5;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -3530,15 +3530,28 @@ bool TDynamicObject::Update(double dt, double dt1)
|
|||||||
.gain( volume )
|
.gain( volume )
|
||||||
.play();
|
.play();
|
||||||
// crude bump simulation, drop down on even axles, move back up on the odd ones
|
// crude bump simulation, drop down on even axles, move back up on the odd ones
|
||||||
MoverParameters->AccVert +=
|
//MoverParameters->AccVert += (MoverParameters->Vel*0.1f) *
|
||||||
interpolate(
|
MoverParameters->AccVert +=
|
||||||
0.01, 0.05,
|
clamp(-1.0, 1.0, (MoverParameters->Vel / ( 1 + MoverParameters->Vmax )) * MyTrack->iDamageFlag * ((axleindex % 2) != 0 ? 1 : -1));
|
||||||
clamp(
|
|
||||||
GetVelocity() / ( 1 + MoverParameters->Vmax ),
|
if (MyTrack->eType == tt_Switch){
|
||||||
0.0, 1.0 ) )
|
MoverParameters->AccSVBased += clamp(
|
||||||
* ( ( axleindex % 2 ) != 0 ?
|
-1.0, 1.0,
|
||||||
1 :
|
(MoverParameters->Vel / (1 + MoverParameters->Vmax)) *
|
||||||
-1 );
|
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;
|
++axleindex;
|
||||||
@@ -4694,6 +4707,19 @@ void TDynamicObject::RenderSounds() {
|
|||||||
MoverParameters->Vel / 40.0,
|
MoverParameters->Vel / 40.0,
|
||||||
0.0, 1.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 ) {
|
if( volume > 0.05 ) {
|
||||||
// apply calculated parameters to all motor instances
|
// apply calculated parameters to all motor instances
|
||||||
@@ -7622,7 +7648,7 @@ TDynamicObject::update_shake( double const Timedelta ) {
|
|||||||
shakevector += Math3D::vector3(
|
shakevector += Math3D::vector3(
|
||||||
-MoverParameters->AccN * Timedelta * 5.0, // highlight side sway
|
-MoverParameters->AccN * Timedelta * 5.0, // highlight side sway
|
||||||
-MoverParameters->AccVert * Timedelta,
|
-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 ) };
|
auto shake { 1.25 * ShakeSpring.ComputateForces( shakevector, ShakeState.offset ) };
|
||||||
|
|||||||
2
DynObj.h
2
DynObj.h
@@ -790,7 +790,7 @@ public:
|
|||||||
struct baseshake_config {
|
struct baseshake_config {
|
||||||
Math3D::vector3 angle_scale { 0.05, 0.0, 0.1 }; // roll, yaw, pitch
|
Math3D::vector3 angle_scale { 0.05, 0.0, 0.1 }; // roll, yaw, pitch
|
||||||
Math3D::vector3 jolt_scale { 0.2, 0.2, 0.1 };
|
Math3D::vector3 jolt_scale { 0.2, 0.2, 0.1 };
|
||||||
double jolt_limit { 0.15 };
|
double jolt_limit { 2.0f };
|
||||||
} BaseShake;
|
} BaseShake;
|
||||||
struct engineshake_config {
|
struct engineshake_config {
|
||||||
float scale { 2.f };
|
float scale { 2.f };
|
||||||
|
|||||||
@@ -320,7 +320,7 @@ global_settings::ConfigParse(cParser &Parser) {
|
|||||||
Parser.getTokens(1, false);
|
Parser.getTokens(1, false);
|
||||||
int size;
|
int size;
|
||||||
Parser >> size;
|
Parser >> size;
|
||||||
iMaxTextureSize = clamp_power_of_two(size, 512, 8192);
|
iMaxTextureSize = clamp_power_of_two(size, 64, 8192);
|
||||||
}
|
}
|
||||||
else if (token == "maxcabtexturesize")
|
else if (token == "maxcabtexturesize")
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -447,6 +447,10 @@ void TTrack::Load(cParser *parser, glm::dvec3 const &pOrigin)
|
|||||||
>> fTrackWidth
|
>> fTrackWidth
|
||||||
>> fFriction
|
>> fFriction
|
||||||
>> fSoundDistance;
|
>> fSoundDistance;
|
||||||
|
if (eType == tt_Switch)
|
||||||
|
{
|
||||||
|
fSoundDistance = 10.0f;
|
||||||
|
}
|
||||||
fTrackWidth2 = fTrackWidth; // rozstaw/szerokość w punkcie 2, na razie taka sama
|
fTrackWidth2 = fTrackWidth; // rozstaw/szerokość w punkcie 2, na razie taka sama
|
||||||
parser->getTokens(2);
|
parser->getTokens(2);
|
||||||
*parser
|
*parser
|
||||||
|
|||||||
@@ -519,6 +519,7 @@ eu07_application::push_mode( eu07_application::mode const Mode ) {
|
|||||||
|
|
||||||
if (!m_modes[Mode]) {
|
if (!m_modes[Mode]) {
|
||||||
if (Mode == mode::launcher)
|
if (Mode == mode::launcher)
|
||||||
|
Global.loading_log = false;
|
||||||
m_modes[Mode] = std::make_shared<launcher_mode>();
|
m_modes[Mode] = std::make_shared<launcher_mode>();
|
||||||
if (Mode == mode::scenarioloader)
|
if (Mode == mode::scenarioloader)
|
||||||
m_modes[Mode] = std::make_shared<scenarioloader_mode>();
|
m_modes[Mode] = std::make_shared<scenarioloader_mode>();
|
||||||
|
|||||||
@@ -100,6 +100,7 @@ void ui::scenerylist_panel::draw_launch_box()
|
|||||||
ImGui::TextWrapped(selected_trainset->description.c_str());
|
ImGui::TextWrapped(selected_trainset->description.c_str());
|
||||||
|
|
||||||
if (ImGui::Button(STR_C("Launch"), ImVec2(-1, 0))) {
|
if (ImGui::Button(STR_C("Launch"), ImVec2(-1, 0))) {
|
||||||
|
Global.loading_log = !Global.loading_log;
|
||||||
if (!launch_simulation())
|
if (!launch_simulation())
|
||||||
ImGui::OpenPopup("missing_driver");
|
ImGui::OpenPopup("missing_driver");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -984,14 +984,18 @@ void opengl33_renderer::Render_pass(viewport_config &vp, rendermode const Mode)
|
|||||||
setup_drawing( false );
|
setup_drawing( false );
|
||||||
|
|
||||||
glViewport(0, 0, m_shadowbuffersize, m_shadowbuffersize);
|
glViewport(0, 0, m_shadowbuffersize, m_shadowbuffersize);
|
||||||
|
float csmstageboundaries[] = {0.0f,
|
||||||
float csmstageboundaries[] = { 0.0f, 5.0f, 25.0f, 1.0f };
|
Global.shadowtune.range / 32,
|
||||||
|
Global.shadowtune.range / 8,
|
||||||
|
Global.shadowtune.range};
|
||||||
if( Global.shadowtune.map_size > 2048 ) {
|
if( Global.shadowtune.map_size > 2048 ) {
|
||||||
// increase coverage if our shadow map is large enough to produce decent results
|
// increase coverage if our shadow map is large enough to produce decent results
|
||||||
csmstageboundaries[ 1 ] *= Global.shadowtune.map_size / 2048;
|
csmstageboundaries[1] *= Global.shadowtune.map_size / 2048;
|
||||||
csmstageboundaries[ 2 ] *= 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 ) {
|
for( auto idx = 0; idx < m_shadowpass.size(); ++idx ) {
|
||||||
|
|
||||||
m_shadow_fb->attach( *m_shadow_tex, GL_DEPTH_ATTACHMENT, 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();
|
setup_matrices();
|
||||||
scene_ubs.projection = OpenGLMatrices.data( GL_PROJECTION );
|
scene_ubs.projection = OpenGLMatrices.data( GL_PROJECTION );
|
||||||
auto const csmstagezfar {
|
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
|
+ ( 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_ubs.cascade_end[ idx ] = csmstagezfar * csmstagezfar; // store squared to allow semi-optimized length2 comparisons in the shader
|
||||||
scene_ubo->update( scene_ubs );
|
scene_ubo->update( scene_ubs );
|
||||||
|
|||||||
@@ -170,15 +170,46 @@ smoke_source::update( double const Timedelta, bool const Onlydespawn ) {
|
|||||||
m_max_particles ) );
|
m_max_particles ) );
|
||||||
// consider special spawn rate cases
|
// consider special spawn rate cases
|
||||||
if( m_ownertype == owner_type::vehicle ) {
|
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 ) {
|
if (Global.AirTemperature <= 5.f || m_owner.vehicle->MoverParameters->dizel_heat.Ts < 45.f)
|
||||||
m_spawncount = 0.f;
|
{
|
||||||
}
|
m_emitter.color == glm::vec3{128, 128, 128};
|
||||||
if( false == m_owner.vehicle->bEnabled ) {
|
}
|
||||||
// don't spawn particles for vehicles which left the scenario
|
|
||||||
m_spawncount = 0.f;
|
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
|
// update spawned particles
|
||||||
for( auto particleiterator { std::begin( m_particles ) }; particleiterator != std::end( m_particles ); ++particleiterator ) {
|
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 ) {
|
if( m_ownertype == owner_type::vehicle ) {
|
||||||
Particle.opacity *= m_owner.vehicle->MoverParameters->dizel_fill;
|
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 ) {
|
switch( m_owner.vehicle->MoverParameters->EngineType ) {
|
||||||
case TEngineType::DieselElectric: {
|
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 );
|
if (m_owner.vehicle->MoverParameters->dizel_spinup == true)
|
||||||
break;
|
{
|
||||||
}
|
Particle.velocity *= 0.38*(((m_owner.vehicle->MoverParameters->enrot)/2)*0.5); // / m_owner.vehicle->MoverParameters->dizel_fill *0.01)) ;
|
||||||
case TEngineType::DieselEngine: {
|
|
||||||
Particle.velocity *= 1.0 + enginerevolutionsfactor * m_owner.vehicle->MoverParameters->enrot / m_owner.vehicle->MoverParameters->nmax;
|
}
|
||||||
|
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;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
@@ -330,10 +368,23 @@ smoke_source::update( smoke_particle &Particle, bounding_box &Boundingbox, doubl
|
|||||||
|
|
||||||
// crude smoke dispersion simulation
|
// crude smoke dispersion simulation
|
||||||
// http://www.auburn.edu/academic/forestry_wildlife/fire/smoke_guide/smoke_dispersion.htm
|
// 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 -= ( 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
|
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 += Particle.velocity * static_cast<float>( Timedelta );
|
||||||
Particle.position += 0.1f * Particle.age * simulation::Environment.wind() * static_cast<float>( Timedelta );
|
Particle.position += 0.1f * Particle.age * simulation::Environment.wind() * static_cast<float>( Timedelta );
|
||||||
// m_velocitymodifier.update( Particle.velocity, 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
|
// ... and if it fails try to add the template to the database from a data file
|
||||||
smoke_source source;
|
smoke_source source;
|
||||||
cParser sound_parser( templatepath + templatename + ".txt", cParser::buffer_FILE );
|
if( source.deserialize( cParser( templatepath + templatename + ".txt", cParser::buffer_FILE ) ) ) {
|
||||||
if( source.deserialize( sound_parser ) ) {
|
|
||||||
// if deserialization didn't fail finish source setup...
|
// if deserialization didn't fail finish source setup...
|
||||||
source.m_opacitymodifier.bind( &Global.SmokeFidelity );
|
source.m_opacitymodifier.bind( &Global.SmokeFidelity );
|
||||||
// ...then cache the source as template for future instances
|
// ...then cache the source as template for future instances
|
||||||
|
|||||||
Reference in New Issue
Block a user