fix: seat the ladder rungs and stop the iron chamfers reading as wood - #172
Merged
Merged
Conversation
The rung dowels were as deep as the stile they pass through, so each one erupted through the stile's front and back chamfers as a thin spike in every joint close-up. Narrowing the dowel to 26 mm corrects the proportion; a material or camera change would only have hidden it. Beveling the caps and shoes left every chamfer face in the wood slot. Bevel does not inherit material_index onto the faces it creates, and the piece claimed its metal faces from a pre-bevel snapshot, so each iron fitting rendered as a black block framed in tan. Claim them from the bevel op's own return instead. The previous round removed six iron fittings per ladder without re-fitting the triangle band or the outer AABB, leaving the piece failing its own gates at exit 4. Both constants are re-fitted to the measured result: 2184 tris to 936. Locks all of it in as budgets recomputed from the generated mesh: shell count, rung-to-stile depth clearance, tenon engagement and breakout margin, and material face floors that the pre-bevel snapshot would have failed. --lift-z could never fire, because matrix_world is evaluated data and the object was moved without a view-layer update; --stray-vert and --fat-rungs are new, and all four are proven to fire. Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com>
A part exactly as thick as its host passes any "do the parts overlap" check while erupting through the host's chamfer as a spike, which is how the wooden ladder shipped. Name the three minima that catch it, and the frame to measure them in, so the next piece inherits them instead of rediscovering the class. The hygiene budgets added in the last pass had no named falsifier, so nothing proved they could fail. Name one per budget and require the exit code be checked rather than merely non-zero. Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Visual quality pass on
showcase/wooden-ladder. Four inspection rounds. Everything below was proven by live run on three local binaries unless labelled otherwise.Binaries, versions as the binaries report them:
.scratch/blender-4.5.11-windows-x64/blender.exe→Blender 4.5.11 LTS.scratch/blender-5.1.2-windows-x64/blender.exe→Blender 5.1.2.scratch/blender-5.2.1-windows-x64/blender.exe→Blender 5.2.1 LTSDefect list
Inspection sheet: six orthos, two three-quarters, clay, wireframe, twelve rung-joint close-ups, two top-joint, two foot-joint, one ground-contact, 1024², rendered to
.scratch/ladder-inspection/round-{0..4}/and never committed.Rounds 0 and 1 landed in the prior session; rounds 2 to 4 are this one.
joint_top_*,three_quarter_aortho_front, committed heroground_contactzminwas forced to 0 by clamping stray vertices upward, deforming the foot instead of grounding the pieceortho_left,ground_contactortho_frontjoint_rung_*close-ups, rounds 1 and 2joint_top_left,joint_foot_left,ground_contact, round 2--lift-zexited 0 — the grounded budget could not failDefects 1 to 6 were fixed in the prior session's round 1. Defects 7 to 11 are this PR.
What changed in the generator, and why it is structural
7 — rung diameter.
RUNG_R0.017 → 0.013, a 26 mm dowel in a 34 mm stile. Structural because it corrects a proportion that was wrong: the dowel was as deep as the member it passes through, so no material, camera angle, or chamfer tweak could stop it erupting. The clearance is now 3.61 mm against a 2.5 mm chamfer, so the dowel lands on the stile's flat face with margin rather than grazing the chamfer.8 — chamfer material.
bmesh.ops.beveldoes not inheritmaterial_indexonto the faces it creates, and the piece claimed its metal faces from a face-set snapshot taken before the bevel. Every chamfer therefore fell back to slot 0. Now claimed from the bevel op's ownreturn["faces"]. Structural because it derives the face set from the operation that created it, rather than from a snapshot that is correct only if bevel never adds faces.9 — stale fitted constants.
BASE_TRIS2100–2280 → 900–975 andOUTER_SIZE(0.474, 0.361, 1.482) → (0.472, 0.365, 1.460), both re-fitted to the measured result. Not a loosened assertion: the band is the same ±4% relative width, and the triangle count fell because geometry was removed, not because a gate was widened.10 — set edge. Floor and wall grid 14 → 60. Structural because it removes the class (no edge of the set can enter frame at any framing) rather than nudging the wall out of this one shot.
11 — vacuous falsifier.
world_bboxreadsmatrix_world, which is evaluated data; the object was moved with no view-layer update, so the cached matrix hid the lift. Addedbpy.context.view_layer.update()before measuring.Also replaced the bevel's
wood_verts[:16]slice with an explicitstile_vertslist. Identical geometry — the slice happened to be the two stiles — but it no longer depends on the stiles being constructed first and contributing exactly sixteen vertices.New budgets, measured on all three binaries
All three agree exactly except glTF byte count.
abs(zmin)The joint budgets are measured per rung end against each stile from vertex positions, un-raked into the construction frame so the 12° rake does not inflate the stile's own AABB, and reported as the worst case over all twelve ends.
Exit codes, all three binaries
--skip-decimate--stray-vert--lift-z--fat-rungsMeasured failures:
LOD1 ratio 1.0000,loose_v=1,zmin 0.050000,clearance -0.00051.--fat-rungswidens the dowels to the full stile depth, reproducing defect 7 exactly, so the assertion is proven against the real defect rather than a synthetic one.--stray-vertand--fat-rungsare new.--lift-zexisted but exited 0 on all three binaries before this PR.Falsification of the material-face floor
The floor that locks defect 8 in was proven to fire by breaking the fix: dropping
metal_faces.update(bevelled["faces"])givesmat_index_counts={0: 516, 1: 24}and exits 5 withmetal faces 24 < 180on 5.2.1. Restored.Triangle counts
2184 → 936. Cause is round 1's fitting removal, not hidden-face culling. The rung end rims stay capped and buried inside the stiles — 144 triangles nobody sees — because an open rim is a non-manifold boundary and the hygiene budget forbids it.
Hero still
Re-rendered on 5.2.1. Framing gate passes without
deviation=:fill x=0.166 y=0.839in band 0.70–0.90, marginsleft 0.419 right 0.416 bottom 0.072 top 0.089against a 0.020 minimum, no edge touched or crossed.Conventions
showcase/README.mdgains the joint-fit budget class (shell count plus the three named minima, measured in the construction frame) and a named falsifier for every hygiene budget, which previously had none. Every future piece inherits both.Not done
No contact sheet or asset sheet. Those gates cover
examples/; no showcase piece has ever carried one, including the four prior showcase quality passes (#167, #169, #170, #171). Showcase pieces are governed byshowcase/README.mdinstead.