Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1069,7 +1069,7 @@ evaluation). Break the mirror and the render is literally half a car.
</tr>
<tr>
<td width="46%" valign="middle">
<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>
<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>
</td>
<td valign="middle">

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

</td>
</tr>
Expand Down
Binary file modified docs/gallery/assets/attribute-domain-shear-hero.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
403 changes: 290 additions & 113 deletions docs/gallery/attribute-domain-shear/index.html

Large diffs are not rendered by default.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions docs/gallery/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -783,11 +783,11 @@ <h2><a href="car-mirror-symmetry/">car-mirror-symmetry</a></h2>
</article>
<article class="card" data-tags="attributes mesh rendering">
<a class="card-media" href="attribute-domain-shear/" tabindex="-1" aria-hidden="true">
<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" />
<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" />
</a>
<div class="card-body">
<h2><a href="attribute-domain-shear/">attribute-domain-shear</a></h2>
<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>
<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>
<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>
<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>
</div>
Expand Down
47 changes: 32 additions & 15 deletions examples/attribute-domain-shear/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,20 +38,36 @@ naive from correct (exit 7). Sizes wrong for the declared domain (exit 3).
**Version witness:** output is byte-identical on Blender 4.5.11 LTS and
5.1.2 — the `color_attributes` domain API is stable across both.

**Render as proof:** dual pinwheel from the same closed-form palette the
check asserts. CORNER (left) holds eight crisp petals to the hub; naive
POINT (right) smears — petal colors bleed across the shared hub and ring
verts into a swirl. The broken state is in-frame by design: the right fan
*is* the falsification variant. Fully matte petal materials
(`Specular IOR Level = 0`) so the flat color data carries no specular line,
per `docs/VISUAL-STYLE.md`.

The staging is render-only and does not touch the checked mesh. The two
stands are 2.72 m apart so their canopies read as two objects; at 2.30 m the
petal tips met at the centre of the frame. Each stand's wooden stick runs from
just below the floor into the hub it carries, both ends derived from the
stand's tilt. The old dark steel stick stopped 0.6 m short of the hub, under
the canopy, and disappeared into the stage.
**Render as proof:** two striped patio parasols, painted by the same two
authoring functions the check asserts. The canopy is the check's fan grown
into fabric: eight gores around **one shared apex vertex**, each gore a strip
of faces whose vertices all sit on the two seams it shares with its
neighbours, so the naive loop touches exactly the kind of shared vertex the
check measures. CORNER (left) keeps crisp crimson and cream stripes. Naive
POINT (right) rewrites every seam and the apex with the later gore's color:
the stripes smear pink along the seams, and gore 0, crimson by intent,
renders cream because its seam and the apex were last written by gore 7.
That gore is turned to face the camera. The broken state is in frame by
design: the right parasol *is* the falsification variant. The canopy fabric
is fully matte (`Specular IOR Level = 0`) so the flat color data carries no
specular line, per `docs/VISUAL-STYLE.md`.

The render uses a two-tone palette (crimson and cream, alternating). It is
not the check's palette. The check keeps its eight distinct hues because an
off-by-two ordering bug would pass unnoticed under a period-2 palette. A
parasol reads as broken only when stripes everyone expects to be crisp go
soft. Both palettes go through the same `assign_corner` and
`assign_point_naive`. Those functions take a `faces_per_wedge` stride
(gore-major face order). It is 1 on the check's fan, so the check's writes
are unchanged, and its output is identical before and after.

The staging is render-only and does not touch the checked mesh. Each parasol
is eight named parts with five materials: canopy, aluminium ribs and
stretchers, brass runner, finial and tilt knuckle, teak upper and lower pole,
and a cast-iron base. The canopy tilts 24 degrees toward the camera about the
knuckle so the whole top reads. One bold label stands in front of each base.
The render path runs the framing gate (exit 10) and the asset-quality floors
on one parasol (exit 11).

## Run

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

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

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

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