diff --git a/src/framework/graphics/framebuffer.cpp b/src/framework/graphics/framebuffer.cpp index 0d721c8e..c0dc86be 100644 --- a/src/framework/graphics/framebuffer.cpp +++ b/src/framework/graphics/framebuffer.cpp @@ -105,13 +105,13 @@ void FrameBuffer::clear(const Color& color, const Rect& rect) { bool clip = rect.isValid(); if(clip) - g_graphics.beginClipping(Rect(0, 0, m_texture->getSize())); + g_painter.setClipRect(Rect(0, 0, m_texture->getSize())); glClearColor(color.rF(), color.gF(), color.bF(), color.aF()); glClear(GL_COLOR_BUFFER_BIT); if(clip) - g_graphics.endClipping(); + g_painter.resetClipRect(); } void FrameBuffer::bind() diff --git a/src/framework/graphics/graphics.cpp b/src/framework/graphics/graphics.cpp index 6b00a29e..6154d2e1 100644 --- a/src/framework/graphics/graphics.cpp +++ b/src/framework/graphics/graphics.cpp @@ -152,17 +152,6 @@ void Graphics::endRender() */ } -void Graphics::beginClipping(const Rect& clipRect) -{ - glEnable(GL_SCISSOR_TEST); - glScissor(clipRect.left(), m_viewportSize.height() - clipRect.bottom() - 1, clipRect.width(), clipRect.height()); -} - -void Graphics::endClipping() -{ - glDisable(GL_SCISSOR_TEST); -} - void Graphics::setViewportSize(const Size& size) { glViewport(0, 0, size.width(), size.height()); diff --git a/src/framework/graphics/graphics.h b/src/framework/graphics/graphics.h index 7d8d3e96..3699eeb9 100644 --- a/src/framework/graphics/graphics.h +++ b/src/framework/graphics/graphics.h @@ -44,9 +44,6 @@ public: void beginRender(); void endRender(); - void beginClipping(const Rect& clipRect); - void endClipping(); - void setViewportSize(const Size& size); int getMaxTextureSize(); diff --git a/src/framework/graphics/painter.cpp b/src/framework/graphics/painter.cpp index 869d44ab..4c9433ba 100644 --- a/src/framework/graphics/painter.cpp +++ b/src/framework/graphics/painter.cpp @@ -138,6 +138,17 @@ void Painter::setCompositionMode(Painter::CompositionMode compositionMode) m_compostionMode = compositionMode; } +void Painter::setClipRect(const Rect& clipRect) +{ + if(clipRect.isValid()) { + glEnable(GL_SCISSOR_TEST); + glScissor(clipRect.left(), g_graphics.getViewportSize().height() - clipRect.bottom() - 1, clipRect.width(), clipRect.height()); + m_clipRect = clipRect; + } else { + glDisable(GL_SCISSOR_TEST); + } +} + void Painter::saveAndResetState() { m_oldCustomProgram = m_customProgram; @@ -145,8 +156,10 @@ void Painter::saveAndResetState() m_oldColor = m_color; m_oldOpacity = m_opacity; m_oldCompostionMode = m_compostionMode; + m_oldClipRect = m_clipRect; releaseCustomProgram(); + resetClipRect(); setColor(Color::white); setOpacity(1); setCompositionMode(CompositionMode_Normal); @@ -158,9 +171,11 @@ void Painter::restoreSavedState() setColor(m_oldColor); setOpacity(m_oldOpacity); setCompositionMode(m_oldCompostionMode); + setClipRect(m_oldClipRect); m_oldCustomProgram = nullptr; m_oldColor = Color::white; m_oldOpacity = 1; m_oldCompostionMode = CompositionMode_Normal; + m_oldClipRect = Rect(); } diff --git a/src/framework/graphics/painter.h b/src/framework/graphics/painter.h index 7d9263de..b19436c2 100644 --- a/src/framework/graphics/painter.h +++ b/src/framework/graphics/painter.h @@ -57,6 +57,10 @@ public: void setOpacity(float opacity) { m_opacity = opacity; } float getOpacity() { return m_opacity; } + void setClipRect(const Rect& clipRect); + Rect getClipRect() { return m_clipRect; } + void resetClipRect() { setClipRect(Rect()); } + void setCustomProgram(PainterShaderProgramPtr program); void releaseCustomProgram() { m_customProgram = nullptr; } void setCompositionMode(CompositionMode compositionMode); @@ -77,11 +81,13 @@ private: float m_opacity; CompositionMode m_compostionMode; CoordsBuffer m_coordsBuffer; + Rect m_clipRect; PainterShaderProgramPtr m_oldCustomProgram; Matrix3 m_oldProjectionMatrix; Color m_oldColor; float m_oldOpacity; + Rect m_oldClipRect; CompositionMode m_oldCompostionMode; }; diff --git a/src/framework/ui/uiwidget.cpp b/src/framework/ui/uiwidget.cpp index ebfeacfd..2fc7d923 100644 --- a/src/framework/ui/uiwidget.cpp +++ b/src/framework/ui/uiwidget.cpp @@ -54,19 +54,19 @@ UIWidget::~UIWidget() void UIWidget::draw(const Rect& visibleRect) { if(m_clipping) - g_graphics.beginClipping(visibleRect); + g_painter.setClipRect(visibleRect); drawSelf(); if(m_children.size() > 0) { if(m_clipping) - g_graphics.beginClipping(visibleRect.intersection(getClippingRect())); + g_painter.setClipRect(visibleRect.intersection(getClippingRect())); drawChildren(visibleRect); } if(m_clipping) - g_graphics.endClipping(); + g_painter.resetClipRect(); } void UIWidget::drawSelf() diff --git a/src/otclient/core/creature.cpp b/src/otclient/core/creature.cpp index 31bf5426..e6a69e34 100644 --- a/src/otclient/core/creature.cpp +++ b/src/otclient/core/creature.cpp @@ -183,10 +183,12 @@ void Creature::drawOutfit(const Rect& destRect, bool resize) if(!outfitBuffer) outfitBuffer = FrameBufferPtr(new FrameBuffer(Size(2*Otc::TILE_PIXELS, 2*Otc::TILE_PIXELS))); + g_painter.saveAndResetState(); outfitBuffer->bind(); outfitBuffer->clear(Color::alpha); internalDrawOutfit(Point(Otc::TILE_PIXELS,Otc::TILE_PIXELS) + getDisplacement(), 1, false, true, Otc::South); outfitBuffer->release(); + g_painter.restoreSavedState(); if(resize) { Rect srcRect;