Commit Graph

1705 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
e91dbffdd2 Add double-click navigation from UseCachedPose to SaveCachedPose node
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-05 03:24:44 +00:00
copilot-swe-agent[bot]
fd99fc2cc3 Add clarifying comment for null primaryGraphLayer fallback case
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-05 03:12:01 +00:00
copilot-swe-agent[bot]
4358ae1663 Move SaveCachedPose nodes and their input chains to the outer AnimGraph layer
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-05 03:09:13 +00:00
copilot-swe-agent[bot]
2b83e97585 Refactor IsCachedPoseConnection to extract NodeMatchesType helper
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-05 02:35:28 +00:00
copilot-swe-agent[bot]
d6efa832c4 Skip drawing connection lines between SaveCachedPose and UseCachedPose nodes
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-05 02:34:46 +00:00
copilot-swe-agent[bot]
5998953bfe Add closable tabs and single-line tab strip layout
- 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>
2026-03-05 02:14:42 +00:00
copilot-swe-agent[bot]
7e0e897a91 Fix nested state machine double-click navigation
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>
2026-03-05 01:27:21 +00:00
copilot-swe-agent[bot]
f346803d46 Fix bidirectional transition separation: use canonical pair perpendicular vector
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>
2026-03-05 01:09:42 +00:00
copilot-swe-agent[bot]
335be6217d Only separate different-direction transitions; same-direction share one line with circles offset along it
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-04 09:47:46 +00:00
copilot-swe-agent[bot]
cb4d6ac912 Extract TransitionCircleGap constant for circle spacing
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-04 09:23:14 +00:00
copilot-swe-agent[bot]
7d93810623 Fix transition layout: different directions on opposite sides, same-direction circles spread perpendicular
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-04 09:22:23 +00:00
copilot-swe-agent[bot]
30bef7fdf2 Fix transition layout: opposite sides for different directions, offset circles for same direction
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-04 08:32:35 +00:00
copilot-swe-agent[bot]
8dd66a1f35 Add transition midpoint circles for multi-transition selection
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-04 05:48:53 +00:00
copilot-swe-agent[bot]
5aa4b60d2e Add edge-to-edge transition arrows with selection and properties display
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-04 04:45:00 +00:00
copilot-swe-agent[bot]
c2ea844f0c Fix StateRootNodeIndex mapping: use (Count - 1 - index) for reverse ChildProperties order
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-04 03:33:25 +00:00
copilot-swe-agent[bot]
e3030cb0a0 Address code review: document rootNodePropName param, use discard for unused key
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-03 14:05:28 +00:00
copilot-swe-agent[bot]
4fab6d9747 Separate graph layers and state machine state sub-graphs into distinct containers
- Add StateSubGraphs dictionary to AnimGraphViewModel keyed by root node property name
- BuildLayers Pass 2 now stores _StateResult sub-graphs in StateSubGraphs via AddStateSubGraph
- PrefixStateMachineLayerNames iterates StateSubGraphs instead of Layers for renaming
- BuildStateMachineOverviewLayers no longer removes from Layers (sub-graphs are separate)
- AnimGraphViewer uses StateSubGraphs.TryGetValue for direct dictionary lookup by node index

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-03 14:04:50 +00:00
copilot-swe-agent[bot]
c37dc30133 Fix CS0136 compilation error: rename inner targetLayer to stateLayer to avoid scope conflict
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-03 13:52:03 +00:00
copilot-swe-agent[bot]
6620463154 Separate _Root and _StateResult into independent passes in BuildLayers
Split BuildLayers into two distinct passes:
- Pass 1: AnimGraphNode_Root nodes → graph layers
- Pass 2: AnimGraphNode_StateResult nodes → state sub-graphs

Previously these were incorrectly mixed in a single loop. Each type
defines a fundamentally different concept in UE and must be processed
independently. Extracted CollectUpstream helper to share BFS logic.

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-03 13:35:18 +00:00
copilot-swe-agent[bot]
7b6f9aac79 Rewrite BuildLayers to use root-node-based layer grouping
Instead of using connected components (undirected BFS), BuildLayers now
groups nodes by their defining root nodes. Each AnimGraphNode_Root defines
an animation blueprint layer and each AnimGraphNode_StateResult defines a
state machine state sub-graph. For each root, we trace upstream through
directed connections to collect all nodes that feed into it.

Remaining unassigned nodes fall back to connected-component grouping.
Extracted AddLayer helper to reduce duplication.

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-03 13:05:43 +00:00
copilot-swe-agent[bot]
b29f93fbf3 Separate layer and state sub-graph identification in BuildLayers
GetLayerName now distinguishes animation blueprint layers (_Root nodes,
found by Name property) from state machine state sub-graphs (_StateResult
nodes, found by unique property name from StateRootNodeIndex). This avoids
duplicate name collisions when multiple states share the same display name.

PrefixStateMachineLayerNames resolves the _StateResult node's Name
additional property for the display portion of path-prefixed names.

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-03 12:51:03 +00:00
copilot-swe-agent[bot]
5b4cb7e4ee Use StateRootNodeIndex for per-state sub-graph lookup instead of name matching
- StateMachineMetadata: store root node property names per state via StateRootPropNames
- AssociateStateMachineNames: capture root prop name from StateRootNodeIndex
- BuildStateMachineOverviewLayers: store StateRootNodeName on overview state nodes
- TryOpenSubGraph: find per-state layer by root node reference, not name path

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-03 12:35:43 +00:00
copilot-swe-agent[bot]
2711be76e0 Add double-click state node to open per-state sub-graph tab
- GetLayerName: also match _StateResult nodes for per-state layer naming
- PrefixStateMachineLayerNames: per-state layers get 3-level path prefix
  (e.g., "AnimGraph > Locomotion > Idle")
- TryOpenSubGraph: state nodes navigate to per-state sub-graph layer

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-03 12:15:40 +00:00
copilot-swe-agent[bot]
22ba7668eb Add state machine overview layers with Entry, State nodes, and Transition connections
Parse States and Transitions from BakedStateMachines to build state-level
overview layers for each state machine. Each overview shows:
- Entry node (filled circle) connecting to the initial state
- State nodes (rounded rectangles) with their names
- Directional transition arrows between states

The overview layer replaces the old internal per-state layer and is opened
via double-click on StateMachine nodes in the parent graph.

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-03 10:17:04 +00:00
copilot-swe-agent[bot]
58a0a50ac5 Add path prefix to StateMachine sub-graph tab names to avoid collisions
StateMachine internal layer tabs are now named with a parent path
(e.g., "AnimGraph > Locomotion") to avoid collisions when a state
machine shares a name with a LinkedAnimLayer layer.

PrefixStateMachineLayerNames runs after BuildLayers to find each SM
node's parent layer and prepend its name. TryOpenSubGraph constructs
the same path for lookup. The path separator is a shared constant.

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-03 09:39:51 +00:00
copilot-swe-agent[bot]
08a9253f4e Add StateMachine double-click to open sub-graph tab
Read BakedStateMachines from the animation blueprint class to extract
machine names. Associate FAnimNode_StateMachine nodes with their machine
name via StateMachineIndexInClass, and mark internal state root nodes
with BelongsToStateMachine for correct layer naming.

Extend TryOpenSubGraph to handle both LinkedAnimLayer and StateMachine
node types for double-click tab navigation.

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-03 08:53:16 +00:00
copilot-swe-agent[bot]
1d2ef5905e Add LinkedAnimLayer double-click to open layer sub-graph tab
Generalized GetLayerName to use any Root node's "Name" property as the
layer name (not just "AnimGraph"), enabling proper naming for
LinkedAnimLayer sub-graphs.

Added double-click handling on nodes: double-clicking a LinkedAnimLayer
node finds the matching layer and opens/selects a tab for it.

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-03 08:08:23 +00:00
copilot-swe-agent[bot]
6516fab7a9 Fix lost connections for array-based pose links in animation graph
TryResolvePoseLink only handled direct struct properties (single
FPoseLink). Many animation nodes use arrays of pose links (e.g.,
BlendPose TArray<FPoseLink> in blend list nodes). Added handling for
UScriptArray to iterate array elements and resolve each as a pose link.

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-02 09:14:57 +00:00
copilot-swe-agent[bot]
fc71b8eea8 Fix ExtractNodeProperties to use GenericValue for clean property values
FPropertyTagType.ToString() returns "Value (TypeName)" format, including
extra type information. Using GenericValue?.ToString() returns just the
raw value, which fixes property value extraction and root node detection.

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-02 07:11:08 +00:00
copilot-swe-agent[bot]
84df34b4dc Fix output pose layer detection to use AdditionalProperties["Name"] instead of node.Name
The root node's meaningful identifier "AnimGraph" is stored in the
struct's "Name" property (AdditionalProperties["Name"]), not the
node's generated Name field (e.g. "AnimGraphNode_Root_0").

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-02 06:42:01 +00:00
copilot-swe-agent[bot]
c1962c77be Fix output pose layer detection to use AnimGraphNode_Root Name="AnimGraph"
The output pose layer is now correctly identified by finding the node
whose Name property is "AnimGraph" (stored on AnimGraphNode_Root),
instead of incorrectly matching any node with "Root" in ExportType.

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-02 06:31:15 +00:00
copilot-swe-agent[bot]
1ba3afb483 Show only final output pose layer initially in AnimGraph viewer
Only the AnimGraph layer (containing Root/Result nodes) is shown
when first opening the animation blueprint, instead of all layer tabs.

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-02 05:52:14 +00:00
copilot-swe-agent[bot]
652b7cfeaa Redesign animation nodes to match UE Animation Blueprint visual style
- Dark translucent node body with gradient title bar color-coded by type
- Proper pin circles (Ellipses) on node edges replacing text bullets
- Connection wires colored by source pin type with thicker strokes
- Subtle drop shadow behind each node
- Orange selection highlight matching UE's selection color
- Darker canvas background matching UE blueprint editor
- Extract named constants for pin label offset and gradient factor

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-02 03:49:37 +00:00
copilot-swe-agent[bot]
6a2ef86a3f Fix animation node UI: replace OriginalSource guard with drag-threshold panning
The previous fix (e.OriginalSource != sender) blocked panning entirely
when clicking on nodes, making them feel like buttons. Connection Path
elements also received mouse events, potentially interfering.

Fix:
- Use a drag-threshold mechanism: clicking selects a node without
  jumping, dragging from anywhere (including nodes) starts panning
  after a 5px threshold is exceeded.
- Register MouseLeftButtonDown with AddHandler(handledEventsToo: true)
  so the panning handler fires even when nodes set e.Handled = true.
- Set IsHitTestVisible = false on connection Path elements so they
  don't interfere with mouse events.
- Check e.LeftButton state in OnCanvasMouseMove to prevent stale pan
  state when the button is released unexpectedly.

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-02 03:25:29 +00:00
copilot-swe-agent[bot]
2c0f915a64 Fix clicking on animation nodes causing UI jumping
In WPF, MouseLeftButtonDown is a Direct routed event that fires
independently on each UIElement with a fresh Handled=false. Setting
e.Handled=true in the node's click handler does NOT prevent
OnCanvasMouseDown on the parent canvasBorder from firing. This caused
clicking a node to both select it AND start panning, making the graph
jump when the mouse moved.

Fix: check e.OriginalSource != sender in OnCanvasMouseDown so panning
only starts when clicking directly on the canvas background.

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-02 03:04:41 +00:00
copilot-swe-agent[bot]
3280bfeb25 Fix zoom jumping and improve connection line visibility
- Fix OnMouseWheel: get mouse position relative to parent Border (stable
  coords) instead of Canvas (transformed coords that shift during zoom);
  compute canvas-local point manually and preserve it after scale change
- Fix OnCanvasMouseDown/Move: use parent Border coords for consistent
  panning behavior
- Improve connection lines: thicker stroke (2px), higher opacity (0.8),
  minimum bezier tangent length (50px) for smoother short-distance curves

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-02 02:50:47 +00:00
copilot-swe-agent[bot]
e5eac1702b Address code review feedback: remove redundant assignments, extract constants
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-02 02:40:09 +00:00
copilot-swe-agent[bot]
ea5546b5cf Add layer tabs and properties panel to AnimGraph viewer
- AnimGraphViewModel: Add AnimGraphLayer class and BuildLayers() to group
  nodes into connected subgraphs displayed as separate tabs
- AnimGraphViewModel: Add topological layout (LayoutLayerNodes) so nodes
  flow left-to-right by dependency depth instead of grid
- AnimGraphViewer.xaml: Replace single canvas with TabControl for layers
  and a right-side properties panel with GridSplitter
- AnimGraphViewer.xaml.cs: Per-layer canvas state, node selection with
  property panel population, per-tab zoom/pan

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-02 02:35:34 +00:00
copilot-swe-agent[bot]
d80132b876 Address code review feedback: extract constants, improve self-connection check, fix comment
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-02 02:03:04 +00:00
copilot-swe-agent[bot]
788cc6d410 Fix animation blueprint node extraction to read from ChildProperties and CDO instead of exports
In cooked UE assets, UEdGraphNode objects are stripped as editor-only data
(PKG_FilterEditorOnly). The actual animation node information is stored in:
- UAnimBlueprintGeneratedClass.ChildProperties (FStructProperty entries describing node types)
- ClassDefaultObject properties (FStructFallback values with node data)
- FPoseLink/FComponentSpacePoseLink structs with LinkID for connections

Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-03-02 02:01:27 +00:00
copilot-swe-agent[bot]
b897cd4185 Remove unused imports and constants
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-02-28 10:11:10 +00:00
copilot-swe-agent[bot]
3a12c8bfc6 Address code review feedback: cleanup comment, remove empty method, improve null handling
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-02-28 10:06:53 +00:00
copilot-swe-agent[bot]
ba9bb323a3 Add animation blueprint graph viewer with node/connection extraction and visualization
Co-authored-by: LoogLong <86428208+LoogLong@users.noreply.github.com>
2026-02-28 10:05:39 +00:00
copilot-swe-agent[bot]
bd366ea12f Initial plan 2026-02-28 09:52:13 +00:00
Masusder
fd4eb0a418
Borderlands 3 audio (#649)
Some checks failed
FModel QA Builder / build (push) Has been cancelled
2026-02-25 16:24:43 +01:00
LongerWarrior
7fab3e2ead Titan Quest 2 update, Windrose support
Some checks failed
FModel QA Builder / build (push) Has been cancelled
2026-02-22 16:47:06 +02:00
LongerWarrior
83b5330d1e Fix issue with animation RateScale
Co-authored-by: Asval <asval.contactme@gmail.com>
2026-02-22 16:36:48 +02:00
Masusder
500fa59f85
Option for bulk audio conversion (#646)
Some checks failed
FModel QA Builder / build (push) Has been cancelled
2026-02-18 17:40:15 +01:00
LongerWarrior
1c48a27f8e InitOodle update, High on Life 2 and Borderlands 4 Audio support
Some checks failed
FModel QA Builder / build (push) Has been cancelled
2026-02-17 01:51:22 +02:00
Masusder
6b3a4ae785
Borderlands 4 - GbxAudio support (#645)
Some checks are pending
FModel QA Builder / build (push) Waiting to run
2026-02-16 02:05:52 +02:00