You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix: wooden-barrel, wooden-bucket, wave-displace and color-attribute-wheel quality pass (#233)
* fix: wooden-barrel quality pass, boarded heads, stave tone and iron hoops
Heads are four boards cut from the croze outline, with a head-board
budget (exit 17, --one-piece-head). Per-stave tone and grain, rusted iron
hoops, the temp glb removed after measuring, and the gallery alt fixed
(it said three hoops; there are four).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
* fix: wooden-bucket quality pass, laid rope bail clear of the ear plates
The bail is three-strand rope and its rings now stand clear of the ear
plates the old rope ran through (exit 17, --sunk-rope). The bottom is
three boards (exit 17, --one-piece-bottom). OUTER_SIZE refit to the honest
envelope; --float-handle now keeps the envelope still. Per-stave wood,
iron hoops, 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>
* fix: wave-displace presentation, the wave as a tile on the studio floor
Render path only: a skirted copy of the checked grid stands on the floor
instead of bleeding off three frame edges. Contract and exit codes
unchanged on 4.5.11, 5.1.2 and 5.2.1.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
* fix: color-attribute-wheel presentation, a board on a plinth
Render path only: the zero-thickness disc gets a Solidify body and rests
on a plinth with a strut, instead of hovering above the floor. Contract
and exit codes unchanged on 4.5.11, 5.1.2 and 5.2.1. Also regenerates the
gallery index for all four items.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
* docs: showcase conventions for boarded heads, laid rope and mount clearance
From the wooden-barrel and wooden-bucket passes.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
---------
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: README.md
+6-6Lines changed: 6 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -111,7 +111,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
111
111
<palign="center">
112
112
<ahref="showcase/shipping-crate/"><imgsrc="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>
113
113
<ahref="showcase/stone-well/"><imgsrc="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>
114
-
<ahref="showcase/wooden-barrel/"><imgsrc="showcase/wooden-barrel/preview.webp"width="24%"alt="Wooden barrel: a 20-stave wine-cask with croze-seated heads, chord-lofted iron hoops, and a bung on a dark studio floor" /></a>
114
+
<ahref="showcase/wooden-barrel/"><imgsrc="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
115
<ahref="showcase/campfire/"><imgsrc="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>
116
116
<ahref="showcase/market-stall/"><imgsrc="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>
117
117
<ahref="showcase/street-lantern/"><imgsrc="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>
@@ -129,7 +129,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
129
129
<ahref="showcase/hand-pump/"><imgsrc="showcase/hand-pump/preview.webp"width="24%"alt="Hand pump: a cast-iron village pump on a wooden plinth with a spout and handle on a dark studio floor" /></a>
130
130
<ahref="showcase/signpost/"><imgsrc="showcase/signpost/preview.webp"width="24%"alt="Signpost: a timber post with two painted fingerboards, iron straps, and a pyramidal cap on a dark studio floor" /></a>
131
131
<ahref="showcase/chopping-block/"><imgsrc="showcase/chopping-block/preview.webp"width="24%"alt="Chopping block: a bark-sided log round with growth rings and drying checks on its sawn top, a riveted iron hoop, and a felling axe buried in the top, on a dark studio floor" /></a>
132
-
<ahref="showcase/wooden-bucket/"><imgsrc="showcase/wooden-bucket/preview.webp"width="24%"alt="Wooden bucket: a coopered pail with a round rope bail through ear rings and chord-lofted iron hoops on a dark studio floor" /></a>
132
+
<ahref="showcase/wooden-bucket/"><imgsrc="showcase/wooden-bucket/preview.webp"width="24%"alt="Wooden bucket: a coopered pail with a three-strand rope bail through iron ear rings and chord-lofted iron hoops on a dark studio floor" /></a>
133
133
<ahref="showcase/wall-torch/"><imgsrc="showcase/wall-torch/preview.webp"width="24%"alt="Wall torch: a dressed stone plaque with an iron sconce, wooden haft, and flame on a dark studio floor" /></a>
134
134
<ahref="showcase/tavern-stool/"><imgsrc="showcase/tavern-stool/preview.webp"width="24%"alt="Tavern stool: a round wooden seat on turned splayed legs with stretchers and iron ferrules on a dark studio floor" /></a>
135
135
<ahref="showcase/iron-cauldron/"><imgsrc="showcase/iron-cauldron/preview.webp"width="24%"alt="Iron cauldron: a bulged iron pot hanging from a timber tripod on a dark studio floor" /></a>
@@ -143,7 +143,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
143
143
144
144
[`stone-well`](showcase/stone-well/) — procedural round stone well, shingled roof, windlass, rope and bucket through the same pipeline. Falsifier `--skip-decimate` exits 9.
145
145
146
-
[`wooden-barrel`](showcase/wooden-barrel/) — procedural 20-stave wine-cask with croze-seated heads and chord-lofted hoops through the same pipeline. Falsifier`--round-band` exits 18.
146
+
[`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.
147
147
148
148
[`campfire`](showcase/campfire/) — procedural cobble ring, logs, and ash through the same pipeline. Falsifier `--skip-decimate` exits 9.
149
149
@@ -179,7 +179,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
179
179
180
180
[`chopping-block`](showcase/chopping-block/) — procedural hooped timber stump with an embedded axe through the same pipeline. Falsifier `--skip-decimate` exits 9.
181
181
182
-
[`wooden-bucket`](showcase/wooden-bucket/) — procedural coopered pail with a round bail through the ear rings through the same pipeline. Falsifier`--float-handle`exits 17.
182
+
[`wooden-bucket`](showcase/wooden-bucket/) — procedural coopered pail with a three-strand rope bail through the ear rings through the same pipeline. Falsifiers`--float-handle`and `--sunk-rope` exit 17.
183
183
184
184
[`wall-torch`](showcase/wall-torch/) — procedural wall-mounted torch sconce with a stone plaque, iron bracket, and flame through the same pipeline. Falsifiers `--skip-decimate` (9), `--stray-vert` (15), `--float-arm` (17).
185
185
@@ -257,7 +257,7 @@ the compositor on and is exactly zero with it off — and that EEVEE has no `use
257
257
</tr>
258
258
<tr>
259
259
<tdwidth="46%"valign="middle">
260
-
<ahref="examples/color-attribute-wheel/"><imgsrc="examples/color-attribute-wheel/preview.webp"alt="Color attribute wheel: an HSV color wheel disc with a white center fading into a vivid rainbow rim, leaning upright toward the camera on a dark studio floor with a warm light pool behind it" /></a>
260
+
<ahref="examples/color-attribute-wheel/"><imgsrc="examples/color-attribute-wheel/preview.webp"alt="Color attribute wheel: an HSV color wheel board with a white center fading into a vivid rainbow rim, leaning back on a dark plinth on a dark studio floor with a warm light pool behind it" /></a>
261
261
</td>
262
262
<tdvalign="middle">
263
263
@@ -361,7 +361,7 @@ then re-reads its own render and fails unless the pixels prove the flat-vs-check
361
361
</tr>
362
362
<tr>
363
363
<tdwidth="46%"valign="middle">
364
-
<ahref="examples/wave-displace/"><imgsrc="examples/wave-displace/preview.webp"alt="Wave displace: a glossy sapphire-blue surface displaced into smooth standing-wave dunes against a black backdrop" /></a>
364
+
<ahref="examples/wave-displace/"><imgsrc="examples/wave-displace/preview.webp"alt="Wave displace: a sapphire-blue tile whose top is displaced into smooth standing-wave dunes, standing on a dark studio floor" /></a>
<metaname="twitter:description" content="The modern color-attributes API — mesh.color_attributes.new() on the CORNER domain, filled by expanding per-vertex HSV across face corners with foreach_get/foreach_set, then wired into a shader Attribute node." />
<p>The modern color-attributes API — mesh.color_attributes.new() on the CORNER domain, filled by expanding per-vertex HSV across face corners with foreach_get/foreach_set, then wired into a shader Attribute node.</p>
269
269
</header>
270
270
<mainid="main">
271
-
<buttonclass="detail-hero" id="heroZoom" type="button" aria-label="View full size: A disc painted with a full hue wheel that fades to white at the centre.">
272
-
<imgsrc="../assets/color-attribute-wheel-hero.webp" alt="A disc painted with a full hue wheel that fades to white at the centre." width="1280" height="720" />
271
+
<buttonclass="detail-hero" id="heroZoom" type="button" aria-label="View full size: A board painted with a full hue wheel that fades to white at the centre, leaning on a dark plinth.">
272
+
<imgsrc="../assets/color-attribute-wheel-hero.webp" alt="A board painted with a full hue wheel that fades to white at the centre, leaning on a dark plinth." width="1280" height="720" />
273
273
</button>
274
274
<pclass="zoom-hint">Rendered headless by the example itself — click to zoom.</p>
275
275
<divclass="callout"><spanclass="tag">witnesses</span> CORNER-domain attributes are sized to loop count, not vertex count; the check asserts the sizing, that active_color points at it, and that the Attribute node is actually linked to Base Color, not just present.</div>
<p>A runnable example that builds an HSV color wheel disc entirely with <code>bmesh</code> and colors it with <code>Mesh.color_attributes.new()</code> — the modern attributes API, not the deprecated <code>Mesh.vertex_colors</code> alias AI code keeps reaching for. It witnesses the domain trap that comes with it: a <code>CORNER</code>-domain attribute is sized to <code>len(mesh.loops)</code>, not <code>len(mesh.vertices)</code>, so per-vertex data has to be expanded across face corners before it is written. The material wires the same attribute into a Shader <code>Attribute</code> node (<code>attribute_type='GEOMETRY'</code>) feeding Base Color — the step AI code most often skips, leaving the mesh gray even when the attribute data is correct.</p>
282
282
<p><strong>What it witnesses:</strong> a <code>FLOAT_COLOR</code> attribute on the <code>CORNER</code> domain, filled with one <code>foreach_get</code> (loop → vertex index) and one <code>foreach_set</code> (loop color), never a per-loop Python assignment. The check asserts the attribute is sized to the loop count and <em>not</em> the vertex count, that it is <code>color_attributes.active_color</code> (so a renderer or exporter actually picks it up), and that several probe loops match the closed-form HSV value for the vertex they reference. A separate check in the render path confirms the <code>Attribute</code> node is actually linked to Base Color, not just present in the node tree.</p>
283
+
<h2>Staging</h2>
284
+
<p>The disc is zero-thickness, and the still used to show it as a paper-thin oval hovering 8 cm above the floor. The render path now gives it a render-only Solidify body (5 cm) and stands it at the same 52° lean on a dark plinth, with a strut behind it, easel-style. The height is computed so the lowest point of the rim rests on the plinth. The mesh <code>check()</code> asserts is unchanged: the modifier is added after the check and only in the render path. Measured framing on 5.2.1: fill 0.794 y, every margin ≥ 0.094.</p>
283
285
<h2>Run</h2>
284
286
<pre><code># Cheap correctness check (no render) — the CI check:
<imgsrc="../assets/color-attribute-wheel-hero.webp" alt="A disc painted with a full hue wheel that fades to white at the centre." />
670
+
<imgsrc="../assets/color-attribute-wheel-hero.webp" alt="A board painted with a full hue wheel that fades to white at the centre, leaning on a dark plinth." />
0 commit comments