GregOrigin - BlueLine: Smart Tagging & Node Alignment

Watch it in action

Read the manual

BlueLine is a lightweight, modular C++ plugin for Unreal Engine 5 designed to solve three specific problems in professional development workflows:

  1. Graph Readability: Replaces messy Bezier "noodles" with clean, 90-degree orthogonal wiring without the performance cost of A* pathfinding.

  2. Team Collaboration: Provides "Soft Formatting" tools that align nodes without reorganizing the entire graph, preventing massive Git/Perforce diffs.

  3. Data Visualization: Transforms standard Gameplay Tags in the Details Panel into colored, readable chips, synchronized across the entire team via Data Assets.

šŸ”Œ Graph Enhancements

BlueLine replaces the standard graph rendering pipeline with a high-performance "Manhattan" style renderer.

1. Manhattan Wiring
  • Orthogonal Routing: Wires turn at 90-degree angles.

  • Ghost Wires: Wires passing behind nodes are automatically rendered with reduced opacity (35%) to reduce visual noise.

  • Performance: Uses simple geometric heuristics instead of pathfinding, ensuring zero input lag even in massive Animation Blueprints.

2. "Soft Magnet" Formatting (Shift + Q)

Unlike other auto-formatters that rearrange your entire graph (destroying your specific layout), BlueLine uses a Selection-Only approach.

  • Usage: Select a group of nodes and press Shift + Q.

  • Behavior: Nodes align grid-relative to their input connections.

  • The "Anti-Diff" Philosophy: BlueLine never touches nodes you haven't selected. This ensures your Commit History remains clean and readable.

3. Hotkeys

Key Action Description Shift + Q Magnet Align Aligns selected nodes to the grid relative to their inputs. F8 Toggle Style Instantly switches between BlueLine wires and Standard Bezier curves.

šŸ·ļø Smart Tags & Visualization

BlueLine overrides the Details Panel customization for FGameplayTag, replacing the text string with a colored "Chip" widget.

1. Setup (Team Color Sync)

Colors are not stored in local user preferences. they are stored in a Data Asset so the whole team sees the same colors.

  1. Create a DataAsset derived from BlueLineThemeData.

  2. Name it DA_BlueLineDefault and place it in /Game/BlueLine/ (Content/BlueLine/).

    • Note: This path ensures the plugin finds it automatically without configuration.

  3. Add Tag Styles:

2. Runtime Debugging (C++)

Debug colors shouldn't disappear when you hit PIE (Play In Editor). Use the static library to draw colored tags on the HUD or in World space.

3. Blueprint Support

The library is exposed to Blueprint as "Draw BlueLine Debug Tag".

I’m posting a changelog here for clarity :slightly_smiling_face:

BlueLine Changelog

Bug Fixes

Fixed Pin Duplication in Demo Nodes

Fixed a critical bug where AllocateDefaultPins() was not clearing existing pins before creating new ones, causing duplicated/stacked pins to appear when nodes were reconstructed (e.g., during compilation or undo/redo).

Affected Files:

  • Source/BlueLineSmartTags/Private/Demos/UK2Node_TagDemo.cpp
  • Source/BlueLineSmartTags/Private/Demos/UK2Node_KingSafety.cpp
  • Source/BlueLineSmartTags/Private/Demos/UK2Node_AWSTag.cpp

Fix: Added Pins.Reset() at the beginning of AllocateDefaultPins() to clear existing pins before recreation.

Fixed F8 Key Binding Conflict

Changed ToggleWireStyle command from F8 to Shift+F8 to avoid conflict with Unreal Engine's built-in "Possess or Eject Player" debugger command used in Play-in-Editor (PIE) mode.

Affected Files:

  • Source/BlueLineGraph/Private/Commands/FBlueLineCommands.cpp
  • Source/BlueLineGraph/Private/BlueLineGraphModule.cpp
  • Source/BlueLineGraph/Public/Commands/FBlueLineCommands.h

New Shortcut:

Shortcut Command Context
Shift+F8 Toggle Wire Style Blueprint Graph

Fixed Hardcoded Stub Length

The FBlueLineConnectionPolicy was using a hardcoded stub length value (20.0f) instead of respecting the user-configurable StubLength setting from Editor Preferences.

Affected Files:

  • Source/BlueLineGraph/Private/Drawing/FBlueLineConnectionPolicy.cpp

Fix: Changed from hardcoded value to use Settings->StubLength:

// Before:
const float StubLength = 20.0f * LocalZoomFactor;

// After:
const float StubLength = (Settings ? Settings->StubLength : 20.0f) * LocalZoomFactor;

Improvements

Implemented WireStyle Support

The WireStyle setting (Thin/Medium/Thick/Dynamic) in Editor Preferences was previously defined but not actually applied to wire rendering. Now it's fully functional.

Affected Files:

  • Source/BlueLineGraph/Private/Drawing/FBlueLineConnectionPolicy.cpp

Implementation:

void FBlueLineConnectionPolicy::DetermineWiringStyle(UEdGraphPin* OutputPin, UEdGraphPin* InputPin, FConnectionParams& Params)
{
    // Applies WireStyle from settings:
    // - Thin: 1.5px
    // - Medium: 2.5px  
    // - Thick: 4.0px
    // - Dynamic: Uses theme-based type coloring
    // Also applies WireThicknessMultiplier setting
}

Removed Ghost Setting: bAnimateExecutionWires

Removed the bAnimateExecutionWires setting from Editor Preferences that had no implementation. This was a placeholder setting that had no effect.

Affected Files:

  • Source/BlueLineCore/Public/Settings/UBlueLineEditorSettings.h
  • Source/BlueLineCore/Private/Settings/UBlueLineEditorSettings.cpp

New Feature: Graph Bookmarks

Added bookmark system for quick navigation in Blueprint graphs.

Hotkeys:

  • Ctrl+1-9: Set bookmark at selected node
  • 1-9: Jump to bookmark
  • Ctrl+0: Clear all bookmarks in current graph

Features:

  • Bookmarks persist per graph across editor sessions
  • Stored in Saved/BlueLineBookmarks.json
  • Automatic cleanup when assets are deleted
  • Visual feedback in Output Log

New Files

Source/BlueLineGraph/
ā”œā”€ā”€ Public/Bookmarks/
│   └── FBlueLineBookmarkManager.h      # Bookmark management API
└── Private/Bookmarks/
    └── FBlueLineBookmarkManager.cpp    # Implementation with JSON persistence

New Feature: Node Snippets

Save selected nodes as reusable templates that can be quickly inserted into any graph.

Hotkeys:

  • Shift+S: Create snippet from selected nodes
  • Shift+I: Insert a saved snippet

Features:

  • Full node serialization including connections
  • Organize snippets by category
  • Persistent storage in Saved/BlueLineSnippets.json
  • Export/import snippets for sharing

New Files

Source/BlueLineGraph/
ā”œā”€ā”€ Public/Snippets/
│   └── FBlueLineSnippetManager.h       # Snippet management API
└── Private/Snippets/
    └── FBlueLineSnippetManager.cpp     # Implementation with JSON persistence

[1.0.3] - 2026-02-09

Overview

Major feature release introducing BlueLineRuntime - a new runtime module that enables Blueprint Subsystem creation directly from the editor. This release also adds the "Extract to Subsystem" feature, allowing developers to refactor complex Blueprint graphs by extracting selected nodes into dedicated Subsystem Blueprints.


New Module: BlueLineRuntime

Blueprint Subsystem Base Classes

The BlueLineRuntime module provides Blueprint-friendly base classes for creating Unreal Engine Subsystems without writing C++. This enables developers to create managers and systems that persist across level transitions using familiar Blueprint workflows.

New Files

Source/BlueLineRuntime/
ā”œā”€ā”€ BlueLineRuntime.Build.cs              # Module build configuration
ā”œā”€ā”€ Public/
│   ā”œā”€ā”€ BlueLineRuntimeModule.h           # Public module interface
│   └── Subsystems/
│       ā”œā”€ā”€ BlueLineGameInstanceSubsystem.h   # GameInstance base class
│       ā”œā”€ā”€ BlueLineWorldSubsystem.h          # World base class
│       └── BlueLineLocalPlayerSubsystem.h    # LocalPlayer base class
└── Private/
    ā”œā”€ā”€ BlueLineRuntimeModule.cpp         # Module implementation
    └── Subsystems/
        ā”œā”€ā”€ BlueLineGameInstanceSubsystem.cpp
        ā”œā”€ā”€ BlueLineWorldSubsystem.cpp
        └── BlueLineLocalPlayerSubsystem.cpp

Base Classes

Class Parent Use Cases
UBlueLineGameInstanceSubsystem UGameInstanceSubsystem Game state managers, Save/load systems, Achievement managers
UBlueLineWorldSubsystem UWorldSubsystem Level-specific rules, World event managers, Per-level audio
UBlueLineLocalPlayerSubsystem ULocalPlayerSubsystem Per-player input, Player UI controllers, Split-screen HUD

Blueprint Events

All base classes provide Blueprint-implementable events:

  • On Initialize - Called when subsystem is initialized
  • On Deinitialize - Called when subsystem is shut down
  • On Post Initialize (World only) - Called after all subsystems initialized
  • On World Begin Play (World only) - Called when world starts gameplay
  • On Update Streaming State (World only) - Called for streaming updates

New Feature: Extract to Subsystem

Shift+B: Extract Selected Nodes to Subsystem

A powerful refactoring tool that allows extracting selected Blueprint nodes into a new dedicated Subsystem Blueprint. This helps organize complex graphs by isolating functionality into properly architected subsystems.

How It Works

  1. Select nodes in any Blueprint graph
  2. Press Shift+B or right-click → "Extract to Subsystem"
  3. Choose destination in the save dialog
  4. New Blueprint created inheriting from BlueLineGameInstanceSubsystem
  5. Blueprint opens automatically for editing

Implementation

New Files:

  • Source/BlueLineGraph/Public/BlueprintSubsystem/BlueprintSubsystemExtractor.h
  • Source/BlueLineGraph/Private/BlueprintSubsystem/BlueprintSubsystemExtractor.cpp

Key Features:

  • Analyzes selected nodes for external connections and dependencies
  • Creates properly configured Blueprint with correct parent class
  • Supports fallback to engine subsystem classes if BlueLineRuntime unavailable
  • Opens save dialog for user to choose destination path
  • Automatically opens new Blueprint for editing

Build System Updates

BlueLineRuntime.Build.cs (New)

public class BlueLineRuntime : ModuleRules
{
    PublicDependencyModuleNames.AddRange(
        new string[] { "Core", "CoreUObject", "Engine" }
    );
}

BlueLineGraph.Build.cs

 PrivateDependencyModuleNames.AddRange(
     new string[]
     {
         // ... existing modules ...
+        "ContentBrowser",   # Required for save asset dialog
+        "AssetTools"        # Required for blueprint creation
     }
 );

+// Allow includes from BlueLineSmartTags without circular dependency
+PrivateIncludePathModuleNames.AddRange(
new string { "BlueLineSmartTags" }
);


Plugin Configuration

BlueLine.uplugin

{
    "Version": 3,
    "VersionName": ",
    "Modules": [
        { "Name": "BlueLineCore", "Type": "Runtime", "LoadingPhase": "PreDefault" },
        { "Name": "BlueLineRuntime", "Type": "Runtime", "LoadingPhase": "Default" },
        { "Name": "BlueLineGraph", "Type": "Editor", "LoadingPhase": "PreDefault" },
        { "Name": "BlueLineSmartTags", "Type": "Editor", "LoadingPhase": "Default" },
        { "Name": "BlueLineLevel", "Type": "Editor", "LoadingPhase": "PostEngineInit" }
    ]
}

Keyboard Shortcuts

New Commands

Shortcut Command Context Module
Shift+B Extract to Subsystem Blueprint Graph BlueLineGraph
Shift+E Export to Text Blueprint Graph BlueLineGraph

Updated Shortcuts Reference

Shortcut Command Context
Shift+Q Auto-Format Graph Blueprint Graph
Shift+R Rigidify Connections Blueprint Graph
Shift+C Clean Graph Blueprint Graph
Shift+T Auto-Tag Selection Blueprint Graph
Shift+B Extract to Subsystem Blueprint Graph
Shift+E Export to Text Blueprint Graph
Shift+S Open Level Pie Menu Level Editor Viewport
Shift+F8 Toggle Wire Style Blueprint Graph

New Feature: Export to Text

Shift+E: Export Blueprint to Readable Text

A lightweight text exporter that converts Blueprint graphs into human-readable format for debugging, documentation, and AI-assisted analysis. Inspired by the Blueprint Text Exporter plugin.

How It Works

  1. Open any Blueprint graph
  2. Press Shift+E or right-click → "Export to Text"
  3. Choose save location in the file dialog
  4. Open the .txt file for debugging or AI analysis

Example Output

=== Blueprint Export: BP_Player ===
Export Type: Full Graph
Total Nodes: 42

Event BeginPlay
└─ then →
Set Max Health (MaxHealth = 100.0)
└─ then →
Set Current Health (CurrentHealth = MaxHealth)

Event TakeDamage
Take Damage (Damage = 10.0, DamageType = DamageType_Fire)
└─ then →
Apply Damage (Target = Self, BaseDamage = Damage)
└─ then →
UpdateHealthBar (Percent = CurrentHealth / MaxHealth)

Implementation

New Files:

  • Source/BlueLineGraph/Public/Export/BlueLineGraphExporter.h
  • Source/BlueLineGraph/Private/Export/BlueLineGraphExporter.cpp

Key Features:

  • Exports full graph or selected nodes
  • Follows execution flow with tree structure
  • Expands pure (data) nodes inline
  • Saves to [Project]/BlueprintExports/ by default
  • Compatible with AI tools (ChatGPT, Claude, etc.)

Build System Updates

BlueLineGraph.Build.cs (Updated)

 PrivateDependencyModuleNames.AddRange(
     new string[]
     {
         // ... existing modules ...
+        "DesktopPlatform"   # Required for save file dialog
     }
 );

Context Menu Additions

Blueprint Graph Context Menu

New entries in the "BlueLine Graph" section:

  • Auto-Tag Selection - Tag selected nodes semantically
  • Extract to Subsystem - Create subsystem from selection
  • Export to Text - Export graph to readable text

API Additions

// BlueprintSubsystemExtractor.h
class FBlueprintSubsystemExtractor
{
    bool ExtractToSubsystem(
        UEdGraph* SourceGraph,
        const TArray<UEdGraphNode*>& SelectedNodes,
        ESubsystemType SubsystemType,
        const FString& NewSubsystemName,
        const FString& DestinationPath);
void OpenExtractionDialog(UEdGraph* Graph, const TArray&lt;UEdGraphNode*&gt;&amp; SelectedNodes);
static bool CanExtractNodes(const TArray&lt;UEdGraphNode*&gt;&amp; SelectedNodes);

};

// BlueLineGraphExporter.h
class FBlueLineGraphExporter
{
static void ExportGraphToText(UEdGraph* Graph, const TArray<UEdGraphNode*>& SelectedNodes);
static bool CanExportNodes(const TArray<UEdGraphNode*>& Nodes);
};

// ESubsystemType enum
UENUM()
enum class ESubsystemType : uint8
{
GameInstance,
World,
LocalPlayer
};


Documentation

HTML Manual Updates

Comprehensive documentation updates for the new features:

New Sections Added:

  • Extract to Subsystem (Shift+B) - Complete workflow guide with visual examples
  • Export to Text (Shift+E) - Feature documentation with example output
  • Blueprint Subsystems - Base class documentation with comparison table

Updated Architecture Diagram:

  • Added BlueLineRuntime module to the dependency graph
  • Shows Editor → Runtime relationships with dashed lines

New Navigation Items:

  • "Advanced šŸ†•" section in sidebar
  • Individual pages for each new feature

Visual Improvements:

  • Feature cards for Extract to Subsystem and Export to Text in Overview
  • Version banner updated
  • Subsystem type comparison table

Bug Fixes

  • Fixed circular dependency between BlueLineGraph and BlueLineSmartTags modules
  • Fixed include paths for cross-module header access
  • Fixed missing includes in BlueprintSubsystemExtractor (UBlueprintFactory, UEdGraphNode_Comment)

[1.0.2] - 2026-02-08

Overview

Major release introducing BlueLineLevel - a unified Level Editor toolkit previously known as "Shift+S". This release merges the viewport-based modeling workflow tools into BlueLine, creating a complete editor enhancement suite covering both Blueprint graphs and Level Editor viewports.


New Module: BlueLineLevel

Full Migration of Shift+S (ShiftSDev) Plugin

The Shift+S plugin has been fully integrated into BlueLine as the BlueLineLevel module. All functionality has been preserved and enhanced to work within the BlueLine ecosystem.

New Files

Source/BlueLineLevel/
ā”œā”€ā”€ BlueLineLevel.Build.cs              # Module build configuration
ā”œā”€ā”€ Public/
│   ā”œā”€ā”€ BlueLineLevelModule.h           # Public module interface (IBlueLineLevelModule)
│   ā”œā”€ā”€ BlueLineLevelTypes.h            # Core types (EBlueLinePivotTarget, constants)
│   ā”œā”€ā”€ BlueLineLevelOps.h              # Pivot and selection operations
│   └── BlueLineLevelSelection.h        # Session-based selection system
└── Private/
    ā”œā”€ā”€ BlueLineLevelModule.cpp         # Module implementation
    ā”œā”€ā”€ Core/
    │   ā”œā”€ā”€ BlueLineLevelOps.cpp        # Pivot snapping, vertex picking, material selection
    │   └── BlueLineLevelSelection.cpp  # Cached selection with live preview
    ā”œā”€ā”€ Framework/
    │   ā”œā”€ā”€ BlueLineLevelCommands.h     # Command definitions
    │   └── BlueLineLevelCommands.cpp   # Alt+S shortcut binding
    └── UI/
        ā”œā”€ā”€ SBlueLineLevelPieMenu.h     # Radial pie menu widget
        └── SBlueLineLevelPieMenu.cpp   # Menu implementation

Features Migrated

Feature Description Shortcut
Pie Menu Radial menu for quick actions Alt+S
Pivot Center Snap pivot to selection center Pie Menu ↑
Pivot Bottom Snap pivot to selection bottom Pie Menu ↓
Cursor Snap Vertex-precision picker mode Pie Menu →
Select Scope Material-based radius selection Pie Menu ←
Radius Scroll Adjust selection radius with mouse wheel While hovering Select Scope

Update: Streamlined Pie Menu Design (2026-02-08)

The Pie Menu has been completely redesigned to match BlueLine's elegant Blueprint aesthetic:

The Pie Menu has been completely redesigned to match BlueLine's elegant Blueprint aesthetic:

Feature Implementation
Blueprint Grid Background Subtle Blueprint-style grid that fades toward edges
Animated Hover States Smooth interpolation for scale and glow effects
Directional Layout Clean 90° orientation (Top/Right/Bottom/Left)
Color-Coded Options BlueLine blue for pivot tools, Greg green for selection, warm accent for cursor
Dynamic Center Indicator Center dot changes color to match hovered option
Connection Lines Subtle lines connecting center to each option
Refined Typography Short labels when idle, full labels on hover
Picker Mode Minimal crosshair with contextual hints

Visual Hierarchy:

  • Center dead zone prevents accidental triggers
  • 45° diagonal zones are neutral (no selection)
  • Options activate only when hovering the specific quadrant
  • Glow effects provide visual feedback without clutter

BlueLine 1.0.5 - Changelog

New Features

  • Magnetic Wire Snapping: Implemented a Node Graph Assistant-style wire snapping system (FBlueLineWireSnapper). When dragging a connection, your cursor will now magnetically snap to valid nearby pins, preventing near-misses during fast routing.
    • Configurable via Editor Preferences (Enable/Disable and Snap Radius tuning).

Bug Fixes

  • Context Menu Crash: Fixed an IsValid() assertion crash (FBlueLineGraphMenuExtender.cpp:120) that occurred when opening the Blueprint right-click context menu immediately at Editor startup before the BlueLineSmartTags module had fully initialized.
  • Hotkey Conflict: Changed the "Toggle Wire Style" hotkey from Shift+F8 to Shift+W to prevent overriding Unreal Engine's default Play in Editor (PIE) / Eject Player bindings.
  • Smart Tag Specificity: Fixed an issue where Smart Tag colors could apply the wrong hierarchical style based on string length. The resolver now correctly uses Unreal's native MatchesTagDepth to ensure exact parent-child inheritance logic.
  • Auto-Routing Tangling: Changed the default value of "Auto-Route New Connections" from true to false to prevent internal macro/node structures from tangling when duplicating or pasting large graphs.

Architectural Improvements

  • Zero Runtime Overhead: Completely removed the BlueLineRuntime module. The plugin is now 100% Editor-only.
    • The "Extract to Subsystem" feature has been rewritten to inherit directly from Unreal Engine's native subsystem classes (UGameInstanceSubsystem, UWorldSubsystem, ULocalPlayerSubsystem) instead of relying on a proprietary BlueLine base class.
  • Dynamic Configuration: Removed the legacy BlueLineConfig.h constants system. All core thresholds and "magic numbers" have been fully migrated into UBlueLineEditorSettings, ensuring seamless live-updates when modifying preferences.
  • Version Sync: Aligned BlueLine.uplugin version strings (1.0.5) to accurately reflect documented feature sets.