diff --git a/logs/laneB.md b/logs/laneB.md index 683aacb..0ba3693 100644 --- a/logs/laneB.md +++ b/logs/laneB.md @@ -8,4 +8,54 @@ Format per session: BLOCKED/REQUESTS: … NEXT: … -(no sessions yet) +## 2026-07-18 session 1 +DONE: M1 complete. All files under `scenegod/web/`. + - `timeline.js` — model + clock, no DOM, no three import (self-contained + quat/euler/slerp math so `node` can run it). `load/toJSON` lossless + round-trip (unknown entity fields preserved via structuredClone + a + WeakMap for cached quats). `evaluate(t)`: transform (pos/scale lerp, rot + slerp→euler, easing incl. step-hold), params (num lerp, color sRGB lerp), + clip blocks (set-time exact scrubbing, fade-out ramp), camera cuts (fires + only on change). Clock: `play()` rAF deltas, `seek` clamp, `step(frame)` + pure/deterministic for Lane C render. Mutators addKey/moveKey/deleteKey/ + addClipBlock/moveClipBlock/trimClipBlock/addCut + undo stack (`undo()` + wired; Ctrl+Z hooked in tlui). `capturekey` window listener present. + Clips need `await tl.preload()` before evaluate (prepareClip is async). + - `tlui.js` — canvas panel into `#timeline`. Ruler scrub, drag playhead, + space=play/pause, dblclick lane=add key from stage state, drag key (snap + to frame, Alt=free), right-click=delete, drag clip block/edge, Home/End, + Ctrl+Z. Scene bar name/dur + Save/Load (POST/GET `/scenes/{name}`, + localStorage fallback). Names column auto-syncs to `stage.entities()` via + `onChange`. + - `stagestub.js` — full §4.2 Stage as plain objects; records effects into + `stage.applied[]`. Dev-only, delete at SYNC 1. + - `timeline_test.mjs` — `node scenegod/web/timeline_test.mjs` → green + (midpoint interp, step-ease hold, clip local time @3 frames, camera flip, + lossless round-trip, unknown-field preservation). + - `tldev.html` — dev-only browser harness. Verified in browser: scrub moves + entities (interp live in log), play runs to duration + auto-stops, camera + cut flips camA→camB at t=3, keys/clips/cuts render. Delete at SYNC 1. +DECISIONS: + - Timeline imports NO three.js — inlined euler↔quat + slerp (~30 lines) so + the node self-check needs zero deps (there is no node_modules/three in + this stack). setTransform rot is euler (matches entityTransform format). + - One `` for all lanes (not canvas-per-lane); hit-testing via a + hitbox list rebuilt each draw. Simpler, fast enough at this scale. + - CSS injected from tlui.js via a `