You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 56b7825
Browse filesBrowse the repository at this point in the historyBrowse files
fix(showcase): hay-bale quality pass with five new hygiene budgets, and exit-pre-sidecar doc accuracy (#205)
* fix(showcase): hay-bale visual quality pass with five new hygiene budgets
The inspection sheet found nine defects that every shipped budget passed.
The belts were constant rectangles hung on a rounded, bulged loaf, so
they stood proud at the middle of each face, were swallowed at the
corners, and stopped 2.9-8.3 mm above the floor with a visible notch --
while the AABB zmin gate stayed green because the loaf grounded the box.
The two belts were 5.4 mm out of step because the loaf's ridge term was
odd in x. Nothing cinched: the waist measured 0.1 mm. All 426 faces were
smooth-shaded, which erased every ridge and nap and left a bar of soap.
Fixed structurally, not by nudging:
- Build, bevel and ground the loaf FIRST, then raycast its finished
cross-section per belt station and follow that profile at a named
bite. Moving a belt now moves its seat with it.
- Every closed-form shaping term is even in x (cos, not sin), so the two
stations sample identical surface heights.
- The cinch is derived from BELT_XS, and the ridge fades out under each
belt because twine compresses straw flat where it bites.
- Shading decided per part: flat loaf, smooth cord.
- Straw detail moved to the high mesh, where the bake stage already
exists to carry it onto the low mesh.
Five budgets so none of it can come back, all recomputed from the
generated mesh: cross-shell coplanar z-fight pairs (15), per-belt wrap
zmin (16), shell count (17), banded per-station belt seat depth (18),
belt mirror symmetry and cinch depth (19).
Four new falsifiers, each landing on the budget it targets, proven on
4.5.11, 5.1.2 and 5.2.1: --stray-vert 15, --float-belts 16,
--slack-belt 18, --skew-belt 19. --stray-vert parks its vertex inside
the bale because above it the bbox budget fired first; --skew-belt
shifts along X because a Z skew tripped the z-fight budget instead.
Also deletes the temp glTF once its size is measured: Blender's TMPDIR
resolves to the working directory on a portable build, so every run left
a .glb in the repo root.
Geometry is identical on all three binaries. The piece still reads as a
wrapped parcel rather than straw at hero scale; that is recorded in the
README as a material and bake problem, not a geometry one.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
* docs(exit-pre-sidecar): correct a false catalog claim and document the falsifiers
The module docstring told readers the catalog's min_version was 5.0 and
wrong. It has been 5.1 since the example's introducing commit, so the
note was never true and sent anyone who read it to "fix" a correct
catalog row.
Re-verified the version claim against all three binaries:
hasattr(bpy.app.handlers, "exit_pre") is False on 4.5.11 LTS and True on
5.1.2 and 5.2.1 LTS, and exit_pre is the only exit- or quit-related name
in bpy.app.handlers on the versions that have it -- so there is no older
spelling to fall back to. The documented behaviour is correct.
README also now:
- states the contract and why it matters (atexit is the bug class this
catches), with the 4.5 and 5.2 bpy.app.handlers API links
- explains that exiting 77 on 4.5 is correct by design, and what stops a
skip from spreading: min_version 5.1, the runner failing a skip above
the floor, and summarize.py reddening an all-skip job
- enumerates the falsifiers in a table with what each breaks, its script
exit and how the harness fails, and names --write-in-main and
--atexit-instead as the two an existence-only check would pass, which
is why the catalog row carries sidecar_contains
Contract, assertions and exit codes unchanged. Verified before and after
on 4.5.11, 5.1.2 and 5.2.1: default SKIP/PASS/PASS, all five harness
falsifiers FAIL, --force-run exits 2 on 4.5, plain default exits 77.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
* docs(showcase): record the mirror-symmetry and wrapper-seating conventions
Three conventions every future piece inherits, each from a defect the
hay-bale pass found that no existing budget could see.
Even shaping terms and mirror symmetry (19): where a prop has mirrored
members, every closed-form term in the host's shaping function must be
even in the mirrored axis. hay-bale used sin(x*24), which is odd, so its
two belt stations sampled different surface heights and the wraps
shipped 5.4 mm out of step. Pair the mirrored shells and compare.
Wrappers follow the host's profile, and the host is finished first
(16/18): build, bevel and ground the host, then hang the wrapper on the
finished surface by raycasting the host's own cross-section. A constant
rectangle on a rounded host stands proud at the middle of each face and
is swallowed at the corners. Assert per wrapper shell that the loop
passes under the host, because the AABB zmin gate stays green when the
host grounds the box.
Seat depth is measured station-locally, along the vertex's own direction
from the station axis, never by nearest-surface distance: a wrapper in a
concave waist has its nearest host face on the bulge shoulder at a
neighbouring station. Bin by rounding to the nearest station, never by
flooring, or a station on a bin boundary splits its inner and outer
rings and the inner-only bin reports the outer offset as the seat depth.
Also sharpens the z-fight budget: count coplanar pairs cross-shell, not
merely over faces sharing no vertex. Two quads two steps apart on one
flat cap share no vertex and are coplanar by construction -- that read
96 pairs on hay-bale, none of them a hazard, which is the same
unsatisfiable-budget trap the surrounding paragraph already warns about.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
---------
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
wrong = <spanclass="s">'BLENDER_EEVEE_NEXT'</span><spanclass="k">if</span> bpy.app.version >= (<spanclass="n">5</span>, <spanclass="n">0</span>, <spanclass="n">0</span>) <spanclass="k">else</span><spanclass="s">'BLENDER_EEVEE'</span><spanclass="c"># engine-id-exempt: the wrong-era id this example asserts is rejected</span>
405
405
<spanclass="k">try</span>:
406
406
bpy.context.scene.render.engine = wrong
407
407
print(<spanclass="s">f"</span><spanclass="s">ERROR: wrong-era EEVEE id '</span>{wrong}<spanclass="s">' was accepted</span><spanclass="s">"</span>, file=sys.stderr); <spanclass="k">return</span><spanclass="n">5</span>
<imgsrc="assets/hay-bale-hero.webp" alt="hay-bale — A procedural bound hay bale with a cinched pillow loaf, end nap, and two sisal twine belts through UVs, bake, LOD, collider, and Unity glTF, asserting…" loading="lazy" decoding="async" />
1165
+
<imgsrc="assets/hay-bale-hero.webp" alt="hay-bale — A bound hay bale whose twine belts follow the loaf's own raycast cross-section, asserting recomputed geometry budgets, not an API contract." loading="lazy" decoding="async" />
1166
1166
</a>
1167
1167
<divclass="card-body">
1168
1168
<h2><ahref="hay-bale/">hay-bale</a></h2>
1169
-
<pclass="teaches">A procedural bound hay bale with a cinched pillow loaf, end nap, and two sisal twine belts through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.</p>
1170
-
<pclass="witnesses"><spanclass="tag">witnesses</span> Recomputed: 852 tris, two materials with 294 hay and 132 twine faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.920×0.517×0.426 m, zmin 0, hygiene 0, hay-twine BVH gap 0.07 mm, LOD ratios in band, convex collider 78 tris, non-empty glTF. --skip-decimate exits 9 on LOD1; --lift-z exits 16 on grounded zmin.</p>
1169
+
<pclass="teaches">A bound hay bale whose twine belts follow the loaf's own raycast cross-section, asserting recomputed geometry budgets, not an API contract.</p>
1170
+
<pclass="witnesses"><spanclass="tag">witnesses</span> Recomputed: 2012 tris, two materials with 712 hay and 304 twine faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.921x0.530x0.409 m, zmin 0, hygiene and cross-shell z-fight 0, 5 shells, each belt wrapping under the loaf at zmin 2.6 mm, banded belt seat depth 4.0-16.8 mm over 20/20 stations on both belts, belt mirror error 0, cinch depth 14.2 mm, LOD ratios in band, convex collider 156 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z and --float-belts 16; --slack-belt 18; --skew-belt 19.</p>
wrong = <spanclass="s">'BLENDER_EEVEE_NEXT'</span><spanclass="k">if</span> bpy.app.version >= (<spanclass="n">5</span>, <spanclass="n">0</span>, <spanclass="n">0</span>) <spanclass="k">else</span><spanclass="s">'BLENDER_EEVEE'</span><spanclass="c"># engine-id-exempt: the wrong-era id this example asserts is rejected</span>
560
560
<spanclass="k">try</span>:
561
561
sc.render.engine = wrong
562
562
print(<spanclass="s">f"</span><spanclass="s">ERROR: wrong-era EEVEE id '</span>{wrong}<spanclass="s">' was accepted by this build — </span><spanclass="s">"</span>
wrong = <spanclass="s">'BLENDER_EEVEE_NEXT'</span><spanclass="k">if</span> bpy.app.version >= (<spanclass="n">5</span>, <spanclass="n">0</span>, <spanclass="n">0</span>) <spanclass="k">else</span><spanclass="s">'BLENDER_EEVEE'</span><spanclass="c"># engine-id-exempt: the wrong-era id this example asserts is rejected</span>
424
424
<spanclass="k">try</span>:
425
425
bpy.context.scene.render.engine = wrong
426
426
print(<spanclass="s">f"</span><spanclass="s">ERROR: wrong-era EEVEE id '</span>{wrong}<spanclass="s">' was accepted</span><spanclass="s">"</span>, file=sys.stderr); <spanclass="k">return</span><spanclass="n">5</span>
0 commit comments