diff --git a/src/interface/modeler/quickapp/RenderProcess.cpp b/src/interface/modeler/quickapp/RenderProcess.cpp index a8e687a..f466a16 100644 --- a/src/interface/modeler/quickapp/RenderProcess.cpp +++ b/src/interface/modeler/quickapp/RenderProcess.cpp @@ -8,6 +8,7 @@ #include "Thread.h" #include "Canvas.h" #include "CanvasPreview.h" +#include "OpenGLRenderer.h" class RenderThread: public Thread { @@ -89,6 +90,9 @@ void RenderProcess::startRender(Scenery *scenery, const RenderConfig &config) image->setProperty("height", preview_size.height()); } + // Pause OpenGL renderer + window->getRenderer()->pause(); + // Start render thread render_thread = new RenderThread(renderer); render_thread->start(); @@ -145,6 +149,8 @@ void RenderProcess::timerEvent(QTimerEvent *) render_thread->join(); delete render_thread; render_thread = NULL; + + window->getRenderer()->resume(); } if (renderer) diff --git a/src/render/opengl/ExplorerChunkTerrain.cpp b/src/render/opengl/ExplorerChunkTerrain.cpp index baaca0a..4100ee2 100644 --- a/src/render/opengl/ExplorerChunkTerrain.cpp +++ b/src/render/opengl/ExplorerChunkTerrain.cpp @@ -295,6 +295,11 @@ void ExplorerChunkTerrain::askInterrupt() interrupt = true; } +void ExplorerChunkTerrain::askResume() +{ + interrupt = false; +} + Color ExplorerChunkTerrain::getTextureColor(double x, double y) { Vector3 location = {_startx + x * _size, 0.0, _startz + y * _size}; diff --git a/src/render/opengl/ExplorerChunkTerrain.h b/src/render/opengl/ExplorerChunkTerrain.h index cc8d420..d6852a4 100644 --- a/src/render/opengl/ExplorerChunkTerrain.h +++ b/src/render/opengl/ExplorerChunkTerrain.h @@ -29,6 +29,7 @@ public: void askReset(bool topology = true, bool texture = true); void askInterrupt(); + void askResume(); Color getTextureColor(double x, double y); diff --git a/src/render/opengl/OpenGLRenderer.cpp b/src/render/opengl/OpenGLRenderer.cpp index 23b7c08..5db4b9d 100644 --- a/src/render/opengl/OpenGLRenderer.cpp +++ b/src/render/opengl/OpenGLRenderer.cpp @@ -16,6 +16,7 @@ OpenGLRenderer::OpenGLRenderer(Scenery* scenery): SoftwareRenderer(scenery) { ready = false; + paused = false; vp_width = 1; vp_height = 1; @@ -129,7 +130,7 @@ void OpenGLRenderer::resize(int width, int height) void OpenGLRenderer::paint() { - if (ready) + if (ready and not paused) { functions->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -145,6 +146,18 @@ void OpenGLRenderer::paint() } } +void OpenGLRenderer::pause() +{ + paused = true; + terrain->pause(); +} + +void OpenGLRenderer::resume() +{ + paused = false; + terrain->resume(); +} + void OpenGLRenderer::cameraChangeEvent(CameraDefinition *camera) { // Get camera info diff --git a/src/render/opengl/OpenGLRenderer.h b/src/render/opengl/OpenGLRenderer.h index 9954d5e..fcd2f26 100644 --- a/src/render/opengl/OpenGLRenderer.h +++ b/src/render/opengl/OpenGLRenderer.h @@ -26,6 +26,17 @@ public: void resize(int width, int height); void paint(); + /** + * Pause the rendering process. + * + * This will prevent paintings and stop background tasks, until resume() is called. + */ + void pause(); + /** + * Resume the rendering process, put on hold by pause(). + */ + void resume(); + /** * Change the camera location. * @@ -42,6 +53,7 @@ public: private: bool ready; + bool paused; int vp_width; int vp_height; diff --git a/src/render/opengl/OpenGLTerrain.cpp b/src/render/opengl/OpenGLTerrain.cpp index dfce72c..33acb1b 100644 --- a/src/render/opengl/OpenGLTerrain.cpp +++ b/src/render/opengl/OpenGLTerrain.cpp @@ -24,7 +24,11 @@ public: { while (running) { - terrain->performChunksMaintenance(); + if (not terrain->isPaused()) + { + terrain->performChunksMaintenance(); + } + Thread::timeSleepMs(10); } } @@ -37,6 +41,7 @@ OpenGLTerrain::OpenGLTerrain(OpenGLRenderer *renderer): OpenGLPart(renderer) { work = new ChunkMaintenanceThreads(this); + paused = false; } OpenGLTerrain::~OpenGLTerrain() @@ -105,6 +110,21 @@ void OpenGLTerrain::interrupt() } } +void OpenGLTerrain::pause() +{ + paused = true; + interrupt(); +} + +void OpenGLTerrain::resume() +{ + for (auto &chunk: _chunks) + { + chunk->askResume(); + } + paused = false; +} + void OpenGLTerrain::resetTextures() { for (auto &chunk: _chunks) diff --git a/src/render/opengl/OpenGLTerrain.h b/src/render/opengl/OpenGLTerrain.h index fa6cbec..b34fa56 100644 --- a/src/render/opengl/OpenGLTerrain.h +++ b/src/render/opengl/OpenGLTerrain.h @@ -24,6 +24,10 @@ public: virtual void render() override; virtual void interrupt() override; + void pause(); + void resume(); + inline bool isPaused() const { return paused; } + /** * Reset the color textures, without changing the tessellation. */ @@ -36,6 +40,7 @@ private: OpenGLShaderProgram* program; ParallelPool* work; + bool paused; QVector _chunks; QList _updateQueue;