4.8 KiB
4.8 KiB
Title
Packaged sprimo-tauri sprite rendering breaks after pack switch; default switch errors and
scaling stops applying.
Severity
P1
Environment
- OS: Windows
- App version/build: packaged release (
sprimo-tauri.exe) - Renderer/backend details: Tauri main overlay + settings pop-out
- Evidence screenshots:
issues/screenshots/issue4.pngissues/screenshots/issue4-b.pngissues/screenshots/issue4-c.png
Summary
In packaged runtime, sprite display is incorrectly split/tiled, switching to default can fail,
and scaling becomes ineffective after the error.
Reproduction Steps
- Run packaged
sprimo-tauri.exefrom ZIP extract. - Open settings window.
- Switch character between
ferrisanddefault. - Observe main overlay rendering and debug output.
- Change scale slider.
Expected Result
- Sprite sheet is split into the correct frame grid regardless of image resolution.
- Pack switching works for both
ferrisanddefault. - Scale changes continue to apply after pack changes.
Actual Result
- Main overlay shows incorrectly split/tiled sprite sheet.
- Pack switch can produce runtime error and break subsequent behavior.
- Scale update stops working reliably after the error.
Root Cause Analysis
- Existing splitting logic relied on fixed pixel frame metadata that did not generalize to
packaged
sprite.pngdimension variants. - Pack metadata inconsistency:
assets/sprite-packs/ferris/manifest.jsonused duplicatedid(default), causing pack identity ambiguity.
- Settings/runtime flow then entered an unstable state after pack switch failures.
- Renderer reload lifecycle in tauri UI was unsafe:
PixiPetRenderer::disposeperformed duplicate teardown (ticker.destroy+app.destroy), which could trigger runtimeTypeErrorduring pack reload.- Renderer replacement disposed previous renderer before new renderer creation succeeded, leaving the view in a broken/cropped state on creation failures.
- Chroma-key conversion tolerance removed most
#FF00FFbackground but still left magenta fringe on anti-aliased edges.
Fix Plan
- Introduce generic splitter policy for
sprite.png:
- fixed topology:
8columns x7rows - derive frame size from actual image dimensions
- keep chroma-key background handling (
#FF00FF) in renderer
- Validate animation frame indices against fixed frame count (
56) forsprite.png. - Ensure pack apply path validates atlas geometry before committing
SetSpritePack. - Fix ferris manifest ID uniqueness.
Implementation Notes
Implemented:
crates/sprimo-tauri/src/main.rs
- Added
sprite.png-specific frame derivation (8x7) from PNG dimensions. - Added PNG header dimension decoding utility.
- Added animation frame index validation against fixed
56frames forsprite.png. - Applied validation in both
load_active_sprite_packandset_sprite_pack.
assets/sprite-packs/ferris/manifest.json
- Changed manifest
idfromdefaulttoferris.
docs/SPRITE_PACK_SCHEMA.md
- Documented Tauri
sprite.pngoverride behavior and 8x7 derived frame policy.
frontend/tauri-ui/src/renderer/pixi_pet.ts
- Made renderer disposal idempotent and removed duplicate ticker destruction.
- Delayed DOM canvas replacement until atlas load succeeds.
- Improved chroma-key edge handling with soft alpha + magenta spill suppression.
frontend/tauri-ui/src/main.tsx
- Made pack reload transactional (keep old renderer until new renderer creation succeeds).
- Improved fit-window flow so scale apply continues after reload retries.
- Added targeted diagnostics for reload failures.
Verification
Commands Run
just build-release-taurijust package-win-taurijust smoke-win-tauricargo check -p sprimo-tauri
Visual Checklist
- Before screenshot(s):
issues/screenshots/issue4.png - Before screenshot(s):
issues/screenshots/issue4-b.png - Before screenshot(s):
issues/screenshots/issue4-c.png - After screenshot(s):
issues/screenshots/issue4-after-YYYYMMDD-HHMMSS.png
Result
- Status:
Fix Implemented - Notes: packaged runtime validation and after screenshots for this round are pending.
Status History
2026-02-14 00:00- reporter -Reported- packaged runtime failure screenshots attached.2026-02-14 00:00- codex -Triaged- localized to sprite splitting/pack identity behavior.2026-02-14 00:00- codex -Fix Implemented- applied 8x7 generic splitter policy and pack-ID correction.2026-02-14 00:00- reporter -In Progress- reportedissue4-after-fix1still failing in packaged runtime.2026-02-14 00:00- codex -Fix Implemented- hardened renderer reload/dispose and chroma-key edge cleanup.
Closure
- Current Status:
Fix Implemented - Close Date:
- Owner:
- Linked PR/commit: