Skip to content

Commit 73499d6

Browse files
TMHSDigitalclaude
andcommitted
fix(showcase): redesign hitching-post with a face-nailed horseshoe
A lone post with a stub rail read as the plainest object in the showcase lineup. A horseshoe nailed heels-up to the post's front face is what a real hitching post carries. It is geometry, so it is budgeted: a flat iron bar (17 mm x 7.5 mm) swept around 290 degrees of an arc, heels capped, centred on the post between the upper band and the rail, clear of the rings. Its back bites the post face 1.5 mm (HS_BITE), and its face stands 7.5 mm proud. The shell classifier separates it from the hung rings, which are the same flat-loop shape class, by position: on the post's centre line, not at +-EYE_X. A new Horseshoe seat budget reads the bite and stand-off against the post's front face off the mesh (count exactly 1, bite 0.0005-0.004 m, proud >= 0.004 m). New falsifier --float-horseshoe pulls it 4 mm off the face and exits 18. The hero key rises 660 -> 960 W, into the calibration luma band. Evidence (live runs, local): - .scratch/blender-5.2.1-windows-x64/blender.exe (Blender 5.2.1 LTS) and .scratch/blender-4.5.11-windows-x64/blender.exe (Blender 4.5.11 LTS): default exit 0 on both. base_tris 1852 (declared 1400-2400; was 1680), wood 114 / metal 828 faces, bbox (0.5000, 0.1490, 1.2460) unchanged, collider 80 tris, horseshoes=1 hs_bite 0.00150 hs_proud 0.00750, all other seats unchanged, hygiene 0, zfight 0. - Falsifiers, identical on both: --skip-decimate 9, --stray-vert 15, --twin-sole 15 (zfight 6), --lift-z 16, --clip-ring 18 (ring_err 0.024), --short-post 19, --sunk-bands 18 (proud -0.0015), --float-horseshoe 18 (hs_bite -0.0025, every other seat still green). 5.1.2 not re-run this pass. - tests/check_falsifier_targets.py: passed (static, 36 pieces). - Framing: fill y 0.800, margins l 0.444 r 0.438 b 0.094 t 0.106. - Contact sheet: candidate luma 0.207 / stage 0.207 / warmth +0.094 / sat 0.102, against armature-bend 0.243/0.192, damped-track-aim 0.237/0.218 and bmesh-gear 0.236/0.177. Saturation is low because the subject is timber and iron. - Asset sheet (docs/gallery/asset-sheets/hitching-post.webp): judged not the least-designed object in the lineup, though still among the simplest; the piece's single-post brief bounds how much it can carry. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent 2d9f5c5 commit 73499d6

8 files changed

Lines changed: 121 additions & 21 deletions

File tree

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
124124
<a href="showcase/wheelbarrow/"><img src="showcase/wheelbarrow/preview.webp" width="24%" alt="Wheelbarrow: a wooden tray with walls of stacked boards and iron straps, a spoked wheel, rear legs, and handles on a dark studio floor" /></a>
125125
<a href="showcase/anvil/"><img src="showcase/anvil/preview.webp" width="24%" alt="Anvil: a dark forged-steel London-pattern anvil with a flared, squared waist on a hooped timber stump on a dark studio floor" /></a>
126126
<a href="showcase/water-trough/"><img src="showcase/water-trough/preview.webp" width="24%" alt="Water trough: a watertight wooden trough with plank ends, contained water, and trestle legs on a dark studio floor" /></a>
127-
<a href="showcase/hitching-post/"><img src="showcase/hitching-post/preview.webp" width="24%" alt="Hitching post: a square timber post with a pyramidal cap, cross-arm, iron bands wrapped around it, and two hitching rings on a dark studio floor" /></a>
127+
<a href="showcase/hitching-post/"><img src="showcase/hitching-post/preview.webp" width="24%" alt="Hitching post: a square timber post with a pyramidal cap, cross-arm, iron bands wrapped around it, two hitching rings and a nailed horseshoe on a dark studio floor" /></a>
128128
<a href="showcase/grindstone/"><img src="showcase/grindstone/preview.webp" width="24%" alt="Grindstone: a stone wheel on a timber A-frame with an iron axle, hubs, crank, and tray on a dark studio floor" /></a>
129129
<a href="showcase/hand-pump/"><img src="showcase/hand-pump/preview.webp" width="24%" alt="Hand pump: a matte black cast-iron village pump on a stepped wooden plinth with a spout and handle on a dark studio floor" /></a>
130130
<a href="showcase/signpost/"><img src="showcase/signpost/preview.webp" width="24%" alt="Signpost: a timber crossroads post with three painted fingerboards lettered MILLBROOK 2, OAKHAM 5 and FORD 1, iron straps, and a pyramidal cap on a dark studio floor" /></a>
49.1 KB
Loading
3.74 KB
Loading
-1.83 KB
Loading

‎showcase/gallery.json‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -207,9 +207,9 @@
207207
{
208208
"name": "hitching-post",
209209
"dir": "showcase/hitching-post",
210-
"teaches": "A procedural hitching post (eaved cap, one rail, cup shoe, rings hung through eyes) through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.",
211-
"alt": "A tall wooden hitching post with a pointed cap, a crossbar, two iron bands wrapped around the post and two iron rings.",
212-
"witnessesFix": "Recomputed: 1680 tris, two materials with 114 wood and 742 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.500×0.149×1.246 m, zmin 0, hygiene and coplanar pairs 0, post seated at z 0.010, ring centerline error 0, bands 6.5 mm proud of the post, LOD ratios in band, convex collider 80 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert and --twin-sole exit 15; --lift-z exits 16; --clip-ring and --sunk-bands exit 18; --short-post exits 19.",
210+
"teaches": "A procedural hitching post (eaved cap, one rail, cup shoe, rings hung through eyes, a face-nailed horseshoe) through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.",
211+
"alt": "A tall wooden hitching post with a pointed cap, a crossbar with two hung iron rings, iron bands, and a horseshoe nailed heels-up to its face.",
212+
"witnessesFix": "Recomputed: 1852 tris, two materials with 114 wood and 828 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.500×0.149×1.246 m, zmin 0, hygiene and coplanar pairs 0, post seated at z 0.010, ring centerline error 0, bands 6.5 mm proud of the post, horseshoe biting 1.5 mm and 7.5 mm proud, LOD ratios in band, convex collider 80 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert and --twin-sole exit 15; --lift-z exits 16; --clip-ring, --sunk-bands and --float-horseshoe exit 18; --short-post exits 19.",
213213
"hero": "docs/gallery/assets/hitching-post-hero.webp",
214214
"preview": "showcase/hitching-post/preview.webp",
215215
"tags": [

‎showcase/hitching-post/README.md‎

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
A showcase piece, not an example. Procedural timber hitching post: a
44
125 mm square post seated in a closed iron shoe, one cross-rail through
5-
the post, a pyramidal cap with eaves, and two rings hung through eyes
6-
under the rail. Then the shipped pipeline: unique-cell UVs, Cycles
5+
the post, a pyramidal cap with eaves, two rings hung through eyes
6+
under the rail, and a horseshoe nailed heels-up to the post's face. Then the shipped pipeline: unique-cell UVs, Cycles
77
high-to-low normal bake, LOD chain, convex collider, Unity glTF export.
88

99
It asserts **budget conformance** of the generated result. It does not
@@ -25,12 +25,12 @@ imported). Coplanar-pair counting matches `showcase/signpost`.
2525
Declared as named constants; every gate **recomputes** from the mesh,
2626
materials, UVs, evaluated LOD, collider, or export file.
2727

28-
| Axis | Declared | Measured (4.5.11 / 5.1.2 / 5.2.1) |
28+
| Axis | Declared | Measured (4.5.11 / 5.2.1) |
2929
| --- | --- | --- |
30-
| Base triangles | 1400–2400 | 1680 / 1680 / 1680 |
31-
| LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.5000 |
32-
| LOD2 ratio | 0.10–0.35 of base | 0.2190 / 0.2190 / 0.2190 |
33-
| Materials | exactly 2 distinct, ≥70 wood, ≥560 metal | 2 slots, 114 wood, 742 metal |
30+
| Base triangles | 1400–2400 | 1852 / 1852 |
31+
| LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 |
32+
| LOD2 ratio | 0.10–0.35 of base | 0.2192 / 0.2192 |
33+
| Materials | exactly 2 distinct, ≥70 wood, ≥560 metal | 2 slots, 114 wood, 828 metal |
3434
| UVs | in `0..1`, AABB overlap ≤ 1e-5 | in range, overlap 0 |
3535
| Outer AABB | (0.500, 0.149, 1.246) m ± 0.01 | (0.5000, 0.1490, 1.2460) |
3636
| Grounded zmin | within 1e-4 of 0 | 0 / 0 / 0 |
@@ -39,9 +39,10 @@ materials, UVs, evaluated LOD, collider, or export file.
3939
| Hung ring | centerline error ≤ 0.008 m, ring–wood overlap 0, eye–wood overlap 0, shank–ring overlap 0, shank bites the eye | 0, 0, 0, 0, 40 |
4040
| Shoe | each band overlaps the post, shoe overlaps the sole | band gap 0, sole–shoe 8 |
4141
| **Band seat** | each band above the shoe stands ≥ 0.004 m proud of the post faces | 0.00650 |
42+
| **Horseshoe seat** | exactly 1; back bites the post face 0.0005–0.004 m, face ≥ 0.004 m proud | 1, 0.00150, 0.00750 |
4243
| Wood–metal gap | BVH surface < 0.008 m | 0.00075 |
4344
| Collider tris | ≤ 280 | 80 |
44-
| Export | written, size > 0 | 127424 / 127424 / 127412 bytes |
45+
| Export | written, size > 0 | 139464 / 139452 bytes |
4546

4647
Base triangles rose from **1598 to 1680**. The old rings were faceted
4748
tori clipped into the arm; the new eyes, shanks, and 24-segment hung
@@ -54,7 +55,26 @@ binaries agreed. Bake pixels are stochastic; the gate is `has_data`
5455
plus operator `FINISHED`, not byte-identity. Construction is
5556
closed-form; the only RNG is the seeded per-piece wood tone. Bevel inputs are sorted by edge index, so the face order is the same on
5657
every run; a Python set of edges handed to the bevel had made it vary.
57-
Export byte counts differ on 5.2.1 (glTF serializer), not a gated axis. Euler is 12 (six balls and seven tori) and is not gated to 2.
58+
Export byte counts differ on 5.2.1 (glTF serializer), not a gated axis. Euler is 14 (12 before the horseshoe added one more closed shell) and is not gated to 2.
59+
60+
### Horseshoe
61+
62+
A lone post with a stub rail read as the plainest object in the showcase
63+
lineup. A horseshoe nailed heels-up to the post's front face is what a
64+
real hitching post carries, and it is geometry, so it is budgeted: a
65+
flat iron bar (17 mm wide, 7.5 mm thick) swept around 290° of an arc,
66+
heels capped, centred on the post between the upper band and the rail
67+
and clear of the rings. Its back face bites the post face by 1.5 mm
68+
(`HS_BITE`); its face stands 7.5 mm proud. The shell classifier sets it
69+
apart from the hung rings, which are the same flat-loop shape class, by
70+
where it sits (on the post's centre line, not at ±`EYE_X`). **Horseshoe
71+
seat** reads the bite and the stand-off against the post's own front face
72+
off the mesh; `--float-horseshoe` pulls it 4 mm off the face and exits 18
73+
(bite −0.0025 m). It moved the budgets it should: base triangles 1680 →
74+
1852 (inside the declared 1400–2400) and metal faces 742 → 828. The outer
75+
AABB, collider (80 tris) and every other seat are unchanged. The hero key
76+
light rose from 660 to 960 W so the still sits in the calibration luma
77+
band.
5878

5979
### Bands, wood and stage
6080

@@ -83,6 +103,7 @@ Each falsifier violates exactly one named budget. Proven on Blender
83103
| `--clip-ring` | Hung-ring centerline | 18 | ring_err 0.024, ring–wood overlap 32 |
84104
| `--short-post` | Seated post | 19 | post zmin 0.030 |
85105
| `--sunk-bands` | Band seat | 18 | band proud −0.0015 |
106+
| `--float-horseshoe` | Horseshoe seat | 18 | bite −0.0025 |
86107

87108
Default exit is 0 on all three. `--clip-ring` also overlaps the rail;
88109
the centerline gate is the one that fires.
@@ -98,6 +119,7 @@ blender --background --python hitching_post.py -- --lift-z
98119
blender --background --python hitching_post.py -- --clip-ring
99120
blender --background --python hitching_post.py -- --short-post
100121
blender --background --python hitching_post.py -- --sunk-bands
122+
blender --background --python hitching_post.py -- --float-horseshoe
101123
blender --background --python hitching_post.py -- --output preview.webp --engine cycles
102124
```
103125

@@ -128,5 +150,5 @@ File-local. `9` is a valid check code. `10` is reserved for
128150
| 15 | Hygiene, including coplanar pairs (`--stray-vert`, `--twin-sole`) |
129151
| 16 | Grounded zmin (`--lift-z`) |
130152
| 17 | Wood–metal BVH gap above 8 mm |
131-
| 18 | Hung ring, shoe or band seat (`--clip-ring`, `--sunk-bands`) |
153+
| 18 | Hung ring, shoe, band or horseshoe seat (`--clip-ring`, `--sunk-bands`, `--float-horseshoe`) |
132154
| 19 | Post plumb, origin, and cup seat (`--short-post`) |

‎showcase/hitching-post/hitching_post.py‎

Lines changed: 85 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
"""Game-ready hitching post — a showcase piece, not an example.
22
33
Asserts budget conformance of a procedural timber hitching post (square
4-
post, pyramidal cap, cross-arm, iron shoe, bands, and hitching rings)
4+
post, pyramidal cap, cross-arm, iron shoe, bands, hitching rings and a
5+
face-nailed horseshoe)
56
after composing shipped pipeline pieces: bmesh construction, UVs, two
67
materials, high-to-low normal bake, LOD chain, convex collider, Unity
78
glTF export.
@@ -15,7 +16,8 @@
1516
ring off the eye centerline. ``--short-post`` starts the post above the
1617
shoe cup so the seated-post budget fails. ``--sunk-bands`` builds the
1718
iron bands inside the post, as the piece first shipped, so the band-seat
18-
budget fails.
19+
budget fails. ``--float-horseshoe`` pulls the horseshoe off the post face
20+
so the horseshoe-seat budget fails.
1921
2022
Construction is closed-form; the only RNG is the seeded per-piece wood
2123
tone. DECIMATE COLLAPSE triangle counts
@@ -79,6 +81,22 @@
7981
# corners broke the surface, as black slits. --sunk-bands restores that.
8082
BAND_BITE = 0.0015
8183
BAND_PROUD_MIN = 0.004
84+
85+
# A horseshoe nailed to the post's front face, heels up for luck: a flat
86+
# iron bar swept around 290 degrees of an arc in the XZ plane. Its back face
87+
# bites the post face by HS_BITE and it stands HS_T proud of it. It sits
88+
# between the upper band and the rail, clear of the rings.
89+
HS_Z = 0.690
90+
HS_R_IN = 0.033
91+
HS_R_OUT = 0.050
92+
HS_T = 0.0075
93+
HS_BITE = 0.0015
94+
HS_OPEN_DEG = 70.0 # opening at the top, centred on +Z
95+
HS_STATIONS = 22
96+
HS_BITE_MIN = 0.0005
97+
HS_BITE_MAX = 0.004
98+
HS_PROUD_MIN = 0.004
99+
HS_FLOAT = 0.004 # --float-horseshoe pulls it off the face by this
82100
# Per-piece wood tone jitter and grain frequency, as in shipping-crate.
83101
PLANK_TONE_JITTER = 0.28
84102
TONE_SEED = 29
@@ -436,7 +454,7 @@ def _bvh(me, poly_ids):
436454
def seat_audit(me):
437455
"""Recompute cup, hung-ring, and plumb budgets from the generated shells."""
438456
post = arm = cap = None
439-
soles, rings, eyes, bands, shanks = [], [], [], [], []
457+
soles, rings, eyes, bands, shanks, shoes_hs = [], [], [], [], [], []
440458
for idxs, polys in _face_shells(me):
441459
x0, x1, y0, y1, z0, z1 = _bounds(me, idxs)
442460
dx, dy, dz = x1 - x0, y1 - y0, z1 - z0
@@ -456,6 +474,10 @@ def seat_audit(me):
456474
continue
457475
if z0 < 0.004 and dz < 0.030 and dx > 0.10:
458476
soles.append(rec)
477+
elif dy < 0.025 and dx > 0.06 and dz > 0.06 and abs(rec["c"].x) < 0.06:
478+
# flat, face-mounted, on the post's centre line: the horseshoe
479+
# (the hung rings are the same shape class but hang at +-EYE_X)
480+
shoes_hs.append(rec)
459481
elif dy < 0.025 and dx > 0.06 and dz > 0.06:
460482
rings.append(rec)
461483
elif dx < 0.025 and dy > 0.025 and dz > 0.02:
@@ -485,6 +507,9 @@ def seat_audit(me):
485507
"shank_ring": 99,
486508
"shank_eye": 0,
487509
"band_proud": -1.0,
510+
"horseshoes": len(shoes_hs),
511+
"hs_bite": -1.0,
512+
"hs_proud": -1.0,
488513
}
489514
if (
490515
post is None
@@ -544,6 +569,14 @@ def seat_audit(me):
544569
bx0, bx1, by0, by1, _bz0, _bz1 = _bounds(me, band["idxs"])
545570
band_proud = min(band_proud, 0.25 * ((bx1 - bx0) + (by1 - by0)) - post_half)
546571

572+
# Horseshoe seat, read against the post's own front face off the mesh:
573+
# how deep its back bites into the post and how far its face stands out.
574+
hs_bite = hs_proud = -1.0
575+
if len(shoes_hs) == 1:
576+
ys = [me.vertices[i].co.y for i in shoes_hs[0]["idxs"]]
577+
hs_bite = max(ys) - post_y0
578+
hs_proud = post_y0 - min(ys)
579+
547580
pos, neg = [], []
548581
for i in arm["idxs"]:
549582
co = me.vertices[i].co
@@ -571,6 +604,8 @@ def seat_audit(me):
571604
"shank_ring": shank_ring,
572605
"shank_eye": shank_eye,
573606
"band_proud": band_proud,
607+
"hs_bite": hs_bite,
608+
"hs_proud": hs_proud,
574609
})
575610
return out
576611

@@ -694,6 +729,28 @@ def add_torus(bm, center, major, minor, axis, mat_idx, n_major=24, n_minor=8):
694729
return made
695730

696731

732+
def add_horseshoe(bm, cz, y_back, y_front, mat_idx):
733+
"""Flat bar swept around the arc; rectangular section, capped heels."""
734+
half_open = math.radians(HS_OPEN_DEG) * 0.5
735+
a0 = math.pi * 0.5 + half_open
736+
a1 = math.pi * 0.5 - half_open + 2.0 * math.pi
737+
rings = []
738+
for i in range(HS_STATIONS):
739+
a = a0 + (a1 - a0) * i / (HS_STATIONS - 1)
740+
ca, sa = math.cos(a), math.sin(a)
741+
rings.append([
742+
bm.verts.new((r * ca, y, cz + r * sa))
743+
for r, y in ((HS_R_IN, y_back), (HS_R_OUT, y_back),
744+
(HS_R_OUT, y_front), (HS_R_IN, y_front))
745+
])
746+
for r0, r1 in zip(rings, rings[1:]):
747+
for k in range(4):
748+
m = (k + 1) % 4
749+
bm.faces.new((r0[k], r0[m], r1[m], r1[k])).material_index = mat_idx
750+
bm.faces.new(tuple(reversed(rings[0]))).material_index = mat_idx
751+
bm.faces.new(tuple(rings[-1])).material_index = mat_idx
752+
753+
697754
def build_hitching_post_mesh(
698755
name,
699756
bevel_offset,
@@ -703,6 +760,7 @@ def build_hitching_post_mesh(
703760
twin_sole=False,
704761
small_cap=False,
705762
sunk_bands=False,
763+
float_horseshoe=False,
706764
):
707765
"""Post on a closed shoe, one rail, rings hung through eyes under the rail.
708766
@@ -790,6 +848,12 @@ def build_hitching_post_mesh(
790848
for z in BAND_ZS:
791849
add_square_band(bm, z, band_in, BAND_T, BAND_H, METAL_IDX)
792850

851+
# the post's front face is flat across |x| < half - bevel, wider than
852+
# the shoe; seat the shoe's back face HS_BITE inside it
853+
hs_shift = -HS_FLOAT if float_horseshoe else 0.0
854+
hs_back = -half + HS_BITE + hs_shift
855+
add_horseshoe(bm, HS_Z, hs_back, hs_back - HS_BITE - HS_T, METAL_IDX)
856+
793857
arm_bottom = ARM_Z - ARM_ZTH * 0.5
794858
eye_z = arm_bottom - EYE_MAJOR - EYE_MINOR - 0.004
795859
# Shank stops in the top of the eye tube. Continuing it to the eye
@@ -1135,6 +1199,7 @@ def check(
11351199
clip_ring=False,
11361200
short_post=False,
11371201
sunk_bands=False,
1202+
float_horseshoe=False,
11381203
):
11391204
bpy.ops.wm.read_factory_settings(use_empty=True)
11401205
low = build_hitching_post_mesh(
@@ -1145,6 +1210,7 @@ def check(
11451210
clip_ring=clip_ring,
11461211
twin_sole=twin_sole,
11471212
sunk_bands=sunk_bands,
1213+
float_horseshoe=float_horseshoe,
11481214
)
11491215
high = build_hitching_post_mesh(
11501216
"HitchPostHigh", bevel_offset=0.008, bevel_segments=4, sunk_bands=sunk_bands,
@@ -1247,7 +1313,8 @@ def check(
12471313
f"shank_ring={seat['shank_ring']} shank_eye={seat['shank_eye']} "
12481314
f"parts={seat['post']}/{seat['arm']}/{seat['cap']}/"
12491315
f"soles={seat['soles']}/rings={seat['rings']}/eyes={seat['eyes']}/bands={seat['bands']} "
1250-
f"band_proud={seat['band_proud']:.5f}"
1316+
f"band_proud={seat['band_proud']:.5f} horseshoes={seat['horseshoes']} "
1317+
f"hs_bite={seat['hs_bite']:.5f} hs_proud={seat['hs_proud']:.5f}"
12511318
)
12521319

12531320
if not (BASE_TRIS_MIN <= base_tris <= BASE_TRIS_MAX):
@@ -1354,14 +1421,19 @@ def check(
13541421
or seat["shank_ring"]
13551422
or seat["shank_eye"] < 1
13561423
or seat["band_proud"] < BAND_PROUD_MIN
1424+
or seat["horseshoes"] != 1
1425+
or not (HS_BITE_MIN <= seat["hs_bite"] <= HS_BITE_MAX)
1426+
or seat["hs_proud"] < HS_PROUD_MIN
13571427
):
13581428
return fail(
13591429
f"hung ring / shoe seat ring_err={seat['ring_err']:.5f} "
13601430
f"ring_wood={seat['ring_wood']} eye_wood={seat['eye_wood']} "
13611431
f"band_gap={seat['band_gap']:.5f} sole_shoe={seat['sole_shoe']} "
13621432
f"shank_ring={seat['shank_ring']} shank_eye={seat['shank_eye']} "
13631433
f"band_proud={seat['band_proud']:.5f} (min {BAND_PROUD_MIN}) "
1364-
"(--clip-ring / --sunk-bands are the designed fails)",
1434+
f"horseshoes={seat['horseshoes']} hs_bite={seat['hs_bite']:.5f} "
1435+
f"(band [{HS_BITE_MIN}, {HS_BITE_MAX}]) hs_proud={seat['hs_proud']:.5f} "
1436+
"(--clip-ring / --sunk-bands / --float-horseshoe are the designed fails)",
13651437
18,
13661438
), None, None, None, None, None
13671439
if (
@@ -1437,8 +1509,8 @@ def light(name, loc, energy, size, col, rot):
14371509
ob.rotation_euler = tuple(math.radians(a) for a in rot)
14381510
scene.collection.objects.link(ob)
14391511

1440-
light("Key", (-3.6, -5.0, 5.4), 660.0, 4.0, (1.0, 0.94, 0.86), (50, 0, -36))
1441-
light("Fill", (5.0, -3.4, 2.4), 46.0, 8.0, (0.72, 0.82, 1.0), (62, 0, 50))
1512+
light("Key", (-3.6, -5.0, 5.4), 960.0, 4.0, (1.0, 0.94, 0.86), (50, 0, -36))
1513+
light("Fill", (5.0, -3.4, 2.4), 70.0, 8.0, (0.72, 0.82, 1.0), (62, 0, 50))
14421514
light("Wedge", (2.2, 4.0, 3.8), 600.0, 5.5, (1.0, 0.70, 0.40), (-70, 0, 198))
14431515

14441516
cam_data = bpy.data.cameras.new("Cam")
@@ -1525,6 +1597,11 @@ def main():
15251597
action="store_true",
15261598
help="falsification: bands inside the post, only the corners showing",
15271599
)
1600+
p.add_argument(
1601+
"--float-horseshoe",
1602+
action="store_true",
1603+
help="falsification: pull the horseshoe off the post face",
1604+
)
15281605
args = p.parse_args(argv)
15291606

15301607
code, low, _high, wood, tex, _col = check(
@@ -1535,6 +1612,7 @@ def main():
15351612
clip_ring=args.clip_ring,
15361613
short_post=args.short_post,
15371614
sunk_bands=args.sunk_bands,
1615+
float_horseshoe=args.float_horseshoe,
15381616
)
15391617
if code:
15401618
return code
2.11 KB
Loading

0 commit comments

Comments
 (0)