From ca829b8943c0bc313ff757b263440d1840066f61 Mon Sep 17 00:00:00 2001 From: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Date: Tue, 15 Sep 2026 23:25:44 -0400 Subject: [PATCH 1/2] fix: seat the ladder rungs and stop the iron chamfers reading as wood The rung dowels were as deep as the stile they pass through, so each one erupted through the stile's front and back chamfers as a thin spike in every joint close-up. Narrowing the dowel to 26 mm corrects the proportion; a material or camera change would only have hidden it. Beveling the caps and shoes left every chamfer face in the wood slot. Bevel does not inherit material_index onto the faces it creates, and the piece claimed its metal faces from a pre-bevel snapshot, so each iron fitting rendered as a black block framed in tan. Claim them from the bevel op's own return instead. The previous round removed six iron fittings per ladder without re-fitting the triangle band or the outer AABB, leaving the piece failing its own gates at exit 4. Both constants are re-fitted to the measured result: 2184 tris to 936. Locks all of it in as budgets recomputed from the generated mesh: shell count, rung-to-stile depth clearance, tenon engagement and breakout margin, and material face floors that the pre-bevel snapshot would have failed. --lift-z could never fire, because matrix_world is evaluated data and the object was moved without a view-layer update; --stray-vert and --fat-rungs are new, and all four are proven to fire. Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Co-authored-by: Cursor --- docs/gallery/assets/wooden-ladder-hero.webp | Bin 9624 -> 12308 bytes docs/gallery/index.html | 6 +- docs/gallery/wooden-ladder/index.html | 441 +++++++++++++++++--- showcase/gallery.json | 4 +- showcase/wooden-ladder/README.md | 60 ++- showcase/wooden-ladder/preview.webp | Bin 8916 -> 12308 bytes showcase/wooden-ladder/wooden_ladder.py | 413 +++++++++++++++--- 7 files changed, 781 insertions(+), 143 deletions(-) diff --git a/docs/gallery/assets/wooden-ladder-hero.webp b/docs/gallery/assets/wooden-ladder-hero.webp index 26b04f459e1370099c91e74b38a599047f9ecd18..c758379d6208a537b1225a123384c9c2aec9f6f5 100644 GIT binary patch literal 12308 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

apr2G^#6j-A^{J_5YI^Yk<;=ud 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 literal 9624 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

- wooden-ladder — A procedural timber ladder with raked stiles, six rungs, and iron shoes through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather… + wooden-ladder — A procedural timber ladder with raked stiles, six dowel rungs tenoned into the stiles, and iron shoes and top caps through UVs, bake, LOD, collider, and Unity…

wooden-ladder

-

A procedural timber ladder with raked stiles, six rungs, and iron shoes through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.

-

witnesses Recomputed: 2184 tris, two materials with 1008 wood and 48 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.474×0.361×1.482 m, LOD ratios in band, convex collider 52 tris, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget.

+

A procedural timber ladder with raked stiles, six dowel rungs tenoned into the stiles, and iron shoes and top caps through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.

+

witnesses Recomputed: 936 tris, two materials with 324 wood and 216 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.472×0.365×1.460 m, grounded at zmin 0, mesh hygiene all zero, 12 shells with every rung clearing the stile chamfer by 3.61 mm, convex collider 24 tris, non-empty glTF. Four falsifiers exit 9, 15, 16, and 17 on the LOD, hygiene, grounded, and joint-fit budgets.

View example
diff --git a/docs/gallery/wooden-ladder/index.html b/docs/gallery/wooden-ladder/index.html index 1f5d4a3..6383b83 100644 --- a/docs/gallery/wooden-ladder/index.html +++ b/docs/gallery/wooden-ladder/index.html @@ -4,18 +4,18 @@ wooden-ladder — Examples — Blender Developer Tools - + - + - +