build 210509. configurable max draw range factor, moon visualization enhancement, night lighting tweak, minor bug fixes

This commit is contained in:
tmj-fstate
2021-05-10 00:50:54 +02:00
parent 51415ef71f
commit 05d8af139a
13 changed files with 95 additions and 52 deletions

View File

@@ -86,8 +86,7 @@ global_settings::ConfigParse(cParser &Parser) {
{
Parser.getTokens(1);
Parser >> BaseDrawRange;
BaseDrawRange = clamp(BaseDrawRange, 500.f,
5000.f); // arbitrary limits to keep users from hurting themselves
BaseDrawRange = clamp(BaseDrawRange, 500.f, 5000.f); // arbitrary limits to keep users from hurting themselves
}
else if (token == "fullscreen")
{
@@ -1009,6 +1008,12 @@ global_settings::ConfigParse_gfx( cParser &Parser, std::string_view const Token
Parser.getTokens(1);
Parser >> gfx_shadergamma;
}
else if (Token == "gfx.drawrange.factor.max")
{
Parser.getTokens(1);
Parser >> gfx_distance_factor_max;
gfx_distance_factor_max = clamp(gfx_distance_factor_max, 1.f, 3.f);
}
else
{
tokenparsed = false;
@@ -1230,6 +1235,7 @@ global_settings::export_as_text( std::ostream &Output ) const {
export_as_text( Output, "gfx.skippipeline", gfx_skippipeline );
export_as_text( Output, "gfx.extraeffects", gfx_extraeffects );
export_as_text( Output, "gfx.shadergamma", gfx_shadergamma );
export_as_text( Output, "gfx.drawrange.factor.max", gfx_distance_factor_max );
export_as_text( Output, "python.enabled", python_enabled );
export_as_text( Output, "python.threadedupload", python_threadedupload );
export_as_text( Output, "python.uploadmain", python_uploadmain );

View File

@@ -148,8 +148,8 @@ struct global_settings {
bool ResourceMove{ false }; // gfx resources are moved between cpu and gpu side instead of sending a copy
bool compress_tex{ true }; // all textures are compressed on gpu side
std::string asSky{ "1" };
double fFpsAverage{ 20.0 }; // oczekiwana wartosć FPS
double fFpsDeviation{ 5.0 }; // odchylenie standardowe FPS
float fFpsAverage{ 0.f }; // oczekiwana wartosć FPS
float fFpsDeviation{ 5.f }; // odchylenie standardowe FPS
double fFpsMin{ 30.0 }; // dolna granica FPS, przy której promień scenerii będzie zmniejszany
double fFpsMax{ 65.0 }; // górna granica FPS, przy której promień scenerii będzie zwiększany
// audio
@@ -228,6 +228,7 @@ struct global_settings {
bool gfx_extraeffects = true;
bool gfx_shadergamma = false;
bool gfx_usegles = false;
float gfx_distance_factor_max { 3.f };
std::string exec_on_exit;

View File

@@ -44,10 +44,10 @@ namespace gl
glm::mat4 inv_view;
glm::mat4 lightview[MAX_CASCADES];
glm::vec4 cascade_end;
float time;
float time; UBS_PAD( 12 );
};
static_assert(sizeof(scene_ubs) == 340, "bad size of ubs");
static_assert(sizeof(scene_ubs) == 352, "bad size of ubs");
const size_t MAX_PARAMS = 3;
@@ -62,8 +62,7 @@ namespace gl
float emission;
float fog_density;
float alpha_mult;
float shadow_tone;
UBS_PAD(4);
float shadow_tone; UBS_PAD(12);
void set_modelview(const glm::mat4 &mv)
{
@@ -72,7 +71,7 @@ namespace gl
}
};
static_assert(sizeof(model_ubs) == 200 + 16 * MAX_PARAMS, "bad size of ubs");
static_assert(sizeof(model_ubs) == 208 + 16 * MAX_PARAMS, "bad size of ubs");
struct light_element_ubs
{

View File

@@ -31,11 +31,12 @@ cMoon::init() {
}
void
cMoon::update() {
cMoon::update( bool const Includephase ) {
m_observer.temp = Global.AirTemperature;
move();
if( Includephase ) { phase(); }
glm::vec3 position( 0.f, 0.f, -1.f );
position = glm::rotateX( position, glm::radians( static_cast<float>( m_body.elevref ) ) );
position = glm::rotateY( position, glm::radians( static_cast<float>( -m_body.hrang ) ) );

2
moon.h
View File

@@ -12,7 +12,7 @@ public:
// methods:
void init();
void update();
void update( bool const Includephase = false );
void render();
// returns vector pointing at the sun
glm::vec3 getDirection();

View File

@@ -702,7 +702,7 @@ void opengl33_renderer::Render_pass(viewport_config &vp, rendermode const Mode)
scene_ubs.projection = OpenGLMatrices.data(GL_PROJECTION);
scene_ubo->update(scene_ubs);
Render(&simulation::Environment);
Render(&simulation::Environment, false);
if( Global.gfx_shadowmap_enabled )
setup_shadow_bind_map();
@@ -916,7 +916,7 @@ void opengl33_renderer::Render_pass(viewport_config &vp, rendermode const Mode)
setup_shadow_unbind_map();
scene_ubs.projection = OpenGLMatrices.data(GL_PROJECTION);
scene_ubo->update(scene_ubs);
Render(&simulation::Environment);
Render(&simulation::Environment, Global.gfx_skippipeline); // HACK: sun/moon drawing messes up rendering with skippipeline on TODO: investigate and fix
// opaque parts...
setup_drawing(false);
setup_shadow_bind_map();
@@ -1521,7 +1521,7 @@ void opengl33_renderer::setup_sunlight_intensity( float const Factor ) {
light_ubo->update( light_ubs );
}
bool opengl33_renderer::Render(world_environment *Environment)
bool opengl33_renderer::Render(world_environment *Environment, bool const Skipcelestialbodies )
{
m_shadowcolor = colors::white; // prevent shadow from affecting sky
setup_shadow_color( m_shadowcolor );
@@ -1534,6 +1534,7 @@ bool opengl33_renderer::Render(world_environment *Environment)
Bind_Material(null_handle);
::glDisable(GL_DEPTH_TEST);
::glDepthMask(GL_FALSE);
::glPushMatrix();
// skydome
@@ -1554,7 +1555,7 @@ bool opengl33_renderer::Render(world_environment *Environment)
::glBlendFunc( GL_SRC_ALPHA, GL_ONE );
// stars
if (Environment->m_stars.m_stars != nullptr)
if (Environment->m_stars.m_stars != nullptr && !Skipcelestialbodies )
{
// setup
::glPushMatrix();
@@ -1581,6 +1582,7 @@ bool opengl33_renderer::Render(world_environment *Environment)
glm::vec3 suncolor = interpolate(glm::vec3(255.0f / 255.0f, 242.0f / 255.0f, 231.0f / 255.0f), glm::vec3(235.0f / 255.0f, 140.0f / 255.0f, 36.0f / 255.0f), duskfactor);
// sun
// if( !Skipcelestialbodies )
{
Bind_Texture(0, m_suntexture);
glm::vec4 color(suncolor.x, suncolor.y, suncolor.z, clamp(1.5f - Global.Overcast, 0.f, 1.f) * fogfactor);
@@ -1597,6 +1599,7 @@ bool opengl33_renderer::Render(world_environment *Environment)
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
// moon
if( !Skipcelestialbodies )
{
Bind_Texture(0, m_moontexture);
glm::vec3 mooncolor(255.0f / 255.0f, 242.0f / 255.0f, 231.0f / 255.0f);
@@ -1668,7 +1671,8 @@ bool opengl33_renderer::Render(world_environment *Environment)
clamp( Environment->m_moon.getAngle(), 0.f, 90.f ) / 90.f );
model_ubs.param[0] = color;
model_ubs.param[1] = glm::vec4(glm::vec3(modelview * glm::vec4(moonvector, 1.0f)), /*0.00451f*/ size);
// model_ubs.param[1] = glm::vec4(glm::vec3(modelview * glm::vec4(moonvector, 1.0f)), 0.00451f);
model_ubs.param[1] = glm::vec4(glm::vec3(modelview * glm::vec4(moonvector, 1.0f)), size);
model_ubs.param[2] = glm::vec4(moonu, moonv, 0.333f, 0.0f);
model_ubo->update(model_ubs);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
@@ -1711,6 +1715,7 @@ bool opengl33_renderer::Render(world_environment *Environment)
gl::program::unbind();
gl::vao::unbind();
::glPopMatrix();
::glDepthMask(GL_TRUE);
::glEnable(GL_DEPTH_TEST);
m_sunlight.apply_angle();
@@ -4135,13 +4140,32 @@ void opengl33_renderer::Update(double const Deltatime)
// adjust draw ranges etc, based on recent performance
// TODO: it doesn't make much sense with vsync
if( Global.targetfps == 0.0f ) {
// automatic adjustment
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( fps_diff > 0.5f ) {
Global.fDistanceFactor = std::min( std::min( 3.0f, Global.fDistanceFactor + 0.05f ), Global.gfx_distance_factor_max );
}
}
// 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 > Global.fFpsDeviation ) {
Global.fDistanceFactor = std::min( std::min( 3.0f, Global.fDistanceFactor + 0.05f ), Global.gfx_distance_factor_max );
}
}
// automatic adjustment
else {
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; }
if( framerate > 120.f ) { targetfactor = std::min( Global.gfx_distance_factor_max, 3.00f ); }
else if( framerate > 90.f ) { targetfactor = std::min( Global.gfx_distance_factor_max, 1.50f ); }
else if( framerate > 60.f ) { targetfactor = std::min( Global.gfx_distance_factor_max, 1.25f ); }
else { targetfactor = 1.00f; }
if( targetfactor > Global.fDistanceFactor ) {
Global.fDistanceFactor = std::min( targetfactor, Global.fDistanceFactor + 0.05f );
@@ -4150,15 +4174,6 @@ void opengl33_renderer::Update(double const Deltatime)
Global.fDistanceFactor = std::max( targetfactor, Global.fDistanceFactor - 0.05f );
}
}
else {
auto const fps_diff = Global.targetfps - m_framerate;
if( fps_diff > 0.5f ) {
Global.fDistanceFactor = std::max( 1.0f, Global.fDistanceFactor - 0.05f );
}
else if( fps_diff < 1.0f ) {
Global.fDistanceFactor = std::min( 3.0f, Global.fDistanceFactor + 0.05f );
}
}
if( Global.UpdateMaterials ) {
// update resources if there was environmental change

View File

@@ -234,7 +234,7 @@ class opengl33_renderer : public gfx_renderer {
void Render_pass(viewport_config &vp, rendermode const Mode);
// creates dynamic environment cubemap
bool Render_reflections(viewport_config &vp);
bool Render(world_environment *Environment);
bool Render(world_environment *Environment, bool const Skipcelestialbodies );
void Render(scene::basic_region *Region);
void Render(section_sequence::iterator First, section_sequence::iterator Last);
void Render(cell_sequence::iterator First, cell_sequence::iterator Last);

View File

@@ -4185,14 +4185,34 @@ 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
// 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( fps_diff > 0.5f ) {
Global.fDistanceFactor = std::min( std::min( 3.0f, Global.fDistanceFactor + 0.05f ), Global.gfx_distance_factor_max );
}
}
// 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 > Global.fFpsDeviation ) {
Global.fDistanceFactor = std::min( std::min( 3.0f, Global.fDistanceFactor + 0.05f ), Global.gfx_distance_factor_max );
}
}
// automatic adjustment
else {
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; }
if( framerate > 120.f ) { targetfactor = std::min( Global.gfx_distance_factor_max, 3.00f ); }
else if( framerate > 90.f ) { targetfactor = std::min( Global.gfx_distance_factor_max, 1.50f ); }
else if( framerate > 60.f ) { targetfactor = std::min( Global.gfx_distance_factor_max, 1.25f ); }
else { targetfactor = 1.00f; }
if( targetfactor > Global.fDistanceFactor ) {
Global.fDistanceFactor = std::min( targetfactor, Global.fDistanceFactor + 0.05f );
@@ -4201,15 +4221,6 @@ opengl_renderer::Update( double const Deltatime ) {
Global.fDistanceFactor = std::max( targetfactor, Global.fDistanceFactor - 0.05f );
}
}
else {
auto const fps_diff = Global.targetfps - m_framerate;
if( fps_diff > 0.5f ) {
Global.fDistanceFactor = std::max( 1.0f, Global.fDistanceFactor - 0.05f );
}
else if( fps_diff < 1.0f ) {
Global.fDistanceFactor = std::min( 3.0f, Global.fDistanceFactor + 0.05f );
}
}
if( Global.UpdateMaterials ) {
// update resources if there was environmental change

View File

@@ -314,6 +314,8 @@ void state_manager::process_commands() {
// HACK: force re-calculation of precipitation
Global.Overcast = clamp( Global.Overcast - 0.0001f, 0.0f, 2.0f );
}
simulation::Environment.update_moon();
}
if (commanddata.command == user_command::setweather) {

View File

@@ -126,7 +126,7 @@ world_environment::update() {
Global.DayLight.position = m_moon.getDirection();
Global.DayLight.direction = -1.0f * m_moon.getDirection();
keylightintensity = moonlightlevel;
m_lightintensity = 0.35f;
m_lightintensity = moonlightlevel;
// if the moon is up, it overrides the twilight
twilightfactor = 0.0f;
keylightcolor = glm::vec3( 255.0f / 255.0f, 242.0f / 255.0f, 202.0f / 255.0f );
@@ -165,9 +165,10 @@ world_environment::update() {
// tonal impact of skydome color is inversely proportional to how high the sun is above the horizon
// (this is pure conjecture, aimed more to 'look right' than be accurate)
float const ambienttone = clamp( 1.0f - ( Global.SunAngle / 90.0f ), 0.0f, 1.0f );
Global.DayLight.ambient[ 0 ] = interpolate( skydomehsv.z, skydomecolour.r, ambienttone );
Global.DayLight.ambient[ 1 ] = interpolate( skydomehsv.z, skydomecolour.g, ambienttone );
Global.DayLight.ambient[ 2 ] = interpolate( skydomehsv.z, skydomecolour.b, ambienttone );
float const ambientintensitynightfactor = 1.f - 0.75f * clamp( -m_sun.getAngle(), 0.0f, 18.0f ) / 18.0f;
Global.DayLight.ambient[ 0 ] = interpolate( skydomehsv.z, skydomecolour.r, ambienttone ) * ambientintensitynightfactor;
Global.DayLight.ambient[ 1 ] = interpolate( skydomehsv.z, skydomecolour.g, ambienttone ) * ambientintensitynightfactor;
Global.DayLight.ambient[ 2 ] = interpolate( skydomehsv.z, skydomecolour.b, ambienttone ) * ambientintensitynightfactor;
Global.fLuminance = intensity;
@@ -210,6 +211,12 @@ world_environment::update_precipitation() {
m_precipitation.update();
}
void
world_environment::update_moon() {
m_moon.update( true );
}
void
world_environment::update_wind() {

View File

@@ -31,6 +31,7 @@ public:
void init();
void update();
void update_precipitation();
void update_moon();
void time( int const Hour = -1, int const Minute = -1, int const Second = -1 );
// switches between static and dynamic daylight calculation
void on_daylight_change();

View File

@@ -199,7 +199,7 @@ void uart_input::poll()
if (!sync) {
int sync_cnt = 0;
int sync_fail = 0;
char sc = 0;
unsigned char sc = 0;
while ((ret = sp_blocking_read(port, &sc, 1, 10)) >= 0) {
if (conf.debug)
WriteLog("uart: read byte: " + std::to_string((int)sc));

View File

@@ -1,5 +1,5 @@
#pragma once
#define VERSION_MAJOR 21
#define VERSION_MINOR 508
#define VERSION_MINOR 509
#define VERSION_REVISION 0