diff --git a/src/interface/modeler/quickapp/AtmosphereModeler.cpp b/src/interface/modeler/quickapp/AtmosphereModeler.cpp index 5dcf86d..f562a61 100644 --- a/src/interface/modeler/quickapp/AtmosphereModeler.cpp +++ b/src/interface/modeler/quickapp/AtmosphereModeler.cpp @@ -5,6 +5,7 @@ #include "AtmosphereDefinition.h" #include "OpenGLRenderer.h" #include "OpenGLSkybox.h" +#include "OpenGLTerrain.h" AtmosphereModeler::AtmosphereModeler(MainModelerWindow *main): main(main) @@ -23,4 +24,7 @@ void AtmosphereModeler::daytimeChanged(double value) main->getRenderer()->getScenery()->setAtmosphere(main->getScenery()->getAtmosphere()); main->getRenderer()->getSkybox()->update(); + + // Update terrain textures according to new lighting + main->getRenderer()->getTerrain()->resetTextures(); } diff --git a/src/interface/modeler/quickapp/MainModelerWindow.cpp b/src/interface/modeler/quickapp/MainModelerWindow.cpp index 924f13d..a96f5c3 100644 --- a/src/interface/modeler/quickapp/MainModelerWindow.cpp +++ b/src/interface/modeler/quickapp/MainModelerWindow.cpp @@ -90,7 +90,7 @@ void MainModelerWindow::keyReleaseEvent(QKeyEvent *event) { render_process->stopRender(); - rootObject()->setProperty("state", QString("Init")); + setState("Init"); } else if (event->key() == Qt::Key_Q) { diff --git a/src/render/opengl/ExplorerChunkTerrain.cpp b/src/render/opengl/ExplorerChunkTerrain.cpp index 9e9636f..83fc58f 100644 --- a/src/render/opengl/ExplorerChunkTerrain.cpp +++ b/src/render/opengl/ExplorerChunkTerrain.cpp @@ -13,7 +13,8 @@ ExplorerChunkTerrain::ExplorerChunkTerrain(OpenGLRenderer* renderer, double x, d _renderer(renderer) { priority = 0.0; - _reset_needed = false; + _reset_topology = false; + _reset_texture = false; interrupt = false; @@ -58,13 +59,17 @@ bool ExplorerChunkTerrain::maintain() bool subchanged; _lock_data.lock(); - if (_reset_needed) + if (_reset_topology) { - _reset_needed = false; - _texture_current_size = 0; + _reset_topology = false; _tessellation_current_size = 0; overwater = false; } + if (_reset_texture) + { + _reset_texture = false; + _texture_current_size = 0; + } _lock_data.unlock(); // Improve heightmap resolution @@ -103,7 +108,7 @@ bool ExplorerChunkTerrain::maintain() tessellated->setGridVertex(tessellation_count, i, j, v); } } - if (interrupt or _reset_needed) + if (interrupt or _reset_topology) { return false; } @@ -143,7 +148,7 @@ bool ExplorerChunkTerrain::maintain() } } - if (interrupt or _reset_needed) + if (interrupt or _reset_texture) { return false; } @@ -216,7 +221,7 @@ void ExplorerChunkTerrain::updatePriority(CameraDefinition* camera) } // Update priority - if (_reset_needed || (_texture_max_size > 1 && _texture_current_size <= 1)) + if (_reset_topology || _reset_texture || (_texture_max_size > 1 && _texture_current_size <= 1)) { priority = 1000.0; } @@ -259,7 +264,7 @@ void ExplorerChunkTerrain::render(QOpenGLShaderProgram* program, OpenGLFunctions _lock_data.unlock(); // Render tessellated mesh - if (!_reset_needed) + if (!_reset_topology) { _lock_data.lock(); int tessellation_size = _tessellation_current_size; @@ -280,9 +285,10 @@ void ExplorerChunkTerrain::render(QOpenGLShaderProgram* program, OpenGLFunctions } } -void ExplorerChunkTerrain::askReset() +void ExplorerChunkTerrain::askReset(bool topology, bool texture) { - _reset_needed = true; + _reset_topology = _reset_topology or topology; + _reset_texture = _reset_texture or texture; } void ExplorerChunkTerrain::askInterrupt() diff --git a/src/render/opengl/ExplorerChunkTerrain.h b/src/render/opengl/ExplorerChunkTerrain.h index 8cbd0ee..6402299 100644 --- a/src/render/opengl/ExplorerChunkTerrain.h +++ b/src/render/opengl/ExplorerChunkTerrain.h @@ -27,7 +27,7 @@ public: void updatePriority(CameraDefinition* camera); void render(QOpenGLShaderProgram* program, OpenGLFunctions* functions); - void askReset(); + void askReset(bool topology = true, bool texture = true); void askInterrupt(); Color getTextureColor(double x, double y); @@ -54,7 +54,8 @@ private: OpenGLRenderer* _renderer; - bool _reset_needed; + bool _reset_topology; + bool _reset_texture; bool interrupt; QImage* _texture; diff --git a/src/render/opengl/OpenGLTerrain.cpp b/src/render/opengl/OpenGLTerrain.cpp index bfe7a44..98426eb 100644 --- a/src/render/opengl/OpenGLTerrain.cpp +++ b/src/render/opengl/OpenGLTerrain.cpp @@ -95,12 +95,20 @@ void OpenGLTerrain::render() void OpenGLTerrain::interrupt() { - for (auto chunk: _chunks) + for (auto &chunk: _chunks) { chunk->askInterrupt(); } } +void OpenGLTerrain::resetTextures() +{ + for (auto &chunk: _chunks) + { + chunk->askReset(false, true); + } +} + static bool _cmpChunks(const ExplorerChunkTerrain* c1, const ExplorerChunkTerrain* c2) { return c1->priority > c2->priority; diff --git a/src/render/opengl/OpenGLTerrain.h b/src/render/opengl/OpenGLTerrain.h index 6a695d1..a888f5e 100644 --- a/src/render/opengl/OpenGLTerrain.h +++ b/src/render/opengl/OpenGLTerrain.h @@ -23,6 +23,11 @@ public: virtual void render() override; virtual void interrupt() override; + /** + * Reset the color textures, without changing the tessellation. + */ + void resetTextures(); + void performChunksMaintenance(); private: