Skip to content

fix(examples): redesign gp-lineart-contour as an inked lighthouse diorama - #279

Merged
TMHSDigital merged 1 commit into
mainfrom
fix/hero-gp-lineart-contour
Sep 26, 2026
Merged

TMHSDigital merged 1 commit into
mainfrom
fix/hero-gp-lineart-contour

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

What and why

The gallery review judged the gp-lineart-contour hero weak: a single teal octahedron with a cyan outline on a small black stand. It was a lone primitive, not a designed subject.

Redesign: the Line Art source is now one cel-shaded mesh, a lighthouse diorama:

  • a banded red and white tapered tower with a door and lit windows
  • a gallery deck with railing posts, a lantern room with mullions, a roof and a vent ball
  • a keeper's cottage with a pitched roof, chimney, door and windows
  • a rowboat hauled up on the faceted rocks
  • a round diorama sea with white wave crests

The materials are flat toon tones (Diffuse → Shader to RGB → constant ramp, emitted), so the bold black LINEART ink is what makes the render read as an inked comic illustration:

  • material-border ink between the tower bands
  • intersection ink at the waterline around every rock
  • crease ink on the rock facets
  • contour ink on every silhouette

The render is the proof. With source_object cleared, the same render (made by the scratch probe .scratch/broken.py, not committed) is a flat lineless low-poly model. There are no band borders, no waterline and no outlines. The difference is obvious at thumbnail size.

Stage deviation (documented in README): this is an NPR contract, so the hero materials are cel-shaded emission instead of Principled. The floor, wall, world, key, fill and warm wedge are the default stage. The cel look uses Shader to RGB, which is EEVEE-only.

Asset-sheet gate: not run. This is an NPR / art subject in the rendering section, not a game-prop or kit example, and scripts/asset_sheet.py has no SELECT row for it.

Check changes (stricter, not weaker)

  • One camera for the check and the still. Line Art is view-dependent, so the counts the check gates are exactly the strokes the still draws.

  • Stroke and point gates. They went from >= 1 stroke / >= 4 points to >= 240 strokes / >= 1320 points. The measured drawing is 255 / 1393 on all three binaries. Dropping any one edge type leaves:

    • contour: 234 strokes
    • crease: 171 / 1099
    • material borders: 247 / 1305
    • intersections: 179 / 921

    Every one of those falls below a gate, so each edge type is load-bearing on the count.

  • Flags-off probe. It now turns off every edge type (contour, crease, loose, intersection, material, edge mark), not only contour and crease. The result must still be 0.

  • Restore. The rebuilt modifier must recover the exact first-pass counts, not just clear the lower bound.

  • Width. radius is 0.021, and the 4.5 thickness is 22. The thickness/radius version-branch check is unchanged.

Gate numbers (5.2.1)

  • Framing: fill x=0.475 y=0.844 (band 0.70–0.90) ok; margins left=0.275 right=0.250 bottom=0.050 top=0.106 ok
  • Hero drift: mean_abs 0.00334, verdict matches
  • Contact sheet:
tile luma stage warmth sat
gp-lineart-contour (candidate) 0.1995 0.1790 -0.1435 0.1650
armature-bend 0.2787 0.2132 -0.4279 0.1436
damped-track-aim 0.1511 0.1448 +0.2772 0.2305
bmesh-gear 0.2358 0.1772 +0.3027 0.2495

Verdicts:

  • Stage darkness: pass. Luma 0.200 is inside the calibration range 0.151–0.279. Under the NPR deviation, luma is information only.
  • Wedge warmth: pass. The warm pool is visible top-right behind the tower. The tile's warmth metric is negative because of the blue sea, the same as armature-bend's teal.
  • Subject fill: pass, 0.844 vertical.
  • Saturation: pass. Saturated red, teal and blue.
  • Thumbnail legibility: pass. At 427×240 it reads instantly as an inked lighthouse.

The render is NPR, but it does not look like it belongs to a different gallery: it keeps the same dark stage and the same wedge.

Check runs

binary (path under E:\Blender-Developer-Tools\.scratch\) reports result
blender-5.2.1-windows-x64\blender.exe 5.2.1 LTS PASS: 255 strokes / 1393 points, nosource 0, noflags 0, restored 255/1393
blender-5.1.2-windows-x64\blender.exe 5.1.2 PASS: same counts
blender-4.5.11-windows-x64\blender.exe 4.5.11 LTS PASS: same counts, thickness=22

tests/smoke/run_example.py passed on all three binaries.

Falsifiers (5.2.1; each was a temporary copy of the script, deleted afterwards)

probe measured error exit
--no-contour use_contour should be True 4
use_material=False in the configured modifier strokes=247 points=1305 (need >= 240, >= 1320) 5
source "clear" writes the saved source back cleared source_object still produced strokes=255 points=1393 6
flags-off leaves every type but material borders on every edge type off still produced strokes=247 points=1305 7
rebuild with use_intersection=False did not recover after restore: strokes=179 points=921 (first pass 255/1393) 7

Proven by live run vs established by inspection only

Proven by live run:

  • all check runs on the three binaries and the smoke runner PASS
  • every falsifier above
  • the per-edge-type counts
  • the framing gate
  • render_hero.py, contact_sheet.py and measure_hero_drift.py (matches)
  • build_gallery.py, including the alt-length gate
  • the broken-state (source_object cleared) render compared with the hero

Established by inspection only:

  • the generated <img alt> text in docs/gallery/index.html and docs/gallery/gp-lineart-contour/index.html (read, correct)
  • the contact-sheet verdicts are an eye judgement
  • CI's floating 4.5.x and 5.2.x point releases have not been run locally

🤖 Generated with Claude Code

…rama

The gallery review judged the hero weak: a lone teal octahedron with a cyan
outline on a small black stand, a primitive rather than a designed subject.

The source is now one cel-shaded mesh (a banded lighthouse with gallery,
railing, lantern room and roof, a keeper's cottage, a rowboat on the rocks
and a diorama sea with wave crests), so the black Line Art ink is what turns
it into an inked illustration. Clear source_object and the same render is a
flat model with no lines at all, so the render witnesses the contract.

The check and the still now share one camera (Line Art is view-dependent).
The gates went from >= 1 stroke / >= 4 points to >= 240 / >= 1320 against a
measured 255 / 1393 on 4.5.11, 5.1.2 and 5.2.1. That sits above the count left
when any one of contour, crease, material-border or intersection edges is
dropped, so every edge type is load-bearing. The flags-off probe now turns
off every edge type, and the rebuild must recover the exact first-pass
counts. The README documents the NPR stage deviation (cel-shaded emission
materials on the default stage).

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 e0298c4 into main Sep 26, 2026
11 checks passed
@TMHSDigital
TMHSDigital deleted the fix/hero-gp-lineart-contour 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