- Refactor right-click command execution for asset/folder extraction
- Track successful and failed exports
- Add drag-and-drop support for game directory and mappings setup
- WwiseProvider update for FDeferredByteData
- Improve audio conversion handling
- Don't open audio player during json export
- Don't link to directory that might not exist (would take us to desktop)
- Show real amount of exported assets
When double-clicking a UseCachedPose node to jump to the SaveCachedPose
node's tab, the view now centers on the target node. Added CenterOnNode
helper that adjusts TranslateTransform to place the node at the viewport
center while preserving the current zoom level.
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
When sequential Save/Use dependencies exist (e.g., UseCachedPose(A)->
SaveCachedPose(B)->UseCachedPose(B)->SaveCachedPose(C)), the stale
BuildLayerLookups built once before the loop caused FindOwnerRootLayer
to miss consumers assigned during earlier iterations.
The fix iteratively processes SaveCachedPose nodes: each pass rebuilds
lookups and resolves nodes whose consumers are already placed, deferring
nodes with unresolved consumers. A maxPasses guard prevents infinite loops.
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
Instead of always placing SaveCachedPose in the primary (first) _Root
layer, trace downstream UseCachedPose consumers through the state
machine hierarchy (BelongsToStateMachine → StateMachineName) to find
the correct ancestor animation blueprint layer.
For example, a SaveCachedPose used by UseCachedPose in
AnimGraph > BaseLayer > LocomotionStates > IdleState is now correctly
placed in BaseLayer (the _Root layer containing LocomotionStates)
instead of AnimGraph.
- Add FindOwnerRootLayer: traces SaveCachedPose downstream consumers
to find the correct _Root layer
- Add GetAncestorRootLayer: walks up the layer hierarchy via
BelongsToStateMachine → StateMachineName chain
- Add BuildLayerLookups/LayerLookups: pre-computed lookup maps for
efficient multi-node queries
- Update EnforceSaveCachedPoseInRootLayers to use smart layer detection
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
- Revert Pass 1 exclusion so SaveCachedPose is naturally collected into
the correct _Root layer when reachable via BFS
- Add EnforceSaveCachedPoseInAnimBlueprintLayer as a final post-processing
step that scans all non-_Root layers (state sub-graphs and fallback
layers) and moves any stray SaveCachedPose nodes to the primary _Root
layer
- Extract RebuildLayerConnections helper for DRY connection rebuilding
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
- Tab headers for dynamically-opened sub-graphs now include a close
button (×). The initial AnimGraph tab is not closable.
- TabControl uses a custom template with horizontal ScrollViewer to
keep all tabs in a single line instead of wrapping.
- Long tab names are truncated with ellipsis (MaxWidth=200).
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
PrefixStateMachineLayerNames and BuildStateMachineOverviewLayers only
scanned vm.Layers for StateMachine nodes, missing nested SM nodes in
vm.StateSubGraphs. This caused overview layers for nested SMs to be
named incorrectly (e.g. "AnimGraph > NestedSM" instead of
"AnimGraph > OuterSM > StateName > NestedSM"), so double-click from
a state sub-graph could not find the matching overview layer.
Fix: iteratively discover nested SM nodes in state sub-graphs and
also scan StateSubGraphs in BuildStateMachineOverviewLayers.
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
The perpendicular vector was being computed per-connection from its own
direction. For B→A connections the perp flipped vs A→B, and when multiplied
by the negative perpSide the offsets cancelled out — both lines landed on
the same position.
Now a stable perpendicular is computed once from the canonical pair direction
(nodeA→nodeB centers) and passed to DrawConnectionLine, so perpSide=+1/-1
correctly separates them to opposite sides.
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>