Connection Line Styles
How connections are drawn is a per-asset, swappable line drawing policy - an Instanced object on GraphConfig.LineDrawingPolicy. All policies share the line colors, thickness, brush, and default start/end anchors, honor per-edge color overrides, and render identically in the editor preview and at runtime.
Anchors (every line style)
Every connection attaches to its two nodes at an anchor. The policy's Default Start Anchor / Default End Anchor set the default for all connections; override either end per connection by clicking the line in the Visual graph. Anchors work the same for straight, elbow, and spline.
| Mode | Where the line attaches |
|---|---|
Center | Node center |
Nearest | The point on the node's shape facing the other node |
Top / Bottom / Left / Right | That edge of the node's shape |
Custom | Node center plus an offset |
Anchors attach to the node's shape, not its bounding box, so lines meet round, hexagonal, and triangular nodes cleanly. When a node widget's art doesn't fill its slot, the per-widget Connection Anchor Inset pulls the attach point in to the visible edge. The editor preview and the in-game line use the same anchor maths, so what you place is what ships.
The Spline policy
Visual states and the connection layer
At runtime the policy resolves each connection to a visual state (ECrimsonConnectionVisualState: Locked / Unlockable / Active / Maxed) from live node data - never cached - and looks up its FCrimsonConnectionLineStyle in the policy's StateStyles table (per-edge StateStyleOverrides win; the legacy binary color override remains as a fallback for old assets).
Rendering is a single UCrimsonSkillTreeWidget_ConnectionLayer widget that paints every connection as draw elements (material-capable triangle strip with arc-length UVs, or an anti-aliased polyline). Geometry rebuilds only on layout changes; pan needs nothing; zoom re-evaluates per-edge LOD; state changes animate (crossfade + parent-to-child fill) on an on-demand timer. Shape comes from BuildConnectionGeometry: each connection's own shape curve (FCrimsonSkillTree_ConnectionPath::ShapeCurve) sampled over a FIXED 0..1 domain along the anchor chord - so editing one key never re-maps the rest - with the endpoints forced onto the anchors so a line can never look detached.