[Bugfix] UIFrame: RenderTexture not disabled when clip_children toggled off #224

Closed
opened 2026-01-22 15:48:55 +00:00 by john · 0 comments
Owner

Summary

When clip_children is set to False after being True, the RenderTexture is never disabled. The use_render_texture flag and render_sprite remain in their previous state, causing stale rendering artifacts.

Root Cause

In UIFrame.cpp set_clip_children() (lines 386-400):

int UIFrame::set_clip_children(PyUIFrameObject* self, PyObject* value, void* closure)
{
    // ...
    if (new_clip != self->data->clip_children) {
        self->data->clip_children = new_clip;
        self->data->markDirty();  // ← Only marks dirty, never disables texture
    }
    return 0;
}

Problem

  • use_render_texture remains true from previous enable
  • render_sprite holds stale texture reference
  • render_texture memory is not freed

Proposed Fix

Add a disableRenderTexture() method to UIDrawable:

void UIDrawable::disableRenderTexture() {
    if (!use_render_texture) return;
    
    render_texture.reset();
    render_sprite = sf::Sprite();  // Clear stale reference
    use_render_texture = false;
    render_dirty = true;
}

Then in set_clip_children:

if (new_clip != self->data->clip_children) {
    self->data->clip_children = new_clip;
    if (!new_clip && !self->data->cache_subtree) {
        self->data->disableRenderTexture();
    }
    self->data->markDirty();
}

Note: Must check cache_subtree since that also uses the RenderTexture.

## Summary When `clip_children` is set to `False` after being `True`, the RenderTexture is never disabled. The `use_render_texture` flag and `render_sprite` remain in their previous state, causing stale rendering artifacts. ## Root Cause In `UIFrame.cpp` `set_clip_children()` (lines 386-400): ```cpp int UIFrame::set_clip_children(PyUIFrameObject* self, PyObject* value, void* closure) { // ... if (new_clip != self->data->clip_children) { self->data->clip_children = new_clip; self->data->markDirty(); // ← Only marks dirty, never disables texture } return 0; } ``` ## Problem - `use_render_texture` remains `true` from previous enable - `render_sprite` holds stale texture reference - `render_texture` memory is not freed ## Proposed Fix Add a `disableRenderTexture()` method to `UIDrawable`: ```cpp void UIDrawable::disableRenderTexture() { if (!use_render_texture) return; render_texture.reset(); render_sprite = sf::Sprite(); // Clear stale reference use_render_texture = false; render_dirty = true; } ``` Then in `set_clip_children`: ```cpp if (new_clip != self->data->clip_children) { self->data->clip_children = new_clip; if (!new_clip && !self->data->cache_subtree) { self->data->disableRenderTexture(); } self->data->markDirty(); } ``` Note: Must check `cache_subtree` since that also uses the RenderTexture.
john closed this issue 2026-01-23 03:56:05 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
john/McRogueFace#224
No description provided.