Skip to content

Commit 5ef9783

Browse files
TMHSDigitalclaude
andcommitted
fix(examples): redesign attribute-domain-shear as striped patio parasols
The gallery review judged the hero weak. The "wrong" POINT umbrella read as a smoother, arguably prettier rainbow gradient, which undercut the message, and the small floor labels could not be read at card size. The render now shows two striped patio parasols. Each is eight named parts with five materials: canopy, ribs, brass fittings, teak poles and a cast-iron base. The canopy is the check's fan grown into fabric: eight gores around one shared apex, with every gore vertex on a seam, painted by the same assign_corner / assign_point_naive functions the check asserts. CORNER keeps crisp crimson and cream stripes. Naive POINT smears them pink along the seams, and gore 0 (crimson by intent, turned to face the camera) renders cream because gore 7 wrote its seam and the apex last. The render uses a two-tone palette. The check keeps its eight distinct hues, since an off-by-two ordering bug would pass unnoticed under a period-2 palette. There is one bold standing label per parasol. The render path now also runs the asset-quality floors (exit 11). The authoring functions gained a faces_per_wedge stride (wedge-major face order). On the check's fan it is 1 and the write order is unchanged. The check output is identical on 4.5.11, 5.1.2 and 5.2.1, and all five falsifiers were re-proven. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
1 parent 60c967c commit 5ef9783

9 files changed

Lines changed: 607 additions & 235 deletions

File tree

‎README.md‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,7 +1069,7 @@ evaluation). Break the mirror and the render is literally half a car.
10691069
</tr>
10701070
<tr>
10711071
<td width="46%" valign="middle">
1072-
<a href="examples/attribute-domain-shear/"><img src="examples/attribute-domain-shear/preview.webp" alt="Attribute domain shear: two eight-petal pinwheels side by side — left CORNER-domain with crisp colored petals to the hub, right naive POINT-domain smeared into a swirl, proving last-write-wins shear at shared vertices" /></a>
1072+
<a href="examples/attribute-domain-shear/"><img src="examples/attribute-domain-shear/preview.webp" alt="Attribute domain shear: two striped patio parasols side by side — left CORNER-domain with crisp crimson and cream stripes, right naive POINT-domain with the stripes smeared pink along the seams and the front red panel gone white, proving last-write-wins shear at shared vertices" /></a>
10731073
</td>
10741074
<td valign="middle">
10751075

@@ -1083,8 +1083,10 @@ vertex once per neighbor and the **last write wins** — the hub reads
10831083
palette[K−1], and the measured shear matches the palette closed form
10841084
(0.751031) exactly. Companion to
10851085
[`color-attribute-wheel`](examples/color-attribute-wheel/) (domain sizing,
1086-
`active_color`, the shader Attribute node). The broken state is in-frame:
1087-
the right pinwheel is the falsification variant.
1086+
`active_color`, the shader Attribute node). The render paints two striped
1087+
parasols with the same authoring functions. The broken state is in frame:
1088+
the right parasol's stripes smear along the seams and one crimson panel
1089+
turns cream.
10881090

10891091
</td>
10901092
</tr>
2.2 KB
Loading

‎docs/gallery/attribute-domain-shear/index.html‎

Lines changed: 290 additions & 113 deletions
Large diffs are not rendered by default.
-12.1 KB
Loading

‎docs/gallery/index.html‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -783,11 +783,11 @@ <h2><a href="car-mirror-symmetry/">car-mirror-symmetry</a></h2>
783783
</article>
784784
<article class="card" data-tags="attributes mesh rendering">
785785
<a class="card-media" href="attribute-domain-shear/" tabindex="-1" aria-hidden="true">
786-
<img src="assets/attribute-domain-shear-hero.webp" alt="Two rainbow pinwheels on wooden sticks, well apart: CORNER on the left with crisp coloured petals, POINT, last write wins, on the right with colours smeared across the hub." loading="lazy" decoding="async" />
786+
<img src="assets/attribute-domain-shear-hero.webp" alt="Two striped patio parasols labelled CORNER and POINT: the left has crisp crimson and cream stripes, the right has stripes smeared pink along the seams and a front panel turned cream." loading="lazy" decoding="async" />
787787
</a>
788788
<div class="card-body">
789789
<h2><a href="attribute-domain-shear/">attribute-domain-shear</a></h2>
790-
<p class="teaches">POINT vs CORNER color-attribute domains on a shared-vertex pinwheel: CORNER stays exact per face while a naive per-wedge POINT loop shears to the last write at the hub. Crisp petals versus a smeared swirl in one frame; the measured shear equals the palette closed form.</p>
790+
<p class="teaches">POINT vs CORNER color-attribute domains on a shared-vertex fan: CORNER stays exact per face while a naive per-wedge POINT loop shears to the last write at the hub. A striped parasol keeps crisp stripes under CORNER and smears, with one panel turned the wrong color, under POINT; the measured shear equals the palette closed form.</p>
791791
<p class="witnesses"><span class="tag">witnesses</span> Authoring per-face colors into a POINT-domain attribute overwrites shared vertices once per neighbor; the last write wins and intended colors shear across every shared vertex.</p>
792792
<a class="card-link" href="attribute-domain-shear/">View example<span class="sr-only"> attribute-domain-shear</span> <span aria-hidden="true">&rarr;</span></a>
793793
</div>

‎examples/attribute-domain-shear/README.md‎

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,20 +38,36 @@ naive from correct (exit 7). Sizes wrong for the declared domain (exit 3).
3838
**Version witness:** output is byte-identical on Blender 4.5.11 LTS and
3939
5.1.2 — the `color_attributes` domain API is stable across both.
4040

41-
**Render as proof:** dual pinwheel from the same closed-form palette the
42-
check asserts. CORNER (left) holds eight crisp petals to the hub; naive
43-
POINT (right) smears — petal colors bleed across the shared hub and ring
44-
verts into a swirl. The broken state is in-frame by design: the right fan
45-
*is* the falsification variant. Fully matte petal materials
46-
(`Specular IOR Level = 0`) so the flat color data carries no specular line,
47-
per `docs/VISUAL-STYLE.md`.
48-
49-
The staging is render-only and does not touch the checked mesh. The two
50-
stands are 2.72 m apart so their canopies read as two objects; at 2.30 m the
51-
petal tips met at the centre of the frame. Each stand's wooden stick runs from
52-
just below the floor into the hub it carries, both ends derived from the
53-
stand's tilt. The old dark steel stick stopped 0.6 m short of the hub, under
54-
the canopy, and disappeared into the stage.
41+
**Render as proof:** two striped patio parasols, painted by the same two
42+
authoring functions the check asserts. The canopy is the check's fan grown
43+
into fabric: eight gores around **one shared apex vertex**, each gore a strip
44+
of faces whose vertices all sit on the two seams it shares with its
45+
neighbours, so the naive loop touches exactly the kind of shared vertex the
46+
check measures. CORNER (left) keeps crisp crimson and cream stripes. Naive
47+
POINT (right) rewrites every seam and the apex with the later gore's color:
48+
the stripes smear pink along the seams, and gore 0, crimson by intent,
49+
renders cream because its seam and the apex were last written by gore 7.
50+
That gore is turned to face the camera. The broken state is in frame by
51+
design: the right parasol *is* the falsification variant. The canopy fabric
52+
is fully matte (`Specular IOR Level = 0`) so the flat color data carries no
53+
specular line, per `docs/VISUAL-STYLE.md`.
54+
55+
The render uses a two-tone palette (crimson and cream, alternating). It is
56+
not the check's palette. The check keeps its eight distinct hues because an
57+
off-by-two ordering bug would pass unnoticed under a period-2 palette. A
58+
parasol reads as broken only when stripes everyone expects to be crisp go
59+
soft. Both palettes go through the same `assign_corner` and
60+
`assign_point_naive`. Those functions take a `faces_per_wedge` stride
61+
(gore-major face order). It is 1 on the check's fan, so the check's writes
62+
are unchanged, and its output is identical before and after.
63+
64+
The staging is render-only and does not touch the checked mesh. Each parasol
65+
is eight named parts with five materials: canopy, aluminium ribs and
66+
stretchers, brass runner, finial and tilt knuckle, teak upper and lower pole,
67+
and a cast-iron base. The canopy tilts 24 degrees toward the camera about the
68+
knuckle so the whole top reads. One bold label stands in front of each base.
69+
The render path runs the framing gate (exit 10) and the asset-quality floors
70+
on one parasol (exit 11).
5571

5672
## Run
5773

@@ -65,7 +81,7 @@ blender --background --python attribute_domain_shear.py -- --output shear.png --
6581
## Exit codes
6682

6783
Per-script sequential checks. `9` is a valid check code; there is no rule
68-
against it. `10` is the shared framing helper.
84+
against it. `10` is the shared framing helper and `11` the shared asset-quality helper.
6985

7086
| Code | Meaning |
7187
| --- | --- |
@@ -79,6 +95,7 @@ against it. `10` is the shared framing helper.
7995
| 7 | Measured shear off palette closed form, or ~0 |
8096
| 9 | `--output` produced no file |
8197
| 10 | Gallery framing violation |
98+
| 11 | Asset-quality floor violation (render path only) |
8299

83100
The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS
84101
(5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch).

0 commit comments

Comments
 (0)