Skip to content

fix(examples): redesign sky-texture-sun-elevation hero as a sky-lit obelisk diptych - #263

Merged
TMHSDigital merged 1 commit into
mainfrom
fix/hero-sky-texture-sun-elevation
Sep 26, 2026
Merged

TMHSDigital merged 1 commit into
mainfrom
fix/hero-sky-texture-sun-elevation

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

What changed and why

The gallery review found that the sky-texture-sun-elevation hero broke Layer 1 in three ways:

  • The horizon band clipped to pure white under Standard.
  • The frame was a hard left/right split with a black void below the horizon.
  • The subject was a primitive cone.

The redesigned still is a sky study. A red-granite gnomon obelisk (stepped limestone plinth, bronze collar, bronze dedication plaque, matte-gilt pyramidion) stands on a brick-pattern limestone plaza with a bronze meridian scale inlaid along the shadow line. The ground runs to the horizon, so there is no void below it.

  • The sky is the only light. The sun disc is the key and the dome is the fill; there are no studio lights. Both panels use one Background Strength (0.035), so sun_elevation is the only variable. If it failed, the panels would be identical.
  • 8° panel: navy dusk, an orange glow on the left horizon, the obelisk's sun face raked orange, and a long shadow running out of frame.
  • 55° panel: bright blue midday, sunlit paving, and a short shadow ending on the meridian scale.
  • The split is deliberate: a 12 px dark rule between two 640×720 panels.
  • Materials: 5 designed materials (granite and limestone use noise-mixed tones; paving uses a Brick texture) on 8 named parts. Stage deviation (world/sky contract) is documented in the README.

New render-path gates (the check-only path and CI smoke are unchanged):

  • Framing: now wired through gallery_framing.check_framing for each panel (exit 10). The README's old "Framing deviation" is removed, and the helper's docstring no longer says this example skips it.
  • Clipped highlights: new exit 12 fails if more than 0.05 % of the still is at 8-bit full scale under Standard. The committed still has zero clipped pixels.

Two root causes found along the way:

  • sun_rotation is a compass bearing, clockwise from +Y. The first draft assumed the opposite and put the shadow on the wrong side; _sun_rotation_for_shadow now holds the measured mapping.
  • A metallic pyramidion Fresnel-glinted the 55° sun to white at grazing angles regardless of roughness, so the gilt is a matte dielectric.

Before / after

Contact sheet (committed): docs/gallery/contact-sheets/sky-texture-sun-elevation-contact-sheet.webp

Gate numbers (5.2.1)

Gate Result
Framing fill x 0.566 / y 0.794 (band 0.70–0.90)
Framing margins left 0.100, right 0.334, bottom 0.044, top 0.161 (min 0.02)
Clip fraction 0.000000 (gate ≤ 0.0005)
Panel mean luma 8° 0.112, 55° 0.294
Hero drift (measure_hero_drift.py) mean_abs 0.00368, luma 0.2015/0.2011, matches
Hero / preview size 36.9 KB / 34.1 KB

Contact-sheet verdicts. This is a stage deviation, so luminance is information only:

  • Mean luminance: 0.2015, between damped-track-aim (0.1511) and armature-bend (0.2787) / bmesh-gear (0.3024).
  • Stage darkness: 0.1875 against 0.145–0.236. The sky replaces the stage by design.
  • Wedge warmth: +0.20 (calibration −0.43 to +0.37). There is no wedge light; the warmth comes from the dusk glow and the sunlit plaza.
  • Saturation: 0.54, higher than the calibration set (0.14–0.23), driven by the blue sky.
  • Subject fill: in band.
  • Thumbnail legibility: passes. At 320 px, dusk versus midday reads instantly.
  • Overall: not sortable as a different gallery on materials, finish, view transform or framing.

Check runs (check-only path, tests/smoke/run_example.py --forbid-skip)

Binary Reported version Result
E:\Blender-Developer-Tools\.scratch\blender-5.2.1-windows-x64\blender.exe 5.2.1 LTS PASS: MULTIPLE_SCATTERING, zenith rise 2.2607
E:\Blender-Developer-Tools\.scratch\blender-5.1.2-windows-x64\blender.exe 5.1.2 PASS: MULTIPLE_SCATTERING, zenith rise 2.2546
E:\Blender-Developer-Tools\.scratch\blender-4.5.11-windows-x64\blender.exe 4.5.11 LTS PASS: NISHITA, zenith rise 1.4958

The --output render path also exits 0 on all three binaries with zero clipped pixels (4.5.11 panel luma 0.087 / 0.200).

Falsifiers (5.2.1)

  • Existing: --unlink-sky gives exit 6: world links broken (sky→bg=False, bg→out=True).
  • New clip gate: STILL_STRENGTH 0.035 → 0.05 in a temporary copy gives exit 12: clip fraction 0.020344 (8° panel 0.008019, 55° panel 0.033383), and no PNG is written. The copy was then removed.
  • Newly wired framing gate: camera moved from y −4.2 to −3.2 in a temporary copy gives exit 10: fill y 0.925, left and bottom margins 0.000. The copy was then removed.

Proven by live run vs established by inspection only

Proven by live run:

  • All three check-only runs above.
  • The render path on all three binaries.
  • The three falsifiers.
  • The framing and clip numbers.
  • render_hero.py, contact_sheet.py, measure_hero_drift.py and build_gallery.py.
  • The generated <img alt> in docs/gallery/index.html and docs/gallery/sky-texture-sun-elevation/index.html was read back.

Established by inspection only:

  • The aesthetic verdicts (the hero and a 320 px thumbnail were viewed).
  • That the meridian-scale inlay and plaque read as intended at full size.
  • CI (blender-smoke.yml) has not run yet; this PR relies on its run.

Not wired: gallery_asset_quality (exit 11). Per docs/VISUAL-STYLE.md it applies to asset-type examples, not world/sky subjects.

🤖 Generated with Claude Code

…belisk diptych

The gallery review found the old hero broke Layer 1. The horizon band
clipped to pure white under Standard, the frame was a hard split with a
black void below the horizon, and the subject was a primitive cone.

The still is now a sky study: a red-granite gnomon obelisk with a stepped
limestone plinth, bronze collar and plaque, and a matte-gilt pyramidion. It
stands on a brick-pattern plaza with a bronze meridian scale, and the ground
runs to the horizon. The sky is the only light. Both panels use one
Background Strength, so sun_elevation is the only variable between them:
8 deg is navy dusk with a horizon glow and a raked orange face, and 55 deg
is blue midday with a short shadow.

The render path now gates framing per panel through gallery_framing
(exit 10) and gates clipped highlights under Standard (new exit 12,
> 0.05 % of pixels). The committed still has zero clipped pixels. The
check-only path is unchanged, and the sky_type, dust/aerosol and zenith-rise
checks pass on 4.5.11, 5.1.2 and 5.2.1.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Signed-off-by: TMHSDigital <[email protected]>
@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 9dc334c into main Sep 26, 2026
11 checks passed
@TMHSDigital
TMHSDigital deleted the fix/hero-sky-texture-sun-elevation 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