Skip to content

fix(examples): redesign depsgraph-export as a controller cage beside its subdivided shell - #280

Merged
TMHSDigital merged 1 commit into
mainfrom
fix/hero-depsgraph-export
Sep 26, 2026
Merged

TMHSDigital merged 1 commit into
mainfrom
fix/hero-depsgraph-export

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

What and why

The gallery review called the depsgraph-export hero programmer art: a teal cube with a wire outline next to a wire-caged sphere, and the evaluated-vs-original story did not read.

Redesign: the checked object is now a game controller. Its shell is a 90-vertex quad control cage under a level-2 SUBSURF. The sticks, d-pad, face buttons, pills, home button and bumpers are modeled parts with no modifiers, seated on the evaluated limit surface by ray cast and parented to the shell. The still puts the shell datablock as the file stores it (orange wire, a bead on every cage vertex, faint blue facets) on the left, and the smooth cobalt controller the OBJ contains on the right. If the export shipped the base mesh, the right-hand piece would be the blocky cage. Both pieces lean on low satin display stands, which are render-only and added after the export. There are no labels.

The check is stricter, not weaker:

  • every mesh object is measured through evaluated_get().to_mesh() and paired with to_mesh_clear()
  • new exit 7: the evaluated shell must equal the Catmull-Clark closed form from its own cage topology. Per level V' = V+E+F, E' = 2E+S, F' = S, S' = 4F'. For this cage V=90, E=176, F=88, S=352, which gives 1410.
  • exit 5: OBJ v count == summed evaluated counts. This is 3666; the base meshes sum to 2346.
  • exit 3: the evaluated shell count is above the cage count.
  • the render path now also runs gallery_asset_quality (exit 11). scripts/asset_sheet.py gains its SELECT row (^Gamepad\.).

Before / after

Gates (5.2.1 LTS render path)

  • Framing: fill x=0.863 (band 0.70–0.90), y=0.539. Margins: left 0.069, right 0.069, bottom 0.256, top 0.206. framing_ok. The numbers are identical on 5.1.2 and 4.5.11.
  • Asset quality: no default names; 9 materials across 13 parts, dominant share 0.38; edge90 0.008; 0 degenerate faces; compactness 26.1 (information only). aq_ok.
  • Contact sheet (luma / stage / warmth / sat):
    • candidate: 0.2079 / 0.1650 / -0.059 / 0.221
    • armature-bend: 0.2787 / 0.2132 / -0.428 / 0.144
    • damped-track-aim: 0.1511 / 0.1448 / +0.277 / 0.231
    • bmesh-gear: 0.2358 / 0.1772 / +0.303 / 0.250
  • Contact-sheet verdicts:
    • Stage darkness: pass. It sits inside the calibration range.
    • Wedge warmth: pass. There is a warm pool on the back wall behind the pair, and the measure falls between the calibration images.
    • Subject fill: pass.
    • Saturation: pass (cobalt + orange, 0.221).
    • Thumbnail legibility: pass. At 427x240 it reads as "wire cage → smooth controller".
  • Asset sheet (vs collision-hull-proxy, socket-attach-points, vertex-color-ao, wheelbarrow, apothecary-shelf): the controller holds the lineup. It sits roughly level with the hydrant and is simpler than the drone and shelf, but it is not identifiable as the least-designed object. It has named parts, a two-tone shell, beveled controls and a dished stick cap.
  • Hero drift (measure_hero_drift.py --only depsgraph-export): mean_abs 0.00555, verdict matches.
  • tests/check_*.py (engine id, exit-code README, falsifier targets, gallery images, import/export rules): all pass.

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

Binary Reports Result --unevaluated
.scratch/blender-5.2.1-windows-x64/blender.exe Blender 5.2.1 LTS PASS (1410 == closed form; 3666 exported == evaluated) exit 5
.scratch/blender-5.1.2-windows-x64/blender.exe Blender 5.1.2 PASS (same counts) exit 5
.scratch/blender-4.5.11-windows-x64/blender.exe Blender 4.5.11 LTS PASS (same counts) exit 5

Falsifiers (5.2.1; scratch probe imports the script, breaks one thing, runs check())

Probe Result
--unevaluated (apply_modifiers=False) exit 5: export (2346) != evaluated (3666)
shell SUBSURF levels = 1 (closed form still at 2) exit 7: evaluated shell (354) != closed form (1410)
closed form drops the per-face term (V' = V + E) exit 7: evaluated shell (1410) != closed form (970)
SUBSURF show_viewport = False (depsgraph evaluates the bare cage) exit 3: shell_eval 90, not above V=90

All of these were restored by construction, because the probes never edit the script.

Proven by live run vs established by inspection

Proven by live run:

  • check-only PASS on all three binaries
  • --unevaluated exit 5 on all three
  • the three extra falsifiers on 5.2.1
  • framing and asset-quality gates on all three binaries
  • the hero and preview via render_hero.py on 5.2.1
  • the contact sheet and asset sheet
  • the drift check
  • build_gallery.py, and reading the generated <img alt> in docs/gallery/index.html and docs/gallery/depsgraph-export/index.html
  • tests/check_*.py

Established by inspection only:

  • CI's floating 4.5.x / 5.2.x point releases behave the same as the local binaries.
  • The Cycles --engine cycles path was not rendered.

🤖 Generated with Claude Code

…its subdivided shell

The gallery review called the hero programmer art: a teal cube with a wire
outline beside a wire-caged sphere, where the evaluated-vs-original story did
not read.

The checked object is now a game controller. Its shell is a 90-vertex quad
control cage under a level-2 SUBSURF modifier; sticks, d-pad, face buttons,
pills, home button and bumpers are modeled parts (no modifiers) seated on the
evaluated limit surface by ray cast and parented to the shell. The still
shows the shell datablock as the file stores it (orange wire, a bead per
vertex, faint blue facets) beside the smooth cobalt controller the OBJ
contains, both on low satin display stands. Tiny labels are gone.

The check got stricter, not weaker: every mesh is measured through
evaluated_get().to_mesh()/to_mesh_clear(), the evaluated shell must equal
the Catmull-Clark closed form from its own cage topology (new exit 7:
V=90 E=176 F=88 S=352 -> 1410), and the OBJ vertex count must equal the
summed evaluated counts (3666, versus 2346 base). The render path now also
runs the asset-quality floors (exit 11); asset_sheet.py gains its SELECT row.

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 d570163 into main Sep 26, 2026
11 checks passed
@TMHSDigital
TMHSDigital deleted the fix/hero-depsgraph-export 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