From 850b23db1f501fef812e1025b056bdb2a4757789 Mon Sep 17 00:00:00 2001 From: Deve Date: Mon, 10 Oct 2016 22:47:30 +0200 Subject: [PATCH] Fixed setting viewport in multiplayer games. It was broken in commit 5cfed1bc1caed71afd03c652dafbb7a5f1c4ae0d. We mix irr_driver->getVideoDriver()->setViewPort() and glViewport(...) functions and thus the first one, which is executed during camera activation, in some cases doesn't work. It compares the viewport to values which has been set last time and thinks that nothing changed. It only happens on single player (with single camera), so we just restore the viewport to fullscreen after scene rendering to workaround the issue. Actually the problem was that it was set after camera activation, which overwrote proper values. I also fixed SSAO, RSM and normals vizualization in multiplayer games. --- src/graphics/render.cpp | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/graphics/render.cpp b/src/graphics/render.cpp index 3ef16eefc..a6aaeaaca 100644 --- a/src/graphics/render.cpp +++ b/src/graphics/render.cpp @@ -260,19 +260,32 @@ void IrrDriver::renderGLSL(float dt) { bool isRace = StateManager::get()->getGameState() == GUIEngine::GAME; FrameBuffer *fbo = m_post_processing->render(camnode, isRace); - + + // The viewport has been changed using glViewport function directly + // during scene rendering, but irrlicht thinks that nothing changed + // when single camera is used. In this case we set the viewport + // to whole screen manually. + glViewport(0, 0, irr_driver->getActualScreenSize().Width, + irr_driver->getActualScreenSize().Height); + if (irr_driver->getNormals()) - irr_driver->getFBO(FBO_NORMAL_AND_DEPTHS).BlitToDefault(viewport.UpperLeftCorner.X, viewport.UpperLeftCorner.Y, viewport.LowerRightCorner.X, viewport.LowerRightCorner.Y); + { + irr_driver->getFBO(FBO_NORMAL_AND_DEPTHS).BlitToDefault( + viewport.UpperLeftCorner.X, + irr_driver->getActualScreenSize().Height - viewport.LowerRightCorner.Y, + viewport.LowerRightCorner.X, + irr_driver->getActualScreenSize().Height - viewport.UpperLeftCorner.Y); + } else if (irr_driver->getSSAOViz()) { glBindFramebuffer(GL_FRAMEBUFFER, 0); - glViewport(viewport.UpperLeftCorner.X, viewport.UpperLeftCorner.Y, viewport.LowerRightCorner.X, viewport.LowerRightCorner.Y); + camera->activate(); m_post_processing->renderPassThrough(m_rtts->getFBO(FBO_HALF1_R).getRTT()[0], viewport.LowerRightCorner.X - viewport.UpperLeftCorner.X, viewport.LowerRightCorner.Y - viewport.UpperLeftCorner.Y); } else if (irr_driver->getRSM()) { glBindFramebuffer(GL_FRAMEBUFFER, 0); - glViewport(viewport.UpperLeftCorner.X, viewport.UpperLeftCorner.Y, viewport.LowerRightCorner.X, viewport.LowerRightCorner.Y); + camera->activate(); m_post_processing->renderPassThrough(m_rtts->getRSM().getRTT()[0], viewport.LowerRightCorner.X - viewport.UpperLeftCorner.X, viewport.LowerRightCorner.Y - viewport.UpperLeftCorner.Y); } else if (irr_driver->getShadowViz()) @@ -283,9 +296,7 @@ void IrrDriver::renderGLSL(float dt) { glEnable(GL_FRAMEBUFFER_SRGB); glBindFramebuffer(GL_FRAMEBUFFER, 0); - if (CVS->isDefferedEnabled()) - camera->activate(); - glViewport(viewport.UpperLeftCorner.X, viewport.UpperLeftCorner.Y, viewport.LowerRightCorner.X, viewport.LowerRightCorner.Y); + camera->activate(); m_post_processing->renderPassThrough(fbo->getRTT()[0], viewport.LowerRightCorner.X - viewport.UpperLeftCorner.X, viewport.LowerRightCorner.Y - viewport.UpperLeftCorner.Y); glDisable(GL_FRAMEBUFFER_SRGB); }