mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-03-22 15:05:03 +01:00
build 210509. configurable max draw range factor, moon visualization enhancement, night lighting tweak, minor bug fixes
This commit is contained in:
10
Globals.cpp
10
Globals.cpp
@@ -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 );
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
9
gl/ubo.h
9
gl/ubo.h
@@ -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
|
||||
{
|
||||
|
||||
3
moon.cpp
3
moon.cpp
@@ -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
2
moon.h
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
2
uart.cpp
2
uart.cpp
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user