Table of Contents

Enum LayerTransformMode

Namespace
FlowGraph.Core.Rendering
Assembly
FlowGraph.Core.dll

Defines how a rendering layer participates in viewport transformations.

This is inspired by react-diagrams' LayerModel.options.transformed flag, which allows layers to opt in or out of viewport transforms. In FlowGraph, we extend this to three modes to handle direct rendering scenarios.

public enum LayerTransformMode

Fields

SelfTransformed = 2

Layer manages its own transforms independently.

Coordinate expectations:

  • Layer exists outside any transformed container
  • Layer performs its own CanvasToScreen transforms when rendering
  • Used for direct DrawingContext rendering that bypasses visual tree

Use for: DirectGraphRenderer, custom GPU renderers, background grids

Example:

// DirectGraphRenderer renders directly to DrawingContext
public override void Render(DrawingContext context)
{
    foreach (var node in nodes)
    {
        // Must transform canvas coords to screen coords manually
        var screenPos = viewport.CanvasToScreen(node.Position.X, node.Position.Y);
        context.DrawRectangle(brush, pen, new Rect(screenPos, scaledSize));
    }
}

Critical: SelfTransformed layers MUST be children of an untransformed container (e.g., RootPanel, not MainCanvas). Placing them inside a transformed container causes double-transformation bugs.

Transformed = 0

Layer IS affected by parent viewport transforms.

Coordinate expectations:

  • Elements are positioned in canvas coordinates
  • Parent container applies zoom/pan via MatrixTransform
  • No manual coordinate conversion needed

Use for: Nodes, edges, ports, resize handles, selection rectangles

Example:

// Node positioned in canvas coordinates - transform handled by parent
Canvas.SetLeft(nodeVisual, node.Position.X);  // ✅ Canvas coords
Canvas.SetTop(nodeVisual, node.Position.Y);
Untransformed = 1

Layer is NOT affected by viewport transforms.

Coordinate expectations:

  • Elements are positioned in screen coordinates
  • Layer exists outside the transformed container
  • Must manually call CanvasToScreen if referencing canvas positions

Use for: Fixed overlays, HUD elements, toolbars, minimap frame

Example:

// Tooltip positioned in screen coordinates
Canvas.SetLeft(tooltip, e.GetPosition(rootPanel).X);  // ✅ Screen coords