This is the Godot Player roadmap for SSPlayerForGodot. It tracks the Godot-specific implementation tasks for capabilities exposed by the Rust runtime/converter (SpriteStudio-SDK/ROADMAP.md).
Most items selectively bring worthwhile capabilities from the legacy SS6 players into this SS7-based Godot player — reimagined for SS7 and Godot's architecture, not ported verbatim.
SSPlayerForGodot leverages Godot's CanvasItem API and Node2D paradigms. Features should be designed to fit Godot's idioms naturally:
- Use Godot's built-in systems: Rely on
CanvasItem::set_modulate()and tree inheritance rather than recreating hierarchical color systems. Use Godot's process modes andEngine::get_time_scale()instead of custom delta management where possible. - Avoid node bloat: Keep the core playback in
SsInternalPlayerrendering directly viaRenderingServer/CanvasItemdraw calls. Only expose child Nodes (likeSpriteStudioPartAttachment2D) when the user explicitly needs them. - Naming and Style: Use Godot's GDScript conventions for the public API (
snake_casemethods, proper property hints, Godot Signals for callbacks).
- ☐ Ready — Player-only, no SDK dependency; can start now
- ⛔ Blocked on SDK — needs an
SpriteStudio-SDK/ROADMAP.mdphase first - 🕒 Deferred ("あとで") — intentionally postponed; detailed here so it can be picked up later
- Goal: Play a named label range, start-offset, and play by animation index.
- Key fact: Labels are already available in the
.ssabFlatBuffers payload (AnimationData.Labels). No runtime/SDK change is needed. - Steps:
SsInternalPlayer: Addbool try_resolve_label_frame(const String& name, float& r_frame)to iterate and match the label name.SpriteStudioPlayer2D: Addbool play_range(const String& start_label, int start_offset, const String& end_label, int end_offset)which seeks the start frame, sets the section, and starts playback.SpriteStudioPlayer2D: Addbool play_by_index(int index)to resolveindexto a name and callplay().
- Done when: A sample project triggers label-based playback via GDScript and stays within the loop range.
- Goal: Allow fine-grained control over playback updates from GDScript (e.g. for custom pause-groups, slow-mo, or custom stepping).
- Steps:
- Add a generic
advance(float delta)method toSpriteStudioPlayer2Dand anANIMATION_PROCESS_MANUALtoAnimationProcessMode. - When set to
MANUAL, the node skips its internal_notificationdelta update and relies entirely on the user callingadvance().
- Add a generic
- Note on Hierarchical Color: SS6's
AdditionalColoris natively covered by Godot'sCanvasItem::set_modulate()andself_modulate. No custom work is needed here unless per-vertex multiplier logic specifically requires it. - Done when: A script manually steps the animation in
_processand playback correctly evaluates at the custom delta.
- Blocked on:
SpriteStudio-SDK/ROADMAP.mdPhase 2 Override Layer API. - Goal: Override color, cell reference, and visibility of specific parts programmatically.
- Steps (after SDK FFI exists):
- Wrap the new FFI in
SsInternalPlayer(usingresolve_part_index). - Expose
set_part_color_override(part_name, color, blend_op),set_part_cell_override(part_name, map_name, cell_name), etc. to GDScript.
- Wrap the new FFI in
- Done when: A GDScript changes a part's color or swaps its cell at runtime.
- Goal: Replace a part's
ShaderMaterialat runtime. - Status: Currently
_partcolor_materialsassigns internal shaders. Investigate if users need the ability to inject custom GodotShaderMaterialinstances per-part for custom visual effects.
- Goal: Play
.ssqeplaylists. - Status: The loader
SSQBResourceis implemented, but there is no node to execute it yet. - Blocked on: SDK Phase 3 State machine → Sequence playback.
- Task: Once the SDK implements sequence/state-machine advancing, create a
SpriteStudioSequence2Dnode (or expandSpriteStudioPlayer2D) to utilize the SSQB resource and surface step callbacks to Godot signals.
- Goal: Per-part collision shapes with callbacks.
- Status: In Godot, users can already use
SpriteStudioPartAttachment2Dand parent aCollisionShape2DorArea2Dto it. This naturally delegates collision to Godot's physics engine. - Task: Evaluate if an auto-sizing
SpriteStudioPartCollider2D(which reads the part's vertex bounds and updates a BoxCollider/PolygonCollider) is genuinely necessary, or if manual setup on attachments suffices.
- Goal: Draw many instances of the same animation efficiently.
- Blocked on: SDK Phase 3 Instance Lifecycle → Animation Instancing (Shared evaluation context).
- Task: Once
ssruntimesupports computingFrameDataonce and rendering it N times, create a node (e.g.SpriteStudioReplicate2D) that binds to an original player's context and simply submits the evaluated batches with a different rootTransform2D, saving Godot CPU time.
- Goal: Blend multiple animations or crossfade between them.
- Blocked on: SDK Phase 3 Animation Mixing/Blending and State machine implementation.
- Task: Surface the blending/crossfade FFI capabilities to
SpriteStudioPlayer2D, allowing users to smoothly transition between animations or manage layered blending.
- Goal: Replace the animation mounted on an Instance part at runtime (e.g., for equipment or character variations).
- Blocked on: SDK Phase 3 Instance Lifecycle → Dynamic instance swap.
- Task: Expose an API on
SpriteStudioPlayer2Dto swap an instance part's targeted animation pack/name dynamically using the SDK's shared SSAB registry.