From 402cd19fb84ec8b264294b04bf607679993d6bbc Mon Sep 17 00:00:00 2001 From: Emil Axelsson Date: Thu, 29 Mar 2018 17:19:24 +0200 Subject: [PATCH] Fix bug with atmosphere rendering offset after minimizing window --- .../openspace/rendering/framebufferrenderer.h | 1 + src/engine/wrapper/sgctwindowwrapper.cpp | 15 +++---- src/rendering/framebufferrenderer.cpp | 43 +++++++++++-------- 3 files changed, 32 insertions(+), 27 deletions(-) diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index 506c2b1e25..56fe78ef15 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -133,6 +133,7 @@ private: bool _dirtyDeferredcastData; bool _dirtyRaycastData; bool _dirtyResolution; + bool _dirtyMsaaSamplingPattern; Camera* _camera; Scene* _scene; diff --git a/src/engine/wrapper/sgctwindowwrapper.cpp b/src/engine/wrapper/sgctwindowwrapper.cpp index 6dbcb38cb6..a7a4811411 100644 --- a/src/engine/wrapper/sgctwindowwrapper.cpp +++ b/src/engine/wrapper/sgctwindowwrapper.cpp @@ -236,14 +236,13 @@ void SGCTWindowWrapper::setEyeSeparationDistance(float distance) { } glm::ivec4 SGCTWindowWrapper::viewportPixelCoordinates() const { - int x1, xSize, y1, ySize; - sgct::Engine::instance()->getCurrentWindowPtr()->getCurrentViewportPixelCoords( - x1, - y1, - xSize, - ySize - ); - return glm::ivec4(x1, xSize, y1, ySize); + sgct::SGCTWindow* window = sgct::Engine::instance()->getCurrentWindowPtr(); + if (!window || !window->getCurrentViewport()) { + return glm::ivec4(0, 0, 0, 0); + } + + const int* viewportData = sgct::Engine::instance()->getCurrentViewportPixelCoords(); + return glm::ivec4(viewportData[0], viewportData[2], viewportData[1], viewportData[3]); } bool SGCTWindowWrapper::isExternalControlConnected() const { diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index d36e049473..165ce9f912 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -213,7 +213,7 @@ namespace openspace { // JCC: Moved to here to avoid NVidia: "Program/shader state performance warning" updateHDRData(); updateDeferredcastData(); - updateMSAASamplingPattern(); + _dirtyMsaaSamplingPattern = true; glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); @@ -269,19 +269,6 @@ namespace openspace { } void FramebufferRenderer::update() { - if (_dirtyResolution) { - updateResolution(); - updateMSAASamplingPattern(); - } - - if (_dirtyRaycastData) { - updateRaycastData(); - } - - if (_dirtyDeferredcastData) { - updateDeferredcastData(); - } - // If the resolve dictionary changed (or a file changed on disk) // then rebuild the resolve program. if (_hdrBackGroundProgram && _hdrBackGroundProgram->isDirty()) { @@ -661,8 +648,8 @@ namespace openspace { // Saves current state GLint defaultFbo; glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFbo); - GLint viewport[4]; - glGetIntegerv(GL_VIEWPORT, viewport); + + glm::ivec4 viewport = OsEng.windowWrapper().viewportPixelCoordinates(); // Main framebuffer GLuint pixelSizeTexture = 0; @@ -899,7 +886,7 @@ namespace openspace { // Convert back to [-1, 1] range and then scale for the current viewport size: for (int d = 0; d < _nAaSamples; ++d) { _mSAAPattern[d * 3] = (2.0 * _mSAAPattern[d * 3] - 1.0) / - static_cast(viewport[2]); + static_cast(viewport[1]); _mSAAPattern[(d * 3) + 1] = (2.0 * _mSAAPattern[(d * 3) + 1] - 1.0) / static_cast(viewport[3]); _mSAAPattern[(d * 3) + 2] = 0.0; @@ -909,7 +896,7 @@ namespace openspace { // Restores default state glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); - glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); + glViewport(viewport[0], viewport[2], viewport[1], viewport[3]); // Deletes unused buffers glDeleteFramebuffers(1, &pixelSizeFramebuffer); @@ -921,9 +908,27 @@ namespace openspace { glDeleteTextures(1, &nOneStripTexture); glDeleteBuffers(1, &nOneStripVBO); glDeleteVertexArrays(1, &nOneStripVAO); + + _dirtyMsaaSamplingPattern = false; } void FramebufferRenderer::render(float blackoutFactor, bool doPerformanceMeasurements) { + if (_dirtyResolution) { + updateResolution(); + } + + if (_dirtyMsaaSamplingPattern) { + updateMSAASamplingPattern(); + } + + if (_dirtyRaycastData) { + updateRaycastData(); + } + + if (_dirtyDeferredcastData) { + updateDeferredcastData(); + } + std::unique_ptr perf; if (doPerformanceMeasurements) { perf = std::make_unique( @@ -1211,7 +1216,7 @@ namespace openspace { LERROR("Framebuffer renderer does not support more than 8 MSAA samples."); _nAaSamples = 8; } - _dirtyResolution = true; + _dirtyMsaaSamplingPattern = true; } void FramebufferRenderer::setHDRExposure(float hdrExposure) {