Epic 5 Phase 1 — form is a mesh, actors have parity with SDF
meshes.js now mirrors shader-contract.js verbatim: - jsCastSDF rotates by -tilt (matching GLSL column-major mat2), hollow excluded during outer-radius search so annular SDFs sample correctly, radial search probes without hollow then punches hole separately. - castShape samples 64 segments, inner hole scaled by hollow width. - formToGeometry uses formDepth (u_formDepth = r.z*depth half-extent), capsule h correctly half-height, sphere as scaled unit sphere, prism extruded with proper halfDepth and centered; bevel thickness from part.round. - actorToGeometry preserves per-part op/blend userData, uses YXZ Euler for yaw/pitch (matches formRot), mirrors radial/mirror/stack symmetry exactly as shader formFold does. Shared camera wired live: Show.renderFrame drives Compositor.updateSharedCamera from ArcDriver framing/personality/time and injects sharedCamera into each active ModelLayer — pure f(frame,look) so seek === playback. ArcDriver exposes framingForFrame helper. Gates: lint 107 clean / 70 literals / 68 scenes green; vite build 294 modules; deterministic actor geometry smoke-tested (same seed same vert count, hollow handling, fallback). Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -816,6 +816,16 @@ export class ArcDriver {
|
||||
return null;
|
||||
}
|
||||
|
||||
/** Framing + personality for a frame, for the shared perspective rig. */
|
||||
framingForFrame(frame) {
|
||||
return this._framingAt(this._cueIndexAt(frame), frame);
|
||||
}
|
||||
|
||||
personalityForFrame(frame, story) {
|
||||
const s = story ?? (this.look.story ? storyStateAt(this.look.story, frame) : null);
|
||||
return this._personalityAt(s);
|
||||
}
|
||||
|
||||
/** Push a palette change through without rebuilding layers. */
|
||||
setPalette(palette) {
|
||||
this.look.palette = palette;
|
||||
|
||||
Reference in New Issue
Block a user