From ab4578590b436976b3c631a91e098e2a0e20f6cb Mon Sep 17 00:00:00 2001 From: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Date: Sun, 13 Sep 2026 19:55:27 -0400 Subject: [PATCH] fix: rebuild watchtower as a timber lookout with a shake roof Replace the cone-in-a-railing-box with posts through a plank deck, lower-bay X-braces, a hatch ladder, and well-style coursed eaves. Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Co-authored-by: Cursor --- README.md | 4 +- ROADMAP.md | 2 +- docs/gallery/assets/watchtower-hero.webp | Bin 37470 -> 36494 bytes docs/gallery/index.html | 2 +- docs/gallery/watchtower/index.html | 344 ++++++++++++++++------- showcase/gallery.json | 2 +- showcase/watchtower/README.md | 25 +- showcase/watchtower/preview.webp | Bin 17846 -> 18508 bytes showcase/watchtower/watchtower.py | 336 +++++++++++++++------- 9 files changed, 497 insertions(+), 218 deletions(-) diff --git a/README.md b/README.md index 10fb0c6..2bb0a70 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show Treasure chest: a slatted wooden chest with iron bands, corner brackets, and an open lid on a dark studio floor Terrain scatter: a Geometry Nodes dirt hill tile with bevelled masonry rocks on a dark studio floor Fence kit: a timber post-and-rail section with pyramidal caps, iron shoes and straps on a dark studio floor -Watchtower: a timber lookout with X-braces, ladder, plank platform, and pyramidal roof on a dark studio floor +Watchtower: a timber lookout with X-braces, hatch ladder, plank platform, and a coursed shake roof on a dark studio floor Cart: a two-wheel wooden cart with spoked wheels, slatted bed, and shafts on a dark studio floor [`shipping-crate`](showcase/shipping-crate/) — procedural crate through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets. Falsifier `--skip-decimate` exits 9. @@ -105,7 +105,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show [`fence-kit`](showcase/fence-kit/) — procedural post-and-rail fence section through the same pipeline. Falsifier `--skip-decimate` exits 9. -[`watchtower`](showcase/watchtower/) — procedural timber lookout with X-braces, ladder, platform, and pyramidal roof through the same pipeline. Falsifier `--skip-decimate` exits 9. +[`watchtower`](showcase/watchtower/) — procedural timber lookout with X-braces, hatch ladder, platform, and coursed shake roof through the same pipeline. Falsifier `--skip-decimate` exits 9. [`cart`](showcase/cart/) — procedural two-wheel wooden cart with spoked wheels, slatted bed, and shafts through the same pipeline. Falsifier `--skip-decimate` exits 9. diff --git a/ROADMAP.md b/ROADMAP.md index e9c3bea..09c79af 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -113,7 +113,7 @@ Not committed; target list for the next content version. (v0.3.0 shipped the smo - ~~Market stall showcase~~ **SHIPPED** as `showcase/market-stall/` — timber frame, slatted counter, striped awning; `--skip-decimate` exits 9 on the LOD1 ratio band - ~~Procedural terrain or landscape showcase using Geometry Nodes scatter~~ **SHIPPED** as `showcase/terrain-scatter/` — GN sine-hill Mesh Grid, Index-jittered Instance-on-Points scatter replaced with bevelled masonry; `--skip-decimate` exits 9 on the LOD1 ratio band - ~~Hero prop with a more complex silhouette (lantern or treasure chest) as a second showcase piece~~ **SHIPPED** as `showcase/street-lantern/` and `showcase/treasure-chest/` — hanging iron lantern with muntined amber cage; slatted chest with iron bands and an open lid; `--skip-decimate` exits 9 on the LOD1 ratio band -- ~~Timber watchtower showcase~~ **SHIPPED** as `showcase/watchtower/` — corner posts, X-braces, plank platform, ladder, pyramidal roof; `--skip-decimate` exits 9 on the LOD1 ratio band +- ~~Timber watchtower showcase~~ **SHIPPED** as `showcase/watchtower/` — corner posts through a plank platform, lower-bay X-braces, hatch ladder, coursed shake roof; `--skip-decimate` exits 9 on the LOD1 ratio band - ~~Two-wheel wooden cart showcase~~ **SHIPPED** as `showcase/cart/` — slatted bed, shafts, spoked wheels, iron hubs and axle; `--skip-decimate` exits 9 on the LOD1 ratio band - Wrought-iron park bench (slatted seat, scrolled legs) as a game-prop showcase piece - Wooden wheelbarrow (staved tray, single wheel, handles) as a game-prop showcase piece diff --git a/docs/gallery/assets/watchtower-hero.webp b/docs/gallery/assets/watchtower-hero.webp index 236138954f9645cedc0006100c951539118f1999..326f4abd693d37df3925da0c14100726c77826b0 100644 GIT binary patch literal 36494 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
);v&w0d#{+$$QQGRc>$2)?SXpP2 z0qF8I;heC5T-9KQ$Da4c)e8(0gB0In)Jy+J9t!$x1vNr#44f6Mf;T{)@ zHX5zPVO_nrJ&@m0P$iwUk3cpIkpkEKx{4uPY+g+Z@#I*Ef%4T&P^@Ed0b!V7;Rnhf z8J{pSm@;%k7V*i}`G{3;t{#>FJ8S;Or_*ZwsOl|@4Qd2n{ZLbrIlIGzQby=%Jic8f zwHKxrEl$#Xdl^V~c7nE(kzVcItM^;qY-@hQ1!>c1bvZ8wxtqWtkqhpjQ9lgMAJQ81 zH^K#z-eH*mFfI#@+T9^CkG9uYkednF-Cy%kAv#ftbxPEuI-M8{$X)~c;t?$AI7FRQ z`4887i%m_BQu)4PtexleW|>v60pR@>9GS~uwcVIYRzO-)jB85vw|#b)@(6XSWDuQx zF;fA*j#S{2aiS@LCI)Ee0j0n4+xaH_y%e%))bvq_G9O?pLI2dsxj~hGVQpu2qWo^I z@U7xT#K=`EeBz0Vf>!6~oL5aPF4#dVJzHg|i57&SbMPMkn^C~d?d-(OkL@69;I}(m zw5~%Wngyo*mUQ!6H2A93GOxwcJdDblD$T zQ7x|qM&3RAFNlW|9^!x#q-M>aTG#OBmDBA^$?>9NTU8||L1b(~5JEdrn%F?Tg>IDN z>Q1}h{0V%Bga3X^+nn(Mr@PcSEG}5P+@6>GGR3}d9d6a*PqcG;02^;jnN^s4VDf0m zcw79Gw&0~L58|+N*mp_o&pxj|JZG?00{fS!Uk}QcR{|3P;Zd9>S2Imb#%9uG^|fq9 z#oA24iXqUOK@%*<$I;SxMFnZ`^PX7NRlJK>8jl`ZCY5|)XQ+@%;C1Nwjd*Y5e!Ycs zr4cHM;8*aSV7rTMW+mFdTgI4&99w=)Jz|U`fp?PPu~-c@tZ{0QU=5IrOS7<@MOQ5% z(cnfJFPPN2|t_aa;@us)U?-jqfDFbD!b)QRglv5VQ1p z4hQvcg^VffBrGxB>@P$!yp?b+VI`6BVQ+(~ED4B&Z1lrnxnZJsYRYpZFPggoy<)X- ze(~?@r#3BJJ0`23;n_l)FR$tn6vOiRcVjEyO2np>yTVq3dW>@*`y;4i(4JyMMiNQ$}~ zG3J=3X?)a|#c*IKT%O5#f3j19Z|Aokv4xeJ=C5@4sv&L?z}B_mBZeo-0)uUR#xl%$C*v(5 zc(HSe1IWK4e{xed%jyz(COL82nF)I&AZTE8UNr#u)1!|E+BE*v6dJ_~Vso7igt?X$ z4B9^=^4w5aI)f-hPfoKjY^m`5rfqv3*ekQS;hUmOI!qBKwOW*sC3spE%%S9#S|IM) z7Zjlu?v(BiSy2{{&2;aj&9)%+?@10^;}Fq z(J7T~@c)B>R2tmm+yNk7a`p|wj@Hm=@_+-R77C(f%8nXa6<=vNv|+4AOg0)ZOi?+n zHdQ1`PT%)*(X}PC$~Sv>WzSGL zoEnRug1p(W*`lLdbMaWLjBM#CGFvw6k64-yd%7TW1eD)HO{kCUzSC3({A#d`w;aVBAfclihW9Euzw>UZMAkX`elJC`MR%#HDUYEV_nO@l5FX75`xUD{t8lx z6pnSnjR!K0z90DW2+#6^ci|61r$MzXg&Qc}6Q^%)rcc7PD&13uIMM!zx-eCa??M|2i^!@MC?pwfz{sae%HSn8Kt0?0 z92??iBoZM2(iLA>dvS99uagQVu_fbP{Wajs&mzgjF%Ed|kMUyOSbG?%$ifN2;Ot?3 zkKHvb=q#H5E-|PGz+qoB!S+iS`<+~^K(nHa8&XE>ZGLWMcOKq1Dsx&jMEZOGpl1

msL0;e_gWz4vnzr<4YX$dq5t~B4J#yGzR z>CFktY~lfxeTW25Ihy_Q3+f%l;)VII@-!hBV)4*=W*vU)Wn26A7eOQ75r3&Gl)Wta zbj!;^Np-%%Bs4F!O@+Edp)ACEm}nna2s97U^PQXg!W?OxRyf;7AD$za?#vt(yLN$@ z1v@+8MT1fRf|io|3qTx}M>hlX0D_dbh2>Bjp`8}f6*RL<@7c-dBVWJ#qwLR=&f)`n z>+1!gv?;F>Kd5E-XE3g6FQUC@z{F@(U#z^a5Xhy{b0le&wo04m@gkz%_A~HQr~2Aa z1FvEf7Da<7J=DK)_EbZWZEi^1HIU%VvOYG?$clLitKNs~%W4RUXrW-_$=H^;mspSl zE&Gw~600SXZC8|B7H!|6IFBcy>SEHaL8HqY8lFNA2McbKqlmTN?R@fE4tk1 zAepzG-<~M2ErY&eFzq>j>+HjpX0IpoBY(4l?b)@ZjtSTPqo?kfij@T7JWgSF{=ASo zM$GBkQ;%DGYB#n*?*yDtXVN*Cx_F&NI+-&cl)B`5Vo||GdxUQDI#;(KzrxyqIq>;^ z1=C1U>-{?;^?j?N)Q2cN@0$4

5I)7@4%+Zd1bWJqilPxgF!ew^3E4w$3jDHJVW| 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 K0AK6iQ~&^LJBb|Nkmq*Z=>yT^VZxd;5Q= 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 diff --git a/docs/gallery/index.html b/docs/gallery/index.html index aec7c6a..ea429dd 100644 --- a/docs/gallery/index.html +++ b/docs/gallery/index.html @@ -991,7 +991,7 @@

fence-kit

watchtower

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

-

witnesses Recomputed: 4656 tris, two materials with 60 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.910×0.927×1.822 m, LOD ratios in band, convex collider 64 tris, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget.

+

witnesses Recomputed: 5220 tris, three materials with 84 metal and 126 roof faces, UVs in 0..1 with zero AABB overlap, outer AABB 1.434×1.434×1.982 m, LOD ratios in band, convex collider 56 tris, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget.

View example
diff --git a/docs/gallery/watchtower/index.html b/docs/gallery/watchtower/index.html index bc3611f..723449d 100644 --- a/docs/gallery/watchtower/index.html +++ b/docs/gallery/watchtower/index.html @@ -253,19 +253,19 @@

watchtower

watchtower render

Rendered headless by the example itself — click to zoom.

-
witnesses Recomputed: 4656 tris, two materials with 60 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.910×0.927×1.822 m, LOD ratios in band, convex collider 64 tris, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget.
+
witnesses Recomputed: 5220 tris, three materials with 84 metal and 126 roof faces, UVs in 0..1 with zero AABB overlap, outer AABB 1.434×1.434×1.982 m, LOD ratios in band, convex collider 56 tris, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget.
blender --background --python showcase/watchtower/watchtower.py --
-

A showcase piece, not an example. Procedural timber lookout (corner posts, X-braces, plank platform, three-sided rail, ladder, pyramidal roof, iron shoes) then the shipped pipeline: unique-cell UVs, Cycles high-to-low normal bake, LOD chain, convex collider, Unity glTF export.

+

A showcase piece, not an example. Procedural timber lookout (corner posts through a plank platform, lower-bay X-braces, hatch and ladder, coursed shake roof with eaves) then the shipped pipeline: unique-cell UVs, Cycles high-to-low normal bake, LOD chain, convex collider, Unity glTF export.

It asserts budget conformance of the generated result. It does not witness an API contract. "It rendered without error" is not a check.

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 | 4550–4760 | 4656 / 4656 / 4656 | | LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.5000 | | LOD2 ratio | 0.10–0.35 of base | 0.2199 / 0.2199 / 0.2199 | | Materials | exactly 2 distinct, ≥24 metal faces | 2 slots, 60 metal | | UVs | in 0..1, AABB overlap ≤ 1e-5 | in range, overlap 0 | | Outer AABB | (0.910, 0.927, 1.822) m ± 0.01 | (0.9104, 0.9267, 1.8220), zmin 0 | | Collider tris | ≤ 96 | 64 | | Export | written, size > 0 | 334288 / 334288 / 334272 bytes |

-

DECIMATE COLLAPSE triangle counts are not required to match across series — the gate is a ratio band, not an exact count. This mesh's LOD2 ratio happened to match on all three binaries. Bake pixels are stochastic; the gate is has_data plus operator FINISHED, not byte-identity. Construction uses no RNG. Export byte counts differ by 16 B on 5.2.1 (glTF serializer), not a gated axis.

+

| Axis | Declared | Measured (4.5.11 / 5.1.2 / 5.2.1) | | --- | --- | --- | | Base triangles | 5110–5330 | 5220 / 5220 / 5220 | | LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.5000 | | LOD2 ratio | 0.10–0.35 of base | 0.2199 / 0.2199 / 0.2199 | | Materials | exactly 3 distinct, ≥24 metal, ≥40 roof | 3 slots, 84 metal, 126 roof | | UVs | in 0..1, AABB overlap ≤ 1e-5 | in range, overlap 0 | | Outer AABB | (1.434, 1.434, 1.982) m ± 0.01 | (1.4340, 1.4340, 1.9818), zmin 0 | | Collider tris | ≤ 80 | 56 | | Export | written, size > 0 | 374376 / 374376 / 374360 bytes |

+

DECIMATE COLLAPSE triangle counts are not required to match across series — 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.

--skip-decimate skips the LOD DECIMATE stage so LOD1 ratio is 1.0 and exit 9 fires. That is the named budget the falsifier violates.

Run

blender --background --python watchtower.py --
@@ -274,7 +274,7 @@ 

Run

Smoke does not pass --output or --skip-decimate.

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 |

+

| 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 metal/roof 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 |

Source

@@ -286,7 +286,7 @@

Source

Asserts budget conformance of a procedural lookout (posts, braces, platform, ladder, pyramidal roof) after composing shipped pipeline -pieces: bmesh construction, UVs, two materials, high-to-low normal +pieces: bmesh construction, UVs, three materials, high-to-low normal bake, LOD chain, convex collider, Unity glTF export. Budgets are declared below and recomputed from the generated result. @@ -319,37 +319,46 @@

Source

sys.dont_write_bytecode = True import gallery_framing # noqa: E402 -HALF = 0.40 -POST = 0.080 -POST_H = 1.48 -PLAT_Z = 1.18 -RAIL_H = 0.36 -ROOF_H = 0.52 -BRACE_T = 0.038 -PLANK_T = 0.042 +HALF = 0.46 +POST = 0.090 +POST_H = 1.58 +PLAT_Z = 1.04 +RAIL_H = 0.40 +GIRT_Z = 0.52 +KICK_H = 0.18 +BRACE_T = 0.042 +PLANK_T = 0.038 IRON_T = 0.014 -SHOE_H = 0.032 +SHOE_H = 0.034 +EAVE_HALF = 0.70 +ROOF_RISE = 0.40 +SHINGLE_T = 0.016 +N_SHINGLE = 5 +N_PLANK = 6 +HATCH_PLANKS = 1 BBOX_TOL = 0.01 -OUTER_SIZE = (0.910, 0.927, 1.822) -BASE_TRIS_MIN = 4550 -BASE_TRIS_MAX = 4760 +OUTER_SIZE = (1.434, 1.434, 1.982) +BASE_TRIS_MIN = 5110 +BASE_TRIS_MAX = 5330 LOD1_RATIO_MIN = 0.32 LOD1_RATIO_MAX = 0.62 LOD2_RATIO_MIN = 0.10 LOD2_RATIO_MAX = 0.35 LOD1_TARGET = 0.50 LOD2_TARGET = 0.22 -MATERIAL_COUNT = 2 +MATERIAL_COUNT = 3 UV_EPS = 1e-4 UV_OVERLAP_MAX = 1e-5 -COLLIDER_TRIS_MAX = 96 +COLLIDER_TRIS_MAX = 80 BAKE_RES = 256 -CAGE_EXTRUSION = 0.08 +CAGE_EXTRUSION = 0.10 METAL_FACES_MIN = 24 +ROOF_FACES_MIN = 40 WOOD_IDX = 0 -METAL_IDX = 1 +ROOF_IDX = 1 +METAL_IDX = 2 def eevee_engine_id(): @@ -384,6 +393,24 @@

Source

ob.select_set(False) +def add_oriented_box(bm, a, b, scale_xy, mat_idx): + a = Vector(a) + b = Vector(b) + delta = b - a + length = delta.length + if length < 1e-8: + return [] + quat = Vector((0.0, 0.0, 1.0)).rotation_difference(delta.normalized()) + eul = quat.to_euler("XYZ") + return add_box( + bm, + ((a + b) * 0.5), + (scale_xy[0], scale_xy[1], length), + mat_idx, + euler=(eul.x, eul.y, eul.z), + ) + + def add_box(bm, loc, scale, mat_idx, euler=(0.0, 0.0, 0.0)): geo = bmesh.ops.create_cube(bm, size=1.0) verts = geo["verts"] @@ -462,6 +489,60 @@

Source

) +def add_shingle_roof(bm, eave_z, peak_z): + """Well-style coursed shakes on a square pyramid, plus a cone underside.""" + add_cone( + bm, + (0.0, 0.0, (eave_z + peak_z) / 2.0), + EAVE_HALF * math.sqrt(2.0), + 0.03, + ROOF_RISE, + 4, + ROOF_IDX, + euler=(0.0, 0.0, math.pi / 4.0), + ) + nrm_local = Vector((0.0, ROOF_RISE, EAVE_HALF)).normalized() + + def add_course(yaw, t0, t1): + rot = Euler((0.0, 0.0, yaw)).to_matrix() + nrm = rot @ nrm_local + + def pt(t, s): + w = EAVE_HALF * t + y = t * EAVE_HALF + z = peak_z - t * ROOF_RISE + return rot @ Vector((s * w, y, z)) + + inner = SHINGLE_T * 0.12 + outer = SHINGLE_T * 1.05 + corners = ( + pt(t0, -1.0), + pt(t0, 1.0), + pt(t1, 1.0), + pt(t1, -1.0), + ) + vs = [bm.verts.new(c + nrm * inner) for c in corners] + vs.extend(bm.verts.new(c + nrm * outer) for c in corners) + idx = ( + (0, 1, 2, 3), + (4, 7, 6, 5), + (0, 4, 5, 1), + (1, 5, 6, 2), + (2, 6, 7, 3), + (3, 7, 4, 0), + ) + for a, b, c, d in idx: + face = bm.faces.new((vs[a], vs[b], vs[c], vs[d])) + face.material_index = ROOF_IDX + + for side in range(4): + yaw = side * (math.pi / 2.0) + for row in range(N_SHINGLE): + t0 = (row + 0.16) / N_SHINGLE + t1 = min(1.0, (row + 1.08) / N_SHINGLE) + add_course(yaw, t0, t1) + + def build_tower_mesh(name, bevel_offset, bevel_segments): bm = bmesh.new() try: @@ -477,41 +558,77 @@

Source

add_box(bm, (px, py, POST_H / 2.0), (POST, POST, POST_H), WOOD_IDX) ) - span = 2.0 * HALF + POST * 0.15 + bay = 2.0 * HALF - POST + sill_h = 0.085 + girt_h = 0.075 for sign in (-1.0, 1.0): wood.extend( - add_box(bm, (0.0, sign * HALF, 0.04), (span, POST * 0.92, 0.08), WOOD_IDX) + add_box( + bm, + (0.0, sign * HALF, sill_h / 2.0), + (bay, POST * 0.82, sill_h), + WOOD_IDX, + ) + ) + wood.extend( + add_box( + bm, + (sign * HALF, 0.0, sill_h / 2.0), + (POST * 0.82, bay, sill_h), + WOOD_IDX, + ) + ) + wood.extend( + add_box( + bm, + (0.0, sign * HALF, GIRT_Z), + (bay, POST * 0.78, girt_h), + WOOD_IDX, + ) ) wood.extend( - add_box(bm, (sign * HALF, 0.0, 0.04), (POST * 0.92, span, 0.08), WOOD_IDX) + add_box( + bm, + (sign * HALF, 0.0, GIRT_Z), + (POST * 0.78, bay, girt_h), + WOOD_IDX, + ) ) + + for ysign in (-1.0, 1.0): + if ysign < 0.0: + continue wood.extend( add_box( bm, - (0.0, sign * HALF, POST_H - 0.04), - (span, POST * 0.85, 0.08), + (0.0, ysign * HALF, KICK_H / 2.0 + 0.01), + (bay * 0.92, POST * 0.55, KICK_H), WOOD_IDX, ) ) + for xsign in (-1.0, 1.0): wood.extend( add_box( bm, - (sign * HALF, 0.0, POST_H - 0.04), - (POST * 0.85, span, 0.08), + (xsign * HALF, 0.0, KICK_H / 2.0 + 0.01), + (POST * 0.55, bay * 0.92, KICK_H), WOOD_IDX, ) ) - rise = 0.72 - run = 2.0 * HALF - POST + rise = GIRT_Z - sill_h + run = bay blen = math.hypot(run, rise) bang = math.atan2(rise, run) + brace_z = (sill_h + GIRT_Z) / 2.0 for ysign in (-1.0, 1.0): + if ysign < 0.0: + continue for bang_sign in (-1.0, 1.0): wood.extend( add_box( bm, - (0.0, ysign * (HALF + POST * 0.15), 0.52), + (0.0, ysign * HALF, brace_z), (blen, BRACE_T, BRACE_T), WOOD_IDX, euler=(0.0, bang_sign * bang, 0.0), @@ -522,99 +639,86 @@

Source

wood.extend( add_box( bm, - (xsign * (HALF + POST * 0.15), 0.0, 0.52), + (xsign * HALF, 0.0, brace_z), (BRACE_T, blen, BRACE_T), WOOD_IDX, euler=(bang_sign * bang, 0.0, 0.0), ) ) - n_plank = 5 - plank_w = (2.0 * HALF - 0.04) / n_plank - y0 = -HALF + 0.02 + plank_w / 2.0 - for i in range(n_plank): + plank_span_x = 2.0 * HALF + POST * 0.15 + usable_y = 2.0 * HALF - 0.06 + plank_w = usable_y / N_PLANK + y0 = -HALF + 0.03 + plank_w / 2.0 + for i in range(HATCH_PLANKS, N_PLANK): y = y0 + i * plank_w wood.extend( add_box( bm, (0.0, y, PLAT_Z + PLANK_T / 2.0), - (2.0 * HALF + POST * 0.4, plank_w * 0.88, PLANK_T), + (plank_span_x, plank_w * 0.86, PLANK_T), WOOD_IDX, ) ) - - rail_z = PLAT_Z + PLANK_T + RAIL_H * 0.55 - for px, py in ((-HALF, HALF), (HALF, HALF), (HALF, -HALF), (-HALF, -HALF)): + for xj in (-HALF * 0.42, HALF * 0.42): wood.extend( add_box( bm, - (px, py, PLAT_Z + PLANK_T + RAIL_H / 2.0), - (POST * 0.62, POST * 0.62, RAIL_H), + (xj, 0.06, PLAT_Z - 0.022), + (POST * 0.62, 2.0 * HALF * 0.88, 0.044), WOOD_IDX, ) ) + + rail_z_lo = PLAT_Z + PLANK_T + 0.12 + rail_z_hi = PLAT_Z + PLANK_T + RAIL_H - 0.04 + rail_t = POST * 0.42 wood.extend( - add_box( - bm, - (0.0, HALF, rail_z), - (2.0 * HALF, POST * 0.42, 0.045), - WOOD_IDX, - ) - ) - wood.extend( - add_box( - bm, - (HALF, 0.12, rail_z), - (POST * 0.42, 2.0 * HALF * 0.72, 0.045), - WOOD_IDX, - ) + add_box(bm, (0.0, HALF, rail_z_lo), (bay, rail_t, 0.048), WOOD_IDX) ) wood.extend( - add_box( - bm, - (-HALF, 0.12, rail_z), - (POST * 0.42, 2.0 * HALF * 0.72, 0.045), - WOOD_IDX, - ) + add_box(bm, (0.0, HALF, rail_z_hi), (bay, rail_t, 0.048), WOOD_IDX) ) - - stile_y = -HALF - POST * 0.55 - for sx in (-0.13, 0.13): + for xsign in (-1.0, 1.0): wood.extend( add_box( bm, - (sx, stile_y, PLAT_Z / 2.0), - (0.038, 0.042, PLAT_Z + 0.06), + (xsign * HALF, 0.08, rail_z_lo), + (rail_t, bay * 0.78, 0.048), WOOD_IDX, ) ) - n_rung = 6 - for i in range(n_rung): - z = 0.16 + i * (PLAT_Z - 0.22) / (n_rung - 1) wood.extend( - add_box(bm, (0.0, stile_y, z), (0.28, 0.032, 0.032), WOOD_IDX) + add_box( + bm, + (xsign * HALF, 0.08, rail_z_hi), + (rail_t, bay * 0.78, 0.048), + WOOD_IDX, + ) ) - wood.extend( - add_box( - bm, - (0.0, 0.0, PLAT_Z + PLANK_T + 0.03), - (2.0 * HALF + POST * 1.15, 2.0 * HALF + POST * 1.15, 0.05), - WOOD_IDX, + lean = 0.20 + bot_y = -HALF - lean + top_y = -HALF + 0.02 + top_z = PLAT_Z + 0.18 + for sx in (-0.12, 0.12): + wood.extend( + add_oriented_box( + bm, + (sx, bot_y, 0.03), + (sx, top_y, top_z), + (0.040, 0.044), + WOOD_IDX, + ) ) - ) - wood.extend( - add_cone( - bm, - (0.0, 0.0, PLAT_Z + PLANK_T + 0.05 + ROOF_H / 2.0), - HALF + POST * 0.95, - 0.018, - ROOF_H, - 4, - WOOD_IDX, - euler=(0.0, 0.0, math.pi / 4.0), + n_rung = 8 + for i in range(n_rung): + t = (i + 1) / (n_rung + 1) + z = 0.08 + t * (PLAT_Z - 0.14) + y = bot_y + (top_y - bot_y) * ((z - 0.03) / (top_z - 0.03)) + wood.extend( + add_box(bm, (0.0, y, z), (0.26, 0.034, 0.032), WOOD_IDX) ) - ) if bevel_offset > 0.0: edges = list({e for v in wood for e in v.link_edges}) @@ -630,6 +734,30 @@

Source

for f in ret.get("faces") or []: f.material_index = WOOD_IDX + eave_z = POST_H + peak_z = POST_H + ROOF_RISE + add_shingle_roof(bm, eave_z, peak_z) + fascia_h = 0.048 + fascia_t = 0.034 + for side in range(4): + yaw = side * (math.pi / 2.0) + fx = EAVE_HALF * math.sin(yaw) + fy = EAVE_HALF * math.cos(yaw) + if side % 2 == 0: + add_box( + bm, + (0.0, fy, eave_z - fascia_h / 2.0), + (2.0 * EAVE_HALF + fascia_t, fascia_t, fascia_h), + WOOD_IDX, + ) + else: + add_box( + bm, + (fx, 0.0, eave_z - fascia_h / 2.0), + (fascia_t, 2.0 * EAVE_HALF + fascia_t, fascia_h), + WOOD_IDX, + ) + for px, py in posts: add_box( bm, @@ -637,17 +765,23 @@

Source

(POST * 1.38, POST * 1.38, SHOE_H), METAL_IDX, ) + add_box( + bm, + (px, py, GIRT_Z), + (POST * 1.12, POST * 1.12, IRON_T), + METAL_IDX, + ) add_box( bm, (px, py, PLAT_Z + PLANK_T + IRON_T / 2.0), - (POST * 1.15, POST * 1.15, IRON_T), + (POST * 1.18, POST * 1.18, IRON_T), METAL_IDX, ) - for sx in (-0.13, 0.13): + for sx in (-0.12, 0.12): add_box( bm, - (sx, stile_y, PLAT_Z + 0.02), - (0.05, 0.055, IRON_T), + (sx, -HALF - 0.02, PLAT_Z + 0.02), + (0.055, 0.06, IRON_T), METAL_IDX, ) @@ -690,9 +824,9 @@

Source

return mat -def assign_slots(obj, wood, metal): +def assign_slots(obj, wood, roof, metal): mats = obj.data.materials - wanted = (wood, metal) + wanted = (wood, roof, metal) for i, mat in enumerate(wanted): if i < len(mats): mats[i] = mat @@ -823,10 +957,11 @@

Source

bpy.ops.wm.read_factory_settings(use_empty=True) low = build_tower_mesh("TowerLow", bevel_offset=0.006, bevel_segments=2) high = build_tower_mesh("TowerHigh", bevel_offset=0.006, bevel_segments=4) - wood = principled("TowerWood", (0.44, 0.23, 0.08, 1.0), 0.0, 0.56) + wood = principled("TowerWood", (0.42, 0.22, 0.08, 1.0), 0.0, 0.56) + roof = principled("TowerShake", (0.30, 0.28, 0.26, 1.0), 0.0, 0.74) metal = principled("TowerIron", (0.12, 0.125, 0.14, 1.0), 1.0, 0.30) - assign_slots(low, wood, metal) - assign_slots(high, wood, metal) + assign_slots(low, wood, roof, metal) + assign_slots(high, wood, roof, metal) if low.data is None or len(low.data.polygons) < 6: return fail("tower mesh did not build", 3), None, None, None, None, None @@ -905,6 +1040,11 @@

Source

f"metal faces {idx_counts.get(METAL_IDX, 0)} < {METAL_FACES_MIN}", 5, ), None, None, None, None, None + if idx_counts.get(ROOF_IDX, 0) < ROOF_FACES_MIN: + return fail( + f"roof faces {idx_counts.get(ROOF_IDX, 0)} < {ROOF_FACES_MIN}", + 5, + ), None, None, None, None, None if u0 < -UV_EPS or v0 < -UV_EPS or u1 > 1.0 + UV_EPS or v1 > 1.0 + UV_EPS: return fail( f"UVs outside 0..1: ({u0:.4f},{v0:.4f})-({u1:.4f},{v1:.4f})", @@ -968,7 +1108,7 @@

Source

ob.hide_render = True ob.hide_viewport = True - low.rotation_euler.z = math.radians(-22.0) + low.rotation_euler.z = math.radians(-28.0) low.rotation_euler.x = math.radians(2.0) floor_me = bpy.data.meshes.new("Floor") @@ -1015,10 +1155,10 @@

Source

cam_data = bpy.data.cameras.new("Cam") cam_data.lens = 50.0 cam = bpy.data.objects.new("Cam", cam_data) - cam.location = (3.85, -5.15, 2.55) + cam.location = (4.25, -5.80, 2.55) scene.collection.objects.link(cam) aim = bpy.data.objects.new("Aim", None) - aim.location = (0.0, 0.0, 0.88) + aim.location = (0.0, 0.0, 0.98) scene.collection.objects.link(aim) con = cam.constraints.new("TRACK_TO") con.target = aim diff --git a/showcase/gallery.json b/showcase/gallery.json index 87b5241..89c2705 100644 --- a/showcase/gallery.json +++ b/showcase/gallery.json @@ -117,7 +117,7 @@ "name": "watchtower", "dir": "showcase/watchtower", "teaches": "A procedural timber watchtower through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.", - "witnessesFix": "Recomputed: 4656 tris, two materials with 60 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.910×0.927×1.822 m, LOD ratios in band, convex collider 64 tris, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget.", + "witnessesFix": "Recomputed: 5220 tris, three materials with 84 metal and 126 roof faces, UVs in 0..1 with zero AABB overlap, outer AABB 1.434×1.434×1.982 m, LOD ratios in band, convex collider 56 tris, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget.", "hero": "docs/gallery/assets/watchtower-hero.webp", "preview": "showcase/watchtower/preview.webp", "tags": [ diff --git a/showcase/watchtower/README.md b/showcase/watchtower/README.md index d11249a..1735941 100644 --- a/showcase/watchtower/README.md +++ b/showcase/watchtower/README.md @@ -1,9 +1,10 @@ # Watchtower A showcase piece, not an example. Procedural timber lookout (corner -posts, X-braces, plank platform, three-sided rail, ladder, pyramidal -roof, iron shoes) then the shipped pipeline: unique-cell UVs, Cycles -high-to-low normal bake, LOD chain, convex collider, Unity glTF export. +posts through a plank platform, lower-bay X-braces, hatch and ladder, +coursed shake roof with eaves) then the shipped pipeline: unique-cell +UVs, Cycles high-to-low normal bake, LOD chain, convex collider, Unity +glTF export. It asserts **budget conformance** of the generated result. It does not witness an API contract. "It rendered without error" is not a check. @@ -21,21 +22,19 @@ materials, UVs, evaluated LOD, collider, or export file. | Axis | Declared | Measured (4.5.11 / 5.1.2 / 5.2.1) | | --- | --- | --- | -| Base triangles | 4550–4760 | 4656 / 4656 / 4656 | +| Base triangles | 5110–5330 | 5220 / 5220 / 5220 | | LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.5000 | | LOD2 ratio | 0.10–0.35 of base | 0.2199 / 0.2199 / 0.2199 | -| Materials | exactly 2 distinct, ≥24 metal faces | 2 slots, 60 metal | +| Materials | exactly 3 distinct, ≥24 metal, ≥40 roof | 3 slots, 84 metal, 126 roof | | UVs | in `0..1`, AABB overlap ≤ 1e-5 | in range, overlap 0 | -| Outer AABB | (0.910, 0.927, 1.822) m ± 0.01 | (0.9104, 0.9267, 1.8220), zmin 0 | -| Collider tris | ≤ 96 | 64 | -| Export | written, size > 0 | 334288 / 334288 / 334272 bytes | +| Outer AABB | (1.434, 1.434, 1.982) m ± 0.01 | (1.4340, 1.4340, 1.9818), zmin 0 | +| Collider tris | ≤ 80 | 56 | +| Export | written, size > 0 | 374376 / 374376 / 374360 bytes | DECIMATE COLLAPSE triangle counts are **not** required to match across -series — the gate is a ratio band, not an exact count. This mesh's LOD2 -ratio happened to match on all three binaries. Bake pixels are +series — 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 -16 B on 5.2.1 (glTF serializer), not a gated axis. +byte-identity. Construction uses no RNG. `--skip-decimate` skips the LOD DECIMATE stage so LOD1 ratio is 1.0 and exit 9 fires. That is the named budget the falsifier violates. @@ -62,7 +61,7 @@ File-local. `9` is a valid check code. `10` is reserved for | 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 | +| 5 | Material count ≠ 3 distinct slots, or metal/roof faces missing | | 6 | UVs outside 0..1 | | 7 | UV AABB overlap above tolerance | | 8 | World AABB off declared outer size | diff --git a/showcase/watchtower/preview.webp b/showcase/watchtower/preview.webp index a268a34c79529fdfc00afc03bbe0a6a096e2acf7..7a8c86a6df893668fb761cd730d9f7867a0ff4a0 100644 GIT binary patch literal 18508 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 z∓OC?!(?17o0e;G~INVvl`LU4H5?(NA*oRJAAyrg7Hx1A+Av%1-hFXId&UzU0D` z>l)nu1Pdgsnt*)vd2GgN!I^X57elY0)+6Hyyf=r`0wFx84d=jH*YShm7G2_pNZ7irZNr;0h<}i ze23M(#)f#a23h2YzKb>6=Teiqegdcams~0hQ;kX-5=2}0`I1M@m%;U! zKI@i2)gAWLvFLR;<4r27mcj3dOxG+j zxK6Du^(QX^A;XfC=d!`r-RJ8u_eG_L6nyxnB(RQ z#0Z?)gFni;f|0liE$2xvC=2#^$-@R z_}$+=g7xWej)}%ldV(n~p_65K71{63rc;su4xx=_GM{`%``ML-aF9e=YdiTq5M;YeB>mRu2|;I9taz?AnsXL(D-8{up6kOFeMigC*jRpF7} z05^nO0EqwtcURSwDnhsTq`84^k`b(i8h{F|fPKIK000002>3Wv_8j>O*4 zKmY&{a=o83Q{V)O8TUvcL^t&QdtFxv=V(&J;6|V2%UuQK5&SM17AO~UzMowk7#$8` LHS@w;CGY?MaR9+D literal 17846 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 0.0: edges = list({e for v in wood for e in v.link_edges}) @@ -346,6 +450,30 @@ def build_tower_mesh(name, bevel_offset, bevel_segments): for f in ret.get("faces") or []: f.material_index = WOOD_IDX + eave_z = POST_H + peak_z = POST_H + ROOF_RISE + add_shingle_roof(bm, eave_z, peak_z) + fascia_h = 0.048 + fascia_t = 0.034 + for side in range(4): + yaw = side * (math.pi / 2.0) + fx = EAVE_HALF * math.sin(yaw) + fy = EAVE_HALF * math.cos(yaw) + if side % 2 == 0: + add_box( + bm, + (0.0, fy, eave_z - fascia_h / 2.0), + (2.0 * EAVE_HALF + fascia_t, fascia_t, fascia_h), + WOOD_IDX, + ) + else: + add_box( + bm, + (fx, 0.0, eave_z - fascia_h / 2.0), + (fascia_t, 2.0 * EAVE_HALF + fascia_t, fascia_h), + WOOD_IDX, + ) + for px, py in posts: add_box( bm, @@ -353,17 +481,23 @@ def build_tower_mesh(name, bevel_offset, bevel_segments): (POST * 1.38, POST * 1.38, SHOE_H), METAL_IDX, ) + add_box( + bm, + (px, py, GIRT_Z), + (POST * 1.12, POST * 1.12, IRON_T), + METAL_IDX, + ) add_box( bm, (px, py, PLAT_Z + PLANK_T + IRON_T / 2.0), - (POST * 1.15, POST * 1.15, IRON_T), + (POST * 1.18, POST * 1.18, IRON_T), METAL_IDX, ) - for sx in (-0.13, 0.13): + for sx in (-0.12, 0.12): add_box( bm, - (sx, stile_y, PLAT_Z + 0.02), - (0.05, 0.055, IRON_T), + (sx, -HALF - 0.02, PLAT_Z + 0.02), + (0.055, 0.06, IRON_T), METAL_IDX, ) @@ -406,9 +540,9 @@ def principled(name, color, metallic, roughness): return mat -def assign_slots(obj, wood, metal): +def assign_slots(obj, wood, roof, metal): mats = obj.data.materials - wanted = (wood, metal) + wanted = (wood, roof, metal) for i, mat in enumerate(wanted): if i < len(mats): mats[i] = mat @@ -539,10 +673,11 @@ def check(skip_decimate): bpy.ops.wm.read_factory_settings(use_empty=True) low = build_tower_mesh("TowerLow", bevel_offset=0.006, bevel_segments=2) high = build_tower_mesh("TowerHigh", bevel_offset=0.006, bevel_segments=4) - wood = principled("TowerWood", (0.44, 0.23, 0.08, 1.0), 0.0, 0.56) + wood = principled("TowerWood", (0.42, 0.22, 0.08, 1.0), 0.0, 0.56) + roof = principled("TowerShake", (0.30, 0.28, 0.26, 1.0), 0.0, 0.74) metal = principled("TowerIron", (0.12, 0.125, 0.14, 1.0), 1.0, 0.30) - assign_slots(low, wood, metal) - assign_slots(high, wood, metal) + assign_slots(low, wood, roof, metal) + assign_slots(high, wood, roof, metal) if low.data is None or len(low.data.polygons) < 6: return fail("tower mesh did not build", 3), None, None, None, None, None @@ -621,6 +756,11 @@ def check(skip_decimate): f"metal faces {idx_counts.get(METAL_IDX, 0)} < {METAL_FACES_MIN}", 5, ), None, None, None, None, None + if idx_counts.get(ROOF_IDX, 0) < ROOF_FACES_MIN: + return fail( + f"roof faces {idx_counts.get(ROOF_IDX, 0)} < {ROOF_FACES_MIN}", + 5, + ), None, None, None, None, None if u0 < -UV_EPS or v0 < -UV_EPS or u1 > 1.0 + UV_EPS or v1 > 1.0 + UV_EPS: return fail( f"UVs outside 0..1: ({u0:.4f},{v0:.4f})-({u1:.4f},{v1:.4f})", @@ -684,7 +824,7 @@ def render_still(low, wood, tex, path, engine): ob.hide_render = True ob.hide_viewport = True - low.rotation_euler.z = math.radians(-22.0) + low.rotation_euler.z = math.radians(-28.0) low.rotation_euler.x = math.radians(2.0) floor_me = bpy.data.meshes.new("Floor") @@ -731,10 +871,10 @@ def light(name, loc, energy, size, col, rot): cam_data = bpy.data.cameras.new("Cam") cam_data.lens = 50.0 cam = bpy.data.objects.new("Cam", cam_data) - cam.location = (3.85, -5.15, 2.55) + cam.location = (4.25, -5.80, 2.55) scene.collection.objects.link(cam) aim = bpy.data.objects.new("Aim", None) - aim.location = (0.0, 0.0, 0.88) + aim.location = (0.0, 0.0, 0.98) scene.collection.objects.link(aim) con = cam.constraints.new("TRACK_TO") con.target = aim