Skip to content

Commit 7902563

Browse files
TMHSDigitalclaude
andcommitted
fix(showcase):
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent b3949b1 commit 7902563

4 files changed

Lines changed: 281 additions & 133 deletions

File tree

554 Bytes
Loading

‎showcase/toboggan/README.md‎

Lines changed: 78 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
11
# toboggan
22

3-
![A wooden runner sled with upturned horns, steel-shod runners and a slatted deck, a red steering bar at the front and a hemp pull rope ending in a wooden toggle](preview.webp)
3+
![A wooden runner sled with high front horns, steel-shod runners and a screwed slatted deck, a red steering bar through the horns and a three-strand hemp pull rope ending in a wooden toggle](preview.webp)
44

55
A traditional runner sled in the Flexible Flyer pattern (the name is the
66
repo's; the model is the steered runner sled, not a flat-bottom
77
toboggan): two steel-shod wooden runners with upturned front horns, six
8-
posts carrying three cross bearers, a deck of seven lengthwise slats, a
9-
painted steering bar through both horns with a drilled hub, and a hemp
10-
rope threaded through the hub and stopped with a knot behind it, ending
11-
in a wooden toggle on the floor. **A showcase piece, not an example** — it
8+
posts carrying three cross bearers, a deck of seven lengthwise slats
9+
screwed to them, one painted steering bar through both horns and proud of
10+
each as a hand grip, and a three-strand hemp rope threaded through a hole
11+
drilled in the bar's centre and stopped with a knot behind it, ending in
12+
a wooden toggle on the floor. **A showcase piece, not an example** — it
1213
witnesses no API contract. It asserts that generated geometry meets
1314
declared asset budgets, recomputed from the finished mesh.
1415

1516
## What it composes
1617

1718
| Shipped content | Used for |
1819
| --- | --- |
19-
| `skills/mesh-editing-and-bmesh` | chamfered members swept along a curve, a drilled hub, lathed bolts, a parallel-transport rope, all in one `bmesh` |
20-
| `skills/custom-properties` | face attributes (`PlankTone`, `GrainDir`) read by the wood shaders |
21-
| `skills/procedural-materials-and-shaders` | slat pine, stained frame, worn steel, hemp lay from the rope's UVs, worn red enamel |
20+
| `skills/mesh-editing-and-bmesh` | chamfered and round-cornered members swept along a curve, a drilled bar, lathed bolts and screws, a three-strand rope on a parallel-transport frame, all in one `bmesh` |
21+
| `skills/custom-properties` | face attributes (`PlankTone`, `GrainDir`) and a point attribute (`Lay`) read by the shaders |
22+
| `skills/procedural-materials-and-shaders` | slat pine, stained frame, worn steel, hemp darkened in the lay grooves, worn red enamel |
2223
| `skills/bake-high-to-low` | Cycles tangent-space normal bake, high onto low |
2324
| `skills/engine-export-presets` | Unity glTF (`export_yup=True`) |
2425
| `skills/depsgraph-and-evaluated-data` | evaluated triangle counts for the LOD ratios |
@@ -38,11 +39,13 @@ and a rope through a hole. Each of those fails invisibly to an AABB:
3839
- **The deck is joined, not stacked.** Every post bites 11.5 mm into its
3940
runner and 13.5 mm into its bearer, and stops 21.5 mm short of the
4041
bearer's top; every slat is rebated 3 mm into each of the three
41-
bearers it crosses (21 joints).
42-
- **The rope goes through the hole.** The hub is a block drilled along X.
43-
The rope's rings inside the hub are measured against the hole's radius
44-
read off the mesh, and a rope shifted 12 mm sits in solid wood, not in
45-
the hole (`--miss-hole`, exit 18).
42+
bearers it crosses (21 joints), and each of those joints carries a
43+
screw head biting the slat and domed proud of it.
44+
- **The rope goes through the hole.** The steering bar is one piece
45+
drilled along X at its centre. The rope's rings inside the bar are
46+
measured against the hole's radius read off the mesh, and a rope
47+
shifted 12 mm sits in solid wood, not in the hole (`--miss-hole`,
48+
exit 18).
4649

4750
## Budgets
4851

@@ -52,28 +55,29 @@ mesh. Measured values are from Blender 5.2.1, the only binary run locally;
5255

5356
| Budget | Band | Measured |
5457
| --- | --- | --- |
55-
| Base triangles | 4400–5000 | 4696 |
58+
| Base triangles | 7050–7650 | 7356 |
5659
| LOD1 ratio | 0.32–0.62 | 0.5000 |
57-
| LOD2 ratio | 0.10–0.35 | 0.2198 |
60+
| LOD2 ratio | 0.10–0.35 | 0.2200 |
5861
| Material slots | exactly 5, distinct | 5 |
59-
| Slat / frame / steel / rope / paint faces | ≥ 150 / 770 / 940 / 390 / 85 | 168 / 864 / 1056 / 440 / 96 |
60-
| UV bounds | inside 0..1 | (0.0050, 0.0050)–(0.9950, 0.9950) |
62+
| Slat / frame / steel / rope / paint faces | ≥ 230 / 770 / 1450 / 1300 / 44 | 252 / 864 / 1560 / 1412 / 48 |
63+
| UV bounds | inside 0..1 | (0.0037, 0.0043)–(0.9962, 0.9957) |
6164
| UV AABB overlap | ≤ 1e-5 | 0.000000 |
62-
| Outer AABB | 1.629 × 0.425 × 0.211 m ± 0.020 | 1.6293 × 0.4247 × 0.2106 |
63-
| Collider triangles | ≤ 720 | 656 (10 hulls) |
65+
| Outer AABB | 1.623 × 0.468 × 0.243 m ± 0.020 | 1.6234 × 0.4680 × 0.2428 |
66+
| Collider triangles | ≤ 720 | 632 (10 hulls) |
6467
| Normal bake | `{'FINISHED'}` with image data | `{'FINISHED'}`, `has_data=True` |
65-
| glTF export | file written, non-empty | ~235 kB |
68+
| glTF export | file written, non-empty | ~326 kB |
6669
| Hygiene | all zero | loose 0/0, non-manifold 0, zero-area 0, doubles 0, n-gons 0, coplanar cross-shell pairs 0 |
6770
| Grounded AABB | \|zmin\| ≤ 1e-4 | 0.00000 |
6871
| Named shoes | 2 shoes, each zmin ≤ 1e-4 | 2 at 0.00000 |
6972
| Post bite into runner | 6 posts, 5–16 mm | 11.5 mm |
7073
| Post tenon into bearer | 6–18 mm; clear of the slats ≥ 12 mm | 13.5 mm; 21.5 mm |
71-
| Bar protrusion | 2 arms, 20–45 mm past the runner's outer face | 31.5 mm |
74+
| Bar protrusion | 1 bar, 55–85 mm past each runner's outer face | 70.0 mm both ends |
7275
| Slat seat | 7 slats, 21 joints, 1.5–4.5 mm | 3.0 mm |
76+
| Screw seat | 21 screws, one per slat-bearer joint, 0.3–1.2 mm bite, 0.8–2.0 mm proud | 0.6 mm; 1.2 mm |
7377
| Shoe seat | 2 shoes, 0.5–2.5 mm up into the runner | 1.5 mm |
7478
| Bolt seat | 6 bolts, 3–6 mm proud, 0.5–2 mm bite | 4.4 mm; 1.0 mm |
75-
| Rope in the hole | hub 1, rope 1, clearance 0.5–6 mm | hole r 11.0 mm, clearance 5.0 mm, 30 rope vertices (three rings) inside the hub |
76-
| Runner length | 1.15–1.25 m | 1.189 m |
79+
| Rope in the hole | bar 1, rope 1, clearance 0.5–6 mm | hole r 11.0 mm, clearance 4.2 mm to the strand crowns, 72 rope vertices (six rings) inside the bar |
80+
| Runner length | 1.15–1.25 m | 1.191 m |
7781
| Deck | 0.90–0.98 m × 0.40–0.44 m, top 0.130–0.155 m | 0.943 × 0.417, 0.145 |
7882
| Track (runner centre to centre) | 0.29–0.31 m | 0.300 m |
7983
| Mirrored runners and shoes | extents mirrored through y = 0 within 0.1 mm | 0.000 mm |
@@ -87,25 +91,42 @@ standard.
8791

8892
- **Runners.** A 28 × 54 mm timber with 4 mm chamfers, swept along a
8993
closed-form centreline: flat under the deck, a power-law horn in front
90-
(170 mm rise over the last 320 mm), a short tail behind. The slope is
94+
(210 mm rise over the last 320 mm, exponent 2.5, so the tip climbs at
95+
about 59°), and only an 8 mm kick-up over the last 100 mm behind. A
96+
runner sled's front curls up to take the snow; its back is cut off
97+
nearly flat. The first build gave the tail 25 mm, which at hero
98+
distance read as a second horn. The slope is
9199
analytic, so the shoe and the body are exact parallel offsets of one
92100
curve. The shoe is a 34 × 9 mm steel strap with its top 1.5 mm up into
93101
the timber (`SHOE_BITE`), and its bottom vertices sit at exactly
94102
z = 0 on the flat run.
95103
- **Posts, bearers, slats.** Chamfered members, every cap a fan to a pole
96104
a hair past the last ring, so there are no n-gons. Bearers span 0.38 m;
97105
slats are 54 × 16 mm on a 60.5 mm pitch, wide enough that no two slat
98-
faces fall inside the coplanar-pair radius.
99-
- **Steering bar and hub.** Two painted arms tenoned through the runner
100-
horns, 31.5 mm proud of the outer faces, ending 35 mm either side of
101-
the centre inside a hub block. The hub is a rectangle ring around a
102-
12-gon hole, four UV strips, genus one.
103-
- **Rope.** A round section on a parallel-transport frame. It starts at a
104-
knot centre 30 mm behind the hub, runs straight through the hole, sags
105-
to the floor over 250 mm on a smoothstep, then curls 85° on the floor
106-
and ends in a toggle. The knot sphere (16.5 mm) is larger than the hole
107-
(11 mm), so the rope cannot pull through. The rope's lay is a diagonal
108-
wave on its own UVs, so the twist follows the strand.
106+
faces fall inside the coplanar-pair radius. Slats take a round-cornered
107+
section (2.5 mm radius, three points per corner) rather than a chamfer,
108+
and each slat's `PlankTone` lands 0.73–1.33 of the ramp, so neighbouring
109+
boards read as different boards rather than one sheet.
110+
- **Screws.** A domed head at each of the 21 slat-bearer joints, lathed
111+
about Z, its rim 0.6 mm into the slat top. Each head is turned by the
112+
golden angle from the last, so no two heads' facets share a plane and
113+
the coplanar cross-shell count stays at zero.
114+
- **Steering bar.** One painted 32 × 36 mm bar through both runner horns,
115+
standing 70 mm proud of each outer face as a hand grip, with 10 mm
116+
chamfers on its ends. It is a single chamfered rectangle ring around a
117+
12-gon hole at its centre: four UV strips, genus one. The first build
118+
had two short arms and a separate hub block; at hero distance the
119+
horn hid the arm between them, and the bar read as two red blocks.
120+
- **Rope.** Three strands on a parallel-transport frame: the section
121+
radius is `6 mm × (1 + 0.14 cos(3θ − 2πs/36 mm))`, so the strands spiral
122+
along the rope in its silhouette, and a `Lay` point attribute with the
123+
same phase darkens the grooves between them. The path is re-cut at an
124+
even 6 mm. It starts at a knot centre behind the bar, runs straight
125+
through the hole, sags to the floor over 250 mm on a smoothstep, then
126+
curls 85° on the floor and ends in a toggle. The floor run sits at the
127+
strand crowns' radius (6.84 mm), not the mean, so the rope does not dip
128+
through the floor. The knot sphere (16.5 mm) is larger than the hole
129+
(11 mm), so the rope cannot pull through.
109130
- **Bolts.** Six domed carriage bolts, one through each runner at each
110131
post, lathed about Y, 1.0 mm into the runner's outer face.
111132

@@ -125,8 +146,14 @@ standard.
125146
toggle then pulled the bottom margin to zero, so the curl is 85° rather
126147
than 110°.
127148
- **Hero lay (inspection-only).** The rope first took the wood shader's
128-
per-ring grain direction and rendered as bands; it now has its own
129-
material.
149+
per-ring grain direction and rendered as bands; it then had its own
150+
material, but a diagonal wave on its UVs still rendered as a smooth
151+
tube. The lay is now modelled.
152+
- **A falsifier's envelope (quality pass).** With the bar one piece, the
153+
old `--short-bar` (both ends pulled inside the runners) shrank the AABB
154+
by 80 mm in Y and exited 8, not 17. It now pulls only the left end in
155+
19 mm, which stays inside `BBOX_TOL` (the box narrows 17.8 mm) and
156+
leaves that end 51 mm proud, under the 55 mm minimum.
130157

131158
## Conventions walked
132159

@@ -142,11 +169,11 @@ Every convention in `showcase/README.md`, and whether it applies here.
142169
| Plumb and real-world size | yes | runner, deck and track bands (`--tall-posts`) |
143170
| A member is tenoned into its seat | yes | posts into runner and bearer (`--short-post`), slats rebated (`--float-slats`) |
144171
| Joint-fit budgets | yes | post and bar bands recomputed from the host shell |
145-
| Fasteners seated | yes | bolt heads proud and bitten (`--float-bolts`) |
172+
| Fasteners seated | yes | bolt heads proud and bitten (`--float-bolts`); slat screws bitten and proud (`--float-screws`) |
146173
| Seat conformance | yes | shoe up into runner (`--lift-runners`) |
147-
| Hung / threaded rope | yes | rope in the hole (`--miss-hole`) |
174+
| Hung / threaded rope | yes | rope in the bar's centre hole (`--miss-hole`) |
148175
| Wrappers follow the host's profile | n/a | the shoe is a parallel offset of the same centreline, not a wrapper |
149-
| Edge treatment: no right angles | yes, by construction | every member is a chamfered section; a 90° edge fraction of 0.024 is printed by the asset-quality gate on the render path |
176+
| Edge treatment: no right angles | yes, by construction | every member is a chamfered section; a 90° edge fraction of 0.015 is printed by the asset-quality gate on the render path |
150177
| Shading is part of the model | yes | smooth along members, every edge over 40° hard (chamfers, caps) |
151178
| One substance, one slot | yes | slat pine, frame, steel, rope, paint |
152179
| Iron is not chrome | yes | steel metallic 0.85, roughness 0.30–0.62, rust speckle |
@@ -158,7 +185,7 @@ Every convention in `showcase/README.md`, and whether it applies here.
158185

159186
## Falsifiers
160187

161-
Each breaks one pipeline stage so a **named** budget fails. All twelve
188+
Each breaks one pipeline stage so a **named** budget fails. All thirteen
162189
exited their declared code on Blender 5.2.1; 4.5 and 5.1 were not run.
163190

164191
| Flag | Target budget | Breaks | Exit |
@@ -168,11 +195,12 @@ exited their declared code on Blender 5.2.1; 4.5 and 5.1 were not run.
168195
| `--lift-z` | grounded zmin | lifts the whole mesh 50 mm | 16 |
169196
| `--float-shoe` | named shoes | lifts the left shoe 6 mm; the right still grounds the AABB | 16 |
170197
| `--short-post` | post bite into the runner | starts every post 4 mm above the runner's top; −2.5 mm | 17 |
171-
| `--short-bar` | bar protrusion | ends each arm 10 mm inside the runner's outer face; −8.5 mm | 17 |
198+
| `--short-bar` | bar protrusion | pulls the bar's left end in 19 mm; 51 mm proud, under the 55 mm minimum | 17 |
172199
| `--float-slats` | slat seat | lifts every slat 5 mm off its bearers; −2.0 mm | 18 |
173200
| `--lift-runners` | shoe seat | lifts both timbers 4 mm off their shoes; −2.5 mm | 18 |
174201
| `--float-bolts` | bolt seat | moves every bolt 3.5 mm outward; bite −2.5 mm | 18 |
175-
| `--miss-hole` | rope in the hole | lifts the rope and knot 12 mm; clearance −7.0 mm | 18 |
202+
| `--float-screws` | screw seat | lifts every screw head 3 mm off its slat; bite −2.4 mm | 18 |
203+
| `--miss-hole` | rope in the hole | lifts the rope and knot 12 mm; clearance −7.8 mm | 18 |
176204
| `--tall-posts` | real-world deck height | raises bearers, posts and slats 40 mm; deck top 185 mm | 19 |
177205
| `--skew-runner` | mirrored runners | moves the left runner and shoe 6 mm along X; 6.0 mm | 19 |
178206

@@ -201,7 +229,7 @@ wrapper — a crash, never a named check.
201229
| 15 | Mesh hygiene (`--stray-vert`) |
202230
| 16 | Grounded zmin, or a shoe floating (`--lift-z`, `--float-shoe`) |
203231
| 17 | Post bite or tenon, or bar protrusion (`--short-post`, `--short-bar`) |
204-
| 18 | Slat, shoe or bolt seat, or the rope in its hole (`--float-slats`, `--lift-runners`, `--float-bolts`, `--miss-hole`) |
232+
| 18 | Slat, screw, shoe or bolt seat, or the rope in its hole (`--float-slats`, `--float-screws`, `--lift-runners`, `--float-bolts`, `--miss-hole`) |
205233
| 19 | Real-world size or mirrored runners (`--tall-posts`, `--skew-runner`) |
206234
| 24 | Asset-quality floors (`examples/gallery_asset_quality.py`, render path only; remapped from 11) |
207235

@@ -230,9 +258,9 @@ column for 4.5 and 5.1 would be a guess, so there is none.
230258

231259
| Value | 5.2.1 |
232260
| --- | --- |
233-
| Base triangles | 4696 |
234-
| LOD1 / LOD2 tris | 2348 / 1032 |
235-
| Face counts (slat / frame / steel / rope / paint) | 168 / 864 / 1056 / 440 / 96 |
236-
| Outer AABB | 1.6293 × 0.4247 × 0.2106 |
237-
| Collider tris | 656 |
238-
| glTF bytes | 235236 |
261+
| Base triangles | 7356 |
262+
| LOD1 / LOD2 tris | 3678 / 1618 |
263+
| Face counts (slat / frame / steel / rope / paint) | 252 / 864 / 1560 / 1412 / 48 |
264+
| Outer AABB | 1.6234 × 0.4680 × 0.2428 |
265+
| Collider tris | 632 |
266+
| glTF bytes | 325848 |

‎showcase/toboggan/preview.webp‎

284 Bytes
Loading

0 commit comments

Comments
 (0)