glow-ribbons
glow-ribbons
GLOW RIBBONS — eight neon-line looks, each built only from the glow recipe (a dark base, roughness 1, metalness 0, the colour in the emissive), swept into tubes and ribbons. Companion to glow.promo and glow-lines.promo. Every scene keeps the "Ember" phone in the set.
Read the rig's notes
THE TOOL: <neon> (packages/engine/lib/neon-line.ts)
neon#id(points="x y z, x y z, …" radius=R color=<dark> emissive=<hue> emissive-intensity=<×>)
- the line passes THROUGH the points on a centripetal Catmull-Rom curve: smooth by
construction, no handles, no overshoot. A route of points is all a line is.
- `head` / `tail` (fractions of the length, channels): head 0 → 1 draws it on (R7);
a short window running 0 → 1 is a light pulse travelling the line (R1, R2, R5 sparks:
a thin white neon on the SAME points as its strand).
- built once; head/tail move a draw range — nothing is rebuilt per frame.
- travelling waves (R3, R8) are long STATIC strands sliding sideways by about a
wavelength inside a group; their ends stay off-screen, so the wave seems to flow.
mirror source(factory=reflector-ground … mirror=1 unlit=true): a dark mirror floor.
Reflections are NOT bloomed (the reflector is not a light material) — the
mirrored lines read crisp under a soft real one, which is the look.
The point lists for the braid, the band, the warp lines and the terrain were computed
(frames, offsets, the height field) and pasted in; everything else is hand-written.
PALETTE (luminance-matched as in glow.promo: × ≈ 1.2 / L(hue), cooler ones a touch under).
Dense bundles run at a fraction of it — R1 ×0.6, R5 ×0.55, R8 ×0.7, R3 ×0.8: a dozen
overlapping strands at full strength bloom into one solid sheet.
violet #8b5cff L 0.20 ×4.9 · magenta #ff3df0 L 0.31 ×3.9 · blue #2f6bff ×5.5 · cyan
#7ad7ff ×2 · pink #ff3d7f ×4.6 · orange #ff8a3d L 0.40 ×3 · wire #dfe8ff L 0.81 ×1.5 ·
green #39ff88 ×1.6
THE SCENES
R1 BRAID 10 strands braided round a spline that coils once round the phone; sparks ride it
R2 WARP 28 lines stream along the floor toward the lens and sweep up and out into walls
R3 WAVES 7 travelling sine strands braiding in a void, sparkles drifting
R4 SYNTHWAVE a glowing wire terrain (grid + diagonals), sky arcs, a crystal and a dark orb
R5 ARCH a 14-strand band rising, flipping at the crest over the phone, coming down
R6 PENTAGON broken-corner pentagon frames; the lens flies to a magenta mouth
R7 CROWN green lines draw along the floor toward the phone, then rise as a blue fan
R8 CORDS five thick cords with flowing waves, on the mirror
Preview: http://localhost:4444/runtime?project=promos/primitives/materials/glow/glow-ribbons.promo- Topic
- materials
- Scenes
- 8
- Kind
- reference rig
//
GLOW RIBBONS — eight neon-line looks, each built only from the glow recipe (a dark base,
roughness 1, metalness 0, the colour in the emissive), swept into tubes and ribbons.
Companion to glow.promo and glow-lines.promo. Every scene keeps the "Ember" phone in the set.
THE TOOL: <neon> (packages/engine/lib/neon-line.ts)
neon#id(points="x y z, x y z, …" radius=R color=<dark> emissive=<hue> emissive-intensity=<×>)
- the line passes THROUGH the points on a centripetal Catmull-Rom curve: smooth by
construction, no handles, no overshoot. A route of points is all a line is.
- `head` / `tail` (fractions of the length, channels): head 0 → 1 draws it on (R7);
a short window running 0 → 1 is a light pulse travelling the line (R1, R2, R5 sparks:
a thin white neon on the SAME points as its strand).
- built once; head/tail move a draw range — nothing is rebuilt per frame.
- travelling waves (R3, R8) are long STATIC strands sliding sideways by about a
wavelength inside a group; their ends stay off-screen, so the wave seems to flow.
mirror source(factory=reflector-ground … mirror=1 unlit=true): a dark mirror floor.
Reflections are NOT bloomed (the reflector is not a light material) — the
mirrored lines read crisp under a soft real one, which is the look.
The point lists for the braid, the band, the warp lines and the terrain were computed
(frames, offsets, the height field) and pasted in; everything else is hand-written.
PALETTE (luminance-matched as in glow.promo: × ≈ 1.2 / L(hue), cooler ones a touch under).
Dense bundles run at a fraction of it — R1 ×0.6, R5 ×0.55, R8 ×0.7, R3 ×0.8: a dozen
overlapping strands at full strength bloom into one solid sheet.
violet #8b5cff L 0.20 ×4.9 · magenta #ff3df0 L 0.31 ×3.9 · blue #2f6bff ×5.5 · cyan
#7ad7ff ×2 · pink #ff3d7f ×4.6 · orange #ff8a3d L 0.40 ×3 · wire #dfe8ff L 0.81 ×1.5 ·
green #39ff88 ×1.6
THE SCENES
R1 BRAID 10 strands braided round a spline that coils once round the phone; sparks ride it
R2 WARP 28 lines stream along the floor toward the lens and sweep up and out into walls
R3 WAVES 7 travelling sine strands braiding in a void, sparkles drifting
R4 SYNTHWAVE a glowing wire terrain (grid + diagonals), sky arcs, a crystal and a dark orb
R5 ARCH a 14-strand band rising, flipping at the crest over the phone, coming down
R6 PENTAGON broken-corner pentagon frames; the lens flies to a magenta mouth
R7 CROWN green lines draw along the floor toward the phone, then rise as a blue fan
R8 CORDS five thick cords with flowing waves, on the mirror
Preview: http://localhost:4444/runtime?project=promos/primitives/materials/glow/glow-ribbons.promo
promo#glow-ribbons(width=1920 height=1080 fps=30)
materials
standard#glow-bulb(color=#3a2a14 emissive=#ffd27a emissive-intensity=3 metalness=0 roughness=1)
standard#glow-white(color=#0e1014 emissive=#dfe8ff emissive-intensity=1.5 metalness=0 roughness=1)
standard#gw-deck(color=#100e14 metalness=0 roughness=0.85 envmap-intensity=0.04)
standard#gw-plinth(color=#1d1b19 metalness=0.1 roughness=0.45 envmap-intensity=0.5)
standard#rb-orb(color=#0a0f1c metalness=0.6 roughness=0.12 envmap-intensity=1.2)
// =====================================================================================
// 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=ta