From 64489b2770bb611ce1bd4452a0af9cebb20a07ea Mon Sep 17 00:00:00 2001 From: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Date: Mon, 14 Sep 2026 19:19:57 -0400 Subject: [PATCH 1/4] fix: rebuild water-trough as a staved vessel with water Solid U end-caps, a water fill, and an into-the-hollow camera so the piece no longer reads as an underside bench of slats. Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Co-authored-by: Cursor --- docs/gallery/assets/water-trough-hero.webp | Bin 26592 -> 23520 bytes showcase/water-trough/README.md | 20 ++-- showcase/water-trough/preview.webp | Bin 22166 -> 19448 bytes showcase/water-trough/water_trough.py | 122 +++++++++++++++------ 4 files changed, 97 insertions(+), 45 deletions(-) diff --git a/docs/gallery/assets/water-trough-hero.webp b/docs/gallery/assets/water-trough-hero.webp index 58a2d57d1e0de31fcf842cca93211250ebd1e7f0..2395fd8287c6881604205665587c30df8b8296f6 100644 GIT binary patch literal 23520 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 literal 26592 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%0DI@C^ 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 diff --git a/showcase/water-trough/README.md b/showcase/water-trough/README.md index 9611149..a3d4109 100644 --- a/showcase/water-trough/README.md +++ b/showcase/water-trough/README.md @@ -1,9 +1,9 @@ # Water trough A showcase piece, not an example. Procedural staved water trough on a -timber stand (U-staves, end boards, iron straps, trestle legs) then the -shipped pipeline: unique-cell UVs, Cycles high-to-low normal bake, LOD -chain, convex collider, Unity glTF export. +timber stand (U-staves, solid end-caps, water, iron straps, trestle +legs) 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,14 +21,14 @@ materials, UVs, evaluated LOD, collider, or export file. | Axis | Declared | Measured (4.5.11 / 5.1.2 / 5.2.1) | | --- | --- | --- | -| Base triangles | 3880–4140 | 4008 / 4008 / 4008 | +| Base triangles | 4650–4900 | 4776 / 4776 / 4776 | | LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.5000 | -| LOD2 ratio | 0.10–0.35 of base | 0.2196 / 0.2196 / 0.2196 | -| Materials | exactly 2 distinct, ≥24 metal faces | 2 slots, 168 metal | +| LOD2 ratio | 0.10–0.35 of base | 0.2198 / 0.2198 / 0.2198 | +| Materials | exactly 3 distinct, ≥24 metal and ≥6 water faces | 3 slots, 168 metal, 60 water | | UVs | in `0..1`, AABB overlap ≤ 1e-5 | in range, overlap 0 | -| Outer AABB | (1.136, 0.482, 0.470) m ± 0.01 | (1.1360, 0.4820, 0.4701), zmin 0 | -| Collider tris | ≤ 150 | 108 | -| Export | written, size > 0 | 292484 / 292484 / 292468 bytes | +| Outer AABB | (1.162, 0.528, 0.488) m ± 0.01 | (1.1620, 0.5280, 0.4883), zmin 0 | +| Collider tris | ≤ 150 | 128 | +| Export | written, size > 0 | 348208 / 348208 / 348192 bytes | DECIMATE COLLAPSE triangle counts are **not** identical across series in general — the gate is a ratio band, not an exact count. On this @@ -62,7 +62,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 wood/metal faces missing | +| 5 | Material count ≠ 3 distinct slots, or wood/metal/water faces missing | | 6 | UVs outside 0..1 | | 7 | UV AABB overlap above tolerance | | 8 | World AABB off declared outer size | diff --git a/showcase/water-trough/preview.webp b/showcase/water-trough/preview.webp index 00ba9f164b26a200a05fa7be6f0d1a856670c2a3..bdf14921322a280eafaed6ddae0d095f3873a837 100644 GIT binary patch literal 19448 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 PIDtKTW3;JGzyJUMx)`$O literal 22166 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 diff --git a/showcase/water-trough/water_trough.py b/showcase/water-trough/water_trough.py index e1bdb8a..aea988b 100644 --- a/showcase/water-trough/water_trough.py +++ b/showcase/water-trough/water_trough.py @@ -1,8 +1,9 @@ """Game-ready wooden water trough — a showcase piece, not an example. Asserts budget conformance of a procedural staved trough on a timber -stand (U-staves, end boards, iron straps, trestle legs) after composing -shipped pipeline pieces: bmesh construction, UVs, two materials, +stand (U-staves, solid end-caps, water, iron straps, trestle legs) +after composing shipped pipeline 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. @@ -42,16 +43,16 @@ A_SPAN = 1.42 BBOX_TOL = 0.01 -OUTER_SIZE = (1.136, 0.482, 0.470) -BASE_TRIS_MIN = 3880 -BASE_TRIS_MAX = 4140 +OUTER_SIZE = (1.162, 0.528, 0.488) +BASE_TRIS_MIN = 4650 +BASE_TRIS_MAX = 4900 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 = 150 @@ -59,9 +60,11 @@ CAGE_EXTRUSION = 0.08 METAL_FACES_MIN = 24 WOOD_FACES_MIN = 24 +WATER_FACES_MIN = 6 WOOD_IDX = 0 METAL_IDX = 1 +WATER_IDX = 2 def eevee_engine_id(): @@ -221,14 +224,14 @@ def build_trough_mesh(name, bevel_offset, bevel_segments): zc = 0.30 + TRAY_R cx = 0.0 - def pt(a, x): + def pt(a, x, radius=TRAY_R): return ( x, - TRAY_R * math.sin(a), - zc - TRAY_R * math.cos(a), + radius * math.sin(a), + zc - radius * math.cos(a), ) - gap = 0.10 + gap = 0.16 for i in range(N_STAVES): t0 = i / N_STAVES t1 = (i + (1.0 - gap)) / N_STAVES @@ -245,39 +248,58 @@ def pt(a, x): euler=(mid, 0.0, 0.0), ) ) - for xend in (cx + TRAY_L / 2.0 + 0.014, cx - TRAY_L / 2.0 - 0.014): + + n_end = 11 + end_r = TRAY_R + STAVE_T * 0.15 + for xend in (cx + TRAY_L / 2.0 + 0.020, cx - TRAY_L / 2.0 - 0.020): + for i in range(n_end): + t0 = i / n_end + t1 = (i + 1.0) / n_end + a0 = -A_SPAN + 2.0 * A_SPAN * t0 + a1 = -A_SPAN + 2.0 * A_SPAN * t1 + mid = 0.5 * (a0 + a1) + chord = end_r * abs(a1 - a0) * 1.18 wood.extend( add_box( bm, - pt(mid, xend), - (0.028, chord * 1.02, STAVE_T * 1.05), + pt(mid, xend, end_r), + (0.042, chord, STAVE_T * 1.45), WOOD_IDX, euler=(mid, 0.0, 0.0), ) ) - for sx in (-TRAY_L * 0.32, TRAY_L * 0.32): + for a_lip in (-A_SPAN, A_SPAN): + wood.extend( + add_box( + bm, + pt(a_lip, cx), + (TRAY_L + 0.050, 0.034, 0.030), + WOOD_IDX, + euler=(a_lip, 0.0, 0.0), + ) + ) + + for sx in (-TRAY_L * 0.30, TRAY_L * 0.30): for ysign in (-1.0, 1.0): - top = (sx, ysign * 0.12, zc - TRAY_R - 0.02) - bot = (sx, ysign * 0.22, 0.02) + top = (sx, ysign * 0.10, zc - TRAY_R - 0.035) + bot = (sx, ysign * 0.24, 0.024) wood.extend( - add_oriented_box(bm, top, bot, (0.036, 0.036), WOOD_IDX) + add_oriented_box(bm, top, bot, (0.050, 0.036), WOOD_IDX) ) wood.extend( - add_oriented_box( + add_box( bm, - (sx, -0.16, 0.13), - (sx, 0.16, 0.13), - (0.028, 0.028), + (sx, 0.0, 0.115), + (0.044, 0.38, 0.030), WOOD_IDX, ) ) wood.extend( - add_oriented_box( + add_box( bm, - (-TRAY_L * 0.32, 0.0, 0.13), - (TRAY_L * 0.32, 0.0, 0.13), - (0.028, 0.028), + (0.0, 0.0, 0.115), + (TRAY_L * 0.62, 0.044, 0.030), WOOD_IDX, ) ) @@ -313,17 +335,41 @@ def pt(a, x): metal.extend( add_oriented_box(bm, p0, p1, (0.020, 0.010), METAL_IDX) ) - for sx in (-TRAY_L * 0.32, TRAY_L * 0.32): + for sx in (-TRAY_L * 0.30, TRAY_L * 0.30): for ysign in (-1.0, 1.0): metal.extend( add_box( bm, - (sx, ysign * 0.22, 0.012), - (0.050, 0.042, 0.022), + (sx, ysign * 0.24, 0.012), + (0.056, 0.048, 0.024), METAL_IDX, ) ) + n_w = 9 + wr = TRAY_R - STAVE_T * 0.60 + span = A_SPAN * 0.90 + for i in range(n_w): + t0 = i / n_w + t1 = (i + 1.0) / n_w + a0 = -span + 2.0 * span * t0 + a1 = -span + 2.0 * span * t1 + mid = 0.5 * (a0 + a1) + chord = wr * abs(a1 - a0) * 1.16 + add_box( + bm, + pt(mid, cx, wr), + (TRAY_L * 0.84, chord, 0.018), + WATER_IDX, + euler=(mid, 0.0, 0.0), + ) + add_box( + bm, + (cx, 0.0, zc - TRAY_R * 0.28), + (TRAY_L * 0.84, TRAY_R * 1.50, 0.010), + WATER_IDX, + ) + xs = [v.co.x for v in bm.verts] ys = [v.co.y for v in bm.verts] zs = [v.co.z for v in bm.verts] @@ -363,9 +409,9 @@ def principled(name, color, metallic, roughness): return mat -def assign_slots(obj, wood, metal): +def assign_slots(obj, wood, metal, water): mats = obj.data.materials - wanted = (wood, metal) + wanted = (wood, metal, water) for i, mat in enumerate(wanted): if i < len(mats): mats[i] = mat @@ -498,8 +544,9 @@ def check(skip_decimate): high = build_trough_mesh("TroughHigh", bevel_offset=0.005, bevel_segments=4) wood = principled("TroughWood", (0.40, 0.22, 0.08, 1.0), 0.0, 0.58) metal = principled("TroughIron", (0.10, 0.105, 0.12, 1.0), 1.0, 0.30) - assign_slots(low, wood, metal) - assign_slots(high, wood, metal) + water = principled("TroughWater", (0.05, 0.13, 0.14, 1.0), 0.0, 0.14) + assign_slots(low, wood, metal, water) + assign_slots(high, wood, metal, water) if low.data is None or len(low.data.polygons) < 6: return fail("trough mesh did not build", 3), None, None, None, None, None @@ -583,6 +630,11 @@ def check(skip_decimate): f"wood faces {idx_counts.get(WOOD_IDX, 0)} < {WOOD_FACES_MIN}", 5, ), None, None, None, None, None + if idx_counts.get(WATER_IDX, 0) < WATER_FACES_MIN: + return fail( + f"water faces {idx_counts.get(WATER_IDX, 0)} < {WATER_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})", @@ -646,7 +698,7 @@ def render_still(low, wood, tex, path, engine): ob.hide_render = True ob.hide_viewport = True - low.rotation_euler.z = math.radians(-16.0) + low.rotation_euler.z = math.radians(-90.0) low.rotation_euler.x = math.radians(0.0) floor_me = bpy.data.meshes.new("Floor") @@ -693,10 +745,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 = (1.43, -1.73, 0.88) + cam.location = (1.05, -2.00, 1.22) scene.collection.objects.link(cam) aim = bpy.data.objects.new("Aim", None) - aim.location = (0.0, 0.0, 0.26) + aim.location = (0.0, 0.0, 0.22) scene.collection.objects.link(aim) con = cam.constraints.new("TRACK_TO") con.target = aim From 25d4f444fb42d4bc2b992610f34b9025223268db Mon Sep 17 00:00:00 2001 From: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Date: Mon, 14 Sep 2026 19:20:13 -0400 Subject: [PATCH 2/4] fix: rebuild anvil as a London-pattern silhouette Stepped body, 16-seg horn, torus hoops, and a side-on camera so the piece reads as an anvil instead of a stack of dark boxes. Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Co-authored-by: Cursor --- docs/gallery/assets/anvil-hero.webp | Bin 9106 -> 17448 bytes showcase/anvil/README.md | 12 +-- showcase/anvil/anvil.py | 122 ++++++++++++++++++---------- showcase/anvil/preview.webp | Bin 8332 -> 14556 bytes 4 files changed, 86 insertions(+), 48 deletions(-) diff --git a/docs/gallery/assets/anvil-hero.webp b/docs/gallery/assets/anvil-hero.webp index 0a706f6494f8ba2a08690f378e88bc24a557ebe7..3caed7758cc75360d1863d6bfce8dad5c0c9862d 100644 GIT binary patch literal 17448 zcmV({K+?ZbNk&E>L;wI+MM6+kP&gnIL;wI#+yR{dDgXu00zOeFkVd1TA*P_yn0U|% z3295Nb!U{8)060_^oPmgR4)_tQQ+_CJP+)Z{vUup zG&KeGZ~Jde=#6sA^F0VX!uy||FX#E^;sxce{SOiEy#Lqs1^rR!1E80%J%RkS|Nr}M z{nY>e?+N>;5UA~h@6q0+gTZ)SgKIkOg{Q!y?z-7+dT3SW64lNcAd_TBqNQ^biODai zEuNU!@UA1_2&c2*568k0PiNp0NLO&Z2ATnKUKBI#(!P3&!O{Nq#jSNT03y3uo zY%CtgFcqlYEpqhJ1oi08A)ngf20$F1|(qWN^J_4a>k_z2~(C9k!n+DXt|F+fvl$5C+AK$Wm1wXDF;RI z((5WyX$7tvAR$sp0?<^hWsaA52<^V^NjhQb-Jh!6&g>Wb7oe2 z4LlT$p7t%sg+mI{I-plNQMHE!c>j_Rlan$5M$fmJ7zr z2*88)mI#$PBEUGNJL;%q5X-9wcwLKdDom^I=M^Ze6kG5@QN}iTt%8wC1F4)L<2B&f z#8W7oKs)=@z4TGhr6;U$_ODQnoZR@tG* z3j?Fs+IP6DD0oi?Nb;1^pf#+v*{S_16(&v^%bng+*=JycWjCf(5b=oonr#=kR-~rP z;)(fKQ_%CKCGG{nzv6AO2IUC=Vgi*kF0aghCdVb@OMcIy{`(gT##1zu;m|3Q5L2}D z@Hn!-jOj$qQAI`H#3`KMK{Dz87aedRG*2f1fPIH2RKIYF-> zF_Xow*w^Jm;6>1PazwjlSh+iF!cV#5*edJnNkaANAIeM;0l-?4Wq64y`;^?XF3(x9 z9V8>Dq#qa6%9PG%o<2_5Ec2&WSli~chXPg-)8i$i$ZN;465%i^^?hzdCR=EQxTP-b zXsSkkrogcl$hhGy*^J>Hf0Xo{AUUKeq^EH&KcN-Ifx8sWc~jzJodLj8WnlmA<_^hW^JA|n1>2aSdWDPz2VX&Fue)~{pQQJ6;Zmz*=_)W(bKT?d*#=;1ro zG^Yk~=S9D8@GY`!8`S;0GW$`Rd%rZk&QDK+q7q|;7GRC(XsYHqPK$SM@8}^MWB>J8 z5<8#0tJ?H}u@n;2-iTS=VId6(CB-%Kn>HPxqUJrNf&=1(?O>Qnk4l(xpV(p=n8OA7 z)m0Uspy**az0We#;hn<+<-S=`Dy|)sR_?_$B?l^V-naSNLAE0b)85WakElJhNoi

TrJZn3ReYO9k!gDr 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 literal 9106 zcmV;DBW>JLNk&GBBLDzbMM6+kP&godBLDyppaGo$DgXu00zOeFkw&AUrY4~^$bira z32AQs+q&=aV}4L0z1Dk}dXN2m0tKd`q05_&{H2fRSYuoD>W1EG{>PSI$8qKT3)9oq z2lZZvJv(}SdF6H1*Xqpgf%zF*N_&j*df@p~(Y$-kj)G>16w$Efl`cE;VD7BLaVYn7 zde}eb$p`b~B}vneLh-qS*gxmV7Vfj%Agz^nv75aF&5RV$Z5KVZFXU<)&UW)@%Ru+r zQTvzMh6p72$%%(I)&70lLA@y#w_}BPnDJgJRVIz&-gGz>{H!W||UF+|dFf`vDaN>R{vj*96YVDD29ae{?6BN@8Yt{~hO zmMIGf*cId6Zt~w}Z3EJv*^87?{;TsmcQT6dPlwL-W$~Me_=6AO02SDIM7)ev$~{dP9brZ*Xjsq!E*c@O$d*HVSCAj9(nfHM^i_ zu=xll6(LQEq||euW1)uBPS1qT&Lm3Xn3E{(Vt%u|HTilhn7-X=BRa`{h> ziHa{yNJzkY>qg6QWg!LFauWLgPV{7m+8tix-R30=R?ExnxsqmKD94=9D_J30Sim!a zgNc88aBd{%wI*My$w2Jh%i-`bf7H5_&tB;`ACSN5`bpin6cq8up4#UG)d&qT0!51N z64n3vG>TW)UZ>rIvMP0yQDLb2FEFP=!QivKpvUq`wZ4t?MA5~)^N8W);)Gl6!HsW^bJ z)HBVl$&a#okgaZwo~LwGr$ZmVA_Pt)ke5L{%-ujs^u_sM?Be$GoF2@=#`+Y|HXvJ|51SDW4~`lozc= zs2P+C;Eu@ud^X8*JYplS$9G2xtKnaOa}a#og&JsBu;5i1Q5=Gf;>c0hK=Axtd}B7+ zikK^J{nuo4F=q*!#uCk|?bD6Vcs>6gqq>+I)+dexCCkRjv*S))3_>1s)_85DurDP8 zvccLr9wg(HIuA(O;POZ~O+$JoNomDWX1??E%tokT><>CR37Z!PntUxa{a4mEz$ulo zEScE)Xkg>J{U}`-l7tuMy+#jK>46-&N*624k6=9M7O)VlqnT4+RnAnPZI~ zS3fV?yxvi+Sr|lUa?e0lx$I?%2X4uH)kwt0w66IV=i&DNRd2OB|4JRIFs9ZlW(o>H zmHMswAL_%;S$fr?qVU$BZL9uZr7n&oh?uKsA3=bY9O4Gk;%x*=bD>ma60u*w83?TQ zj!C1QFUryB!F1JvL*%GVJ{#S& z+=OUo3h{5MV>A-zUns$;mF0s9?RB~K1L%FKChTU*DU30whvmh*9kaM7SZ@pz?kk|1;TmaBX)}fKZng3c&@)WznJtK`{8&1 zv`mXim`SmztR1zaJ8`Ge>gmu5+6O{Q8{ibI=o|BSjJ*2Jf70|XfTQ*6MIqO4wgGi{ z?W-$aph0qo@mvoQoTXWHLQz|eT1phh>nW!)-JtJl+VkJDEOqHCjfKIZvmGm|RYM%f z*rxLIiD&UKMrW-RBYUVttpuazO-sQ3bQ6 zwF4PX3?I#|@|$6u++GI#JL>e7U*vu`5B>k2lFMgjdkg*Cfxt8{uA%1=YPERUMfv;w z_F4Y|v$$PcO~u>qIV&R2yY>Ph&^O0n1Hi}9oU^M#{OPHB7#Egl!a$b8Qi(!0$&L9j z!ssc#Xv4^^;BVC#wF{f5r~aqu^l*jP&2>qy*I@GL%Zd&#P@XtZcpg7_(a=oLyBv6a z83bC9b)o)tlhRoEJ)+%SfAVID{f8=YAI@L=_5tXRvTqv!ynD`$f@Z^X(Y$-kaR>A2 z&EP2b@c)ksx@u``1|vdUbZmJikx&IVANKn$!ziAsvqatkU92Fjm3a4^4PtEb_JBE0 z^66gB04VtE=Fp0TA08j_Va%{3=Kb4qmbu0Xr}9nT+GTqgM7}NJC8?M^2zUKOxY_BlV(iUhviUQK@otjCJu6&;LSmC_y$hs72 zAM89kn$U8l2m5GnZM4U+W|SgCxiq#o@IuDTnv_=1ihR+hNcJXSvNpE86irV3b#*hI zj=t0(gn+GOnI8aF=30kh#v%v^Z$E|51-_J*KxC!-`?!8gY0(lW)b~r!n_jZ@q%_$@ zB@NRWUacHD6YU5ndK++_1x`7_c&(<VeKJGD|% zVU%%DA@K8L?xZh*@BaIv1X}}Q9@r_lw6!-ysAN5v>vM|*K*eLd#N~MqwUKZ%Sxfu6 z)Bovn-*+>kOb@207nUFzm*s&hAu)pnY_F6+kga{**uq?XtCDK%f*Mmr3_r(pf?9SH z;5t4coDKt14u9k(BGdn6%6ahR$LYPMjuQE+mD=`XG-rH&XZ?Q^n z_@_4QleKPvsMNe8E61fHnn7!9CN?raAnKm+Pn|AlP^9eIn9);e20>vqsDly`W0-2# zab9J)PS>eW;S4luEo0Lmoz!uB(B)~yu46XRIGfC%!H$vBO1Xi&ZI_|@IkkX0fJi@9 z0QOmL=)JZM1RKy5Esi`t_focj&~@uWUTq}D|1d!+7O~8)E`jD=ewku@WzPph^`D2YwHSz}IWmijlo}r_wl=mE;cHIR|v*`nr^SKlRW` zQK^gc&uS*Dg)G0&llB;Tpk7!`nJPZI2;gJgQ2qNlVd5$P0RH+>R+RT{2MxCd`%~7; zl*!cagK>~SWHg@-`w%Gd(pelK9kP-NaQ0w+5j}uxo`U8}a4`H02Az&;eI%H-CKyIvEo}Wqvm4A)}4?dyPLQTl$ zOyf97yFWGz6PCVobpSUL*eYb>bfZfq!vE7rOjB8JZnWNOH8b1?l)zGF25mRpG-Z?h zekWgK6}{Yy;u)@}z}D-omB*<9sGTknT#BVZNF93gmYHC&3~1dFI?D(^k;9_kn4^g_ zuZA*RLCOYch30UXkWJ4bHIp12FbO6X5rvhBthMs_xJ_wxcxvI~skJCgGnNG+pR%Rt zK3Wvr+F3;1HDJgCLg?E$OLe<6$|W&$h6=1aHwjw!Mk1;Q#FuVvUx6l>0dmpCamY4j zOf(?%1=7pl?E>^OD`yQv)0VE(eP9XK`+3yW?}Rwbsc&*D>A|oi(1A_AiclI1=JlWlH!~d-9#=8a|O=>^TQT*np2|gfPb}?qB#Wsj_ zek+zuPN!v7r`z6?jDWW_`Z!z*(NEBVQu{KN#zMA|O@HyJfTdPAJN$%pn^P?xxO zBBwldT{~L(3)Q}D>IvJ!a;t~e&=?^hdvpz)8blijn>4dxROj)y&{vTw;6l(Kq1U($ z1%AS?TyQJ<2b5kaJ6j^GinQ5gI5Ht{?Oz#mFdopY-g@;Ejl@Par^=R)R5TB-=##qo zP(uK|y~#@J`e=&yg~&BcF&*`LPG{R8x``+a z2HbrWA@T{RgMAY613_?~Y1q$1%QjezE;v0ye8&?P<+e2xHojUR3O4Gx+j}pJ9 z&@Py%V=0`tAXb9Z`*rcOQkW?xkqLY9y#kxw(=eLf47qI zx$n8y##s&j^bLG1JPc;@CBInRkro^z*Qu5fPw~etQw~cH9TXWW|C|hT#G2)7I)wIb zcaXYSEEvd^27w{Eih8hG%U25ey|qHd59J!IGzrZOxLFH1dZ8-e*CYU)Xr+^Q>910p zc+g~zod`OlFF=jYst8@QOF_J)vFfm@G*_%n^hur5kCXro0&9|qb89w#X)NW%eK%VO zmdD?0+#lnoVfHmK_@VqFZ&Vo|$#)SL`%(_F8gZObZJ97j6r=BSJ~?4>p0*f|oQA!G zHSxCWGWCrS8JeaUn+i^j1>tC{^pGKF){w9&>N$l16SC}>%>f{H@2nbx7veDW$K|f6 zjuvy>$iWr%%APmT`_?Z>u7uM=V&k+3AHV__Znuw;2}T49pwU+mm!JZ(Q22=w?c3f} zF!4+PUZ+cByL!cHQxa>n4;Bt^t^fcMhnAHSgj-tQEFegh(+Gm9s4rtvL&Gyb+cibf zH>3#2^IeLl4cf!%q~~1Z4$#yQ2%u@DO(1PR=nwz^A!^B9l7qqq_1Mp=#e-l&B1_N5 z_KApBUk1{1qve#Q%mm6J^(rmR0w2>Qzr5;dm#-6Z#K$|&Sdd@<1c^WPt*1?X?d#dO z+iTd*g6c8iBT(f^I@V&PENob&-{hrK$5F!*_y?Hy;%;&HLMT&%YN(rkk36V+?plP!5EhtEcb+@!UYHcb1f55t-d^L#H z;oK+~#Uv|r?HoPW#YVk+>MG|E-Y4J!lmHV=Owoc-jL@Pn6~28T``^13ii;HO{B&~T z-Ko5w@xG`yz4@tpWUZZ%)Kqb{SbZ?{Mpoa=!q zCRYnK!v~CgKUd#>qjMY_X^hgA$rDbI>Yl^MWnuvovkkw(WZe_>A<6Q-(E7-yKP%C! zVs-CtE}kkV$XC%PLIRH{nIKmP6N|>?v)QO&+V6TC(XG_E(H!I=Pq1j!`BH(^s5&9+ zzN}*VnG=Nfq8$x!FsJ)M3Xx6@O*C5MkUc8F%}{qJ%(?6=n1^F0#)+ZA zfx3a9D-34xeQ@;pG#<&DIp7BdgQ+x;#JbR#LauE8JN8lavOQ+n7jdN#AgzAON*y;A zo^Fm(D9=h|zB!=Sy6HmI$OS!mW^=C@| z05&_vtR*-t1M(jgW$)1Nt_yscCv+a%sVv489GGXw&Q(fZvyJ~{!8vpB#my+nH-?sXoTv zcUmW;s2Dg|=v4t)#u4845xR3=y6-vfu(HzvmYh7X>St!BiLxBAN)r7zSw7NjdbCf})nYt2fCvRJ_+eT^vVoZ!1E&nLnLF>EN z<#fp{-*%dq0SpW%kb{;}7;jwKgyaphGF01mZ%maRgGON`dbG5ekn3t}4apwCIOuKq zjDp((sa#^h<+E6SA{wGzsjiaBr%L39!0lSOr;N&Ot>2EBqvkoGa6`D?CA&e|u=B#3 z1a|yqi0e?V(dL15_r4jjD8c8XzBjNA>N#XwIrGZ+@<}p^LW7sHltpkLU)+BMYFr~Q z!b*%{BEE2!Yg^2htCjw~xU*X8cK`VwXZn1^ZJ_dFeaHEqR=hPoIKeE*-bhDKYf03-1R^KGhagE%G=rfRXGpjE5ed%tDZl2XQ|Zw=i14@P zQ1kAy7e2<@I+BJA2WU|i+6IXPJW&`$QgV&J zngD)>ADuvlcb>GpO-xh;&_ccDJBHrDm2t{R4BPA6kxs4S^xRl z9!}pxlEN;~q~L0JH|x&rYIY%PD+pOBmNoceHcI4~kT5i)qKkZ_*v`Kh0g*xQ=AOM0SV-TQ#PXwE-LNpsAj;^=ci?b))x%~7bCtx(-uzP00fWLmT{gdA`?nV z5Kbm};rghr(l~#CRq1|eQM8o2hHuAS4mec9gyh1nvJMS|(*M&VD)8Y z8BiDBC)(V#XQhKxag8bOhZ7_mN_>LUjIRj-I>?Iv+IG=!YMLpD2Z_w*gbFI~N*@OR zF9M-reC%agRW_BC&-Sz;Vt?n(#y=+y+8K@^HddoQqb=Y$6B@)bBGJ$n>!VpLKWz`N z1W9xRhJL!g8Dwmz0D?df6OeAyWMEY*z@!|gIVeODD-cuUA`;2k^SnFjXu_Z4Df$;a zS`oR4Hz1`K4f4y4i^ki~jC-+$K)a7Kb9QGuyGg{^mk@__Rr)DX@@3z) zk71;T=VTq#W$iFwKw==iNZZ4a6wtuBKntyV#XFc_(9r|lQ6T;Ves&`>q;W8F8!g$$ zgU3;kc%*LU-k`FStPB3LTYGs$&nT7v2^|cpMiSgvYfN`G-~qgy!(94HS~Yx3F>dq zm_b&c-6NG{qV+#l*R)weQhtJv{7+!09p|fWybQZ$>n;d6ozA9U$^ZjNL<~IZuTPJe zCv{ac9;xGOnG?8;k0rfPM$Xg? z3c-qf8$OyTo4kA4GxWTbDLe=u_!Bpq{w_%(NhYmFyTAYdN6zW?Yt%S% z)yKVN5E^e>_2dw}@(Wf$@ELb%;o&8gXY(B0ULO9Grt$LV4j}zE`|TYW?wTM@|HAs| zIw@eBG3)kQ=J(Gb&=(FZ{n)cbV1^1Tn!KiClbLM#Ryq+SZ5> zpmB+B?ldG_rO{uC6bUD%>9&He551k*@jXAMj%<#@y zKT?u77DbN1F#eay7SasRXsg*`gGNCZ9?iT0bds{I+F8vCs}&Jba0aDL{v$P(BKyKI zm8h=p_esE+9b<7#HKAQzqM2Wt<(8zb>X}k`#0Dt9;7ERY3Q0Atcm_F#bQI#>yc zgzxR*|J;0!q0^F~rC;hU#WD0=r2x)x&ljc(c0w%6x6vQlwe(~kX-t(x8;3|t16UMM zp6z)*#;(*MhMYUp4voGmOb%1*8= zm#;A%5nF<#&EMP{;;GnexpMXT-a*iqX%E1bTVTda(9Z46PTM+fX9L-?--4sioqL6E zI?LX7u|m2I-_M68CX3{YL;j7meC%LF>gBa0^#)NNGUc!!N^BMUC+<6`YQpihE1y9P z4Rh1(RVYu{C1wujx?yVImX#mVK&hMta_b=t)SeEB1iRO)DDT_v)DtkVw~ZEh+FuQx z4c;eCj@I1*%$Hd%&&XQRdxRj|;BdnH3zTYY)1f7)II3e2tsA?@POac6EZZOe0$3IH zC`;@7Aj)>^LH)IZDsY>+s@Cjyf5W`ou5Fu!*!1IbeW-m^Cap?;xk82#o)^RDnSChG zw=>>MK(3+CDqX$d$^_3$1uByknZc6TmcY$Lq#BUZTAa6Pwlj|0m`-jsw5gy;FCZj3 zn`1^`sTA&}KtL!CCdjWi>CD-QLxkSkqU3m_{qTz>h)01|?D*x)gtN5k@|-4IaNImT zkq}W3K~$19H(ql&6S%(;jIXj3?=lo-^xb$#26nfC>y6Jx!XYc!hUM1^zfS3{h z0HtV>Be_^UI!)t>`#Um_zsPZ&*sI>%MM?`svfVqyGoONF3E5MXzWnUn@&RvZ{!_TT z!2_@dk2anQ5wBA{hnZ3=s@TVFW{|0#hnpPW2yw~o@oMWpDJUL+gFQ$b@%<)Cu{{{C z?0zGYOP|i`kFg?%7DY&^rykC&2`PxD00v9oDPhkM>U)=wwiW;Y6BL5|_4!N3jw))z zW4q)!3p~JzL@of+fdQOu&EhpPXIJ!KS;rJa>^!d3mVgNjRyb0D*Z=@6+c=XiWt1OQ QThRajY-LzP=s*Af0E#ZP;{X5v diff --git a/showcase/anvil/README.md b/showcase/anvil/README.md index 2672e89..7ff1616 100644 --- a/showcase/anvil/README.md +++ b/showcase/anvil/README.md @@ -21,14 +21,14 @@ materials, UVs, evaluated LOD, collider, or export file. | Axis | Declared | Measured (4.5.11 / 5.1.2 / 5.2.1) | | --- | --- | --- | -| Base triangles | 980–1140 | 1052 / 1052 / 1052 | +| Base triangles | 1620–1780 | 1696 / 1696 / 1696 | | LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.5000 | -| LOD2 ratio | 0.10–0.35 of base | 0.2186 / 0.2186 / 0.2110 | -| Materials | exactly 2 distinct, ≥24 metal faces | 2 slots, 102 metal | +| LOD2 ratio | 0.10–0.35 of base | 0.2193 / 0.2193 / 0.2182 | +| Materials | exactly 2 distinct, ≥24 metal faces | 2 slots, 274 metal | | UVs | in `0..1`, AABB overlap ≤ 1e-5 | in range, overlap 0 | -| Outer AABB | (0.750, 0.406, 0.690) m ± 0.01 | (0.7500, 0.4060, 0.6900), zmin 0 | -| Collider tris | ≤ 180 | 134 | -| Export | written, size > 0 | 84092 / 84092 / 84088 bytes | +| Outer AABB | (0.746, 0.410, 0.682) m ± 0.01 | (0.7460, 0.4095, 0.6820), zmin 0 | +| Collider tris | ≤ 180 | 162 | +| Export | written, size > 0 | 130852 / 130852 / 130840 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 diff --git a/showcase/anvil/anvil.py b/showcase/anvil/anvil.py index f7a3deb..09d01c1 100644 --- a/showcase/anvil/anvil.py +++ b/showcase/anvil/anvil.py @@ -49,9 +49,9 @@ HEEL_L = 0.11 BBOX_TOL = 0.01 -OUTER_SIZE = (0.750, 0.406, 0.690) -BASE_TRIS_MIN = 980 -BASE_TRIS_MAX = 1140 +OUTER_SIZE = (0.746, 0.410, 0.682) +BASE_TRIS_MIN = 1620 +BASE_TRIS_MAX = 1780 LOD1_RATIO_MIN = 0.32 LOD1_RATIO_MAX = 0.62 LOD2_RATIO_MIN = 0.10 @@ -177,6 +177,37 @@ def add_cone(bm, loc, radius1, radius2, depth, segments, mat_idx, euler=(0.0, 0. return verts +def add_rim(bm, loc, major, minor, mat_idx, euler=(0.0, 0.0, 0.0)): + n_major = 14 + n_minor = 7 + rings = [] + for i in range(n_major): + u = i * (2.0 * math.pi / n_major) + ring = [] + for j in range(n_minor): + v = j * (2.0 * math.pi / n_minor) + x = (major + minor * math.cos(v)) * math.cos(u) + y = (major + minor * math.cos(v)) * math.sin(u) + z = minor * math.sin(v) + ring.append(bm.verts.new((x, y, z))) + rings.append(ring) + bm.verts.ensure_lookup_table() + for i in range(n_major): + i2 = (i + 1) % n_major + for j in range(n_minor): + j2 = (j + 1) % n_minor + face = bm.faces.new( + (rings[i][j], rings[i2][j], rings[i2][j2], rings[i][j2]) + ) + face.material_index = mat_idx + verts = [v for ring in rings for v in ring] + rot = Euler(euler).to_matrix() + origin = Vector(loc) + for v in verts: + v.co = rot @ v.co + origin + return verts + + def pack_uvs(bm, margin=0.08): uv = bm.loops.layers.uv.new("UVMap") faces = list(bm.faces) @@ -227,17 +258,23 @@ def build_anvil_mesh(name, bevel_offset, bevel_segments): metal = [] wood.extend( - add_cyl( - bm, (0.0, 0.0, STUMP_H / 2.0), STUMP_R, STUMP_H, 14, WOOD_IDX, + add_cone( + bm, + (0.0, 0.0, STUMP_H / 2.0), + STUMP_R + 0.010, + STUMP_R - 0.018, + STUMP_H, + 20, + WOOD_IDX, ) ) wood.extend( add_cyl( bm, - (0.0, 0.0, STUMP_H + 0.012), - STUMP_R - 0.012, - 0.024, - 14, + (0.0, 0.0, STUMP_H + 0.010), + STUMP_R - 0.022, + 0.020, + 20, WOOD_IDX, ) ) @@ -256,44 +293,45 @@ def build_anvil_mesh(name, bevel_offset, bevel_segments): for f in ret.get("faces") or []: f.material_index = WOOD_IDX - for z in (0.055, STUMP_H - 0.055): + for z in (0.048, STUMP_H - 0.042): metal.extend( - add_cyl( - bm, - (0.0, 0.0, z), - STUMP_R + 0.008, - 0.028, - 16, - METAL_IDX, - ) + add_rim(bm, (0.0, 0.0, z), STUMP_R + 0.004, 0.011, METAL_IDX) ) z0 = STUMP_H metal.extend( add_box( bm, - (0.0, 0.0, z0 + 0.028), - (FOOT_L, FOOT_W, 0.056), + (0.0, 0.0, z0 + 0.024), + (0.38, 0.168, 0.048), + METAL_IDX, + ) + ) + metal.extend( + add_box( + bm, + (0.0, 0.0, z0 + 0.066), + (0.30, 0.132, 0.038), METAL_IDX, ) ) metal.extend( add_box( bm, - (0.0, 0.0, z0 + 0.056 + BODY_H / 2.0), - (WAIST_L, WAIST_W, BODY_H), + (0.0, 0.0, z0 + 0.148), + (0.176, 0.070, 0.130), METAL_IDX, ) ) metal.extend( add_box( bm, - (0.0, 0.0, z0 + 0.056 + BODY_H + 0.028), - (FACE_L * 0.90, FACE_W * 0.88, 0.056), + (0.0, 0.0, z0 + 0.248), + (0.34, 0.112, 0.052), METAL_IDX, ) ) - face_z = z0 + 0.056 + BODY_H + 0.056 + FACE_T / 2.0 + face_z = z0 + 0.248 + 0.026 + FACE_T / 2.0 metal.extend( add_box( bm, @@ -303,15 +341,15 @@ def build_anvil_mesh(name, bevel_offset, bevel_segments): ) ) - horn_z = face_z - 0.018 + horn_z = face_z - 0.012 metal.extend( add_cone( bm, - (FACE_L / 2.0 + HORN_L / 2.0 - 0.02, 0.0, horn_z), - 0.052, - 0.016, + (FACE_L / 2.0 + HORN_L / 2.0 - 0.028, 0.0, horn_z), + 0.056, + 0.014, HORN_L, - 12, + 16, METAL_IDX, euler=(0.0, math.pi / 2.0, 0.0), ) @@ -319,34 +357,34 @@ def build_anvil_mesh(name, bevel_offset, bevel_segments): metal.extend( add_box( bm, - (FACE_L / 2.0 - 0.01, 0.0, horn_z - 0.028), - (0.09, FACE_W * 0.92, 0.040), + (FACE_L / 2.0 - 0.018, 0.0, horn_z - 0.018), + (0.10, FACE_W * 0.90, 0.048), METAL_IDX, ) ) metal.extend( add_box( bm, - (-FACE_L / 2.0 - HEEL_L / 2.0 + 0.02, 0.0, face_z - 0.008), - (HEEL_L, FACE_W * 0.92, FACE_T * 0.82), + (-FACE_L / 2.0 - HEEL_L / 2.0 + 0.016, 0.0, face_z - 0.006), + (HEEL_L, FACE_W * 0.90, FACE_T * 0.78), METAL_IDX, ) ) metal.extend( add_box( bm, - (FACE_L * 0.22, 0.0, face_z + FACE_T / 2.0 - 0.006), - (0.034, 0.034, 0.014), + (FACE_L * 0.18, 0.0, face_z + FACE_T / 2.0 - 0.005), + (0.032, 0.032, 0.012), METAL_IDX, ) ) metal.extend( add_cyl( bm, - (FACE_L * 0.32, 0.0, face_z + FACE_T / 2.0 - 0.004), + (FACE_L * 0.30, 0.0, face_z + FACE_T / 2.0 - 0.004), 0.009, 0.012, - 8, + 10, METAL_IDX, ) ) @@ -524,7 +562,7 @@ def check(skip_decimate): low = build_anvil_mesh("AnvilLow", bevel_offset=0.005, bevel_segments=2) high = build_anvil_mesh("AnvilHigh", bevel_offset=0.005, bevel_segments=4) wood = principled("AnvilStump", (0.34, 0.18, 0.07, 1.0), 0.0, 0.62) - metal = principled("AnvilSteel", (0.18, 0.185, 0.195, 1.0), 1.0, 0.24) + metal = principled("AnvilSteel", (0.44, 0.45, 0.47, 1.0), 1.0, 0.30) assign_slots(low, wood, metal) assign_slots(high, wood, metal) @@ -673,7 +711,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(-8.0) low.rotation_euler.x = math.radians(0.0) floor_me = bpy.data.meshes.new("Floor") @@ -720,10 +758,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 = (1.36, -1.68, 0.93) + cam.location = (0.70, -2.20, 1.08) scene.collection.objects.link(cam) aim = bpy.data.objects.new("Aim", None) - aim.location = (0.0, 0.0, 0.36) + aim.location = (0.0, 0.0, 0.40) scene.collection.objects.link(aim) con = cam.constraints.new("TRACK_TO") con.target = aim diff --git a/showcase/anvil/preview.webp b/showcase/anvil/preview.webp index 883d6b7ab68ed34a34fdb43760611b03fccc5ace..c13722bc90f9aa0d2b082cd19cf54d9af3e2ee45 100644 GIT binary patch literal 14556 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 G0002+mvq7a literal 8332 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 WF4A7eq^!OCo9Ggne4FS+zyJU`5Exhh From 4dbb5c1d90c6285416325535ac9dc4ad6d7482e4 Mon Sep 17 00:00:00 2001 From: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Date: Mon, 14 Sep 2026 19:20:13 -0400 Subject: [PATCH 3/4] fix: rebuild hand-pump with a gooseneck and pump head Two-diameter column, quarter-arc spout, forked lever, and a stacked plinth so it no longer reads as a cone on a stick. Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Co-authored-by: Cursor --- docs/gallery/assets/hand-pump-hero.webp | Bin 6120 -> 6912 bytes showcase/hand-pump/README.md | 17 +-- showcase/hand-pump/hand_pump.py | 181 +++++++++++++++++------- showcase/hand-pump/preview.webp | Bin 5806 -> 6432 bytes 4 files changed, 137 insertions(+), 61 deletions(-) diff --git a/docs/gallery/assets/hand-pump-hero.webp b/docs/gallery/assets/hand-pump-hero.webp index 4902358f5ebdeed646860beaad9be5ec6a7c71d4..aaa9171012175606633cb8db6abe008d07c1c59f 100644 GIT binary patch literal 6912 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 diff --git a/showcase/hand-pump/README.md b/showcase/hand-pump/README.md index bde86e1..a57e62d 100644 --- a/showcase/hand-pump/README.md +++ b/showcase/hand-pump/README.md @@ -1,8 +1,9 @@ # Hand pump A showcase piece, not an example. Procedural cast-iron village hand -pump (wooden plinth, column, spout, handle, wooden grip) then the -shipped pipeline: unique-cell UVs, Cycles high-to-low normal bake, LOD +pump (stacked wooden plinth, two-diameter column, gooseneck spout, +pump head, forked handle, wooden grip) 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 @@ -21,14 +22,14 @@ materials, UVs, evaluated LOD, collider, or export file. | Axis | Declared | Measured (4.5.11 / 5.1.2 / 5.2.1) | | --- | --- | --- | -| Base triangles | 540–700 | 616 / 616 / 616 | +| Base triangles | 1080–1240 | 1164 / 1164 / 1164 | | LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.5000 | -| LOD2 ratio | 0.10–0.35 of base | 0.2175 / 0.2175 / 0.2143 | -| Materials | exactly 2 distinct, ≥24 metal faces | 2 slots, 96 metal | +| LOD2 ratio | 0.10–0.35 of base | 0.2199 / 0.2199 / 0.2148 | +| Materials | exactly 2 distinct, ≥24 metal faces | 2 slots, 222 metal | | UVs | in `0..1`, AABB overlap ≤ 1e-5 | in range, overlap 0 | -| Outer AABB | (0.567, 0.366, 1.027) m ± 0.01 | (0.5668, 0.3660, 1.0271), zmin 0 | -| Collider tris | ≤ 160 | 118 | -| Export | written, size > 0 | 52764 / 52764 / 52756 bytes | +| Outer AABB | (0.610, 0.364, 1.049) m ± 0.01 | (0.6100, 0.3639, 1.0491), zmin 0 | +| Collider tris | ≤ 160 | 110 | +| Export | written, size > 0 | 85944 / 85944 / 85936 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 diff --git a/showcase/hand-pump/hand_pump.py b/showcase/hand-pump/hand_pump.py index e8fc8e4..a4f72c6 100644 --- a/showcase/hand-pump/hand_pump.py +++ b/showcase/hand-pump/hand_pump.py @@ -35,19 +35,18 @@ sys.dont_write_bytecode = True import gallery_framing # noqa: E402 -PLINTH_XY = 0.30 -PLINTH_H = 0.072 +PLINTH_XY = 0.34 +PLINTH_H = 0.090 COL_R = 0.050 COL_H = 0.78 -COL_SEGS = 12 -SPOUT_Z = 0.42 -SPOUT_L = 0.16 -HANDLE_LIFT = 0.20 +COL_SEGS = 16 +SPOUT_Z = 0.46 +HANDLE_LIFT = 0.18 BBOX_TOL = 0.01 -OUTER_SIZE = (0.567, 0.366, 1.027) -BASE_TRIS_MIN = 540 -BASE_TRIS_MAX = 700 +OUTER_SIZE = (0.610, 0.364, 1.049) +BASE_TRIS_MIN = 1080 +BASE_TRIS_MAX = 1240 LOD1_RATIO_MIN = 0.32 LOD1_RATIO_MAX = 0.62 LOD2_RATIO_MIN = 0.10 @@ -131,6 +130,26 @@ def add_oriented_box(bm, a, b, scale_xy, mat_idx): ) +def add_cyl_between(bm, a, b, radius, segments, 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_cyl( + bm, + ((a + b) * 0.5), + radius, + length, + segments, + mat_idx, + euler=(eul.x, eul.y, eul.z), + ) + + def add_cyl(bm, loc, radius, depth, segments, mat_idx, euler=(0.0, 0.0, 0.0)): geo = bmesh.ops.create_cone( bm, @@ -261,27 +280,37 @@ def build_hand_pump_mesh(name, bevel_offset, bevel_segments): try: wood = [] metal = [] - col_z = PLINTH_H + COL_H / 2.0 - top_z = PLINTH_H + COL_H + slab_h = 0.050 + cap_h = 0.040 + top_z = slab_h + cap_h + COL_H wood.extend( add_box( bm, - (0.0, 0.0, PLINTH_H / 2.0), - (PLINTH_XY, PLINTH_XY, PLINTH_H), + (0.0, 0.0, slab_h / 2.0), + (PLINTH_XY, PLINTH_XY, slab_h), WOOD_IDX, ) ) - grip_end = Vector((-0.36, 0.10, top_z - 0.04 + HANDLE_LIFT)) + wood.extend( + add_box( + bm, + (0.0, 0.0, slab_h + cap_h / 2.0), + (0.26, 0.26, cap_h), + WOOD_IDX, + ) + ) + pivot = Vector((0.0, COL_R + 0.030, top_z - 0.018)) + grip_end = Vector((-0.38, pivot.y + 0.02, pivot.z + HANDLE_LIFT)) wood.extend( add_cyl( bm, (grip_end.x, grip_end.y, grip_end.z), - 0.016, - 0.11, - 8, + 0.018, + 0.12, + 10, WOOD_IDX, - euler=(0.0, math.pi / 2.0, 0.25), + euler=(0.0, math.pi / 2.0, 0.0), ) ) @@ -299,87 +328,133 @@ def build_hand_pump_mesh(name, bevel_offset, bevel_segments): for f in ret.get("faces") or []: f.material_index = WOOD_IDX + plinth_top = slab_h + cap_h metal.extend( add_cyl( bm, - (0.0, 0.0, PLINTH_H + 0.014), - 0.092, - 0.028, + (0.0, 0.0, plinth_top + 0.016), + 0.095, + 0.032, COL_SEGS, METAL_IDX, ) ) + lower_h = 0.40 metal.extend( add_cyl( bm, - (0.0, 0.0, col_z), - COL_R, - COL_H, + (0.0, 0.0, plinth_top + lower_h / 2.0), + 0.062, + lower_h, COL_SEGS, METAL_IDX, ) ) + joint_z = plinth_top + lower_h metal.extend( add_cyl( bm, - (0.0, 0.0, PLINTH_H + COL_H * 0.42), - COL_R + 0.010, - 0.032, + (0.0, 0.0, joint_z), + 0.078, + 0.026, COL_SEGS, METAL_IDX, ) ) + upper_h = 0.36 metal.extend( - add_cone( + add_cyl( bm, - (0.0, 0.0, top_z + 0.028), - 0.058, - 0.018, - 0.056, + (0.0, 0.0, joint_z + upper_h / 2.0), + 0.046, + upper_h, COL_SEGS, METAL_IDX, ) ) - spout_y = -(COL_R + SPOUT_L / 2.0) + metal.extend( + add_box( + bm, + (0.0, 0.0, top_z + 0.012), + (0.10, 0.10, 0.085), + METAL_IDX, + ) + ) metal.extend( add_cyl( bm, - (0.0, spout_y, SPOUT_Z), - 0.022, - SPOUT_L, - 10, + (0.0, 0.0, top_z + 0.068), + 0.034, + 0.036, + COL_SEGS, METAL_IDX, - euler=(math.pi / 2.0, 0.0, 0.0), ) ) + + arc_r = 0.13 + origin_y = -(0.046) + origin_z = SPOUT_Z + n_arc = 7 + last = None + for i in range(n_arc): + t0 = (i / n_arc) * (math.pi / 2.0) + t1 = ((i + 1) / n_arc) * (math.pi / 2.0) + p0 = ( + 0.0, + origin_y - arc_r * math.sin(t0), + origin_z - arc_r * (1.0 - math.cos(t0)), + ) + p1 = ( + 0.0, + origin_y - arc_r * math.sin(t1), + origin_z - arc_r * (1.0 - math.cos(t1)), + ) + metal.extend(add_cyl_between(bm, p0, p1, 0.018, 10, METAL_IDX)) + last = p1 metal.extend( add_cyl( bm, - (0.0, spout_y - SPOUT_L / 2.0 + 0.012, SPOUT_Z - 0.045), - 0.018, - 0.090, + (0.0, last[1], last[2] - 0.028), + 0.016, + 0.056, 10, METAL_IDX, ) ) - pivot = Vector((0.0, COL_R + 0.018, top_z - 0.055)) + + metal.extend( + add_box( + bm, + (0.028, pivot.y, pivot.z), + (0.022, 0.048, 0.050), + METAL_IDX, + ) + ) + metal.extend( + add_box( + bm, + (-0.028, pivot.y, pivot.z), + (0.022, 0.048, 0.050), + METAL_IDX, + ) + ) metal.extend( add_cyl( bm, - (pivot.x, pivot.y, pivot.z), - 0.016, - 0.055, - 8, + (0.0, pivot.y, pivot.z), + 0.012, + 0.072, + 10, METAL_IDX, - euler=(math.pi / 2.0, 0.0, 0.0), + euler=(0.0, math.pi / 2.0, 0.0), ) ) metal.extend( add_oriented_box( bm, (pivot.x, pivot.y, pivot.z), - (grip_end.x + 0.04, grip_end.y, grip_end.z), - (0.022, 0.018), + (grip_end.x + 0.03, grip_end.y, grip_end.z), + (0.020, 0.016), METAL_IDX, ) ) @@ -557,7 +632,7 @@ def check(skip_decimate): low = build_hand_pump_mesh("HandPumpLow", bevel_offset=0.004, bevel_segments=2) high = build_hand_pump_mesh("HandPumpHigh", bevel_offset=0.004, bevel_segments=4) wood = principled("HandPumpWood", (0.36, 0.19, 0.07, 1.0), 0.0, 0.60) - metal = principled("HandPumpIron", (0.16, 0.155, 0.15, 1.0), 1.0, 0.42) + metal = principled("HandPumpIron", (0.22, 0.21, 0.20, 1.0), 1.0, 0.35) assign_slots(low, wood, metal) assign_slots(high, wood, metal) @@ -708,7 +783,7 @@ def render_still(low, wood, tex, path, engine): ob.hide_render = True ob.hide_viewport = True - low.rotation_euler.z = math.radians(-28.0) + low.rotation_euler.z = math.radians(-36.0) low.rotation_euler.x = math.radians(0.0) floor_me = bpy.data.meshes.new("Floor") @@ -755,10 +830,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 = (2.05, -2.54, 0.97) + cam.location = (2.15, -2.35, 1.08) scene.collection.objects.link(cam) aim = bpy.data.objects.new("Aim", None) - aim.location = (0.0, 0.0, 0.42) + aim.location = (0.0, 0.0, 0.52) scene.collection.objects.link(aim) con = cam.constraints.new("TRACK_TO") con.target = aim diff --git a/showcase/hand-pump/preview.webp b/showcase/hand-pump/preview.webp index bef66e3b7af01b0eeda9683d4b8d864e27775710..89d748c3f4f2a24658fe1894f78e607cd8fc65f8 100644 GIT binary patch literal 6432 zcmV+*8Q5h~H#W|#ck$_z>(t$6!)RyIsfi3ES;&uK)3tKJf!1%bG?}|%o#sP64QN5I0 zH5e!st6Vk7>Ti5fTV^l&6Se7>z&9=EfvY0hF@RA%rx@@mu7RdRrXQ-mVwlkdoUmfMHMJ&MzJ2NLLaiADH~`>TMnqR{%_jK>#%FVv{W| z3jn%fr1{CsTw$+WG14|zJ-+7=jA0-d=4ypD`M$KTjONymmWrBomz4VMsmZzv_bMN^ zRKA}%09rr<=s5`6N_(0xCYWBNbIf@PzOkks_Y-9&3Vw&F=$*Zd3Y%NAT|;uA`(}Ug zDZt2M+}KRSF9HAl7mi&;-yqQMkI(K|dyp;FcI>uU$~WS6ZAZW<3WFBQ7496XPtbcFl;TX_aUa@| zn9j%t>)mCeX93MiWsV}kIi6LD4W~oYc}>VvV1}K(=;YdV$hiEui;xwT*sH?d8KF-3 z)MHcvO1VAf*X#7;0r1cj=#^Wy!lkgTIhAy|4PwsW%)+2=X#_!#Xh?{_X0V%sZTOs} zvRmPIEiss82(P)7besgvm!ha4)$bY7)zyg`O$Ouc6ZP+Ct~3j2pI?>N>-G9CC`G}{ z$?Nlu&#oQfASeN3t<8gJ;PKjiH9f2_@=cY9_?w!zbKM!J z;#^$`m*Z8*G8jBb8=1`Jb2#lj7D@E%(&Y}d;CYXgZ=OZ6h~$|s6m|}AXvHFtMz;a` znd$4Rnn>PCdlbNKRHzOhULn93l-rKcal!u5MF0n-+E5wp&N~1E*i|%=Z?8uK6sost zwc6(e2oaG+%ut4W`*Qq?qZD<*LJUZtA{?0Fh~*I!R)Kir3^oSVg=8HA!qkdAH=;bUP^?Lm{2RKx~~5Fup?9WxN90ydRfnhSY|Fn=4n6&qB?6kWq_o%qE~tdQU@z(>z#@x1BM5W2?E3w6oge~>dFCv#wNX(nH^J!EoeL-M zvdE-~@wWZw&aDZ)Hk5P3i4q5258t9zmbvOr*PfCnKx)JW=axpK1OPR#zLM&;R|?nS z(wa$%NL{Pc+R!H?mK;{9vAPDqx%?hkc$+70cq|49HQ^@w%hn?oE-^OKBK1DTu2X_e zp7|EpmhK1}CvLe_p)u@g3_d0|16T;Tt4)K_U0N0``t!?Ti#9M(kaBO)WsO#C4mCky!w|1kP)Cos3aM%-nn<+C;i}0l z-3YwqD#pxqb$!x2Ks*+XJP5&JfPm}eNXsgt?W@Bc`@oN*M>yj}RpbB4zL!pWTF!q! z^=P`-YtTV02|BP4GZU}?8GS~H%-&0lqErkHi>tq!{0LmRL@jHlD#gB8$-bO%MKv0s ztUIn~+2a1PpxZ;YvGW-U?VlWDR?+~S3a1zR^^Qkh&sgMj{Na5qK7?-dhl|Wr#+2dD z=rhA87us${tpMbMCcPxLo+IPjaV-E^R**6!%Fa%xr9F_e3 z&wZSG9MB>bcol);Y9c?{Mmypd2)nol$>)PXNkjJZJixlp1+eNWg4~bR!(pmI??sZ% zipG+YG}}FHB~`!%f{R^bYG#F*65qzVw7 zn(IPkkyY0ne?4QA#x_|KR{9lnHt#hPrV4 zc&a)D6JT&cNRU`6Zw6HjLseo7vFfPDyss(>vf+=yO5)Y$y?O2TD0I7e9$d%Mw z!=D}RSBF^2a|BuNo6caevGYe8_%-m0Hcizv30f$;f|>B zM`GLHIny6dW6^^9vA=<#i=WC&Ng!4`B#0~wmC5esf^!^&R~=2NbC+ksFAqcTGH+X( zk9&5@u|?>xjQ|#8`4#9RDI|^=(r7_3JXTVK>!{ATm17fXv5PoDyVHhAyf+|=^ht?0 z=2V3E4Qi2S2(IDbpT+=#GwcQrCk5|FO9FaWTOnu(8hP7A03xi0sSXysejxbm$8pJ3 zgxi%C{>-MA>L2zBUerMkhF|HG!$B^C4Nn&>b%F;IA!;oha@sKvb<)z^(p(n}Q^=zm z73*uea_B2C1tqMxvp{f{py!k_W2B8G5XRzdAM z+7(VNv=$1e2NR^SV)_>qQ1Fb6tJPaL#&|uaZ

0K|g2!0RH*De=*2tVT+OI>1R;( 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 Date: Mon, 14 Sep 2026 19:20:15 -0400 Subject: [PATCH 4/4] fix: rebuild signpost boards as painted planks Thin-Y planks, diamond tips, a collar cap, and regenerated gallery pages so the piece no longer reads as a stick with crayon arrows. Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Co-authored-by: Cursor --- docs/gallery/anvil/index.html | 126 ++++++++++------ docs/gallery/assets/signpost-hero.webp | Bin 6706 -> 7978 bytes docs/gallery/hand-pump/index.html | 195 +++++++++++++++++-------- docs/gallery/index.html | 16 +- docs/gallery/signpost/index.html | 85 ++++++----- docs/gallery/water-trough/index.html | 138 +++++++++++------ showcase/gallery.json | 12 +- showcase/signpost/README.md | 19 +-- showcase/signpost/preview.webp | Bin 6302 -> 7108 bytes showcase/signpost/signpost.py | 79 +++++----- 10 files changed, 429 insertions(+), 241 deletions(-) diff --git a/docs/gallery/anvil/index.html b/docs/gallery/anvil/index.html index c730f27..da9f14a 100644 --- a/docs/gallery/anvil/index.html +++ b/docs/gallery/anvil/index.html @@ -253,7 +253,7 @@

anvil

anvil render

Rendered headless by the example itself — click to zoom.

-
witnesses Recomputed: 1052 tris, two materials with 102 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.750×0.406×0.690 m, LOD ratios in band (5.2 COLLAPSE more aggressive on LOD2), convex collider 134 tris, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget.
+
witnesses Recomputed: 1696 tris, two materials with 274 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.746×0.410×0.682 m, LOD ratios in band (5.2 COLLAPSE more aggressive on LOD2), convex collider 162 tris, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget.
blender --background --python showcase/anvil/anvil.py --
@@ -264,7 +264,7 @@

anvil

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 | 980–1140 | 1052 / 1052 / 1052 | | LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.5000 | | LOD2 ratio | 0.10–0.35 of base | 0.2186 / 0.2186 / 0.2110 | | Materials | exactly 2 distinct, ≥24 metal faces | 2 slots, 102 metal | | UVs | in 0..1, AABB overlap ≤ 1e-5 | in range, overlap 0 | | Outer AABB | (0.750, 0.406, 0.690) m ± 0.01 | (0.7500, 0.4060, 0.6900), zmin 0 | | Collider tris | ≤ 180 | 134 | | Export | written, size > 0 | 84092 / 84092 / 84088 bytes |

+

| Axis | Declared | Measured (4.5.11 / 5.1.2 / 5.2.1) | | --- | --- | --- | | Base triangles | 1620–1780 | 1696 / 1696 / 1696 | | LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.5000 | | LOD2 ratio | 0.10–0.35 of base | 0.2193 / 0.2193 / 0.2182 | | Materials | exactly 2 distinct, ≥24 metal faces | 2 slots, 274 metal | | UVs | in 0..1, AABB overlap ≤ 1e-5 | in range, overlap 0 | | Outer AABB | (0.746, 0.410, 0.682) m ± 0.01 | (0.7460, 0.4095, 0.6820), zmin 0 | | Collider tris | ≤ 180 | 162 | | Export | written, size > 0 | 130852 / 130852 / 130840 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 4 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. That is the named budget the falsifier violates.

Run

@@ -333,9 +333,9 @@

Source

HEEL_L = 0.11 BBOX_TOL = 0.01 -OUTER_SIZE = (0.750, 0.406, 0.690) -BASE_TRIS_MIN = 980 -BASE_TRIS_MAX = 1140 +OUTER_SIZE = (0.746, 0.410, 0.682) +BASE_TRIS_MIN = 1620 +BASE_TRIS_MAX = 1780 LOD1_RATIO_MIN = 0.32 LOD1_RATIO_MAX = 0.62 LOD2_RATIO_MIN = 0.10 @@ -461,6 +461,37 @@

Source

return verts +def add_rim(bm, loc, major, minor, mat_idx, euler=(0.0, 0.0, 0.0)): + n_major = 14 + n_minor = 7 + rings = [] + for i in range(n_major): + u = i * (2.0 * math.pi / n_major) + ring = [] + for j in range(n_minor): + v = j * (2.0 * math.pi / n_minor) + x = (major + minor * math.cos(v)) * math.cos(u) + y = (major + minor * math.cos(v)) * math.sin(u) + z = minor * math.sin(v) + ring.append(bm.verts.new((x, y, z))) + rings.append(ring) + bm.verts.ensure_lookup_table() + for i in range(n_major): + i2 = (i + 1) % n_major + for j in range(n_minor): + j2 = (j + 1) % n_minor + face = bm.faces.new( + (rings[i][j], rings[i2][j], rings[i2][j2], rings[i][j2]) + ) + face.material_index = mat_idx + verts = [v for ring in rings for v in ring] + rot = Euler(euler).to_matrix() + origin = Vector(loc) + for v in verts: + v.co = rot @ v.co + origin + return verts + + def pack_uvs(bm, margin=0.08): uv = bm.loops.layers.uv.new("UVMap") faces = list(bm.faces) @@ -511,17 +542,23 @@

Source

metal = [] wood.extend( - add_cyl( - bm, (0.0, 0.0, STUMP_H / 2.0), STUMP_R, STUMP_H, 14, WOOD_IDX, + add_cone( + bm, + (0.0, 0.0, STUMP_H / 2.0), + STUMP_R + 0.010, + STUMP_R - 0.018, + STUMP_H, + 20, + WOOD_IDX, ) ) wood.extend( add_cyl( bm, - (0.0, 0.0, STUMP_H + 0.012), - STUMP_R - 0.012, - 0.024, - 14, + (0.0, 0.0, STUMP_H + 0.010), + STUMP_R - 0.022, + 0.020, + 20, WOOD_IDX, ) ) @@ -540,44 +577,45 @@

Source

for f in ret.get("faces") or []: f.material_index = WOOD_IDX - for z in (0.055, STUMP_H - 0.055): + for z in (0.048, STUMP_H - 0.042): metal.extend( - add_cyl( - bm, - (0.0, 0.0, z), - STUMP_R + 0.008, - 0.028, - 16, - METAL_IDX, - ) + add_rim(bm, (0.0, 0.0, z), STUMP_R + 0.004, 0.011, METAL_IDX) ) z0 = STUMP_H metal.extend( add_box( bm, - (0.0, 0.0, z0 + 0.028), - (FOOT_L, FOOT_W, 0.056), + (0.0, 0.0, z0 + 0.024), + (0.38, 0.168, 0.048), + METAL_IDX, + ) + ) + metal.extend( + add_box( + bm, + (0.0, 0.0, z0 + 0.066), + (0.30, 0.132, 0.038), METAL_IDX, ) ) metal.extend( add_box( bm, - (0.0, 0.0, z0 + 0.056 + BODY_H / 2.0), - (WAIST_L, WAIST_W, BODY_H), + (0.0, 0.0, z0 + 0.148), + (0.176, 0.070, 0.130), METAL_IDX, ) ) metal.extend( add_box( bm, - (0.0, 0.0, z0 + 0.056 + BODY_H + 0.028), - (FACE_L * 0.90, FACE_W * 0.88, 0.056), + (0.0, 0.0, z0 + 0.248), + (0.34, 0.112, 0.052), METAL_IDX, ) ) - face_z = z0 + 0.056 + BODY_H + 0.056 + FACE_T / 2.0 + face_z = z0 + 0.248 + 0.026 + FACE_T / 2.0 metal.extend( add_box( bm, @@ -587,15 +625,15 @@

Source

) ) - horn_z = face_z - 0.018 + horn_z = face_z - 0.012 metal.extend( add_cone( bm, - (FACE_L / 2.0 + HORN_L / 2.0 - 0.02, 0.0, horn_z), - 0.052, - 0.016, + (FACE_L / 2.0 + HORN_L / 2.0 - 0.028, 0.0, horn_z), + 0.056, + 0.014, HORN_L, - 12, + 16, METAL_IDX, euler=(0.0, math.pi / 2.0, 0.0), ) @@ -603,34 +641,34 @@

Source

metal.extend( add_box( bm, - (FACE_L / 2.0 - 0.01, 0.0, horn_z - 0.028), - (0.09, FACE_W * 0.92, 0.040), + (FACE_L / 2.0 - 0.018, 0.0, horn_z - 0.018), + (0.10, FACE_W * 0.90, 0.048), METAL_IDX, ) ) metal.extend( add_box( bm, - (-FACE_L / 2.0 - HEEL_L / 2.0 + 0.02, 0.0, face_z - 0.008), - (HEEL_L, FACE_W * 0.92, FACE_T * 0.82), + (-FACE_L / 2.0 - HEEL_L / 2.0 + 0.016, 0.0, face_z - 0.006), + (HEEL_L, FACE_W * 0.90, FACE_T * 0.78), METAL_IDX, ) ) metal.extend( add_box( bm, - (FACE_L * 0.22, 0.0, face_z + FACE_T / 2.0 - 0.006), - (0.034, 0.034, 0.014), + (FACE_L * 0.18, 0.0, face_z + FACE_T / 2.0 - 0.005), + (0.032, 0.032, 0.012), METAL_IDX, ) ) metal.extend( add_cyl( bm, - (FACE_L * 0.32, 0.0, face_z + FACE_T / 2.0 - 0.004), + (FACE_L * 0.30, 0.0, face_z + FACE_T / 2.0 - 0.004), 0.009, 0.012, - 8, + 10, METAL_IDX, ) ) @@ -808,7 +846,7 @@

Source

low = build_anvil_mesh("AnvilLow", bevel_offset=0.005, bevel_segments=2) high = build_anvil_mesh("AnvilHigh", bevel_offset=0.005, bevel_segments=4) wood = principled("AnvilStump", (0.34, 0.18, 0.07, 1.0), 0.0, 0.62) - metal = principled("AnvilSteel", (0.18, 0.185, 0.195, 1.0), 1.0, 0.24) + metal = principled("AnvilSteel", (0.44, 0.45, 0.47, 1.0), 1.0, 0.30) assign_slots(low, wood, metal) assign_slots(high, wood, metal) @@ -957,7 +995,7 @@

Source

ob.hide_render = True ob.hide_viewport = True - low.rotation_euler.z = math.radians(-22.0) + low.rotation_euler.z = math.radians(-8.0) low.rotation_euler.x = math.radians(0.0) floor_me = bpy.data.meshes.new("Floor") @@ -1004,10 +1042,10 @@

Source

cam_data = bpy.data.cameras.new("Cam") cam_data.lens = 50.0 cam = bpy.data.objects.new("Cam", cam_data) - cam.location = (1.36, -1.68, 0.93) + cam.location = (0.70, -2.20, 1.08) scene.collection.objects.link(cam) aim = bpy.data.objects.new("Aim", None) - aim.location = (0.0, 0.0, 0.36) + aim.location = (0.0, 0.0, 0.40) scene.collection.objects.link(aim) con = cam.constraints.new("TRACK_TO") con.target = aim diff --git a/docs/gallery/assets/signpost-hero.webp b/docs/gallery/assets/signpost-hero.webp index 0d00ef7f06cb97603f37e3ba7461f6e337f8c55b..b2727e05e300a151d76e8fe53d4989d6222486b8 100644 GIT binary patch literal 7978 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 I7I**v0DGa$OaK4? diff --git a/docs/gallery/hand-pump/index.html b/docs/gallery/hand-pump/index.html index 3b395d2..e1c27d2 100644 --- a/docs/gallery/hand-pump/index.html +++ b/docs/gallery/hand-pump/index.html @@ -4,18 +4,18 @@ hand-pump — Examples — Blender Developer Tools - + - + - +