Skip to content

fix(examples): restage swatch-grid as a tiered material library with a glowing emissive - #259

Merged
TMHSDigital merged 1 commit into
mainfrom
fix/hero-swatch-grid
Sep 26, 2026
Merged

TMHSDigital merged 1 commit into
mainfrom
fix/hero-swatch-grid

Conversation

@TMHSDigital

@TMHSDigital TMHSDigital commented Sep 26, 2026 •

Copy link
Copy Markdown
Owner

What changed and why

The gallery review flagged swatch-grid, the gallery's first card. Its emissive sphere rendered as a flat, clipped orange disk: a bare Emission at strength 1.4 clips the red channel across the whole face under Standard, which Layer 1 forbids. The other five spheres were bare spheres against a wall and read as generic at thumbnail size.

  • Emission reads as a glowing object with form. The same asserted ShaderNodeEmission (color (1.0, 0.35, 0.05)) now runs at strength 0.95, so no channel reaches 1.0. It owns the face toward the camera, and a Layer Weight facing ramp hands it over to a dark dielectric shell at the silhouette, which gives the globe a limb. A shadowless warm point light at its center adds the glow on its own collar, its plinth and the floor. The shell is lit from inside only on back faces, so the ball itself still shows only the asserted emission. Emission is created first, so swatch_rgb and --same-base still read and flatten it.
  • Designed swatch display. Each sphere now sits in a gunmetal collar on a bevelled graphite plinth (flat caps, sharp cap seams, smooth walls). The back row stands on tall plinths in a two-tier library layout on the default stage (floor, wall at y=9, warm key, cool fill and rim, and a warm wedge pooling on the floor behind the display). A 50 mm TRACK_TO camera keeps the floor/wall seam above the back row.
  • verify_png follows the layout. Before, it sampled the center of each image third. Now it projects each swatch center through the render camera (world_to_camera_view), with the patch scaled to the render width. It also prints the per-swatch patch means and the closest pair distance.
  • Nothing else changed: all six asserted materials and colors, --same-base, the engine-id witness, and the exit codes.

Before / after

Gate numbers (5.2.1 LTS, EEVEE, 1280x720)

  • Framing: fill x=0.725, y=0.767 (band 0.70–0.90); margins L 0.138, R 0.137, B 0.061, T 0.172 (min 0.02). framing_ok.
  • Clipping: 0.33 % of pixels have any channel at 255. All of it is small specular glints: the key's reflection on the mirror gold and the rim/key catch on the copper's top. There is no clipping on the emissive globe (patch mean 0.97/0.61/0.24).
  • Contact sheet vs calibration:
tile luma stage warmth sat
swatch-grid (candidate) 0.2516 0.1722 +0.2554 0.2162
armature-bend 0.2787 0.2132 -0.4279 0.1436
damped-track-aim 0.1511 0.1448 +0.2772 0.2305
bmesh-gear 0.3024 0.2357 +0.3743 0.1953

Verdicts:

  • Stage darkness: pass. Stage 0.172 sits inside the calibration range 0.145–0.236.
  • Wedge warmth: pass. +0.255 is warm, close to damped-track-aim.
  • Subject fill: pass. The display is 0.73/0.77.
  • Saturation: pass. 0.216 is within the calibration range.
  • Thumbnail legibility: pass. At 320x180 it reads as six distinct materials on stands, and the orange globe visibly glows.
  • Mean luminance: 0.252, between damped-track-aim and armature-bend.

Not sortable as the odd one out. This is not an asset-type example, so there is no asset-sheet gate.

  • Hero drift: measure_hero_drift.py --only swatch-grid gives mean_abs 0.0032, gt2pct 0.38 %, verdict matches.
  • Hero and preview came from render_hero.py (hero 25.9 KB, preview 23.9 KB).
  • build_gallery.py regenerated the pages. I read the generated <img alt> in docs/gallery/index.html and docs/gallery/swatch-grid/index.html, and it matches the new gallery.json alt in full.

Check runs (tests/smoke/run_example.py)

binary (reported version) check-only catalog render (--engine cycles --samples 8 --width 640) EEVEE --output 1280
E:\Blender-Developer-Tools\.scratch\blender-5.2.1-windows-x64\blender.exe (Blender 5.2.1 LTS) PASS PASS, 6 regions, closest 0.243 PASS, 6 regions
...\blender-5.1.2-windows-x64\blender.exe (Blender 5.1.2) PASS PASS, 6 regions, closest 0.240 PASS, 6 regions
...\blender-4.5.11-windows-x64\blender.exe (Blender 4.5.11 LTS) PASS PASS, 6 regions, closest 0.243 PASS, 6 regions (BLENDER_EEVEE_NEXT)

Falsifiers

  • --same-base (5.2.1): exit 3, distinct swatch colors 1 != 6. Unchanged.
  • The changed pixel check, verify_png with projected sampling. Probe: a scratch copy that flattens every swatch color to grey after the data check, so only the pixel check can catch it. Cycles 8 spp at 640 on 5.2.1: exit 3, distinct_regions=4, closest pair 0.057 (needs > 0.10). Restored, and the real script passes as above.

Proven by live run vs established by inspection only

Proven by live run:

  • Every row of the table above.
  • Both falsifiers.
  • The framing numbers, the contact-sheet metrics, the hero drift, and the build_gallery.py output with its generated alts.

By inspection only:

  • That the glow point light adds no light to the front of the emissive ball. This is reasoned from the geometry: the light sits inside a closed sphere with use_shadow=False, so it hits only back faces. I did not run a with/without A/B render to measure it.
  • specular_factor on the glow light only affects EEVEE. Cycles ignores it, and the smoke render is Cycles, which does not gate clipping.

🤖 Generated with Claude Code

…a glowing emissive

The gallery's first card rendered its emissive swatch as a flat, clipped
orange disk: a bare Emission at strength 1.4 clips the red channel across
the whole face under the Standard view transform, which Layer 1 forbids.
The rest of the card was six bare spheres against a wall, which read as
generic at thumbnail size.

The same asserted ShaderNodeEmission now owns the camera-facing face at
strength 0.95 (below clipping) and hands over to a dark dielectric shell
at the silhouette through a Layer Weight facing ramp, so the globe has a
limb; a shadowless point at its center throws its glow onto its own
collar, plinth and the floor. The spheres sit in gunmetal collars on
bevelled graphite plinths in two tiers on the default stage with a 50 mm
tracked camera.

verify_png now samples each swatch at its camera-projected center instead
of the center of an image third, so the six-region check follows the
layout. Every asserted material, the --same-base falsifier and the
engine-id witness are unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
@github-actions github-actions Bot added examples Runnable smoke-gated examples under examples/ documentation Improvements or additions to documentation labels Sep 26, 2026
@TMHSDigital
TMHSDigital merged commit 7c5c01e into main Sep 26, 2026
11 checks passed
@TMHSDigital
TMHSDigital deleted the fix/hero-swatch-grid branch September 26, 2026 23:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation examples Runnable smoke-gated examples under examples/

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant