Skip to content

Commit 0a995d2

Browse files
TMHSDigitalclaude
andcommitted
fix(showcase): close river-delta-tile's boat ends with quads, not a sliver n-gon
The boat's bow section is a few millimetres wide, so its 14-point hull ring closed as one n-gon was nearly collinear, and bmesh.ops.triangulate splits it differently by version: 4.5.14 cut a zero-area sliver (8.7e-11 m^2), failing hygiene (exit 15) on the 4.5 smoke job while 5.2 passed. Both hull ends are now closed by six quads across the wall, outer to inner: the same area, no version-dependent triangulation. Verified on 5.2.1 and 4.5.14: happy path and all 15 falsifiers exit their declared codes on both; base triangles unchanged (140150); hero re-render differs only by render noise (mean 0.06/255), committed assets kept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 981b740 commit 0a995d2

5 files changed

Lines changed: 13 additions & 8 deletions

File tree

‎docs/gallery/index.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1798,7 +1798,7 @@ <h2><a class="stretch" href="caldera-island-tile/">Caldera Island Tile</a></h2>
17981798
<h2><a class="stretch" href="river-delta-tile/">River Delta Tile</a></h2>
17991799
<p class="slug">river-delta-tile</p>
18001800
<p class="teaches">A procedural strategy-game map tile of a river delta — a square 2.40 m on a side, low and flat, where a river comes in through the back edge and forks twice at the angle natural deltas grow toward into four distributaries, each child&#x27;s width set by hydraulic geometry so the widths squared balance at every fork; its water falling along every channel and level with the sea through the backwater reach to every mouth; natural levees holding each channel over the marsh; a farmed upper plain in a patchwork of fields, a wild lower plain of marsh, salt marsh and mud with an oxbow lake and ponds; a lobed coast with tan silt plumes fanning into the sea and marsh-crowned bars off the mouths; reed beds, weeping willows and poplars, drift logs afloat and stranded, and a fisherman&#x27;s stilt hut with its jetty, boat and fish weir — through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.</p>
1801-
<p class="witnesses"><span class="tag">witnesses</span> Recomputed: 140150 tris, seven materials with 53503 ground, 46711 water, 17418 reed, 998 timber, 646 bark, 5420 foliage and 9855 plinth faces, UVs in 0..1 with zero AABB overlap, outer AABB 2.400×2.400×0.296 m, zmin 0, hygiene 0 including zero coplanar cross-shell pairs, the water never rising along any of the four courses (largest step 2e-7 m over 2863 samples, max 1e-6), the children&#x27;s wetted widths squared over the parent&#x27;s 0.960, 1.008 and 0.991 at the three forks (band 0.88–1.12) and the forks opening 73.3°, 73.6° and 74.0° (band 58–82), every mouth&#x27;s course wet all the way and ending 0.00004 m off the sea&#x27;s level, every levee crest at least 0.0078 m over its channel and 0.0021 m over the marsh behind at 228 stations, all six islands&#x27; cores 0.0037–0.0050 m out of the water round them, the sea at 0.1500 m with a 0.0024 m ripple and the ponds flat, every water rim at least 0.0025 m under the ground, all 4351 reed blades 0.0036–0.0059 m in the ground, the floating logs and the boat 0.33–0.55 of their height under the water and the stranded logs sealed in every sector, all 28 stilts, jetty posts and stakes footed 0.0099–0.0155 m in the bed with their tops over the water, all 35 trunks 0.009–0.011 m in the ground, LOD ratios in band, eight-hull collider 174 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z 16; --uphill-channel 17; --choke-branch 18; --splay-fork 19; --plug-mouth 20; --breach-levee 21; --drown-islet 22; --flat-sea 23; --short-sea 24; --float-reeds 25; --sink-logs 26; --lift-hut 27; --float-trees 28.</p>
1801+
<p class="witnesses"><span class="tag">witnesses</span> Recomputed: 140150 tris, seven materials with 53503 ground, 46711 water, 17418 reed, 986 timber, 646 bark, 5420 foliage and 9855 plinth faces, UVs in 0..1 with zero AABB overlap, outer AABB 2.400×2.400×0.296 m, zmin 0, hygiene 0 including zero coplanar cross-shell pairs, the water never rising along any of the four courses (largest step 2e-7 m over 2863 samples, max 1e-6), the children&#x27;s wetted widths squared over the parent&#x27;s 0.960, 1.008 and 0.991 at the three forks (band 0.88–1.12) and the forks opening 73.3°, 73.6° and 74.0° (band 58–82), every mouth&#x27;s course wet all the way and ending 0.00004 m off the sea&#x27;s level, every levee crest at least 0.0078 m over its channel and 0.0021 m over the marsh behind at 228 stations, all six islands&#x27; cores 0.0037–0.0050 m out of the water round them, the sea at 0.1500 m with a 0.0024 m ripple and the ponds flat, every water rim at least 0.0025 m under the ground, all 4351 reed blades 0.0036–0.0059 m in the ground, the floating logs and the boat 0.33–0.55 of their height under the water and the stranded logs sealed in every sector, all 28 stilts, jetty posts and stakes footed 0.0099–0.0155 m in the bed with their tops over the water, all 35 trunks 0.009–0.011 m in the ground, LOD ratios in band, eight-hull collider 174 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z 16; --uphill-channel 17; --choke-branch 18; --splay-fork 19; --plug-mouth 20; --breach-levee 21; --drown-islet 22; --flat-sea 23; --short-sea 24; --float-reeds 25; --sink-logs 26; --lift-hut 27; --float-trees 28.</p>
18021802
<span class="card-link" aria-hidden="true">View showcase piece &rarr;</span>
18031803
</div>
18041804
</article>

‎docs/gallery/river-delta-tile/index.html‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ <h1>River Delta Tile</h1>
5353
<img src="../assets/river-delta-tile-hero.webp" alt="A square delta map tile: a river splitting twice into four channels across fields and marsh, tan silt plumes and sandy bars off the mouths, and a stilt hut by a jetty." width="1280" height="720" fetchpriority="high" />
5454
</button>
5555
<p class="zoom-hint">Rendered headless by the showcase piece itself. Select it to enlarge.</p>
56-
<div class="callout"><span class="tag">witnesses</span> Recomputed: 140150 tris, seven materials with 53503 ground, 46711 water, 17418 reed, 998 timber, 646 bark, 5420 foliage and 9855 plinth faces, UVs in 0..1 with zero AABB overlap, outer AABB 2.400×2.400×0.296 m, zmin 0, hygiene 0 including zero coplanar cross-shell pairs, the water never rising along any of the four courses (largest step 2e-7 m over 2863 samples, max 1e-6), the children&#x27;s wetted widths squared over the parent&#x27;s 0.960, 1.008 and 0.991 at the three forks (band 0.88–1.12) and the forks opening 73.3°, 73.6° and 74.0° (band 58–82), every mouth&#x27;s course wet all the way and ending 0.00004 m off the sea&#x27;s level, every levee crest at least 0.0078 m over its channel and 0.0021 m over the marsh behind at 228 stations, all six islands&#x27; cores 0.0037–0.0050 m out of the water round them, the sea at 0.1500 m with a 0.0024 m ripple and the ponds flat, every water rim at least 0.0025 m under the ground, all 4351 reed blades 0.0036–0.0059 m in the ground, the floating logs and the boat 0.33–0.55 of their height under the water and the stranded logs sealed in every sector, all 28 stilts, jetty posts and stakes footed 0.0099–0.0155 m in the bed with their tops over the water, all 35 trunks 0.009–0.011 m in the ground, LOD ratios in band, eight-hull collider 174 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z 16; --uphill-channel 17; --choke-branch 18; --splay-fork 19; --plug-mouth 20; --breach-levee 21; --drown-islet 22; --flat-sea 23; --short-sea 24; --float-reeds 25; --sink-logs 26; --lift-hut 27; --float-trees 28.</div>
56+
<div class="callout"><span class="tag">witnesses</span> Recomputed: 140150 tris, seven materials with 53503 ground, 46711 water, 17418 reed, 986 timber, 646 bark, 5420 foliage and 9855 plinth faces, UVs in 0..1 with zero AABB overlap, outer AABB 2.400×2.400×0.296 m, zmin 0, hygiene 0 including zero coplanar cross-shell pairs, the water never rising along any of the four courses (largest step 2e-7 m over 2863 samples, max 1e-6), the children&#x27;s wetted widths squared over the parent&#x27;s 0.960, 1.008 and 0.991 at the three forks (band 0.88–1.12) and the forks opening 73.3°, 73.6° and 74.0° (band 58–82), every mouth&#x27;s course wet all the way and ending 0.00004 m off the sea&#x27;s level, every levee crest at least 0.0078 m over its channel and 0.0021 m over the marsh behind at 228 stations, all six islands&#x27; cores 0.0037–0.0050 m out of the water round them, the sea at 0.1500 m with a 0.0024 m ripple and the ponds flat, every water rim at least 0.0025 m under the ground, all 4351 reed blades 0.0036–0.0059 m in the ground, the floating logs and the boat 0.33–0.55 of their height under the water and the stranded logs sealed in every sector, all 28 stilts, jetty posts and stakes footed 0.0099–0.0155 m in the bed with their tops over the water, all 35 trunks 0.009–0.011 m in the ground, LOD ratios in band, eight-hull collider 174 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z 16; --uphill-channel 17; --choke-branch 18; --splay-fork 19; --plug-mouth 20; --breach-levee 21; --drown-islet 22; --flat-sea 23; --short-sea 24; --float-reeds 25; --sink-logs 26; --lift-hut 27; --float-trees 28.</div>
5757
<p class="taglist"><span class="tag">category</span> <a href="../#k=showcase&amp;c=terrain">Terrain</a></p>
5858
<p class="taglist"><span class="tag">tags</span> <a href="../#tag=mesh">mesh</a> <a href="../#tag=export">export</a> <a href="../#tag=showcase">showcase</a></p>
5959
<div class="runline">
@@ -72,7 +72,7 @@ <h1>River Delta Tile</h1>
7272
<p>The collider is eight convex hulls joined in one mesh, built from points only: the plinth up to the water, and the delta&#x27;s plain in seven fans from the apex, each from where it comes in over the back edge out to the coast or a side. Boats sail the water; units walk the land.</p>
7373
<h2 id="budgets">Budgets<a class="anchor" href="#budgets" aria-label="Link to this section">#</a></h2>
7474
<p>Every budget is declared as a named constant. Every gate <strong>recomputes</strong> its value from the mesh, materials, UVs, evaluated LOD, collider, or export file.</p>
75-
<div class="table-wrap"><table><thead><tr><th scope="col">Axis</th><th scope="col">Declared</th><th scope="col">Measured (5.2.1)</th></tr></thead><tbody><tr><td>Base triangles</td><td>138000–142500</td><td>140150</td></tr><tr><td>LOD1 ratio</td><td>0.32–0.62 of base</td><td>0.5000</td></tr><tr><td>LOD2 ratio</td><td>0.10–0.35 of base</td><td>0.2200</td></tr><tr><td>Materials</td><td>exactly 7 distinct; face floors ground ≥51900, water ≥45300, reed ≥16880, timber ≥955, bark ≥627, foliage ≥5257, plinth ≥9560</td><td>7 slots; 53503 / 46711 / 17418 / 998 / 646 / 5420 / 9855</td></tr><tr><td>UVs</td><td>in <code>0..1</code>, AABB overlap ≤ 1e-5</td><td>in range, overlap 0</td></tr><tr><td>Outer AABB</td><td>(2.4000, 2.4000, 0.2960) m ± 0.01</td><td>(2.4000, 2.4000, 0.2960), zmin 0</td></tr><tr><td>Collider tris (eight hulls)</td><td>≤ 360</td><td>174</td></tr><tr><td>Export</td><td>written, size &gt; 0, removed after measuring</td><td>14563016 bytes</td></tr></tbody></table></div>
75+
<div class="table-wrap"><table><thead><tr><th scope="col">Axis</th><th scope="col">Declared</th><th scope="col">Measured (5.2.1)</th></tr></thead><tbody><tr><td>Base triangles</td><td>138000–142500</td><td>140150</td></tr><tr><td>LOD1 ratio</td><td>0.32–0.62 of base</td><td>0.5000</td></tr><tr><td>LOD2 ratio</td><td>0.10–0.35 of base</td><td>0.2200</td></tr><tr><td>Materials</td><td>exactly 7 distinct; face floors ground ≥51900, water ≥45300, reed ≥16880, timber ≥955, bark ≥627, foliage ≥5257, plinth ≥9560</td><td>7 slots; 53503 / 46711 / 17418 / 986 / 646 / 5420 / 9855</td></tr><tr><td>UVs</td><td>in <code>0..1</code>, AABB overlap ≤ 1e-5</td><td>in range, overlap 0</td></tr><tr><td>Outer AABB</td><td>(2.4000, 2.4000, 0.2960) m ± 0.01</td><td>(2.4000, 2.4000, 0.2960), zmin 0</td></tr><tr><td>Collider tris (eight hulls)</td><td>≤ 360</td><td>174</td></tr><tr><td>Export</td><td>written, size &gt; 0, removed after measuring</td><td>14562248 bytes</td></tr></tbody></table></div>
7676
<p>DECIMATE COLLAPSE triangle counts are not identical across Blender series, so the LOD gate is a ratio band, not an exact count. Bake pixels are stochastic, so the bake gate is <code>has_data</code> plus operator <code>FINISHED</code>, not byte-identity. The plan is seeded and nothing else is random; two default runs print identical measurements.</p>
7777
<h3 id="hygiene">Hygiene<a class="anchor" href="#hygiene" aria-label="Link to this section">#</a></h3>
7878
<p>Recomputed from the generated mesh, not asserted about the script.</p>

‎showcase/gallery.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1125,7 +1125,7 @@
11251125
"category": "terrain",
11261126
"teaches": "A procedural strategy-game map tile of a river delta — a square 2.40 m on a side, low and flat, where a river comes in through the back edge and forks twice at the angle natural deltas grow toward into four distributaries, each child's width set by hydraulic geometry so the widths squared balance at every fork; its water falling along every channel and level with the sea through the backwater reach to every mouth; natural levees holding each channel over the marsh; a farmed upper plain in a patchwork of fields, a wild lower plain of marsh, salt marsh and mud with an oxbow lake and ponds; a lobed coast with tan silt plumes fanning into the sea and marsh-crowned bars off the mouths; reed beds, weeping willows and poplars, drift logs afloat and stranded, and a fisherman's stilt hut with its jetty, boat and fish weir — through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.",
11271127
"alt": "A square delta map tile: a river splitting twice into four channels across fields and marsh, tan silt plumes and sandy bars off the mouths, and a stilt hut by a jetty.",
1128-
"witnessesFix": "Recomputed: 140150 tris, seven materials with 53503 ground, 46711 water, 17418 reed, 998 timber, 646 bark, 5420 foliage and 9855 plinth faces, UVs in 0..1 with zero AABB overlap, outer AABB 2.400×2.400×0.296 m, zmin 0, hygiene 0 including zero coplanar cross-shell pairs, the water never rising along any of the four courses (largest step 2e-7 m over 2863 samples, max 1e-6), the children's wetted widths squared over the parent's 0.960, 1.008 and 0.991 at the three forks (band 0.88–1.12) and the forks opening 73.3°, 73.6° and 74.0° (band 58–82), every mouth's course wet all the way and ending 0.00004 m off the sea's level, every levee crest at least 0.0078 m over its channel and 0.0021 m over the marsh behind at 228 stations, all six islands' cores 0.0037–0.0050 m out of the water round them, the sea at 0.1500 m with a 0.0024 m ripple and the ponds flat, every water rim at least 0.0025 m under the ground, all 4351 reed blades 0.0036–0.0059 m in the ground, the floating logs and the boat 0.33–0.55 of their height under the water and the stranded logs sealed in every sector, all 28 stilts, jetty posts and stakes footed 0.0099–0.0155 m in the bed with their tops over the water, all 35 trunks 0.009–0.011 m in the ground, LOD ratios in band, eight-hull collider 174 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z 16; --uphill-channel 17; --choke-branch 18; --splay-fork 19; --plug-mouth 20; --breach-levee 21; --drown-islet 22; --flat-sea 23; --short-sea 24; --float-reeds 25; --sink-logs 26; --lift-hut 27; --float-trees 28.",
1128+
"witnessesFix": "Recomputed: 140150 tris, seven materials with 53503 ground, 46711 water, 17418 reed, 986 timber, 646 bark, 5420 foliage and 9855 plinth faces, UVs in 0..1 with zero AABB overlap, outer AABB 2.400×2.400×0.296 m, zmin 0, hygiene 0 including zero coplanar cross-shell pairs, the water never rising along any of the four courses (largest step 2e-7 m over 2863 samples, max 1e-6), the children's wetted widths squared over the parent's 0.960, 1.008 and 0.991 at the three forks (band 0.88–1.12) and the forks opening 73.3°, 73.6° and 74.0° (band 58–82), every mouth's course wet all the way and ending 0.00004 m off the sea's level, every levee crest at least 0.0078 m over its channel and 0.0021 m over the marsh behind at 228 stations, all six islands' cores 0.0037–0.0050 m out of the water round them, the sea at 0.1500 m with a 0.0024 m ripple and the ponds flat, every water rim at least 0.0025 m under the ground, all 4351 reed blades 0.0036–0.0059 m in the ground, the floating logs and the boat 0.33–0.55 of their height under the water and the stranded logs sealed in every sector, all 28 stilts, jetty posts and stakes footed 0.0099–0.0155 m in the bed with their tops over the water, all 35 trunks 0.009–0.011 m in the ground, LOD ratios in band, eight-hull collider 174 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z 16; --uphill-channel 17; --choke-branch 18; --splay-fork 19; --plug-mouth 20; --breach-levee 21; --drown-islet 22; --flat-sea 23; --short-sea 24; --float-reeds 25; --sink-logs 26; --lift-hut 27; --float-trees 28.",
11291129
"hero": "docs/gallery/assets/river-delta-tile-hero.webp",
11301130
"preview": "showcase/river-delta-tile/preview.webp",
11311131
"tags": [

‎showcase/river-delta-tile/README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,11 @@ export file.
9696
| Base triangles | 138000–142500 | 140150 |
9797
| LOD1 ratio | 0.32–0.62 of base | 0.5000 |
9898
| LOD2 ratio | 0.10–0.35 of base | 0.2200 |
99-
| Materials | exactly 7 distinct; face floors ground ≥51900, water ≥45300, reed ≥16880, timber ≥955, bark ≥627, foliage ≥5257, plinth ≥9560 | 7 slots; 53503 / 46711 / 17418 / 998 / 646 / 5420 / 9855 |
99+
| Materials | exactly 7 distinct; face floors ground ≥51900, water ≥45300, reed ≥16880, timber ≥955, bark ≥627, foliage ≥5257, plinth ≥9560 | 7 slots; 53503 / 46711 / 17418 / 986 / 646 / 5420 / 9855 |
100100
| UVs | in `0..1`, AABB overlap ≤ 1e-5 | in range, overlap 0 |
101101
| Outer AABB | (2.4000, 2.4000, 0.2960) m ± 0.01 | (2.4000, 2.4000, 0.2960), zmin 0 |
102102
| Collider tris (eight hulls) | ≤ 360 | 174 |
103-
| Export | written, size > 0, removed after measuring | 14563016 bytes |
103+
| Export | written, size > 0, removed after measuring | 14562248 bytes |
104104

105105
DECIMATE COLLAPSE triangle counts are not identical across Blender
106106
series, so the LOD gate is a ratio band, not an exact count. Bake pixels

‎showcase/river-delta-tile/river_delta_tile.py‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1342,8 +1342,13 @@ def at(u, vx, vz):
13421342
# the inside (between the gunwales' inner edges) dark and worn
13431343
tone = 0.12 if 3 <= j <= 8 else 0.36
13441344
B.face((r0[j], r0[q], r1[q], r1[j]), TIMBER_IDX, tone, P_FLOAT, 400)
1345-
B.face(tuple(reversed(secs[0])), TIMBER_IDX, 0.36, P_FLOAT, 400, cap=1)
1346-
B.face(tuple(secs[-1]), TIMBER_IDX, 0.36, P_FLOAT, 400, cap=2)
1345+
# each end closed by quads across the hull's wall, outer to inner: the
1346+
# bow's section is a few millimetres wide, and as one n-gon its
1347+
# triangulation differs by Blender version (4.5 cuts a zero-area sliver)
1348+
wall = ((0, 1, 4, 5), (1, 2, 3, 4), (13, 0, 5, 6), (12, 13, 6, 7), (11, 12, 7, 8), (10, 11, 8, 9))
1349+
for q in wall:
1350+
B.face(tuple(secs[0][i] for i in reversed(q)), TIMBER_IDX, 0.36, P_FLOAT, 400, cap=1)
1351+
B.face(tuple(secs[-1][i] for i in q), TIMBER_IDX, 0.36, P_FLOAT, 400, cap=2)
13471352
# a thwart across the middle, its ends let into the sides
13481353
th = 0.5 * beam * 0.98 - 0.0012
13491354
box(B, tuple(at(-0.02, 0.0, 0.70 * H)), (0.0045, th, 0.0009), bt["yaw"], TIMBER_IDX, 0.45, P_BUILT, 401)

0 commit comments

Comments
 (0)