Repository navigation
Commit 0cc8197
feat: add crate-stack and stone-archway showcase pieces (#199)
* feat: add crate-stack showcase piece
Three shipping crates stacked, built by one generator called three times
with a per-instance seed. The subject is reuse with variation: the seed
drives yaw and plank widths so the crates read as three of the same design
rather than one model pasted three times, and the README says plainly that
true instancing and per-instance geometry variation are mutually exclusive.
Budgets recomputed from the finished mesh, measured before they were
written: 4380 tris, 2 materials with 216 iron and 2436 timber faces, UVs in
0..1 with zero overlap, outer AABB 0.658x0.524x0.704 m, each crate's own
footprint 0.585x0.425 m in its own frame, three ground runners at z=0, both
crate-to-crate seats overlapping, LOD ratios in band, 202-tri collider,
non-empty glTF, and hygiene zero across loose/non-manifold/zero-area/
doubles/n-gons/coplanar-disjoint.
Six falsifiers, each breaking one named budget, all proven on 4.5.11,
5.1.2 and 5.2.1 with identical exit codes: --skip-decimate 9, --stray-vert
15, --lift-z 16, --short-skids 16, --float-stack 18, --same-seed 20.
Three findings the budgets forced, all documented in the README:
- Shape filters had to move to principal axes. Every part is axis-aligned
in its crate's frame then rotated about Z, so a world-AABB filter
measures the rotated box: a 0.554 m board yawed 0.09 rad reports 0.061 m
of depth instead of 0.013 m, and every thickness-keyed filter matched
nothing.
- Stack levels had to be clustered from the runners the mesh actually has.
Binning against the declared pitch put a lid on the wrong level as soon
as a falsifier shifted a crate, and the seat budget then compared a crate
against itself.
- find_doubles caught two real joints, not false positives: the corner
straps sat flush with the post corner, and the lid rested exactly on the
rail top. Both now bite into their host.
Falsifiers were also retuned so each fails on its own budget rather than on
an earlier check: the stray vertex sits inside the silhouette, --short-skids
floats one of three runners so the AABB still grounds, and --same-seed
collapses only the design stream while placement stays per-instance so the
footprint is unchanged.
LOD2 is the one value that differs across versions (878 tris on 5.2, 934 on
4.5 and 5.1) — DECIMATE COLLAPSE, which is why the gate is a ratio band.
Adds ~1.0 s to smoke on 4.5/5.1 and ~1.2 s on 5.2.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
* fix: warm the crate-stack wedge pool
Building the contact sheet against the pinned calibration set
(armature-bend, damped-track-aim, bmesh-gear) showed the wedge reading as a
cool grey band rather than the warm pool the house style calls for. Move it
closer to the backdrop, raise it to 560 W, and shift its colour to
(1.0, 0.72, 0.40).
Lighting only — no geometry, no budget, no assertion, no exit code changes.
Mean luminance 0.2185, inside the calibration band [0.1722, 0.3048]. Hero
and preview re-rendered; contact sheet committed under
docs/gallery/contact-sheets/.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
* feat: add stone-archway showcase piece
A freestanding masonry arch: two coursed piers, projecting imposts, nine
voussoirs turning a semicircle, and a keystone standing proud at the crown.
The headline budget is the one an arch can fail invisibly. Nine wedge
blocks laid in a row are still nine wedge blocks; what makes them an arch
is that their intrados vertices sit on a circle. The piece recomputes that
circle from vertex positions rather than from the angles the generator
used, and asserts every intrados vertex lands within 4 mm of the declared
0.60 m radius over an arc of at least 168 degrees. Measured: 0.97 mm over
178.0 degrees.
Other budgets, all recomputed: 924 tris, two materials with 182 dressed and
364 ashlar faces, UVs in 0..1 with zero overlap, outer AABB
1.644x0.510x2.057 m, clear opening 1.203 m, both piers grounded, the
springing joint an overlap, all eight mortar joints at 9.70 mm inside a
6-17 mm band, 168-tri collider, non-empty glTF, and hygiene zero across
loose/non-manifold/zero-area/doubles/n-gons/coplanar-disjoint.
Seven falsifiers, each breaking one named budget, all proven on 4.5.11,
5.1.2 and 5.2.1 with identical exit codes: --skip-decimate 9, --stray-vert
15, --lift-z 16, --float-pier 16, --sink-keystone 17, --wide-mortar 18,
--off-circle 19.
Four findings the budgets forced, all documented in the README:
- bmesh.ops.bevel gives every face it creates material_index 0. Chamfering
nineteen blocks left 30 faces on the dressed slot and moved 464 to
ashlar; the slot count and the distinct-material check both still
passed. Only the per-material face floor caught it. Materials are now
re-stamped per block after the bevel.
- The impost landed exactly on the top course — same footprint, same
plane, coincident face centres. It now sits on its own mortar bed.
- BVHTree.find_nearest is unsigned, so a voussoir seated inside the pier
head reported a 5.4 mm gap where there was none. Joint gaps now test
overlap first.
- Joint gaps need measuring both ways: the keystone's radial faces are
wider in Y than its neighbours', so every keystone vertex on the joint
lies outside the neighbour and read 33 mm instead of 9.7 mm.
Three falsifiers needed the model changed rather than the budget loosened.
--sink-keystone originally shrank the Y bounding box and tripped the AABB
gate, so imposts were added to own the envelope — correct masonry the arch
was missing. --off-circle began as --flat-arch, which is 0.62 m shorter and
also fails on the bounding box, proving nothing about the circle fit.
--float-pier tripped the z-fight budget because the impost was pinned to an
absolute height while its courses rose into it.
LOD2 is the one value that differs across versions (196 tris on 5.2, 202 on
4.5 and 5.1) — DECIMATE COLLAPSE, which is why the gate is a ratio band.
Adds ~0.82 s to smoke on 4.5, ~0.85 s on 5.1, ~0.98 s on 5.2. All 28
showcase pieces together run in 20.9 s on 5.2.1.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
* docs: sync the showcase candidate pool
Mark crate-stack and stone-archway shipped, and restock the pool with four
subjects identified while building them: rope bridge, grain sacks, brazier,
apothecary shelf.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
---------
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>1 parent 0718120 commit 0cc8197
19 files changed
Lines changed: 6398 additions & 8 deletions
File tree
- .cursor-plugin
- docs/gallery
- assets
- contact-sheets
- crate-stack
- stone-archway
- showcase
- crate-stack
- stone-archway
- tests/smoke
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
163 | 163 | | |
164 | 164 | | |
165 | 165 | | |
166 | | - | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
167 | 169 | | |
168 | 170 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
25 | | - | |
| 25 | + | |
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | | - | |
| 21 | + | |
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
| |||
37 | 37 | | |
38 | 38 | | |
39 | 39 | | |
40 | | - | |
| 40 | + | |
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
| |||
106 | 106 | | |
107 | 107 | | |
108 | 108 | | |
109 | | - | |
| 109 | + | |
110 | 110 | | |
111 | 111 | | |
112 | 112 | | |
| |||
135 | 135 | | |
136 | 136 | | |
137 | 137 | | |
| 138 | + | |
| 139 | + | |
138 | 140 | | |
139 | 141 | | |
140 | 142 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
131 | 131 | | |
132 | 132 | | |
133 | 133 | | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
134 | 140 | | |
135 | 141 | | |
136 | 142 | | |
| |||
Loading
Loading
0 commit comments