Skip to content

fix: shipping-crate, shape-key-blend and vse-linear-modifiers quality pass - #231

Merged
TMHSDigital merged 4 commits into
mainfrom
fix/quality-pass-crate-shapekey-vse
Sep 23, 2026
Merged

TMHSDigital merged 4 commits into
mainfrom
fix/quality-pass-crate-shapekey-vse

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

Quality pass: three items, one per track. Everything below comes from live runs on .scratch/blender-{4.5.11,5.1.2,5.2.1}-windows-x64/blender.exe, which report 4.5.11 LTS / 5.1.2 / 5.2.1 LTS, unless it is labelled inspection. Baselines were taken on the pristine tree before any edit.

A — showcase/shipping-crate

Took 2 inspection rounds: r0 found the defects, r1 confirmed the fixes, and a third wasn't needed. Each round covered six orthos, two three-quarters, clay, wireframe, 8 close-ups (corner strap, strap top, handle, handle plate, lid, long slats, skid end, skid mid) and ground contact.

Defects

  1. Each iron L-strap was two unbevelled boxes, with a visible seam line down the outer corner (corner-strap close-up) and razor edges. Each plate's inner face also sat flush on the post face: two shells on one plane. The centre-matched z-fight budget cannot see coplanar faces whose centres differ.
  2. The straps carried no fasteners (all close-ups).
  3. The handle mounting plates straddled the gap between two end boards, so the handle was bolted to air (handle-plate close-up). The handle height was a fixed 52% of post height, which the plank layout put on a gap.
  4. Every plank was the same flat salmon tone (three-quarters).
  5. The temp .glb export leaked into the working directory.

Fixes, and why each is structural (patterns from crate-stack, #227, copied not imported)

  • 1: add_strap builds one L-section extrusion per corner that bites IRON_BITE into the post. The straps and the mounting plates are chamfered at IRON_BEVEL with material=METAL_IDX.
  • 2: add_nail places 3 stations × 2 plates × 4 corners = 24 frustum nails from each plate's own outer face and normal.
  • 3: the handle snaps to the centre of the end board nearest mid-height, taken from the same _span_layout the boards are built from, so it follows any plank count or jitter change.
  • 4: paint_planks writes PlankTone and GrainDir face attributes for the grain-along-the-board shader, and the iron gets rust wear.
  • 5: the export is removed after it is measured.

New budgets. Measured identically on 4.5.11, 5.1.2 and 5.2.1.

Budget Band Measured
Nail seat (exit 18) 24 nails; bite 0.3–1.0 mm, head ≥ 1.0 mm proud 24; 0.60 mm; 1.80 mm
Handle plates on one board (exit 20) each plate inside a single end board, ≥ 4 mm clear of both edges 4 plates; 32.4 mm

Re-fitted around the measurements: base tris 1200–2800 → 2900–3900, iron face floor 48 → 600, wood 200 → 900. The hygiene set stays all zero.

The crate-stack right-angle-edge budget is not applied here. The handle bail's pipe ends are square discs buried in the mounting plates, so "every box chamfered" doesn't hold for this piece.

Triangles: 2508 → 3388. Collider 76 → 116 (ceiling 220). LOD2 now matches across versions (744). Same-binary determinism: two runs on 5.2.1 match on every measured line.

Falsifiers, the same exit on all three binaries:

  • --float-nails → 18: bite −0.90 mm.
  • --straddle-handle → 20: the handle is put on a board gap, clearance −26.9 mm.

tests/check_falsifier_targets.py passes (188).

Existing exit codes, before → after, identical on all three binaries: default 0→0, --skip-decimate 9→9, --lift-z 16→16, --stray-vert 15→15, --short-skids 16→16, --float-handle 17→17, --omit-slats 18→18.

Hero re-rendered on 5.2.1 through scripts/render_hero.py. check_framing runs without deviation=: fill y 0.728, min margin 0.089. Contact sheet: docs/gallery/contact-sheets/shipping-crate-contact-sheet.webp. Luma 0.176, inside the band.

B — examples/shape-key-blend

Presentation change (render path only): pale wire cages of the checked block's own Basis and full Tall key now sit over it, so the 0.5-blend solid visibly sits halfway to its full key. That is the closed form the check asserts; before, the still read as three purple boxes of different sizes. The camera and aim moved to hold the taller cage in frame. The cages are render-only mesh copies with their own key value; obj is untouched.

Contract unchanged. Before → after, identical on 4.5.11, 5.1.2 and 5.2.1: default 0 → 0, --zero-blend 5 → 5.

Framing: like gn-sdf-remesh (#229), this example's render path has no check_framing call. Adding one would add exit 10 to its table, so it was measured externally instead (.scratch probe: the example's own main() with --output, then gallery_framing.check_framing). The first reframe clipped the cage (exit 10 in the probe); the final one measures fill x 0.778, min margin 0.061, code 0. Contact sheet: docs/gallery/contact-sheets/shape-key-blend-contact-sheet.webp, luma 0.236.

C — examples/vse-linear-modifiers

Documentation correction. The README and docstring said "the 5.2 removal of Sequence.use_linear_modifiers". bpy.types.Sequence does not exist on 4.5.11, 5.1.2 or 5.2.1. The attribute is defined on Strip, with class chain ColorStrip → EffectStrip → Strip.

This is a stale identifier. The documented behaviour (present and settable on 4.5 and 5.1, AttributeError on 5.2) re-verified correct, so this is a naming fix, not a reversed claim.

README improvements:

  • Who hits this: includes the exact 5.2.1 error text, confirmed against the run log.
  • RNA facts: the description string and the False default.
  • No replacement: on 5.2.1 no linear-named property exists on Strip or on the strip modifier. The README claims only that the switch is gone from RNA, not how 5.2 picks the colour space.
  • Re-verified table, with the falsifier-exits-0-by-design note.
  • API links: current, plus 4.5 Strip.use_linear_modifiers.
  • A side observation: on 5.1.2 in background mode, strip.modifiers.new(type="COLOR_BALANCE") on a COLOR strip crashes Blender (EXCEPTION_ACCESS_VIOLATION); 4.5.11 and 5.2.1 are fine. It is outside this example's contract; the example never adds a modifier.
Measurement 4.5.11 5.1.2 5.2.1
bpy.types.Sequence absent absent absent
use_linear_modifiers defined on Strip Strip removed
default / --assume-present exit 0 / 0 0 / 0 0 / 4

Assertions and exit codes are unchanged.

Also

  • showcase/README.md convention: fixtures are mounted on one board, snapped from the board layout, with a clearance budget.
  • Follow-up now covers two examples: gn-sdf-remesh and shape-key-blend both lack check_framing in their render paths.

🤖 Generated with Claude Code

TMHSDigital and others added 4 commits September 23, 2026 12:12
… handles on a board

Each strap was two unbevelled boxes flush on the post; it is now one
chamfered L-section biting into the post, nailed (seat budget, exit 18,
--float-nails). Handle mounting plates straddled an end-board gap; the
handle now snaps to the nearest board's centre and a budget asserts each
plate sits inside one board (exit 20, --straddle-handle). Per-plank tone
and grain. The temp glTF export is removed after measuring.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
… key endpoints

Render path only. The check, its assertions and exit codes are unchanged.
docs/gallery/index.html also carries the shipping-crate card alt.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
… Sequence type

Docstring and README only; assertions and exit codes unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
@TMHSDigital TMHSDigital added the needs-5.1 Opt-in Blender 5.1 smoke on this PR. Default matrix stays 4.5 + 5.2. Auto-label will not apply this. label Sep 23, 2026
@github-actions github-actions Bot added examples Runnable smoke-gated examples under examples/ showcase Budget-conformance props under showcase/ documentation Improvements or additions to documentation labels Sep 23, 2026
@TMHSDigital
TMHSDigital merged commit 44ca4bb into main Sep 23, 2026
14 checks passed
@TMHSDigital
TMHSDigital deleted the fix/quality-pass-crate-shapekey-vse branch September 23, 2026 16:19
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/ needs-5.1 Opt-in Blender 5.1 smoke on this PR. Default matrix stays 4.5 + 5.2. Auto-label will not apply this. showcase Budget-conformance props under showcase/

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant