Texture display bounds for non-uniform sprite content #235

Open
opened 2026-02-02 16:22:22 +00:00 by john · 0 comments
Owner

Summary

Support textures where the actual sprite content doesn't fill the entire cell, allowing centered or offset sprites within larger texture cells.

Parent issue: #233

Use Case

A 32×32 texture atlas where each cell contains a centered 16×24 sprite with transparent padding. The texture stores sprites in a uniform grid, but the actual content is smaller and offset.

Current Behavior

// src/PyTexture.cpp:59-61
auto ir = sf::IntRect(tx * sprite_width, ty * sprite_height, sprite_width, sprite_height);
auto sprite = sf::Sprite(texture, ir);

The entire cell is used; no concept of "display bounds" vs "cell bounds".

Proposed Changes

  1. Extend PyTexture constructor:

    # Current
    tex = mcrfpy.Texture("sprites.png", 32, 32)
    
    # Proposed (optional parameters)
    tex = mcrfpy.Texture("sprites.png", 32, 32, 
                         display_size=(16, 24),
                         display_origin=(8, 4))  # Offset within cell
    
  2. Add to PyTexture class:

    int display_width = -1;   // -1 = same as sprite_width
    int display_height = -1;
    int display_origin_x = 0; // Offset from cell top-left
    int display_origin_y = 0;
    
  3. Modify sprite creation:

    sf::Sprite PyTexture::sprite(int index, ...) {
        // Create sprite as before...
        if (display_origin_x != 0 || display_origin_y != 0) {
            sprite.setOrigin(-display_origin_x, -display_origin_y);
        }
        return sprite;
    }
    

Performance Impact

None - conditional origin set in existing code path.

Files Affected

  • src/PyTexture.h - Add display bounds properties
  • src/PyTexture.cpp - Modify constructor and sprite() method
## Summary Support textures where the actual sprite content doesn't fill the entire cell, allowing centered or offset sprites within larger texture cells. **Parent issue**: #233 ## Use Case A 32×32 texture atlas where each cell contains a centered 16×24 sprite with transparent padding. The texture stores sprites in a uniform grid, but the actual content is smaller and offset. ## Current Behavior ```cpp // src/PyTexture.cpp:59-61 auto ir = sf::IntRect(tx * sprite_width, ty * sprite_height, sprite_width, sprite_height); auto sprite = sf::Sprite(texture, ir); ``` The entire cell is used; no concept of "display bounds" vs "cell bounds". ## Proposed Changes 1. **Extend PyTexture constructor**: ```python # Current tex = mcrfpy.Texture("sprites.png", 32, 32) # Proposed (optional parameters) tex = mcrfpy.Texture("sprites.png", 32, 32, display_size=(16, 24), display_origin=(8, 4)) # Offset within cell ``` 2. **Add to PyTexture class**: ```cpp int display_width = -1; // -1 = same as sprite_width int display_height = -1; int display_origin_x = 0; // Offset from cell top-left int display_origin_y = 0; ``` 3. **Modify sprite creation**: ```cpp sf::Sprite PyTexture::sprite(int index, ...) { // Create sprite as before... if (display_origin_x != 0 || display_origin_y != 0) { sprite.setOrigin(-display_origin_x, -display_origin_y); } return sprite; } ``` ## Performance Impact None - conditional origin set in existing code path. ## Files Affected - `src/PyTexture.h` - Add display bounds properties - `src/PyTexture.cpp` - Modify constructor and sprite() method
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.

Reference
john/McRogueFace#235
No description provided.