OverviewFilesCommitsIssuesDocsReleasesPeers

hypercore-kb commits / 5f2139b

skills/blender-bridge + proc-nodes: the ledger is 0, and the primitives carry Blender's faces
Follows b86ccde, same day. Measured again after the work rather than assumed: audit_missing_sockets now reports 0 of 101 mapped types, where this morning it read 5 and #63 read 17. - the primitives' faces are Blender's, ported from its source: cuboid at any subdivision, the circle's three fill types, the uv sphere's pole fans and quad bands, the cylinder's fills and side rings - fill_type is a PROPERTY that changes the VERTEX COUNT, and it never crossed the bridge at all until today - the ico sphere's uv is a TABLE, not a projection -- recorded with the measured number that disproved the projection (0.300001 against Blender's 0.181819) - Top / Side / Bottom live on a domain the FILL decides - ⚠ the source tree on disk is 5.2 ALPHA (March) while the binary is 5.2.0 LTS (July): read the source for the algorithm, keep the binary as the judge - ⚠ Blender REMOVES sockets by mode, one level up from "do not filter on enabled" - ⚠ audit_socket_names.py walks INPUTS ONLY, so its 90.3% said nothing about the five missing output sockets. Two audits, two questions. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
5f2139b45f112ed8e3d45d3baf15905da5be312e
by plankatron <fleeky@gmail.com> · 2026-09-05T20:37:05.000Z

Changed files (2) +94 -15

.claude/skills/blender-bridge/SKILL.md +55 -11
……@@ -25,9 +25,9 @@ claim to the user (hyper-games #63 Part 3). Re-run, do not quote.
25253. Rebuild C++ AFTER the bump — **all three targets**, see Build
26264. .so is **symlinked** to hyper-tps (no copy needed)
2727
28**Current version: 0.80.0** (branch: `sdf-volume-bridge`, HEAD `d0efc30`,
29**49 commits unpushed** to `bare` as of 2026-09-05; proc-nodes carries 38 of its
30own on `heightmap-erosion-toggle`, HEAD `be03703`)
28**Current version: 0.81.0** (branch: `sdf-volume-bridge`, **52 commits
29unpushed** to `bare` as of 2026-09-05; proc-nodes carries 40 of its own on
30`heightmap-erosion-toggle`)
3131
3232## Where things are
3333
……@@ -252,10 +252,9 @@ input, matching Blender.
252252
253253Measured 2026-09-05, not quoted:
254254
255- **The ledger is 5 of 101 mapped types**, down from 52. All five are mesh
256 primitives (`audit_missing_sockets.py` prints them). ⚠ #63 says "all of them
257 UV Map outputs" — the audit says otherwise: `MeshCylinder` is `1 < 5`, missing
258 **Top, Side, Bottom** as well as UV Map. The other four are UV Map alone.
255- **The ledger is 0 of 101 mapped types** (52 -> 17 -> 5 -> 0). ⚠ #63 said the
256 last five were "all of them UV Map outputs"; the audit said otherwise —
257 `MeshCylinder` was `1 < 5`, missing **Top, Side, Bottom** as well.
259258- **UNRESOLVED is 0.** The five remaining unmatched proc sockets are GODOT-ONLY
260259 and deliberate: kept AFTER Blender's last socket so they cannot displace a
261260 real one, and unreachable by any Blender index.
……@@ -792,7 +791,13 @@ Measured 2026-09-05, Blender 5.2.0, proc-nodes `be03703`:
792791| sockets by INDEX (fallback, type agrees) | 25 (8.1%) |
793792| GODOT-ONLY (past Blender's last socket) | 5 (1.6%) — `CurveToMesh:Resolution,Closed`, `DistributePointsOnFaces:Count`, `RepeatZoneInput:Geometry`, `SimulationZoneInput:Geometry` |
794793| **UNRESOLVED** (dropped at runtime) | **0** |
795| missing-socket ledger | **5 of 101 types** — `MeshCube`, `MeshGrid`, `MeshIcoSphere`, `MeshUVSphere` each missing `UV Map`; `MeshCylinder` `1 < 5`, also missing `Top`, `Side`, `Bottom` |
794| missing-socket ledger | **0 of 101 types** — closed 2026-09-05 |
795
796⚠ **`audit_socket_names.py` walks INPUTS ONLY** (`n.inputs`, line 80), so
79790.3% says nothing about output sockets. Every UV Map, and the cylinder's Top /
798Side / Bottom, were invisible to it — `audit_missing_sockets.py` is the one that
799covers them. Two audits, two different questions; quoting one for the other is
800how five missing outputs sat behind a 90% number.
796801
797802⛔ **The old text here said the two zone `CUSTOM` sockets "may not be
798803representable, so the realistic floor is 2, not 0".** That was never measured
……@@ -811,6 +816,41 @@ and doing so reported three of `PerlinNoiseNode`'s sockets as wrong when that
811816node matches Blender exactly. Those three were queued for DELETION to satisfy a
812817number the tool got wrong.
813818
819## The primitives carry Blender's FACES (2026-09-05)
820
821#63 listed the UV outputs as "now unblocked" and quads as a separate later item.
822Measured, three of the five were blocked ON the quads: a per-corner UV has
823nothing to line up with while the corner domain disagrees.
824
825 cube 8 verts / 36 corners / 12 faces vs Blender 8 / 24 / 6
826 uv sphere 10 / 48 / 16 vs 10 / 40 / 12
827 cylinder 8 / 36 / 12 vs 8 / 24 / 6
828 circle 5 / 9 / 3 vs 5 / 5 / 1 (n-gon)
829
830Ported from Blender's own source, not derived — `mesh_primitive_{cuboid,
831cylinder_cone,uv_sphere}.cc`, `node_geo_mesh_primitive_circle.cc`, and
832`bmo_primitive.cc` for the ico sphere. ⚠ **The source tree on disk
833(`/storage/projects/code/godot/blender-source`) is 5.2 ALPHA, March 2026; the
834binary is 5.2.0 LTS, July.** Read the source for the algorithm, keep the BINARY
835as the judge — #62 was bitten by exactly this on vector MODULO.
836
837- **`fill_type` is a PROPERTY and it changes the vertex count.** A triangle fan
838 appends the centre as the LAST vertex, an n-gon is one face, None has none. It
839 was never serialized, so every bridged circle and cylinder took proc-nodes'
840 own default fill whatever Blender showed. Both directions now carry it.
841- ⛔ **The ico sphere's UV is a TABLE, not a projection.** BMesh's spherical
842 unwrap (`u = 0.5 + atan2(y,x)/2pi`) is what the UV SPHERE uses; ported onto the
843 ico sphere it gives corner 0 u = 0.300001 against Blender's 0.181819. Blender
844 ships a hand-made 60-entry net (`icouvs`).
845- **Top / Side / Bottom live on a domain that depends on the fill** — faces when
846 the end has one, points when it is a tip or unfilled.
847- ⚠ **Blender REMOVES sockets by mode.** A cylinder with `fill_type` NONE has no
848 `Fill Segments` socket at all, and setting it unconditionally crashes a
849 harness. This is the same lesson as "do not filter on `enabled`", one level up.
850- ⛔ NOT done: an ico sphere above subdivision 1. The mesh is a BMesh
851 edge-subdivide whose vertex order belongs to that operator — 162 verts / 320
852 faces against Blender's 42 / 80.
853
814854## Completed Phases
815855
816856- Phase 1-2: Geometry sync, transforms, UVs, materials, jitter, auto-reconnect, geometry nodes
……@@ -836,6 +876,10 @@ number the tool got wrong.
836876 Math, Mix, Wave + Vector Rotate, mesh primitives); the graph FRAME marked at
837877 the bridge instead of converting values; ledger 52 -> 17
838878- v0.68.0-v0.80.0 (#63): ramp and curve DATA both directions; the edge domain;
839 quads; multi-input as a socket kind; item lists and zone pairing; the
840 attribute family typed for all nine `data_type`s; ledger 17 -> 5, UNRESOLVED
841 6 -> 0, socket-by-name 81.7% -> 90.3%
879 the grid's quads; multi-input as a socket kind; item lists and zone pairing;
880 the attribute family typed for all nine `data_type`s; ledger 17 -> 5,
881 UNRESOLVED 6 -> 0, socket-by-name 81.7% -> 90.3%
882- v0.81.0 (2026-09-05): cross-domain field adaptation, all twelve directions,
883 every rule measured; the grid's FACE order; quads for cube, circle, uv sphere
884 and cylinder; `fill_type` crossing both ways; all five UV Map outputs and the
885 cylinder's three selections — **ledger 5 -> 0**
.claude/skills/proc-nodes/SKILL.md +39 -4
……@@ -7,7 +7,7 @@ to Vulkan compute, and exports a node graph as a standalone GLSL density
77function for dc-terrain.
88
99**Verified 2026-09-05** against Godot 4.7.beta custom `3bb2c0245`, branch
10`heightmap-erosion-toggle` at `be03703`, **38 commits unpushed** to `bare`.
10`heightmap-erosion-toggle`, **40 commits unpushed** to `bare`.
1111Every count below was produced by running the dump or grepping the tree today.
1212
1313## When to Use
……@@ -137,12 +137,47 @@ edges. Measured today:
137137 edge.
138138- **`face_offsets` is load-bearing**: `has_ngons()` / `face_start()` /
139139 `face_size()` group the corner array into ngons, and `triangulated_indices()`
140 is the fan for rendering. Only `MeshGrid` emits quads so far; the other six
141 primitives still triangulate, and operations that change topology still clear
142 `face_offsets` — correct today only because what they produce IS triangles.
140 is the fan for rendering. **Cube, circle, uv sphere, cylinder and grid all
141 carry Blender's own faces now** (2026-09-05); operations that change topology
142 still clear `face_offsets`, which is correct only while what they produce IS
143 triangles.
143144- `MeshLine` now emits a mesh of points with no triangles (it used to emit a
144145 point CLOUD, which baked to nothing).
145146
147## The primitives are Blender's, faces and all (2026-09-05)
148
149`src/shared/blender_mesh_primitives.h` used to carry Blender's vertex POSITIONS
150and leave the faces to us. It now carries Blender's faces too, ported from
151`mesh_primitive_{cuboid,cylinder_cone,uv_sphere}.cc`,
152`node_geo_mesh_primitive_circle.cc` and `bmo_primitive.cc`:
153
154| helper | what it reproduces |
155|---|---|
156| `cuboid_corner_verts` | `calculate_corner_verts`, any subdivision |
157| `circle_faces` | the three fill types — and a fan APPENDS the centre vertex |
158| `uv_sphere_faces` | a fan at each pole, quads between |
159| `ConeConfig` / `cone_faces` | fills, side rings, the backwards bottom n-gon |
160| `cuboid_uvs`, `uv_sphere_uvs`, `cone_uvs`, `ico_sphere_uvs` | the UV Map outputs |
161| `cone_selection` | Top / Side / Bottom, on the domain the fill decides |
162
163⚠ **`ConeConfig::*_has_center_vert` follows the FILL TYPE, not the segment
164count.** This file had `fill_segments > 1`, which invents a centre vertex in an
165n-gon-filled cylinder. It could not be seen while `fill_type` did not cross the
166bridge at all.
167
168⛔ **The ico sphere's UV is a TABLE (`icouvs`), not a projection.** BMesh's
169spherical unwrap belongs to the UV SPHERE; used on the ico sphere it gives
170corner 0 u = 0.300001 where Blender gives 0.181819.
171
172⛔ **Ico sphere above subdivision 1 is still not attempted**: Blender subdivides
173through a BMesh edge-subdivide whose vertex order is a property of that
174operator — 162 verts / 320 faces here against Blender's 42 / 80.
175
176Gates live in [[blender-bridge]]: `test_primitive_topology_parity` (the full
177face list — winding, starting corner and face order at once), `test_uv_map_parity`,
178`test_cylinder_selections`, and `audit_missing_sockets`, which now reads **0 of
179101 mapped types**.
180
146181## The erosion filter — one source, three compilations
147182
148183`src/shared/erosion_filter.inc` is THE filter. It is compiled three ways: