Skip to content

Commit 4d7468f

Browse files
TMHSDigitalclaude
andauthored
fix: chopping-block, gn-socket-rename and gn-bundle-roundtrip quality pass (#207)
* docs(showcase): conventions for shading, material slots, fastener seats and section budgets Adds four conventions from the chopping-block quality pass: equal facets on an organic or turned body read as staves, so smooth it and carry the surface in the material; one substance per material slot; fasteners aimed down the host's surface normal with a radial seat band (--float-rivets, exit 18); a recognisable cross-section asserted as a ratio band (--round-haft, exit 19). Also records that a thickening falsifier scales only the axis its budget measures. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> * fix(showcase): chopping-block quality pass with rivet-seat and haft-section budgets The log read as a tub: flat-shaded equal facets made staves, the hoop was a flat-shaded stripe with piano-key highlights, the end grain was a triangle-fan sunburst, a pale ring ran round the base, and the haft was a round dowel with a pencil-stub knob in the bark's material. The generator now smooth-shades the log and hoop and carries bark furrows, growth rings and drying checks in the materials, keeps bark down to the ground, builds the hoop as a lapped strip with two rivets aimed down the host normal, and sweeps an oval haft that hooks at the knob in its own material slot. New budgets: rivet seat band and proud minimum (exit 18, --float-rivets) and haft section ratio (exit 19, --round-haft). --fat-haft now thickens across the cheeks only so it still fails on eye clearance. Triangle band, AABB and collider ceiling re-fitted to the new measurements. The temp glTF is removed after measuring. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> * fix(examples): gn-socket-rename renders its Random Value axis Presentation only; the contract, assertions and exit codes are unchanged. The column shader now draws gauge graduations from the evaluated POINT gauge_h attribute, so an unwired Random Value renders a blank column where before the still looked identical either way. Brushed copper with engraved ticks from each corner, a steel plinth that no longer mirrors the dark stage into a void, the rim light cut so its floor reflection stops lifting the stage, and an 18 degree presentation turn so two faces show. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> * fix(examples): gn-bundle-roundtrip exit-5 falsifier and re-verified version table Exit 5 had no falsifier. --mismatch-mark renames only Separate's Float item, so count and bbox pass and bundle_mark reads 0.0, exit 5. The README now states the RNA per version as a table, re-verified by probe on 4.5.11, 5.0.1, 5.1.2 and 5.2.1: GeometryNodeCombineBundle is undefined on all of 5.x, not only 5.2; on 4.5 it exists with the experimental flag off and evaluates empty. --force-run on 4.5 is documented as exit 1, not under exit 3. Assertions and exit codes unchanged. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> * docs(gallery): regenerate the index and the stale cart and stone-well pages Output of scripts/build_gallery.py. The cart and stone-well detail pages were not regenerated after #206 changed their scripts and READMEs. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> --------- Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent 2c07b5e commit 4d7468f

21 files changed

Lines changed: 1775 additions & 283 deletions

File tree

‎README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
128128
<a href="showcase/grindstone/"><img src="showcase/grindstone/preview.webp" width="24%" alt="Grindstone: a stone wheel on a timber A-frame with an iron axle, hubs, crank, and tray on a dark studio floor" /></a>
129129
<a href="showcase/hand-pump/"><img src="showcase/hand-pump/preview.webp" width="24%" alt="Hand pump: a cast-iron village pump on a wooden plinth with a spout and handle on a dark studio floor" /></a>
130130
<a href="showcase/signpost/"><img src="showcase/signpost/preview.webp" width="24%" alt="Signpost: a timber post with two painted fingerboards, iron straps, and a pyramidal cap on a dark studio floor" /></a>
131-
<a href="showcase/chopping-block/"><img src="showcase/chopping-block/preview.webp" width="24%" alt="Chopping block: a hooped timber stump with an embedded axe on a dark studio floor" /></a>
131+
<a href="showcase/chopping-block/"><img src="showcase/chopping-block/preview.webp" width="24%" alt="Chopping block: a bark-sided log round with growth rings and drying checks on its sawn top, a riveted iron hoop, and a felling axe buried in the top, on a dark studio floor" /></a>
132132
<a href="showcase/wooden-bucket/"><img src="showcase/wooden-bucket/preview.webp" width="24%" alt="Wooden bucket: a coopered pail with a round rope bail through ear rings and chord-lofted iron hoops on a dark studio floor" /></a>
133133
<a href="showcase/wall-torch/"><img src="showcase/wall-torch/preview.webp" width="24%" alt="Wall torch: a dressed stone plaque with an iron sconce, wooden haft, and flame on a dark studio floor" /></a>
134134
<a href="showcase/tavern-stool/"><img src="showcase/tavern-stool/preview.webp" width="24%" alt="Tavern stool: a round wooden seat on turned splayed legs with stretchers and iron ferrules on a dark studio floor" /></a>
@@ -592,7 +592,7 @@ passthrough.
592592
</tr>
593593
<tr>
594594
<td width="46%" valign="middle">
595-
<a href="examples/gn-socket-rename/"><img src="examples/gn-socket-rename/preview.webp" alt="GN socket rename: a copper jo-block column on a steel plinth in a dark studio, the column switched in by Compare and tagged by Random Value, warm wedge on the back wall" /></a>
595+
<a href="examples/gn-socket-rename/"><img src="examples/gn-socket-rename/preview.webp" alt="GN socket rename: a brushed copper gauge column on a steel plinth in a dark studio, graduated every 0.1 m from its stored gauge_h attribute, warm wedge on the back wall" /></a>
596596
</td>
597597
<td valign="middle">
598598

5.73 KB
Loading
4.93 KB
Loading

‎docs/gallery/cart/index.html‎

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -264,8 +264,8 @@ <h1>cart</h1>
264264
<p><strong>Composes</strong> skills <code>mesh-editing-and-bmesh</code>, <code>bake-high-to-low</code>, <code>depsgraph-and-evaluated-data</code>, <code>engine-export-presets</code>, and snippets <code>bake_normal_high_to_low.py</code>, <code>setup_bake_target_image.py</code>, <code>lod_chain.py</code> / <code>decimate_to_budget.py</code>, <code>convex_hull_collider.py</code>, <code>export_preset_unity.py</code> (helpers copied, not imported as a package).</p>
265265
<h2>Budgets</h2>
266266
<p>Declared as named constants; every gate <strong>recomputes</strong> from the mesh, materials, UVs, evaluated LOD, collider, or export file.</p>
267-
<p>| Axis | Declared | Measured (4.5.11 / 5.1.2 / 5.2.1) | | --- | --- | --- | | Base triangles | 2760–2960 | 2856 / 2856 / 2856 | | LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.5000 | | LOD2 ratio | 0.10–0.35 of base | 0.2200 / 0.2200 / 0.2154 | | Materials | exactly 2 distinct, metal ≥ 24, wood ≥ 800 faces | 2 slots, floors met | | UVs | in <code>0..1</code>, AABB overlap ≤ 1e-5 | in range, overlap 0 | | Outer AABB | (1.539, 0.749, 0.640) m ± 0.01 | (1.5393, 0.7486, 0.6400) | | Grounded | bbox min Z within 1e-4 of 0 | 0.0000 / 0.0000 / 0.0000 | | Named supports | each tyre&#x27;s own zmin within 1e-4 of the floor | +Y 0.000000, −Y 0.000000 | | Hygiene | loose V/E, non-manifold, zero-area, doubles @1e-5, n-gons: all 0 | 0 / 0 / 0 on every axis | | Z-fighting | coplanar cross-shell face pairs = 0 | 0 / 0 / 0 | | Tyre seat | 0.0030–0.0055 m interference, per angular station | [0.00400, 0.00400] over 48 stations | | Wheel mirror | the two wheels match in X, Z and extent within 5e-5 m | 0.00000 mm | | Material-island gap | metal↔wood min distance ≤ 0.008 m | 0.00000 / 0.00000 / 0.00000 | | Collider tris | ≤ 360 | 122 | | Export | written, size &gt; 0 | 201048 / 201048 / 201032 bytes |</p>
268-
<p>DECIMATE COLLAPSE triangle counts are <strong>not</strong> identical across series — 5.2.1 is more aggressive on LOD2. The gate is a ratio band, not an exact count. Bake pixels are stochastic; the gate is <code>has_data</code> plus operator <code>FINISHED</code>, not byte-identity. Construction uses no RNG. Export byte counts differ by 8 B on 5.2.1 (glTF serializer), not a gated axis.</p>
267+
<p>| Axis | Declared | Measured (4.5.11 / 5.1.2 / 5.2.1) | | --- | --- | --- | | Base triangles | 2760–2960 | 2856 / 2856 / 2856 | | LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.5000 | | LOD2 ratio | 0.10–0.35 of base | 0.2199 / 0.2199 / 0.2157 | | Materials | exactly 2 distinct, metal ≥ 24, wood ≥ 800 faces | 2 slots, floors met | | UVs | in <code>0..1</code>, AABB overlap ≤ 1e-5 | in range, overlap 0 | | Outer AABB | (1.539, 0.749, 0.640) m ± 0.01 | (1.5393, 0.7486, 0.6400) | | Grounded | bbox min Z within 1e-4 of 0 | 0.0000 / 0.0000 / 0.0000 | | Named supports | each tyre&#x27;s own zmin within 1e-4 of the floor | +Y 0.000000, −Y 0.000000 | | Hygiene | loose V/E, non-manifold, zero-area, doubles @1e-5, n-gons: all 0 | 0 / 0 / 0 on every axis | | Z-fighting | coplanar cross-shell face pairs = 0 | 0 / 0 / 0 | | Tyre seat | 0.0030–0.0055 m interference, per angular station | [0.00400, 0.00400] over 48 stations | | Wheel mirror | the two wheels match in X, Z and extent within 5e-5 m | 0.00000 mm | | Material-island gap | metal↔wood min distance ≤ 0.008 m | 0.00000 / 0.00000 / 0.00000 | | Collider tris | ≤ 360 | 154 | | Export | written, size &gt; 0, removed after measuring | 221960 bytes on 5.2.1 |</p>
268+
<p>DECIMATE COLLAPSE triangle counts are <strong>not</strong> identical across series — 5.2.1 is more aggressive on LOD2. The gate is a ratio band, not an exact count. Bake pixels are stochastic; the gate is <code>has_data</code> plus operator <code>FINISHED</code>, not byte-identity. Construction uses no RNG. Export byte counts differ by a few bytes across series (glTF serializer); the gate is &quot;written and non-empty&quot;, not a byte count, and the file is removed once measured.</p>
269269
<h2>Falsifiers</h2>
270270
<p>Each flag breaks one stage so a <strong>named</strong> budget fails and the piece exits *that* code. Magnitudes are sized so no earlier gate can steal the failure: the two wheel moves stay inside <code>BBOX_TOL</code>, so the AABB gate (exit 8) still passes.</p>
271271
<p>| Flag | Target budget | Exit | | --- | --- | --- | | <code>--skip-decimate</code> | LOD1 ratio band (ratio becomes 1.0) | 9 | | <code>--lift-z</code> | AABB grounded zmin (whole mesh up 0.05 m) | 16 | | <code>--flush-tyre</code> | Coplanar cross-shell pairs — sets the tyre&#x27;s inner radius equal to the felloe&#x27;s outer radius, which is the construction bug this piece was rebuilt to remove (0 → 48 pairs) | 15 | | <code>--sink-tyre</code> | Tyre seat band — buries the hoop 9 mm into the felloe so it reads as one body | 18 | | <code>--float-wheel</code> | Named supports — lifts one wheel 3 mm while the other still grounds the AABB | 16 | | <code>--skew-wheel</code> | Wheel mirror — pushes one wheel 6 mm out along the track | 19 |</p>
@@ -299,17 +299,21 @@ <h2>Source</h2>
299299
export.
300300

301301
Budgets are declared below and recomputed from the generated result.
302-
They are not API-contract witnesses. ``--skip-decimate`` skips the LOD
303-
DECIMATE stage so the LOD-ratio budget fails. ``--lift-z`` raises the
304-
mesh so the grounded-zmin hygiene budget fails.
302+
They are not API-contract witnesses. Each falsifier flag breaks one
303+
stage so a named budget fails and the piece exits that budget&#x27;s code:
304+
``--skip-decimate`` (LOD ratio, 9), ``--lift-z`` (AABB grounded, 16),
305+
``--float-wheel`` (named supports, 16), ``--flush-tyre`` (coplanar
306+
cross-shell pairs, 15), ``--sink-tyre`` (tyre seat band, 18),
307+
``--skew-wheel`` (wheel mirror, 19). The two wheel moves stay inside
308+
``BBOX_TOL`` so the AABB gate cannot steal the failure.
305309

306310
No RNG. Construction is closed-form. DECIMATE COLLAPSE triangle counts
307311
are not byte-identical across Blender versions — the LOD gate is a
308312
ratio band, not an exact count.
309313

310314
blender --background --python cart.py --
311315
blender --background --python cart.py -- --skip-decimate
312-
blender --background --python cart.py -- --lift-z
316+
blender --background --python cart.py -- --flush-tyre
313317
blender --background --python cart.py -- --output cart.png
314318
&quot;&quot;&quot;</span>
315319
<span class="k">import</span> argparse
@@ -1295,6 +1299,15 @@ <h2>Source</h2>
12951299
os.remove(export_path)
12961300
export_unity(export_path, [low, collider])
12971301
export_size = os.path.getsize(export_path) <span class="k">if</span> os.path.isfile(export_path) <span class="k">else</span> <span class="n">0</span>
1302+
<span class="c"># Blender sets TMPDIR from its own preference, which resolves to the</span>
1303+
<span class="c"># working directory on a stock portable build — so gettempdir() is the</span>
1304+
<span class="c"># repo root under CI and every run left a .glb behind. The budget only</span>
1305+
<span class="c"># needs the byte count, so drop the file once it is measured.</span>
1306+
<span class="k">if</span> os.path.isfile(export_path):
1307+
<span class="k">try</span>:
1308+
os.remove(export_path)
1309+
<span class="k">except</span> OSError:
1310+
<span class="k">pass</span>
12981311

12991312
print(<span class="s">f&quot;</span><span class="s">blender=</span>{tuple(bpy.app.version)}<span class="s"> skip_decimate=</span>{skip_decimate}<span class="s">&quot;</span>)
13001313
print(

0 commit comments

Comments
 (0)