mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-03-22 15:05:03 +01:00
Merge commit 'd8170c932b448ba6888e702746b5ae22632062d8' into sim
This commit is contained in:
@@ -981,7 +981,7 @@ opengl_renderer::setup_pass( renderpass_config &Config, rendermode const Mode, f
|
||||
auto const lightvector =
|
||||
glm::normalize( glm::vec3{
|
||||
m_sunlight.direction.x,
|
||||
std::min( m_sunlight.direction.y, -0.2f ),
|
||||
std::min( m_sunlight.direction.y, Global.gfx_shadow_angle_min ),
|
||||
m_sunlight.direction.z } );
|
||||
// ...place the light source at the calculated centre and setup world space light view matrix...
|
||||
camera.position() = worldview.camera.position() + glm::dvec3{ frustumchunkcentre };
|
||||
@@ -1033,7 +1033,7 @@ opengl_renderer::setup_pass( renderpass_config &Config, rendermode const Mode, f
|
||||
auto const lightvector =
|
||||
glm::normalize( glm::vec3{
|
||||
m_sunlight.direction.x,
|
||||
std::min( m_sunlight.direction.y, -0.2f ),
|
||||
std::min( m_sunlight.direction.y, Global.gfx_shadow_angle_min ),
|
||||
m_sunlight.direction.z } );
|
||||
camera.position() = Global.pCamera.Pos - glm::dvec3 { lightvector };
|
||||
viewmatrix *= glm::lookAt(
|
||||
@@ -1768,6 +1768,13 @@ opengl_renderer::Material( material_handle const Material ) const {
|
||||
return m_materials.material( Material );
|
||||
}
|
||||
|
||||
opengl_material const &
|
||||
opengl_renderer::Material( TSubModel const * Submodel ) const {
|
||||
|
||||
auto const material { Submodel->m_material >= 0 ? Submodel->m_material : Submodel->ReplacableSkinId[ -Submodel->m_material ] };
|
||||
return Material( material );
|
||||
}
|
||||
|
||||
// shader methods
|
||||
std::shared_ptr<gl::program>
|
||||
opengl_renderer::Fetch_Shader( std::string const &name ) {
|
||||
@@ -2296,7 +2303,13 @@ opengl_renderer::Render( scene::shape_node const &Shape, bool const Ignorerange
|
||||
break;
|
||||
}
|
||||
// pick modes are painted with custom colours, and shadow pass doesn't use any
|
||||
case rendermode::shadows:
|
||||
case rendermode::shadows: {
|
||||
// skip if the shadow caster rank is too low for currently set threshold
|
||||
if( Material( data.material ).shadow_rank > Global.gfx_shadow_rank_cutoff ) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
[[ fallthrough ]];
|
||||
case rendermode::cabshadows:
|
||||
case rendermode::pickscenery:
|
||||
case rendermode::pickcontrols:
|
||||
@@ -2826,7 +2839,16 @@ opengl_renderer::Render( TSubModel *Submodel ) {
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
case rendermode::shadows:
|
||||
case rendermode::shadows: {
|
||||
// skip if the shadow caster rank is too low for currently set threshold
|
||||
if( Material( Submodel ).shadow_rank > Global.gfx_shadow_rank_cutoff )
|
||||
{
|
||||
--m_renderpass.draw_stats.submodels;
|
||||
--m_renderpass.draw_stats.drawcalls;
|
||||
break;
|
||||
}
|
||||
}
|
||||
[[fallthrough]];
|
||||
case rendermode::cabshadows:
|
||||
case rendermode::pickscenery: {
|
||||
// scenery picking and shadow both use enforced colour and no frills
|
||||
@@ -3113,6 +3135,11 @@ opengl_renderer::Render( scene::basic_cell::path_sequence::const_iterator First,
|
||||
// shadows are only calculated for high enough roads, typically meaning track platforms
|
||||
continue;
|
||||
}
|
||||
if( Material( track->m_material1 ).shadow_rank > Global.gfx_shadow_rank_cutoff )
|
||||
{
|
||||
// skip if the shadow caster rank is too low for currently set threshold
|
||||
continue;
|
||||
}
|
||||
Bind_Material( track->m_material1 );
|
||||
m_geometry.draw( std::begin( track->Geometry1 ), std::end( track->Geometry1 ) );
|
||||
break;
|
||||
@@ -3158,6 +3185,11 @@ opengl_renderer::Render( scene::basic_cell::path_sequence::const_iterator First,
|
||||
// shadows are only calculated for high enough trackbeds
|
||||
continue;
|
||||
}
|
||||
if( Material( track->m_material2 ).shadow_rank > Global.gfx_shadow_rank_cutoff )
|
||||
{
|
||||
// skip if the shadow caster rank is too low for currently set threshold
|
||||
continue;
|
||||
}
|
||||
Bind_Material( track->m_material2 );
|
||||
m_geometry.draw( std::begin( track->Geometry2 ), std::end( track->Geometry2 ) );
|
||||
break;
|
||||
@@ -3206,6 +3238,11 @@ opengl_renderer::Render( scene::basic_cell::path_sequence::const_iterator First,
|
||||
// shadows are only calculated for high enough trackbeds
|
||||
continue;
|
||||
}
|
||||
if( Material( track->SwitchExtension->m_material3 ).shadow_rank > Global.gfx_shadow_rank_cutoff )
|
||||
{
|
||||
// skip if the shadow caster rank is too low for currently set threshold
|
||||
continue;
|
||||
}
|
||||
Bind_Material( track->SwitchExtension->m_material3 );
|
||||
m_geometry.draw( track->SwitchExtension->Geometry3 );
|
||||
break;
|
||||
@@ -4187,29 +4224,25 @@ opengl_renderer::Update( double const Deltatime ) {
|
||||
m_updateaccumulator = 0.0;
|
||||
m_framerate = 1000.f / ( Timer::subsystem.gfx_total.average() );
|
||||
|
||||
// adjust draw ranges etc, based on recent performance
|
||||
if( Global.targetfps == 0.0f ) {
|
||||
// automatic adjustment
|
||||
auto const framerate = interpolate( 1000.f / Timer::subsystem.gfx_color.average(), m_framerate, 0.75f );
|
||||
float targetfactor;
|
||||
if( framerate > 120.0 ) { targetfactor = 3.00f; }
|
||||
else if( framerate > 90.0 ) { targetfactor = 1.50f; }
|
||||
else if( framerate > 60.0 ) { targetfactor = 1.25f; }
|
||||
else { targetfactor = 1.00f; }
|
||||
if( targetfactor > Global.fDistanceFactor ) {
|
||||
Global.fDistanceFactor = std::min( targetfactor, Global.fDistanceFactor + 0.05f );
|
||||
// adjust draw ranges etc, based on recent performance
|
||||
// TODO: it doesn't make much sense with vsync
|
||||
if( Global.targetfps != 0.f ) {
|
||||
auto const fps_diff = m_framerate - Global.targetfps;
|
||||
if( fps_diff < -0.5f ) {
|
||||
Global.fDistanceFactor = std::min( std::max( 1.0f, Global.fDistanceFactor - 0.05f ), Global.gfx_distance_factor_max );
|
||||
}
|
||||
else if( targetfactor < Global.fDistanceFactor ) {
|
||||
Global.fDistanceFactor = std::max( targetfactor, Global.fDistanceFactor - 0.05f );
|
||||
else if( fps_diff > 0.5f ) {
|
||||
Global.fDistanceFactor = std::min( std::min( 3.0f, Global.fDistanceFactor + 0.05f ), Global.gfx_distance_factor_max );
|
||||
}
|
||||
}
|
||||
else {
|
||||
auto const fps_diff = Global.targetfps - m_framerate;
|
||||
if( fps_diff > 0.5f ) {
|
||||
Global.fDistanceFactor = std::max( 1.0f, Global.fDistanceFactor - 0.05f );
|
||||
// legacy framerate parameters
|
||||
else if( Global.fFpsAverage != 0.f ) {
|
||||
auto const fps_diff = m_framerate - Global.fFpsAverage;
|
||||
if( fps_diff < -Global.fFpsDeviation ) {
|
||||
Global.fDistanceFactor = std::min( std::max( 1.0f, Global.fDistanceFactor - 0.05f ), Global.gfx_distance_factor_max );
|
||||
}
|
||||
else if( fps_diff < 1.0f ) {
|
||||
Global.fDistanceFactor = std::min( 3.0f, Global.fDistanceFactor + 0.05f );
|
||||
else if( fps_diff > Global.fFpsDeviation ) {
|
||||
Global.fDistanceFactor = std::min( std::min( 3.0f, Global.fDistanceFactor + 0.05f ), Global.gfx_distance_factor_max );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user