From d78793c979c665aa77fdb7f5dbf43dead62ce57e Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Mon, 17 Feb 2025 12:33:08 -0600 Subject: [PATCH] store clip_rects of RenderTextures --- src/gfx/render_image.cpp | 1 + src/gfx/render_shapes.cpp | 15 +++++++++++++++ src/gfx/render_text.cpp | 1 + 3 files changed, 17 insertions(+) diff --git a/src/gfx/render_image.cpp b/src/gfx/render_image.cpp index e1a2c17b..57a5244b 100644 --- a/src/gfx/render_image.cpp +++ b/src/gfx/render_image.cpp @@ -123,6 +123,7 @@ void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,const } std::map> store_scale_aware_text; +std::map store_clip_rects; static void draw_stored_scale_aware_text(sf::RenderTexture& texture, sf::RenderTarget& dest_window, rectangle targ_rect) { // Temporarily switch target window to its unscaled view to draw scale-aware text diff --git a/src/gfx/render_shapes.cpp b/src/gfx/render_shapes.cpp index bc08df31..b5deff1c 100644 --- a/src/gfx/render_shapes.cpp +++ b/src/gfx/render_shapes.cpp @@ -242,8 +242,18 @@ void Region::setStencil(sf::RenderWindow& where) { glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); } +extern std::map store_clip_rects; + void clip_rect(sf::RenderTarget& where, rectangle rect) { rect &= rectangle(where); // Make sure we don't draw out of bounds + + // Text isn't actually drawn onto Render Textures, so the render texture's clip rect + // needs to be stored externally to be applied to text later + if(dynamic_cast(&where) != nullptr){ + sf::RenderTexture* p = dynamic_cast(&where); + store_clip_rects[p] = rect; + } + // TODO: Make sure this works for the scissor test... setActiveRenderTarget(where); auto viewport = where.getView().getViewport(); @@ -259,6 +269,11 @@ void clip_region(sf::RenderWindow& where, Region& region) { } void undo_clip(sf::RenderTarget& where) { + if(dynamic_cast(&where) != nullptr){ + sf::RenderTexture* p = dynamic_cast(&where); + store_clip_rects.erase(p); + } + setActiveRenderTarget(where); glDisable(GL_SCISSOR_TEST); glDisable(GL_STENCIL_TEST); diff --git a/src/gfx/render_text.cpp b/src/gfx/render_text.cpp index 8d0a75ff..5cfd973f 100644 --- a/src/gfx/render_text.cpp +++ b/src/gfx/render_text.cpp @@ -137,6 +137,7 @@ break_info_t calculate_line_wrapping(rectangle dest_rect, std::string str, TextS // I don't know of a better way to do this than using pointers as keys. extern std::map> store_scale_aware_text; +extern std::map store_clip_rects; void clear_scale_aware_text(sf::RenderTexture& texture) { store_scale_aware_text.erase(&texture);