Skip to content
Docs
Open Promoeyes
iridescence-glass

iridescence-glass

IRIDESCENCE-GLASS — ten glass compositions, ten grounds. Real transmission (transmission=1, dispersion, iridescence, per-slab attenuation tints) over a floor whose caustic is PAINTED, because three.js sends no light through a transmissive mesh.

Read the rig's notes
The paint is not a stock texture: caustics.py reads THIS file, takes each
scene's directional key and every transmissive slab (path outline, position,
rotation, scale), projects the outline down the key onto the floor and paints
what that slab would throw there — a tinted shadow, a dark bevel rim and a
six-band spectral fringe whose spread grows with the slab's height and
thickness. Two maps per scene in media/:
  floor-<scene>.png   albedo: white = untouched, so the material `color` is
                      the ground. Tinted shadows multiply where slabs overlap.
  glow-<scene>.png    the spectral bands as light, worn as emissive_map.
So the rules are: the glass never moves (only the camera does — moved glass
would leave its caustic behind), slabs carry cast_shadow=false (the painted
shadow is the coloured one; a shadow map would add a grey slab), and after
ANY change to a slab or a key light, re-run `python3 caustics.py`.

  01 paper    loose stack — six different outlines, tilted, cantilevered
  02 blush    rainbow fan — seven petals spiralling up from one pivot
  03 butter   upright panes — five standing sheets, back-lit, long shadows
  04 sky      pebble field — eight thick pebbles in one layer, one stacked
  05 mint     card house — two A-frames and a roof
  06 lilac    ziggurat — four rings with holes and a cap, top-down
  07 clay     rosette — two tiers of six petals around a disc
  08 cobalt   twist — nine squircles, each turned 10° further, tapering
  09 forest   shards — angular pieces, flat, stacked and stuck upright
  10 ink      prism — a 260 mm triangular prism and three thick lenses

NEEDS TRANSMISSION ON. packages/engine/registries/materials.ts carries
FORCE_DISABLE_TRANSMISSION (Known-bugs.md §1); while it is true every slab
renders as opaque plastic.

Phone screen: iridescence.screens.html → scripts/html-screens.mts, trimmed to
the header, the spectrum card and the button.
Preview: http://localhost:4444/runtime?project=promos/primitives/materials/iridescence/iridescence-glass.promo
Scenes
10
Kind
reference rig
//
    IRIDESCENCE-GLASS — ten glass compositions, ten grounds. Real transmission
    (transmission=1, dispersion, iridescence, per-slab attenuation tints) over a
    floor whose caustic is PAINTED, because three.js sends no light through a
    transmissive mesh.

    The paint is not a stock texture: caustics.py reads THIS file, takes each
    scene's directional key and every transmissive slab (path outline, position,
    rotation, scale), projects the outline down the key onto the floor and paints
    what that slab would throw there — a tinted shadow, a dark bevel rim and a
    six-band spectral fringe whose spread grows with the slab's height and
    thickness. Two maps per scene in media/:
      floor-<scene>.png   albedo: white = untouched, so the material `color` is
                          the ground. Tinted shadows multiply where slabs overlap.
      glow-<scene>.png    the spectral bands as light, worn as emissive_map.
    So the rules are: the glass never moves (only the camera does — moved glass
    would leave its caustic behind), slabs carry cast_shadow=false (the painted
    shadow is the coloured one; a shadow map would add a grey slab), and after
    ANY change to a slab or a key light, re-run `python3 caustics.py`.

      01 paper    loose stack — six different outlines, tilted, cantilevered
      02 blush    rainbow fan — seven petals spiralling up from one pivot
      03 butter   upright panes — five standing sheets, back-lit, long shadows
      04 sky      pebble field — eight thick pebbles in one layer, one stacked
      05 mint     card house — two A-frames and a roof
      06 lilac    ziggurat — four rings with holes and a cap, top-down
      07 clay     rosette — two tiers of six petals around a disc
      08 cobalt   twist — nine squircles, each turned 10° further, tapering
      09 forest   shards — angular pieces, flat, stacked and stuck upright
      10 ink      prism — a 260 mm triangular prism and three thick lenses

    NEEDS TRANSMISSION ON. packages/engine/registries/materials.ts carries
    FORCE_DISABLE_TRANSMISSION (Known-bugs.md §1); while it is true every slab
    renders as opaque plastic.

    Phone screen: iridescence.screens.html → scripts/html-screens.mts, trimmed to
    the header, the spectrum card and the button.
    Preview: http://localhost:4444/runtime?project=promos/primitives/materials/iridescence/iridescence-glass.promo
promo#iridescence-glass(width=1920 height=1080 fps=30)
  // =====================================================================
  // 01 · PAPER — the reference: six unlike outlines (wave, egg, crescent,
  // kidney, disc, pick) stacked loose, each tilted a few degrees and pushed
  // off the one below, so every overlap is a different pair of tints.
  // =====================================================================
  scene#ig01-paper(duration=3 transition=none)
    renderer(tone_mapping=Neutral exposure=1 shadow_map=true shadow_map_type=pcf-soft)
    camera(type=perspective fov=30 near=8.5 far=20000 position="-60 560 430" look_at="-10 50 30")
      properties
        frame(smooth=0)
          keyframes
            kf(time=0 position="-60 560 430" look_at="-10 50 30" up="0 1 0" fov=30)
            kf(time=3 easing=linear position="20 540 460" look_at="-10 50 30" up="0 1 0" fov=30)
    postprocessing
      step(name=render)
      step(name=aa method=ssaa samples=2)
    background(color=#f4f2ee)
    environment(hdr="photo_studio_01_2k" as_background=false background_color=#f4f2ee exposure=1 blurriness=0.05 intensity=0.5)
    lights
      light#ig01-amb(type=ambient color=#fffaf2 intensity=0.45)
      light#ig01-key(type=directional color=#fff6ea intensity=0.5 position="330 760 -330" cast_shadow=true)
        shadow(map_size="2048 2048" radius=10 intensity=0.4)
          camera(near=100 far=2400 left=-600 right=600 top=600 bottom=-600)
    primitive#ig01-ground(position="0 -0.6 0" rotation="-90 0 0" cast_shadow=false receive_shadow=true)
      geometry