Skip to content

fix: water-trough, gn-sdf-remesh and eval-mesh-datablock-name quality pass - #229

Merged
TMHSDigital merged 4 commits into
mainfrom
fix/quality-pass-trough-sdf-remesh-datablock-name
Sep 23, 2026
Merged

TMHSDigital merged 4 commits into
mainfrom
fix/quality-pass-trough-sdf-remesh-datablock-name

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.

Every showcase piece had already had one pass. water-trough was picked from a thumbnail grid of all 28 heroes as the one that read worst: a hammock or sun lounger, not a trough.

A — showcase/water-trough

Took 3 inspection rounds, plus hero iterations on the water surface in round 2. Each round covered six orthos, two three-quarters, clay, wireframe, 8 close-ups (both ends, strap, leg-to-hull, stretchers, shoe, water surface, water end) and ground contact.

Defects

  1. The trough had no ends. Each end was an open U-band, and the water's flat end face sat exposed where a board belongs. Water would pour out, and the piece read as a hammock. Revealed by the left and right orthos and the end-cap close-ups. The water-to-hull gap budget passed, because the water did touch the hull.
  2. The water was a 0.08-roughness mirror, going near-white under the key (three-quarter b, water close-ups).
  3. Every board was the same flat tone, with no grain (three-quarters, hero).
  4. The iron straps read as thin stickers (strap close-up).
  5. The water sat nearly flush with the rim (68% fill). With the inner walls hidden it read as felt in a frame (r1 hero).
  6. --short-legs sat 0.4 mm inside the bbox tolerance. Found by the after-matrix: a 1.5 mm model change tipped it from exit 16 to exit 8 on all three binaries. The falsifier lifted the shoes, so the whole piece re-grounded on the legs and the AABB shrank about 10 mm against a 10 mm tolerance.
  7. The temp .glb export leaked into the working directory.

Fixes, and why each is structural

  • 1: add_end_board builds a solid end whose bottom is the hull's own outer arc (r_out + END_OVERHANG, same A_SPAN) and whose top is level at the band's inner rim. It is all quads (vertical strips from each arc point), so no n-gon to fan. The existing --box-ends rim-span budget still separates it from a bounding-box slab (rim span 0.021 against 0.161). The bevel now skips flat strip seams.
  • 2: the water is a dark body with a facing-ratio sky tint and a faint ripple bump. A light placed on the mirrored camera ray was tried and rejected: all-or-nothing reflection, plus spill that lifted the stage.
  • 3: paint_planks writes a seeded PlankTone and each shell's principal axis as GrainDir; the wood shader stretches grain along it.
  • 4: STRAP_W 28 → 40 mm.
  • 5: WATER_FILL 0.68 → 0.50.
  • 6: under --short-legs each leg's foot now stretches down to the floor, so the legs plant, the shoes float, and the envelope moves 1.6 mm (margin 8.4 mm). The falsifier was fixed, not the band.
  • 7: 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
Water contained by the end boards (exit 18) 0 misses: outward X rays from perimeter, 50% and 90% points of each water end face must hit timber within 1.5 × END_T 0 of 66

Re-fitted around the measurements: base tris 3300–4000 → 2800–3500, and declared outer AABB z 0.504 → 0.5055 (tolerance unchanged at 0.01).

Triangles: 3700 → 3124. Solid boards close the section with fewer faces than the open bands. Collider 64 and LOD ratios are unchanged in kind. Same-binary determinism: two runs on 5.2.1 match on every measured line.

Falsifier: --open-ends restores the U-bands, all 66 rays miss → 18 on all three binaries. tests/check_falsifier_targets.py passes (185 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, --short-legs 16→16 (after fix 6), --box-ends 17→17, --float-strap 18→18, --narrow-hull 19→19. The baseline was taken with the piece stashed back to main.

Hero re-rendered on 5.2.1 through scripts/render_hero.py. check_framing runs without deviation=: fill y 0.794, min margin 0.044. Contact sheet: docs/gallery/contact-sheets/water-trough-contact-sheet.webp.

  • Luma: 0.187, inside the calibration band (0.151 to 0.305).
  • Stage: 0.180.
  • Warmth: +0.071.
  • Saturation: 0.132.
  • Thumbnail: reads as a trough.

Still weak: the water is a flat, featureless plane. It reads as water only from context.

B — examples/gn-sdf-remesh

Presentation changes (render path only):

  • Composition: the source torus (a modifier-free copy of the same datablock) sits left of the SDF result.
  • Edge cages: each torus has a pale cage of its own edges. The remeshed cage is the evaluated result frozen with bpy.data.meshes.new_from_object; a live copy of the tree re-applied its Set Material and painted the cage crimson. Alone, the remeshed torus read as a glossy inner tube with blocky highlights, and nothing said "remeshed". Now ring topology in, voxel topology out.
  • Grounding: both tori sit on their measured bottoms. build() centres the torus at z 0.55 with a 0.5 minor radius, so the old still hovered 5 cm over the floor, visible in the clay pass.
  • Material: roughness 0.16 → 0.32 at render time, so each voxel facet no longer throws its own hard glint.
  • Camera: raised and pulled back so both holes read.

build() and the checks are untouched. The faceting stays: it is the evidence.

Contract unchanged. Before → after, identical on 4.5.11, 5.1.2 and 5.2.1: default 0 → 0, --no-sdf 3 → 3.

Framing: this example's render path has no check_framing call, against CLAUDE.md. Adding one would put exit 10 into a Track B example's table, so it is not added here. Framing was measured externally (.scratch probe: the example's own main() with --output, then gallery_framing.check_framing on the resulting scene): fill x 0.828, min margin 0.075, code 0. The missing gate is recorded for a follow-up. Contact sheet: docs/gallery/contact-sheets/gn-sdf-remesh-contact-sheet.webp, luma 0.210.

C — examples/eval-mesh-datablock-name

README improvements:

  • Who hits this: name-inequality tests in exporters and bakers, and what goes silently wrong.
  • New verified finding: with no modifier, evaluated_get().data.name equals the source name on all three binaries, 4.5.11 included. The name test was never reliable; 5.2 removed its last working case.
  • What to do instead: keep the reference to what you evaluated. Also recorded as measured: in a probe on the same cube, ID.is_evaluated read False on the evaluated mesh and ID.original did not compare equal to the source, on all three. Neither is offered as a replacement.
  • Version-gated falsifier: now states outright that --assume-distinct-names exiting 0 on 4.5.11 and 5.1.2 is correct by design.
  • Adds a re-verified table and API links (current and 4.5).

Re-verification (live probe):

Measurement 4.5.11 5.1.2 5.2.1
evaluated_get().data.name, SUBSURF Mesh Mesh SourceMesh
same, no modifier SourceMesh SourceMesh SourceMesh
to_mesh().name SourceMesh SourceMesh SourceMesh
default / --assume-distinct-names exit 0 / 0 0 / 0 0 / 6

Documented behaviour is correct. No code change.

Also

  • showcase/README.md conventions:
    • Vessels: a vessel holds its contents. Assert containment with perimeter and interior rays; --open-ends is the falsifier.
    • Falsifiers: keep a falsifier's envelope still, and check its AABB delta against the tolerance, not only its exit code.
  • docs/gallery/index.html carries both card alts in the sdf-remesh commit, because one build regenerates both.

🤖 Generated with Claude Code

TMHSDigital and others added 4 commits September 23, 2026 11:21
… the water

The ends were open U-bands and the water's end face showed where a board
belongs; the piece read as a hammock. Ends are now solid boards on the
hull's outer arc, and a containment budget casts rays outward from across
each water end face (exit 18, --open-ends). --short-legs now stretches the
legs to the floor instead of letting the piece re-ground, keeping its
AABB still. Per-plank tone and grain, darker water at half fill, wider
straps. 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>
…de under edge cages

Render path only. The check, its assertions and exit codes are unchanged.
Both tori are grounded on their measured bottoms. docs/gallery/index.html
also carries the water-trough card alt from the previous commit.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
…why name tests never worked

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
… envelopes

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 4e73484 into main Sep 23, 2026
13 checks passed
@TMHSDigital
TMHSDigital deleted the fix/quality-pass-trough-sdf-remesh-datablock-name branch September 23, 2026 15:28
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