Input
Loads a complete Spine project (.json, .atlas, .png) and prepares it for the processing pipeline.
Purpose: This is the mandatory starting point for any graph. It validates the project files and outputs multiple data streams for processing.
Outputs:
- **payload**: Structured representation of animation data, optimized for processing by other nodes.
- **atlas_project**: Data related to the texture atlas, for use with unpacker and repacker nodes.
- **original_json**: Original, unmodified JSON data for reference or comparison.
Socket keys: payload, atlas_project, original_json
Output
Final node in the graph that exports optimized data and prepares it for download.
Purpose: Gathers all optimization results and generates the final Spine project files.
Inputs:
- **payload**: Optimized payload
- **original_json**: Original JSON passthrough for reference
- **atlas_project**: Optional atlas project (e.g., repacked)
Outputs:
- **reconstructed_json_out**: Rebuilt Spine JSON
- **original_json_passthrough_out**: Original JSON passthrough
- **payload_out**: Payload passthrough for chaining
- **changes**: Collected optimization changes
- **atlas_assets**: Atlas assets for export
Socket keys: payload, original_json, atlas_project, reconstructed_json_out, original_json_passthrough_out, payload_out, changes, atlas_assets
RDP
Simplifies animation curves using the Ramer-Douglas-Peucker (RDP) algorithm.
Purpose: Reduces the number of keyframes in linear or near-linear animation segments by removing points that lie on a straight line between two others.
Socket keys: payload_in, payload_out, changes
Spline
Fits smooth spline curves to animation keyframes, reducing unnecessary intermediate points.
Purpose: Smooth curve fitting while maintaining visual quality.
Socket keys: payload_in, payload_out, changes
Refit
Approximates dense keyframe sequences with fewer Bezier curves to reduce size.
Purpose: Fits fewer curves while staying within a tolerance.
Socket keys: payload_in, payload_out, changes
Quantizer
Reduces precision of numeric values in keyframes and curves.
Purpose: Simple but effective way to reduce file size by rounding numbers to a specified number of decimal places.
Usage: Can be applied to almost any animation data. Becomes more effective with higher keyframe counts.
Caution: Too aggressive quantization (low precision) can cause jitter or visual artifacts in animations.
Socket keys: payload_in, payload_out, changes
Cleanup
Performs various cleanup tasks to remove redundant or unnecessary animation data.
Purpose: Specialized tool for removing specific types of redundant data that other optimizers might miss.
Usage: Connect your payload to 'payload_in' and take the result from 'payload_out'. If you want a per-change report, also use 'changes'.
Socket keys:
- Inputs: payload_in
- Outputs: payload_out, changes
Currently supported cleanups:
1. **Remove Unused Color/Alpha Tracks**: Removes color/alpha timelines for slots that are never visible during the animation.
2. **Remove Redundant IK Rotations**: Removes rotation keyframes from bones that are fully controlled by an IK constraint with 100% mix.
3. **Remove Path Constraint Keys**: Removes rotate/translate keyframes from bones fully controlled by a path constraint (mix values at 100%).
4. **Sanitize Non-English Characters**: Replaces non-English characters in names/identifiers to avoid issues in downstream tools.
Scale
Scales all numeric values in animation keyframes by a specified factor.
Purpose: Uniformly scales animation data, useful for resizing skeleton proportionally or adjusting animation intensity.
Usage: Connect **payload_in** and take the result from **payload_out**.
Socket keys: payload_in, payload_out
Schneider
Fits smooth Bezier curves to animation keyframes using the Schneider curve fitting algorithm.
Purpose: Advanced curve fitting that produces natural-looking Bezier curves from dense keyframe sequences.
Availability: **Plus-only node**.
How it works: The Schneider algorithm analyzes keyframe positions and tangents to generate optimal Bezier control points that closely match the original motion.
Parameters:
- **Error Tolerance**: Maximum allowed deviation from original keyframes. Lower = more accurate, higher = smoother curves.
- **Corner Angle**: Threshold angle (degrees) at which to split curve into segments.
Best for:
- Hand-drawn or imported animations with many keyframes
- Converting linear interpolation to smooth Bezier curves
- Reducing keyframe count while maintaining curve quality
Note: More computationally intensive than simpler algorithms like RDP, but produces superior curve quality.
Socket keys: payload_in, payload_out, changes
Physics Constraint Bake
Bakes Spine PhysicsConstraint motion into bone rotate/translate keyframes and removes physics timelines.
Purpose: Converts runtime physics simulation into explicit keyframes so animations are deterministic and editable without physics constraints. After bake, physics constraints and physics timelines are removed from the payload.
Availability: **Plus-only node**.
Inputs/Outputs:
- **payload_in** β **payload_out** (baked)
- **changes** (optional change list)
Controls:
- **Sample FPS**: Simulation sampling rate for the bake.
- **Bake Rotation**: Write baked rotation keys.
- **Bake Translation**: Write baked translation keys.
- **Bake Translation (Children)**: Apply translate bake to child bones that rely on physics motion.
Notes:
- Requires original Spine JSON to reconstruct simulation data.
- Use when you want to remove physics constraints but keep the motion.
Attachment Visibility
Optimizes rendering by setting a slot's attachment to null when its alpha is zero.
Purpose: Prevents the game engine from having to process or render invisible attachments.
Usage: Processes **payload_in**, outputs optimized **payload_out**, and optionally reports **changes**.
Socket keys: payload_in, payload_out, changes
Payload Merger
Merges multiple processed animation payloads back into a single unified payload.
Purpose: Essential for parallel processing pipelines where different animations or bone groups are optimized separately and need to be recombined.
Inputs:
- **base**: Master payload (skeleton structure)
- **overrides**: One or more payloads whose tracks replace base tracks
Output:
- **merged_out**: Merged payload
Socket keys: base, overrides, merged_out
Animation Viewer
Visual tool for inspecting and comparing animation curves before and after optimization.
Purpose: Provides graphical representation of keyframes and curves for selected track.
Usage: Connect **before_in** and **after_in** to overlay original vs optimized. Optionally connect **changes** to highlight impacted tracks.
Socket keys: before_in, after_in, changes
Animation Filter
Filters animation tracks based on animation name (e.g., 'run', 'idle').
Purpose: Useful for applying different optimization strategies to different animations.
Usage: Filters **payload_in** into **payload_out** and exposes **animation_list** for UI selection.
Socket keys: payload_in, payload_out, animation_list
Asset Filter
Filters atlas assets by name, works in two modes: before unpacker (filters atlas text) or after unpacker (filters sprites).
Purpose: Controls which assets are included in the workflow - either which assets to unpack from atlas, or which unpacked sprites to include in repacking.
Inputs/Outputs:
- Atlas mode: **atlas_in** β **atlas_out**
- Sprites mode: **sprites_in** β **sprites_out**
Socket keys: atlas_in, atlas_out, sprites_in, sprites_out
Bone Filter
Filters bone animation tracks based on bone name.
Purpose: Allows targeting or excluding specific bones from the optimization process.
Usage: Filters **payload_in** into **payload_out**.
Socket keys: payload_in, payload_out
Skin Filter
Filters animation and asset data based on skin names.
Purpose: Process only specific skins from a multi-skin Spine project.
Usage: Filters **payload_in** into **payload_out**.
Socket keys: payload_in, payload_out
Slot Filter
Filters slot animation tracks based on slot name.
Purpose: Useful for targeting or excluding specific slots that may have special timing or visibility requirements.
Usage: Filters **payload_in** into **payload_out**.
Socket keys: payload_in, payload_out
Parameter Filter
Filters animation tracks based on their property type (e.g., rotation, scale, color).
Purpose: Allows applying subsequent optimizations only to specific types of animation data.
Usage: Filters **payload_in** into **payload_out**.
Socket keys: payload_in, payload_out
Atlas Unpacker
Extracts individual sprites from a Spine texture atlas.
Purpose: Breaks down an atlas file into its component sprites, allowing for individual analysis or repacking.
Usage: Connect **atlas_project** from InputNode to **atlas_project** (or the legacy **atlas_project_in**) on this node. Optionally connect **skeleton_json_in** (from InputNode's **original_json**) to enable mesh-aware cropping (trims sprites to mesh hull bounds instead of rectangular bounds, which can significantly reduce texture memory for mesh attachments).
Outputs:
- **sprites_out**: Standardized sprites array (for viewer/repacker)
- **sprites_data_out**: Extracted sprite images/metadata (structured bundle)
- **atlas_out**: Atlas project passthrough
Socket keys: atlas_project, atlas_project_in, skeleton_json_in, sprites_out, sprites_data_out, atlas_out
Atlas Repacker
Repacks individual sprites into one or more new, optimized texture atlases.
Purpose: Optimizes texture memory and potentially reduces draw calls by creating efficient sprite sheets.
Usage: Accepts sprites either via **sprites_data_in** (structured sprites bundle) or via **sprites_out** (standardized sprites array). If needed for alpha handling / polygon packing, provide the original skeleton via **original_json**. Outputs a packed atlas as **atlas_out**.
Socket keys: sprites_data_in, sprites_out, original_json, atlas_out
Atlas Viewer
Lightweight atlas visualization and analysis tool for inspecting atlas structure before unpacking.
Purpose: Provides a fast way to preview atlas pages and regions without performing the heavy unpacking operation. Helps validate atlas structure and identify unused regions.
Usage: Connect an atlas project to **atlas_project** (or legacy **atlas_in** / **atlas**). Optionally connect skeleton JSON to **json** for usage analysis.
Socket keys: atlas_project, atlas_in, atlas, json
Atlas Merger
Combines multiple atlas sources into a single unified atlas.
Purpose: Merge multiple atlas projects into one.
Input:
- **atlas_inputs**: Multi-input array of atlas projects
Outputs:
- **atlas_out**: Merged atlas project
- **merged_out**: Legacy merged output
- **merged_atlas_out**: Legacy merged output
Socket keys: atlas_inputs, atlas_out, merged_out, merged_atlas_out
Asset Viewer
Displays individual sprites from an unpacked atlas.
Purpose: Visual debugging tool for atlas manipulation.
Usage: Accepts sprites via **sprites_out** (standard) or legacy **sprites_in** / **sprites_data**.
Socket keys: sprites_out, sprites_in, sprites_data