Grand Diomande Research · Full HTML Reader

E479 — Duncan Fewkes reel analysis digest

- 20 reels ingested (`reels-ingest/{shortcode}/`): - DT-prefix (E500–E521 era): DT0G7SyCtGg E519, DT2tfJzip8A E520, DT6IlEfig-k E521, DTbJvnKCrHO E509, DTBUJiDCvPQ E500, DTEEQNnCvHh E501, DThrF5Miq0- E512, DTmyro9CqUa E514, DTQRPBFiu2v E504, DTr5TQfCpG4 E516 - DS-prefix (E475–E494 era): DSLMOE6iuFH E479, DSA7b7MClVf E475, DScEatyilnk E489, DSDVSJ0itoN E476, DSfZYMUChIi E490, DShj9nlivqf E491, DSkpKC_iie8 E491, DSPfEuWCmTg E483, DSvasHCCiSX E494, DSZmIhOCrTv E488 - 4 Gemini visual analyses successful (DT0G7SyCtGg, D

Embodied Trajectory Systems research note backlog reference score 20 .md

Full Public Reader

E479 — Duncan Fewkes reel analysis digest

⚠ No video on disk for this reel — referenced by the playbook but not in the local ingest cache.

This file aggregates every playbook chunk section that cites E479. Sections are de-duplicated by heading.

Source data

_From `lume-duncan-playbook-chunk-DT-DS.md`_

  • 20 reels ingested (`reels-ingest/{shortcode}/`):
  • DT-prefix (E500–E521 era): DT0G7SyCtGg E519, DT2tfJzip8A E520, DT6IlEfig-k E521, DTbJvnKCrHO E509, DTBUJiDCvPQ E500, DTEEQNnCvHh E501, DThrF5Miq0- E512, DTmyro9CqUa E514, DTQRPBFiu2v E504, DTr5TQfCpG4 E516
  • DS-prefix (E475–E494 era): DSLMOE6iuFH E479, DSA7b7MClVf E475, DScEatyilnk E489, DSDVSJ0itoN E476, DSfZYMUChIi E490, DShj9nlivqf E491, DSkpKC_iie8 E491, DSPfEuWCmTg E483, DSvasHCCiSX E494, DSZmIhOCrTv E488
  • 4 Gemini visual analyses successful (DT0G7SyCtGg, DT6IlEfig-k, DTBUJiDCvPQ, DScEatyilnk). DSfZYMUChIi + DSZmIhOCrTv hit Gemini 429 quota exhaustion; captions on those are still detailed.

---

NEW preset taxonomy (revealed by E521 visual analysis text overlays)

_From `lume-duncan-playbook-chunk-DT-DS.md`_

The recent playbook only exposed `Multiparticle_Spine_FX` and `slime/water/chrome` material names. E521's screen recording shows the actual UI panel cycling through every preset. Update the LUME `LumeVfxEditor.cs` slot enums to match:

### `Depth:` slot (the surface visual on the human silhouette)
- `GhostChromatic2` — translucent particle-filled ghost, chromatic aberration on edges
- `GlassThin` — thin refractive glass sculpture
- `GlassThick` — solid heavy glass form
- `GlassScan1` / `GlassScan2` / `GlassScan3` — three styles of scan-line / fragmented glass
- (E520 reveals) `DepthCubes` with a runtime LOD randomizer — VFX Graph mesh particles fed by live depth buffer, audio-reactive trigger script flips LOD level on beat

### `VFX:` slot (the additional particle layer on top)
- `Clones Audio Drop Bright` — beat-snapshot clone with gravity drop + speed-to-brightness boost (the headliner)
- `Particle Clone` (single colour, mirror silhouette only)
- `Particle Clones Audio` (multi-clone audio variant — what gets ringed in E479's kaleidoscope)
- `Swirly Particles` family (E509, E512, E514, E516) — floor-spawn vortex particles around the user

### `Lighting:` slot (every lighting rig has a name — copy these)
- `FogSpotLeftRight1` — two fog spotlights, sides
- `FogSpotLeftRight2` — variant of the above (different colour/intensity)
- `FogSpotRight` — single fog spot from right
- `FogSpotOverhead` — single fog spot from above
- `FogPointOrbitPulse` — pulsating point lights orbiting the figure (E521 shows a strong red orbiting one)
- `BrightRoom` — neutral bright fill
- `SpotsLeftRightWithFill` — dual side spots + fill
- `None` — no realtime lights, only emissive particles + depth projection (E516 verbatim: "looked interesting without any realtime lights because the emissive particles and live 3D depth projection makes it look like solid shadow/negative space punch through.")

### `Background:` slot
- `TestRoomDark` — dark gridded test environment
- `StudioBG_Grey` (from prior playbook)
- (sunset / salt flats — recent only)

### Critical UX rule: every preset list ENDS with "None" / "Off"
> E516 verbatim: "Cycling through test lighting presets and the last is always 'None' (same for the script for cycling through depth visuals, VFX, backgrounds etc — always allow for 'Off' to be an option)"

→ For LUME `LumeVfxEditor.cs`: every preset enum's last entry MUST be `None`. The "Off" state is a feature, not a bug. The negative-space look that emerges from `Lighting=None + emissive depth particles` is its own aesthetic.

---

`VFX:` slot (the additional particle layer on top)

_From `lume-duncan-playbook-chunk-DT-DS.md`_

  • `Clones Audio Drop Bright` — beat-snapshot clone with gravity drop + speed-to-brightness boost (the headliner)
  • `Particle Clone` (single colour, mirror silhouette only)
  • `Particle Clones Audio` (multi-clone audio variant — what gets ringed in E479's kaleidoscope)
  • `Swirly Particles` family (E509, E512, E514, E516) — floor-spawn vortex particles around the user

---

NEW: Human Kaleidoscope mode (E475, E476, E479)

_From `lume-duncan-playbook-chunk-DT-DS.md`_

A mode not present in the recent reels at all. Worth adding to LUME Wave 4/5:

  • 16-clone radial ring around centre — N=16 is his settled number. Tested 20/24/32, "makes it even harder to read the human form."
  • Each clone is a rotational copy of the live depth silhouette
  • Slow top-level rotation of the entire ring
  • LOD mesh switching to push more clones (tunnel formation in E476)
  • E479 stacks a SECOND ring of new-colour clones snapshot every second, falling inwards into turbulence — he's doing temporal stacking on top of spatial mirroring
  • He explicitly rejected per-clone twist: "additional twists ... too much variance and makes the shape much harder to read."

LUME design rule from this: when stacking visual transforms, ONE rotational symmetry is enough. Don't compound symmetries; pick one and let temporal evolution do the rest.

---

Evolution arc (E475 → E521)

_From `lume-duncan-playbook-chunk-DT-DS.md`_

Reading the captions in chronological order surfaces his actual learning curve:

1. E475–E479 (DS, Human Kaleidoscope): Form-mirroring spatial symmetry. Discovers 16-clone is the readability sweet spot. Rejects per-clone variance.
2. E483–E491 (DS, Audio Particle Clones): Pivots from spatial to temporal (snapshots on beat). Discovers speed-to-brightness as the alive-feeling parameter. Discovers blend-shape→fluid-sim feedback loop.
3. E494 (DS, Metaball Lighting): Tests material variants against lighting rigs. Settles on opaque core (slime) over fully translucent for shape readability under strong backlight.
4. E500–E504 (DT, Turntable Snapshots + Mic Input): Productionizes the input path (mic) and viewing tools (debug camera turntable for face closeups + multi-angle review).
5. E509–E516 (DT, Swirly Particles): Iterates spawn topology (floor-spawn discovery) and audio-axis mapping (XZ-twist vs Y-lift bulges). Establishes "always have an Off entry" rule.
6. E519–E521 (DT, Chromatic Glass + Lighting Rigs): Decouples Depth shader from VFX layer; cycles through 8+ named lighting presets in one demo. The system becomes operator-friendly.

Key finding: between E479 and E521 he transitioned from a single hand-crafted demo per reel to a swappable preset matrix (Depth × VFX × Lighting × Background). This is the design pattern LUME should aim for from Wave 2 onwards. The earlier work was bespoke; the later work is a control surface.

---

Direct mappings to LUME files

_From `lume-duncan-playbook-chunk-DT-DS.md`_

### Wave 1 (Sat-blocking) — adjustments based on this chunk
- `LumeAudioReactor.cs`: 4 EQ'd frequency bands (not RMS+3); bass→low-freq position offset, mid/high→high-freq position offset, drive position not force.
- `LumeAudioReactor.cs`: add `speedToBrightness` boost with power curve + threshold; tune live by ear (not preset).
- Mic-capture as dev default, not line-in.

Wave 2 — `LumeVfxEditor.cs` data model (UPDATE from prior playbook)

csharp
enum DepthPreset { GhostChromatic2, GlassThin, GlassThick, GlassScan1, GlassScan2, GlassScan3, DepthCubes, None }
enum VfxPreset { ClonesAudioDropBright, ParticleClone, ParticleClonesAudio, SwirlyParticles, KaleidoscopeRing16, None }
enum LightingPreset { FogSpotLeftRight1, FogSpotLeftRight2, FogSpotRight, FogSpotOverhead, FogPointOrbitPulse, BrightRoom, SpotsLeftRightWithFill, None }
enum BackgroundPreset { StudioBG_Grey, TestRoomDark, Sunset, SaltFlats, None }
enum SpawnTopology { FloorPlane, BodyVolume, CeilingPlane, WallPlanes }
enum NoiseAxisMode { XZ_Twist_Contained, Y_Lift_With_LowFreqBulges }
// ALL enums must end in `None` or equivalent off state

Wave 3 — `LumeCloneSnapshot.cs` timing constants (NEW — locked from E491 self-critique)

csharp
const float kSnapshotHoldDuration = 0.25f;  // hold pose for 250ms
const AnimationCurve kGravityEaseIn = ...;  // ease into gravity, don't snap
const float kSpeedToBrightnessThreshold = ...;  // tune live; below = no twinkle
const float kSpeedToBrightnessPowerCurve = ...;  // tune live; too high = blowout

Wave 4 — `LumeKaleidoscope.cs` (NEW — was missing from prior playbook)

csharp
const int kCloneCount = 16;          // settled value
const float kRingRotationSpeed = ...; // slow top-level only
// DO NOT add per-clone twist — Duncan rejected this for readability
// Optional: temporal stacking (E479) — second ring of new-colour clones every 1.0s, falling inwards

### Wave 5 — physics + collision rules (E488)
- particles MUST NOT cast shadows OR must collide against a layer-filtered depth buffer
- gravity + collision alone = visually dead → ALWAYS layer fluid-sim kick + turbulence

---

Wave 4 — `LumeKaleidoscope.cs` (NEW — was missing from prior playbook)

_From `lume-duncan-playbook-chunk-DT-DS.md`_

csharp
const int kCloneCount = 16;          // settled value
const float kRingRotationSpeed = ...; // slow top-level only
// DO NOT add per-clone twist — Duncan rejected this for readability
// Optional: temporal stacking (E479) — second ring of new-colour clones every 1.0s, falling inwards

---

Effect taxonomy (catalogued across 72 reels — all families)

_From `lume-duncan-playbook.md`_

### A. Metaball / liquid / blobby family (E461, E462, E468, E593, E595)
- "Blobby guys" with material variants: slime, water, pink energy, oily, chrome/mercury
- HDRP compute thickness + translucent materials = the depth/turntable look
- Inverse compute-thickness mode (E468): alpha ∝ (1−thickness), neon-edge look + glowing wall decals
- Twin-mesh nested MC (E427): inner gold + outer glass, same particles, two surface thresholds
- LUME equivalent: URP doesn't ship compute thickness. Approximate with screen-space SDF metaball shader (cheap, ~80

### B. Bullet-time / freeze-snapshot family (E536, E599, E595, E604)
- Audio-transient trigger (clap/snap) → pause → swap to debug orbit camera → 1 full orbit with ease-in/out curve → swap back → unpause
- "In-place slowmo with screen-warping" alternative (no camera spin — for wall installs)
- Beat-triggering of clone snapshots stays active during bullet-time — no "down time"
- LUME: `LumeBulletTime.cs` + `LumeCloneSnapshot.cs`. Wave 3.

### C. Clone / dissolve / multi-self family (E483, E488, E491, E598, E604)
- Frozen poses captured as red snapshots, layered with live purple/orange depth mesh
- Snapshot timing locked: `holdDuration = 0.25s` then ease-in to gravity (E491 verbatim self-critique)
- Drop-physics rules from E488:
- Particles MUST NOT cast shadows (or use layer-filtered depth buffer) — self-collision turns it into a mess
- Pure gravity + collision is visually dead — ALWAYS layer fluid-sim kick + turbulence on top
- "Don't quit at the first disappointing test" — verbatim
- Dual-channel: red snapshots (frozen) vs live purple/orange mesh (current)
- LUME default: both layers, with slider to toggle live-depth opacity 0-1

### D. Sunset / infinite plane / planar reflection (E605)
- "Sunset" lighting preset = warm directional + atmospheric haze
- Infinite plane (procedural ground) with planar floor reflection — but toggleable because it's a known perf hit (E532)
- "Bolivian Salt Flats" environment ambition
- LUME: URP planar reflection probe + procedural ground shader + warm-tone post-processing volume. `LumeFloorReflection.cs` togglable.

### E. Motion-sparks / particle-burst family (E579, E587, E589)
- Surface shader audio reaction: brightness flash on beat
- Surface shader motion reaction: fresnel pulled down where motion occurs
- Particles: hue cycle + per-spawn hue-shift by RGB luma + size/glow fade by speed + speed-driven hue shift
- "Music on/off" toggle is part of his demo (E587) — proves audio-reactivity is opt-in, not always-on

### F. Maximalism stress-test (E599)
- Pushed fluid forces and particle count/lifespan to the limit
- Caption: "sometimes more is more" — he likes the busy look, not the minimal
- LUME tuning: don't be conservative on particle count. Aim high then dial back.

### G. Logo / wordmark as 3D VFX volume (E527-E531, E544, E470, E489)
NEW family from DV-DU + DR-DQ chunks. Logos are not static overlays — they are 3D volumes that become particle obstacles, spawn surfaces, "punch through" reveals, AND audio-reactive blendshape drivers:

  • E530 "Punch Through": invisible logo + inverted-obstacle fluid sim → particles thrown out of letter shapes, leaving the user visible through gaps. "High fluid influence throws particles out of the logo letters, and no particle kill for zero velocity, so particles get stuck in non-fluid-flow area."
  • E528 cymatics: ShortThrow fluid sim + logo letters → particles "stuck" on letters bouncing internally → almost cymatic (Chladni-plate) pattern.
  • E544 "Blocky PinScreen Revisit": HOLOVIS text reacts volumetrically — "interactive text displayed and reacts volumetrically to the user's movements, allowing the user to walk through or displace the letters."
  • E489 wordmark feedback loop (CRITICAL): wordmark uses BlendShape inflation driven by FFT bands → blendshape inflation generates motion vectors → motion vectors get injected into fluid sim → fluid sim pushes nearby particles. The wordmark BECOMES part of the audio-reactivity loop, not just an overlay.
  • E470 power-curve emission gating: HDRP compute-thickness → screen-space buffer → tight power curve `pow(thickness, k)` with `k≈6-10` → bistable letter glow (dark, then suddenly glow at threshold). Cleaner than `emission *= audioRMS`.

LUME mapping: KOATJI / LUME wordmark becomes a 3D extruded SDF that the depth-camera point cloud can punch through, with particles spawning along the letter surface. Build `LumeWordmarkInflator.cs` + tight power-curve emission gating in shader.

### H. Pinscreen / cube-grid VFX (E544, E545)
NEW family.
- Regular grid of small cubes locked into XY position
- Z-position pushed by reprojected depth + fluid-sim dye buffer
- Two-tone shading: front-facing white plastic; rear-facing gold (or accent)
- Transparent variant uses HDRP thickness for transmission color
- Cleaner alternative to point-cloud particles. Less "swarmy", more "architectural". Single mesh, instanced grid, vertex shader displaces by depth. Cheaper than per-pixel particles. Wave 2 add.

### I. Strip-particle / kelp / boids family (E546-E549, E556-E557)
NEW family.
- VFX Graph particle strips (= ribbon particles) used as kelp strands
- Per-strip stiffness; motion/forces propagated parent→child
- Spectrum-mapped vertical audio response (E557): map FFT bin index → vertical Y position on strip particle. Bass drives bottom leaves, treble drives top leaves.
- Boids variant: Reynolds boids sim with audio params on cruising speed and separation.
- "Wobbly Lads" feedback gotcha (E556): bidirectional sim coupling = feedback loop. Pick one direction.
- LUME relevance: kelp aesthetic is niche, but the strip-particle physics primitive is broadly useful (tendrils, smoke ribbons, hair). Wave 4-5.

### J. SuperHot motion-gated fluid sim (E567, E568)
NEW killer mode. Verbatim:
> Utility script hooks user motion (from depth camera) to fluid sim timescale with a fairly quick smoothing/falloff — so a bit like SuperHot, where the sim only updates/moves when you move.

Implementation:
- Compute scalar motion level from depth-camera frame-to-frame delta (smoothed via one-euro filter — name-checked E567)
- Map motion level → fluid sim's local timescale (NOT `Time.timeScale` — fluid has own dt)
- Lower-threshold → "no motion = fully frozen sim"
- Per-install threshold tuning (depth noise prevents reaching zero when user is far)

Killer feature for bar/lounge installs — when nobody moves, visuals freeze into a sculpted form. When the room moves, it comes alive. Wave 2-3.

### K. Frozen velocity buffer (E560, E567, E568)
NEW mode, distinct from SuperHot. Found accidentally and kept:
> Stopped Unity editor playback and the fluid sim stops updating but the buffers don't get cleared (as they exist in asset database), so the particle VFX continue to update and the particles follow the frozen sim velocity buffer paths. This creates frozen forms in the motion paths that you don't get while the sim is updating.

Distinct mechanism: SuperHot pauses sim time when user is still; this freezes the velocity field while particles keep flowing through it. Result: laminar streams along etched-in paths. Implement as a `FreezeVelocityField` toggle on `LumeMotionGatedFluidSim`.

### L. Human Kaleidoscope (E475, E476, E479, E469, E471, E472)
NEW mode (entirely missing from v1).
- 16-clone radial ring around centre — N=16 is settled value (tested 20/24/32, "harder to read the human form")
- Each clone is rotational copy of live depth silhouette
- Slow top-level rotation of entire ring
- LOD mesh switching to push more clones (tunnel formation in E476)
- E479: SECOND ring of new-colour clones snapshot every second, falling inwards into turbulence — temporal stacking on top of spatial mirroring
- Explicitly rejected per-clone twist"too much variance and makes the shape much harder to read"
- E472 extends to full body so legs participate
- DR-prefix variant uses chrome / matte material toggle + reflection probe in middle of symmetry

LUME design rule from this: when stacking visual transforms, ONE rotational symmetry is enough. Don't compound symmetries; pick one and let temporal evolution do the rest.

`LumeKaleidoscope.cs` Wave 4 deliverable. Cheap to ship — single render texture + N copies rotated by `360°/N`.

---

L. Human Kaleidoscope (E475, E476, E479, E469, E471, E472)

_From `lume-duncan-playbook.md`_

NEW mode (entirely missing from v1).
- 16-clone radial ring around centre — N=16 is settled value (tested 20/24/32, "harder to read the human form")
- Each clone is rotational copy of live depth silhouette
- Slow top-level rotation of entire ring
- LOD mesh switching to push more clones (tunnel formation in E476)
- E479: SECOND ring of new-colour clones snapshot every second, falling inwards into turbulence — temporal stacking on top of spatial mirroring
- Explicitly rejected per-clone twist"too much variance and makes the shape much harder to read"
- E472 extends to full body so legs participate
- DR-prefix variant uses chrome / matte material toggle + reflection probe in middle of symmetry

LUME design rule from this: when stacking visual transforms, ONE rotational symmetry is enough. Don't compound symmetries; pick one and let temporal evolution do the rest.

`LumeKaleidoscope.cs` Wave 4 deliverable. Cheap to ship — single render texture + N copies rotated by `360°/N`.

---

Architectural primitives (extracted from his patterns)

_From `lume-duncan-playbook.md`_

The chunks revealed several primitives Duncan implements as separate classes/services. LUME should adopt the same:

### `LumeFluidSim2D` — universal middleware (E421 verbatim)
> Most things I make end up going through the fluid sim at some point or other lol.

Treat as shared service, not per-effect component. Optical flow / audio impulses / depth motion / wordmark blendshape all feed the fluid; each VFX preset reads from the fluid as input. Confirms our Evo3 explore-findings recommendation to fork StableFluids.

### `ILumeSpawnSource` — leapfrog his TODO (E536 verbatim)
> Need to rewrite spawning buffers to use entire screen (not just depth camera point cloud) so can easily spawn particles on/in eg logos, metaballs or other geometry.

He flagged this as architectural TODO he hasn't shipped. LUME builds it from day 1:

csharp
interface ILumeSpawnSource {
    Texture2D GetSpawnMaskSDF();    // signed-distance source
    Vector3 GetWorldOffset();
    float GetIntensity();
}
class DepthPointCloudSource : ILumeSpawnSource { ... }
class LogoSDFSource : ILumeSpawnSource { ... }
class MetaballSDFSource : ILumeSpawnSource { ... }
class PaintingMaskSource : ILumeSpawnSource { ... }
// Compose multiple via union/intersection

Explicit advantage over copying his current impl.

### `LumeFluidDriver` — animatable source rig (from E468 hidden blue-fish pattern)
Any rig (skeleton / cube / fish mesh) emits source particles into the fluid grid. Animate the rig, fluid follows. His pattern for "getting the metaball fluid sim to follow a path."

`LumeMotionGatedFluidSim` — SuperHot + FreezeVelocityField modes (above)

### `LumeWordmarkInflator` — audio-reactive blendshape feeding fluid sim (E489)
- BlendShape inflation driven by FFT bands
- Inflation generates motion vectors → fluid sim
- Tight power-curve emission gating (`pow(thickness, k)`, k=6-10)

`LumeKaleidoscope` — 16-clone radial ring (E475-E479, E469-E472)

### `LumeRecorder` — internal 4K MP4 capture on operator hotkey (E460 has built-in recording indicator)
Massively improves demo-clip turnaround for marketing/social.

### `LumeFluidPhysicsRules` — drop-physics rules (E488)
- Disable depth-buffer self-collision when particles cast shadows
- Pure gravity+collision = boring; ALWAYS layer fluid-sim kick + turbulence
- Couple sim systems unidirectionally — "pick one direction" or feedback loop

---

`LumeKaleidoscope` — 16-clone radial ring (E475-E479, E469-E472)

_From `lume-duncan-playbook.md`_

---

Self-critiques worth borrowing as LUME design principles

_From `lume-duncan-playbook.md`_

  • E534: "Plexus links almost invisible so I need to figure out how to match brightness with the source/linked particles." → emissive consistency between primitives is its own bug class
  • E535: "Not very noticeable so needs more definite/large change in motion, but without it going crazy and losing coherence." → audio-transient response: read clearly without losing form coherence
  • E548: "Pretty huge fail when I finally check some footage of real kelp and realise mine looks bugger all like an actual kelp forest. I think I must have had some kind of Spongebob cartoony swishy stuff in mind." → reference-check before lookdev
  • E556: "Otherwise it would feedback and he'd go apeshit." → coupled sim systems: pick one direction
  • E567/E568: "Probably easiest to expose in settings and debug menu to allow for tweak values for each install individually." → ship per-install settings as first-class architecture, not afterthought
  • E516: "Always allow for 'Off' to be an option." → every preset enum ends with `None`
  • E488: "Another lesson to myself to push past the disappointing failures and keep digging to see if there's anything there." → don't quit at first disappointing test
  • E521 / E479 evolution arc: Duncan transitioned from bespoke per-reel demos to a swappable preset matrix (Depth × VFX × Lighting × Background). LUME should target this pattern from Wave 2 onwards. Earlier work was bespoke; later work is a control surface.
  • #normalizefailure — he tags failures and shows them. Authenticity move worth borrowing for LUME devlog culture.

---

Promotion Decision

Keep in the searchable backlog until it intersects a live paper or system.

Source Anchor

lume-commerce/hardware/reference/duncan/analyses/E479-noreel.md

Detected Structure

Method · Figures · Architecture