Skip to content

fix: stone-archway, gn-zone-iterate and coincident-vert-weld quality pass - #228

Merged
TMHSDigital merged 4 commits into
mainfrom
fix/quality-pass-archway-zone-iterate-weld
Sep 23, 2026
Merged

TMHSDigital merged 4 commits into
mainfrom
fix/quality-pass-archway-zone-iterate-weld

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

Quality pass: three items, one per track. Everything below comes from live runs on .scratch/blender-{4.5.11,5.1.2,5.2.1}-windows-x64/blender.exe, which report 4.5.11 LTS / 5.1.2 / 5.2.1 LTS, unless it is labelled inspection.

A — showcase/stone-archway

Took 3 inspection rounds: r0 baseline, r1 fixes, r2 tuning. Each round covered six orthos, two three-quarters, clay, wireframe, 8 joint close-ups (springings, pier bases, keystone, a voussoir joint, pier courses, intrados crown) and ground contact.

Defects

  1. Every joint was air. Pier courses stood 7 mm apart and voussoirs 9.7 mm apart, none touching. Each pier was a stack of floating blocks, with daylight through every joint. Revealed by the ground-contact view, and the pier-course and voussoir-joint close-ups. The mortar-band budget passed because the gaps were the right width; nothing asked what was in them.
  2. The stone read as wood. The noise-driven colour mix streaked into long brown grain at hero scale (committed hero), and read as cream plaster under neutral light (three-quarters a and b).
  3. Dressed and ashlar stone were barely distinguishable (three-quarters).
  4. Every stone was the same tone (r1 hero). Zero variation.
  5. The temp .glb export leaked into the working directory.

Fixes, and why each is structural

  • 1: add_mortar builds a bed between each pair of courses and under each impost, and a wedge between each pair of voussoirs. Each is sized from the two blocks it joins (build_pier and build_arch now return their block dimensions), so a course that weathers back or a voussoir that rises takes its mortar with it. Joints are recessed CHAMFER + 3 mm so they read as raked, and bite 1.5 mm into both blocks. Mortar is added after the chamfer pass and left unchamfered. classify skips mortar shells, so every existing stone budget still measures stone against stone; they all read the same values as before.
  • 2 and 3: stone_material uses isotropic object-space mottling, speckle driving roughness, and a bump. Dressed stone is paler and smoother; mortar is its own slot. wire_normal now chains the baked normal map under the bump.
  • 4: paint_blocks writes a seeded BlockTone face attribute that the shader reads.
  • 5: the export is removed after it is measured.

New budget. Measured identically on 4.5.11, 5.1.2 and 5.2.1.

Budget Band Measured
Mortar contact (exit 18) 18 mortar shells, each BVH-overlapping exactly 2 stones 18, all 2
Mortar face floor (exit 5) ≥ 100 108

The material count is now exactly 3. Base tris band re-fitted around the measurement: 700–2600 → 950–1450.

Triangles: 924 → 1140. Collider unchanged at 168. LOD2 is 250 / 0.2193 on 4.5 and 5.1, and 244 / 0.2140 on 5.2 (ratio band unchanged). Same-binary determinism: two runs on 5.2.1 match on every measured line.

Falsifier: --short-mortar stops every joint 1 mm shy of both stones, so all 18 shells overlap 0 stones → 18 on all three binaries. tests/check_falsifier_targets.py passes (184 falsifiers).

Existing exit codes, before → after, identical on 4.5.11, 5.1.2 and 5.2.1: default 0→0, --skip-decimate 9→9, --stray-vert 15→15, --lift-z 16→16, --float-pier 16→16, --sink-keystone 17→17, --wide-mortar 18→18, --off-circle 19→19.

Hero re-rendered on 5.2.1 through scripts/render_hero.py. check_framing runs without deviation=: fill y 0.889, min margin 0.028. Contact sheet: docs/gallery/contact-sheets/stone-archway-contact-sheet.webp.

  • Luma: 0.232, inside the calibration band (0.151 to 0.305).
  • Stage: 0.211.
  • Warmth: +0.023.
  • Saturation: 0.090. Below the calibration tiles, and correct for grey stone.
  • Thumbnail: reads as a masonry arch.

No asset sheet, since no showcase piece has one yet (#202).

B — examples/gn-zone-iterate

Presentation changes (render path only):

  • Camera: more frontal and centred on the pair. From (6.6, −9.3) the Repeat row foreshortened into a diagonal and the For Each tower hugged the right edge; now the row's even 1.2 m spacing and the tower's index steps read.
  • Lighting: the 0.9 m Glint spot became a broad 3 m light. It had blown the top tower cube out to near-white cyan. A rim light was added so the cubes separate from the wall.
  • Materials: brass metallic 0.85 → 0.55 at render time, via the nodes' Set Material. In a near-black world it reflected near-black and read as mustard card.

build() is untouched.

Inspection (Workbench clay and wireframe from the hero camera, through the example's own render_still) showed no scaffolding defects. The cubes sit on the floor, the tower gaps are the contract's Index × 0.6 offsets, and nothing interpenetrates. The unbevelled cubes stay unbevelled because their 8-vertex topology is the contract.

Contract unchanged. check(), the assertions and the exit codes are untouched.

Run 4.5.11 5.1.2 5.2.1
default 0 → 0 0 → 0 0 → 0
--unpair-repeat 3 → 3 3 → 3 3 → 3
--unpair-foreach 5 → 5 5 → 5 5 → 5
--no-offset 4 → 4 4 → 4 4 → 4
--foreach-main 5 → 5 5 → 5 5 → 5

Framing: fill y 0.817, margins left 0.150, right 0.169 (the first reframe hit exit 10 and was pulled back). Contact sheet: docs/gallery/contact-sheets/gn-zone-iterate-contact-sheet.webp, luma 0.246.

C — examples/coincident-vert-weld

README improvements:

  • Corrects "Hygiene can pass": a manifold check passes (0 non-manifold edges), but bmesh.ops.find_doubles(dist=1e-5) reports 8. A doubles check catches it, which is why the showcase hygiene budgets count doubles separately.
  • Adds "who hits this": engine symptoms (no visible flicker, doubled draw and collider triangles, lightmap overlap) and the fix.
  • States that the welded result is count-identical to a cube built once.
  • Adds API links (current and 4.5), consistent with the other READMEs.

Re-verification (live probe):

Claim 4.5.11 5.1.2 5.2.1
V / E / F / unique / valence 16 / 24 / 12 / 8 / 2×24 same same
non-manifold / find_doubles 0 / 8 same same
glTF positions / tris / unique 48 / 24 / 8 same same
after remove_doubles 8 / 12 / 6, glTF 24 / 12 same same
default / --no-duplicate / --weld 0 / 3 / 4 0 / 3 / 4 0 / 3 / 4

Documented behaviour is correct. The old README said "same on 4.5 and 5.2"; it now covers 5.1 as well. No code change.

Also

  • showcase/README.md conventions: filled mortar joints (a contact budget of exactly two stones per joint, mortar kept out of stone classifiers, mortar added after the chamfer), and stone surfaces (isotropic mottling, per-block tone, baked normal chained under the bump).
  • docs/gallery/index.html carries both card alts in the zone-iterate commit, because one build regenerates both.

🤖 Generated with Claude Code

TMHSDigital and others added 4 commits September 23, 2026 10:39
…one that reads as stone

Every joint was air: courses floated 7 mm apart and voussoirs 9.7 mm, with
daylight through each. Mortar beds and wedges are now sized from the two
blocks they join, recessed behind the faces and biting into both, and a
mortar-contact budget asserts each of the 18 overlaps exactly two stones
(exit 18, --short-mortar). classify skips mortar. The streaky noise mix
that read as wood grain is replaced by an isotropic stone shader with a
seeded per-block tone. The temp glTF export 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>
…r blown out

Render path only. The check, its assertions and exit codes are unchanged.
docs/gallery/index.html also carries the stone-archway card alt from the
previous commit, since both regenerate in one build.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
…at catches it, re-verified on 5.1

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
@TMHSDigital TMHSDigital added the needs-5.1 Opt-in Blender 5.1 smoke on this PR. Default matrix stays 4.5 + 5.2. Auto-label will not apply this. label Sep 23, 2026
@github-actions github-actions Bot added examples Runnable smoke-gated examples under examples/ showcase Budget-conformance props under showcase/ documentation Improvements or additions to documentation labels Sep 23, 2026
@TMHSDigital
TMHSDigital merged commit 9283488 into main Sep 23, 2026
14 checks passed
@TMHSDigital
TMHSDigital deleted the fix/quality-pass-archway-zone-iterate-weld branch September 23, 2026 14:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation examples Runnable smoke-gated examples under examples/ needs-5.1 Opt-in Blender 5.1 smoke on this PR. Default matrix stays 4.5 + 5.2. Auto-label will not apply this. showcase Budget-conformance props under showcase/

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant