← Cycles
Qmap · c20

Dataflow Arrows

unlistedcreated 2026-03-30· last activity 2026-08-15

Directional arrow indicators on dataflow lines

New in this cycle: Composable flow decorators — ArrowIndicator and PulseIndicator

Why

Dashed-line flows show direction via dash offset, but the cue is subtle and can be ambiguous — especially when flows cross or at certain camera angles. Directional arrows make flow direction immediately obvious. This cycle compared rendering approaches to find the best balance of clarity, performance, and fit with the existing line style.

Objective

Prototype arrow strategies on a bezier flow curve in a standalone Three.js harness, then productionize the winners as opt-in decorators on LineFlow with full config-schema tuning.

Key Changes

  • 2026-04-16 — Landed in the c18-c22 batch commit (work recorded as starting 2026-03-30):
    • Four experimental strategies in dev/experiments/c20.dataflow-arrows/strategies/: ConeArrows (one draw call per cone), InstancedConeArrows (single draw call — performance winner), SpriteArrows (camera-facing, always readable), SlidingArrow (single cone with comet trail — promoted to ArrowIndicator sliding mode)
    • src/flows/ArrowIndicator.js — cone-mesh directional arrows as a decorator on LineFlow; distributed and sliding modes; tangent-aligned via quaternion rotation
    • src/flows/PulseIndicator.js — gradient pulse sweep via TubeGeometry + custom ShaderMaterial (fract(uPulse - vT) moving band, multi-pulse support)
    • LineFlow integration — both decorators opt-in, wired into update/rebuild/setState/dispose; arrow color syncs with flow state; live setters for speed/opacity
    • Config schema expansion in qmapConfigSchema.js — full line/arrow/pulse control set, plus the visibleWhen field so the Configurator hides sub-controls when a parent toggle is off
    • QMap props (showArrows, showPulse, showLine, line dash/opacity settings) with live watchers and a re-apply pattern for highlighted dataflows

Outcome

Two production-ready decorators (ArrowIndicator + PulseIndicator) integrated into LineFlow and absorbed into the dataflow config schema, tunable via DevConfigurator. The decorator lifecycle (attach, rebuild, update, dispose) proved easy to extend. c21 consolidated this further: LineFlow gained applyConfig() and became fully self-managing, with indicators created exclusively through it and QMap's per-property flow watchers removed.

Visual record

10 captures — heroes, page slices, and full-page renders. Click to view.

The bare flow line
The bare flow line
Dashed line — direction by drift
Dashed line — direction by drift
Distributed arrows riding the curve
Distributed arrows riding the curve
Sliding arrow with decay trail
Sliding arrow with decay trail
Comet pulse
Comet pulse
Mountain pulse — the shader wave
Mountain pulse — the shader wave
Experimental: cone meshes
Experimental: cone meshes
Experimental: sprite arrows
Experimental: sprite arrows
Curve height 4 — the ballistic arc
Curve height 4 — the ballistic arc
c20 hero

Artifacts

/experiments/c20.dataflow-arrows/ (local dev)

Qpoint Brand Style Guide