Skip to content
Docs
Open Promoeyes
glow-lines

glow-lines

GLOW LINES — two neon lines that are nothing but a path. Each one is born BEHIND the camera (amber on the left, cyan on the right), streaks past the lens, carves through the set — a corkscrew round the phone, a loop-the-loop — and ends by closing a ring behind the phone, where it stays. Companion to glow.promo (same material, same set).

Read the rig's notes
THE ELEMENT: <neon> (packages/engine/lib/neon-line.ts)
  neon#id(points="x y z, x y z, …" radius=2.25 color=#dark emissive=#hue emissive-intensity=…
          head-size=5)
    head          ← where the lit stretch ENDS, as a fraction of the line's length
      0 0
      4.6 linear 1
    tail          ← where it STARTS
      …
  - the line passes THROUGH the points on a centripetal Catmull-Rom curve: smooth by
    construction, no handles, no overshoot — write the route, not the curve;
  - the tube is built once; head/tail only move a draw range on it (no per-frame geometry);
  - head 0 → 1 with tail at 0 draws the line on; tail following 0.14 behind makes a comet;
    holding tail at the ring's first point leaves the ring drawn;
  - head-size puts a hot bead on the head (emissive × head-boost, default 3);
  - the cut ends are capped round. Material vocabulary = path3d's (the glow recipe).
  Fractions are of LENGTH: equal steps are equal distances, so a linear head is a constant
  speed. The ring-start fraction (0.799 amber, 0.821 cyan) is the arc length up to the
  ring's first point over the whole length (centripetal Catmull-Rom, as three.js builds it).

ROUTE (mm; the camera sits at 0 120 700)
  amber  (−420 220 1150) behind-left → past the lens on the left → into frame, huge → a low
         swoop → a CORKSCREW round the phone, 1.5 turns of radius 150 rising 40 → 250 →
         over the back → a 115 mm ring behind the phone, centre (0 125 −80), clockwise from
         12 o'clock. 3.59 m.
  cyan   (420 60 1150) behind-right → past the lens on the right → a LOOP-THE-LOOP facing the
         lens, radius 90 round (−60 150 420) → a dive low across the phone's foot → up the
         right → a 92 mm ring inside the amber one, counter-clockwise. 3.22 m.

TIMING
  amber  head 0 → 1 over 0 → 4.6 s; tail 500 mm behind (0.139), parked at 0.799 from 4.32 s
  cyan   head 0 → 1 over 0.8 → 5.2 s; tail 500 mm behind (0.155), parked at 0.821 from 5.1 s
  both rings flash ×6 at 5.3 s and settle; the ring practical rises as they close. Each line
  sits in a group that creeps 2 mm, so the keyed flash reaches the bloom (glow.promo, TRAP).
Preview: http://localhost:4444/runtime?project=promos/primitives/materials/glow/glow-lines.promo
Scenes
1
Kind
reference rig
//
    GLOW LINES — two neon lines that are nothing but a path. Each one is born BEHIND the camera
    (amber on the left, cyan on the right), streaks past the lens, carves through the set —
    a corkscrew round the phone, a loop-the-loop — and ends by closing a ring behind the
    phone, where it stays. Companion to glow.promo (same material, same set).

    THE ELEMENT: <neon> (packages/engine/lib/neon-line.ts)
      neon#id(points="x y z, x y z, …" radius=2.25 color=#dark emissive=#hue emissive-intensity=…
              head-size=5)
        head          ← where the lit stretch ENDS, as a fraction of the line's length
          0 0
          4.6 linear 1
        tail          ← where it STARTS
          …
      - the line passes THROUGH the points on a centripetal Catmull-Rom curve: smooth by
        construction, no handles, no overshoot — write the route, not the curve;
      - the tube is built once; head/tail only move a draw range on it (no per-frame geometry);
      - head 0 → 1 with tail at 0 draws the line on; tail following 0.14 behind makes a comet;
        holding tail at the ring's first point leaves the ring drawn;
      - head-size puts a hot bead on the head (emissive × head-boost, default 3);
      - the cut ends are capped round. Material vocabulary = path3d's (the glow recipe).
      Fractions are of LENGTH: equal steps are equal distances, so a linear head is a constant
      speed. The ring-start fraction (0.799 amber, 0.821 cyan) is the arc length up to the
      ring's first point over the whole length (centripetal Catmull-Rom, as three.js builds it).

    ROUTE (mm; the camera sits at 0 120 700)
      amber  (−420 220 1150) behind-left → past the lens on the left → into frame, huge → a low
             swoop → a CORKSCREW round the phone, 1.5 turns of radius 150 rising 40 → 250 →
             over the back → a 115 mm ring behind the phone, centre (0 125 −80), clockwise from
             12 o'clock. 3.59 m.
      cyan   (420 60 1150) behind-right → past the lens on the right → a LOOP-THE-LOOP facing the
             lens, radius 90 round (−60 150 420) → a dive low across the phone's foot → up the
             right → a 92 mm ring inside the amber one, counter-clockwise. 3.22 m.

    TIMING
      amber  head 0 → 1 over 0 → 4.6 s; tail 500 mm behind (0.139), parked at 0.799 from 4.32 s
      cyan   head 0 → 1 over 0.8 → 5.2 s; tail 500 mm behind (0.155), parked at 0.821 from 5.1 s
      both rings flash ×6 at 5.3 s and settle; the ring practical rises as they close. Each line
      sits in a group that creeps 2 mm, so the keyed flash reaches the bloom (glow.promo, TRAP).
    Preview: http://localhost:4444/runtime?project=promos/primitives/materials/glow/glow-lines.promo
promo#glow-lines(width=1920 height=1080 fps=30)
  materials
    standard#gw-deck(color=#17140f metalness=0 roughness=0.85 envmap-intensity=0.04)
    standard#gw-wall(color=#0f0d0b metalness=0 roughness=0.95 envmap-intensity=0.1)

  // =====================================================================================
  // SCREEN — glow.screens.html converted by scripts/html-screens.mts (as in glow.promo).
  // =====================================================================================
  template#t-gw-phone
    card#gw-phone(x=0 y=0 w=71 h=154 r=9.1 fill=#0d0b09 shadow=false)
      card(x=0 y=0 w=71 h=154.02 r=9.1 fill=#0d0b09 clip=true)
        text(x=6.19 y=5.83 size=2.91 weight=600 color=#f5efe6 origin=left font_family=Inter w=5.75 wrap=false) "9:41"
        icon(x=53.34 y=4.28 size=3.09 set=tabler name=antenna-bars-5 color=#f5efe6 stroke_width=2)
        icon(x=57.53 y=4.28 size=3.09 set=tabler name=wifi color=#f5efe6 stroke_width=2)
        icon(x=61.72 y=4.28 size=3.09 set=tabler name=battery-4 color=#f5efe6 stroke_width=2)
        text(x=4.37 y=13.89 size=2.37 weight=700 color=#8a8073 origin=left font_family=Inter tracking=0.14 w=29.8 wrap=false) "HOME · 3 LIGHTS ON"
        text(x=4.37 y=18.9 size=5.1 weight=800 color=