diff --git a/lib/irrlicht/include/IVideoDriver.h b/lib/irrlicht/include/IVideoDriver.h index e58e0272a..976bf70d4 100644 --- a/lib/irrlicht/include/IVideoDriver.h +++ b/lib/irrlicht/include/IVideoDriver.h @@ -1479,6 +1479,8 @@ namespace video virtual void convertColor(const void* sP, ECOLOR_FORMAT sF, s32 sN, void* dP, ECOLOR_FORMAT dF) const =0; virtual u32 getDefaultFramebuffer() const =0; + virtual void enableScissorTest(const core::rect& r) {} + virtual void disableScissorTest() {} }; } // end namespace video diff --git a/lib/irrlicht/source/Irrlicht/COGLES2Driver.cpp b/lib/irrlicht/source/Irrlicht/COGLES2Driver.cpp index a2df3dd3e..af5bae0f6 100644 --- a/lib/irrlicht/source/Irrlicht/COGLES2Driver.cpp +++ b/lib/irrlicht/source/Irrlicht/COGLES2Driver.cpp @@ -2703,6 +2703,18 @@ namespace video return Material; } + void COGLES2Driver::enableScissorTest(const core::rect& r) + { + glEnable(GL_SCISSOR_TEST); + glScissor(r.UpperLeftCorner.X, r.UpperLeftCorner.Y, + r.getWidth(), r.getHeight()); + } + + void COGLES2Driver::disableScissorTest() + { + glDisable(GL_SCISSOR_TEST); + } + COGLES2CallBridge* COGLES2Driver::getBridgeCalls() const { return BridgeCalls; diff --git a/lib/irrlicht/source/Irrlicht/COGLES2Driver.h b/lib/irrlicht/source/Irrlicht/COGLES2Driver.h index 635788a48..0e8ccb635 100644 --- a/lib/irrlicht/source/Irrlicht/COGLES2Driver.h +++ b/lib/irrlicht/source/Irrlicht/COGLES2Driver.h @@ -68,6 +68,8 @@ namespace video friend class COGLES2Texture; public: + virtual void enableScissorTest(const core::rect& r); + virtual void disableScissorTest(); #if defined(_IRR_COMPILE_WITH_X11_DEVICE_) || defined(_IRR_WINDOWS_API_) || defined(_IRR_COMPILE_WITH_ANDROID_DEVICE_) COGLES2Driver(const SIrrlichtCreationParameters& params, const SExposedVideoData& data, diff --git a/lib/irrlicht/source/Irrlicht/COpenGLDriver.cpp b/lib/irrlicht/source/Irrlicht/COpenGLDriver.cpp index 2c97e7da5..8d2f67a27 100644 --- a/lib/irrlicht/source/Irrlicht/COpenGLDriver.cpp +++ b/lib/irrlicht/source/Irrlicht/COpenGLDriver.cpp @@ -4939,6 +4939,17 @@ GLenum COpenGLDriver::getZBufferBits() const return bits; } +void COpenGLDriver::enableScissorTest(const core::rect& r) +{ + glEnable(GL_SCISSOR_TEST); + glScissor(r.UpperLeftCorner.X, r.UpperLeftCorner.Y, + r.getWidth(), r.getHeight()); +} + +void COpenGLDriver::disableScissorTest() +{ + glDisable(GL_SCISSOR_TEST); +} } // end namespace } // end namespace diff --git a/lib/irrlicht/source/Irrlicht/COpenGLDriver.h b/lib/irrlicht/source/Irrlicht/COpenGLDriver.h index 79524db9f..9f6943b15 100644 --- a/lib/irrlicht/source/Irrlicht/COpenGLDriver.h +++ b/lib/irrlicht/source/Irrlicht/COpenGLDriver.h @@ -38,6 +38,9 @@ namespace video friend class COpenGLTexture; public: + virtual void enableScissorTest(const core::rect& r); + virtual void disableScissorTest(); + #ifdef _IRR_COMPILE_WITH_WINDOWS_DEVICE_ COpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, CIrrDeviceWin32* device); //! inits the windows specific parts of the open gl driver diff --git a/src/font/font_drawer.cpp b/src/font/font_drawer.cpp index d99ba6260..debc2879f 100644 --- a/src/font/font_drawer.cpp +++ b/src/font/font_drawer.cpp @@ -165,15 +165,16 @@ void FontDrawer::draw() if (g_clip) { - glEnable(GL_SCISSOR_TEST); const core::dimension2d& render_target_size = irr_driver->getActualScreenSize(); - glScissor(g_clip->UpperLeftCorner.X, - (s32)render_target_size.Height - g_clip->LowerRightCorner.Y, - g_clip->getWidth(), g_clip->getHeight()); + s32 y = (s32)render_target_size.Height - g_clip->LowerRightCorner.Y; + core::rect r(g_clip->UpperLeftCorner.X, y, + g_clip->UpperLeftCorner.X + g_clip->getWidth(), + y + g_clip->getHeight()); + irr_driver->getVideoDriver()->enableScissorTest(r); } else - glDisable(GL_SCISSOR_TEST); + irr_driver->getVideoDriver()->disableScissorTest(); for (auto& glyph : g_glyphs) { @@ -258,7 +259,7 @@ void FontDrawer::draw() if (g_clip) { - glDisable(GL_SCISSOR_TEST); + irr_driver->getVideoDriver()->disableScissorTest(); g_clip.reset(); }