Skip to content

fix(examples): redesign gn-instance-grid as a 3x3 macropad key field - #278

Merged
TMHSDigital merged 3 commits into
mainfrom
fix/hero-gn-instance-grid
Sep 26, 2026
Merged

TMHSDigital merged 3 commits into
mainfrom
fix/hero-gn-instance-grid

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

What changed and why

The gallery review called the gn-instance-grid hero programmer art: nine bare lime cubes on a 3x3 grid joined by thin lattice lines.

The Geometry Nodes tree now instances a modeled DSA-profile keycap instead of a Mesh Cube. The keycap is six rounded-rectangle rings with a dished top and a sharp foot ring, read in through Object Info in original space. The realized grid becomes the key field of a cobalt 3x3 macropad. The recessed well, switch housings, knurled brass knob with an emissive pointer, and OLED level meter are render-only bmesh staging. A second Set Material, selected by a per-face position field, puts an orange accent on the front-right "enter" key. There are no floor labels.

Tree: Mesh Grid → Instance on Points (Object Info keycap) → Realize Instances → Transform → Set Shade Smooth → Set Material → Set Material (position-field selection). It is still generative, with no Group Input.

Check changes: same strictness plus one new gate

Exit Gate
3 carrier = 1 vertex (unchanged)
4 evaluated topology = 9 × 121 = 1089 verts / 1089 faces. The counts are closed-form, derived from CAP_RINGS/CORNER_SEGS and not measured off the mesh. This gate now runs first, and --one-cell still lands here.
5 the corner (+x,+y) cell holds exactly one keycap (121 verts)
6 Keycap.PBT and Keycap.Accent both carried by Set Material
7 corner keycap bbox centre on its grid point (1.2, 1.2), and z-range = Transform lift 0.22 .. 0.22 + cap top
9 new: the accent selection covers exactly one keycap (121 faces) centred at (1.2, −1.2)
10 / 11 render path: framing / asset-quality gates (newly wired here)

The README now says the realize count is numeric in the render, because instances draw the same either way. The render does show the grid (--one-cell leaves one keycap in an empty well) and where the accent selection landed.

Evidence

Before/after contact sheet: docs/gallery/contact-sheets/gn-instance-grid-contact-sheet.webp
Asset sheet: docs/gallery/asset-sheets/gn-instance-grid.webp. I added a SELECT row ^Macropad\. to scripts/asset_sheet.py. It keeps the hidden keycap source so Object Info still resolves.

Framing (5.2.1): fill x = 0.566, y = 0.828 (in band). Margins: left 0.209, right 0.225, bottom 0.056, top 0.117. framing_ok.
Asset floors: no default names; materials n = 8 (dominant 0.22); edge90 = 0.141; compactness 14.6 (informational). aq_ok.

Contact sheet, per criterion:

  • Mean luma: 0.2534 (calibration: armature-bend 0.2787, damped-track-aim 0.1511, bmesh-gear 0.2358). Within the set.
  • Stage darkness: stage 0.1865, between damped-track-aim at 0.1448 and armature-bend at 0.2132. Pass.
  • Wedge warmth: +0.18, warm, in the family of damped-track-aim at +0.28 and bmesh-gear at +0.30. The camera is high, so less of the back wall shows; the pool is softer but warm. Pass.
  • Subject fill: 0.83 in y. Pass.
  • Saturation: 0.2256 (calibration 0.14–0.25), from the cobalt case, orange key and cyan OLED. Pass.
  • Thumbnail legibility: at 427x240 it reads at once as a macropad with nine keys and one orange key. Pass.

Asset-sheet verdict: in the lineup (hydrant, drone, well, wheelbarrow, apothecary shelf), the macropad is not the least-designed object. It has named parts, 8 materials, rolled and chamfered edges, knurling and a dished keycap profile.

Hero drift: measure_hero_drift.py --only gn-instance-grid gives mean_abs 0.00323, which it reports as matches.

Check runs (local)

Binary Reported version check --one-cell --output render path
.scratch/blender-5.2.1-windows-x64/blender.exe Blender 5.2.1 LTS (9e2066aef7ef) 0 4 0 (framing + aq pass)
.scratch/blender-5.1.2-windows-x64/blender.exe Blender 5.1.2 (ec6e62d40fa9) 0 4 0
.scratch/blender-4.5.11-windows-x64/blender.exe Blender 4.5.11 LTS (4db51e9d1e1e) 0 4 0

Check output on all three: eval_verts=1089 eval_faces=1089 corner=(1.20,1.20,z 0.22..0.85) accent=121f@(1.20,-1.20).

Falsifiers (5.2.1; each patched on a scratch copy, then discarded)

Probe Exit Measured error
carrier gets 2 verts 3 carrier should have 1 vertex, got 2
Realize Instances bypassed 4 verts=0 faces=0 != 1089/1089
keycap built with 3 corner segs, formula unchanged 4 verts=873 faces=873 != 1089/1089
--one-cell (all binaries) 4 verts=121 faces=121 != 1089/1089
key field shifted +0.3 in x (counts intact) 5 corner cell holds 165 verts, expected one keycap (121)
plastic Set Material dropped 6 materials=[None, 'Keycap.Accent']
Transform lift 0.30 instead of 0.22 7 corner keycap z-min=0.3000 != 0.2200
accent y threshold flipped (selects two keys) 9 242 faces centred at (1.200,-0.600)

Proven by live run

  • The check, --one-cell and the render path on 5.2.1, 5.1.2 and 4.5.11 (table above).
  • All falsifier probes above (5.2.1).
  • Framing and asset floors; hero and preview via render_hero.py; contact sheet; asset sheet; drift; build_gallery.py re-run after rebasing on origin/main.
  • Generated <img alt> read in docs/gallery/index.html and docs/gallery/gn-instance-grid/index.html.

Established by inspection only

  • The claim that an unrealized grid renders the same, since the renderer draws instances either way. I did not render this; it is stated in the README as the reason the count gate is numeric.
  • CI smoke on 4.5.x/5.2.x floating point releases has not run yet.

🤖 Generated with Claude Code

The gallery review judged the hero programmer art: nine bare lime cubes on
a 3x3 grid joined by thin lattice lines.

The tree now instances a modeled DSA-profile keycap (six rounded-rectangle
rings, a dished top, sharp foot ring) read in through Object Info, so the
realized grid is the key field of a cobalt macropad: recessed well, switch
housings, knurled brass knob and an OLED meter (render-only staging). A
second Set Material, selected by a per-face position field, puts an orange
accent on the front-right key. No floor labels.

The check stays exactly as strict and gains a gate. Topology expectations
are derived from the keycap's construction parameters (9 x 121 = 1089
verts, 1089 faces). The count gate now runs first (exit 4, where
--one-cell still lands); the corner-cell gate (exit 5) asserts one whole
keycap in the corner cell; the corner position gate (exit 7) checks bbox
centre and the Transform lift; new exit 9 asserts the accent selection
covers exactly one keycap at the front-right grid point. The render path
adds the framing (10) and asset-quality (11) gates.

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 and others added 2 commits September 25, 2026 23:21
Union of asset-sheet SELECT rows; generated gallery pages regenerated.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Signed-off-by: TMHSDigital <[email protected]>
Union of asset-sheet SELECT rows; generated gallery pages regenerated.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Signed-off-by: TMHSDigital <[email protected]>
@TMHSDigital
TMHSDigital merged commit 3870094 into main Sep 26, 2026
11 checks passed
@TMHSDigital
TMHSDigital deleted the fix/hero-gn-instance-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