Skip to content

Commit d18608a

Browse files
TMHSDigitalclaude
andcommitted
fix: campfire quality pass, fieldstones instead of a kerb
Each ring stone is a lofted chamfered lump with a seeded belly, offset and crown; beds stay flat so the courses still seat. Stone variation budget (exit 20, --uniform-stones). Fieldstone, wood and ember materials; temp glb removed. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
1 parent 15c1afb commit d18608a

8 files changed

Lines changed: 735 additions & 209 deletions

File tree

‎README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
112112
<a href="showcase/shipping-crate/"><img src="showcase/shipping-crate/preview.webp" width="24%" alt="Shipping crate: a wooden slat crate with iron corner brackets on a dark studio floor, warm wedge on the back wall" /></a>
113113
<a href="showcase/stone-well/"><img src="showcase/stone-well/preview.webp" width="24%" alt="Stone well: a round brick well with a shingled pyramid roof on posts, rope and bucket, on a dark studio floor" /></a>
114114
<a href="showcase/wooden-barrel/"><img src="showcase/wooden-barrel/preview.webp" width="24%" alt="Wooden barrel: a 20-stave wine-cask with a head of four boards, chord-lofted iron hoops, and a bung on a dark studio floor" /></a>
115-
<a href="showcase/campfire/"><img src="showcase/campfire/preview.webp" width="24%" alt="Campfire: a two-course stone fire ring with a tripod of logs on a dark studio floor, warm wedge on the back wall" /></a>
115+
<a href="showcase/campfire/"><img src="showcase/campfire/preview.webp" width="24%" alt="Campfire: a two-course ring of rounded fieldstones around a tripod of logs and glowing ash on a dark studio floor, warm wedge on the back wall" /></a>
116116
<a href="showcase/market-stall/"><img src="showcase/market-stall/preview.webp" width="24%" alt="Market stall: a timber frame with post feet, slatted counter, rafters, and a striped awning on a dark studio floor, warm wedge on the back wall" /></a>
117117
<a href="showcase/street-lantern/"><img src="showcase/street-lantern/preview.webp" width="24%" alt="Street lantern: an iron post with brass collars, a braced arm, and a muntined amber cage on a dark studio floor" /></a>
118118
<a href="showcase/treasure-chest/"><img src="showcase/treasure-chest/preview.webp" width="24%" alt="Treasure chest: a slatted wooden chest with iron bands, corner brackets, and an open lid on a dark studio floor" /></a>
@@ -145,7 +145,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
145145

146146
[`wooden-barrel`](showcase/wooden-barrel/) — procedural 20-stave wine-cask with boarded, croze-seated heads and chord-lofted hoops through the same pipeline. Falsifiers `--round-band` exits 18, `--one-piece-head` exits 17.
147147

148-
[`campfire`](showcase/campfire/) — procedural cobble ring, logs, and ash through the same pipeline. Falsifier `--skip-decimate` exits 9.
148+
[`campfire`](showcase/campfire/) — procedural fieldstone ring, logs, and ash through the same pipeline. Falsifiers `--skip-decimate` exits 9, `--uniform-stones` exits 20.
149149

150150
[`market-stall`](showcase/market-stall/) — procedural timber stall with striped awning and counter through the same pipeline. Falsifier `--skip-decimate` exits 9.
151151

10.9 KB
Loading

‎docs/gallery/campfire/index.html‎

Lines changed: 354 additions & 103 deletions
Large diffs are not rendered by default.
3.64 KB
Loading

‎showcase/campfire/README.md‎

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# Campfire
22

33
A showcase piece, not an example. Procedural campfire (two-course
4-
running-bond stone ring of 14 barrelled wedges, pit-floor cobbles, ash,
4+
running-bond ring of 14 rounded fieldstones per course, pit-floor
5+
cobbles, ash with embers,
56
a kissing log tripod that overshoots a shared apex ring, floor logs,
67
and charcoal) then the shipped pipeline: unique-cell UVs, Cycles
78
high-to-low normal bake, LOD chain, convex collider, Unity glTF export.
@@ -26,25 +27,28 @@ materials, UVs, evaluated LOD, collider, or export file.
2627

2728
| Axis | Declared | Measured (4.5.11 / 5.1.2 / 5.2.1) |
2829
| --- | --- | --- |
29-
| Base triangles | 1400–3600 | 2200 / 2200 / 2200 |
30-
| LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.5000 |
31-
| LOD2 ratio | 0.10–0.35 of base | 0.2200 / 0.2200 / 0.2200 |
32-
| Materials | exactly 3 distinct; ≥80 wood, ≥24 ash, ≥200 stone | 3 slots; 216 / 48 / 1304 |
30+
| Base triangles | 1400–3600 | 2760 / 2760 / 2760 |
31+
| LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.4993 |
32+
| LOD2 ratio | 0.10–0.35 of base | 0.2196 / 0.2196 / 0.2196 |
33+
| Materials | exactly 3 distinct; ≥80 wood, ≥24 ash, ≥200 stone | 3 slots; 216 / 48 / 1416 |
3334
| UVs | in `0..1`, AABB overlap ≤ 1e-5 | in range, overlap 0 |
34-
| Outer AABB | (0.807, 0.808, 0.404) m ± 0.015 | (0.8069, 0.8079, 0.4037), zmin 0 |
35-
| Collider tris | ≤ 360 | 198 |
36-
| Export | written, size > 0 | 206244 / 206244 / 206236 bytes |
35+
| Outer AABB | (0.807, 0.808, 0.404) m ± 0.015 | (0.8024, 0.8022, 0.4037), zmin 0 |
36+
| Collider tris | ≤ 360 | 162 |
37+
| Export | written, size > 0 | 231952 / 231952 / 231944 bytes |
3738

3839
Base triangles dropped from **3616 to 2200** in the quality pass: the
3940
old piece stacked identical boxes with a mortar gap and a teepee that
4041
met at one point. The rebuild is two seated courses plus crossing
41-
sticks; hidden overlapping volume went away.
42+
sticks; hidden overlapping volume went away. The second pass took it to
43+
**2760**: each stone is now a lofted, chamfered lump instead of a
44+
four-sided wedge.
4245

4346
DECIMATE COLLAPSE triangle counts are **not** guaranteed identical across
4447
series — the gate is a ratio band, not an exact count. Bake pixels are
4548
stochastic; the gate is `has_data` plus operator `FINISHED`, not
46-
byte-identity. Stone-width jitter uses fixed seed 17. glTF byte size
47-
differs by 8 B on 5.2.1.
49+
byte-identity. Stone-width jitter uses fixed seed 17; each stone's
50+
shape draws from its own seeded generator. glTF byte size differs on
51+
5.2.1.
4852

4953
### Hygiene
5054

@@ -60,18 +64,40 @@ Recomputed from the generated mesh, not asserted about the script.
6064
| Coplanar disjoint face pairs | 0 | 0 |
6165
| Grounded: `zmin` | within 1e-4 of 0 | 0.0000 |
6266
| Named supports: 14 bottom stones | each `zmin` ≤ 0.001 | 14, stone_z 0.00000 |
63-
| Ring plan | 0.807 m dia × 0.156 m high ± 0.04 | 0.8074 × 0.1560 |
67+
| Ring plan | 0.807 m dia × 0.176 m high ± 0.04 | 0.8023 × 0.1759 |
68+
| **Stone variation** (exit 20) | per course, spread of stone outer radius, and of crown height on the top course, each ≥ 0.006 m | 0.01269 (smallest spread) |
6469

6570
### Joint fit and seat
6671

6772
| Axis | Declared | Measured (all three) |
6873
| --- | --- | --- |
69-
| Teepee kiss (BVH nearest at caps) | ≤ 0.008 m | 0.00001 |
74+
| Teepee kiss (BVH nearest at caps) | ≤ 0.008 m | 0.00034 |
7075
| Course seat (upper zmin − lower zmax) | abs ≤ 0.004 m | 0.00000 |
7176

77+
### Stones, wood and ash
78+
79+
The ring was 28 identical curved bricks: flat tops, flat faces, one
80+
height, one grey. It read as a concrete kerb. Each stone is now a
81+
chamfered octagon section lofted along its span, swelling to a seeded
82+
belly mid-stone and pinched and capped at the ends, with a seeded
83+
radial offset and outer-face wobble. Top-course stones get a seeded
84+
domed crown. The beds stay flat, and the bottom course's crown stays at
85+
the bed height, so the upper course still seats (course seat 0.00000).
86+
The stated ring height rose from 0.156 to 0.176 m for the crowns.
87+
88+
**Stone variation** asserts the ring is not one stone repeated.
89+
`--uniform-stones` gives every stone the same draw — each jitter at its
90+
upper bound, so the ring keeps the envelope of its widest seeded stone
91+
and only this budget fails (exit 20, spread 0.00000).
92+
93+
Stone is isotropic mottling, speckle and pitting with a seeded tone per
94+
stone (`stone-archway`'s recipe, reading `PieceTone`); sticks and logs
95+
carry their own tone and grain along their axis; the ash has sparse
96+
ember glow. The temp `.glb` is removed after its size is measured.
97+
7298
### Falsifiers
7399

74-
Each violates one named budget. All six were run on 4.5.11, 5.1.2 and
100+
Each violates one named budget. All seven were run on 4.5.11, 5.1.2 and
75101
5.2.1 and returned the same code on each.
76102

77103
| Flag | Budget violated | Exit |
@@ -82,6 +108,7 @@ Each violates one named budget. All six were run on 4.5.11, 5.1.2 and
82108
| `--short-stones` | named bottom-course supports at Z=0 | 16 |
83109
| `--float-logs` | teepee kiss | 17 |
84110
| `--gap-courses` | course seat | 18 |
111+
| `--uniform-stones` | stone variation | 20 |
85112

86113
## Run
87114

@@ -93,6 +120,7 @@ blender --background --python campfire.py -- --lift-z
93120
blender --background --python campfire.py -- --short-stones
94121
blender --background --python campfire.py -- --float-logs
95122
blender --background --python campfire.py -- --gap-courses
123+
blender --background --python campfire.py -- --uniform-stones
96124
blender --background --python campfire.py -- --output campfire.png
97125
```
98126

@@ -102,7 +130,7 @@ Smoke passes no flags.
102130

103131
File-local. `9` is a valid check code. `10` is reserved for
104132
`gallery_framing.check_framing` on the `--output` path. `15`–`19` are the
105-
hygiene and joint-fit family.
133+
hygiene and joint-fit family; `20` is file-local.
106134

107135
| Code | Meaning |
108136
| --- | --- |
@@ -126,3 +154,4 @@ hygiene and joint-fit family.
126154
| 17 | Joint fit: teepee kiss (`--float-logs`) |
127155
| 18 | Seat: course gap (`--gap-courses`) |
128156
| 19 | Ring diameter or height off the stated real-world size |
157+
| 20 | Stone variation: the ring stones are identical (`--uniform-stones`) |

0 commit comments

Comments
 (0)