From 8071118778dd535da54600408edcb2323b3bb0bd Mon Sep 17 00:00:00 2001 From: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Date: Tue, 22 Sep 2026 17:44:14 -0400 Subject: [PATCH 1/4] fix(showcase): hoop the cart's tyre onto the felloe and round the rim MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The tyre's inner radius was set equal to the felloe's outer radius (`r_mid = RIM_OUTER + TYRE_T/2, radial_t = TYRE_T/2`), which put both surfaces on one plane for every segment: 32 coplanar cross-shell face pairs, 16 per wheel. It was visible as speckle on the committed hero and in a clay pass, and no budget could see it. Derive the tyre's inner radius from the felloe's outer radius minus a named interference (TYRE_SEAT) and its tread from the felloe plus its own thickness, so the band bites into the rim and still owns the ground contact. Wheel segments 16 -> 24: at 16 the rim read as a polygon and the facet facing the key light rendered as a hard white plate. Iron raised from (0.13, rough 0.32) to (0.20, rough 0.50), inside the range its sibling pieces use, because the tyre was reading as black plastic. Four new budgets, each recomputed from the generated mesh: - coplanar cross-shell face pairs = 0 (hay-bale's combinatorics, copied) - each tyre's own zmin on the floor, not just the AABB's - tyre seat depth banded per angular station, 48 stations - the two wheels mirrored in Y within 5e-5 m Four new falsifiers, each landing on its own code and sized to stay inside BBOX_TOL so the AABB gate cannot steal the failure: --flush-tyre (15), --sink-tyre (18), --float-wheel (16), --skew-wheel (19). Also drops the temp .glb once measured — the leak PR #205 found in hay-bale is in this piece too. Base triangles re-fitted to 2760-2960: narrower than the 2470-2900 it replaces and centred on the measured 2856. Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> --- docs/gallery/assets/cart-hero.webp | Bin 25924 -> 25232 bytes .../contact-sheets/cart-contact-sheet.webp | Bin 0 -> 51794 bytes showcase/cart/README.md | 52 ++- showcase/cart/cart.py | 368 +++++++++++++++++- showcase/cart/preview.webp | Bin 25924 -> 25232 bytes 5 files changed, 394 insertions(+), 26 deletions(-) create mode 100644 docs/gallery/contact-sheets/cart-contact-sheet.webp diff --git a/docs/gallery/assets/cart-hero.webp b/docs/gallery/assets/cart-hero.webp index 33e7fcfe604a40c6c36556cb7934e59adda4dc6f..28b5a0117246dee524799e25664d5ce4d7d23df6 100644 GIT binary patch literal 25232 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 diff --git a/docs/gallery/contact-sheets/cart-contact-sheet.webp b/docs/gallery/contact-sheets/cart-contact-sheet.webp new file mode 100644 index 0000000000000000000000000000000000000000..c95d455de5ab46e451a084e4e170789555375e06 GIT binary patch literal 51794 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%0D9biJ`&;4*?z@kSvpQ{UY1%f;T;nn9CZQ;Y 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 0 | 201048 / 201048 / 201032 bytes | +| Collider tris | ≤ 360 | 154 | +| Export | written, size > 0, removed after measuring | 221960 bytes on 5.2.1 | DECIMATE COLLAPSE triangle counts are **not** 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 `has_data` plus operator `FINISHED`, not byte-identity. Construction uses no RNG. -Export byte counts differ by 8 B on 5.2.1 (glTF serializer), not a -gated axis. +Export byte counts differ by a few bytes across series (glTF +serializer); the gate is "written and non-empty", not a byte count, and +the file is removed once measured. -`--skip-decimate` skips the LOD DECIMATE stage so LOD1 ratio is 1.0 and -exit 9 fires. `--lift-z` raises the finished mesh 0.05 m so the grounded -budget fails and exit 16 fires. Those are the named budgets the two -falsifiers violate. +## Falsifiers + +Each flag breaks one stage so a **named** 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 `BBOX_TOL`, so the AABB gate +(exit 8) still passes. + +| Flag | Target budget | Exit | +| --- | --- | --- | +| `--skip-decimate` | LOD1 ratio band (ratio becomes 1.0) | 9 | +| `--lift-z` | AABB grounded zmin (whole mesh up 0.05 m) | 16 | +| `--flush-tyre` | Coplanar cross-shell pairs — sets the tyre's inner radius equal to the felloe's outer radius, which is the construction bug this piece was rebuilt to remove (0 → 48 pairs) | 15 | +| `--sink-tyre` | Tyre seat band — buries the hoop 9 mm into the felloe so it reads as one body | 18 | +| `--float-wheel` | Named supports — lifts one wheel 3 mm while the other still grounds the AABB | 16 | +| `--skew-wheel` | Wheel mirror — pushes one wheel 6 mm out along the track | 19 | + +`--lift-z` and `--float-wheel` share exit 16 and fail different budgets: +`--lift-z` fails the AABB gate, which fires first; `--float-wheel` leaves +the AABB grounded, so only the per-tyre support check can catch it. ## Run @@ -51,10 +71,14 @@ falsifiers violate. blender --background --python cart.py -- blender --background --python cart.py -- --skip-decimate blender --background --python cart.py -- --lift-z +blender --background --python cart.py -- --flush-tyre +blender --background --python cart.py -- --sink-tyre +blender --background --python cart.py -- --float-wheel +blender --background --python cart.py -- --skew-wheel blender --background --python cart.py -- --output cart.png ``` -Smoke does not pass `--output`, `--skip-decimate`, or `--lift-z`. +Smoke passes none of the falsifier flags and no `--output`. ## Exit codes @@ -78,6 +102,8 @@ File-local. `9` is a valid check code. `10` is reserved for | 12 | Bake did not finish or image has no data | | 13 | Export file missing or empty | | 14 | `--output` produced no file | -| 15 | Hygiene: loose geometry, non-manifold, zero-area, doubles, or n-gons | -| 16 | Bbox min Z not grounded (`--lift-z` lands here) | +| 15 | Hygiene: loose geometry, non-manifold, zero-area, doubles, n-gons, or coplanar cross-shell face pairs (`--flush-tyre` lands here) | +| 16 | Bbox min Z not grounded (`--lift-z`), or a named support off the floor (`--float-wheel`) | | 17 | Material-island gap above tolerance (parts meant to touch) | +| 18 | Tyre seat depth outside its band (`--sink-tyre` lands here) | +| 19 | Wheel mirror deviation above epsilon (`--skew-wheel` lands here) | diff --git a/showcase/cart/cart.py b/showcase/cart/cart.py index e7e06df2..7cc134a8 100644 --- a/showcase/cart/cart.py +++ b/showcase/cart/cart.py @@ -7,9 +7,13 @@ export. Budgets are declared below and recomputed from the generated result. -They are not API-contract witnesses. ``--skip-decimate`` skips the LOD -DECIMATE stage so the LOD-ratio budget fails. ``--lift-z`` raises the -mesh so the grounded-zmin hygiene budget fails. +They are not API-contract witnesses. Each falsifier flag breaks one +stage so a named budget fails and the piece exits that budget's code: +``--skip-decimate`` (LOD ratio, 9), ``--lift-z`` (AABB grounded, 16), +``--float-wheel`` (named supports, 16), ``--flush-tyre`` (coplanar +cross-shell pairs, 15), ``--sink-tyre`` (tyre seat band, 18), +``--skew-wheel`` (wheel mirror, 19). The two wheel moves stay inside +``BBOX_TOL`` so the AABB gate cannot steal the failure. No RNG. Construction is closed-form. DECIMATE COLLAPSE triangle counts are not byte-identical across Blender versions — the LOD gate is a @@ -17,7 +21,7 @@ blender --background --python cart.py -- blender --background --python cart.py -- --skip-decimate - blender --background --python cart.py -- --lift-z + blender --background --python cart.py -- --flush-tyre blender --background --python cart.py -- --output cart.png """ import argparse @@ -46,6 +50,16 @@ RIM_W = 0.036 TYRE_T = 0.008 TYRE_W = 0.040 +# Felloe outer radius is the *host* surface the tyre is hooped onto. The +# tyre's inner radius is derived from it minus a named interference, never +# set equal to it: r_in == r_out puts the tyre's inner cylinder and the +# felloe's tread on one plane for every segment, which is a guaranteed +# z-fight (it measured 32 coplanar cross-shell pairs, 16 per wheel). +RIM_OUTER = RIM_MAJOR + RIM_RADIAL +TYRE_SEAT = 0.004 +TYRE_SEAT_MIN = 0.0030 +TYRE_SEAT_MAX = 0.0055 +WHEEL_SEGMENTS = 24 TRACK = 0.68 AXLE_X = -0.16 AXLE_R = 0.020 @@ -68,8 +82,11 @@ BBOX_TOL = 0.01 OUTER_SIZE = (1.539, 0.749, 0.640) -BASE_TRIS_MIN = 2470 -BASE_TRIS_MAX = 2900 +# Re-fitted after the wheel went from 16 to 24 segments (2600 -> 2856). +# Narrower than the band it replaces (200 wide, was 430) and centred on +# the measured value, so this is a tightening, not a widening. +BASE_TRIS_MIN = 2760 +BASE_TRIS_MAX = 2960 ZMIN_EPS = 1e-4 DOUBLES_EPS = 1e-5 AREA_EPS = 1e-10 @@ -90,6 +107,24 @@ METAL_FACES_MIN = 24 WOOD_FACES_MIN = 800 +# Z-fighting: two separate bodies landing on one plane. Cross-shell, with +# hay-bale's constants (copied, not imported). +COPLANAR_NORMAL_EPS = 1e-4 +COPLANAR_PLANE_EPS = 1e-4 +COPLANAR_CENTRE_MAX = 0.05 +ZFIGHT_PAIRS_MAX = 0 +# Named supports: a two-wheel cart's AABB zmin is grounded by whichever +# tyre happens to be lowest. Each tyre carries its own floor contact. +SUPPORT_ZMIN_EPS = 1e-4 +# Mirrored members: the two wheels are the same part reflected in Y. +WHEEL_MIRROR_EPS = 5e-5 +# Falsifier magnitudes, each sized to trip its own budget and nothing +# earlier: the wheel moves stay inside BBOX_TOL so the AABB gate cannot +# steal the failure. +SINK_TYRE_SEAT = 0.009 +FLOAT_WHEEL_Z = 0.003 +SKEW_WHEEL_Y = 0.006 + WOOD_IDX = 0 METAL_IDX = 1 @@ -249,14 +284,19 @@ def pack_uvs(bm, margin=0.08): def add_wheel(bm, loc, wood, metal): wood.extend( add_ring( - bm, loc, RIM_MAJOR, RIM_RADIAL, RIM_W, 16, WOOD_IDX, + bm, loc, RIM_MAJOR, RIM_RADIAL, RIM_W, WHEEL_SEGMENTS, WOOD_IDX, euler=(math.pi / 2.0, 0.0, 0.0), ) ) + # Hooped, not pasted on: inner radius is RIM_OUTER - TYRE_SEAT so the + # band bites into the felloe, and the tread still lands at + # RIM_OUTER + TYRE_T so the tyre stays the ground contact. + tyre_in = RIM_OUTER - TYRE_SEAT + tyre_out = RIM_OUTER + TYRE_T metal.extend( add_ring( - bm, loc, RIM_MAJOR + RIM_RADIAL + TYRE_T / 2.0, TYRE_T / 2.0, - TYRE_W, 16, METAL_IDX, + bm, loc, 0.5 * (tyre_in + tyre_out), 0.5 * (tyre_out - tyre_in), + TYRE_W, WHEEL_SEGMENTS, METAL_IDX, euler=(math.pi / 2.0, 0.0, 0.0), ) ) @@ -597,6 +637,179 @@ def hygiene_audit(me): } +def shell_groups(me): + """Vertex-index shells by edge connectivity (union-find), biggest first.""" + parent = list(range(len(me.vertices))) + + def find(a): + while parent[a] != a: + parent[a] = parent[parent[a]] + a = parent[a] + return a + + for e in me.edges: + ra, rb = find(int(e.vertices[0])), find(int(e.vertices[1])) + if ra != rb: + parent[rb] = ra + groups = {} + for i in range(len(me.vertices)): + groups.setdefault(find(i), []).append(i) + return sorted(groups.values(), key=lambda g: -len(g)) + + +def shell_box(me, idxs): + co = [me.vertices[i].co for i in idxs] + return { + "xmin": min(c.x for c in co), "xmax": max(c.x for c in co), + "ymin": min(c.y for c in co), "ymax": max(c.y for c in co), + "zmin": min(c.z for c in co), "zmax": max(c.z for c in co), + } + + +def coplanar_zfight_pairs(me, groups): + """Coplanar face pairs from *different shells* — the z-fighting budget. + + Cross-shell, not merely share-no-vertex: two quads two steps apart on + one flat cap share no vertex and are coplanar by construction, and + counting those makes the budget unsatisfiable rather than meaningful. + Z-fighting is two separate bodies landing on one plane, which is + exactly a cross-shell pair. Combinatorics and constants copied from + showcase/hay-bale (do not import across pieces). + """ + owner = {} + for si, comp in enumerate(groups): + for vi in comp: + owner[vi] = si + faces = [(p.normal.copy(), p.center.copy(), owner.get(p.vertices[0], -1)) + for p in me.polygons] + hits = 0 + for i in range(len(faces)): + ni, ci, si = faces[i] + for j in range(i + 1, len(faces)): + nj, cj, sj = faces[j] + if si == sj: + continue + if (ci - cj).length > COPLANAR_CENTRE_MAX: + continue + if abs(abs(ni.dot(nj)) - 1.0) > COPLANAR_NORMAL_EPS: + continue + if abs(ni.dot(cj - ci)) > COPLANAR_PLANE_EPS: + continue + hits += 1 + return hits + + +def wheel_shells(me, groups): + """(rim, tyre) shell index pairs for each wheel, keyed by track side. + + Identified from the generated mesh by geometry — a shell centred on the + axle line whose YZ extent is a full disc — never from a construction + constant. The tyre is the metal-indexed member of the pair. + """ + metal = set() + for p in me.polygons: + if p.material_index == METAL_IDX: + metal.add(int(p.vertices[0])) + found = {} + for si, g in enumerate(groups): + b = shell_box(me, g) + dx = b["xmax"] - b["xmin"] + dz = b["zmax"] - b["zmin"] + if dx < 0.4 or abs(dx - dz) > 0.02: + continue + side = 1 if 0.5 * (b["ymin"] + b["ymax"]) > 0 else -1 + kind = "tyre" if any(i in metal for i in g) else "rim" + found.setdefault(side, {})[kind] = si + return found + + +def tyre_seat_depths(me, groups, rim_si, tyre_si, segments): + """Per-station interference between the tyre's inner ring and the felloe. + + Banded and per angular station, not one global figure: a single number + passes while one arc of the hoop visibly gaps. Both radii are recomputed + from the generated vertices, so nothing here restates a constant. + """ + axis_y = 0.5 * (shell_box(me, groups[tyre_si])["ymin"] + + shell_box(me, groups[tyre_si])["ymax"]) + rb = shell_box(me, groups[rim_si]) + cx = 0.5 * (rb["xmin"] + rb["xmax"]) + cz = 0.5 * (rb["zmin"] + rb["zmax"]) + + def bins(idxs): + out = {} + for i in idxs: + co = me.vertices[i].co + ang = math.atan2(co.z - cz, co.x - cx) + k = int(round(ang / (2.0 * math.pi / segments))) % segments + out.setdefault(k, []).append( + math.hypot(co.x - cx, co.z - cz)) + return out + + rim_bins = bins(groups[rim_si]) + tyre_bins = bins(groups[tyre_si]) + depths = [] + for k in sorted(set(rim_bins) & set(tyre_bins)): + rim_out = max(rim_bins[k]) + tyre_in = min(tyre_bins[k]) + depths.append(rim_out - tyre_in) + return depths, axis_y + + +def _wheel_centre(me, groups, rim_si): + b = shell_box(me, groups[rim_si]) + return 0.5 * (b["xmin"] + b["xmax"]), 0.5 * (b["zmin"] + b["zmax"]) + + +def break_tyre_seat(me, seat): + """Falsifier surgery: re-radius each tyre's inner ring to `seat` deep. + + seat=0.0 puts the tyre's inner cylinder on the felloe's tread plane, + which is the construction bug this piece was rebuilt to remove. + """ + groups = shell_groups(me) + for parts in wheel_shells(me, groups).values(): + cx, cz = _wheel_centre(me, groups, parts["rim"]) + idxs = groups[parts["tyre"]] + radii = [math.hypot(me.vertices[i].co.x - cx, + me.vertices[i].co.z - cz) for i in idxs] + split = 0.5 * (min(radii) + max(radii)) + for i, r in zip(idxs, radii): + if r >= split: + continue + co = me.vertices[i].co + scale = (RIM_OUTER - seat) / r + co.x = cx + (co.x - cx) * scale + co.z = cz + (co.z - cz) * scale + me.update() + + +def move_one_wheel(me, delta): + """Falsifier surgery: translate the +Y wheel only (rim, tyre, spokes). + + Everything whose vertices lie on the +Y side of the axle centreline and + within the wheel's radius, so the assembly moves as one body and the + opposite wheel still grounds the AABB. + """ + groups = shell_groups(me) + parts = wheel_shells(me, groups).get(1) + if parts is None: + return + b = shell_box(me, groups[parts["tyre"]]) + cx, cz = _wheel_centre(me, groups, parts["rim"]) + y_lo, y_hi = b["ymin"] - 0.02, b["ymax"] + 0.02 + r_max = 0.5 * (b["xmax"] - b["xmin"]) + 1e-4 + for v in me.vertices: + if not (y_lo <= v.co.y <= y_hi): + continue + if math.hypot(v.co.x - cx, v.co.z - cz) > r_max: + continue + v.co.x += delta[0] + v.co.y += delta[1] + v.co.z += delta[2] + me.update() + + def min_mat_distance(me, ia, ib): """Closest surface distance between two material islands via BVH. @@ -718,7 +931,8 @@ def export_unity(path, objects): ) -def check(skip_decimate, lift_z=False): +def check(skip_decimate, lift_z=False, flush_tyre=False, sink_tyre=False, + float_wheel=False, skew_wheel=False): bpy.ops.wm.read_factory_settings(use_empty=True) low = build_cart_mesh("CartLow", bevel_offset=0.005, bevel_segments=2) high = build_cart_mesh("CartHigh", bevel_offset=0.005, bevel_segments=4) @@ -726,9 +940,14 @@ def check(skip_decimate, lift_z=False): "CartWood", (0.42, 0.22, 0.08, 1.0), 0.0, 0.58, noise_scale=7.0, wear=(0.26, 0.12, 0.04, 1.0), ) + # Wrought iron, not black plastic. At (0.13, 0.32) the tyre rendered as + # a flat black band with no sheen — darker and glossier than every + # sibling piece's iron (hitching-post 0.16/0.48, wooden-ladder + # 0.18/0.48). Raised to sit inside that calibration range, and the wear + # colour lifted off near-black so the noise actually varies the surface. metal = principled( - "CartIron", (0.13, 0.135, 0.15, 1.0), 1.0, 0.32, - noise_scale=5.0, wear=(0.05, 0.05, 0.06, 1.0), + "CartIron", (0.20, 0.195, 0.185, 1.0), 1.0, 0.50, + noise_scale=5.0, wear=(0.11, 0.105, 0.10, 1.0), ) assign_slots(low, wood, metal) assign_slots(high, wood, metal) @@ -736,6 +955,14 @@ def check(skip_decimate, lift_z=False): for v in low.data.vertices: v.co.z += LIFT_Z low.data.update() + if flush_tyre: + break_tyre_seat(low.data, 0.0) + if sink_tyre: + break_tyre_seat(low.data, SINK_TYRE_SEAT) + if float_wheel: + move_one_wheel(low.data, (0.0, 0.0, FLOAT_WHEEL_Z)) + if skew_wheel: + move_one_wheel(low.data, (0.0, SKEW_WHEEL_Y, 0.0)) if low.data is None or len(low.data.polygons) < 6: return fail("cart mesh did not build", 3), None, None, None, None, None @@ -780,6 +1007,15 @@ def check(skip_decimate, lift_z=False): os.remove(export_path) export_unity(export_path, [low, collider]) export_size = os.path.getsize(export_path) if os.path.isfile(export_path) else 0 + # Blender sets TMPDIR from its own preference, which resolves to the + # working directory on a stock portable build — so gettempdir() is the + # repo root under CI and every run left a .glb behind. The budget only + # needs the byte count, so drop the file once it is measured. + if os.path.isfile(export_path): + try: + os.remove(export_path) + except OSError: + pass print(f"blender={tuple(bpy.app.version)} skip_decimate={skip_decimate}") print( @@ -807,6 +1043,53 @@ def check(skip_decimate, lift_z=False): ) print(f"measured gap_metal_wood={gap_mw:.5f}") + groups = shell_groups(low.data) + zfight = coplanar_zfight_pairs(low.data, groups) + wheels = wheel_shells(low.data, groups) + support_zmins = {} + seats = [] + for side, parts in sorted(wheels.items()): + tb = shell_box(low.data, groups[parts["tyre"]]) + support_zmins["+Y" if side > 0 else "-Y"] = round(tb["zmin"], 6) + depths, _ = tyre_seat_depths( + low.data, groups, parts["rim"], parts["tyre"], WHEEL_SEGMENTS + ) + seats.extend(depths) + support_worst = max((abs(z) for z in support_zmins.values()), default=1e9) + seat_min = min(seats) if seats else -1.0 + seat_max = max(seats) if seats else 1e9 + seat_n = len(seats) + # Mirror: the two wheels are one part reflected in Y, so their rim + # centres must match in X and Z and be opposite in Y. + wheel_mirror = 1e9 + if len(wheels) == 2: + boxes = {} + for side, parts in wheels.items(): + b = shell_box(low.data, groups[parts["rim"]]) + boxes[side] = ( + 0.5 * (b["xmin"] + b["xmax"]), + 0.5 * (b["ymin"] + b["ymax"]), + 0.5 * (b["zmin"] + b["zmax"]), + b["xmax"] - b["xmin"], + b["zmax"] - b["zmin"], + ) + a, b2 = boxes[1], boxes[-1] + wheel_mirror = max( + abs(a[0] - b2[0]), abs(a[1] + b2[1]), abs(a[2] - b2[2]), + abs(a[3] - b2[3]), abs(a[4] - b2[4]), + ) + print( + f"measured zfight_pairs={zfight} shells={len(groups)} " + f"support_zmin={support_zmins} " + f"tyre_seat=[{seat_min:.5f},{seat_max:.5f}] over {seat_n} stations " + f"wheel_mirror={wheel_mirror*1000:.5f}mm" + ) + + if len(wheels) != 2 or any(len(p) != 2 for p in wheels.values()): + return fail( + f"expected 2 wheels of (rim, tyre) shells, found {wheels}", + 3, + ), None, None, None, None, None if not (BASE_TRIS_MIN <= base_tris <= BASE_TRIS_MAX): return fail( f"base tris {base_tris} not in [{BASE_TRIS_MIN}, {BASE_TRIS_MAX}]", @@ -884,18 +1167,49 @@ def check(skip_decimate, lift_z=False): f"doubles={hyg['doubles']} ngons={hyg['ngons']}", 15, ), None, None, None, None, None + if zfight > ZFIGHT_PAIRS_MAX: + return fail( + f"coplanar cross-shell face pairs {zfight} > {ZFIGHT_PAIRS_MAX} " + "(--flush-tyre is the designed fail: a tyre whose inner radius " + "equals the felloe's outer radius puts both on one plane)", + 15, + ), None, None, None, None, None if abs(bb[2]) > ZMIN_EPS: return fail( f"zmin {bb[2]:.6f} not within {ZMIN_EPS} of 0 " "(--lift-z is the designed fail)", 16, ), None, None, None, None, None + if support_worst > SUPPORT_ZMIN_EPS: + return fail( + f"named support zmin {support_worst:.6f} > {SUPPORT_ZMIN_EPS} " + f"per-tyre zmin={support_zmins} " + "(--float-wheel is the designed fail: one tyre off the floor " + "while the other still grounds the AABB)", + 16, + ), None, None, None, None, None if gap_mw > GAP_MAX: return fail( f"metal-wood gap {gap_mw:.5f} > {GAP_MAX} " "(tyres, hubs, straps, and plates must touch the wood they mount to)", 17, ), None, None, None, None, None + if seat_min < TYRE_SEAT_MIN or seat_max > TYRE_SEAT_MAX: + return fail( + f"tyre seat depth band [{seat_min:.5f}, {seat_max:.5f}] outside " + f"[{TYRE_SEAT_MIN}, {TYRE_SEAT_MAX}] over {seat_n} stations " + "(--sink-tyre is the designed fail: the hoop swallowed by the " + "felloe reads as one body, not a tyre)", + 18, + ), None, None, None, None, None + if wheel_mirror > WHEEL_MIRROR_EPS: + return fail( + f"wheel mirror deviation {wheel_mirror*1000:.4f} mm > " + f"{WHEEL_MIRROR_EPS*1000:.4f} mm " + "(--skew-wheel is the designed fail: the two wheels are one part " + "reflected in Y and must sit at matched X and Z)", + 19, + ), None, None, None, None, None return 0, low, high, wood, tex, collider @@ -1019,10 +1333,38 @@ def main(): action="store_true", help="falsification: lift the mesh so zmin fails the grounded budget", ) + p.add_argument( + "--flush-tyre", + action="store_true", + help="falsification: tyre inner radius == felloe outer radius, so " + "both land on one plane and the z-fight budget fails", + ) + p.add_argument( + "--sink-tyre", + action="store_true", + help="falsification: bury the tyre in the felloe so the seat band fails", + ) + p.add_argument( + "--float-wheel", + action="store_true", + help="falsification: lift one wheel off the floor while the other " + "still grounds the AABB, so the named-support budget fails", + ) + p.add_argument( + "--skew-wheel", + action="store_true", + help="falsification: push one wheel out along the track so the " + "wheel-mirror budget fails", + ) args = p.parse_args(argv) code, low, _high, wood, tex, _col = check( - args.skip_decimate, lift_z=args.lift_z + args.skip_decimate, + lift_z=args.lift_z, + flush_tyre=args.flush_tyre, + sink_tyre=args.sink_tyre, + float_wheel=args.float_wheel, + skew_wheel=args.skew_wheel, ) if code: return code diff --git a/showcase/cart/preview.webp b/showcase/cart/preview.webp index 33e7fcfe604a40c6c36556cb7934e59adda4dc6f..28b5a0117246dee524799e25664d5ce4d7d23df6 100644 GIT binary patch literal 25232 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 From 90779ceb9bd75a41f12c10b903a98a0a8c7eb0e2 Mon Sep 17 00:00:00 2001 From: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Date: Tue, 22 Sep 2026 17:44:30 -0400 Subject: [PATCH 2/4] fix(showcase): put the well's posts under the roof corners and tenon them in MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three structural defects, all found by looking at an inspection sheet: 1. The four roof posts stood at 0/90/180/270 degrees while the roof's 4-gon cone is rotated pi/4, so its corners sit on the diagonals. The posts were under the midpoint of each eave: the roof's corners cantilevered 0.80 m unsupported, and one post stood dead centre in the well mouth in every orthographic view. Posts moved to the diagonals, and the windlass, crank and grip turn with them. 2. Each post's bottom face landed exactly on the coping's top face — 4 coplanar cross-shell face pairs, one per post. Posts are now tenoned POST_SEAT into the coping, with POST_TOP held fixed so nothing above them moves. 3. EAVE_HALF was derived from the post ring plus an overhang, giving a 1.64 m roof over a 1.08 m drum: an umbrella, not a well house. It is now derived from what the roof must cover — the curb's own radius plus a named clearance — which brings the AABB to 1.312 m. The bucket hung at z=0.68 with only its rim level with the coping: invisible in the hero and in all six orthographic views. It now hangs BUCKET_CLEAR above the measured coping top and reads in the still. Five new budgets, each recomputed from the generated mesh — the tenon and the bucket clearance measure against the coping top read off the stone material, not against the constant the builder used: - coplanar cross-shell face pairs = 0 - all 12 bottom-course stones on the floor, not just the lowest - post tenon depth banded, per post - each post within 0.02 rad in plan of a roof hip corner - bucket clearance banded above the coping Five new falsifiers. Two needed re-aiming to hit their own budget: --stand-posts also returns the posts to the axis, because flush alone at 45 degrees leaves no coping face within COPLANAR_CENTRE_MAX of a foot; --turn-posts rotates by exactly one curb facet, because any other angle sets the feet on different coping geometry and the gap gate (17) steals the failure, and a full 45 degrees swings the crank past the eave and fails the AABB gate (8). Collider ceiling 320 -> 380: the convex hull of the resized roof measures 346. Also drops the temp .glb once measured. Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> --- docs/gallery/assets/stone-well-hero.webp | Bin 30904 -> 29284 bytes .../stone-well-contact-sheet.webp | Bin 0 -> 52806 bytes showcase/stone-well/README.md | 60 ++- showcase/stone-well/preview.webp | Bin 30904 -> 29284 bytes showcase/stone-well/stone_well.py | 453 +++++++++++++++++- 5 files changed, 477 insertions(+), 36 deletions(-) create mode 100644 docs/gallery/contact-sheets/stone-well-contact-sheet.webp diff --git a/docs/gallery/assets/stone-well-hero.webp b/docs/gallery/assets/stone-well-hero.webp index da5018941da7294e43f85a4d348c14168deee3d8..c4f7637dcfcabb49b2ee4bced86a7c58e719eb2c 100644 GIT binary patch literal 29284 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 X!$9}CF00x%1fA>1pi3=s(2O7eu17%j literal 30904 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 z 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�(iqFq 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

+Ul^sA>cU# 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 literal 0 HcmV?d00001 diff --git a/showcase/stone-well/README.md b/showcase/stone-well/README.md index c951bc2e..ddc65805 100644 --- a/showcase/stone-well/README.md +++ b/showcase/stone-well/README.md @@ -27,23 +27,54 @@ materials, UVs, evaluated LOD, collider, or export file. | Materials | exactly 3 distinct | 3 | | Material faces | stone ≥ 3000, wood ≥ 600, metal ≥ 100 | all above | | UVs | in `0..1`, AABB overlap ≤ 1e-5 | in range, overlap 0 | -| Outer AABB | (1.640, 1.640, 1.761) m ± 0.01 | (1.6400, 1.6400, 1.7606) | +| Outer AABB | (1.312, 1.312, 1.761) m ± 0.01 | (1.3120, 1.3120, 1.7606) | | Grounded | bbox min Z within 1e-4 of 0 | 0.0000 / 0.0000 / 0.0000 | +| Named supports | all 12 bottom-course stones on the floor within 1e-4 | 12/12, worst 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 | +| Post tenon | each post seats 0.015–0.022 m into the measured coping top | 0.01800 / 0.01800 / 0.01800 | +| Post placement | each post within 0.02 rad, in plan, of a roof hip corner recomputed from the mesh | 0.00000 | +| Bucket clearance | hangs 0.085–0.115 m clear of the measured coping top | 0.10000 | | Material-island gap | stone↔wood and metal↔wood min distance ≤ 0.008 m | 0.00000 / 0.00000 / 0.00000 | -| Collider tris | ≤ 320 | 306 | -| Export | written, size > 0 | 686672 / 686736 / 686724 bytes | +| Collider tris | ≤ 380 | 346 | +| Export | written, size > 0, removed after measuring | 690092 bytes on 5.2.1 | DECIMATE COLLAPSE triangle counts are **not** guaranteed identical across series — the gate is a ratio band, not an exact count. This mesh happened to match on 4.5.11 / 5.1.2 / 5.2.1. Bake pixels are stochastic; the gate is `has_data` plus operator `FINISHED`, not byte-identity. Construction -uses no RNG. glTF byte size differs by a few hundred bytes across series. +uses no RNG. glTF byte size differs by a few hundred bytes across +series; the gate is "written and non-empty", not a byte count, and the +file is removed once measured. -`--skip-decimate` skips the LOD DECIMATE stage so LOD1 ratio is 1.0 and -exit 9 fires. `--lift-z` raises the finished mesh 0.05 m so the grounded -budget fails and exit 16 fires. Those are the named budgets the two -falsifiers violate. +## Falsifiers + +Each flag breaks one stage so a **named** budget fails and the piece +exits *that* code. + +| Flag | Target budget | Exit | +| --- | --- | --- | +| `--skip-decimate` | LOD1 ratio band (ratio becomes 1.0) | 9 | +| `--lift-z` | AABB grounded zmin (whole mesh up 0.05 m) | 16 | +| `--stand-posts` | Coplanar cross-shell pairs — puts the posts back on the axis *and* stands them on the coping, which is the pair of choices the shipped piece made (0 → 4 pairs) | 15 | +| `--float-stone` | Named supports — lifts one bottom-course stone 4 mm while the other eleven still ground the AABB | 16 | +| `--shallow-tenon` | Post tenon band — seats the posts only 4 mm, too shallow to be a joint but not flush, so no faces share a plane | 18 | +| `--drop-bucket` | Bucket clearance — lowers the bucket 0.26 m back down the shaft | 18 | +| `--turn-posts` | Post placement — rotates the post ring one curb facet off the roof's hip corners | 19 | + +Two of these had to be re-aimed, which is the point of declaring the +target: + +- `--stand-posts` seats the posts flush **and** returns them to the + axis. Flush alone, at the corrected 45°, leaves no coping top face + within `COPLANAR_CENTRE_MAX` of a foot, so it fell through to the + tenon band (18) and witnessed nothing about z-fighting. +- `--turn-posts` rotates by exactly one curb facet (30°). Any other + angle sets the feet down on a different part of the 12-gon coping and + the stone-wood gap gate (17) steals the failure; a full 45° also + swings the crank grip past the eave and fails the AABB gate (8) — + the same trap `stone-archway`'s `--flat-arch` fell into. One facet is + the only rotation whose local seat geometry is identical by symmetry. ## Run @@ -51,10 +82,15 @@ falsifiers violate. blender --background --python stone_well.py -- blender --background --python stone_well.py -- --skip-decimate blender --background --python stone_well.py -- --lift-z +blender --background --python stone_well.py -- --stand-posts +blender --background --python stone_well.py -- --shallow-tenon +blender --background --python stone_well.py -- --turn-posts +blender --background --python stone_well.py -- --float-stone +blender --background --python stone_well.py -- --drop-bucket blender --background --python stone_well.py -- --output well.png ``` -Smoke does not pass `--output`, `--skip-decimate`, or `--lift-z`. +Smoke passes none of the falsifier flags and no `--output`. ## Exit codes @@ -78,6 +114,8 @@ File-local. `9` is a valid check code. `10` is reserved for | 12 | Bake did not finish or image has no data | | 13 | Export file missing or empty | | 14 | `--output` produced no file | -| 15 | Hygiene: loose geometry, non-manifold, zero-area, doubles, or n-gons | -| 16 | Bbox min Z not grounded (`--lift-z` lands here) | +| 15 | Hygiene: loose geometry, non-manifold, zero-area, doubles, n-gons, or coplanar cross-shell face pairs (`--stand-posts` lands here) | +| 16 | Bbox min Z not grounded (`--lift-z`), or a named support off the floor (`--float-stone`) | | 17 | Material-island gap above tolerance (parts meant to touch) | +| 18 | Post tenon depth outside its band (`--shallow-tenon`), or bucket clearance outside its band (`--drop-bucket`) | +| 19 | A post not under a roof hip corner in plan (`--turn-posts` lands here) | diff --git a/showcase/stone-well/preview.webp b/showcase/stone-well/preview.webp index da5018941da7294e43f85a4d348c14168deee3d8..c4f7637dcfcabb49b2ee4bced86a7c58e719eb2c 100644 GIT binary patch literal 29284 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 X!$9}CF00x%1fA>1pi3=s(2O7eu17%j literal 30904 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 z z-qnec25fr~7aI=*Jt4j7(_XpZOsP%FWBDUtdlrRls%*sonfKzZ5)}*)qgWvjW*=(e zKQmq(LBwu~txVd%ZWvoceX!MQDU+g3KMgiPkg6RH3L^9Q^!_Qv;PkzC>zcalHh1{> z=ai-WnQv`BtU|f@k|gatl%L+y1r#BkdBf>1=}Ony{f)wI0L7E@QClq%d}J54#jR|) zaVJHhSrBF#RZ`nAP9jw!V4QMsL0J~jW2FzK96Dot;U;sj`A-7V%EktLirW7_k3jxx zeU!^<0fL2zUi%Mdt)|k#SXt`bb0U2?DE_^7fMRi zRp)`}^R_dYhxkA)A+Hre#-^!(0_1}yOpIZL%bJ4^%y#}zf~mC(EW=d#;+ka=va9>~ zeQO+kpW8#s{I?y<@f4nkoFgUt_;`PU-@Mihh-@4^lDM#Gfy`6Z~ zrQL7q0ARTI)2k%AFx)XO_=yclw;w7P`Kzl_c!O490MnMlYAd z39ndnGg}D29CO^UNXr^m#E}yTXl%3C&~K|G1=SGq`(=KXbsLQkuN^?{UX}QwMeoM= zsKJVj-(4X3u<`Egv$P-AYF7fg1b?nRue>=vp?R36ks30246_eN)qOzW%fU*_3S2O}6KDy_@NzIP$A9EpeI$dPg-$fW%{kp~~QZl<* zck%CyOPawc?q{6+Km5;y#p`|{${6UiKltP_shko+?kEAP>M)w4K*#8vj;gC`KoLGf z&4i2Z_Gi1wXf6@W>$>~3krpVJ6!+x_ci>8VKj(e)LU!M%dggge}z$%qsnl(J}kED{(cEeN}tbB{If$OD_t9(pVpP&1SI4zft`rT9y?lX7;OyD1Jm& zOo|^om9H5`TO-lLj0>`igGqCXKEC)n`rt#V{s$H%W>=01Y_EEOOwUMU$h-#^i)bfp zqE-<8N)%I@Th4o=9R8W@PXgyDlufUC_b*Ky0OV2b=sz5oZ*KR=Mmak&Wx#U&?IkJb zF$K;O_yC1z_5^J#7kp7Km@k!WX%;~cy*e9$fuP?xl(D>KiQ^Wfiy#Z(^kI^auRBd> zCmtEUAXjr4_Z8gY%UVqIcr>;Q5DiHk=*Hl9(|3~e*M)L^&dVsGW$y5Wp3@m+HaDcyhazXNgJx~g+^ zqXpiesI9%OblR5^vnS^!q(UL2kOjA%JMijIG`!M36M>Z$U84o8wKh(eY-L6U`+|`A zIe+)1WAi~G*-9hTNjmF%_&-j92{J_@0=iiHwov+BMd?M?OenYrMp1J%s13 z+y`C>PS6}e@Ry0b3^rru9?0G(eF4nPRVzVRP;H#ExKX-`GhJZVAu4DK!cIAK*Odn| zgzIm#X-`WA-1tEQN0pmx8owVpE%Jys(XS==j-7EU&XM?L*t1c$R7M)k{0rt z&M7bNAOCUf8PrRA%QDB2c9Y?pitOXWj-F7HH`b>SF3)p1U>=-{(Jm_^5B%t`wPpXs&kWg5{SroV}xxs~%Y#(yC6JHWzqNh?wjN zhjluK>pGZP;-Uxpbc;}2gjSa8fc%YY@yP-Vq#SuN4`g6EYPXXZ0DjvEalF@`^xyUf z!AMvT#t0|h9*jGyJJ9p*!n6X^)W-IP`Utu00%V(epUH>p2vBmnNpSs=2VEvLdQu`T z`_8my~cKNj!}Uo6FPGfMo#9R2&ax2jz5qhO+j4iY#No z4`V74+c|vm-RXvVZEHaFatTz*74-Y}F^w*_(>qzv>|1X%m0-|ADhXswxNhy4;-;9< zX9%tQy_?fcu~)ZC*3I1g4|z%~9b}fj9j&cClRjeJvwb=U1pgxhEO~rDk@$`i&%58i zJuuvxC6&pZQR>(8RPehnacum}v8tXlEl90e#^;B%ZQ@6I_>4j9bfMqONMBhKgDlB( znm9(4rMTjBA}Kdq@4V|wVc!REdj;z*6vB<{O{{ZhYFr4uNmz}%0 zeywM~E^@?h-P82@jT17tP`6CD+QIJaS}C?lz%}eMwC;wc;#^3~7Cv`$%w1symn|Dk zb}9q#`iV9s@5pu;%Ys$A4lYC4QZY7aB4l3!vC*cNGKENjfw+6p{yLttD_iZ1k*+@< zyve&FtzlxLao`U??9~jJKx%S9c&Vk zn8t>pS#j!iWIAWO>xUr+y9Jg9Ag8vG@(IZd`9Z<*ML?=xKaKxU^fc*8WjN@ppGdnW ziR^YEO2K{c-^jsSO*g#SUjiZ6;>z0z_8Qkp6ApqZYRr>^_EQ;lwh^uJ8XD&TivZZu zA`2>|I2N1&t1QqLR|E!QksoHwM{GW_x;(Iq!xG42)(pXCR`2>c%M=Wi@7Nf`Kg71! zfI|h>hmU64(YhVNMFB0>TDUy`%2U9!j~5Y%-mcj9L?>TDJD4EK%5vtR&ZH%=b$Uc(qa|{o7}2@d%cNxFi zvZ80<`3+d_^m0T2lyqk#B0I(}w*87^QtOqV{$ zatdp`6K)2jtH5Tt8+#fBvGop73#efh$AMv0l*bQA{qbv{->c;25z{S0g@^0u_27J} zTY9^p;_)Ml_K&Y?EpS0^EoP3?zYCA)j)jpDWnxZB(RajFR$8U9D&!XgoS2aFQ+xvL zlHO%x9(pJL>F~Tdt`vEs<8V&t4-_Z%Zfq6J3`i331UYnJIty~lTtZ}KESu?C7s36% z+Fo(>$V_*GwI36XGj`GA*<|uR8)@X^0Ev zRRQ^x^3t3hW(Y!WcPjh6;38t?J#;mVLT>D|stjkVMGa(Fc3X6Ksj?djBbaDU`zs2C z!PTWK4gS&AI{BfK%~iRh`ZBO>>_73hp>WwUMLO(3*9`a&zFZZ1wkrHK5(VX{1= zB+k)A*o&YW5WLzb(93FI56=^zTsZ_XB5{P1Ca=+4xHN9L7+HJY6==pk`F#bqz74P+ z^t#lb0D}%NevZI;(ZA=i4>8q#3_U4SJ$Q~70g?WpV}If_2_Or8s$2TyGNoG9f>xH}7??aM zEZL99L4&AB0{avkj;yn)WH7GUiNT)TC`=E^75}g0iXS|9IZOb#`jhU-l=J}r&AHVg z`?dGzgJYwDR?*Oj_fTm&lys$uEf=?b_@svVb$WNVL(KkcaNI^zSof66ZjC^pRhJP@ z)Utn|x2lS6I(H`xlx+5zcs4JZ)su~Km44}B!u&PCy_7T{p3A|Mq&uf!^LJXbZTYy8 z9;{ed0o3&GfAH%oqgfdQ1xBTlZ*yj2K!+$SSV6daLA`*hEsE8r^>Nomrnqob=}C#) z2KYa{I(jgS^jUFRR}Cwx1)Hv?5`_%?e?Pz#$e59g0obaBoqwdT;lctscwrEsZ6pnd zG(vfh_ZsDvqO2N%@0$Q!VDRaoto-{;%q+SvO)N)uCkcAL3ex9-jvD(4cl7d2Q>YO( z$Xopq>iIv{Od?4C@S!3Vf(RVJhLPnjNTqxlCs~LQo>~#WwtEEcx_m#ILLQEkt1sgW zL(%rUex4pA51%MrJB*V^G$^pITI#Q*Md6dxj|e`Kbn@5$N*frQ~)NvO0Lp=v#5AP2KHC^EK;LLZ)0%XG&Y6 zMd*CpOAK%Drh4@08W#09=p~*#hUxstxAJ0VI|N))rhn(MgTE?$W}U7pMny>@N=11a z1(%>r5HGq_i+<{F{rI!6SjhSsF60I#&(-dR@k8bW3Pb`!6-84E`s95gk^lYKCROBs zf7M0jOxcsfiFWEoD_*NS=m#Cwz#gq@xm%P+08>d`8+r|&tHov)>z$D^FRC(83GX;x z*Ub0L@?*x7Zwq9bn0J5(%ZK`=C=dN(<6q0h4AaVB$@qAvtVi`xeta>#F&Gl^cQB({^Rh74oXR-@nn70QN%TYRY)>) zn;=nENs`7y^!oN3BFfFR%HRwgrZ}`54kC4ih@4Q9h0P!Hg-087YgbE*Qa+q|)nrwQ zhYo>-^jf@ySD8NP<%#aO+@?yK>tZnyQg%D6e(uakwAAVCq1AI<&6Xhh#G)`OnPe5Hzq*)c3uU6R8OjPujwU%u^$v|=7b<<6E1~` zUe2QZ$2yVdd*xl}NpF=|u+fMSfyRM)wP2si0m%kW7a#}+vAWBRL^&uRC()f0Ev1_~ z0w0yM#LdCij!&@Cn)aHBR+D|!6d@5Uh~}pT=~E}7$EzZ?nuJ2;DcPh`G%v%JH?o*_ zEo-4rx#9O{ zsQJ~e^t}?2d@$Z_uSS1)O^WVxg+D-D?SqenL=e9!NF7L*%}zwLJZ|YZArB>61`W;u zYttbHJd$9r{pAlPmO4gq6=GTokFVn&1$J7UEoio1Vk<^KX&0VXiBuZVdglOCI({Ka z7yE?h!z#B`)U3A13A#|AlKr_UWF(AusAp$kxeg-Cvz7zc z&4QdN!6Yd27|0~0-(~%TE*8`xcwR=rXueS~S59Q9PehZlqRil!Ha%ytL68@gzOAd- zpU4E?zLZ>8#btCHxczwAv({jt2v7`N7Y++6Si%6yVk^K-qCCvNn)B>jeygS8>jQU% zIie4f0V^ye=sRd@Ti|vhkBkis@g1P@klFY7rexE;m^uk8^|HA6r5sJ=Gb1IkGKQs51P-1LDRcvS4ysNZo?bN7y#5mPPhIBNA;O3;E8MUCRj zDkmTf3s1jQsgJY*xH@1IMJC|--YV=y>x#q~i@jcL66UxsQ>W~AMp{%*DO(*#Ol=X4FSrp`0^(pd^CpSyp}TD0>iAq_9f$X6TiIJOYr8=6%zfRe>Sj z|Lw@Zw(g0yGvj)mUhqOc_bkfP>74k9&2rmu{_qI|!+qTg*7qbR-QDmM1`%olxon6) z3j(k!fuT9A3Krqm+0F}Yq)lmlqR1^FW$MdO_W#M8u@*&B>g5ZwuSHTmFJ+Z4#3zOk zJ<{8b9m8#%1e~Cf9p|t7+PqeGhwi6+-Sz6&dgzQqDfy<+R3qheWM{;AgtJSPHsrCB zQ~c@+Z0CG`=~fF@;fbaa|KJB7q!ifA-($$1yE#={%;&;iUd?fM=@Dnq?KdG_jGI(c zhHNNCONA;UNa*ERx|Fvio3#ab-lVVa@I*~Bz6%t!ZgFx6f`8-(pMDiWwVUm#uG zG6`w1dKldmomtVI&oJ$(OHcs`!ZlV!o); zb}c%#Z#w9Ree4q#+T#{>GM#{Vj@i{1@!hq$ZCNYa9-Q5^Q}0#J@1%fG^PH5dm#y*T zLXjz((a0O-^3*$tSa+4_;C)ZW&LJ|dOl!imPVa~{w7GL0|_4f1{RnY)@d8Tx?gH8 z7+ewyg_qOK8xg!OT>~&?+~Cu3cO7kki75ZXE6`-3w0qzQv$&^;Kn^b8=m9(ce~pGv z17p?>q$Z^>a;m#@!ISIT;|tDmJcUyb-n|f9l0*KvpAiHHB=f0z`?_Ih-C#sku3nRt zalgW{Tp6wD3Z_1U{r6t5`E@4C57y#CEx(|*d!n+82W%yHKaQX zPoUC1;SPcOR*L{E^z%+T6!m(QKUqq}_+gm{Hq$${l9lQlR9$N*E5sRXFPqhwF4IRp zlO`QXSGo&=D2>ZlCZB_!HUlP$1Bg6ci9iz%z!}tH1j`#2Pkp|=C}(r>sdzB0Ciwm) zVg5<7E!UOUG!r(QF%fyx4eAN}LEw+!=u1!KUsXfm-~tzBCl0^Vr_NoXINr4hD2lL+ z3D&tZ7s?=%y58gi&`Af%Yxa}!Y@QaTt4@?zEx*s`T z_^0)&wkv<`cIA{ZVsk5;LP`vKXxr0T-GQVW4E8eLH8Hwfw{HuwwDdY|$ch17)fj9B3YFbp&HCD~!bgSb;-fw1%EBk{*hFn%7Pvy`!OaA`iO zms0>CV5)vUa|kRb2fOVxZYlgVH!J;g6HDWqM{ORDRF2R%oNTRmHXQH^8U$~DmUH6p z_`FE)_gf}q5LMgxO!AJ^lUb_k6dL#hM#L=lO*CU1Xp22tN+JRxV)OtDf8sCzEx-W; z-+q8A#uODaC?@gmFJGXi49{`&ANsN*P=ZF&*Cz4F-V4mv0I;`LlV}Rv-upNoHiGi( zhh-hg;o@e7bYK0jx#ESG>sbv;pR#&RAPNTlCLX^!@NTo$r z!j7ZWaqIHZA+VTDe>vI4yc`Rwun7Lo^!8l&cxD{C4FGb}?`}Z`%O+$WP-G9J!bKxW z$Duvr+!}|Fx80IC^grRm#N+XvPrOj}WJpEFEw7Gb5j^1#pot90IeZj3wEeSS0Og*O zIp+A0*_5aTD7twt`KOSfaE{de!3pmPot4h4yyz1hA5NF?99_4V!sS@TQ~q*xLt5Ix zSKQNwbBDvVuxR!{DzCL0;%NlFZ|u%H*z7E0oCUrM4zJN7u9moCp{68vhU5-Fh>J!G z=fS^O08rF%@Bc*-!YWxUz$wQ7fcXHPgb6?+056=&W;^BBoONV7NJyi<lm(Iy8YHL$&L>eZQ6SXw!tRmZ49oE>56w4%)n! zzz?&_$`a~D35^<~bgSs(R1#zZb!sbVel8)Oz<6_#DmBcjhCed`-JvAt0bY}Dj(SB~ zI5lV}B6eRYm?b?K_5Xg6*oJE6N%l5R?yC71jjoQAmXzPlH<2b!zhCJyYjU6FqMOvG zEWZT=VTfGJrQO|cSAN%^!tjf@*AlynHEKOx$Z|s2?~$mW@cy&0 zQqt9vumM}Pp&GF%-f3` COPLANAR_CENTRE_MAX: + continue + if abs(abs(ni.dot(nj)) - 1.0) > COPLANAR_NORMAL_EPS: + continue + if abs(ni.dot(cj - ci)) > COPLANAR_PLANE_EPS: + continue + hits += 1 + return hits + + +def post_shells(me, groups): + """The four roof posts, found in the generated mesh by their geometry. + + A post is a wood shell that spans the curb line vertically and is + square and slender in plan — never looked up by a construction index. + """ + wood = set() + for p in me.polygons: + if p.material_index == WOOD_IDX: + wood.add(int(p.vertices[0])) + out = [] + for si, g in enumerate(groups): + if not any(i in wood for i in g): + continue + b = shell_box(me, g) + dz = b["zmax"] - b["zmin"] + dx = b["xmax"] - b["xmin"] + dy = b["ymax"] - b["ymin"] + if not (0.4 <= dz <= 0.8) or max(dx, dy) > 0.25: + continue + out.append((si, b)) + return out + + +def measured_curb_top(me): + """Top of the masonry, read off the generated mesh, not from CURB_TOP. + + An assertion that restates the constant the builder used witnesses + nothing, so the post tenon is measured against the stone the post is + actually tenoned into. + """ + stone = {int(p.vertices[0]) for p in me.polygons + if p.material_index == STONE_IDX} + return max(me.vertices[i].co.z for i in stone) + + +def roof_corners(me, groups): + """The roof's four hip corners, recomputed from the generated mesh. + + The corner verts of the widest wood shell above the eave: its four + extreme XY points. Nothing here restates EAVE_HALF. + """ + pts = [v.co for v in me.vertices if v.co.z >= EAVE_Z - 0.12] + if not pts: + return [] + zlo = min(p.z for p in pts) + eave = [p for p in pts if p.z <= zlo + 0.05] + if not eave: + return [] + # The four extreme points of the pooled eave ring are the hip corners. + # Taking them from a single shell picks one fascia board instead, whose + # own extremes sit 90 degrees off the corners they are nailed to. + corners = [] + for qx, qy in ((1, 1), (-1, 1), (-1, -1), (1, -1)): + corners.append(max(eave, key=lambda p: qx * p.x + qy * p.y)) + return corners + + +def drop_bucket(me, dz): + """Falsifier surgery: lower the hung bucket assembly back down the shaft. + + Everything inside the mouth above the curb and under the windlass — + which is the bucket, its hoops and its bail — moves as one body. + """ + groups = shell_groups(me) + for g in groups: + b = shell_box(me, g) + if b["zmin"] < CURB_TOP or b["zmax"] > POST_TOP - 0.10: + continue + if max(b["xmax"] - b["xmin"], b["ymax"] - b["ymin"]) > 2.5 * BUCKET_R_TOP: + continue + for i in g: + me.vertices[i].co.z -= dz + me.update() + + +def float_one_stone(me, dz): + """Falsifier surgery: lift one bottom-course stone off the floor. + + The other bays stay down, so the AABB grounded gate still passes and + only the named-support budget can catch it. + """ + groups = shell_groups(me) + floor_z = min(v.co.z for v in me.vertices) + for g in groups: + b = shell_box(me, g) + if b["zmin"] > floor_z + 1e-5 or b["zmax"] > floor_z + STONE_H * 1.6: + continue + for i in g: + me.vertices[i].co.z += dz + break + me.update() + + def min_mat_distance(me, ia, ib): """Closest surface distance between two material islands via BVH. @@ -805,10 +1047,28 @@ def export_unity(path, objects): ) -def check(skip_decimate, lift_z=False): +def check(skip_decimate, lift_z=False, stand_posts=False, turn_posts=False, + float_stone=False, drop_bucket_flag=False, shallow_tenon=False): bpy.ops.wm.read_factory_settings(use_empty=True) - low = build_well_mesh("WellLow", bevel_offset=0.010, bevel_segments=2) - high = build_well_mesh("WellHigh", bevel_offset=0.010, bevel_segments=4) + # --stand-posts reproduces the shipped bug exactly: posts on the axis + # AND standing on the coping, which is the pair of choices that put a + # foot and a curb top on one plane. Seating alone at 45 degrees leaves + # no curb top face within COPLANAR_CENTRE_MAX of a foot, so it would + # fall through to the seat band and witness the wrong budget. + seat = POST_SEAT + if stand_posts: + seat = STAND_POST_SEAT + elif shallow_tenon: + seat = SHALLOW_TENON_SEAT + turn = 0.0 + if stand_posts: + turn = STAND_POST_TURN + elif turn_posts: + turn = TURN_POSTS_ANGLE + low = build_well_mesh("WellLow", bevel_offset=0.010, bevel_segments=2, + post_seat=seat, turn_posts=turn) + high = build_well_mesh("WellHigh", bevel_offset=0.010, bevel_segments=4, + post_seat=seat, turn_posts=turn) stone = principled( "WellStone", (0.40, 0.42, 0.46, 1.0), 0.0, 0.84, noise_scale=9.0, wear=(0.29, 0.30, 0.33, 1.0), @@ -827,6 +1087,10 @@ def check(skip_decimate, lift_z=False): for v in low.data.vertices: v.co.z += LIFT_Z low.data.update() + if float_stone: + float_one_stone(low.data, FLOAT_STONE_Z) + if drop_bucket_flag: + drop_bucket(low.data, DROP_BUCKET_Z) if low.data is None or len(low.data.polygons) < 6: return fail("well mesh did not build", 3), None, None, None, None, None @@ -869,6 +1133,15 @@ def check(skip_decimate, lift_z=False): os.remove(export_path) export_unity(export_path, [low, collider]) export_size = os.path.getsize(export_path) if os.path.isfile(export_path) else 0 + # Blender sets TMPDIR from its own preference, which resolves to the + # working directory on a stock portable build — so gettempdir() is the + # repo root under CI and every run left a .glb behind. The budget only + # needs the byte count, so drop the file once it is measured. + if os.path.isfile(export_path): + try: + os.remove(export_path) + except OSError: + pass print( f"blender={tuple(bpy.app.version)} skip_decimate={skip_decimate}" @@ -899,6 +1172,62 @@ def check(skip_decimate, lift_z=False): ) print(f"measured gap_stone_wood={gap_sw:.5f} gap_metal_wood={gap_mw:.5f}") + groups = shell_groups(low.data) + zfight = coplanar_zfight_pairs(low.data, groups) + # Named supports: every bottom-course stone, not just the lowest one. + floor_z = bb[2] + supports = [] + for g in groups: + b = shell_box(low.data, g) + if b["zmin"] < floor_z + 0.02 and b["zmax"] < floor_z + STONE_H * 1.6: + supports.append(b["zmin"] - floor_z) + n_support = len(supports) + support_worst = max((abs(z) for z in supports), default=1e9) + # Post tenon depth, recomputed per post from the generated curb top. + posts = post_shells(low.data, groups) + n_posts = len(posts) + curb_top = measured_curb_top(low.data) + seats = [curb_top - b["zmin"] for _si, b in posts] + seat_min = min(seats) if seats else -1.0 + seat_max = max(seats) if seats else 1e9 + # Each post stands under a hip corner of the roof, in plan. + corners = roof_corners(low.data, groups) + post_corner = 1e9 + if posts and corners: + worst = 0.0 + for _si, b in posts: + px = 0.5 * (b["xmin"] + b["xmax"]) + py = 0.5 * (b["ymin"] + b["ymax"]) + pa = math.atan2(py, px) + best = min( + abs((math.atan2(c.y, c.x) - pa + math.pi) + % (2.0 * math.pi) - math.pi) + for c in corners + ) + worst = max(worst, best) + post_corner = worst + # Bucket clearance above the curb. + bucket_clear = -1.0 + metal_v = {int(p.vertices[0]) for p in low.data.polygons + if p.material_index == METAL_IDX} + for g in groups: + b = shell_box(low.data, g) + if b["zmin"] < curb_top or any(i in metal_v for i in g): + continue + if (b["xmax"] - b["xmin"]) > 2.5 * BUCKET_R_TOP: + continue + if b["zmax"] - b["zmin"] > BUCKET_H * 1.4: + continue + cand = b["zmin"] - curb_top + if bucket_clear < 0 or cand < bucket_clear: + bucket_clear = cand + print( + f"measured zfight_pairs={zfight} shells={len(groups)} " + f"grounded_stones={n_support} support_worst={support_worst:.6f} " + f"posts={n_posts} post_seat=[{seat_min:.5f},{seat_max:.5f}] " + f"post_hip_offset={post_corner:.5f} bucket_clear={bucket_clear:.5f}" + ) + if not (BASE_TRIS_MIN <= base_tris <= BASE_TRIS_MAX): return fail( f"base tris {base_tris} not in [{BASE_TRIS_MIN}, {BASE_TRIS_MAX}]", @@ -981,12 +1310,27 @@ def check(skip_decimate, lift_z=False): f"doubles={hyg['doubles']} ngons={hyg['ngons']}", 15, ), None, None, None, None, None + if zfight > ZFIGHT_PAIRS_MAX: + return fail( + f"coplanar cross-shell face pairs {zfight} > {ZFIGHT_PAIRS_MAX} " + "(--stand-posts is the designed fail: a post foot standing on " + "the coping's top face puts both on one plane)", + 15, + ), None, None, None, None, None if abs(bb[2]) > ZMIN_EPS: return fail( f"zmin {bb[2]:.6f} not within {ZMIN_EPS} of 0 " "(--lift-z is the designed fail)", 16, ), None, None, None, None, None + if n_support != SUPPORT_COUNT or support_worst > SUPPORT_ZMIN_EPS: + return fail( + f"grounded bottom-course stones {n_support}/{SUPPORT_COUNT}, " + f"worst zmin {support_worst:.6f} > {SUPPORT_ZMIN_EPS} " + "(--float-stone is the designed fail: one bay lifted off the " + "floor while the rest still ground the AABB)", + 16, + ), None, None, None, None, None if gap_sw > GAP_MAX: return fail( f"stone-wood gap {gap_sw:.5f} > {GAP_MAX} " @@ -999,6 +1343,30 @@ def check(skip_decimate, lift_z=False): "(crank, hoops, and bail must touch the wood they mount to)", 17, ), None, None, None, None, None + if seat_min < POST_SEAT_MIN or seat_max > POST_SEAT_MAX: + return fail( + f"post tenon depth band [{seat_min:.5f}, {seat_max:.5f}] outside " + f"[{POST_SEAT_MIN}, {POST_SEAT_MAX}] over {n_posts} posts " + "(--shallow-tenon is the designed fail)", + 18, + ), None, None, None, None, None + if bucket_clear < BUCKET_CLEAR_MIN or bucket_clear > BUCKET_CLEAR_MAX: + return fail( + f"bucket clears the curb by {bucket_clear:.5f} outside " + f"[{BUCKET_CLEAR_MIN}, {BUCKET_CLEAR_MAX}] " + "(--drop-bucket is the designed fail: a bucket down the shaft " + "shows only its rim and the piece loses its subject)", + 18, + ), None, None, None, None, None + if n_posts != POST_COUNT or post_corner > POST_CORNER_EPS: + return fail( + f"posts {n_posts}/{POST_COUNT}, worst post-to-hip-corner plan " + f"offset {post_corner:.5f} > {POST_CORNER_EPS} " + "(--turn-posts is the designed fail: posts at the midpoint of " + "each eave leave the roof's corners cantilevered and stand one " + "post in the well mouth)", + 19, + ), None, None, None, None, None return 0, low, high, stone, tex, collider @@ -1122,10 +1490,45 @@ def main(): action="store_true", help="falsification: lift the mesh so zmin fails the grounded budget", ) + p.add_argument( + "--stand-posts", + action="store_true", + help="falsification: stand the posts on the curb instead of tenoning " + "them in, so foot and coping land on one plane", + ) + p.add_argument( + "--shallow-tenon", + action="store_true", + help="falsification: tenon the posts only part way into the curb so " + "the seat band fails without putting faces on one plane", + ) + p.add_argument( + "--turn-posts", + action="store_true", + help="falsification: rotate the post ring off the roof's hip corners " + "to the midpoint of each eave", + ) + p.add_argument( + "--float-stone", + action="store_true", + help="falsification: lift one bottom-course stone while the rest " + "still ground the AABB", + ) + p.add_argument( + "--drop-bucket", + action="store_true", + help="falsification: lower the bucket back down the shaft", + ) args = p.parse_args(argv) code, low, _high, stone, tex, _col = check( - args.skip_decimate, lift_z=args.lift_z + args.skip_decimate, + lift_z=args.lift_z, + stand_posts=args.stand_posts, + turn_posts=args.turn_posts, + float_stone=args.float_stone, + drop_bucket_flag=args.drop_bucket, + shallow_tenon=args.shallow_tenon, ) if code: return code From 9bd954d88acf722fe706f595c96c678287cecbe2 Mon Sep 17 00:00:00 2001 From: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Date: Tue, 22 Sep 2026 17:44:44 -0400 Subject: [PATCH 3/4] fix(examples): make ngon-triangulate's falsifier actually falsify `--skip-triangulate` printed an error and returned 4 from its own branch. The flag announced a failure rather than causing one, and the handling assertions it exists to falsify never ran. It now skips the repair and lets those assertions catch the unrepaired mesh, which reports the real measurement (`ngons=1 tris=0 quads=4`). The contract, the assertions and the exit codes are unchanged. Proven identical before and after on 4.5.11 LTS, 5.1.2 and 5.2.1 LTS: default 0, --no-dissolve 3, --skip-triangulate 4. README: adds the verified `calc_tangents` abort text, which is byte-identical on all three binaries, a falsifier table naming what each flag breaks, and 4.5/5.2 API links for calc_tangents, dissolve_edges and triangulate. Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> --- examples/ngon-triangulate/README.md | 34 ++++++++++++++++++- examples/ngon-triangulate/ngon_triangulate.py | 17 +++++----- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/examples/ngon-triangulate/README.md b/examples/ngon-triangulate/README.md index 320e8bf3..316368e8 100644 --- a/examples/ngon-triangulate/README.md +++ b/examples/ngon-triangulate/README.md @@ -22,6 +22,38 @@ glTF tris = 12 for a cube *or* this mesh. `--skip-triangulate` exits 4. No gallery still. A hexagon on a cube does not read at thumbnail without fake annotation. +## Verified behaviour + +`Mesh.calc_tangents` raises `RuntimeError` on any face with more than +four loops. The message is byte-identical on 4.5.11 LTS, 5.1.2, and +5.2.1 LTS: + +``` +Error: Tangent space can only be computed for tris/quads, aborting +``` + +`TANGENT_ABORT` matches on the `tris/quads` substring, so the check +survives a reword of the surrounding sentence but still fails if the +abort stops happening at all. + +## Falsifiers + +Each flag breaks one stage and lands on the assertion that stage feeds. +Neither announces a failure; both let a real check catch the mesh. + +| Flag | What it breaks | Exit | +| --- | --- | --- | +| `--no-dissolve` | never makes the n-gon, so the pre-assertion finds no pathology (`ngon count 0 != 1`) | 3 | +| `--skip-triangulate` | skips `bmesh.ops.triangulate`, so the handling assertion sees the n-gon survive (`ngons=1 tris=0 quads=4`) | 4 | + +## API reference + +| Name | 4.5 LTS | 5.2 LTS | +| --- | --- | --- | +| `Mesh.calc_tangents` | [4.5](https://docs.blender.org/api/4.5/bpy.types.Mesh.html#bpy.types.Mesh.calc_tangents) | [5.2](https://docs.blender.org/api/current/bpy.types.Mesh.html#bpy.types.Mesh.calc_tangents) | +| `bmesh.ops.dissolve_edges` | [4.5](https://docs.blender.org/api/4.5/bmesh.ops.html#bmesh.ops.dissolve_edges) | [5.2](https://docs.blender.org/api/current/bmesh.ops.html#bmesh.ops.dissolve_edges) | +| `bmesh.ops.triangulate` | [4.5](https://docs.blender.org/api/4.5/bmesh.ops.html#bmesh.ops.triangulate) | [5.2](https://docs.blender.org/api/current/bmesh.ops.html#bmesh.ops.triangulate) | + ## Run ```bash @@ -41,7 +73,7 @@ against it. | 1 | Uncaught exception (FATAL wrapper) | | 2 | argparse / usage | | 3 | Pathology missing: n-gon count, loops, or face count (`--no-dissolve` lands here) | -| 4 | `calc_tangents` / triangulate handling (`--skip-triangulate` lands here) | +| 4 | `calc_tangents` / triangulate handling (`--skip-triangulate` lands here, via the real handling assertion) | The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS (5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch). diff --git a/examples/ngon-triangulate/ngon_triangulate.py b/examples/ngon-triangulate/ngon_triangulate.py index 394d7ba5..a437cb0e 100644 --- a/examples/ngon-triangulate/ngon_triangulate.py +++ b/examples/ngon-triangulate/ngon_triangulate.py @@ -9,7 +9,9 @@ * 5 faces, 1 n-gon, that face has 6 loops * ``Mesh.calc_tangents`` aborts until triangulated - (same abort ``triangulate-tangents`` documents) + (same abort ``triangulate-tangents`` documents). The message is + byte-identical on 4.5.11 LTS, 5.1.2 and 5.2.1 LTS: + "Error: Tangent space can only be computed for tris/quads, aborting" * triangulate the n-gon → 4 tris + 4 quads, 28 loops, tangents succeed glTF tri count is 12 either way (hexagon+quads or a cube) — not a @@ -117,13 +119,12 @@ def check(ob, skip_triangulate): file=sys.stderr, ) return 4 - if skip_triangulate: - print( - "ERROR: skip-triangulate left the n-gon; handling unrepaired", - file=sys.stderr, - ) - return 4 - triangulate_ngons(me) + # --skip-triangulate skips the repair and lets the handling assertions + # below catch the unrepaired mesh. Returning 4 from here instead would + # make the flag announce a failure rather than cause one, and the + # assertions it is supposed to falsify would never run. + if not skip_triangulate: + triangulate_ngons(me) leftover = ngons(me) tris = sum(1 for p in me.polygons if len(p.vertices) == 3) quads = sum(1 for p in me.polygons if len(p.vertices) == 4) From b2fbda2696cc648ffa18c3cf614c377efe7e62b6 Mon Sep 17 00:00:00 2001 From: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Date: Tue, 22 Sep 2026 17:44:45 -0400 Subject: [PATCH 4/4] docs(showcase): fold this pass's defects into the shared conventions Seven conventions every future piece inherits, each from a defect in this pass that no existing budget could see: a band is hooped onto its host and never set flush against it; a member is tenoned into its seat and never stood on it, measured against the host read off the mesh; posts go under a roof's corners, with the corners taken from the pooled eave vertices rather than one fascia board; a roof is sized from what it covers, not from what carries it; the subject hangs where it can be seen; mirrored assemblies pair and compare, with the falsifier sized inside BBOX_TOL; and segment counts are a silhouette budget. Also registers this pass's falsifier flags in the shared list and regenerates the gallery for the two rebuilt pieces. Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> --- docs/gallery/cart/index.html | 364 ++++++++++++++++++++++- docs/gallery/index.html | 4 +- docs/gallery/stone-well/index.html | 463 +++++++++++++++++++++++++++-- showcase/README.md | 64 ++++ showcase/gallery.json | 4 +- 5 files changed, 851 insertions(+), 48 deletions(-) diff --git a/docs/gallery/cart/index.html b/docs/gallery/cart/index.html index ef77656c..9fcd5c90 100644 --- a/docs/gallery/cart/index.html +++ b/docs/gallery/cart/index.html @@ -253,7 +253,7 @@

cart

cart render

Rendered headless by the showcase piece itself — click to zoom.

-
witnesses Recomputed: 2600 tris, two materials with metal and wood face floors, UVs in 0..1 with zero AABB overlap, outer AABB 1.539×0.749×0.640 m, LOD ratios in band, convex collider 122 tris, hygiene zero (loose, non-manifold, doubles, n-gons), grounded zmin, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget; --lift-z exits 16 on the grounded budget.
+
witnesses Recomputed: 2856 tris, two materials with metal and wood face floors, UVs in 0..1 with zero AABB overlap, outer AABB 1.539×0.749×0.640 m, LOD ratios in band, convex collider 154 tris, hygiene zero (loose, non-manifold, doubles, n-gons), zero coplanar cross-shell face pairs, both tyres grounded, tyre seat depth in band over 48 angular stations, the two wheels mirrored within 5e-5 m, grounded zmin, non-empty glTF. --flush-tyre exits 15 on the z-fight budget; --sink-tyre exits 18 on the tyre seat band; --float-wheel exits 16 on the named-support budget; --skew-wheel exits 19 on the wheel mirror; --skip-decimate exits 9 on the LOD1 ratio budget; --lift-z exits 16 on the grounded budget.
blender --background --python showcase/cart/cart.py --
@@ -264,18 +264,25 @@

cart

Composes skills mesh-editing-and-bmesh, bake-high-to-low, depsgraph-and-evaluated-data, engine-export-presets, and snippets bake_normal_high_to_low.py, setup_bake_target_image.py, lod_chain.py / decimate_to_budget.py, convex_hull_collider.py, export_preset_unity.py (helpers copied, not imported as a package).

Budgets

Declared as named constants; every gate recomputes from the mesh, materials, UVs, evaluated LOD, collider, or export file.

-

| Axis | Declared | Measured (4.5.11 / 5.1.2 / 5.2.1) | | --- | --- | --- | | Base triangles | 2470–2900 | 2600 / 2600 / 2600 | | 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 0..1, 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 | | Hygiene | loose V/E, non-manifold, zero-area, doubles @1e-5, n-gons: all 0 | 0 / 0 / 0 on every axis | | Material-island gap | metal↔wood min distance ≤ 0.008 m | 0.00000 / 0.00000 / 0.00000 | | Collider tris | ≤ 360 | 122 | | Export | written, size > 0 | 201048 / 201048 / 201032 bytes |

+

| 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 0..1, 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'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 > 0 | 201048 / 201048 / 201032 bytes |

DECIMATE COLLAPSE triangle counts are not 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 has_data plus operator FINISHED, not byte-identity. Construction uses no RNG. Export byte counts differ by 8 B on 5.2.1 (glTF serializer), not a gated axis.

-

--skip-decimate skips the LOD DECIMATE stage so LOD1 ratio is 1.0 and exit 9 fires. --lift-z raises the finished mesh 0.05 m so the grounded budget fails and exit 16 fires. Those are the named budgets the two falsifiers violate.

+

Falsifiers

+

Each flag breaks one stage so a named 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 BBOX_TOL, so the AABB gate (exit 8) still passes.

+

| Flag | Target budget | Exit | | --- | --- | --- | | --skip-decimate | LOD1 ratio band (ratio becomes 1.0) | 9 | | --lift-z | AABB grounded zmin (whole mesh up 0.05 m) | 16 | | --flush-tyre | Coplanar cross-shell pairs — sets the tyre's inner radius equal to the felloe's outer radius, which is the construction bug this piece was rebuilt to remove (0 → 48 pairs) | 15 | | --sink-tyre | Tyre seat band — buries the hoop 9 mm into the felloe so it reads as one body | 18 | | --float-wheel | Named supports — lifts one wheel 3 mm while the other still grounds the AABB | 16 | | --skew-wheel | Wheel mirror — pushes one wheel 6 mm out along the track | 19 |

+

--lift-z and --float-wheel share exit 16 and fail different budgets: --lift-z fails the AABB gate, which fires first; --float-wheel leaves the AABB grounded, so only the per-tyre support check can catch it.

Run

blender --background --python cart.py --
 blender --background --python cart.py -- --skip-decimate
 blender --background --python cart.py -- --lift-z
+blender --background --python cart.py -- --flush-tyre
+blender --background --python cart.py -- --sink-tyre
+blender --background --python cart.py -- --float-wheel
+blender --background --python cart.py -- --skew-wheel
 blender --background --python cart.py -- --output cart.png
-

Smoke does not pass --output, --skip-decimate, or --lift-z.

+

Smoke passes none of the falsifier flags and no --output.

Exit codes

File-local. 9 is a valid check code. 10 is reserved for gallery_framing.check_framing on the --output path.

-

| Code | Meaning | | --- | --- | | 0 | Success | | 1 | Uncaught exception (FATAL wrapper) | | 2 | argparse / usage | | 3 | Mesh did not build / no UV layer | | 4 | Base triangle count outside range | | 5 | Material count ≠ 2 distinct slots, or metal faces missing | | 6 | UVs outside 0..1 | | 7 | UV AABB overlap above tolerance | | 8 | World AABB off declared outer size | | 9 | LOD ratio band (--skip-decimate lands here) | | 10 | Framing gate (render path only) | | 11 | Collider triangle count above ceiling | | 12 | Bake did not finish or image has no data | | 13 | Export file missing or empty | | 14 | --output produced no file | | 15 | Hygiene: loose geometry, non-manifold, zero-area, doubles, or n-gons | | 16 | Bbox min Z not grounded (--lift-z lands here) | | 17 | Material-island gap above tolerance (parts meant to touch) |

+

| Code | Meaning | | --- | --- | | 0 | Success | | 1 | Uncaught exception (FATAL wrapper) | | 2 | argparse / usage | | 3 | Mesh did not build / no UV layer | | 4 | Base triangle count outside range | | 5 | Material count ≠ 2 distinct slots, or metal faces missing | | 6 | UVs outside 0..1 | | 7 | UV AABB overlap above tolerance | | 8 | World AABB off declared outer size | | 9 | LOD ratio band (--skip-decimate lands here) | | 10 | Framing gate (render path only) | | 11 | Collider triangle count above ceiling | | 12 | Bake did not finish or image has no data | | 13 | Export file missing or empty | | 14 | --output produced no file | | 15 | Hygiene: loose geometry, non-manifold, zero-area, doubles, n-gons, or coplanar cross-shell face pairs (--flush-tyre lands here) | | 16 | Bbox min Z not grounded (--lift-z), or a named support off the floor (--float-wheel) | | 17 | Material-island gap above tolerance (parts meant to touch) | | 18 | Tyre seat depth outside its band (--sink-tyre lands here) | | 19 | Wheel mirror deviation above epsilon (--skew-wheel lands here) |

Source

@@ -331,6 +338,16 @@

Source

RIM_W = 0.036 TYRE_T = 0.008 TYRE_W = 0.040 +# Felloe outer radius is the *host* surface the tyre is hooped onto. The +# tyre's inner radius is derived from it minus a named interference, never +# set equal to it: r_in == r_out puts the tyre's inner cylinder and the +# felloe's tread on one plane for every segment, which is a guaranteed +# z-fight (it measured 32 coplanar cross-shell pairs, 16 per wheel). +RIM_OUTER = RIM_MAJOR + RIM_RADIAL +TYRE_SEAT = 0.004 +TYRE_SEAT_MIN = 0.0030 +TYRE_SEAT_MAX = 0.0055 +WHEEL_SEGMENTS = 24 TRACK = 0.68 AXLE_X = -0.16 AXLE_R = 0.020 @@ -353,8 +370,11 @@

Source

BBOX_TOL = 0.01 OUTER_SIZE = (1.539, 0.749, 0.640) -BASE_TRIS_MIN = 2470 -BASE_TRIS_MAX = 2900 +# Re-fitted after the wheel went from 16 to 24 segments (2600 -> 2856). +# Narrower than the band it replaces (200 wide, was 430) and centred on +# the measured value, so this is a tightening, not a widening. +BASE_TRIS_MIN = 2760 +BASE_TRIS_MAX = 2960 ZMIN_EPS = 1e-4 DOUBLES_EPS = 1e-5 AREA_EPS = 1e-10 @@ -375,6 +395,24 @@

Source

METAL_FACES_MIN = 24 WOOD_FACES_MIN = 800 +# Z-fighting: two separate bodies landing on one plane. Cross-shell, with +# hay-bale's constants (copied, not imported). +COPLANAR_NORMAL_EPS = 1e-4 +COPLANAR_PLANE_EPS = 1e-4 +COPLANAR_CENTRE_MAX = 0.05 +ZFIGHT_PAIRS_MAX = 0 +# Named supports: a two-wheel cart's AABB zmin is grounded by whichever +# tyre happens to be lowest. Each tyre carries its own floor contact. +SUPPORT_ZMIN_EPS = 1e-4 +# Mirrored members: the two wheels are the same part reflected in Y. +WHEEL_MIRROR_EPS = 5e-5 +# Falsifier magnitudes, each sized to trip its own budget and nothing +# earlier: the wheel moves stay inside BBOX_TOL so the AABB gate cannot +# steal the failure. +SINK_TYRE_SEAT = 0.009 +FLOAT_WHEEL_Z = 0.003 +SKEW_WHEEL_Y = 0.006 + WOOD_IDX = 0 METAL_IDX = 1 @@ -534,14 +572,19 @@

Source

def add_wheel(bm, loc, wood, metal): wood.extend( add_ring( - bm, loc, RIM_MAJOR, RIM_RADIAL, RIM_W, 16, WOOD_IDX, + bm, loc, RIM_MAJOR, RIM_RADIAL, RIM_W, WHEEL_SEGMENTS, WOOD_IDX, euler=(math.pi / 2.0, 0.0, 0.0), ) ) + # Hooped, not pasted on: inner radius is RIM_OUTER - TYRE_SEAT so the + # band bites into the felloe, and the tread still lands at + # RIM_OUTER + TYRE_T so the tyre stays the ground contact. + tyre_in = RIM_OUTER - TYRE_SEAT + tyre_out = RIM_OUTER + TYRE_T metal.extend( add_ring( - bm, loc, RIM_MAJOR + RIM_RADIAL + TYRE_T / 2.0, TYRE_T / 2.0, - TYRE_W, 16, METAL_IDX, + bm, loc, 0.5 * (tyre_in + tyre_out), 0.5 * (tyre_out - tyre_in), + TYRE_W, WHEEL_SEGMENTS, METAL_IDX, euler=(math.pi / 2.0, 0.0, 0.0), ) ) @@ -882,6 +925,179 @@

Source

} +def shell_groups(me): + """Vertex-index shells by edge connectivity (union-find), biggest first.""" + parent = list(range(len(me.vertices))) + + def find(a): + while parent[a] != a: + parent[a] = parent[parent[a]] + a = parent[a] + return a + + for e in me.edges: + ra, rb = find(int(e.vertices[0])), find(int(e.vertices[1])) + if ra != rb: + parent[rb] = ra + groups = {} + for i in range(len(me.vertices)): + groups.setdefault(find(i), []).append(i) + return sorted(groups.values(), key=lambda g: -len(g)) + + +def shell_box(me, idxs): + co = [me.vertices[i].co for i in idxs] + return { + "xmin": min(c.x for c in co), "xmax": max(c.x for c in co), + "ymin": min(c.y for c in co), "ymax": max(c.y for c in co), + "zmin": min(c.z for c in co), "zmax": max(c.z for c in co), + } + + +def coplanar_zfight_pairs(me, groups): + """Coplanar face pairs from *different shells* — the z-fighting budget. + + Cross-shell, not merely share-no-vertex: two quads two steps apart on + one flat cap share no vertex and are coplanar by construction, and + counting those makes the budget unsatisfiable rather than meaningful. + Z-fighting is two separate bodies landing on one plane, which is + exactly a cross-shell pair. Combinatorics and constants copied from + showcase/hay-bale (do not import across pieces). + """ + owner = {} + for si, comp in enumerate(groups): + for vi in comp: + owner[vi] = si + faces = [(p.normal.copy(), p.center.copy(), owner.get(p.vertices[0], -1)) + for p in me.polygons] + hits = 0 + for i in range(len(faces)): + ni, ci, si = faces[i] + for j in range(i + 1, len(faces)): + nj, cj, sj = faces[j] + if si == sj: + continue + if (ci - cj).length > COPLANAR_CENTRE_MAX: + continue + if abs(abs(ni.dot(nj)) - 1.0) > COPLANAR_NORMAL_EPS: + continue + if abs(ni.dot(cj - ci)) > COPLANAR_PLANE_EPS: + continue + hits += 1 + return hits + + +def wheel_shells(me, groups): + """(rim, tyre) shell index pairs for each wheel, keyed by track side. + + Identified from the generated mesh by geometry — a shell centred on the + axle line whose YZ extent is a full disc — never from a construction + constant. The tyre is the metal-indexed member of the pair. + """ + metal = set() + for p in me.polygons: + if p.material_index == METAL_IDX: + metal.add(int(p.vertices[0])) + found = {} + for si, g in enumerate(groups): + b = shell_box(me, g) + dx = b["xmax"] - b["xmin"] + dz = b["zmax"] - b["zmin"] + if dx < 0.4 or abs(dx - dz) > 0.02: + continue + side = 1 if 0.5 * (b["ymin"] + b["ymax"]) > 0 else -1 + kind = "tyre" if any(i in metal for i in g) else "rim" + found.setdefault(side, {})[kind] = si + return found + + +def tyre_seat_depths(me, groups, rim_si, tyre_si, segments): + """Per-station interference between the tyre's inner ring and the felloe. + + Banded and per angular station, not one global figure: a single number + passes while one arc of the hoop visibly gaps. Both radii are recomputed + from the generated vertices, so nothing here restates a constant. + """ + axis_y = 0.5 * (shell_box(me, groups[tyre_si])["ymin"] + + shell_box(me, groups[tyre_si])["ymax"]) + rb = shell_box(me, groups[rim_si]) + cx = 0.5 * (rb["xmin"] + rb["xmax"]) + cz = 0.5 * (rb["zmin"] + rb["zmax"]) + + def bins(idxs): + out = {} + for i in idxs: + co = me.vertices[i].co + ang = math.atan2(co.z - cz, co.x - cx) + k = int(round(ang / (2.0 * math.pi / segments))) % segments + out.setdefault(k, []).append( + math.hypot(co.x - cx, co.z - cz)) + return out + + rim_bins = bins(groups[rim_si]) + tyre_bins = bins(groups[tyre_si]) + depths = [] + for k in sorted(set(rim_bins) & set(tyre_bins)): + rim_out = max(rim_bins[k]) + tyre_in = min(tyre_bins[k]) + depths.append(rim_out - tyre_in) + return depths, axis_y + + +def _wheel_centre(me, groups, rim_si): + b = shell_box(me, groups[rim_si]) + return 0.5 * (b["xmin"] + b["xmax"]), 0.5 * (b["zmin"] + b["zmax"]) + + +def break_tyre_seat(me, seat): + """Falsifier surgery: re-radius each tyre's inner ring to `seat` deep. + + seat=0.0 puts the tyre's inner cylinder on the felloe's tread plane, + which is the construction bug this piece was rebuilt to remove. + """ + groups = shell_groups(me) + for parts in wheel_shells(me, groups).values(): + cx, cz = _wheel_centre(me, groups, parts["rim"]) + idxs = groups[parts["tyre"]] + radii = [math.hypot(me.vertices[i].co.x - cx, + me.vertices[i].co.z - cz) for i in idxs] + split = 0.5 * (min(radii) + max(radii)) + for i, r in zip(idxs, radii): + if r >= split: + continue + co = me.vertices[i].co + scale = (RIM_OUTER - seat) / r + co.x = cx + (co.x - cx) * scale + co.z = cz + (co.z - cz) * scale + me.update() + + +def move_one_wheel(me, delta): + """Falsifier surgery: translate the +Y wheel only (rim, tyre, spokes). + + Everything whose vertices lie on the +Y side of the axle centreline and + within the wheel's radius, so the assembly moves as one body and the + opposite wheel still grounds the AABB. + """ + groups = shell_groups(me) + parts = wheel_shells(me, groups).get(1) + if parts is None: + return + b = shell_box(me, groups[parts["tyre"]]) + cx, cz = _wheel_centre(me, groups, parts["rim"]) + y_lo, y_hi = b["ymin"] - 0.02, b["ymax"] + 0.02 + r_max = 0.5 * (b["xmax"] - b["xmin"]) + 1e-4 + for v in me.vertices: + if not (y_lo <= v.co.y <= y_hi): + continue + if math.hypot(v.co.x - cx, v.co.z - cz) > r_max: + continue + v.co.x += delta[0] + v.co.y += delta[1] + v.co.z += delta[2] + me.update() + + def min_mat_distance(me, ia, ib): """Closest surface distance between two material islands via BVH. @@ -1003,7 +1219,8 @@

Source

) -def check(skip_decimate, lift_z=False): +def check(skip_decimate, lift_z=False, flush_tyre=False, sink_tyre=False, + float_wheel=False, skew_wheel=False): bpy.ops.wm.read_factory_settings(use_empty=True) low = build_cart_mesh("CartLow", bevel_offset=0.005, bevel_segments=2) high = build_cart_mesh("CartHigh", bevel_offset=0.005, bevel_segments=4) @@ -1011,9 +1228,14 @@

Source

"CartWood", (0.42, 0.22, 0.08, 1.0), 0.0, 0.58, noise_scale=7.0, wear=(0.26, 0.12, 0.04, 1.0), ) + # Wrought iron, not black plastic. At (0.13, 0.32) the tyre rendered as + # a flat black band with no sheen — darker and glossier than every + # sibling piece's iron (hitching-post 0.16/0.48, wooden-ladder + # 0.18/0.48). Raised to sit inside that calibration range, and the wear + # colour lifted off near-black so the noise actually varies the surface. metal = principled( - "CartIron", (0.13, 0.135, 0.15, 1.0), 1.0, 0.32, - noise_scale=5.0, wear=(0.05, 0.05, 0.06, 1.0), + "CartIron", (0.20, 0.195, 0.185, 1.0), 1.0, 0.50, + noise_scale=5.0, wear=(0.11, 0.105, 0.10, 1.0), ) assign_slots(low, wood, metal) assign_slots(high, wood, metal) @@ -1021,6 +1243,14 @@

Source

for v in low.data.vertices: v.co.z += LIFT_Z low.data.update() + if flush_tyre: + break_tyre_seat(low.data, 0.0) + if sink_tyre: + break_tyre_seat(low.data, SINK_TYRE_SEAT) + if float_wheel: + move_one_wheel(low.data, (0.0, 0.0, FLOAT_WHEEL_Z)) + if skew_wheel: + move_one_wheel(low.data, (0.0, SKEW_WHEEL_Y, 0.0)) if low.data is None or len(low.data.polygons) < 6: return fail("cart mesh did not build", 3), None, None, None, None, None @@ -1092,6 +1322,53 @@

Source

) print(f"measured gap_metal_wood={gap_mw:.5f}") + groups = shell_groups(low.data) + zfight = coplanar_zfight_pairs(low.data, groups) + wheels = wheel_shells(low.data, groups) + support_zmins = {} + seats = [] + for side, parts in sorted(wheels.items()): + tb = shell_box(low.data, groups[parts["tyre"]]) + support_zmins["+Y" if side > 0 else "-Y"] = round(tb["zmin"], 6) + depths, _ = tyre_seat_depths( + low.data, groups, parts["rim"], parts["tyre"], WHEEL_SEGMENTS + ) + seats.extend(depths) + support_worst = max((abs(z) for z in support_zmins.values()), default=1e9) + seat_min = min(seats) if seats else -1.0 + seat_max = max(seats) if seats else 1e9 + seat_n = len(seats) + # Mirror: the two wheels are one part reflected in Y, so their rim + # centres must match in X and Z and be opposite in Y. + wheel_mirror = 1e9 + if len(wheels) == 2: + boxes = {} + for side, parts in wheels.items(): + b = shell_box(low.data, groups[parts["rim"]]) + boxes[side] = ( + 0.5 * (b["xmin"] + b["xmax"]), + 0.5 * (b["ymin"] + b["ymax"]), + 0.5 * (b["zmin"] + b["zmax"]), + b["xmax"] - b["xmin"], + b["zmax"] - b["zmin"], + ) + a, b2 = boxes[1], boxes[-1] + wheel_mirror = max( + abs(a[0] - b2[0]), abs(a[1] + b2[1]), abs(a[2] - b2[2]), + abs(a[3] - b2[3]), abs(a[4] - b2[4]), + ) + print( + f"measured zfight_pairs={zfight} shells={len(groups)} " + f"support_zmin={support_zmins} " + f"tyre_seat=[{seat_min:.5f},{seat_max:.5f}] over {seat_n} stations " + f"wheel_mirror={wheel_mirror*1000:.5f}mm" + ) + + if len(wheels) != 2 or any(len(p) != 2 for p in wheels.values()): + return fail( + f"expected 2 wheels of (rim, tyre) shells, found {wheels}", + 3, + ), None, None, None, None, None if not (BASE_TRIS_MIN <= base_tris <= BASE_TRIS_MAX): return fail( f"base tris {base_tris} not in [{BASE_TRIS_MIN}, {BASE_TRIS_MAX}]", @@ -1169,18 +1446,49 @@

Source

f"doubles={hyg['doubles']} ngons={hyg['ngons']}", 15, ), None, None, None, None, None + if zfight > ZFIGHT_PAIRS_MAX: + return fail( + f"coplanar cross-shell face pairs {zfight} > {ZFIGHT_PAIRS_MAX} " + "(--flush-tyre is the designed fail: a tyre whose inner radius " + "equals the felloe's outer radius puts both on one plane)", + 15, + ), None, None, None, None, None if abs(bb[2]) > ZMIN_EPS: return fail( f"zmin {bb[2]:.6f} not within {ZMIN_EPS} of 0 " "(--lift-z is the designed fail)", 16, ), None, None, None, None, None + if support_worst > SUPPORT_ZMIN_EPS: + return fail( + f"named support zmin {support_worst:.6f} > {SUPPORT_ZMIN_EPS} " + f"per-tyre zmin={support_zmins} " + "(--float-wheel is the designed fail: one tyre off the floor " + "while the other still grounds the AABB)", + 16, + ), None, None, None, None, None if gap_mw > GAP_MAX: return fail( f"metal-wood gap {gap_mw:.5f} > {GAP_MAX} " "(tyres, hubs, straps, and plates must touch the wood they mount to)", 17, ), None, None, None, None, None + if seat_min < TYRE_SEAT_MIN or seat_max > TYRE_SEAT_MAX: + return fail( + f"tyre seat depth band [{seat_min:.5f}, {seat_max:.5f}] outside " + f"[{TYRE_SEAT_MIN}, {TYRE_SEAT_MAX}] over {seat_n} stations " + "(--sink-tyre is the designed fail: the hoop swallowed by the " + "felloe reads as one body, not a tyre)", + 18, + ), None, None, None, None, None + if wheel_mirror > WHEEL_MIRROR_EPS: + return fail( + f"wheel mirror deviation {wheel_mirror*1000:.4f} mm > " + f"{WHEEL_MIRROR_EPS*1000:.4f} mm " + "(--skew-wheel is the designed fail: the two wheels are one part " + "reflected in Y and must sit at matched X and Z)", + 19, + ), None, None, None, None, None return 0, low, high, wood, tex, collider @@ -1304,10 +1612,38 @@

Source

action="store_true", help="falsification: lift the mesh so zmin fails the grounded budget", ) + p.add_argument( + "--flush-tyre", + action="store_true", + help="falsification: tyre inner radius == felloe outer radius, so " + "both land on one plane and the z-fight budget fails", + ) + p.add_argument( + "--sink-tyre", + action="store_true", + help="falsification: bury the tyre in the felloe so the seat band fails", + ) + p.add_argument( + "--float-wheel", + action="store_true", + help="falsification: lift one wheel off the floor while the other " + "still grounds the AABB, so the named-support budget fails", + ) + p.add_argument( + "--skew-wheel", + action="store_true", + help="falsification: push one wheel out along the track so the " + "wheel-mirror budget fails", + ) args = p.parse_args(argv) code, low, _high, wood, tex, _col = check( - args.skip_decimate, lift_z=args.lift_z + args.skip_decimate, + lift_z=args.lift_z, + flush_tyre=args.flush_tyre, + sink_tyre=args.sink_tyre, + float_wheel=args.float_wheel, + skew_wheel=args.skew_wheel, ) if code: return code diff --git a/docs/gallery/index.html b/docs/gallery/index.html index 66297919..edf64310 100644 --- a/docs/gallery/index.html +++ b/docs/gallery/index.html @@ -903,7 +903,7 @@

shipping-crate

stone-well

A procedural stone well through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.

-

witnesses Recomputed: 9380 tris, three materials with face floors, UVs in 0..1 with zero AABB overlap, outer AABB 1.640×1.640×1.761 m, LOD ratios in band, convex collider 306 tris, hygiene zero (loose, non-manifold, doubles, n-gons), grounded zmin, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget; --lift-z exits 16 on the grounded budget.

+

witnesses Recomputed: 9380 tris, three materials with face floors, UVs in 0..1 with zero AABB overlap, outer AABB 1.312×1.312×1.761 m, LOD ratios in band, convex collider 346 tris, hygiene zero (loose, non-manifold, doubles, n-gons), zero coplanar cross-shell face pairs, all 12 bottom-course stones on the floor, each post tenoned 18 mm into the measured coping and standing under a roof hip corner, the bucket hanging 0.10 m clear of the coping, grounded zmin, non-empty glTF. --stand-posts exits 15 on the z-fight budget; --float-stone exits 16 on the named-support budget; --shallow-tenon and --drop-bucket exit 18; --turn-posts exits 19 on post placement; --skip-decimate exits 9 on the LOD1 ratio budget; --lift-z exits 16 on the grounded budget.

View showcase piece
@@ -1002,7 +1002,7 @@

watchtower

cart

A procedural two-wheel wooden cart through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.

-

witnesses Recomputed: 2600 tris, two materials with metal and wood face floors, UVs in 0..1 with zero AABB overlap, outer AABB 1.539×0.749×0.640 m, LOD ratios in band, convex collider 122 tris, hygiene zero (loose, non-manifold, doubles, n-gons), grounded zmin, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget; --lift-z exits 16 on the grounded budget.

+

witnesses Recomputed: 2856 tris, two materials with metal and wood face floors, UVs in 0..1 with zero AABB overlap, outer AABB 1.539×0.749×0.640 m, LOD ratios in band, convex collider 154 tris, hygiene zero (loose, non-manifold, doubles, n-gons), zero coplanar cross-shell face pairs, both tyres grounded, tyre seat depth in band over 48 angular stations, the two wheels mirrored within 5e-5 m, grounded zmin, non-empty glTF. --flush-tyre exits 15 on the z-fight budget; --sink-tyre exits 18 on the tyre seat band; --float-wheel exits 16 on the named-support budget; --skew-wheel exits 19 on the wheel mirror; --skip-decimate exits 9 on the LOD1 ratio budget; --lift-z exits 16 on the grounded budget.

View showcase piece
diff --git a/docs/gallery/stone-well/index.html b/docs/gallery/stone-well/index.html index 578ee959..adac34e2 100644 --- a/docs/gallery/stone-well/index.html +++ b/docs/gallery/stone-well/index.html @@ -253,7 +253,7 @@

stone-well

stone-well render

Rendered headless by the showcase piece itself — click to zoom.

-
witnesses Recomputed: 9380 tris, three materials with face floors, UVs in 0..1 with zero AABB overlap, outer AABB 1.640×1.640×1.761 m, LOD ratios in band, convex collider 306 tris, hygiene zero (loose, non-manifold, doubles, n-gons), grounded zmin, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget; --lift-z exits 16 on the grounded budget.
+
witnesses Recomputed: 9380 tris, three materials with face floors, UVs in 0..1 with zero AABB overlap, outer AABB 1.312×1.312×1.761 m, LOD ratios in band, convex collider 346 tris, hygiene zero (loose, non-manifold, doubles, n-gons), zero coplanar cross-shell face pairs, all 12 bottom-course stones on the floor, each post tenoned 18 mm into the measured coping and standing under a roof hip corner, the bucket hanging 0.10 m clear of the coping, grounded zmin, non-empty glTF. --stand-posts exits 15 on the z-fight budget; --float-stone exits 16 on the named-support budget; --shallow-tenon and --drop-bucket exit 18; --turn-posts exits 19 on post placement; --skip-decimate exits 9 on the LOD1 ratio budget; --lift-z exits 16 on the grounded budget.
blender --background --python showcase/stone-well/stone_well.py --
@@ -264,18 +264,27 @@

stone-well

Composes skills mesh-editing-and-bmesh, bake-high-to-low, depsgraph-and-evaluated-data, engine-export-presets, and snippets bake_normal_high_to_low.py, setup_bake_target_image.py, lod_chain.py / decimate_to_budget.py, convex_hull_collider.py, export_preset_unity.py (helpers copied, not imported as a package).

Budgets

Declared as named constants; every gate recomputes from the mesh, materials, UVs, evaluated LOD, collider, or export file.

-

| Axis | Declared | Measured (4.5.11 / 5.1.2 / 5.2.1) | | --- | --- | --- | | Base triangles | 8280–9500 | 9380 / 9380 / 9380 | | LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.5000 | | LOD2 ratio | 0.10–0.35 of base | 0.2198 / 0.2198 / 0.2198 | | Materials | exactly 3 distinct | 3 | | Material faces | stone ≥ 3000, wood ≥ 600, metal ≥ 100 | all above | | UVs | in 0..1, AABB overlap ≤ 1e-5 | in range, overlap 0 | | Outer AABB | (1.640, 1.640, 1.761) m ± 0.01 | (1.6400, 1.6400, 1.7606) | | Grounded | bbox min Z within 1e-4 of 0 | 0.0000 / 0.0000 / 0.0000 | | Hygiene | loose V/E, non-manifold, zero-area, doubles @1e-5, n-gons: all 0 | 0 / 0 / 0 on every axis | | Material-island gap | stone↔wood and metal↔wood min distance ≤ 0.008 m | 0.00000 / 0.00000 / 0.00000 | | Collider tris | ≤ 320 | 306 | | Export | written, size > 0 | 686672 / 686736 / 686724 bytes |

+

| Axis | Declared | Measured (4.5.11 / 5.1.2 / 5.2.1) | | --- | --- | --- | | Base triangles | 8280–9500 | 9380 / 9380 / 9380 | | LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.5000 | | LOD2 ratio | 0.10–0.35 of base | 0.2198 / 0.2198 / 0.2198 | | Materials | exactly 3 distinct | 3 | | Material faces | stone ≥ 3000, wood ≥ 600, metal ≥ 100 | all above | | UVs | in 0..1, AABB overlap ≤ 1e-5 | in range, overlap 0 | | Outer AABB | (1.312, 1.312, 1.761) m ± 0.01 | (1.3120, 1.3120, 1.7606) | | Grounded | bbox min Z within 1e-4 of 0 | 0.0000 / 0.0000 / 0.0000 | | Named supports | all 12 bottom-course stones on the floor within 1e-4 | 12/12, worst 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 | | Post tenon | each post seats 0.015–0.022 m into the measured coping top | 0.01800 / 0.01800 / 0.01800 | | Post placement | each post within 0.02 rad, in plan, of a roof hip corner recomputed from the mesh | 0.00000 | | Bucket clearance | hangs 0.085–0.115 m clear of the measured coping top | 0.10000 | | Material-island gap | stone↔wood and metal↔wood min distance ≤ 0.008 m | 0.00000 / 0.00000 / 0.00000 | | Collider tris | ≤ 380 | 346 | | Export | written, size > 0 | 686672 / 686736 / 686724 bytes |

DECIMATE COLLAPSE triangle counts are not guaranteed identical across series — the gate is a ratio band, not an exact count. This mesh happened to match on 4.5.11 / 5.1.2 / 5.2.1. Bake pixels are stochastic; the gate is has_data plus operator FINISHED, not byte-identity. Construction uses no RNG. glTF byte size differs by a few hundred bytes across series.

-

--skip-decimate skips the LOD DECIMATE stage so LOD1 ratio is 1.0 and exit 9 fires. --lift-z raises the finished mesh 0.05 m so the grounded budget fails and exit 16 fires. Those are the named budgets the two falsifiers violate.

+

Falsifiers

+

Each flag breaks one stage so a named budget fails and the piece exits *that* code.

+

| Flag | Target budget | Exit | | --- | --- | --- | | --skip-decimate | LOD1 ratio band (ratio becomes 1.0) | 9 | | --lift-z | AABB grounded zmin (whole mesh up 0.05 m) | 16 | | --stand-posts | Coplanar cross-shell pairs — puts the posts back on the axis *and* stands them on the coping, which is the pair of choices the shipped piece made (0 → 4 pairs) | 15 | | --float-stone | Named supports — lifts one bottom-course stone 4 mm while the other eleven still ground the AABB | 16 | | --shallow-tenon | Post tenon band — seats the posts only 4 mm, too shallow to be a joint but not flush, so no faces share a plane | 18 | | --drop-bucket | Bucket clearance — lowers the bucket 0.26 m back down the shaft | 18 | | --turn-posts | Post placement — rotates the post ring one curb facet off the roof's hip corners | 19 |

+

Two of these had to be re-aimed, which is the point of declaring the target:

+
  • --stand-posts seats the posts flush and returns them to the axis. Flush alone, at the corrected 45°, leaves no coping top face within COPLANAR_CENTRE_MAX of a foot, so it fell through to the tenon band (18) and witnessed nothing about z-fighting.
  • --turn-posts rotates by exactly one curb facet (30°). Any other angle sets the feet down on a different part of the 12-gon coping and the stone-wood gap gate (17) steals the failure; a full 45° also swings the crank grip past the eave and fails the AABB gate (8) — the same trap stone-archway's --flat-arch fell into. One facet is the only rotation whose local seat geometry is identical by symmetry.

Run

blender --background --python stone_well.py --
 blender --background --python stone_well.py -- --skip-decimate
 blender --background --python stone_well.py -- --lift-z
+blender --background --python stone_well.py -- --stand-posts
+blender --background --python stone_well.py -- --shallow-tenon
+blender --background --python stone_well.py -- --turn-posts
+blender --background --python stone_well.py -- --float-stone
+blender --background --python stone_well.py -- --drop-bucket
 blender --background --python stone_well.py -- --output well.png
-

Smoke does not pass --output, --skip-decimate, or --lift-z.

+

Smoke passes none of the falsifier flags and no --output.

Exit codes

File-local. 9 is a valid check code. 10 is reserved for gallery_framing.check_framing on the --output path.

-

| Code | Meaning | | --- | --- | | 0 | Success | | 1 | Uncaught exception (FATAL wrapper) | | 2 | argparse / usage | | 3 | Mesh did not build / no UV layer | | 4 | Base triangle count outside range | | 5 | Material count ≠ 3 distinct slots, or a material face floor missed | | 6 | UVs outside 0..1 | | 7 | UV AABB overlap above tolerance | | 8 | World AABB off declared outer size | | 9 | LOD ratio band (--skip-decimate lands here) | | 10 | Framing gate (render path only) | | 11 | Collider triangle count above ceiling | | 12 | Bake did not finish or image has no data | | 13 | Export file missing or empty | | 14 | --output produced no file | | 15 | Hygiene: loose geometry, non-manifold, zero-area, doubles, or n-gons | | 16 | Bbox min Z not grounded (--lift-z lands here) | | 17 | Material-island gap above tolerance (parts meant to touch) |

+

| Code | Meaning | | --- | --- | | 0 | Success | | 1 | Uncaught exception (FATAL wrapper) | | 2 | argparse / usage | | 3 | Mesh did not build / no UV layer | | 4 | Base triangle count outside range | | 5 | Material count ≠ 3 distinct slots, or a material face floor missed | | 6 | UVs outside 0..1 | | 7 | UV AABB overlap above tolerance | | 8 | World AABB off declared outer size | | 9 | LOD ratio band (--skip-decimate lands here) | | 10 | Framing gate (render path only) | | 11 | Collider triangle count above ceiling | | 12 | Bake did not finish or image has no data | | 13 | Export file missing or empty | | 14 | --output produced no file | | 15 | Hygiene: loose geometry, non-manifold, zero-area, doubles, n-gons, or coplanar cross-shell face pairs (--stand-posts lands here) | | 16 | Bbox min Z not grounded (--lift-z), or a named support off the floor (--float-stone) | | 17 | Material-island gap above tolerance (parts meant to touch) | | 18 | Post tenon depth outside its band (--shallow-tenon), or bucket clearance outside its band (--drop-bucket) | | 19 | A post not under a roof hip corner in plan (--turn-posts lands here) |

Source

@@ -290,9 +299,14 @@

Source

normal bake, LOD chain, convex collider, Unity glTF export. Budgets are declared below and recomputed from the generated result. -They are not API-contract witnesses. ``--skip-decimate`` skips the LOD -DECIMATE stage so the LOD-ratio budget fails. ``--lift-z`` raises the -mesh so the grounded-zmin hygiene budget fails. +They are not API-contract witnesses. Each falsifier flag breaks one +stage so a named budget fails and the piece exits that budget's code: +``--skip-decimate`` (LOD ratio, 9), ``--lift-z`` (AABB grounded, 16), +``--float-stone`` (named supports, 16), ``--stand-posts`` (coplanar +cross-shell pairs, 15), ``--shallow-tenon`` (post tenon band, 18), +``--drop-bucket`` (bucket clearance, 18), ``--turn-posts`` (post under +hip corner, 19). See README.md for why two of them are aimed the way +they are. No RNG. Construction is closed-form (per-stone jitter is a deterministic hash). DECIMATE COLLAPSE triangle counts are not byte-identical across @@ -300,7 +314,7 @@

Source

blender --background --python stone_well.py -- blender --background --python stone_well.py -- --skip-decimate - blender --background --python stone_well.py -- --lift-z + blender --background --python stone_well.py -- --stand-posts blender --background --python stone_well.py -- --output well.png """ import argparse @@ -344,11 +358,29 @@

Source

CURB_Z = MASONRY_TOP + CURB_H / 2.0 POST_S = 0.068 POST_R = 0.55 -POST_H = 0.58 -POST_BOTTOM = MASONRY_TOP + CURB_H -POST_TOP = POST_BOTTOM + POST_H -EAVE_OVERHANG = 0.22 -EAVE_HALF = POST_R + POST_S / 2.0 + EAVE_OVERHANG +# Posts land under the roof's four hip corners, not at the midpoint of each +# eave. A cone with 4 base verts rotated by pi/4 puts its corners on the +# diagonals, so the posts go on the diagonals too. At the axis-aligned +# angles the roof corners cantilevered 0.80 m unsupported and one post +# stood dead centre in the well mouth from every orthogonal view. +POST_ANGLES = tuple(math.pi / 4.0 + i * math.pi / 2.0 for i in range(4)) +# Tenoned into the curb, not stood on it: a foot whose bottom face lands +# exactly on the curb's top face puts both on one plane (it measured 4 +# coplanar cross-shell pairs, one per post). POST_TOP is held fixed so +# nothing above the posts moves. +POST_SEAT = 0.018 +POST_SEAT_MIN = 0.015 +POST_SEAT_MAX = 0.022 +POST_CLEAR = 0.58 +POST_BOTTOM = MASONRY_TOP + CURB_H - POST_SEAT +POST_TOP = MASONRY_TOP + CURB_H + POST_CLEAR +POST_H = POST_TOP - POST_BOTTOM +# The roof is sized to oversail the curb by a named clearance, measured on +# the flat of the eave. Deriving it from the post ring instead made the +# roof 1.61 m across a 1.08 m drum — an umbrella, not a well house. +EAVE_CLEAR = 0.055 +EAVE_HALF = R_OUTER + CURB_OUT + EAVE_CLEAR +EAVE_OVERHANG = EAVE_HALF - (POST_R + POST_S / 2.0) EAVE_Z = POST_TOP - 0.02 ROOF_RISE = 0.34 PEAK_Z = EAVE_Z + ROOF_RISE @@ -358,17 +390,26 @@

Source

# both posts and protrudes so the crank has something to attach to. WINDLASS_END = POST_R + POST_S / 2.0 + 0.015 WINDLASS_LEN = 2.0 * WINDLASS_END +# The drum spans the first opposed pair of posts, so it shares their angle. +WINDLASS_AXIS = POST_ANGLES[0] BUCKET_R_TOP = 0.105 BUCKET_R_BOT = 0.088 BUCKET_WALL_T = 0.008 BUCKET_H = 0.14 -BUCKET_Z = 0.68 +# The bucket is the piece's whole story, so it hangs in the open above the +# curb. At 0.68 it sat down the shaft with only its rim level with the +# coping: invisible in the hero and in every orthographic view. +CURB_TOP = MASONRY_TOP + CURB_H +BUCKET_CLEAR = 0.10 +BUCKET_CLEAR_MIN = 0.085 +BUCKET_CLEAR_MAX = 0.115 +BUCKET_Z = CURB_TOP + BUCKET_CLEAR + BUCKET_H / 2.0 BUCKET_RIM_Z = BUCKET_Z + BUCKET_H / 2.0 HANDLE_BAR_Z = BUCKET_RIM_Z + 0.03 ROPE_R = 0.016 BBOX_TOL = 0.01 # Fitted to the generated AABB after locking geometry. Recomputed from bound_box. -OUTER_SIZE = (1.640, 1.640, 1.761) +OUTER_SIZE = (1.312, 1.312, 1.761) # Measured after locking geometry. DECIMATE COLLAPSE ratios diverge across # series — bands, not exact counts. Tightened after the first 4.5/5.1/5.2 run. @@ -391,7 +432,48 @@

Source

METAL_FACES_MIN = 100 UV_EPS = 1e-4 UV_OVERLAP_MAX = 1e-5 -COLLIDER_TRIS_MAX = 320 +# Grew with the roof resize: the convex hull of a 1.31 m roof over the +# drum measures 346 where the 1.64 m roof measured 318. Budget raised to +# match a deliberate geometry change, with headroom for the falsifiers. +COLLIDER_TRIS_MAX = 380 +# Z-fighting: two separate bodies landing on one plane. Cross-shell, with +# hay-bale's constants (copied, not imported). +COPLANAR_NORMAL_EPS = 1e-4 +COPLANAR_PLANE_EPS = 1e-4 +COPLANAR_CENTRE_MAX = 0.05 +ZFIGHT_PAIRS_MAX = 0 +# Named supports: the AABB zmin is grounded by whichever bottom-course +# stone happens to be lowest, so every bottom stone carries its own floor +# contact. N_AROUND of them, one per bay. +SUPPORT_ZMIN_EPS = 1e-4 +SUPPORT_COUNT = N_AROUND +# Posts stand under the roof's hip corners, measured in plan against the +# corners recomputed from the generated roof. +# Angular, in radians, wrapped into [-pi, pi]. 0.02 rad is 1.15 degrees. +POST_CORNER_EPS = 0.02 +POST_COUNT = 4 +# Falsifier magnitudes, each sized to trip its own budget and nothing +# earlier: the moves stay inside BBOX_TOL so the AABB gate cannot steal +# the failure. +STAND_POST_SEAT = 0.0 +# --stand-posts must put the posts back where the shipped bug had them: +# on the axis, where a curb top face sits within COPLANAR_CENTRE_MAX of +# each foot. One facet over (15 degrees) is flush but too far from any +# coping top face to register, and falls through to the seat band. +# The crank no longer follows the post ring, so this rotation cannot +# swing it past the eave. +STAND_POST_TURN = math.pi / 4.0 +SHALLOW_TENON_SEAT = 0.004 +FLOAT_STONE_Z = 0.004 +# Exactly one curb facet. Any other angle sets the post feet down on a +# different part of the 12-gon coping and the stone-wood gap gate (17) +# steals the failure; a full 45 degrees also swings the crank grip past +# the eave and fails the AABB gate (8). One facet is the only rotation +# whose local seat geometry is identical by symmetry, so nothing but the +# hip-alignment budget can see it. Same mis-aimed-falsifier trap as +# stone-archway's --flat-arch. +TURN_POSTS_ANGLE = 2.0 * math.pi / N_AROUND +DROP_BUCKET_Z = 0.26 BAKE_RES = 256 CAGE_EXTRUSION = 0.06 @@ -561,7 +643,8 @@

Source

f.material_index = mat_idx -def build_well_mesh(name, bevel_offset, bevel_segments): +def build_well_mesh(name, bevel_offset, bevel_segments, + post_seat=POST_SEAT, turn_posts=0.0): bm = bmesh.new() stone_verts = [] wood_bevel_verts = [] @@ -618,24 +701,33 @@

Source

clamp_overlap=True, ) - post_angles = (0.0, math.pi / 2.0, math.pi, 3.0 * math.pi / 2.0) - for ang in post_angles: + angles = tuple(a - turn_posts for a in POST_ANGLES) + post_bottom = CURB_TOP - post_seat + post_h = POST_TOP - post_bottom + for ang in angles: loc = ( POST_R * math.cos(ang), POST_R * math.sin(ang), - POST_BOTTOM + POST_H / 2.0, + post_bottom + post_h / 2.0, ) wood_bevel_verts.extend( - add_box(bm, loc, (POST_S, POST_S, POST_H), WOOD_IDX) + add_box(bm, loc, (POST_S, POST_S, post_h), WOOD_IDX, + euler=(0.0, 0.0, ang)) ) + # The windlass is borne by two opposite posts, so it runs along the + # post diagonal, not along X. Everything hung on it — beam, drum, + # crank arm, grip — turns with it as one assembly. beam_z = POST_TOP - 0.05 + wax = WINDLASS_AXIS + ca, sa = math.cos(wax), math.sin(wax) wood_bevel_verts.extend( add_box( bm, (0.0, 0.0, beam_z), (POST_R * 2.0 - POST_S, POST_S * 0.85, POST_S * 0.85), WOOD_IDX, + euler=(0.0, 0.0, wax), ) ) add_cylinder( @@ -645,24 +737,27 @@

Source

WINDLASS_LEN, 12, WOOD_IDX, - euler=(0.0, math.pi / 2.0, 0.0), + euler=(0.0, math.pi / 2.0, wax), ) # Crank: arm pinned to the protruding windlass end, grip parallel to # the windlass axis at the arm's lower end. + arm_r = WINDLASS_END + 0.004 add_box( bm, - (WINDLASS_END + 0.004, 0.0, beam_z - 0.055), + (arm_r * ca, arm_r * sa, beam_z - 0.055), (0.020, 0.022, 0.13), METAL_IDX, + euler=(0.0, 0.0, wax), ) + grip_r = WINDLASS_END + 0.055 add_cylinder( bm, - (WINDLASS_END + 0.055, 0.0, beam_z - 0.12), + (grip_r * ca, grip_r * sa, beam_z - 0.12), 0.014, 0.10, 10, METAL_IDX, - euler=(0.0, math.pi / 2.0, 0.0), + euler=(0.0, math.pi / 2.0, wax), ) pitch = math.atan(ROOF_RISE / EAVE_HALF) @@ -963,6 +1058,162 @@

Source

} +def shell_groups(me): + """Vertex-index shells by edge connectivity (union-find), biggest first.""" + parent = list(range(len(me.vertices))) + + def find(a): + while parent[a] != a: + parent[a] = parent[parent[a]] + a = parent[a] + return a + + for e in me.edges: + ra, rb = find(int(e.vertices[0])), find(int(e.vertices[1])) + if ra != rb: + parent[rb] = ra + groups = {} + for i in range(len(me.vertices)): + groups.setdefault(find(i), []).append(i) + return sorted(groups.values(), key=lambda g: -len(g)) + + +def shell_box(me, idxs): + co = [me.vertices[i].co for i in idxs] + return { + "xmin": min(c.x for c in co), "xmax": max(c.x for c in co), + "ymin": min(c.y for c in co), "ymax": max(c.y for c in co), + "zmin": min(c.z for c in co), "zmax": max(c.z for c in co), + } + + +def coplanar_zfight_pairs(me, groups): + """Coplanar face pairs from *different shells* — the z-fighting budget. + + Cross-shell, not merely share-no-vertex: two quads two steps apart on + one flat cap share no vertex and are coplanar by construction, and + counting those makes the budget unsatisfiable rather than meaningful. + Z-fighting is two separate bodies landing on one plane, which is + exactly a cross-shell pair. Combinatorics and constants copied from + showcase/hay-bale (do not import across pieces). + """ + owner = {} + for si, comp in enumerate(groups): + for vi in comp: + owner[vi] = si + faces = [(p.normal.copy(), p.center.copy(), owner.get(p.vertices[0], -1)) + for p in me.polygons] + hits = 0 + for i in range(len(faces)): + ni, ci, si = faces[i] + for j in range(i + 1, len(faces)): + nj, cj, sj = faces[j] + if si == sj: + continue + if (ci - cj).length > COPLANAR_CENTRE_MAX: + continue + if abs(abs(ni.dot(nj)) - 1.0) > COPLANAR_NORMAL_EPS: + continue + if abs(ni.dot(cj - ci)) > COPLANAR_PLANE_EPS: + continue + hits += 1 + return hits + + +def post_shells(me, groups): + """The four roof posts, found in the generated mesh by their geometry. + + A post is a wood shell that spans the curb line vertically and is + square and slender in plan — never looked up by a construction index. + """ + wood = set() + for p in me.polygons: + if p.material_index == WOOD_IDX: + wood.add(int(p.vertices[0])) + out = [] + for si, g in enumerate(groups): + if not any(i in wood for i in g): + continue + b = shell_box(me, g) + dz = b["zmax"] - b["zmin"] + dx = b["xmax"] - b["xmin"] + dy = b["ymax"] - b["ymin"] + if not (0.4 <= dz <= 0.8) or max(dx, dy) > 0.25: + continue + out.append((si, b)) + return out + + +def measured_curb_top(me): + """Top of the masonry, read off the generated mesh, not from CURB_TOP. + + An assertion that restates the constant the builder used witnesses + nothing, so the post tenon is measured against the stone the post is + actually tenoned into. + """ + stone = {int(p.vertices[0]) for p in me.polygons + if p.material_index == STONE_IDX} + return max(me.vertices[i].co.z for i in stone) + + +def roof_corners(me, groups): + """The roof's four hip corners, recomputed from the generated mesh. + + The corner verts of the widest wood shell above the eave: its four + extreme XY points. Nothing here restates EAVE_HALF. + """ + pts = [v.co for v in me.vertices if v.co.z >= EAVE_Z - 0.12] + if not pts: + return [] + zlo = min(p.z for p in pts) + eave = [p for p in pts if p.z <= zlo + 0.05] + if not eave: + return [] + # The four extreme points of the pooled eave ring are the hip corners. + # Taking them from a single shell picks one fascia board instead, whose + # own extremes sit 90 degrees off the corners they are nailed to. + corners = [] + for qx, qy in ((1, 1), (-1, 1), (-1, -1), (1, -1)): + corners.append(max(eave, key=lambda p: qx * p.x + qy * p.y)) + return corners + + +def drop_bucket(me, dz): + """Falsifier surgery: lower the hung bucket assembly back down the shaft. + + Everything inside the mouth above the curb and under the windlass — + which is the bucket, its hoops and its bail — moves as one body. + """ + groups = shell_groups(me) + for g in groups: + b = shell_box(me, g) + if b["zmin"] < CURB_TOP or b["zmax"] > POST_TOP - 0.10: + continue + if max(b["xmax"] - b["xmin"], b["ymax"] - b["ymin"]) > 2.5 * BUCKET_R_TOP: + continue + for i in g: + me.vertices[i].co.z -= dz + me.update() + + +def float_one_stone(me, dz): + """Falsifier surgery: lift one bottom-course stone off the floor. + + The other bays stay down, so the AABB grounded gate still passes and + only the named-support budget can catch it. + """ + groups = shell_groups(me) + floor_z = min(v.co.z for v in me.vertices) + for g in groups: + b = shell_box(me, g) + if b["zmin"] > floor_z + 1e-5 or b["zmax"] > floor_z + STONE_H * 1.6: + continue + for i in g: + me.vertices[i].co.z += dz + break + me.update() + + def min_mat_distance(me, ia, ib): """Closest surface distance between two material islands via BVH. @@ -1090,10 +1341,28 @@

Source

) -def check(skip_decimate, lift_z=False): +def check(skip_decimate, lift_z=False, stand_posts=False, turn_posts=False, + float_stone=False, drop_bucket_flag=False, shallow_tenon=False): bpy.ops.wm.read_factory_settings(use_empty=True) - low = build_well_mesh("WellLow", bevel_offset=0.010, bevel_segments=2) - high = build_well_mesh("WellHigh", bevel_offset=0.010, bevel_segments=4) + # --stand-posts reproduces the shipped bug exactly: posts on the axis + # AND standing on the coping, which is the pair of choices that put a + # foot and a curb top on one plane. Seating alone at 45 degrees leaves + # no curb top face within COPLANAR_CENTRE_MAX of a foot, so it would + # fall through to the seat band and witness the wrong budget. + seat = POST_SEAT + if stand_posts: + seat = STAND_POST_SEAT + elif shallow_tenon: + seat = SHALLOW_TENON_SEAT + turn = 0.0 + if stand_posts: + turn = STAND_POST_TURN + elif turn_posts: + turn = TURN_POSTS_ANGLE + low = build_well_mesh("WellLow", bevel_offset=0.010, bevel_segments=2, + post_seat=seat, turn_posts=turn) + high = build_well_mesh("WellHigh", bevel_offset=0.010, bevel_segments=4, + post_seat=seat, turn_posts=turn) stone = principled( "WellStone", (0.40, 0.42, 0.46, 1.0), 0.0, 0.84, noise_scale=9.0, wear=(0.29, 0.30, 0.33, 1.0), @@ -1112,6 +1381,10 @@

Source

for v in low.data.vertices: v.co.z += LIFT_Z low.data.update() + if float_stone: + float_one_stone(low.data, FLOAT_STONE_Z) + if drop_bucket_flag: + drop_bucket(low.data, DROP_BUCKET_Z) if low.data is None or len(low.data.polygons) < 6: return fail("well mesh did not build", 3), None, None, None, None, None @@ -1184,6 +1457,62 @@

Source

) print(f"measured gap_stone_wood={gap_sw:.5f} gap_metal_wood={gap_mw:.5f}") + groups = shell_groups(low.data) + zfight = coplanar_zfight_pairs(low.data, groups) + # Named supports: every bottom-course stone, not just the lowest one. + floor_z = bb[2] + supports = [] + for g in groups: + b = shell_box(low.data, g) + if b["zmin"] < floor_z + 0.02 and b["zmax"] < floor_z + STONE_H * 1.6: + supports.append(b["zmin"] - floor_z) + n_support = len(supports) + support_worst = max((abs(z) for z in supports), default=1e9) + # Post tenon depth, recomputed per post from the generated curb top. + posts = post_shells(low.data, groups) + n_posts = len(posts) + curb_top = measured_curb_top(low.data) + seats = [curb_top - b["zmin"] for _si, b in posts] + seat_min = min(seats) if seats else -1.0 + seat_max = max(seats) if seats else 1e9 + # Each post stands under a hip corner of the roof, in plan. + corners = roof_corners(low.data, groups) + post_corner = 1e9 + if posts and corners: + worst = 0.0 + for _si, b in posts: + px = 0.5 * (b["xmin"] + b["xmax"]) + py = 0.5 * (b["ymin"] + b["ymax"]) + pa = math.atan2(py, px) + best = min( + abs((math.atan2(c.y, c.x) - pa + math.pi) + % (2.0 * math.pi) - math.pi) + for c in corners + ) + worst = max(worst, best) + post_corner = worst + # Bucket clearance above the curb. + bucket_clear = -1.0 + metal_v = {int(p.vertices[0]) for p in low.data.polygons + if p.material_index == METAL_IDX} + for g in groups: + b = shell_box(low.data, g) + if b["zmin"] < curb_top or any(i in metal_v for i in g): + continue + if (b["xmax"] - b["xmin"]) > 2.5 * BUCKET_R_TOP: + continue + if b["zmax"] - b["zmin"] > BUCKET_H * 1.4: + continue + cand = b["zmin"] - curb_top + if bucket_clear < 0 or cand < bucket_clear: + bucket_clear = cand + print( + f"measured zfight_pairs={zfight} shells={len(groups)} " + f"grounded_stones={n_support} support_worst={support_worst:.6f} " + f"posts={n_posts} post_seat=[{seat_min:.5f},{seat_max:.5f}] " + f"post_hip_offset={post_corner:.5f} bucket_clear={bucket_clear:.5f}" + ) + if not (BASE_TRIS_MIN <= base_tris <= BASE_TRIS_MAX): return fail( f"base tris {base_tris} not in [{BASE_TRIS_MIN}, {BASE_TRIS_MAX}]", @@ -1266,12 +1595,27 @@

Source

f"doubles={hyg['doubles']} ngons={hyg['ngons']}", 15, ), None, None, None, None, None + if zfight > ZFIGHT_PAIRS_MAX: + return fail( + f"coplanar cross-shell face pairs {zfight} > {ZFIGHT_PAIRS_MAX} " + "(--stand-posts is the designed fail: a post foot standing on " + "the coping's top face puts both on one plane)", + 15, + ), None, None, None, None, None if abs(bb[2]) > ZMIN_EPS: return fail( f"zmin {bb[2]:.6f} not within {ZMIN_EPS} of 0 " "(--lift-z is the designed fail)", 16, ), None, None, None, None, None + if n_support != SUPPORT_COUNT or support_worst > SUPPORT_ZMIN_EPS: + return fail( + f"grounded bottom-course stones {n_support}/{SUPPORT_COUNT}, " + f"worst zmin {support_worst:.6f} > {SUPPORT_ZMIN_EPS} " + "(--float-stone is the designed fail: one bay lifted off the " + "floor while the rest still ground the AABB)", + 16, + ), None, None, None, None, None if gap_sw > GAP_MAX: return fail( f"stone-wood gap {gap_sw:.5f} > {GAP_MAX} " @@ -1284,6 +1628,30 @@

Source

"(crank, hoops, and bail must touch the wood they mount to)", 17, ), None, None, None, None, None + if seat_min < POST_SEAT_MIN or seat_max > POST_SEAT_MAX: + return fail( + f"post tenon depth band [{seat_min:.5f}, {seat_max:.5f}] outside " + f"[{POST_SEAT_MIN}, {POST_SEAT_MAX}] over {n_posts} posts " + "(--shallow-tenon is the designed fail)", + 18, + ), None, None, None, None, None + if bucket_clear < BUCKET_CLEAR_MIN or bucket_clear > BUCKET_CLEAR_MAX: + return fail( + f"bucket clears the curb by {bucket_clear:.5f} outside " + f"[{BUCKET_CLEAR_MIN}, {BUCKET_CLEAR_MAX}] " + "(--drop-bucket is the designed fail: a bucket down the shaft " + "shows only its rim and the piece loses its subject)", + 18, + ), None, None, None, None, None + if n_posts != POST_COUNT or post_corner > POST_CORNER_EPS: + return fail( + f"posts {n_posts}/{POST_COUNT}, worst post-to-hip-corner plan " + f"offset {post_corner:.5f} > {POST_CORNER_EPS} " + "(--turn-posts is the designed fail: posts at the midpoint of " + "each eave leave the roof's corners cantilevered and stand one " + "post in the well mouth)", + 19, + ), None, None, None, None, None return 0, low, high, stone, tex, collider @@ -1407,10 +1775,45 @@

Source

action="store_true", help="falsification: lift the mesh so zmin fails the grounded budget", ) + p.add_argument( + "--stand-posts", + action="store_true", + help="falsification: stand the posts on the curb instead of tenoning " + "them in, so foot and coping land on one plane", + ) + p.add_argument( + "--shallow-tenon", + action="store_true", + help="falsification: tenon the posts only part way into the curb so " + "the seat band fails without putting faces on one plane", + ) + p.add_argument( + "--turn-posts", + action="store_true", + help="falsification: rotate the post ring off the roof's hip corners " + "to the midpoint of each eave", + ) + p.add_argument( + "--float-stone", + action="store_true", + help="falsification: lift one bottom-course stone while the rest " + "still ground the AABB", + ) + p.add_argument( + "--drop-bucket", + action="store_true", + help="falsification: lower the bucket back down the shaft", + ) args = p.parse_args(argv) code, low, _high, stone, tex, _col = check( - args.skip_decimate, lift_z=args.lift_z + args.skip_decimate, + lift_z=args.lift_z, + stand_posts=args.stand_posts, + turn_posts=args.turn_posts, + float_stone=args.float_stone, + drop_bucket_flag=args.drop_bucket, + shallow_tenon=args.shallow_tenon, ) if code: return code diff --git a/showcase/README.md b/showcase/README.md index 225ebcb1..4808638f 100644 --- a/showcase/README.md +++ b/showcase/README.md @@ -42,6 +42,13 @@ entry in `showcase/gallery.json`, and a rendered still. coplanar-face budget fails (exit 15). `--short-stile` / `--short-post` lift a member out of its cup (exit 18 or 19). `--clip-ring` pulls a hung ring off the eye centerline (exit 18). + `--flush-tyre` / `--stand-posts` restore a flush surface so the + coplanar budget fails (exit 15). `--float-wheel` / `--float-stone` + lift one named support while the rest still ground the AABB (exit 16). + `--sink-tyre` / `--shallow-tenon` put a seat outside its band (exit + 18). `--drop-bucket` hides the hung subject (exit 18). + `--skew-wheel` / `--turn-posts` break a mirror or placement budget + (exit 19). A budget with no falsifier witnesses nothing: prove each one fails once, and check the exit code, not just non-zero. @@ -187,6 +194,63 @@ entry in `showcase/gallery.json`, and a rendered still. The outer AABB does not cover this: on a prop with an appendage the AABB is the appendage, and the body can drift to any size underneath it. +- **A band is hooped onto its host, never set flush against it (exit + 15/18).** A tyre, ferrule, hoop or collar derives its **inner** radius + from the host's **outer** radius minus a named interference, and its + outer radius from the host plus its own thickness. Writing + `r_mid = host_out + t/2, radial_t = t/2` — the obvious spelling — + makes the band's inner cylinder and the host's tread the *same + surface*, so every segment is a coplanar cross-shell pair around the + whole circumference. `cart` shipped that way and measured 32 pairs + (16 per wheel); the speckle was visible on the committed hero and in + a clay pass, and no budget could see it. `--flush-tyre` restores the + equality and is the falsifier. +- **A member is tenoned into its seat, never stood on it (exit + 15/18).** A post, leg or stile whose bottom face lands exactly on its + host's top face puts both on one plane. Derive the member's bottom + from the host's top minus a named seat depth, and hold the member's + *top* fixed so nothing above it moves. `stone-well` stood its four + roof posts on the coping and measured 4 pairs, one per post. + Assert the seat as a **band** recomputed against the host surface read + off the generated mesh — `max z` over the host's material — not + against the constant the builder used, which witnesses nothing. +- **Posts go under the roof's corners, not the middle of its eaves + (exit 19).** Where a hip or pyramid roof is carried on four posts, + assert each post's plan bearing against a hip corner **recomputed from + the generated mesh**, as a wrapped angular difference. Take the + corners from the *pooled* vertices at the eave line: pulling them from + a single shell picks one fascia board, whose own extremes sit 90° off + the corners it is nailed to, and the budget then fails on a correct + model. `stone-well` placed its posts on the axes, which cantilevered + the roof's corners 0.80 m and stood one post dead centre in the well + mouth in every orthographic view. +- **A roof is sized from what it must cover, not from what carries it.** + Deriving the eave reach from the post ring plus an overhang gave + `stone-well` a 1.64 m roof over a 1.08 m drum — an umbrella. Derive it + from the covered body's own radius plus a named clearance + (`EAVE_HALF = R_OUTER + CURB_OUT + EAVE_CLEAR`), and let the overhang + fall out of that. Expect the convex-hull collider budget to move when + the roof does; re-fit it and say so. +- **The subject hangs where it can be seen (exit 18).** A prop whose + story is one small part — a bucket on a rope, a lantern on a hook — + asserts that part's clearance above the body it hangs over, as a band, + measured against the body read off the mesh. `stone-well`'s bucket sat + down the shaft with only its rim level with the coping: invisible in + the hero and in all six orthographic views, and no budget noticed. + `--drop-bucket` is the falsifier. +- **Mirrored assemblies (exit 19).** Where a prop has a left and a + right of the same part — two wheels, two brackets — pair the shells + and assert they match in the two axes they share and in their extents, + within a named epsilon, and are opposite in the mirrored axis. Size + the falsifier's displacement to stay **inside** `BBOX_TOL` so the AABB + gate cannot steal the failure: `cart`'s `--skew-wheel` moves one wheel + 6 mm along a track whose tolerance is 10 mm. +- **Segment counts are a silhouette budget, not a triangle budget.** A + 16-gon felloe reads as a polygon at hero size, and the flat facet + facing the key light renders as a hard white plate. `cart` went to 24 + and the chords disappeared. Re-fit the triangle band around the new + measured count rather than leaving the old one — and prefer a band + *narrower* than the one it replaces, centred on the measurement. - **Material face floors.** Every declared material asserts a named minimum face count on the finished mesh, recomputed from `polygon.material_index`. This catches the slot-assignment wipe class: diff --git a/showcase/gallery.json b/showcase/gallery.json index 3914d102..38e1d7f1 100644 --- a/showcase/gallery.json +++ b/showcase/gallery.json @@ -21,7 +21,7 @@ "name": "stone-well", "dir": "showcase/stone-well", "teaches": "A procedural stone well through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.", - "witnessesFix": "Recomputed: 9380 tris, three materials with face floors, UVs in 0..1 with zero AABB overlap, outer AABB 1.640×1.640×1.761 m, LOD ratios in band, convex collider 306 tris, hygiene zero (loose, non-manifold, doubles, n-gons), grounded zmin, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget; --lift-z exits 16 on the grounded budget.", + "witnessesFix": "Recomputed: 9380 tris, three materials with face floors, UVs in 0..1 with zero AABB overlap, outer AABB 1.312×1.312×1.761 m, LOD ratios in band, convex collider 346 tris, hygiene zero (loose, non-manifold, doubles, n-gons), zero coplanar cross-shell face pairs, all 12 bottom-course stones on the floor, each post tenoned 18 mm into the measured coping and standing under a roof hip corner, the bucket hanging 0.10 m clear of the coping, grounded zmin, non-empty glTF. --stand-posts exits 15 on the z-fight budget; --float-stone exits 16 on the named-support budget; --shallow-tenon and --drop-bucket exit 18; --turn-posts exits 19 on post placement; --skip-decimate exits 9 on the LOD1 ratio budget; --lift-z exits 16 on the grounded budget.", "hero": "docs/gallery/assets/stone-well-hero.webp", "preview": "showcase/stone-well/preview.webp", "tags": [ @@ -129,7 +129,7 @@ "name": "cart", "dir": "showcase/cart", "teaches": "A procedural two-wheel wooden cart through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.", - "witnessesFix": "Recomputed: 2600 tris, two materials with metal and wood face floors, UVs in 0..1 with zero AABB overlap, outer AABB 1.539×0.749×0.640 m, LOD ratios in band, convex collider 122 tris, hygiene zero (loose, non-manifold, doubles, n-gons), grounded zmin, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget; --lift-z exits 16 on the grounded budget.", + "witnessesFix": "Recomputed: 2856 tris, two materials with metal and wood face floors, UVs in 0..1 with zero AABB overlap, outer AABB 1.539×0.749×0.640 m, LOD ratios in band, convex collider 154 tris, hygiene zero (loose, non-manifold, doubles, n-gons), zero coplanar cross-shell face pairs, both tyres grounded, tyre seat depth in band over 48 angular stations, the two wheels mirrored within 5e-5 m, grounded zmin, non-empty glTF. --flush-tyre exits 15 on the z-fight budget; --sink-tyre exits 18 on the tyre seat band; --float-wheel exits 16 on the named-support budget; --skew-wheel exits 19 on the wheel mirror; --skip-decimate exits 9 on the LOD1 ratio budget; --lift-z exits 16 on the grounded budget.", "hero": "docs/gallery/assets/cart-hero.webp", "preview": "showcase/cart/preview.webp", "tags": [