store clip_rects of RenderTextures

This commit is contained in:
2025-02-17 12:33:08 -06:00
parent 2145d88133
commit d78793c979
3 changed files with 17 additions and 0 deletions

View File

@@ -123,6 +123,7 @@ void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,const
} }
std::map<sf::RenderTexture*,std::vector<sf::Text>> store_scale_aware_text; std::map<sf::RenderTexture*,std::vector<sf::Text>> store_scale_aware_text;
std::map<sf::RenderTexture*,rectangle> store_clip_rects;
static void draw_stored_scale_aware_text(sf::RenderTexture& texture, sf::RenderTarget& dest_window, rectangle targ_rect) { 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 // Temporarily switch target window to its unscaled view to draw scale-aware text

View File

@@ -242,8 +242,18 @@ void Region::setStencil(sf::RenderWindow& where) {
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
} }
extern std::map<sf::RenderTexture*,rectangle> store_clip_rects;
void clip_rect(sf::RenderTarget& where, rectangle rect) { void clip_rect(sf::RenderTarget& where, rectangle rect) {
rect &= rectangle(where); // Make sure we don't draw out of bounds 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<sf::RenderTexture*>(&where) != nullptr){
sf::RenderTexture* p = dynamic_cast<sf::RenderTexture*>(&where);
store_clip_rects[p] = rect;
}
// TODO: Make sure this works for the scissor test... // TODO: Make sure this works for the scissor test...
setActiveRenderTarget(where); setActiveRenderTarget(where);
auto viewport = where.getView().getViewport(); auto viewport = where.getView().getViewport();
@@ -259,6 +269,11 @@ void clip_region(sf::RenderWindow& where, Region& region) {
} }
void undo_clip(sf::RenderTarget& where) { void undo_clip(sf::RenderTarget& where) {
if(dynamic_cast<sf::RenderTexture*>(&where) != nullptr){
sf::RenderTexture* p = dynamic_cast<sf::RenderTexture*>(&where);
store_clip_rects.erase(p);
}
setActiveRenderTarget(where); setActiveRenderTarget(where);
glDisable(GL_SCISSOR_TEST); glDisable(GL_SCISSOR_TEST);
glDisable(GL_STENCIL_TEST); glDisable(GL_STENCIL_TEST);

View File

@@ -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. // I don't know of a better way to do this than using pointers as keys.
extern std::map<sf::RenderTexture*,std::vector<sf::Text>> store_scale_aware_text; extern std::map<sf::RenderTexture*,std::vector<sf::Text>> store_scale_aware_text;
extern std::map<sf::RenderTexture*,rectangle> store_clip_rects;
void clear_scale_aware_text(sf::RenderTexture& texture) { void clear_scale_aware_text(sf::RenderTexture& texture) {
store_scale_aware_text.erase(&texture); store_scale_aware_text.erase(&texture);