@@ -58,3 +58,53 @@ Notes:
5858 ~ 6.6 s/frame on the scalar path (no AVX target-cpu in the scratchpad project);
5959 correctness verified by viewing the rendered frames.
6060- Colours: golden-angle hue per structure at S=0.34 V=0.78 (muted, per request).
61+ - Brush: splat3d render uses gaussian scale 0.0025 (was 0.008 — the big isotropic
62+ brush blobbed the detail into a "Warhol" look; 0.0025 at 810x1080 restores the
63+ ribcage/vertebrae). Frames re-rendered.
64+
65+ ## Follow-up PR — anisotropic + GUID-tag + map (branch claude/torso-anisotropic-map)
66+
67+ - [x] ** SPL2 format** (supersedes SPL1): hdr 40B [ ` SPL2 ` |count|node_count|radius|
68+ bbox] ; body 21B [ pos 3f | normal 3i8 | rgb 3u8 | opacity u8 | node_row u16] .
69+ Helix-orderable + residual-ready (the codec PR slots in here).
70+ - [x] ** Anisotropic surface-fit gaussians** ("connect the dots"): bake reads OBJ
71+ ` vn ` (BodyParts3D ships normals — free, no face traversal); render driver
72+ orients each gaussian flat-to-surface (` scale=[t,t,thin] ` , ` quat ` aligns
73+ local-z to the normal). Tangent 0.004 connects within a structure while
74+ rib gaps stay visible. NOT voxels (continuous surfaces, not a discrete grid).
75+ - [x] ** Per-node SoA + O(1) switch** (the GUID/value-tenant backbone): bake emits
76+ ` torso.nodes.json ` — one row per FMA structure (178 rows, 91 own meshes):
77+ fma id, name, depth, HHTL tier-ranks, colour, gaussian RANGE (start+count),
78+ OBJ-geometry tenant (centroid + bbox + FJ handles). Each gaussian carries
79+ its node_row. Consumers build the switch (row -> node) once -> O(1) tenant
80+ reads. Position = real BodyParts3D coordinate; identity = the FMA node.
81+ - [x] ** /torso-map page** : click a gaussian -> node_row -> node SoA -> FMA label +
82+ partonomy breadcrumb; structure list (graph -> splat) highlights gaussians.
83+ Realises the osint-cad-splat thesis: graph and splat, one node at one address.
84+ - [x] tsc clean. Browser pick-interaction not exercised here (raycast-on-Points
85+ logic is standard; geometry verified via the CPU frames).
86+
87+ ## Helix-anchor codec — MEASURED (branch claude/torso-helix-codec)
88+
89+ ` tools/spl_codec.py ` encodes SPL2 -> SPL3 and round-trips it. The x265-for-
90+ gaussians design, mapped to signals already in SPL2 + the node SoA:
91+ helix = 3D Morton (Z-order) of position = identity/GUID order (locality-preserving)
92+ anchor = FMA node (SoA centroid + per-node colour) = the I-frame, random-access
93+ motion = gaussian offset from its node anchor (the motion vector)
94+ residual = helix-ordered zig-zag delta of (motion, normal)
95+ colour = ANCHOR-PREDICTED -> 0 per-gaussian bytes (a 178-entry node palette)
96+
97+ Measured on the real torso (231,515 gaussians):
98+ - SPL2 21.0 B/g -> SPL3 7.47 B/g => ** 2.8x smaller** (zlib entropy stand-in)
99+ - colour: ** exact, 887 B total** for ALL colour (crisp by construction, no bleed)
100+ - position round-trip RMSE ** 0.00001** (16-bit quant, effectively lossless)
101+ - node_row RLE 35 KB / 231K gaussians (structures contiguous in helix order)
102+ - stream split: motion 1.02 MB, normal 671 KB (the optimization target -> octahedral
103+ + range coder), rows 35 KB, palette 887 B
104+
105+ Validates the design before wiring it into the render. Next increments:
106+ - [ ] octahedral normals + range coder (the 671 KB normal stream)
107+ - [ ] decode SPL3 at cockpit load; anisotropic/edge-aware reconstruction
108+ (node_row-bounded + normal-oriented = crisp colours in the render)
109+ - [ ] animation: deform node anchors -> motion-skinned gaussians follow
110+ (Motion-Blender GS; the partonomy is the rig)
0 commit comments