From 240889b03d916ed58fcc3fec79ab79b58c2d9922 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Tue, 5 Aug 2014 02:21:30 +0200 Subject: [PATCH] 3D: Render target matrix context fix --- code/nel/include/nel/3d/driver_user.h | 2 +- code/nel/include/nel/3d/u_driver.h | 4 ++-- code/nel/src/3d/driver/opengl/driver_opengl.cpp | 4 ++-- code/nel/src/3d/driver_user.cpp | 4 +--- code/nel/src/3d/driver_user2.cpp | 14 +++++++++----- 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/code/nel/include/nel/3d/driver_user.h b/code/nel/include/nel/3d/driver_user.h index 1d3c0b516..f1e1fad84 100644 --- a/code/nel/include/nel/3d/driver_user.h +++ b/code/nel/include/nel/3d/driver_user.h @@ -251,7 +251,7 @@ public: virtual CRenderTargetManager &getRenderTargetManager() { return _RenderTargetManager; } /// Set a texture the size of the window as render target - virtual void beginDefaultRenderTarget(); + virtual void beginDefaultRenderTarget(uint32 width = 0, uint32 height = 0); /// Draw the render target to the back buffer virtual void endDefaultRenderTarget(UScene *scene); diff --git a/code/nel/include/nel/3d/u_driver.h b/code/nel/include/nel/3d/u_driver.h index 247fdff75..a64e13dd6 100644 --- a/code/nel/include/nel/3d/u_driver.h +++ b/code/nel/include/nel/3d/u_driver.h @@ -310,8 +310,8 @@ public: /// Get the render target manager virtual CRenderTargetManager &getRenderTargetManager() =0; - /// Set a texture the size of the window as render target - virtual void beginDefaultRenderTarget() =0; + /// Set a texture of specified size or of the size of the window as render target + virtual void beginDefaultRenderTarget(uint32 width = 0, uint32 height = 0) =0; /// Draw the render target to the back buffer virtual void endDefaultRenderTarget(UScene *scene) =0; diff --git a/code/nel/src/3d/driver/opengl/driver_opengl.cpp b/code/nel/src/3d/driver/opengl/driver_opengl.cpp index 8fe98ffca..ce60d7f42 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl.cpp @@ -1077,7 +1077,7 @@ void CDriverGL::setupViewport (const class CViewport& viewport) // Setup gl viewport uint32 clientWidth, clientHeight; - getWindowSize(clientWidth, clientHeight); + getRenderTargetSize(clientWidth, clientHeight); // Backup the viewport _CurrViewport = viewport; @@ -1132,7 +1132,7 @@ void CDriverGL::setupScissor (const class CScissor& scissor) // Setup gl viewport uint32 clientWidth, clientHeight; - getWindowSize(clientWidth, clientHeight); + getRenderTargetSize(clientWidth, clientHeight); // Backup the scissor _CurrScissor= scissor; diff --git a/code/nel/src/3d/driver_user.cpp b/code/nel/src/3d/driver_user.cpp index d366d6d21..403b5859c 100644 --- a/code/nel/src/3d/driver_user.cpp +++ b/code/nel/src/3d/driver_user.cpp @@ -1948,9 +1948,7 @@ bool CDriverUser::setRenderTarget(class UTexture & uTex, uint32 x, uint32 y, uin bool result = _Driver->setRenderTarget(tex, x, y, width, height, mipmapLevel, cubeFace); - CViewport currentViewport; - _Driver->getViewport(currentViewport); - setViewport(currentViewport); + setupMatrixContext(); return result; } diff --git a/code/nel/src/3d/driver_user2.cpp b/code/nel/src/3d/driver_user2.cpp index 1f1eed938..1b46ab607 100644 --- a/code/nel/src/3d/driver_user2.cpp +++ b/code/nel/src/3d/driver_user2.cpp @@ -75,7 +75,7 @@ void CDriverUser::deleteScene(UScene *scene) // *************************************************************************** -void CDriverUser::beginDefaultRenderTarget() +void CDriverUser::beginDefaultRenderTarget(uint32 width, uint32 height) { if (_MatRenderTarget.empty()) { @@ -102,9 +102,9 @@ void CDriverUser::beginDefaultRenderTarget() } nlassert(!_EffectRenderTarget); - uint32 winw, winh; - getWindowSize(winw, winh); - _EffectRenderTarget = getRenderTargetManager().getRenderTarget(winw, winh); + if (width == 0 || height == 0) + getWindowSize(width, height); + _EffectRenderTarget = getRenderTargetManager().getRenderTarget(width, height); setRenderTarget(*_EffectRenderTarget); } @@ -123,12 +123,16 @@ void CDriverUser::endDefaultRenderTarget(UScene *scene) if (scene) { pCam = scene->getCam(); - setMatrixMode2D11(); } + CViewport oldVp = getViewport(); + CViewport vp = CViewport(); + setViewport(vp); + setMatrixMode2D11(); bool fog = fogEnabled(); enableFog(false); drawQuad(_RenderTargetQuad, _MatRenderTarget); enableFog(fog); + setViewport(oldVp); if (scene) { setMatrixMode3D(pCam);