From 33ee6be16702b5b2ef4d5ecc14b9a0d6cbc0d9b4 Mon Sep 17 00:00:00 2001 From: fOuttaMyPaint Date: Tue, 21 Jul 2026 23:29:01 -0400 Subject: [PATCH] fix: restage three earlier heroes as designed objects A gallery audit after the newest examples' restage found three earlier heroes below the current bar, plus a latent generator defect. image-pixels-testcard: the staged scene never set a view transform - the AgX murk the style guide exists to prevent. Now Standard, the monitor is a designed object (beveled polymer case, machined stand with a specular sweep, power LED), lights aimed at explicit targets, and the grazing rim that drew a grey wedge at frame right is gone. png-exr-alpha: dim easel cards become two framed verification displays on a shared plinth, pure-emission faces with the exact witness data, machined nameplates (FLOAT -> PNG / FLOAT -> EXR), grazing wall band eliminated, floor legible. uv-layer-grid: bare leaning planes become framed lightboxes on floor trays with kick legs and status LEDs. The render-coupled self-witness was preserved by keeping the panel object origins at the face centers (sampling follows the origins, so no assertion change); a mutated copy that secretly gives the hazard panel UVs still fails with exit 11. Repair spread moved 0.7294 -> 0.7412 (larger projected cells, same wide margin); hazard flat-spread unchanged at 0.0078. Also: eight example READMEs used ordered witness lists that scripts/build_gallery.py flattens into run-on paragraphs (it only renders dash bullets). Converted all eight (uv-layer-grid, png-exr-alpha, vse-cut-list, lod-decimate-chain, gltf-export-roundtrip, vertex-weight-limit, triangulate-tangents, gltf-skin-roundtrip), content preserved; regenerated pages verified to render real
  • items with no flattened numbering. All three restaged examples pass check-only on Blender 4.5.11 LTS and 5.1.2 (exit 0, measured values unchanged); render paths exercised on both versions. Contact sheets committed with measured evidence: candidate mean luminance 130.2 / 127.2 / 123.8 against the 100-143 calibration band; wall pools +11 / +13 / +38 R-B; fills 76.5% / 70.3% / ~80%; no blown regions. Signed-off-by: fOuttaMyPaint --- README.md | 6 +- .../assets/image-pixels-testcard-hero.webp | Bin 18688 -> 17178 bytes docs/gallery/assets/png-exr-alpha-hero.webp | Bin 11438 -> 17142 bytes docs/gallery/assets/uv-layer-grid-hero.webp | Bin 20086 -> 18860 bytes .../image-pixels-testcard-contact-sheet.webp | Bin 0 -> 39634 bytes .../png-exr-alpha-contact-sheet.webp | Bin 0 -> 40084 bytes .../uv-layer-grid-contact-sheet.webp | Bin 0 -> 41092 bytes docs/gallery/gltf-export-roundtrip/index.html | 2 +- docs/gallery/gltf-skin-roundtrip/index.html | 2 +- docs/gallery/image-pixels-testcard/index.html | 156 +++++++----- docs/gallery/lod-decimate-chain/index.html | 2 +- docs/gallery/png-exr-alpha/index.html | 234 +++++++++++------- docs/gallery/triangulate-tangents/index.html | 2 +- docs/gallery/uv-layer-grid/index.html | 136 ++++++++-- docs/gallery/vertex-weight-limit/index.html | 2 +- docs/gallery/vse-cut-list/index.html | 2 +- examples/gltf-export-roundtrip/README.md | 34 +-- examples/gltf-skin-roundtrip/README.md | 36 +-- examples/image-pixels-testcard/README.md | 7 +- .../image_pixels_testcard.py | 154 +++++++----- examples/image-pixels-testcard/preview.webp | Bin 15930 -> 15352 bytes examples/lod-decimate-chain/README.md | 32 +-- examples/png-exr-alpha/README.md | 32 +-- examples/png-exr-alpha/png_exr_alpha.py | 230 ++++++++++------- examples/png-exr-alpha/preview.webp | Bin 10188 -> 15332 bytes examples/triangulate-tangents/README.md | 48 ++-- examples/uv-layer-grid/README.md | 25 +- examples/uv-layer-grid/preview.webp | Bin 14614 -> 16798 bytes examples/uv-layer-grid/uv_layer_grid.py | 132 ++++++++-- examples/vertex-weight-limit/README.md | 32 +-- examples/vse-cut-list/README.md | 54 ++-- 31 files changed, 862 insertions(+), 498 deletions(-) create mode 100644 docs/gallery/contact-sheets/image-pixels-testcard-contact-sheet.webp create mode 100644 docs/gallery/contact-sheets/png-exr-alpha-contact-sheet.webp create mode 100644 docs/gallery/contact-sheets/uv-layer-grid-contact-sheet.webp diff --git a/README.md b/README.md index 071920e..3da8beb 100644 --- a/README.md +++ b/README.md @@ -149,7 +149,7 @@ shader `Attribute` node is actually linked to Base Color. -Image pixels testcard: a studio monitor showing a procedural broadcast test card — seven neon color bars behind the classic dark circle, a luminance ramp, and a PLUGE row with a white bottom-left origin marker — over a teal underglow on a dark studio floor +Image pixels testcard: a studio monitor on a machined metal stand showing a procedural broadcast test card — seven neon color bars behind the classic dark circle, a luminance ramp, and a PLUGE row with a white bottom-left origin marker — in a dark studio with a warm pool raking the back wall @@ -168,7 +168,7 @@ non-destructive path. -PNG vs EXR alpha: two easel panels on a dark studio floor — left float→PNG false-unpremul clamps dark mid-tones to white at low alpha, right the EXR-clean authored straight buffer with surviving red and green primaries +PNG vs EXR alpha: two framed verification displays on a shared plinth in a dark studio — left the float→PNG false-unpremul mangling clamps dark rows to white, right the EXR-clean straight buffer, nameplates reading FLOAT → PNG and FLOAT → EXR under a warm wall pool @@ -205,7 +205,7 @@ result is watertight (every edge borders exactly two faces). -UV layer grid: two easel panels on a dark studio floor — left a flat teal square from a missing UV layer sampling texel (0,0), right a magenta/cyan neon checker proving pre-create + calc_uvs +UV layer grid: two framed lightbox displays on floor trays against a dark studio wall — left one flat teal face (the calc_uvs silent no-op hazard), right a saturated magenta-cyan checker (the pre-create repair), under a warm wall pool diff --git a/docs/gallery/assets/image-pixels-testcard-hero.webp b/docs/gallery/assets/image-pixels-testcard-hero.webp index 3f0b028d1dc9d63a2714b856b04e706cd6e46cc8..3e7969d8b9cd4d46dae8242e6808354f271311fb 100644 GIT binary patch literal 17178 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 literal 18688 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%0DFu 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 diff --git a/docs/gallery/assets/png-exr-alpha-hero.webp b/docs/gallery/assets/png-exr-alpha-hero.webp index 3dc1390615c0f75d81eeeb9b85f79b6bbbdc3f77..349208dde9e27e071606e9bced8ba9ca506fb996 100644 GIT binary patch literal 17142 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 literal 11438 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 Igmqv509Ly~W&i*H diff --git a/docs/gallery/assets/uv-layer-grid-hero.webp b/docs/gallery/assets/uv-layer-grid-hero.webp index 9de215024e3c8ad8faef133d5cdb0eafa844f56a..bc3de53264f12064888b4c1af54c7961660a212d 100644 GIT binary patch literal 18860 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 diff --git a/docs/gallery/contact-sheets/image-pixels-testcard-contact-sheet.webp b/docs/gallery/contact-sheets/image-pixels-testcard-contact-sheet.webp new file mode 100644 index 0000000000000000000000000000000000000000..f40b0cafe4bff3c5f0b445fd48fd6375e549a316 GIT binary patch literal 39634 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 MKp4px7fi$e0B-jW&;S4c literal 0 HcmV?d00001 diff --git a/docs/gallery/contact-sheets/uv-layer-grid-contact-sheet.webp b/docs/gallery/contact-sheets/uv-layer-grid-contact-sheet.webp new file mode 100644 index 0000000000000000000000000000000000000000..3c229a3fe1a8f3ccd9c5ab2204e15564958316a7 GIT binary patch literal 41092 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

    Pipeline arc: modeling/LOD in lod-decimate-chain, weighting in vertex-weight-limit, export here.

    What it witnesses: the interchange contracts AI-generated export code most often gets silently wrong.

    -

    1. The +Y-up convention is baked into vertex data. glTF is +Y-up, Blender is +Z-up, and export_yup=True (the default) writes (x, y, z) -> (x, z, -y) directly into the POSITION buffer — the node carries no rotation or scale. The check parses the .gltf JSON and asserts the accessor bounds equal the axis-converted evaluated bounding box, and that the node transform is absent. Exporting with export_yup=False ships raw Z-up data every engine displays lying on its back. 2. export_apply=True ships the evaluated mesh, not the base cage. The crate's bevel modifier lives only in the depsgraph; with flat shading and UV seams the exporter splits exactly one vertex per evaluated loop (7,560), so the on-disk POSITION count is an exact witness. export_apply=False silently writes the 624-vertex cage. 3. The round-trip is faithful. Re-imported positions (bit-exact here), loop normals (≤2e-4), box-mapped UVs (≤3e-5), and per-triangle material bindings all match the evaluated mesh. UVs are V-flipped on disk (glTF texture origin is top-left) and flipped back on import — both flips are proven by reading the .bin buffer directly.

    +
    • The +Y-up convention is baked into vertex data. glTF is +Y-up, Blender is +Z-up, and export_yup=True (the default) writes (x, y, z) -> (x, z, -y) directly into the POSITION buffer — the node carries no rotation or scale. The check parses the .gltf JSON and asserts the accessor bounds equal the axis-converted evaluated bounding box, and that the node transform is absent. Exporting with export_yup=False ships raw Z-up data every engine displays lying on its back.
    • export_apply=True ships the evaluated mesh, not the base cage. The crate's bevel modifier lives only in the depsgraph; with flat shading and UV seams the exporter splits exactly one vertex per evaluated loop (7,560), so the on-disk POSITION count is an exact witness. export_apply=False silently writes the 624-vertex cage.
    • The round-trip is faithful. Re-imported positions (bit-exact here), loop normals (≤2e-4), box-mapped UVs (≤3e-5), and per-triangle material bindings all match the evaluated mesh. UVs are V-flipped on disk (glTF texture origin is top-left) and flipped back on import — both flips are proven by reading the .bin buffer directly.

    Version witness (probed on Blender 4.5.11 LTS and 5.1.2): the operator signatures are byte-identical — 109 exporter properties, 20 importer properties, same defaults — and the exported JSON differs only in asset.generator ("Khronos glTF Blender I/O v4.5.51" vs "v5.1.20"). The example therefore runs identical kwargs on both versions and guards forward drift explicitly: every kwarg it passes must still exist in the operator's RNA, so a future rename fails loudly instead of drifting silently. One genuine 5.x removal surfaced during authoring: Mesh.calc_normals() is gone (loop normals auto-compute on read) — calling it is itself a cross-version hazard, noted in the code.

    Two more authoring hazards are pinned in comments: exact face-plane coincidences between kit-bashed shells weld loops on export (the count check catches it), and read_factory_settings mid-check frees the original mesh — touching a freed RNA raises ReferenceError, so counts are captured before the wipe.

    The render stages the authored crate beside the actual re-imported one — same bevels, same materials carried through the file itself. If the axis conversion broke, the right twin would lie on its side; if the modifier contract broke, its silhouette would lose the rounded edges.

    diff --git a/docs/gallery/gltf-skin-roundtrip/index.html b/docs/gallery/gltf-skin-roundtrip/index.html index 65f9f66..51296e0 100644 --- a/docs/gallery/gltf-skin-roundtrip/index.html +++ b/docs/gallery/gltf-skin-roundtrip/index.html @@ -186,7 +186,7 @@

    gltf-skin-roundtrip

    A runnable example that rigs a mech scorpion — seven-bone chain from pedestal root to stinger, blend rings at every joint seam — exports it with bpy.ops.export_scene.gltf (export_skins=True), parses the file, re-imports it, and verifies the whole skinning contract against the authored rig, following depsgraph-and-evaluated-data.

    Pipeline arc: modeling/LOD in lod-decimate-chain, weighting in vertex-weight-limit, export in gltf-export-roundtrip — this is the skinning counterpart to the crate's geometry round-trip. Tangent frames for the normal maps are in triangulate-tangents.

    What it witnesses: the skinned-mesh export contract the geometry round-trip left uncovered.

    -

    1. The skeleton survives. skins[0].joints names every bone; the re-imported armature carries the same 7 bones, the same parent chain, and rest matrices within 2.4e-07 — the +Y-up conversion applies to bone nodes exactly as it does to meshes (their translations convert, no rotation is written). 2. The weights survive. Every primitive carries JOINTS_0/WEIGHTS_0; per-vertex weights on disk sum to 1 (err 3.0e-08); the re-imported vertex groups match the authored groups bit-exactly (w_err 0.0), compared as straddle-safe position keys, the same protocol as the crate example. 3. The deformation survives. Posed identically, the re-imported rig's evaluated mesh matches the original's within 4.8e-07 — linear blend skinning through the file format. The comparison is by rest-position key, never sorted multisets: the exporter welds duplicate loops (32 here), so cardinalities differ and a naive sorted zip mispairs vertices (a phantom 2.29 "deviation" measured and fixed during authoring). 4. The mesh must be parented to the armature. The exporter warns "Armature must be the parent of skinned mesh" and picks an armature by name otherwise — with two rigs in the file it can bind the wrong one.

    +
    • The skeleton survives. skins[0].joints names every bone; the re-imported armature carries the same 7 bones, the same parent chain, and rest matrices within 2.4e-07 — the +Y-up conversion applies to bone nodes exactly as it does to meshes (their translations convert, no rotation is written).
    • The weights survive. Every primitive carries JOINTS_0/WEIGHTS_0; per-vertex weights on disk sum to 1 (err 3.0e-08); the re-imported vertex groups match the authored groups bit-exactly (w_err 0.0), compared as straddle-safe position keys, the same protocol as the crate example.
    • The deformation survives. Posed identically, the re-imported rig's evaluated mesh matches the original's within 4.8e-07 — linear blend skinning through the file format. The comparison is by rest-position key, never sorted multisets: the exporter welds duplicate loops (32 here), so cardinalities differ and a naive sorted zip mispairs vertices (a phantom 2.29 "deviation" measured and fixed during authoring).
    • The mesh must be parented to the armature. The exporter warns "Armature must be the parent of skinned mesh" and picks an armature by name otherwise — with two rigs in the file it can bind the wrong one.

    What each check catches on failure: exporting with export_skins=False (exit 5 — no skin on disk), stripping the weights (exit 4 — no vertex groups), and posing the re-imported rig differently (exit 19 — deformation deviates 0.90).

    Version witness: the skins pipeline is stable between Blender 4.5 LTS and 5.1 — the exporter/importer RNA is byte-identical (probed with gltf-export-roundtrip), and every measured value matches to the digit on 4.5.11 and 5.1.2.

    The render stages the authored scorpion beside the actual re-imported one — same curl, same glowing stinger — proof the skin rode the format through.

    diff --git a/docs/gallery/image-pixels-testcard/index.html b/docs/gallery/image-pixels-testcard/index.html index a4f5ba7..05c1f80 100644 --- a/docs/gallery/image-pixels-testcard/index.html +++ b/docs/gallery/image-pixels-testcard/index.html @@ -197,7 +197,7 @@

    Run

    # Also render a still (EEVEE on a GPU host; use --engine cycles on GPU-less hosts): blender --background --python image_pixels_testcard.py -- --output card.png blender --background --python image_pixels_testcard.py -- --output card.png --engine cycles -

    It exits non-zero on failure and prints every measured error and tolerance on success, so CI logs carry the numbers. The blender-smoke workflow runs the check on Blender 4.5 LTS and 5.1. In the render, Closest interpolation keeps the pixel grid honest — the jagged circle edge is the 512 × 288 buffer itself, and the white marker in the PLUGE row sits at the bottom-left because that is where pixel (0, 0) lives.

    +

    It exits non-zero on failure and prints every measured error and tolerance on success, so CI logs carry the numbers. The blender-smoke workflow runs the check on Blender 4.5 LTS and 5.1. In the render, Closest interpolation keeps the pixel grid honest — the jagged circle edge is the 512 × 288 buffer itself, and the white marker in the PLUGE row sits at the bottom-left because that is where pixel (0, 0) lives. The monitor is staged as a designed object — beveled dark-polymer case, machined metal stand, teal power LED — on the dark studio stage from docs/VISUAL-STYLE.md (Standard view transform; warm key, cool fill and rim; a warm pool raking the back wall). The screen stays emissive and matte — specular off, emission strength 1.0 — so the card's values read exactly.

    Source

    @@ -405,14 +405,56 @@

    Source

    def render_still(path, engine): import bmesh + from mathutils import Vector scene = bpy.context.scene + # Standard view transform, always: AgX lifts the stage toward grey and + # washes the bars pastel (docs/VISUAL-STYLE.md) + scene.view_settings.view_transform = 'Standard' # the card itself: a byte sRGB image, written with the one bulk call card = bpy.data.images.new("TestCard", W, H, alpha=False) card.pixels.foreach_set(flat_pattern()) - # screen: emissive plane textured with the card (16:9, 3.2 wide) + def principled(name, base, rough, metallic=0.0, emit=None, estr=0.0): + m = bpy.data.materials.new(name) + m.use_nodes = True + b = m.node_tree.nodes["Principled BSDF"] + b.inputs["Base Color"].default_value = (*base, 1.0) + b.inputs["Roughness"].default_value = rough + b.inputs["Metallic"].default_value = metallic + if emit is not None: + b.inputs["Emission Color"].default_value = (*emit, 1.0) + b.inputs["Emission Strength"].default_value = estr + return m + + def box(name, dims, mat, loc, bevel=0.0): + """A world-dimensioned box; a small bevel catches a machined edge line.""" + me = bpy.data.meshes.new(name) + bm = bmesh.new() + try: + bmesh.ops.create_cube(bm, size=1.0) + bmesh.ops.scale(bm, vec=Vector(dims), verts=bm.verts) + for f in bm.faces: + f.smooth = bevel > 0.0 + bm.to_mesh(me) + finally: + bm.free() + me.materials.append(mat) + ob = bpy.data.objects.new(name, me) + ob.location = loc + scene.collection.objects.link(ob) + if bevel > 0.0: + mod = ob.modifiers.new("EdgeBevel", 'BEVEL') + mod.width = bevel + mod.segments = 3 + mod.limit_method = 'ANGLE' + return ob + + # -- the monitor: designed object, not a black slab ---------------------- + # screen: emissive plane textured with the card (16:9, 3.2 wide), centered + # at standing height on its stand sw, sh = 3.2, 1.8 + scr_z = 1.61 screen_me = bpy.data.meshes.new("Screen") bm = bmesh.new() try: @@ -435,46 +477,31 @@

    Source

    bsdf = nodes["Principled BSDF"] bsdf.inputs["Base Color"].default_value = (0.0, 0.0, 0.0, 1.0) bsdf.inputs["Roughness"].default_value = 0.4 + # matte: specular off so the wall/floor horizon never reflects as a line + # across the witness data; emission 1.0 so the card reads exactly + bsdf.inputs["Specular IOR Level"].default_value = 0.0 links.new(tex.outputs["Color"], bsdf.inputs["Emission Color"]) - bsdf.inputs["Emission Strength"].default_value = 1.35 # hotter washes the bars pastel + bsdf.inputs["Emission Strength"].default_value = 1.0 screen_me.materials.append(smat) screen = bpy.data.objects.new("Screen", screen_me) screen.scale = (sw, sh, 1.0) - screen.rotation_euler = (math.radians(90), 0.0, math.radians(-16)) - screen.location = (0.0, 0.0, sh / 2 + 0.14) + screen.rotation_euler = (math.radians(90), 0.0, 0.0) + screen.location = (0.0, 0.0, scr_z) scene.collection.objects.link(screen) - # bezel: a slightly larger dark slab just behind the screen - bezel_me = bpy.data.meshes.new("Bezel") - bm = bmesh.new() - try: - bmesh.ops.create_cube(bm, size=1.0) - bm.to_mesh(bezel_me) - finally: - bm.free() - bmat = bpy.data.materials.new("Bezel") - bmat.use_nodes = True - bb = bmat.node_tree.nodes["Principled BSDF"] - bb.inputs["Base Color"].default_value = (0.02, 0.022, 0.025, 1.0) - bb.inputs["Roughness"].default_value = 0.28 - bb.inputs["Metallic"].default_value = 0.6 - bezel_me.materials.append(bmat) - bezel = bpy.data.objects.new("Bezel", bezel_me) - bezel.scale = (sw + 0.14, 0.09, sh + 0.14) - bezel.rotation_euler = (0.0, 0.0, math.radians(-16)) - # offset along the yawed screen normal so the slab stays behind the plane - bezel.location = (0.052 * math.sin(math.radians(16)), - 0.052 * math.cos(math.radians(16)), sh / 2 + 0.14) - scene.collection.objects.link(bezel) - - # plinth foot under the monitor - foot = bpy.data.objects.new("Foot", bezel_me.copy()) - foot.data.materials.clear(); foot.data.materials.append(bmat) - foot.scale = (1.1, 0.5, 0.14) - foot.location = (0.0, 0.05, 0.07) - scene.collection.objects.link(foot) - - # glossy dark floor + back wall + # case: dark polymer shell with a beveled edge the rim light can draw + case_mat = principled("CasePolymer", (0.030, 0.034, 0.042), 0.38) + metal_mat = principled("StandMetal", (0.055, 0.060, 0.070), 0.36, metallic=0.7) + box("Case", (sw + 0.18, 0.11, sh + 0.18), case_mat, (0.0, 0.057, scr_z), bevel=0.03) + # machined stand: neck + base plate + box("Neck", (0.30, 0.14, 0.64), metal_mat, (0.0, 0.10, 0.37), bevel=0.025) + box("Base", (1.45, 0.85, 0.07), metal_mat, (0.0, 0.12, 0.035), bevel=0.03) + # power LED on the bottom bezel, a small designed detail + glow_mat = principled("Glow", (0.0, 0.0, 0.0), 0.5, emit=(0.10, 0.85, 0.75), estr=6.0) + box("LED", (0.05, 0.02, 0.02), glow_mat, (1.30, -0.006, scr_z - sh / 2 - 0.045)) + + # -- stage: near-black floor + back wall, matte -------------------------- + stage_mat = principled("Studio", (0.03, 0.032, 0.037), 0.7) floor_me = bpy.data.meshes.new("Floor") bm = bmesh.new() try: @@ -482,54 +509,49 @@

    Source

    bm.to_mesh(floor_me) finally: bm.free() - fmat = bpy.data.materials.new("Studio") - fmat.use_nodes = True - fb = fmat.node_tree.nodes["Principled BSDF"] - fb.inputs["Base Color"].default_value = (0.045, 0.05, 0.06, 1.0) - fb.inputs["Roughness"].default_value = 0.18 - floor_me.materials.append(fmat) + floor_me.materials.append(stage_mat) floor = bpy.data.objects.new("Floor", floor_me) scene.collection.objects.link(floor) wall = bpy.data.objects.new("Wall", floor_me.copy()) - wall.location = (0.0, 9.0, 0.0) + wall.location = (0.0, 8.5, 0.0) wall.rotation_euler = (math.radians(90), 0.0, 0.0) scene.collection.objects.link(wall) world = bpy.data.worlds.new("World") world.use_nodes = True - world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.025, 0.03, 0.04, 1.0) + world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.02, 0.021, 0.025, 1.0) scene.world = world - def light(name, loc, energy, size, col, rot): + # -- lighting: shaped warm key, cool fill/rim, warm pool on the wall ----- + def light(name, loc, target, energy, size, col): ld = bpy.data.lights.new(name, 'AREA') - ld.energy = energy; ld.size = size; ld.color = col + ld.energy = energy + ld.size = size + ld.color = col ob = bpy.data.objects.new(name, ld) ob.location = loc - ob.rotation_euler = tuple(math.radians(a) for a in rot) + # aim exactly at the target — a guessed euler is how stray bands happen + d = Vector(target) - Vector(loc) + ob.rotation_euler = d.to_track_quat('-Z', 'Y').to_euler() scene.collection.objects.link(ob) - # teal underglow bar tucked beneath the monitor, spilling onto the floor - strip = bpy.data.objects.new("GlowStrip", bezel_me.copy()) - gmat = bpy.data.materials.new("Glow") - gmat.use_nodes = True - gb = gmat.node_tree.nodes["Principled BSDF"] - gb.inputs["Emission Color"].default_value = (0.1, 0.9, 0.8, 1.0) - gb.inputs["Emission Strength"].default_value = 12.0 - strip.data.materials.clear(); strip.data.materials.append(gmat) - strip.scale = (2.7, 0.045, 0.015) - strip.rotation_euler = (0.0, 0.0, math.radians(-16)) - strip.location = (0.0, -0.10, 0.015) - scene.collection.objects.link(strip) - - # the card is its own key light; cool fill and a warm rim shape the bezel - light("Fill", (-5.2, -3.0, 3.6), 80.0, 7.0, (0.7, 0.8, 1.0), (58, 0, -60)) - light("Rim", (4.2, 2.8, 2.2), 260.0, 2.5, (1.0, 0.72, 0.45), (-70, 0, 125)) - + light("Key", (-4.0, -5.0, 6.0), (0.0, 0.0, 1.3), 420.0, 5.0, (1.0, 0.96, 0.9)) + light("Fill", (4.2, -1.8, 2.4), (0.0, 0.0, 1.5), 55.0, 9.0, (0.75, 0.85, 1.0)) + light("Rim", (3.4, 2.8, 3.4), (0.3, 0.0, 1.6), 320.0, 3.0, (0.6, 0.78, 1.0)) + # the signature: a warm pool raking the back wall behind the subject; + # aimed at the wall well above the floor seam so the seam stays in shadow + light("Wedge", (3.2, 5.2, 6.2), (2.4, 8.5, 4.2), 500.0, 5.0, (1.0, 0.76, 0.5)) + + # camera: 50 mm, slightly above the subject, tracking an empty on it + target = bpy.data.objects.new("AimTarget", None) + target.location = (0.0, 0.0, 1.42) + scene.collection.objects.link(target) cam_data = bpy.data.cameras.new("Cam") - cam_data.lens = 44.0 + cam_data.lens = 50.0 cam = bpy.data.objects.new("Cam", cam_data) - cam.location = (-2.45, -5.7, 1.62) - cam.rotation_euler = (math.radians(84.5), 0.0, math.radians(-23.0)) + cam.location = (-4.2, -7.7, 2.85) + con = cam.constraints.new('TRACK_TO') + con.target = target scene.collection.objects.link(cam) scene.camera = cam diff --git a/docs/gallery/lod-decimate-chain/index.html b/docs/gallery/lod-decimate-chain/index.html index 79b9a66..84132fd 100644 --- a/docs/gallery/lod-decimate-chain/index.html +++ b/docs/gallery/lod-decimate-chain/index.html @@ -186,7 +186,7 @@

    lod-decimate-chain

    A runnable example that builds a retro toy rocket — a lathed body with an ogive nose, three swept fin plates, a porthole, every dimension a closed form — and evaluates it at LOD0/1/2 through the Decimate modifier via the depsgraph, following depsgraph-and-evaluated-data and mesh-editing-and-bmesh.

    Pipeline arc: modeling/LOD here, weighting in vertex-weight-limit, export in gltf-export-roundtrip.

    What it witnesses: the modifier-based LOD contract that game asset pipelines rely on.

    -

    1. Decimate is non-destructive and lives in the depsgraph. The evaluated mesh carries the reduction; the original datablock is byte-identical before and after evaluation. The check proves both — evaluated counts drop while obj.data keeps the closed-form counts (1,147 verts / 2,260 tris) — and every evaluated reference is released with to_mesh_clear(). An LOD chain that bakes the reduction into obj.data destroys the asset's LOD0. 2. The COLLAPSE ratio is a target, not a guarantee. Each LOD's evaluated triangle count must land within 5% of ratio x base_tris — measured 0.00% at ratio 0.5 (1,130 tris) and 0.44% at ratio 0.18 (405 tris). A stacked second Decimate halves the effective ratio (50% excursion, caught); a dropped modifier leaves evaluated == original (caught). 3. LODs preserve silhouette-critical dimensions. Height (3.12) and fin span are the rocket's readability; the evaluated bbox holds the base bbox within 1e-3 at every level (measured 7.7e-6). Decimate has no vertex pinning, so this is a real risk, not a formality: at an aggressive ratio 0.02 the nose tip collapses (bbox drift 0.0206, caught).

    +
    • Decimate is non-destructive and lives in the depsgraph. The evaluated mesh carries the reduction; the original datablock is byte-identical before and after evaluation. The check proves both — evaluated counts drop while obj.data keeps the closed-form counts (1,147 verts / 2,260 tris) — and every evaluated reference is released with to_mesh_clear(). An LOD chain that bakes the reduction into obj.data destroys the asset's LOD0.
    • The COLLAPSE ratio is a target, not a guarantee. Each LOD's evaluated triangle count must land within 5% of ratio x base_tris — measured 0.00% at ratio 0.5 (1,130 tris) and 0.44% at ratio 0.18 (405 tris). A stacked second Decimate halves the effective ratio (50% excursion, caught); a dropped modifier leaves evaluated == original (caught).
    • LODs preserve silhouette-critical dimensions. Height (3.12) and fin span are the rocket's readability; the evaluated bbox holds the base bbox within 1e-3 at every level (measured 7.7e-6). Decimate has no vertex pinning, so this is a real risk, not a formality: at an aggressive ratio 0.02 the nose tip collapses (bbox drift 0.0206, caught).

    The Decimate modifier API (decimate_type='COLLAPSE', ratio) is stable between Blender 4.5 LTS and 5.1 — the example runs identically on both, which is itself the version witness (measured values match to the digit).

    The render stages the three LODs in a row: LOD0's smooth lathe, LOD1's nearly free halving, LOD2's visible crunch — the porthole degrades to a hexagon and the nose facets coarsen, exactly the geometry the triangle counts assert.

    Run

    diff --git a/docs/gallery/png-exr-alpha/index.html b/docs/gallery/png-exr-alpha/index.html index ccb3f46..b9fc644 100644 --- a/docs/gallery/png-exr-alpha/index.html +++ b/docs/gallery/png-exr-alpha/index.html @@ -186,11 +186,11 @@

    png-exr-alpha

    A runnable example that witnesses the float-image PNG save trap: a float_buffer=True image saved via Image.save() to PNG is written as 16-bit RGBA and is unpremultiplied as if the buffer were associated-alpha before storage. The normal pixels API authors *straight* RGBA, so any channel where c > a blows past 1.0 and clamps to white — closed-form RGB error reaches 0.98 for authored (0.02, 0.02, 0.02) at alpha 1/255. The same buffer saved as OpenEXR round-trips at float precision. A byte image (float_buffer=False) writes 8-bit PNG with straight alpha and only pays ordinary quantization.

    Found while probing the ROADMAP "image save-format" candidate against live Blender 5.1 — the hazard is not classic 8-bit premul quantization (float PNG is 16-bit); it is the false associated-alpha unpremultiply on a straight buffer. Documented here so the contract cannot quietly drift.

    What it witnesses:

    -

    1. Float → PNG false unpremulImage.save() on a Non-Color float image writes RGBA16 (IHDR bit_depth=16, color_type=6). Reloaded pixels match the closed form q16(min(1, c / q16(a))) within 2/65535. Max RGB error vs authored on the probe palette is >= 0.90 (measured 0.98). 2. Float → OpenEXR fidelity — same authored buffer round-trips within 1e-5 (measured ~3e-8). 3. Byte → PNG straight alphafloat_buffer=False writes RGBA8; pixels match independent per-channel q8 within 0.5/255. The stress cell at (0.02, a=1/255) stays near 0.02, not clamped white. 4. EXR color_mode='RGB' drops alphasave_render with color_mode='RGB' reloads opaque alpha (≈ 1.0) even when authored alpha was 1/255.

    +
    • Float → PNG false unpremulImage.save() on a Non-Color float image writes RGBA16 (IHDR bit_depth=16, color_type=6). Reloaded pixels match the closed form q16(min(1, c / q16(a))) within 2/65535. Max RGB error vs authored on the probe palette is >= 0.90 (measured 0.98).
    • Float → OpenEXR fidelity — same authored buffer round-trips within 1e-5 (measured ~3e-8).
    • Byte → PNG straight alphafloat_buffer=False writes RGBA8; pixels match independent per-channel q8 within 0.5/255. The stress cell at (0.02, a=1/255) stays near 0.02, not clamped white.
    • EXR color_mode='RGB' drops alphasave_render with color_mode='RGB' reloads opaque alpha (≈ 1.0) even when authored alpha was 1/255.

    What each check catches on failure:

    • *RGBA16 IHDR* — float PNG bit-depth or color-type change (falsified expectation: 8-bit would exit 4).
    • *Error floor* — float PNG path stops destroying straight mid-tones / dark values at low alpha (exit 5).
    • *Closed-form residual* — encoding no longer matches false-unpremul+clamp (falsified once by swapping in the byte straight-alpha model; exited 6 with residual 0.9803922).
    • *EXR fidelity* — OpenEXR float RGBA round-trip regressing (exit 7).
    • *Byte straight path* — byte images starting to false-unpremul, or bit-depth flipping to 16 (exits 9–11).
    • *RGB EXR alpha drop* — color_mode='RGB' preserving authored alpha (exit 12).

    Version divergence: none probed on the save/reload contracts above — they assert on Blender 5.1.1 locally. Blender 4.5 LTS is exercised by the blender-smoke CI job (4.5 is not installed on this authoring host; do not treat a 4.4 run as a 4.5 substitute). The only version gate in the file is the EEVEE engine id for the optional render (BLENDER_EEVEE_NEXT on 4.x, BLENDER_EEVEE on 5.x).

    -

    Render: two easel panels. Left bakes the closed-form PNG mangling (dark rows flash to white at low-alpha columns). Right shows the authored straight buffer (EXR-clean). If the contract failed, both panels would read the same.

    +

    Render: two framed verification displays on a shared plinth — the left face bakes the closed-form PNG mangling (dark rows flash to white at low-alpha columns), the right face shows the authored straight buffer (EXR-clean); nameplates read FLOAT → PNG and FLOAT → EXR. If the contract failed, both panels would read the same.

    Run

    # Cheap correctness check (no render) — the CI check:
     blender --background --python png_exr_alpha.py --
    @@ -219,8 +219,8 @@ 

    Source

    AI-generated Blender code commonly trusts `Image.save()` to PNG for float RGBA scratch buffers (masks, ID mattes, AOVs). Pass --output to also render -a dual-easel still: left is the PNG-mangled reload, right is the EXR-clean -reload. +a staged still of two framed verification displays: left is the PNG-mangled +reload, right is the EXR-clean reload. blender --background --python png_exr_alpha.py -- blender --background --python png_exr_alpha.py -- --output alpha.png @@ -539,22 +539,16 @@

    Source

    return "BLENDER_EEVEE" if bpy.app.version >= (5, 0, 0) else "BLENDER_EEVEE_NEXT" -def specular_off(bsdf): - if "Specular IOR Level" in bsdf.inputs: - bsdf.inputs["Specular IOR Level"].default_value = 0.0 - elif "Specular" in bsdf.inputs: - bsdf.inputs["Specular"].default_value = 0.0 - - def make_gallery_card(name, mangled): - """Visual card of the false-unpremul contract for the dual-easel still. + """Visual card of the false-unpremul contract for the staged still. Columns = rising alpha; top rows = dark mid-tones that PNG clamps to white; lower rows = primaries that survive. Left panel bakes the closed-form mangling; right panel shows authored straight RGBA. - A dark bezel is painted into the texture so panel edges read as framed - objects in the studio still (render-only — checks use fill_pattern). + A dark trim is painted into the texture edge so the emissive face reads + as a recessed screen inside its physical bezel (render-only — checks + use fill_pattern). """ gw, gh = 256, 192 border = 10 @@ -595,8 +589,46 @@

    Source

    return img -def easel_plane(name, image, loc, rot_z_deg): - """Single-plane easel + short stand — no dual-surface z-fight.""" +def fixture_mats(): + """Designed non-data surfaces: dark polymer bezels, rail-steel struts, + machined nameplates, plinth — no Principled defaults.""" + def mat_principled(name, color, metallic, rough): + mat = bpy.data.materials.new(name) + mat.use_nodes = True + bsdf = mat.node_tree.nodes["Principled BSDF"] + bsdf.inputs["Base Color"].default_value = (*color, 1.0) + bsdf.inputs["Metallic"].default_value = metallic + bsdf.inputs["Roughness"].default_value = rough + return mat + + return { + "bezel": mat_principled("BezelPolymer", (0.045, 0.048, 0.055), 0.1, 0.5), + "rail": mat_principled("RailSteel", (0.075, 0.08, 0.09), 0.6, 0.45), + "plinth": mat_principled("PlinthSteel", (0.10, 0.11, 0.12), 0.6, 0.5), + "plate": mat_principled("PlateSteel", (0.14, 0.15, 0.17), 0.7, 0.4), + } + + +def box_obj(name, dims, loc, mat, rot_x=0.0): + me = bpy.data.meshes.new(name) + bm = bmesh.new() + try: + bmesh.ops.create_cube(bm, size=1.0) + bm.to_mesh(me) + finally: + bm.free() + me.materials.append(mat) + ob = bpy.data.objects.new(name, me) + ob.scale = dims + ob.location = loc + ob.rotation_euler = (rot_x, 0.0, 0.0) + bpy.context.collection.objects.link(ob) + return ob + + +def face_mesh(name): + """UV-mapped unit plane (create_grid lies in XY facing +Z; the display + unit rotates it vertical).""" me = bpy.data.meshes.new(name) bm = bmesh.new() try: @@ -612,84 +644,101 @@

    Source

    bm.to_mesh(me) finally: bm.free() + return me - mat = bpy.data.materials.new(name + "Mat") + +def face_mat(name, image): + """Data faces stay pure emission: exact card values, no specular, no + shading — the panel is a backlit data display.""" + mat = bpy.data.materials.new(name) mat.use_nodes = True nt = mat.node_tree - nodes, links = nt.nodes, nt.links - bsdf = nodes["Principled BSDF"] - tex = nodes.new("ShaderNodeTexImage") + nt.nodes.clear() + out = nt.nodes.new("ShaderNodeOutputMaterial") + em = nt.nodes.new("ShaderNodeEmission") + tex = nt.nodes.new("ShaderNodeTexImage") tex.image = image tex.interpolation = "Closest" - links.new(tex.outputs["Color"], bsdf.inputs["Base Color"]) - links.new(tex.outputs["Color"], bsdf.inputs["Emission Color"]) - bsdf.inputs["Roughness"].default_value = 1.0 - specular_off(bsdf) - # Faint emission so clamps read under a dim stage without washing the wall. - bsdf.inputs["Emission Strength"].default_value = 0.22 - me.materials.append(mat) + nt.links.new(tex.outputs["Color"], em.inputs["Color"]) + nt.links.new(em.outputs["Emission"], out.inputs["Surface"]) + em.inputs["Strength"].default_value = 1.0 + return mat + +def caption_mat(): + mat = bpy.data.materials.new("CaptionGrey") + mat.use_nodes = True + cb = mat.node_tree.nodes["Principled BSDF"] + cb.inputs["Base Color"].default_value = (0.42, 0.44, 0.48, 1.0) + cb.inputs["Metallic"].default_value = 0.2 + cb.inputs["Roughness"].default_value = 0.6 + sock = cb.inputs.get("Emission Color") or cb.inputs["Emission"] + sock.default_value = (0.38, 0.40, 0.45, 1.0) + cb.inputs["Emission Strength"].default_value = 0.5 + return mat + + +def display_unit(name, image, caption, x, mats, capmat): + """One verification display: the emissive data face seated proud of a + thick dark bezel, carried by a rear strut and foot, with a machined + nameplate under the bezel — a physical instrument standing on the + shared plinth, not a floating texture.""" root = bpy.data.objects.new(name, None) - root.location = loc - root.rotation_euler = (math.radians(62), 0.0, math.radians(rot_z_deg)) - root.scale = (0.88, 0.88, 0.88) + root.location = (x, 0.0, 0.0) bpy.context.collection.objects.link(root) - face = bpy.data.objects.new(name + "Face", me) - bpy.context.collection.objects.link(face) - face.parent = root + def adopt(ob): + ob.parent = root + return ob - stand_me = bpy.data.meshes.new(name + "Stand") - bm = bmesh.new() - try: - bmesh.ops.create_cube(bm, size=1.0) - bm.to_mesh(stand_me) - finally: - bm.free() - smat = bpy.data.materials.new(name + "StandMat") - smat.use_nodes = True - sb = smat.node_tree.nodes["Principled BSDF"] - sb.inputs["Base Color"].default_value = (0.045, 0.048, 0.055, 1.0) - sb.inputs["Roughness"].default_value = 0.45 - if "Metallic" in sb.inputs: - sb.inputs["Metallic"].default_value = 0.3 - stand_me.materials.append(smat) - stand = bpy.data.objects.new(name + "Stand", stand_me) - # Fully below the card face — never intersects the evidence plane. - stand.scale = (0.06, 0.06, 0.28) - stand.location = (0.0, 0.04, -0.88) - bpy.context.collection.objects.link(stand) - stand.parent = root + # bezel with real thickness; the face sits proud of its front surface + adopt(box_obj(name + "Bezel", (2.64, 0.16, 2.04), (0.0, 0.0, 1.80), + mats["bezel"])) + face = bpy.data.objects.new(name + "Face", face_mesh(name + "Face")) + bpy.context.collection.objects.link(face) + face.data.materials.append(face_mat(name + "FaceMat", image)) + face.location = (0.0, -0.085, 1.80) + face.rotation_euler = (math.radians(90), 0.0, 0.0) + face.scale = (1.20, 0.90, 1.0) + adopt(face) + # rear strut leaning onto the bezel back, foot on the plinth top + adopt(box_obj(name + "Strut", (0.26, 0.30, 1.30), (0.0, 0.42, 1.10), + mats["rail"], rot_x=math.radians(18))) + adopt(box_obj(name + "Foot", (0.60, 0.80, 0.10), (0.0, 0.72, 0.50), + mats["rail"])) + # nameplate bridging bezel bottom and plinth top + adopt(box_obj(name + "Plate", (1.60, 0.06, 0.26), (0.0, -0.03, 0.63), + mats["plate"])) + cu = bpy.data.curves.new(name + "Caption", "FONT") + cu.body = caption + cu.align_x = "CENTER" + cu.align_y = "CENTER" + cu.size = 0.15 + cu.extrude = 0.004 + cu.materials.append(capmat) + cap = bpy.data.objects.new(name + "Caption", cu) + cap.location = (0.0, -0.065, 0.63) + cap.rotation_euler = (math.radians(90), 0.0, 0.0) + bpy.context.collection.objects.link(cap) + adopt(cap) return root def render_still(path, engine): + import mathutils + scene = bpy.context.scene png_card = make_gallery_card("PngMangled", mangled=True) exr_card = make_gallery_card("ExrClean", mangled=False) - # Mounted easels on a shared dark table — continuous base, no V-tear shadow. - easel_plane("PngPanel", png_card, (-1.15, 0.1, 1.28), 5) - easel_plane("ExrPanel", exr_card, (1.15, 0.1, 1.28), -5) - - table_me = bpy.data.meshes.new("Table") - bm = bmesh.new() - try: - bmesh.ops.create_cube(bm, size=1.0) - bm.to_mesh(table_me) - finally: - bm.free() - tmat = bpy.data.materials.new("TableMat") - tmat.use_nodes = True - tb = tmat.node_tree.nodes["Principled BSDF"] - tb.inputs["Base Color"].default_value = (0.022, 0.024, 0.028, 1.0) - tb.inputs["Roughness"].default_value = 0.6 - table_me.materials.append(tmat) - table = bpy.data.objects.new("Table", table_me) - table.scale = (1.5, 0.55, 0.08) - table.location = (0.0, 0.25, 0.28) - scene.collection.objects.link(table) + # The verification station: two framed displays on a shared plinth — + # left bakes the closed-form PNG mangling, right is EXR-clean. + mats = fixture_mats() + capmat = caption_mat() + display_unit("PngDisplay", png_card, "FLOAT → PNG", -1.45, mats, capmat) + display_unit("ExrDisplay", exr_card, "FLOAT → EXR", 1.45, mats, capmat) + box_obj("Plinth", (6.10, 1.80, 0.45), (0.0, 0.35, 0.225), mats["plinth"]) floor_me = bpy.data.meshes.new("Floor") bm = bmesh.new() @@ -701,46 +750,57 @@

    Source

    fmat = bpy.data.materials.new("Studio") fmat.use_nodes = True fb = fmat.node_tree.nodes["Principled BSDF"] - fb.inputs["Base Color"].default_value = (0.02, 0.021, 0.025, 1.0) - fb.inputs["Roughness"].default_value = 0.8 + fb.inputs["Base Color"].default_value = (0.03, 0.032, 0.037, 1.0) + fb.inputs["Roughness"].default_value = 0.7 floor_me.materials.append(fmat) floor = bpy.data.objects.new("Floor", floor_me) scene.collection.objects.link(floor) wall = bpy.data.objects.new("Wall", floor_me.copy()) - wall.location = (0.0, 8.8, 0.0) + wall.location = (0.0, 9.0, 0.0) wall.rotation_euler = (math.radians(90), 0.0, 0.0) scene.collection.objects.link(wall) world = bpy.data.worlds.new("World") world.use_nodes = True world.node_tree.nodes["Background"].inputs["Color"].default_value = ( - 0.012, 0.013, 0.015, 1.0, + 0.02, 0.021, 0.025, 1.0, ) scene.world = world - def light(name, loc, energy, size, col, rot): + def light(name, loc, energy, size, col, target): ld = bpy.data.lights.new(name, "AREA") ld.energy = energy ld.size = size ld.color = col ob = bpy.data.objects.new(name, ld) ob.location = loc - ob.rotation_euler = tuple(math.radians(a) for a in rot) + d = mathutils.Vector(target) - ob.location + ob.rotation_euler = d.to_track_quat("-Z", "Y").to_euler() scene.collection.objects.link(ob) - light("Key", (-3.8, -4.8, 5.8), 220.0, 4.5, (1.0, 0.96, 0.9), (52, 0, -32)) - light("Fill", (4.8, -2.8, 1.6), 40.0, 9.0, (0.75, 0.85, 1.0), (72, 0, 52)) - light("Rim", (0.2, 4.8, 2.8), 120.0, 3.2, (0.6, 0.78, 1.0), (-62, 0, 178)) - light("Wedge", (0.5, 6.5, 2.5), 450.0, 7.0, (1.0, 0.72, 0.42), (-78, 0, 180)) + # Shaped warm key, faint cool fill, cool rim, and the signature warm + # wedge between station and wall aimed at the wall point behind the + # subject — every light has an explicit target so nothing grazes a + # flat surface (grazing area lights draw stray bands). + light("Key", (-4.0, -4.5, 7.0), 460.0, 4.5, (1.0, 0.96, 0.9), + (0.0, 0.2, 1.8)) + light("Fill", (6.0, -3.0, 3.0), 90.0, 9.0, (0.75, 0.85, 1.0), + (0.5, 0.0, 1.8)) + light("Rim", (0.5, 4.5, 7.0), 320.0, 4.0, (0.6, 0.78, 1.0), + (0.0, 0.3, 2.0)) + light("Wedge", (-0.5, 5.5, 6.0), 520.0, 4.5, (1.0, 0.76, 0.5), + (0.0, 9.0, 2.6)) aim = bpy.data.objects.new("Aim", None) - aim.location = (0.0, 0.1, 1.15) + aim.location = (-0.10, 0.2, 1.65) scene.collection.objects.link(aim) + # Gentle 3/4 from the right: both faces stay fully readable while the + # bezels, struts, and plinth show their thickness. cam_data = bpy.data.cameras.new("Cam") cam_data.lens = 50.0 cam = bpy.data.objects.new("Cam", cam_data) - cam.location = (0.0, -6.0, 2.15) + cam.location = (3.9, -9.3, 3.05) con = cam.constraints.new("TRACK_TO") con.target = aim con.track_axis = "TRACK_NEGATIVE_Z" diff --git a/docs/gallery/triangulate-tangents/index.html b/docs/gallery/triangulate-tangents/index.html index 96285ed..84f34ab 100644 --- a/docs/gallery/triangulate-tangents/index.html +++ b/docs/gallery/triangulate-tangents/index.html @@ -186,7 +186,7 @@

    triangulate-tangents

    A runnable example that builds a machined buckler — lathed dome with polar UVs, unwrapped rim and underside strips, a fanned back cap — and verifies the tangent-space contract a game engine's normal mapping depends on, following mesh-editing-and-bmesh.

    Pipeline arc neighbor: weighting in vertex-weight-limit, export in gltf-export-roundtrip — tangent space is what the exported normal maps are baked against.

    What it witnesses: the mikktspace contract engines implement, and the hazards around it.

    -

    1. Deterministic triangulation and the engine basis. calc_loop_triangles yields the closed-form count (two tris per quad + the cap fan, 720), and every loop tangent is unit length (err 1.3e-07) and exactly orthogonal to its loop normal (err 6.0e-08), with the bitangent exactly bitangent_sign * (normal x tangent) (err 0.0). One ngon anywhere in the mesh and calc_tangents aborts the whole call — the back cap is an explicit fan for exactly that reason. 2. The tangent frame follows the UVs. On smooth-field triangles the per-loop tangents match the independently derived edge/UV-delta formula within mikktspace's vertex-welding tolerance (measured 2.3e-06, tol 0.15); a flipped frame inside a smooth field is never legal (0 measured). At UV seams the frame orientation is implementation-defined — 42 seam flips, 9 at chart seams, identical on both versions — and planar UVs on a cylindrical wall are degenerate: they collapse the tangent onto the normal (dot 0.998, measured and fixed by unwrapping strips). 3. The reference-lifetime hazard (the real divergence). A MeshUVLoopLayer handle held across calc_tangents() dangles: on Blender 4.5 reads through it return tangent floats, not UVs — measured while authoring as a phantom 471 flipped frames and 385 phantom seam positions, exit 0, a silent wrong answer. On 5.1 the same stale read survives by memory-layout luck. The mikktspace math itself is byte-identical on 4.5.11 and 5.1.2; the apparent version divergence was entirely the corrupt handle. Never hold layer handles across CustomData-reallocating calls — re-fetch by name.

    +
    • Deterministic triangulation and the engine basis. calc_loop_triangles yields the closed-form count (two tris per quad + the cap fan, 720), and every loop tangent is unit length (err 1.3e-07) and exactly orthogonal to its loop normal (err 6.0e-08), with the bitangent exactly bitangent_sign * (normal x tangent) (err 0.0). One ngon anywhere in the mesh and calc_tangents aborts the whole call — the back cap is an explicit fan for exactly that reason.
    • The tangent frame follows the UVs. On smooth-field triangles the per-loop tangents match the independently derived edge/UV-delta formula within mikktspace's vertex-welding tolerance (measured 2.3e-06, tol 0.15); a flipped frame inside a smooth field is never legal (0 measured). At UV seams the frame orientation is implementation-defined — 42 seam flips, 9 at chart seams, identical on both versions — and planar UVs on a cylindrical wall are degenerate: they collapse the tangent onto the normal (dot 0.998, measured and fixed by unwrapping strips).
    • The reference-lifetime hazard (the real divergence). A MeshUVLoopLayer handle held across calc_tangents() dangles: on Blender 4.5 reads through it return tangent floats, not UVs — measured while authoring as a phantom 471 flipped frames and 385 phantom seam positions, exit 0, a silent wrong answer. On 5.1 the same stale read survives by memory-layout luck. The mikktspace math itself is byte-identical on 4.5.11 and 5.1.2; the apparent version divergence was entirely the corrupt handle. Never hold layer handles across CustomData-reallocating calls — re-fetch by name.

    What each check catches on failure: a remeshed asset breaking the triangulation count (probe: dropped profile ring, exit 3, 624 vs 720); a wrong tangent formula in the independent derivation (probe: swapped du/dv, exit 7, weld 1.459); and the stale-handle read (probe: no re-fetch — corrupt measurements on 4.5, correct values on 5.1 by luck).

    Version witness: mikktspace output is identical on Blender 4.5.11 LTS and 5.1.2 (same weld deviations, same seam flips). The calc_tangents(uvmap=) signature is stable. The lifetime hazard above is the only behavioral split, and it corrupts measurements rather than raising.

    The render shows the buckler on its cradle: brushed grooves circulating the boss with the anisotropic sweep riding them — the circulating tangent field made visible.

    diff --git a/docs/gallery/uv-layer-grid/index.html b/docs/gallery/uv-layer-grid/index.html index e4a6058..5ade809 100644 --- a/docs/gallery/uv-layer-grid/index.html +++ b/docs/gallery/uv-layer-grid/index.html @@ -186,11 +186,11 @@

    uv-layer-grid

    A runnable example that witnesses the UV-layer authoring hazard behind bmesh.ops.create_grid(..., calc_uvs=True): the flag is a silent no-op unless a UV layer already exists on the BMesh. AI-generated Blender code commonly trusts calc_uvs=True, wires an Image Texture, and ships a mesh that renders as one flat color — every fragment samples texel (0, 0).

    Found while authoring image-pixels-testcard; lifted into its own smoke-gated witness so the contract cannot quietly drift.

    What it witnesses: three related contracts on the same grid topology (SEG×SEG faces, (SEG+1)² verts, size 1.0 → coords in [-1, 1]):

    -

    1. Silent no-opcreate_grid(..., calc_uvs=True) with no prior bm.loops.layers.uv.new(...) leaves len(bm.loops.layers.uv) == 0 and mesh.uv_layers empty after to_mesh. 2. Pre-create repair — create the UV layer first, then calc_uvs=True fills every loop. UVs must match the closed form u = (x/size + 1)/2, v = (y/size + 1)/2 within 1e-6, both on the BMesh and after persisting to mesh.uv_layers.active.data. 3. Explicit assignment fallbackcalc_uvs=False, then uv.new("UVMap") and a loop write of the same closed form. Does not depend on calc_uvs at all; same tolerance.

    +
    • Silent no-opcreate_grid(..., calc_uvs=True) with no prior bm.loops.layers.uv.new(...) leaves len(bm.loops.layers.uv) == 0 and mesh.uv_layers empty after to_mesh.
    • Pre-create repair — create the UV layer first, then calc_uvs=True fills every loop. UVs must match the closed form u = (x/size + 1)/2, v = (y/size + 1)/2 within 1e-6, both on the BMesh and after persisting to mesh.uv_layers.active.data.
    • Explicit assignment fallbackcalc_uvs=False, then uv.new("UVMap") and a loop write of the same closed form. Does not depend on calc_uvs at all; same tolerance.

    What each check catches on failure:

    • *Silent no-op* — calc_uvs=True starts creating a layer on its own (falsified: expecting n_layers == 0 fails if a layer appears; temporarily pre-creating a layer before the hazard probe exits 3).
    • *Topology* — create_grid segment/size contract drift (wrong face/vert counts).
    • *Closed-form UVs* — calc_uvs filling a different parameterization, or a one-texel shift (falsified: adding 0.1 to every U exited 6 with measured error 0.1).
    • *Mesh persistence* — UV layer or loop data lost across to_mesh.
    • *Explicit path* — loop assignment or the closed form itself regressing.
    • *Pixel witness* (with --output) — the saved PNG is read back and probed at each panel's projected center: the hazard panel must be one flat teal (per-channel spread ≤ 0.02, ordering b>g>r), the repaired panel a high-contrast checker (spread ≥ 0.25). Falsified twice: secretly giving the hazard panel UVs exited 11 with measured spread 0.7333; repainting texel (0,0) magenta exited 12 with measured rgb (0.927, 0.118, 0.536).

    Version divergence: none probed — the silent no-op and closed-form UV fill assert identically on Blender 4.5 LTS and 5.1. The only gate in the file is the EEVEE engine id for the optional render (BLENDER_EEVEE_NEXT on 4.x, BLENDER_EEVEE on 5.x).

    -

    Render: two easel panels sharing one neon checker image. Left is the hazard (no UV layer) — flat teal of texel (0, 0). Right is the repair (pre-create + calc_uvs) — full magenta/cyan checker. If the UV contract failed, both panels would read the same — and the still is not just an illustration: the script re-reads its own render and exits non-zero unless the pixels prove the flat-vs-checker split (measured on 5.1.2: hazard spread 0.0078, repair spread 0.7294).

    +

    Render: two framed lightbox displays on floor trays (rear kick legs, status LED) sharing one neon checker image, shot at a slight 3/4. Left is the hazard (no UV layer) — flat teal of texel (0, 0). Right is the repair (pre-create + calc_uvs) — full magenta/cyan checker. If the UV contract failed, both panels would read the same — and the still is not just an illustration: the script re-reads its own render and exits non-zero unless the pixels prove the flat-vs-checker split (measured on 5.1.2: hazard spread 0.0078, repair spread 0.7412; identical on 4.5.11).

    Run

    # Cheap correctness check (no render) — the CI check:
     blender --background --python uv_layer_grid.py --
    @@ -227,6 +227,7 @@ 

    Source

    blender --background --python uv_layer_grid.py -- --output uv.png """ import bpy, bmesh, sys, os, math, argparse +from mathutils import Vector SEG = 8 SIZE = 1.0 @@ -452,15 +453,108 @@

    Source

    scene = bpy.context.scene card = make_uv_testcard("UVCard") - # Left: the hazard — calc_uvs alone, no UV layer → flat teal of texel (0,0). - broken = textured_plane("Broken", card, with_uvs=False) - broken.location = (-1.18, 0.0, 0.94) - broken.rotation_euler = (math.radians(62), 0.0, math.radians(8)) - - # Right: the repair — pre-create UV layer, then calc_uvs fills it. - fixed = textured_plane("Fixed", card, with_uvs=True) - fixed.location = (1.18, 0.0, 0.94) - fixed.rotation_euler = (math.radians(62), 0.0, math.radians(-8)) + # --- Staging materials: quiet and dark, the panel faces carry the color -- + def pbr(name, base, rough, metal=0.0): + m = bpy.data.materials.new(name) + m.use_nodes = True + b = m.node_tree.nodes["Principled BSDF"] + b.inputs["Base Color"].default_value = (*base, 1.0) + b.inputs["Roughness"].default_value = rough + b.inputs["Metallic"].default_value = metal + return m + + frame_mat = pbr("Frame", (0.05, 0.053, 0.06), 0.32, 0.65) + stand_mat = pbr("Stand", (0.032, 0.035, 0.042), 0.45, 0.4) + led_mat = pbr("Led", (0.0, 0.0, 0.0), 0.6) + led_b = led_mat.node_tree.nodes["Principled BSDF"] + led_b.inputs["Emission Color"].default_value = (1.0, 0.45, 0.12, 1.0) + led_b.inputs["Emission Strength"].default_value = 4.0 + + def box(name, dims, loc, rot, mat, bevel=0.0): + dx, dy, dz = (d * 0.5 for d in dims) + verts = [ + (-dx, -dy, -dz), (dx, -dy, -dz), (dx, dy, -dz), (-dx, dy, -dz), + (-dx, -dy, dz), (dx, -dy, dz), (dx, dy, dz), (-dx, dy, dz), + ] + faces = [ + (0, 1, 2, 3), (4, 7, 6, 5), (0, 4, 5, 1), + (1, 5, 6, 2), (2, 6, 7, 3), (4, 0, 3, 7), + ] + me = bpy.data.meshes.new(name) + me.from_pydata(verts, [], faces) + me.materials.append(mat) + ob = bpy.data.objects.new(name, me) + ob.location = loc + ob.rotation_euler = rot + scene.collection.objects.link(ob) + if bevel > 0.0: + mod = ob.modifiers.new("Edge", "BEVEL") + mod.width = bevel + mod.segments = 2 + return ob + + def bar_between(name, p1, p2, width, mat): + a, b = Vector(p1), Vector(p2) + d = b - a + ob = box(name, (width, width, d.length), (a + b) * 0.5, (0, 0, 0), mat, 0.01) + ob.rotation_mode = "QUATERNION" + ob.rotation_quaternion = d.to_track_quat("Z", "Y") + return ob + + # --- Two framed lightbox displays, each on a floor tray with a rear + # kick leg. The face planes keep their origins at the face centers (the + # pixel witness probes the projected centers), with a ~0.2-unit bezel + # between the face edge and the frame so the probed patch stays on data. + LEAN = math.radians(75.0) # 15° back off vertical, easel-like + + def display(name, with_uvs, cx, cy, yaw_deg): + yaw = math.radians(yaw_deg) + asm = bpy.data.objects.new(name + "Asm", None) + asm.rotation_euler = (LEAN, 0.0, yaw) + rot = asm.rotation_euler.to_matrix() + # Face-center height such that the frame's bottom edge rests in tray. + contact = rot @ Vector((0.0, -1.17, 0.02)) + asm.location = (cx, cy, 0.07 - contact.z) + scene.collection.objects.link(asm) + + # Left: the hazard — calc_uvs alone, no UV layer → flat teal of + # texel (0,0). Right: the repair — pre-create, then calc_uvs fills. + face = textured_plane(name, card, with_uvs) + face.parent = asm + face.location = (0.0, 0.0, 0.075) + + plate = box(name + "Back", (2.34, 2.34, 0.14), (0, 0, 0), (0, 0, 0), + frame_mat, 0.02) + plate.parent = asm + bezels = ( + ((2.34, 0.17, 0.20), (0.0, 1.085, 0.02)), + ((2.34, 0.17, 0.20), (0.0, -1.085, 0.02)), + ((0.17, 2.0, 0.20), (1.085, 0.0, 0.02)), + ((0.17, 2.0, 0.20), (-1.085, 0.0, 0.02)), + ) + for i, (dims, loc) in enumerate(bezels): + bez = box(f"{name}Bez{i}", dims, loc, (0, 0, 0), frame_mat, 0.02) + bez.parent = asm + led = box(name + "Led", (0.06, 0.03, 0.035), (0.92, -1.085, 0.128), + (0, 0, 0), led_mat, 0.008) + led.parent = asm + + base = asm.location + box(name + "Tray", (2.0, 0.32, 0.10), + (base.x + contact.x, base.y + contact.y, 0.05), + (0, 0, yaw), stand_mat, 0.02) + back = rot @ Vector((0.0, 0.0, -1.0)) + back.z = 0.0 + back.normalize() + for side in (-0.75, 0.75): + attach = base + rot @ Vector((side, 0.55, -0.12)) + foot = (base.x + contact.x + side * math.cos(yaw) + back.x * 0.85, + base.y + contact.y - side * math.sin(yaw) + back.y * 0.85, + 0.02) + bar_between(f"{name}Leg{side:+.2f}", attach, foot, 0.06, stand_mat) + + display("Broken", False, -1.38, 0.30, 6.0) + display("Fixed", True, 1.45, -0.10, 9.0) floor_me = bpy.data.meshes.new("Floor") bm = bmesh.new() @@ -499,21 +593,23 @@

    Source

    ob.rotation_euler = tuple(math.radians(a) for a in rot) scene.collection.objects.link(ob) - light("Key", (-3.8, -4.8, 5.8), 300.0, 4.5, (1.0, 0.96, 0.9), (52, 0, -32)) - light("Fill", (4.8, -2.8, 1.6), 55.0, 9.0, (0.75, 0.85, 1.0), (72, 0, 52)) - light("Rim", (0.2, 4.0, 2.8), 90.0, 3.2, (0.6, 0.78, 1.0), (-62, 0, 178)) - # Between the panels and the wall so it only rakes the backdrop: a - # contained warm pool, corners falling off to dark. - light("Wedge", (0.3, 5.4, 1.9), 380.0, 3.6, (1.0, 0.68, 0.38), (-72, 0, 180)) + # Aimed steeply down so its spill dies on the floor, not on the wall. + light("Key", (-4.4, -4.2, 6.4), 340.0, 5.0, (1.0, 0.96, 0.9), (60, 0, -32)) + light("Fill", (4.8, -2.8, 1.6), 80.0, 9.0, (0.75, 0.85, 1.0), (72, 0, 52)) + light("Rim", (0.2, 4.6, 3.0), 250.0, 3.5, (0.6, 0.78, 1.0), (-42, 0, 178)) + # Uplight between the displays and the wall, raking UP the backdrop: the + # visible wall band above the panel tops only spans z≈2.8–3.4, so the + # warm pool is aimed to live there instead of hiding behind the panels. + light("Wedge", (-2.2, 5.6, 2.3), 480.0, 3.0, (1.0, 0.76, 0.5), (-117, 0, 180)) aim = bpy.data.objects.new("Aim", None) - aim.location = (0.0, 0.0, 0.95) + aim.location = (0.1, 0.05, 1.0) scene.collection.objects.link(aim) cam_data = bpy.data.cameras.new("Cam") - cam_data.lens = 45.0 + cam_data.lens = 48.0 cam = bpy.data.objects.new("Cam", cam_data) - cam.location = (0.0, -6.6, 2.1) + cam.location = (3.1, -8.35, 2.2) con = cam.constraints.new("TRACK_TO") con.target = aim con.track_axis = "TRACK_NEGATIVE_Z" diff --git a/docs/gallery/vertex-weight-limit/index.html b/docs/gallery/vertex-weight-limit/index.html index 0a47222..c19bc08 100644 --- a/docs/gallery/vertex-weight-limit/index.html +++ b/docs/gallery/vertex-weight-limit/index.html @@ -186,7 +186,7 @@

    vertex-weight-limit

    A runnable example that rigs a mech arm — flanged bolted pedestal and shoulder fairing, a panel-seamed upper arm ending in clevis cheeks, the elbow hinge pin and knuckle barrel capped with hex bolts through a ribbed flex cuff, a long seam-grooved forearm, wrist cuff and collar, and a three-finger gripper — with deliberately rich five-bone weight bumps in the cuffs, then enforces the game-engine maximum of four bone influences per vertex through the data API, following mesh-editing-and-bmesh and building on the linear-blend-skinning precedent of armature-bend.

    Pipeline arc: modeling/LOD in lod-decimate-chain, weighting here, export in gltf-export-roundtrip.

    What it witnesses: the skinning constraint every game engine enforces and AI-generated rigging code most often violates silently.

    -

    1. The limit is a data-API operation, not a context operator. Instead of bpy.ops.object.vertex_group_limit_total, the example reads each vertex's groups, keeps the top four by weight, VertexGroup.removes the rest, and renormalizes the survivors. Dropping without renormalizing leaves sums at 0.984 — a mesh that shrinks toward the origin under load (the check's measured failure, 1.616e-02 off unit sum). 2. The armature modifier is still exactly linear blend skinning after the limit: every depsgraph-evaluated vertex equals Σ wᵢ · (pose.matrix @ bone.matrix_local.inverted()) @ rest, with the weights read back from the mesh's own deform layer (v.groups) — the weights on the mesh are the contract, not the weights you meant to write. Measured lbs_err = 2.7e-07. 3. Pruning must not damage the pose. Evaluated positions before and after the limit are held within 0.05 (measured 2.8e-03), the pedestal mount stays exactly pinned (Root is unposed), and the pre-limit authoring really carries five influences in the cuffs — otherwise the witness would be vacuous.

    +
    • The limit is a data-API operation, not a context operator. Instead of bpy.ops.object.vertex_group_limit_total, the example reads each vertex's groups, keeps the top four by weight, VertexGroup.removes the rest, and renormalizes the survivors. Dropping without renormalizing leaves sums at 0.984 — a mesh that shrinks toward the origin under load (the check's measured failure, 1.616e-02 off unit sum).
    • The armature modifier is still exactly linear blend skinning after the limit: every depsgraph-evaluated vertex equals Σ wᵢ · (pose.matrix @ bone.matrix_local.inverted()) @ rest, with the weights read back from the mesh's own deform layer (v.groups) — the weights on the mesh are the contract, not the weights you meant to write. Measured lbs_err = 2.7e-07.
    • Pruning must not damage the pose. Evaluated positions before and after the limit are held within 0.05 (measured 2.8e-03), the pedestal mount stays exactly pinned (Root is unposed), and the pre-limit authoring really carries five influences in the cuffs — otherwise the witness would be vacuous.

    The vertex-group API (v.groups, VertexGroup.add/remove) is stable between Blender 4.5 LTS and 5.1 — the example runs identically on both, which is itself the version witness (measured values match to the digit).

    The render shows the pruned arm mid-pose: the flex cuffs carry the teal accent — the five-influence zones the limit prunes glow at the elbow hinge and wrist, sealed by the bright hoop on the elbow cuff — proof that the limited weights still deform as authored.

    Run

    diff --git a/docs/gallery/vse-cut-list/index.html b/docs/gallery/vse-cut-list/index.html index ab67cf9..18804b4 100644 --- a/docs/gallery/vse-cut-list/index.html +++ b/docs/gallery/vse-cut-list/index.html @@ -185,7 +185,7 @@

    vse-cut-list

    A runnable example that witnesses the sequencer API rename between Blender 4.5 LTS and 5.x — the single most common way AI-generated VSE code dies on a modern Blender. Every tutorial-era snippet does scene.sequence_editor.sequences.new_effect(..., frame_end=...); on 5.x that path is gone twice over (sequences removed, frame_end kwarg rejected), and on 4.5 the modern spelling (strips, length=) is already the only one the new collection accepts.

    What it witnesses: a deterministic cut list — three color programs A/B/C, a GAMMA_CROSS fed by a dedicated source pair T1/T2, a scene strip, and a text strip — asserted against closed-form spans on each version's canonical accessors, then re-asserted after a save/reload round-trip:

    -

    1. Accessor rename — 5.x: sequence_editor.sequences raises AttributeError; only .strips exists. 4.5: both accessors exist and see the same strips (the transition bridge). 2. Creation signaturestrips.new_effect(...) ends a strip with frame_end= on 4.5 but length= on 5.x; the wrong kwarg raises TypeError on each side (asserted, not assumed). 5.x also rejects the removed TRANSFORM effect type — per-strip strip.transform (StripTransform) places strips in the frame on both versions. 3. Frame-range closed form — every strip's (start, end, duration) matches the authored end-exclusive span: frame_final_* on 4.5; left_handle/right_handle/duration on 5.x, where the frame_final_* names are deprecated aliases (removal announced for 6.0) that must still read equal — the bridge is asserted lossless, with the RNA is_deprecated flag checked on 5.x and its absence checked on 4.5. 4. Effect wiringinput_1/input_2 (not input1) on both versions, in authored order, and the cross clamped to exactly the T1/T2 overlap. 5. Scene strip — 4-arg new_scene(name, scene, channel, frame_start) on both versions (no length/frame_end kwarg); default span is the source scene's frame range; the strip sources a *separate* Stage scene. 6. Round-trip — spans, channels, colors, GC wiring, text, and mosaic transforms (pixel-unit offsets, tol 1e-3) all survive save_as_mainfileopen_mainfile. 7. Compositing (--check-pixels) — a 96×54 render asserts each mosaic cell center carries its strip color (tol 0.1), the cross cell is a true mid blend (strictly between the sources on every channel), and a margin point matches neither cross source — because a consumed input compositing independently would paint it full-frame.

    +
    • Accessor rename — 5.x: sequence_editor.sequences raises AttributeError; only .strips exists. 4.5: both accessors exist and see the same strips (the transition bridge).
    • Creation signaturestrips.new_effect(...) ends a strip with frame_end= on 4.5 but length= on 5.x; the wrong kwarg raises TypeError on each side (asserted, not assumed). 5.x also rejects the removed TRANSFORM effect type — per-strip strip.transform (StripTransform) places strips in the frame on both versions.
    • Frame-range closed form — every strip's (start, end, duration) matches the authored end-exclusive span: frame_final_* on 4.5; left_handle/right_handle/duration on 5.x, where the frame_final_* names are deprecated aliases (removal announced for 6.0) that must still read equal — the bridge is asserted lossless, with the RNA is_deprecated flag checked on 5.x and its absence checked on 4.5.
    • Effect wiringinput_1/input_2 (not input1) on both versions, in authored order, and the cross clamped to exactly the T1/T2 overlap.
    • Scene strip — 4-arg new_scene(name, scene, channel, frame_start) on both versions (no length/frame_end kwarg); default span is the source scene's frame range; the strip sources a *separate* Stage scene.
    • Round-trip — spans, channels, colors, GC wiring, text, and mosaic transforms (pixel-unit offsets, tol 1e-3) all survive save_as_mainfileopen_mainfile.
    • Compositing (--check-pixels) — a 96×54 render asserts each mosaic cell center carries its strip color (tol 0.1), the cross cell is a true mid blend (strictly between the sources on every channel), and a margin point matches neither cross source — because a consumed input compositing independently would paint it full-frame.

    What each check catches on failure:

    • *Accessor* — .sequences returning on 5.x, or the 4.5 bridge seeing different contents (falsified: the legacy path on 5.1.1 raises AttributeError: 'SequenceEditor' object has no attribute 'sequences').
    • *Creation* — Blender re-accepting a removed kwarg silently, or the TRANSFORM enum returning (falsified: calling new_effect(frame_end=...) on 5.1.1 raises TypeError: ... expected (name, type, channel, frame_start, length, input1, input2)).
    • *Spans* — end-inclusive vs end-exclusive off-by-one, retiming drift (falsified: expecting GC span (25, 34) exited 5 with measured GC span (25, 33, 8) != closed form (25, 34, 9) — note the cross was *clamped* to the 8-frame overlap, itself a witnessed behavior).
    • *Wiring* — swapped or dropped cross inputs (falsified: input1=t2, input2=t1 exited 7 with measured inputs=(T2, T1), expected T1 -> T2).
    • *Round-trip* — serialization dropping strip data (falsified: corrupting the text strip before save exited 10 via the reloaded re-assert).
    • *Pixels* — a broken span or cell transform dropping a cell, a frozen cross, or a consumed input leaking back into the composite (found by authoring: GC below T1/T2 let T2 paint the whole wall teal).

    Hazards discovered while authoring (all witnessed by the checks above):

    diff --git a/examples/gltf-export-roundtrip/README.md b/examples/gltf-export-roundtrip/README.md index 4789bf0..31418b6 100644 --- a/examples/gltf-export-roundtrip/README.md +++ b/examples/gltf-export-roundtrip/README.md @@ -13,23 +13,23 @@ weighting in [`vertex-weight-limit`](../vertex-weight-limit/), export here. **What it witnesses:** the interchange contracts AI-generated export code most often gets silently wrong. -1. **The +Y-up convention is baked into vertex data.** glTF is +Y-up, Blender is - +Z-up, and `export_yup=True` (the default) writes `(x, y, z) -> (x, z, -y)` - directly into the POSITION buffer — the node carries **no** rotation or scale. - The check parses the `.gltf` JSON and asserts the accessor bounds equal the - axis-converted evaluated bounding box, and that the node transform is absent. - Exporting with `export_yup=False` ships raw Z-up data every engine displays - lying on its back. -2. **`export_apply=True` ships the evaluated mesh, not the base cage.** The - crate's bevel modifier lives only in the depsgraph; with flat shading and UV - seams the exporter splits exactly one vertex per evaluated loop (7,560), so - the on-disk POSITION count is an exact witness. `export_apply=False` silently - writes the 624-vertex cage. -3. **The round-trip is faithful.** Re-imported positions (bit-exact here), loop - normals (≤2e-4), box-mapped UVs (≤3e-5), and per-triangle material bindings - all match the evaluated mesh. UVs are V-flipped on disk (glTF texture origin - is top-left) and flipped back on import — both flips are proven by reading - the `.bin` buffer directly. +- **The +Y-up convention is baked into vertex data.** glTF is +Y-up, Blender is + +Z-up, and `export_yup=True` (the default) writes `(x, y, z) -> (x, z, -y)` + directly into the POSITION buffer — the node carries **no** rotation or scale. + The check parses the `.gltf` JSON and asserts the accessor bounds equal the + axis-converted evaluated bounding box, and that the node transform is absent. + Exporting with `export_yup=False` ships raw Z-up data every engine displays + lying on its back. +- **`export_apply=True` ships the evaluated mesh, not the base cage.** The + crate's bevel modifier lives only in the depsgraph; with flat shading and UV + seams the exporter splits exactly one vertex per evaluated loop (7,560), so + the on-disk POSITION count is an exact witness. `export_apply=False` silently + writes the 624-vertex cage. +- **The round-trip is faithful.** Re-imported positions (bit-exact here), loop + normals (≤2e-4), box-mapped UVs (≤3e-5), and per-triangle material bindings + all match the evaluated mesh. UVs are V-flipped on disk (glTF texture origin + is top-left) and flipped back on import — both flips are proven by reading + the `.bin` buffer directly. **Version witness (probed on Blender 4.5.11 LTS and 5.1.2):** the operator signatures are byte-identical — 109 exporter properties, 20 importer properties, diff --git a/examples/gltf-skin-roundtrip/README.md b/examples/gltf-skin-roundtrip/README.md index 93fe7d5..7c09988 100644 --- a/examples/gltf-skin-roundtrip/README.md +++ b/examples/gltf-skin-roundtrip/README.md @@ -15,24 +15,24 @@ maps are in [`triangulate-tangents`](../triangulate-tangents/). **What it witnesses:** the skinned-mesh export contract the geometry round-trip left uncovered. -1. **The skeleton survives.** `skins[0].joints` names every bone; the - re-imported armature carries the same 7 bones, the same parent chain, and - rest matrices within 2.4e-07 — the +Y-up conversion applies to bone nodes - exactly as it does to meshes (their translations convert, no rotation is - written). -2. **The weights survive.** Every primitive carries JOINTS_0/WEIGHTS_0; - per-vertex weights on disk sum to 1 (err 3.0e-08); the re-imported vertex - groups match the authored groups **bit-exactly** (w_err 0.0), compared as - straddle-safe position keys, the same protocol as the crate example. -3. **The deformation survives.** Posed identically, the re-imported rig's - evaluated mesh matches the original's within 4.8e-07 — linear blend - skinning through the file format. The comparison is by rest-position key, - never sorted multisets: the exporter welds duplicate loops (32 here), so - cardinalities differ and a naive sorted zip mispairs vertices (a phantom - 2.29 "deviation" measured and fixed during authoring). -4. **The mesh must be parented to the armature.** The exporter warns - "Armature must be the parent of skinned mesh" and picks an armature by - name otherwise — with two rigs in the file it can bind the wrong one. +- **The skeleton survives.** `skins[0].joints` names every bone; the + re-imported armature carries the same 7 bones, the same parent chain, and + rest matrices within 2.4e-07 — the +Y-up conversion applies to bone nodes + exactly as it does to meshes (their translations convert, no rotation is + written). +- **The weights survive.** Every primitive carries JOINTS_0/WEIGHTS_0; + per-vertex weights on disk sum to 1 (err 3.0e-08); the re-imported vertex + groups match the authored groups **bit-exactly** (w_err 0.0), compared as + straddle-safe position keys, the same protocol as the crate example. +- **The deformation survives.** Posed identically, the re-imported rig's + evaluated mesh matches the original's within 4.8e-07 — linear blend + skinning through the file format. The comparison is by rest-position key, + never sorted multisets: the exporter welds duplicate loops (32 here), so + cardinalities differ and a naive sorted zip mispairs vertices (a phantom + 2.29 "deviation" measured and fixed during authoring). +- **The mesh must be parented to the armature.** The exporter warns + "Armature must be the parent of skinned mesh" and picks an armature by + name otherwise — with two rigs in the file it can bind the wrong one. **What each check catches on failure:** exporting with `export_skins=False` (exit 5 — no skin on disk), stripping the weights (exit 4 — no vertex diff --git a/examples/image-pixels-testcard/README.md b/examples/image-pixels-testcard/README.md index becb511..71c7e6c 100644 --- a/examples/image-pixels-testcard/README.md +++ b/examples/image-pixels-testcard/README.md @@ -66,4 +66,9 @@ It exits non-zero on failure and prints every measured error and tolerance on su so CI logs carry the numbers. The `blender-smoke` workflow runs the check on Blender 4.5 LTS and 5.1. In the render, `Closest` interpolation keeps the pixel grid honest — the jagged circle edge is the 512 × 288 buffer itself, and the white marker in the -PLUGE row sits at the bottom-left because that is where pixel (0, 0) lives. +PLUGE row sits at the bottom-left because that is where pixel (0, 0) lives. The +monitor is staged as a designed object — beveled dark-polymer case, machined metal +stand, teal power LED — on the dark studio stage from `docs/VISUAL-STYLE.md` +(Standard view transform; warm key, cool fill and rim; a warm pool raking the back +wall). The screen stays emissive and matte — specular off, emission strength 1.0 — +so the card's values read exactly. diff --git a/examples/image-pixels-testcard/image_pixels_testcard.py b/examples/image-pixels-testcard/image_pixels_testcard.py index e9016d2..27f1580 100644 --- a/examples/image-pixels-testcard/image_pixels_testcard.py +++ b/examples/image-pixels-testcard/image_pixels_testcard.py @@ -198,14 +198,56 @@ def eevee_engine_id(): def render_still(path, engine): import bmesh + from mathutils import Vector scene = bpy.context.scene + # Standard view transform, always: AgX lifts the stage toward grey and + # washes the bars pastel (docs/VISUAL-STYLE.md) + scene.view_settings.view_transform = 'Standard' # the card itself: a byte sRGB image, written with the one bulk call card = bpy.data.images.new("TestCard", W, H, alpha=False) card.pixels.foreach_set(flat_pattern()) - # screen: emissive plane textured with the card (16:9, 3.2 wide) + def principled(name, base, rough, metallic=0.0, emit=None, estr=0.0): + m = bpy.data.materials.new(name) + m.use_nodes = True + b = m.node_tree.nodes["Principled BSDF"] + b.inputs["Base Color"].default_value = (*base, 1.0) + b.inputs["Roughness"].default_value = rough + b.inputs["Metallic"].default_value = metallic + if emit is not None: + b.inputs["Emission Color"].default_value = (*emit, 1.0) + b.inputs["Emission Strength"].default_value = estr + return m + + def box(name, dims, mat, loc, bevel=0.0): + """A world-dimensioned box; a small bevel catches a machined edge line.""" + me = bpy.data.meshes.new(name) + bm = bmesh.new() + try: + bmesh.ops.create_cube(bm, size=1.0) + bmesh.ops.scale(bm, vec=Vector(dims), verts=bm.verts) + for f in bm.faces: + f.smooth = bevel > 0.0 + bm.to_mesh(me) + finally: + bm.free() + me.materials.append(mat) + ob = bpy.data.objects.new(name, me) + ob.location = loc + scene.collection.objects.link(ob) + if bevel > 0.0: + mod = ob.modifiers.new("EdgeBevel", 'BEVEL') + mod.width = bevel + mod.segments = 3 + mod.limit_method = 'ANGLE' + return ob + + # -- the monitor: designed object, not a black slab ---------------------- + # screen: emissive plane textured with the card (16:9, 3.2 wide), centered + # at standing height on its stand sw, sh = 3.2, 1.8 + scr_z = 1.61 screen_me = bpy.data.meshes.new("Screen") bm = bmesh.new() try: @@ -228,46 +270,31 @@ def render_still(path, engine): bsdf = nodes["Principled BSDF"] bsdf.inputs["Base Color"].default_value = (0.0, 0.0, 0.0, 1.0) bsdf.inputs["Roughness"].default_value = 0.4 + # matte: specular off so the wall/floor horizon never reflects as a line + # across the witness data; emission 1.0 so the card reads exactly + bsdf.inputs["Specular IOR Level"].default_value = 0.0 links.new(tex.outputs["Color"], bsdf.inputs["Emission Color"]) - bsdf.inputs["Emission Strength"].default_value = 1.35 # hotter washes the bars pastel + bsdf.inputs["Emission Strength"].default_value = 1.0 screen_me.materials.append(smat) screen = bpy.data.objects.new("Screen", screen_me) screen.scale = (sw, sh, 1.0) - screen.rotation_euler = (math.radians(90), 0.0, math.radians(-16)) - screen.location = (0.0, 0.0, sh / 2 + 0.14) + screen.rotation_euler = (math.radians(90), 0.0, 0.0) + screen.location = (0.0, 0.0, scr_z) scene.collection.objects.link(screen) - # bezel: a slightly larger dark slab just behind the screen - bezel_me = bpy.data.meshes.new("Bezel") - bm = bmesh.new() - try: - bmesh.ops.create_cube(bm, size=1.0) - bm.to_mesh(bezel_me) - finally: - bm.free() - bmat = bpy.data.materials.new("Bezel") - bmat.use_nodes = True - bb = bmat.node_tree.nodes["Principled BSDF"] - bb.inputs["Base Color"].default_value = (0.02, 0.022, 0.025, 1.0) - bb.inputs["Roughness"].default_value = 0.28 - bb.inputs["Metallic"].default_value = 0.6 - bezel_me.materials.append(bmat) - bezel = bpy.data.objects.new("Bezel", bezel_me) - bezel.scale = (sw + 0.14, 0.09, sh + 0.14) - bezel.rotation_euler = (0.0, 0.0, math.radians(-16)) - # offset along the yawed screen normal so the slab stays behind the plane - bezel.location = (0.052 * math.sin(math.radians(16)), - 0.052 * math.cos(math.radians(16)), sh / 2 + 0.14) - scene.collection.objects.link(bezel) - - # plinth foot under the monitor - foot = bpy.data.objects.new("Foot", bezel_me.copy()) - foot.data.materials.clear(); foot.data.materials.append(bmat) - foot.scale = (1.1, 0.5, 0.14) - foot.location = (0.0, 0.05, 0.07) - scene.collection.objects.link(foot) - - # glossy dark floor + back wall + # case: dark polymer shell with a beveled edge the rim light can draw + case_mat = principled("CasePolymer", (0.030, 0.034, 0.042), 0.38) + metal_mat = principled("StandMetal", (0.055, 0.060, 0.070), 0.36, metallic=0.7) + box("Case", (sw + 0.18, 0.11, sh + 0.18), case_mat, (0.0, 0.057, scr_z), bevel=0.03) + # machined stand: neck + base plate + box("Neck", (0.30, 0.14, 0.64), metal_mat, (0.0, 0.10, 0.37), bevel=0.025) + box("Base", (1.45, 0.85, 0.07), metal_mat, (0.0, 0.12, 0.035), bevel=0.03) + # power LED on the bottom bezel, a small designed detail + glow_mat = principled("Glow", (0.0, 0.0, 0.0), 0.5, emit=(0.10, 0.85, 0.75), estr=6.0) + box("LED", (0.05, 0.02, 0.02), glow_mat, (1.30, -0.006, scr_z - sh / 2 - 0.045)) + + # -- stage: near-black floor + back wall, matte -------------------------- + stage_mat = principled("Studio", (0.03, 0.032, 0.037), 0.7) floor_me = bpy.data.meshes.new("Floor") bm = bmesh.new() try: @@ -275,54 +302,49 @@ def render_still(path, engine): bm.to_mesh(floor_me) finally: bm.free() - fmat = bpy.data.materials.new("Studio") - fmat.use_nodes = True - fb = fmat.node_tree.nodes["Principled BSDF"] - fb.inputs["Base Color"].default_value = (0.045, 0.05, 0.06, 1.0) - fb.inputs["Roughness"].default_value = 0.18 - floor_me.materials.append(fmat) + floor_me.materials.append(stage_mat) floor = bpy.data.objects.new("Floor", floor_me) scene.collection.objects.link(floor) wall = bpy.data.objects.new("Wall", floor_me.copy()) - wall.location = (0.0, 9.0, 0.0) + wall.location = (0.0, 8.5, 0.0) wall.rotation_euler = (math.radians(90), 0.0, 0.0) scene.collection.objects.link(wall) world = bpy.data.worlds.new("World") world.use_nodes = True - world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.025, 0.03, 0.04, 1.0) + world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.02, 0.021, 0.025, 1.0) scene.world = world - def light(name, loc, energy, size, col, rot): + # -- lighting: shaped warm key, cool fill/rim, warm pool on the wall ----- + def light(name, loc, target, energy, size, col): ld = bpy.data.lights.new(name, 'AREA') - ld.energy = energy; ld.size = size; ld.color = col + ld.energy = energy + ld.size = size + ld.color = col ob = bpy.data.objects.new(name, ld) ob.location = loc - ob.rotation_euler = tuple(math.radians(a) for a in rot) + # aim exactly at the target — a guessed euler is how stray bands happen + d = Vector(target) - Vector(loc) + ob.rotation_euler = d.to_track_quat('-Z', 'Y').to_euler() scene.collection.objects.link(ob) - # teal underglow bar tucked beneath the monitor, spilling onto the floor - strip = bpy.data.objects.new("GlowStrip", bezel_me.copy()) - gmat = bpy.data.materials.new("Glow") - gmat.use_nodes = True - gb = gmat.node_tree.nodes["Principled BSDF"] - gb.inputs["Emission Color"].default_value = (0.1, 0.9, 0.8, 1.0) - gb.inputs["Emission Strength"].default_value = 12.0 - strip.data.materials.clear(); strip.data.materials.append(gmat) - strip.scale = (2.7, 0.045, 0.015) - strip.rotation_euler = (0.0, 0.0, math.radians(-16)) - strip.location = (0.0, -0.10, 0.015) - scene.collection.objects.link(strip) - - # the card is its own key light; cool fill and a warm rim shape the bezel - light("Fill", (-5.2, -3.0, 3.6), 80.0, 7.0, (0.7, 0.8, 1.0), (58, 0, -60)) - light("Rim", (4.2, 2.8, 2.2), 260.0, 2.5, (1.0, 0.72, 0.45), (-70, 0, 125)) - + light("Key", (-4.0, -5.0, 6.0), (0.0, 0.0, 1.3), 420.0, 5.0, (1.0, 0.96, 0.9)) + light("Fill", (4.2, -1.8, 2.4), (0.0, 0.0, 1.5), 55.0, 9.0, (0.75, 0.85, 1.0)) + light("Rim", (3.4, 2.8, 3.4), (0.3, 0.0, 1.6), 320.0, 3.0, (0.6, 0.78, 1.0)) + # the signature: a warm pool raking the back wall behind the subject; + # aimed at the wall well above the floor seam so the seam stays in shadow + light("Wedge", (3.2, 5.2, 6.2), (2.4, 8.5, 4.2), 500.0, 5.0, (1.0, 0.76, 0.5)) + + # camera: 50 mm, slightly above the subject, tracking an empty on it + target = bpy.data.objects.new("AimTarget", None) + target.location = (0.0, 0.0, 1.42) + scene.collection.objects.link(target) cam_data = bpy.data.cameras.new("Cam") - cam_data.lens = 44.0 + cam_data.lens = 50.0 cam = bpy.data.objects.new("Cam", cam_data) - cam.location = (-2.45, -5.7, 1.62) - cam.rotation_euler = (math.radians(84.5), 0.0, math.radians(-23.0)) + cam.location = (-4.2, -7.7, 2.85) + con = cam.constraints.new('TRACK_TO') + con.target = target scene.collection.objects.link(cam) scene.camera = cam diff --git a/examples/image-pixels-testcard/preview.webp b/examples/image-pixels-testcard/preview.webp index 7ff5549421a6ef7985031fd2039459b30b76db7e..acc15187a8be0bbfae4eeab49527cb3a035b0233 100644 GIT binary patch literal 15352 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 W9>PKsq4Cvc($)s^A!f~mzyJW7n$^Sr literal 15930 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 |w>WkEUJ^>Y`tY3!&E0A(G7B9)ej3 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 c9kZVK7= 0.90` (measured **0.98**). -2. **Float → OpenEXR fidelity** — same authored buffer round-trips within - `1e-5` (measured ~`3e-8`). -3. **Byte → PNG straight alpha** — `float_buffer=False` writes RGBA8; pixels - match independent per-channel `q8` within `0.5/255`. The stress cell at - `(0.02, a=1/255)` stays near 0.02, not clamped white. -4. **EXR `color_mode='RGB'` drops alpha** — `save_render` with - `color_mode='RGB'` reloads opaque alpha (`≈ 1.0`) even when authored - alpha was `1/255`. +- **Float → PNG false unpremul** — `Image.save()` on a Non-Color float image + writes RGBA16 (`IHDR` bit_depth=16, color_type=6). Reloaded pixels match + the closed form `q16(min(1, c / q16(a)))` within `2/65535`. Max RGB error + vs authored on the probe palette is `>= 0.90` (measured **0.98**). +- **Float → OpenEXR fidelity** — same authored buffer round-trips within + `1e-5` (measured ~`3e-8`). +- **Byte → PNG straight alpha** — `float_buffer=False` writes RGBA8; pixels + match independent per-channel `q8` within `0.5/255`. The stress cell at + `(0.02, a=1/255)` stays near 0.02, not clamped white. +- **EXR `color_mode='RGB'` drops alpha** — `save_render` with + `color_mode='RGB'` reloads opaque alpha (`≈ 1.0`) even when authored + alpha was `1/255`. **What each check catches on failure:** @@ -51,9 +51,11 @@ treat a 4.4 run as a 4.5 substitute). The only version gate in the file is the EEVEE engine id for the optional render (`BLENDER_EEVEE_NEXT` on 4.x, `BLENDER_EEVEE` on 5.x). -**Render:** two easel panels. Left bakes the closed-form PNG mangling (dark -rows flash to white at low-alpha columns). Right shows the authored straight -buffer (EXR-clean). If the contract failed, both panels would read the same. +**Render:** two framed verification displays on a shared plinth — the +left face bakes the closed-form PNG mangling (dark rows flash to white at +low-alpha columns), the right face shows the authored straight buffer +(EXR-clean); nameplates read `FLOAT → PNG` and `FLOAT → EXR`. If the +contract failed, both panels would read the same. ## Run diff --git a/examples/png-exr-alpha/png_exr_alpha.py b/examples/png-exr-alpha/png_exr_alpha.py index 7a6df8c..baa1a1a 100644 --- a/examples/png-exr-alpha/png_exr_alpha.py +++ b/examples/png-exr-alpha/png_exr_alpha.py @@ -11,8 +11,8 @@ AI-generated Blender code commonly trusts `Image.save()` to PNG for float RGBA scratch buffers (masks, ID mattes, AOVs). Pass --output to also render -a dual-easel still: left is the PNG-mangled reload, right is the EXR-clean -reload. +a staged still of two framed verification displays: left is the PNG-mangled +reload, right is the EXR-clean reload. blender --background --python png_exr_alpha.py -- blender --background --python png_exr_alpha.py -- --output alpha.png @@ -331,22 +331,16 @@ def eevee_engine_id(): return "BLENDER_EEVEE" if bpy.app.version >= (5, 0, 0) else "BLENDER_EEVEE_NEXT" -def specular_off(bsdf): - if "Specular IOR Level" in bsdf.inputs: - bsdf.inputs["Specular IOR Level"].default_value = 0.0 - elif "Specular" in bsdf.inputs: - bsdf.inputs["Specular"].default_value = 0.0 - - def make_gallery_card(name, mangled): - """Visual card of the false-unpremul contract for the dual-easel still. + """Visual card of the false-unpremul contract for the staged still. Columns = rising alpha; top rows = dark mid-tones that PNG clamps to white; lower rows = primaries that survive. Left panel bakes the closed-form mangling; right panel shows authored straight RGBA. - A dark bezel is painted into the texture so panel edges read as framed - objects in the studio still (render-only — checks use fill_pattern). + A dark trim is painted into the texture edge so the emissive face reads + as a recessed screen inside its physical bezel (render-only — checks + use fill_pattern). """ gw, gh = 256, 192 border = 10 @@ -387,8 +381,46 @@ def make_gallery_card(name, mangled): return img -def easel_plane(name, image, loc, rot_z_deg): - """Single-plane easel + short stand — no dual-surface z-fight.""" +def fixture_mats(): + """Designed non-data surfaces: dark polymer bezels, rail-steel struts, + machined nameplates, plinth — no Principled defaults.""" + def mat_principled(name, color, metallic, rough): + mat = bpy.data.materials.new(name) + mat.use_nodes = True + bsdf = mat.node_tree.nodes["Principled BSDF"] + bsdf.inputs["Base Color"].default_value = (*color, 1.0) + bsdf.inputs["Metallic"].default_value = metallic + bsdf.inputs["Roughness"].default_value = rough + return mat + + return { + "bezel": mat_principled("BezelPolymer", (0.045, 0.048, 0.055), 0.1, 0.5), + "rail": mat_principled("RailSteel", (0.075, 0.08, 0.09), 0.6, 0.45), + "plinth": mat_principled("PlinthSteel", (0.10, 0.11, 0.12), 0.6, 0.5), + "plate": mat_principled("PlateSteel", (0.14, 0.15, 0.17), 0.7, 0.4), + } + + +def box_obj(name, dims, loc, mat, rot_x=0.0): + me = bpy.data.meshes.new(name) + bm = bmesh.new() + try: + bmesh.ops.create_cube(bm, size=1.0) + bm.to_mesh(me) + finally: + bm.free() + me.materials.append(mat) + ob = bpy.data.objects.new(name, me) + ob.scale = dims + ob.location = loc + ob.rotation_euler = (rot_x, 0.0, 0.0) + bpy.context.collection.objects.link(ob) + return ob + + +def face_mesh(name): + """UV-mapped unit plane (create_grid lies in XY facing +Z; the display + unit rotates it vertical).""" me = bpy.data.meshes.new(name) bm = bmesh.new() try: @@ -404,84 +436,101 @@ def easel_plane(name, image, loc, rot_z_deg): bm.to_mesh(me) finally: bm.free() + return me - mat = bpy.data.materials.new(name + "Mat") + +def face_mat(name, image): + """Data faces stay pure emission: exact card values, no specular, no + shading — the panel is a backlit data display.""" + mat = bpy.data.materials.new(name) mat.use_nodes = True nt = mat.node_tree - nodes, links = nt.nodes, nt.links - bsdf = nodes["Principled BSDF"] - tex = nodes.new("ShaderNodeTexImage") + nt.nodes.clear() + out = nt.nodes.new("ShaderNodeOutputMaterial") + em = nt.nodes.new("ShaderNodeEmission") + tex = nt.nodes.new("ShaderNodeTexImage") tex.image = image tex.interpolation = "Closest" - links.new(tex.outputs["Color"], bsdf.inputs["Base Color"]) - links.new(tex.outputs["Color"], bsdf.inputs["Emission Color"]) - bsdf.inputs["Roughness"].default_value = 1.0 - specular_off(bsdf) - # Faint emission so clamps read under a dim stage without washing the wall. - bsdf.inputs["Emission Strength"].default_value = 0.22 - me.materials.append(mat) + nt.links.new(tex.outputs["Color"], em.inputs["Color"]) + nt.links.new(em.outputs["Emission"], out.inputs["Surface"]) + em.inputs["Strength"].default_value = 1.0 + return mat + +def caption_mat(): + mat = bpy.data.materials.new("CaptionGrey") + mat.use_nodes = True + cb = mat.node_tree.nodes["Principled BSDF"] + cb.inputs["Base Color"].default_value = (0.42, 0.44, 0.48, 1.0) + cb.inputs["Metallic"].default_value = 0.2 + cb.inputs["Roughness"].default_value = 0.6 + sock = cb.inputs.get("Emission Color") or cb.inputs["Emission"] + sock.default_value = (0.38, 0.40, 0.45, 1.0) + cb.inputs["Emission Strength"].default_value = 0.5 + return mat + + +def display_unit(name, image, caption, x, mats, capmat): + """One verification display: the emissive data face seated proud of a + thick dark bezel, carried by a rear strut and foot, with a machined + nameplate under the bezel — a physical instrument standing on the + shared plinth, not a floating texture.""" root = bpy.data.objects.new(name, None) - root.location = loc - root.rotation_euler = (math.radians(62), 0.0, math.radians(rot_z_deg)) - root.scale = (0.88, 0.88, 0.88) + root.location = (x, 0.0, 0.0) bpy.context.collection.objects.link(root) - face = bpy.data.objects.new(name + "Face", me) - bpy.context.collection.objects.link(face) - face.parent = root + def adopt(ob): + ob.parent = root + return ob - stand_me = bpy.data.meshes.new(name + "Stand") - bm = bmesh.new() - try: - bmesh.ops.create_cube(bm, size=1.0) - bm.to_mesh(stand_me) - finally: - bm.free() - smat = bpy.data.materials.new(name + "StandMat") - smat.use_nodes = True - sb = smat.node_tree.nodes["Principled BSDF"] - sb.inputs["Base Color"].default_value = (0.045, 0.048, 0.055, 1.0) - sb.inputs["Roughness"].default_value = 0.45 - if "Metallic" in sb.inputs: - sb.inputs["Metallic"].default_value = 0.3 - stand_me.materials.append(smat) - stand = bpy.data.objects.new(name + "Stand", stand_me) - # Fully below the card face — never intersects the evidence plane. - stand.scale = (0.06, 0.06, 0.28) - stand.location = (0.0, 0.04, -0.88) - bpy.context.collection.objects.link(stand) - stand.parent = root + # bezel with real thickness; the face sits proud of its front surface + adopt(box_obj(name + "Bezel", (2.64, 0.16, 2.04), (0.0, 0.0, 1.80), + mats["bezel"])) + face = bpy.data.objects.new(name + "Face", face_mesh(name + "Face")) + bpy.context.collection.objects.link(face) + face.data.materials.append(face_mat(name + "FaceMat", image)) + face.location = (0.0, -0.085, 1.80) + face.rotation_euler = (math.radians(90), 0.0, 0.0) + face.scale = (1.20, 0.90, 1.0) + adopt(face) + # rear strut leaning onto the bezel back, foot on the plinth top + adopt(box_obj(name + "Strut", (0.26, 0.30, 1.30), (0.0, 0.42, 1.10), + mats["rail"], rot_x=math.radians(18))) + adopt(box_obj(name + "Foot", (0.60, 0.80, 0.10), (0.0, 0.72, 0.50), + mats["rail"])) + # nameplate bridging bezel bottom and plinth top + adopt(box_obj(name + "Plate", (1.60, 0.06, 0.26), (0.0, -0.03, 0.63), + mats["plate"])) + cu = bpy.data.curves.new(name + "Caption", "FONT") + cu.body = caption + cu.align_x = "CENTER" + cu.align_y = "CENTER" + cu.size = 0.15 + cu.extrude = 0.004 + cu.materials.append(capmat) + cap = bpy.data.objects.new(name + "Caption", cu) + cap.location = (0.0, -0.065, 0.63) + cap.rotation_euler = (math.radians(90), 0.0, 0.0) + bpy.context.collection.objects.link(cap) + adopt(cap) return root def render_still(path, engine): + import mathutils + scene = bpy.context.scene png_card = make_gallery_card("PngMangled", mangled=True) exr_card = make_gallery_card("ExrClean", mangled=False) - # Mounted easels on a shared dark table — continuous base, no V-tear shadow. - easel_plane("PngPanel", png_card, (-1.15, 0.1, 1.28), 5) - easel_plane("ExrPanel", exr_card, (1.15, 0.1, 1.28), -5) - - table_me = bpy.data.meshes.new("Table") - bm = bmesh.new() - try: - bmesh.ops.create_cube(bm, size=1.0) - bm.to_mesh(table_me) - finally: - bm.free() - tmat = bpy.data.materials.new("TableMat") - tmat.use_nodes = True - tb = tmat.node_tree.nodes["Principled BSDF"] - tb.inputs["Base Color"].default_value = (0.022, 0.024, 0.028, 1.0) - tb.inputs["Roughness"].default_value = 0.6 - table_me.materials.append(tmat) - table = bpy.data.objects.new("Table", table_me) - table.scale = (1.5, 0.55, 0.08) - table.location = (0.0, 0.25, 0.28) - scene.collection.objects.link(table) + # The verification station: two framed displays on a shared plinth — + # left bakes the closed-form PNG mangling, right is EXR-clean. + mats = fixture_mats() + capmat = caption_mat() + display_unit("PngDisplay", png_card, "FLOAT → PNG", -1.45, mats, capmat) + display_unit("ExrDisplay", exr_card, "FLOAT → EXR", 1.45, mats, capmat) + box_obj("Plinth", (6.10, 1.80, 0.45), (0.0, 0.35, 0.225), mats["plinth"]) floor_me = bpy.data.meshes.new("Floor") bm = bmesh.new() @@ -493,46 +542,57 @@ def render_still(path, engine): fmat = bpy.data.materials.new("Studio") fmat.use_nodes = True fb = fmat.node_tree.nodes["Principled BSDF"] - fb.inputs["Base Color"].default_value = (0.02, 0.021, 0.025, 1.0) - fb.inputs["Roughness"].default_value = 0.8 + fb.inputs["Base Color"].default_value = (0.03, 0.032, 0.037, 1.0) + fb.inputs["Roughness"].default_value = 0.7 floor_me.materials.append(fmat) floor = bpy.data.objects.new("Floor", floor_me) scene.collection.objects.link(floor) wall = bpy.data.objects.new("Wall", floor_me.copy()) - wall.location = (0.0, 8.8, 0.0) + wall.location = (0.0, 9.0, 0.0) wall.rotation_euler = (math.radians(90), 0.0, 0.0) scene.collection.objects.link(wall) world = bpy.data.worlds.new("World") world.use_nodes = True world.node_tree.nodes["Background"].inputs["Color"].default_value = ( - 0.012, 0.013, 0.015, 1.0, + 0.02, 0.021, 0.025, 1.0, ) scene.world = world - def light(name, loc, energy, size, col, rot): + def light(name, loc, energy, size, col, target): ld = bpy.data.lights.new(name, "AREA") ld.energy = energy ld.size = size ld.color = col ob = bpy.data.objects.new(name, ld) ob.location = loc - ob.rotation_euler = tuple(math.radians(a) for a in rot) + d = mathutils.Vector(target) - ob.location + ob.rotation_euler = d.to_track_quat("-Z", "Y").to_euler() scene.collection.objects.link(ob) - light("Key", (-3.8, -4.8, 5.8), 220.0, 4.5, (1.0, 0.96, 0.9), (52, 0, -32)) - light("Fill", (4.8, -2.8, 1.6), 40.0, 9.0, (0.75, 0.85, 1.0), (72, 0, 52)) - light("Rim", (0.2, 4.8, 2.8), 120.0, 3.2, (0.6, 0.78, 1.0), (-62, 0, 178)) - light("Wedge", (0.5, 6.5, 2.5), 450.0, 7.0, (1.0, 0.72, 0.42), (-78, 0, 180)) + # Shaped warm key, faint cool fill, cool rim, and the signature warm + # wedge between station and wall aimed at the wall point behind the + # subject — every light has an explicit target so nothing grazes a + # flat surface (grazing area lights draw stray bands). + light("Key", (-4.0, -4.5, 7.0), 460.0, 4.5, (1.0, 0.96, 0.9), + (0.0, 0.2, 1.8)) + light("Fill", (6.0, -3.0, 3.0), 90.0, 9.0, (0.75, 0.85, 1.0), + (0.5, 0.0, 1.8)) + light("Rim", (0.5, 4.5, 7.0), 320.0, 4.0, (0.6, 0.78, 1.0), + (0.0, 0.3, 2.0)) + light("Wedge", (-0.5, 5.5, 6.0), 520.0, 4.5, (1.0, 0.76, 0.5), + (0.0, 9.0, 2.6)) aim = bpy.data.objects.new("Aim", None) - aim.location = (0.0, 0.1, 1.15) + aim.location = (-0.10, 0.2, 1.65) scene.collection.objects.link(aim) + # Gentle 3/4 from the right: both faces stay fully readable while the + # bezels, struts, and plinth show their thickness. cam_data = bpy.data.cameras.new("Cam") cam_data.lens = 50.0 cam = bpy.data.objects.new("Cam", cam_data) - cam.location = (0.0, -6.0, 2.15) + cam.location = (3.9, -9.3, 3.05) con = cam.constraints.new("TRACK_TO") con.target = aim con.track_axis = "TRACK_NEGATIVE_Z" diff --git a/examples/png-exr-alpha/preview.webp b/examples/png-exr-alpha/preview.webp index b419cede54da1a5047e22217747c58a3db117483..ddfbe108437eca0928b67da499c2071d72691187 100644 GIT binary patch literal 15332 zcmVzPqCQ{;OTQ=M!3Teg+lXHW`|tRV z`G3uS%>T3dYnks z;QeSn=zrt?een_fd;B;3AMl^Q{~BNRwY7ey=0}X~t?zQ~seV7e@KgJb=K{@tDVo_4KSX2#-Hwfs3E6VBNcGdJzuYmZFkVFEmsXQ;g`rNb7PBX z+4+nn3Rou;N%0leRao2mukEfC->H0pjva|L^pIZBrx{4(T$z9&2=K;r{82V6HKuO0 z)z?WKU38Jv*B{7fpA5c0u@Fb&Q;=DWu}GL?cOIwyY1yoW+#Zd)`*6=|z65@C1o--# zf~PjSdD6mPj3UMbDq`5=3;1?qrqTH%`7EepG zvVl`l+-M~>qx!!nlb-zC-!AD(rnLBNqgUx>Km8iC9Kj{wXfdUZU_)pxP3_8C_z1X_xQ15c$xcQGBbpKG$t#2>t2vi@F zN462n;0`R8f~d%P**JiG8{{~-sZt8G)EccEHvbi)?Z zAdby5#QYecaP4=5HqC9@q38)~5kquSXM5dq?{`b~k2K)!c&mpF-yq=rztWLyDbyNh zKn)RN9}%hicI(GlVsO*0yybt8sf0a$&r?4Gi%kY}5Wzg#o_*XaHrx@$RU3#M;jK_T z`LKKg+WfgFq;vF|6;uNhGb&VQeEm$lS?a{12%WF$v)2TPM_nIktez{LOb*&`;MWbh zNBlr}O8}LjNBnF{tQtXLLtnWy=b#8*9*0Gi{yOoIrDH8+&)amWG72Hlr-a|H_7J(W zJ5bYm#Nng!%W4TOR4`9A-z{pV0(iS8ZDjKX3z@A^+=Q1{G=6zeQ{s@uR;8ee&}q@b z*+N|Sjz6llR^Sf6Mu>wBSZ4#qB5U=&?+B;cV#1lMoKDB1LHka+*7cg{3R#L4`~Xf! zD+T9IDrX9A-rK0nYPC+>YxNj1y%w7(TH4wTxB- ziFr{?)R0u(r|V#hFc^le?a;K#%F&aQ6*;x7{jVDIaAxHL$2t$t%403j#V*d!tUp-t z;n@6mV%2c1 zA8eT9Y5;d$i|R1?Lf|Y7%VIb}ehu1tWgLzp!A0h7&-#z&AY=?GaL`%}!_P6o8;*eN znJ6Bd?>O?&CxLKkZf2``z;!l*Ij!ZEt0w%q!>L^xa)D%Pl#mZn`2|jGcLC}(|EmV5%jlo3 zTlZOPty5qPMH3wd-$8%oD>TXeXxpW6YYo@;U)$(KcVfhuCQaq@4*B=-9I9JC#yUXh zRB~vyW08hE+&0Y(UlZ-aJ8~9~ob{G+ux3wpk9BQ!gVE154|*ts9$nVSEX$8xVO352 z>Z0a^JHJ*;KP;C?G}lo8k&SEU=2r%;S*VNsczcxuDKvX7RVSk*n5XS*4x_&c+GMh5 zu%Q-FS(oA|U7ZlnDA_{}%^hHrCP8co)A6^eIiK$>EujrGUMDCTck#cvSh@~tMJn7X z8ihL>N91v}4A`D+)kb$M+?Y0C*wUsW%U9U%15&G8JvG0ORPT>GP3U^@#sNWxtcUJ9 zBpH?R)8=u&k+anH4Acp?JyQdRJhl(S%8@l|<4 zmfD9g6MK9k?wCHoN8Y8EEN~T!A7LhI6D4XTztzmlyS(8>b&_avYq$<@76{i_e?9Nz zGr5lwNMM>ViCOGs57xT*GdR=VvsT;QP;{XP(8Ja(ci;=Br6ZZ|BK-1^{5o~B7zp=* zH;ziyu>F2cAO(x$DZ>LWnuO$jn>9UxkE&3EE@m6clKs;4_?HEg_F27S*!?gl2s< z6k^3l;E9Fq#xSr5uIIW@#f+^Vm_k?E+om$U=Mnk91Gs8JT>Uw#taLK&1L3P#qDL1* zKwz($QH^*kg)oJ>#g+`sKGlJldS2^vO$?GwUW*%=JJ7+45bZE;n_a+qm$rR^5;A|d zM~nilO8KdEa>AzxZUWJTf|eJ@(Ha}-WfJUe1e@1O-=NG4IiyJ_g51f|-Lf^~2veIs zPkb~0`|L>FwrMK7GxV9TE9_pf1rzrBCznM+^*q=^ea$&N(pq-M$#mnQu0BM2O+-a9 zr1Vu5bj)l?7<#31gVx@T2bR!xU)^iH@#Gmyl+vK~sO6UjUUM-%W~ksQ#X*m(mW2G z0wm96JLS}_U80<)J{YWp$baagkEO{TIq(A~DmAKC`!r}ybuFUgiMaw}gs%||ZuBuy zS3Xa(B??+TcA%2$29M8FndOTPlYqXPwmsyb)Vj`Cg4WH$j%3B2&1m~=RJYf$?^c@` z1quGfnO@uBkibtk_Gy)!YDJRkxXA-{4x*xo&irUIU-?aZH_*?SX&QaxLf`Siqrkz8Iv^Vo?PG{qR^ z%W}sGkd6f)ag&0jn>`UJjd`BKV^x@vqHuQeYdcIx^=vX^3^ioL%;u-*x0*EKe73B? zS$|o=jbA66>_$7O#q4;!#XR^;p@k(9^0RvOsWwymyF;iMk+%or158^&l49+$)I=)Ja+N>%M z-RD?-mmw>VzA0Y6 zn)!K00MBUH7;>$1@ze8X48v(vGGsynSDl6mx<>S8O)f3h2!Q`V=LQc0H*a}!O&7ol zNaevi3@W-y&Y?>MEEKR(!Ak#|j0ZB$PiR_3vdfKb_^PoQltaLQrogv26vLMZ=7lIi zqn;pr`HqcIK02Qtb_RYOdAav6C2qqV|LLl>vTl40q454QpxK29#|c2L9VtypmMw)t zzKwB=xP$9#T4sE(sK zCW`ywPXUHeeC&l|(9)N?Hd!>+?nd^dd3K&rRegG~!MZBrw}rrN%9`q3P9R z01lsgtaC|EaZ%Eei(}_deEkFF013xcszae_mmZ7T@{Ew?yeD4cvW{*_HLy~mIqsR~ zREIs|C``PO?XlU|gB>Acop2$r{%-8@0eI_@#<#=KAdfX|BJxS@HRjiFd}O*eS#uw)8}j5q^f|TUr|0J(o(I5PQ*BCXvXPy11#AES{{3T5 zxNR=>)gqeqh{7yQ>l0Q<$idQ9SyT~#Q_vs*t537yzcr^m@jbCVCyWsM37e*-%l(L? zMTf<^SG;ccnoi=jUA`zLI03k5)|V~U=k~T@bLGZOL!y(D?!g!DgF!-u(M&_m4U-Nf zY%dc5*lDx~=zttn)JT)f$RK&J(u3WFY*K2=R_VH_nEr4~Hgv>?gH>f2C~tsKwD4jb zSl*o*OApe*>eEM=O7J(1WZ*NTfck6yLMIXh(lGjhoW?GIChPA8zKYwzBoUmW+JZpWf5d@JZNEWbLrhPbDZ{?&Qb^Lj>-T6 zq$3U93EI96umZ~vJcpdh%z79>5-uIFp@rUoyrUyzgKpJF>1=qkZ#WdQS!b+bqua5q z@Bk0L@E|-0oqNCPHze+Qy3DdJfXYV=>!4oJtop%cfghhRKuGNJ8~RXZxRYt1XN19C zAcH6j;1q!oqp&{0vPdlPJJkPNw-012?;#VUNk>LH;W#~&SfgI2=a|RX0Z3p2m2Saq zu3OoC-8SK2C*0&yyZSsC<(75zkjgRQqF>W!1Z=bZE<2Sj5%lfQ5LJEP0{U}9sp@0L zUGW2L0R5@yewe9!lji_63-9jnp$5Q)Z3Y$(-tRx6&217fwf{;EwUf>ID8)xZ3oowp zjdQz8hy(Gx&Z1h|+G)>&T395t`5>ty)USN+SvM=oIejB1Vaz(F-x zRt=)^XDa$tS$7Udv&j2zG9uO3JJl|{i78@(y;AGQj^x<_Q2{>`p=Z<~mI9ZK+gj6> zn7ZZTE|2*0~`qx^^G`IaYYrZ+viij9B) z)A8`b&73xGu~XV3ENyUB`5z1O0hSm$3{~y+EeHQejUlyub4Tl9K)4F0kQ%4dKgCs_3xu7iK3p z>S6#0pF&Y^@MegdVRFG86&#_JCAIeQu8g__2MkJy+Q9s+0;1R%$D8v!xMJ#yHWbzF zi)$x%KhmBlU>}r4=_tf86Rj%li%Wbi-r5d-X%!@NRhc=b+%lm?_E!j@JF_UekHl3o z0$UaE0r%Jq(?zxRcMQ%F^G=FiK^LMfOg=#VIpM&0kR({TkHsgD?Nfyc<~aFe^JxMq z(Wcsa9MW2XAf6#wJ%+Tf-~a#w<`*-uZZ$y=bCS+DqFF^JjTy_MG|Hjw-h?#^!JL)&@R{TETv<$(98ypvuPcJ9Vx`>D?!Yx4T-Hq3VgM5+ z_smBHrAq$NfnhP4E*J=(CNAmw7vkm0+W59}Q|r}9Evz7^JNfT|`%>31v9*|RkV!LI znVUIZ5xeZ(u6z9~X@NBjNElf2+22=DhiP`qCU~aoL=2nhcnVtI zb3ufLx%urD$|%w>DQbNe75$IVk zZ(Irs`cw05hhRz=3_g#${pVNpf;6-kQ8)x5bm}06JLM!T8QS2T9TRzlRSt`van_jOVvd00K`XY8TQU z>GvasxV+!g%Y{$u)((&WAPX_IRWjJR{Bd~Kw~n{FH+9R^mm%{NA(%IT+r5Ye6uD-H zT4msQy#nV5L@>}Jx>teWh9Yd9Mj}K1{o0DTfF~B^1n{P))k8uj-5*|5&Yn*-;Elwx z^CA~;8Am3a$bdRn;~pqJv$P_k@+oVwi6o@cOh5p*_~YK&WhxokXYyRGNf_RySaT0!**IcW!eC&;#ZAjaz4Wfv=SRYcIHug^9|1H|X4M6` z&qj#&zPS-uAMLX}$Ss2rCmp?;$B*vh92F16a^&k>U8nCv!8&w&nlvz+=7v>&UCK4f za%sNtbbG!*xR2H$@!q`(F4B})v3dHh9h0Zq^Xi{LdGO0c+@SYN%oK{NltVr8W3`GW zAW<9xI{0ucUMRC!6Yl*ufKf>~=}Y8`daZquOA`gdnaXxLef3Z_uT)y3Q3r1$-#u0_ zf#LdJSx(n!;vMSv+4(H!Jr4)ej@$PPgh(^xs*Dh>CqI{$f2m(}mS2XL5+@!2n{Vq7 zd=BfcKiG#)XqPRC5>v%I?CqkE>bQE2z&s;|AtXg`x(o(}RKx;MF>Sx1-_R8dlSi&?iq-#@VhbkN=ZJ~G7 zOEQ&jSfnhCJpcdz000GPs)mO);kFUHvKEiNsrrbvIpx1#Z;brjl}ld^GQ@1914L<&(wl)du6`U8MeZVX z`Zp2M?7Nk)SSPoQ|Gy=UF3Q7t5~$-xOe0^nwjaF@i21| zkb|)Oq;T3fs_@cgX}R`*gPd@L+3BOKA%f3RFoh1m+-priEf))Nv+aHPUWF}fvsr~$kT<`@vJ2# ziTk`j8;!^Gm`-N-o!|~<>Ef=sw_9j_j9MmSK=#N8ea*32zyR@`Y}bWeC>8%RJg@)& z4(n1~Ub;cEI};vuo?KD65-`ha_+FV=R+#=Bqx^QFLz5+bz5wuI+ru?XlQrT5C#pLy zoVWU1nN`@f6Hz>9Z~y=RhKD%t$r}*3b|YVL381opg@KEcGm>DBh@N8D32w@aiUqM= z_N1%JqyK)5CBb2Po2u?o^ibwLY#uJz@8PY7nndU1S1Rc}oqK<&Wn90|T-gN?WAHU$ zLni$Ej~;rv@#AuD@z?@54|wgYo4+p+0)s}G$6v;H%7*hYhmpMu4Pw>$7kHUWafvq6 zDcfE>vaBEHBLg})X!mA$l>&+}fZ^^@pY2YKB%iW%f6jOC{cjd(%&??) z8dy!Thx8KI!|SIoGo23}SlZcY9F5x&`j)q86;iUI9HIz6(h}1c23c+rt!ATp7{=6i z(GDcP0nDdBK`CP1o`j=Fs>F}UxEa;nJ zUUJGY-XNY@l;S(Ivv`=nF3eBZ!I~KNT|QQyIM)`D=x<+e1R`jNxvH$#w+t&h)lFb< zZ)`J?>9~;&S?FrpRu3X4@i~dL;!qt4AscOZp z8PsiTeFsUB_22*i00000)IQH*j`6=hSaV)6CIy8(6@vafFQTja?S<$w$%?xFl2UK2 z#4x^IMtPN1AM#BAtfBWLb$@;rDW8^J<7_*?Fz6}Y%5d5^W4au@U**hEU?d9BF@cRi zTGMQI_CDMYU3Ze_>~ftQ>6&UgGSL<($LH` zE9PY20001hA7UF&gTFUwNgB4EN|sTe|W72A5s|T+mjY1ENvt+o--~hq&E>CphxuQ;fn#$MlyC9m;*+5n& z6!5$jvr}Pf*f-G-?*wb+O*<^~<;%F>XSweg7Sr=PHCVzph@mAUUM<`vEAUy|Ud!Z7 z>wq*vXW(sGW$4EGt!2ST$*+DzlZ#V|+l_R7ln18m0-RYmCwnUjr0n?@jiHF_)E#;% z2thSCQU_(v1!xi~AISR0cN-v{QVgaR*#yJ$gM|3V8(*kParZ`;x~36r{(T1Z?p3)J zj&!^HBNoTbhdE_Ds%zq1<(k#Jt3ROKo4To!jeY;yN9I7jK^S{j|6~MBh z?EFN{hLt9Yv2X<>?YOvt-AISCiBr%}=qd{=-KWMA4^=s_jx@9;lh<3G=Mbf;#ADbA zAW>)iZ!`nMAqsfuxl=6ab*5oL6`E}47W9>}=_h*jTd@hJj1`)HDEu$y3>+F^^S7q> z_%YAd3d~OveM7qtl1df1rQ^X;o9BPah_oV%Po-U1l?0BE54HF|D`sdUy3kIe4G5cV zas=~lo}@8RZ@NKX6a(tJ5y9r(@-1Kc%Ym@RBVqxYUxf@v%u0o?tkIRc56=U2`G*9` zD`Y!dl`NyWu=BS&yE;tXVna=T7#FnV8p(fN@4@4rb`_b62&5E;HMDS})7?**B3lSx z29qS1P2mnz<$ivuD`@r_mfmb6QnIE$fKr-Ht{tk8cPeAn%NZ3wdH-ZYTa*IS7SRMdP`t@ z%d^D}|Hyi{+yzi z11B>UFzx@CUI~KFs5)#G%B@Dqr1HNJy{%G61#kr2CAmF)O2fQsi@|J%7opm?{ZDRe zXO987(`?;oG7@F_k``!X)V+wGn4QQ{Q6od+)cj>s(0 zie5B;643ZAJc5{1hkCg@$%>A1Du#v#s`q8z1z_%)ccWap{oSO10000004mNU?ff1P zB|RjNnTp&2qyF<%N&w+GiMt7y;<&Ksvc{U0A|E%Q-}6A+_6!t1db&gU*15mz)rC=0 znCbnEGn?rwd#0|ga?(wF)oU+(*|z0y|WjZIStfLQL04n-d<;UZV_wPrZ!8U%(@K$_3; zKwnT-wlyq+x_d*@e8+*|;t7ge3z~yb9dms@c@)d}^jp3dlXPo;ZQczr3i!{SBB@O-g#1Pvyp#Bedm($}MqcN3LRz&VnXfXap4__n| zHMjboXQ7rkje;$oig~Q&k_@@UJd!`}$Y>gh;C#;$=^-Aw?cH0`h>?1Pnn39VC!F5Ga`` zEr}C7nBK{g1#IRYjWCtoPd*!)LC#|ucI+bjmCPsMF#%a?i8WKD+7(Q@jen>oBE*`U z761ifhE6Dc|4&NPeYOKEzt3fa6^So0fQKg0Xe`s>5`FzfBG_8lyKp+kpy5K~f!%X8 zAs(OF@`Q^*-aN@k-<1zSu?F*&4jH>yYAPWPK$o;>RmH~N@=MRsjt2o$#NQIf)d)dn z!tEN%+Ta%<_&zWAI8A<9%dXE3_L6{PrFJr+OIs!yZeG*%JX~7-f9oWtH_yt$*<{=@ z^hcvjXlfi$6mEh3hV=mYI&#YQPXcD_D10P{zO%{>LRbo5-8*U$6=gc&ET)?S-{P8V zFluk#2jgC9Pm0qVdyA@&7NMt9TD-Q!fQigvx|iGHB00Arr(nbSHo#1uEh#0xi~yaX zP(c(&QAMG!-oTYU$nMnNL=TqJe#bhkE_}%!^RFs@aQ(2qw+N#+ZF_=d z9KmwSBBvl8pZq!Qi;r|dP7obnb@JjE>QUl9WAnJVz zRt#+>k@&RY=A@{jC03HQjy_g&SyjQ0{d>XPL%3%A%%5ODXz*F>rF**}b|I}8;$}Gw z(m{=EMX}zttU#*+-0ab9tatyqQIn$A=8^_5(hT%mH%Hb1EAK$83@E4QY6|ydYI=Wb ziqTje`K@cSrqmgRX?n$@>aUQtPASR6$5<6dA7Nj9aPsVk;uHs@w$WX zz33L$8cw8HI$N2Rdh)OaBCe#|kCiw)1ET3RHM=x#W8a-Ew71B)YSIoW(&Qs$x%sD> zVr`n10Zb$n0W-ca!EfBrs~7}}VfTR2vYaS#$97{ofUtVPU!N!$;}tH*8OH+(wXNz~ zt^NcPa&~3aHv+@D-r~f>I}a)^bRXI#pwRBsX37acjt+RXCJ~n6>lSj1Q~@3uL2(A0 zvawU`eO4&oqXK|$>!rMMELQ|MHI6B>zrWBMB+Oa?u-Y)X8yBw^oH)1bzcTLUE+&+N zO~cjvGq-^2fuuC|jXGijpdSUP%^%M7GR->ZwZJW+r*gY*_2-9QTQ2yQHOK}sOKCPH z!;VI#jfj#nHVq^sUM^%I%8EATpisiYhIh!OVWp~qUVGX~p-0+l4QD%de z*kI(nlTk>O4?Ye?0|Tsgee@j>C&*k6E*%AJbE}#qwrA$qb4x7hv7Qy28ef$ip+cK* z=F(Gcs6zEy&>wk`fviR3g_I#`wVii@sX`p~soUf6CfDNdi}w9Mw_vkNRK=W;U@Lhz z3WUe~8qGWumUgOL7)^65rEJv(nqFhKID&ho9)f#45HJHbSz&*bab$nO{1w7!lov{Y zbU2;)Tt@#9$2x=Zd0|=3U^;eS>i@G~vyO(7<@$K;$%$zPR?A4G# zeQGrX65IcQCEgQE*D*=^djuJ6{?7TDo}s+onKj11+k2)HA7!ikz*vqG4EwPt6ZeOi zPA#0Li#4{}ixDbQy|Yy6l~ptDqZL_q`qQ>FnHzo@BPf;DH!(}54aR7>;l5={tpn&D z%EtR*3H88}Sc<{%x>D_2rbS>=rFz(T;luiJpJQ;flqkn_qN2W<*|JM#H4&ASzv z&S?7L&!=VZs*1+6Lh1)8HUGopIKYt~W#hIeCuE4L?Y4mO7DS;fd;l(&Te9ZrhF-jx(UEAf^OK z&ZJwxChZSQPpRmVeZH2se{H0*iC2WcfE=Lw_M|9-lIp+vq$fjAlddPh(U3ugLQmR@ zCoW$2URm2RPq6ikyza2R-o(x;=f}i+MaTeoNW=B|(jTfhNC(wxw?7Fh&eqy$1T^(% z7T52zYv+mGx5Yj?d>;J2 z$A|g+agaN>Gj9;vh5YYA_j#n|@IH`lypZzZAjRL<>~XJC3&fSuhndJ;JTz1e`Y|Rq zxAq+FCif5Cej)T5eU5g>|07~~e%3%L=1NGx9$xG3uysH#t5VaWY;cpR;H+*cS`t6d zWvd*d-cNvSXKwE)3dfiJ|6*(JXjuw;&&dOl{0M9vx4RYgv>^CE&wO=b8W^K&>N@K= zzeY&jY0evko8;MQRw=j51-sP*EMbiep+%)tsox`hmxMHDW)9+z*vp`Y2xY`Yha>x0R$MCjg!Yu#8y zvq$B#z)luEHoKcEiMBcB+Y9#tOp{U1oysTq*KRg6K>zBBA2$03q)h(Q0+oM%=-2nx zMne9Wt-xGF(n>y0wC9O^u)qjSiMAd6laAO2iV8UgYDQ@eSz125M}kS+bmc{@vMmgLn=h8Mf{p zNTzI*S1H|UlTXW}Q|A?=?+JfSxr zXf6L`KS}}ug%7C)bE9eaH*wJoGV7kZgEGB_M$;lpzvEQO+eZlt^aAx%&tOW55?~3^ z^i1`x8Y|xJGknFsz3BqcScw*wn(-2?n}g_e3`W&w4ImB&@aV#QqZL7VzJw10T)nH@ zFopVO^4RlNGGi3lWi5$`od?N?BuAyRAk_A>bUFGTp1UG@rt0iXf$XcW9&-9(1oAUl zG}UBmN(#B?CNFpYn)YY}c?fuQU&?x3P@BbND{tC-CssLVGSFlR zgd|pE<3OdN%lav_a3(Ycke=PWh@luMrpLfoJ(W>Of_;q=afb3h9a2#Pqr%5BNb7L& zET8-E0DiK&8?06w?g0s*o>(A=D=3`MQcn1meQwmMIl5%FCr!4t`_@3DZkk`qwW?&r zE)ql*+HRc{VTQv)zv ze#d2yA3y7{JZ(@QHBXOQg=^A#YSr8nwZ}=rIkHgZFK?#7X!||OO#fXI=G@sBQV7rI z!8gHB*jFR`pf03mm=e3mQmkiP=`4Qtjj*~$na)vm&)P+tw4ynW_Vw#~+<^gV?6D?_ zdq*`c9tq}x`|?LFmT_@2(_P;>;Cp?rGfEM+o?#XIR?6%dO)0wZu3f{ne89nA1wEC4 z_ej7&SqFdj2svXz)MB8^UZL8LdCi!dZ+)ixU}~Oa>ZYl@8~jsDBm$R00EINKvgaPm zOF~R7QmzDl&NxOgyBziFcETIKtbXP7d)Fbd0Bk<186v4aw<9N?G^Z#WB8I=lI?V5U zXo_hO=4SR%CMd!ev!mjY9kJxPvy2W6D&r0Zp+LV*n3r<^L|FcGaSsTa#~QWCw+dC^ z+6QpU0ypxch+W(u`~0zB3Ef)P6u>T9$wuGc4jjkwz#*{iK5xyPWXi#9!g+*uOSv#B zhvMD3cy(XD|Hm{}oA@4IN4MwGdjQdSuVLcS`ZC#74h_QaWHj-|)CHM?DBLGbQak$A zn{1tT1A4#5H@(m(Gi2`IVD8bQNG&s_OS}HR{O?-9HvK0H7qTMl=>>6ceUYX09W*4N zH#huWp_*(}vAz0chhCh*8$bD6XYmLqJ51dOtZD!N09gmagUtxAFii#8uy(=&53z7G z0Mw6E?iJTPn6c7GP}{j7gwZJ*>FVn99W2AEDHph$GV2yXY9s*tY1fi0lOm>1)`TXR z^D+n6Z|(AGuI9uBV#f|x#XjL7r#{;{h%8$=4Tr-qzF%$x$0{C0S;E0R@(b(*dH30Z z@2vL&Q#L?i0(})dZ=8i;!f-c5sjOtlk2^dPmaXz;+LHf?#v zgrtg3k`ZxE6CEWO79tw>rGiFSMQ@$44ORf!OZPCY!CPJ#$k71&YST~-2XYKa445Ro zJ4P;h&pBZj#&9@UmND=#_GEMaQHU{%{vg>D+>)a`Dp4%{XOznfK>w)4W~CVZAa9OPU>2Ne;_gy!kz>Laa`SX$eBI+?2>^KJ61p294w0a&$=G4ptJpUc`NvN4sih z+Uko-Oh?I8NDXfGy0`+t*l>a6>Qdq1%-Ba?qqJ`QwIRqBs|*Sy+NsG8_6)DXbJaAh>A5fA z<(k6ge*Tw#+I6a2Ucq z))ob)jQhDQ{i!L*BLttcEyb4FonLn?ACqW!k+CHbg!!Zn9}F{lcF!_5ca3+-YvOzR zk~t2m-MMW1>&aSCy@kI^7;zy?br0WPE0S6(qyIb4Q0Hw)E?M4W=5&H!aFb(I9Y;nl z{(3)@He6(Ph_&~X7?YH>GCE#Ig|Z`?Th|^A(yZF-6{#Sz zqJYmx4Zi~bDY1EFiC+62@jBe{6JLhToS@Ec_ttllN%uW7rQn{}(v))j`H~vve%iI4 z`bLJY=5GT3tQ|(!&RShSW3&nEw_*pJppWl{y`l7=5fXsO(Uhv zD&}F05d;Cc9u60DY;KO{gwqT}d?o?LI!??+?$J`VNJ1E0OQyLIQu+{*7m5N*UT<2G zDepl$o|U+g=Wi8PLRNwfu-Z)#=CUWWPNu@4aV6vW3n5VJ@Bjb-UEwdVfCt^pEStW4 z@MvGt?}iEA${=?*XD#+&8!7cVJ6%5U)>lHXaZ2WRQW3LPTMH2Q`Bh21&P@0HHD$qh zF`KaXX=bvT(-rDcI*04!-Kqr2TDgXdI^w}d)C5M?KltoI&KV+h&k}$G1!Xns0lWo~ z9eBpJzZde4>Fp<>u$N6dfB~nb-B17kR+YfJxG7VZ%ofPtwtYh_ZAW*ZOp8LGK2Fv5 zN{R?A8bs-|4H22AK;kpxNx1n`Mdz@iwULZK@yG-Ojl1@3a_hzv9qPGAjjBrQS0=Vsp9RZ?hKgSU*nAYb zMI9bBEmCaEW+o=HZ7Q&f=bbup6dKV&-p)Y?{Qo1ou49x2NiuRyV@Bzj4ol=PAk|pK zz+l89wE~FU$o{HL4PbZ~J{_N^^Iq+3Y*L?!OUvUww|(f3NhzxI4%vrU#Ud z_c5q;GCE}4@h7W$!1-XzzuxkT_}|&T;r_bL-#yJs*8L{a@aF z#{4h*{^)=F`;%{e$-~1QJv)dxFZ|AbQWT&G&75~Q?s44XxyN&k=N-;FoOd|xaphdV zB>D6~Gi<;e&OL9`J5w?vnP+4CQv<RxHa-Rcn_T6A+j7FFHZWR$Xv&Eo)|8EDc<5P|DV22ugFDOQjae{4CY)l&knMt)mp5t@UgiM=Jq)E<=kunqBHs znP^g^Q2}b{yW}WQ=1m+dvG0)U(-33IXO<><2_DQ+|Myh1s)X<6X)#_u22!u!%2Tor zT5420G>qptd$P7g-6J{2z{>f{J@5hX@^`^_64Oaoka0_1TkiML5VNX$u03#@1L!ju zQ#Wu;sz2bHob0zUg&9>Iyb;nQ>{#1)k; z3vs$kM{$sEP^mOpVj!}4^pNna1HGo^>+-rrzU-x9QI_!6j^i?Gt=NDTt+Ksp{+{fx zkf@D-#Yc~#M;X}Nf~kJ{9GEHKU-vBaJghg!?HH@iH>*Y!jG^RDIZ5nr(t)5VV|a;_ zPB3Y1=d|0dg?|?{HFsqjn`Qv+ZB%=3n?$t9^Dt(shQ2CRhoEm^ABe2&%gRbJh&Wb3 zyU)1vQ#MPpufGt%`&0xJTwOrp9Fr)4>AP@QX>@Q}sgmW+&g;7B2)@|Z*w@-~L1X)V z2%{g4^?e`{C{!G<%aR~k+rc?{i=uqIF_MSa5Y_C zX#+M&W6`f>J_GQi5dcO17zXQ;v&7h8rgSjb7bSM>Nbu@InDC>=(xyd}j_Rg|JU9E! zXsSb+IcjosadciB7nS^i-oV$3CcGMrQ`cMFooPmx=em}WE@WWmfBO(gMkJjJ130rl-5bym<~q0w<(&^?E}>N@=@^{m7?WxmoKKIjemS;x2HIH8;>qq0?6Z$nCwEV-mbo3GHvKm(KQ>JW&qAX8m!UO zfjF{%J9$}D`tYUdL>vZjKeo)~S~YjuKA&8_i-x(io#Io236rX=8;}U! z;CE5QdlB9<1ZDjASDg@R^quKc16P-yn`$uATk(*=`jNk06xD87C@Qs~B@a3Y<}GR2kW}ZVFK^tr^CYg<}64Zk~ZHex$8^=mqqbdnf7B z6;v8TD}MP_?Wq=|KRN<)f^`y%(-=>O_x|xUKRFqvvhIX-?2Nl4$bUa_$JT^o-jd6d zJeN6;-;9Po9|;TY1Cdj@c3a7ti7%i~^g_I_p9wBBfXQ6-!deZna#O7u*ArGX`^qy2 z=*5a4>-_e{+h?Y6&H9F;kl`4!x~12w-HC8CP|j@gs+%RTI>+hTx(JV0Of~3{9C^|w z2=Bd}dUr}Lyeu+-XH8#Rd9odZwdm0VR%zTax-c}6=!0Oo_QDBjuoAXd1ZV*9vcq{5 z1-V6bi3AT>lFRb8cO+l*SFKD)E{j91*RF(wQT_xqQRpfc?G6a+db9yeZW1E&L@Fl zg0*piC*HElJ4@|WgqtnKT;_0=0UN{$P$~BfD5^QeJdJE3Ka?zAT&Dhe;sYpO0 zk7wj9P|n(_jIGNcpHgm-NxRiqoRnPb*#jTqHTbd{hKC*B$P;x0pi3=t`~I+%@LWuK zoZIp+%I*y3&y&wJZ{y%Skw9bO0$F!dF-srZXzvkn;3Cg#%2Wl zQJqn5gzvXfv`GCvLdpPCPXHsx(oFSm9JdD@ati_YpYp0}w;#Z_vTc3X`wP?d7L(~k z&-pRHJeK)w(N)4G4Yr9t#7#MMKh+@7kMhn8#lyeulK}UGA{u-rdg=FTQe>PH*m%^J z%_CnrqhOdTn~R{yPv3QVkn-J1R6j%iZ{G|3rX7jm@K)x7mtapMKjS%1)e_9nAd{_Y zuZ`U37hb`16|$OA-)Op3Q(|dzg2|L-`1eJ;V^MW{PYucPAL9s_j$&Pi!&8RE13;1O z{jfIUnsv8`gRS7*v^Z}=yL@)dqF0IKb9-76ESREiMb+)V`ra&+!>mzR(Zia#9dTV~XL z*Y*1&Y!6PTaY*TueU_}8&&Pd^twRCzXHyzl9Rm`foW&_^@|xSeGc0Smo?n|_V>%SO z;>fSl?>Q#kgBmLkA{70{zisEFHRNm)6?HwCyKeOFv2li8x1w`s4{q5nLN3k5OG2#os15rC zo|SWVoBFbXHS;A$0@)+fMJ_u7ppAdoUS(7d{6OL0e(m27i&QYLfZ!cRPs+EqfUu1r zFPQj--YDc~^+K7{eA=3tnwpi~yyegD?mP96Q$u`j;-w5c=D>e#>d|Qe%M}^h5ax|b zwyqQ#KUoDbS#|ad=93V1lFUi{`P~Ofre_$JL#=%4Uf_@Ltqqb zxpuHMxEF*iO2F!sgJn_(|L`;FtO1Kl{_VM$XlCjLrO4R#%N_Ki(ilPc#_;g)s)@{u zy*I8l#IqZE0%|rAi0tlkbWEa_-Nd)@I`ku}`*-*5x$Btub-GK+!;2>whQ)6_;;`Vob~c*=*+qL3Vn2Z-v}@fOq4G0q@H3C9 z(gFYg{^=Gwq*^heinH*g%xi#5<(x*rc4l`nL4j`$F8+cFq98*l-)qkx_Ipb%&S7H{MY1j? zA&-x&T_Hp**wwP#FNh1|j~_P-onSGJ(-;>kV@MoM5Yx8Ja6^<^;pv3HM;K-uTho-( zZAC-*sfML>QNI0&R5RM2qYajI^cd9EXa=Spp;5N?%-!>tWk4d7Z`v*;dM^~Y-V~+G zY2zL-3mIlcekjgIeRY{y6aHFo=Q=JxwnbgDhs80fRE_GmXS0?-w&+Q;zO) z2==Gq5swqh!I>u+cuU#8G&Ld|I>mx$6x4KG9LI#n;D@N-cp^KRf!Y-XPd-)k!>IZ? zzcoD9)Ufru7m+Fk7I$_e1?VQjTyk;INWAtEf zja1gS5)J(yNIV;&KcC_Nw?2Cno`_Hm5*njLzCcaT^sNTV15cG$N#C>Wry8UoGFa;T zPFG`5VH=%7SqJL)d<8U_o`60(&ul%k>>j@)*~Nf8Cy(^47@S0MWvLIb??^+&tj^gL z{GJ9@qgYP8!~?w0+L1KsO|8h`$fpuOI1Mdb?GZzBco18!Jrfld`DCmw7Urc9m$y&G z@)ysxp%}GEQqV8p_Q^%AAs5r}$%i7}@jN5zS5B z%!5(XzyJUM00p@Foi98UCiu{q)sjOpYSM4btnn&(jw^^{j(y= z8s8*u-0E?4W!l&WK6QI%4?)!`U8Ee>?FE|eKiUAY^xxtm8o0m*^Z*_tsW z)pSZ?LPl{&1r_;%ZFcyX2`EGB4@=Sh36QvxoCfM`?z)ovryAWq8VJ2SiXGzr5r~UN8;poyG z`(2HZ-o+3M@77JO+Ukbc3Aqxcmw*x)WMUR@R$gZj%*P*kB>Yzhx zmjhdm=M6dJv)2~@?0)6U^Oih1Tf>{2w4e%n>0~EB){#X1R5_j?iXSQrlh$sd2_E#f zu`JZiiCnP&>VdL3?$3#PUUuVy_= z1}k$okE?dKvaH^W*OeS~Wc`G2-K92H+zZx&KO(skSO~608ul6164kb=d@nQYI{ZEQw`}%tNoHKSxhzrP;XZxI?5~4x@u3^Y&QF+rxNmR5brUg6{2GAyB z2W*n13A%1aKg;UAb3W5nm&$04jt2R_v@DNq{28E|grc+H000<%sTFEdpA=--$gKf( z`p}HymBOI_BGVl(UZQxc!sA)$nyv0kv9~JrH1(?HAD5D(7jdA;+%|6g3#!$rur1Ek zqZ9CIt_KM}esqP@Nw!-W>+G^sp5<@gxnp26_U*;w?i88I$s#5G=%SpcMaY4J9X^wE zSW!de86^EkLnsq#p~IxSU>8W-=rgjpSS<~V<+;FSi?UR&692&KHYfF1wJ)hKsR=4} zW1F8DCKaYKrljT-RX6&*7rQU^7ucB!JOoo)y2)ZNn<*T0^cbeEiEWm@=N{5*;pE@V z(&Ti=Bd6~|O!EW-Yx4G%OEA&^YasGj;Tf*u&9ng|LHc_ZyS19?hfucfoHeZclL(Y&;SA2n1i#uPGoVh>ygN~F7^8E6@f6# zJ-f*&!g+=v&g2-s6c24z)a!vmvSTYg@hGnBt!}^ruDbfxV5c@?bUJqI3h$X1=Nj}O zjrgwD4${uxpFAxVz2s$+K4Uu>rRGk&<~oar*-tEasSU-H6I*1$^#>P(i0Gh)gISa> zwg)3^niMB>b_>wSPJA*wKmx*Q5@P4pDAp>3FUg4}kU!Z2546~Zcy-vzLJX0Y{^dW@ z8v;Ouu_yoQ-1qV|e}DguO3SLFpzYy&Hju)2-`)zjq%X)ml&_2 zny=?M<+`MSuBt!d9Q79OJVEsfdr5%si1DR!LEcs`+aFwE;Y9*5$NV54JH9e81mCFx znhZ>m$Rxe~75Jw@m0TqV4p}CBw;u0fn$>8p3g>Znx;XL+Iq*9a^i%s&j@Dqbt&lNS z_)B3^v$Sd%QkXKy8@Vn@*i7K}ek>0uWSam|Ck;>f)cgL0>feURHb`4DV2%2!UYBJS_`C0xLLAS` zFGz6l9|gG%aQYUSF)r55WDHv|VCV9BgiZZH1Ym{k0fh3&ys?dim>=Q1;ds)}lV5yz0xoNqCi=ksU9IEnxFcI8` zbx++3By{Azq2r)G>99xv6u+aBw@Rr+(11dybmKU(T}7I#4)6Ocf3pdU^>%%o=YYvA zxhYPMfQ@c9ku{DnCKOD+7o~6FaGyQV@||Budr)TFiIKK5=gt5C7LFm2EZXr{YKhtt zDdR-z3XXPY0JpFi33db7Ezs!(UEJBI;HZ5?`1GKsjRwkT*kMz&l#5GT_rdX_^^@t^ z;6G+p_Wi&X@t$L%^>E1pz!d*D00003_On+(Gr(sMTpLnzg37A79AYV2#i;Ar$h+XD zoJTDkc|Ug}>j9z$S^ieyXxj`H`7v}aWHG{g$<#U+Zfi+msM+j}Q7qjR<;+M2=@kzi zDIu}DKTM-49{|l3q-!gR(pdAj%dcp^P_BaQIz-_rkLmlX-*My47FUZQ$IL= zCW68xu!N3sjYUkvt!F>s)9vJVGlR7A{Gq{xuqZbx{3T*?fSgRnU5ks;(vtDF|BMfD z71Uk+gY7g^fw4(HGDc~E5`cX=Ov+SVdk7U&9rm33(c@CZ`2gAv8^IrNdAsT}>*NaB z)|*o_h17YMBLhS#C7QK!>y^0Bbl`0LhcLxA;kXc5l^2Kr-$h@Rnl43bLbvD;H+aY$ zl+lKVx9Zqm6=K?fBoG>(-5CuG@r$9s5$ZXoueYB3y`p(CxJZ;`kSHvBb)r0aozt@O zpN7Gc{%(u*x!Z_7%~F@&qV?zB+ZtEyuI~-k$Iz;sO!X-q!!qv27L-1DE>?L@U55vM zwv76E@V9K57}6Ih>-nisI8h!miSRTLS~S=rRzT_6d51N>fnD$FoE)HA6Pu)ntjs=_pfz?j^@ zx{{EP8Qfodz5AT9UQE@~sKME8{nof(%dyn059#wV*co&#H5fMzk(vbrWr;RziN!%R z6FTHcD)`CmpZKPFM{}B%i2Nd3mE86`ktu^Q|CNyZZ~L~5T z+AqY^d9p@c?5Y6Hq-!@yP2SyM{{Q>Q_mVUH!X`M{YT5C8q}}f!R5$tKk)tG|bhdl# z_S}+1?ZQ0*x(tMdkXzsXIaA_T2Jl<;5r6h|PpYHzGR#%`2!+4_zl6xo%1bM29iy;G zOG%Jh(A#%FsN5b3{7{TXnA9=yRh1M8b_15Dy%aVd?6_rGI43h-C?^R!-Q-7dt=5C# zcReC*0{5a?fv?F{VJ!nqPJG&2RKiKGYB|cTQubilnbX}>3L#WF`UDuJp#(KA-T=`0 zSGjySM$Pp?sNjv&gLs`itxZgwxwHnn#9aqGa{d->Sr@R1fes}ZD%7gw{#QI+*Gxu* zS>c#>LgVMp2(*~>U)}A!Tvt1?FjR&zt>0iGowpE7H~k=G7Mrs_>ihd^$a+Wv_FLjS zPi=0sB$|(^9oHC)OUwwdM6rfkwRa~0DPrJJGp0vC+Q}EGR>GhFoPRCeQEbVcET8)X z-F?FqjDOYhH^t4d@9;um%BsLLaR7S+$$<#`d64X3fB^&zp0nd~ED0F=<^EMqGIR8D zm=vRvZa3`NZyke2BjtWN^>o`E1_z7pHZd#Z#`jIdvH>y-kaUk=;E5uF!#7&F5kU#_GAV$$)t@NQxj29wwdX!^tW! zQtgQxMY?^dO&QOULii#4&;&I&;C3Q0A5I9+}@snv><#HUwByG2QeRubNU?+`xV)^8wLv@q`A_ITC{8Eg)Vj<-1|qN5=Z-!na+a_D&+C z`qW0qyHlXL161uHS7OJO9P?w3MODvYQ4DB0Us0=ysFeV~Wx58V8?&Scq-{%CJJ zuCJjxqM~r>iJb^OrbSF4$)Af}7BOB_*DW~~7z?8@-~`Q|G+5%6-6?{omggkcNC8uY zeZ&YZf&?^R)MIPLEqPq|#y*9JFyi60w97C1*wfsP-0x^=C)$1I96IQwl;EEDQZnMj zdBa|RG$L`#dsQL#G{#P`W`LAwEmkua+f6KWyu{>tvXKMB znJqSK7aEc&=;d6%P)=+M$Izhb(Uoe+sf~%1z}Pub0`N8N0XP66-~vO9Pc)cXbjd_nOi}`^`IC;(hFD4gFbE4NTqzKX&0Y649Dk4fp#y1DjFDUIUVS*J5-f|PDfZUyvRO` zM8~^M+!rK@8nNhLnmZ@})2E7S%fQu($(iOQ zuH&h_uRW;%1?5e5G4&uy*xtLA|TnC=($FPgmlh2c(VYE_iZSE7;_=36D!gHzsf zxk%Q9B*;8%Q%{B}ukq_`(`d`qk273s?GVYVQB($`fnprDyK>gTi1!I{BEvh#=M*DD z1)0Q+^LNiXJh!;55q0%A|NlpyePB6e!TLteB6v*v_t}A~{ojfCUV_~CC&wbCTYQWu z6pw_@4EPDn>2s<1%N@&1z~%Im`QJDVWKkGnd=-lx%-X=)5AbZ@YxEKxUx=^>1xdy& zN>RHCofxW&W+-+jYv@He`Z*ySo5ze3NUwa;s%*pge2 zmhF&9Tr9~-<}bg(@Tsj%76l_7N*M9#=Uv0ldBW0>K6b$gYjNN*Ag$xkPWn|%=5N$# z!RUk5bwnaAwoDo{*)^4%8OJe}9La;t>H{YGnN_@ll_6bD|T7IB_r=+j!L_AZ%aU)Ue*b^0H?8-r$kIzBSpDy2g#~ku%<~r1wpHm zkez#42V2F`l~4vc3~Uz01FE@EJa`*(ky^Ga$sd_danYn^b6EO`jWcopKU%-cuHs`RV0sW&j-1BC? zH73zsW~NB@j?yj|aM}#xv)o0g`|nhXiB&x^CqyrgP&X%NH}ay?1ra$3h_sW%Q1DP@ zV%x5CMnZY~FO+K#*02$KdWHdigdjmp_#34P6j5F8hemxuZd_JC1mLq;rj$DQi&|M# z0^NX;7%T!ghmMkcog}5o=4q(fe7%JS!5dFxn#K3!+HhS!=#Y46cguSiE7TV@j`3%6RB3VQk!wZdlQ9Mn1<&AXn&3luh|!FH0JFfh=&6q-RW zQ$U0)8}rl1nMQB#p}z{1l9j!`^cmbuwMRy5&B>>X!qA`F+oURoMoqqpbbDSLIvXZ7 zJ|dJn1|%L0z{RNYq@2Qs&&Z0vaExvIish1x((y&1&J24GgqXunA$`QTtoD)x*7fsi z#edk>48JMx4Mq)|X5s46bZ0j+UVob45$@|T04xyBRAZz#mxJ&iu=a#0A+q}CgHB&T z?*1Zgm05(_L`hnca*`u1C~YFkhG|uQYxOV;EC#w0#QiRUT2X&^TN1_1ML@<|_N|N{ z;i$M5a-SEDBqa@jtAvHODuj3d+bsCvk72PI&O6DJ=N)c+Jrsc4hsCD_Pw@A=Ujub;8i)0v6?P(>dgFs!wVVir`5 zH)~4PmG&13I`9e%>jZK-0N(g8NdLzQVgLpiK80qperj1#c?ZiNuUU2SLe&!XkN}-L zV?hmx(ZWr2ppcE|3WW-+K<&4;Ds99_jwd%Ic`O)1E5!?h5U9AJy|Y>kiEX?nZX6iB z?ByviX22j~gE*g`uRoud{O-)ce}cdQK@bz6fB0$-K3biofB+mnd)0zMgHPggp;mjZ zfyJ6I00012Pyhe`00004dN~`DAclZh8$bXcupl{N3#KdX0000w@0)suDD=;E6lMC8 G7N7v_;pSri diff --git a/examples/triangulate-tangents/README.md b/examples/triangulate-tangents/README.md index 06859c4..09bce5f 100644 --- a/examples/triangulate-tangents/README.md +++ b/examples/triangulate-tangents/README.md @@ -13,30 +13,30 @@ the exported normal maps are baked against. **What it witnesses:** the mikktspace contract engines implement, and the hazards around it. -1. **Deterministic triangulation and the engine basis.** `calc_loop_triangles` - yields the closed-form count (two tris per quad + the cap fan, 720), and - every loop tangent is unit length (err 1.3e-07) and exactly orthogonal to - its loop normal (err 6.0e-08), with the bitangent exactly - `bitangent_sign * (normal x tangent)` (err 0.0). One ngon anywhere in the - mesh and `calc_tangents` **aborts the whole call** — the back cap is an - explicit fan for exactly that reason. -2. **The tangent frame follows the UVs.** On smooth-field triangles the - per-loop tangents match the independently derived edge/UV-delta formula - within mikktspace's vertex-welding tolerance (measured 2.3e-06, tol 0.15); - a flipped frame inside a smooth field is never legal (0 measured). At UV - seams the frame orientation is implementation-defined — 42 seam flips, 9 - at chart seams, identical on both versions — and planar UVs on a - cylindrical wall are degenerate: they collapse the tangent onto the - normal (dot 0.998, measured and fixed by unwrapping strips). -3. **The reference-lifetime hazard (the real divergence).** A - `MeshUVLoopLayer` handle held across `calc_tangents()` dangles: on - Blender 4.5 reads through it return tangent floats, not UVs — measured - while authoring as a phantom **471 flipped frames and 385 phantom seam - positions, exit 0, a silent wrong answer**. On 5.1 the same stale read - survives by memory-layout luck. The mikktspace math itself is - byte-identical on 4.5.11 and 5.1.2; the apparent version divergence was - entirely the corrupt handle. Never hold layer handles across - CustomData-reallocating calls — re-fetch by name. +- **Deterministic triangulation and the engine basis.** `calc_loop_triangles` + yields the closed-form count (two tris per quad + the cap fan, 720), and + every loop tangent is unit length (err 1.3e-07) and exactly orthogonal to + its loop normal (err 6.0e-08), with the bitangent exactly + `bitangent_sign * (normal x tangent)` (err 0.0). One ngon anywhere in the + mesh and `calc_tangents` **aborts the whole call** — the back cap is an + explicit fan for exactly that reason. +- **The tangent frame follows the UVs.** On smooth-field triangles the + per-loop tangents match the independently derived edge/UV-delta formula + within mikktspace's vertex-welding tolerance (measured 2.3e-06, tol 0.15); + a flipped frame inside a smooth field is never legal (0 measured). At UV + seams the frame orientation is implementation-defined — 42 seam flips, 9 + at chart seams, identical on both versions — and planar UVs on a + cylindrical wall are degenerate: they collapse the tangent onto the + normal (dot 0.998, measured and fixed by unwrapping strips). +- **The reference-lifetime hazard (the real divergence).** A + `MeshUVLoopLayer` handle held across `calc_tangents()` dangles: on + Blender 4.5 reads through it return tangent floats, not UVs — measured + while authoring as a phantom **471 flipped frames and 385 phantom seam + positions, exit 0, a silent wrong answer**. On 5.1 the same stale read + survives by memory-layout luck. The mikktspace math itself is + byte-identical on 4.5.11 and 5.1.2; the apparent version divergence was + entirely the corrupt handle. Never hold layer handles across + CustomData-reallocating calls — re-fetch by name. **What each check catches on failure:** a remeshed asset breaking the triangulation count (probe: dropped profile ring, exit 3, 624 vs 720); a diff --git a/examples/uv-layer-grid/README.md b/examples/uv-layer-grid/README.md index 1c05d18..9496e6c 100644 --- a/examples/uv-layer-grid/README.md +++ b/examples/uv-layer-grid/README.md @@ -12,16 +12,16 @@ lifted into its own smoke-gated witness so the contract cannot quietly drift. **What it witnesses:** three related contracts on the same grid topology (`SEG×SEG` faces, `(SEG+1)²` verts, size `1.0` → coords in `[-1, 1]`): -1. **Silent no-op** — `create_grid(..., calc_uvs=True)` with no prior - `bm.loops.layers.uv.new(...)` leaves `len(bm.loops.layers.uv) == 0` and - `mesh.uv_layers` empty after `to_mesh`. -2. **Pre-create repair** — create the UV layer first, then `calc_uvs=True` - fills every loop. UVs must match the closed form - `u = (x/size + 1)/2`, `v = (y/size + 1)/2` within `1e-6`, both on the - BMesh and after persisting to `mesh.uv_layers.active.data`. -3. **Explicit assignment fallback** — `calc_uvs=False`, then - `uv.new("UVMap")` and a loop write of the same closed form. Does not - depend on `calc_uvs` at all; same tolerance. +- **Silent no-op** — `create_grid(..., calc_uvs=True)` with no prior + `bm.loops.layers.uv.new(...)` leaves `len(bm.loops.layers.uv) == 0` and + `mesh.uv_layers` empty after `to_mesh`. +- **Pre-create repair** — create the UV layer first, then `calc_uvs=True` + fills every loop. UVs must match the closed form + `u = (x/size + 1)/2`, `v = (y/size + 1)/2` within `1e-6`, both on the + BMesh and after persisting to `mesh.uv_layers.active.data`. +- **Explicit assignment fallback** — `calc_uvs=False`, then + `uv.new("UVMap")` and a loop write of the same closed form. Does not + depend on `calc_uvs` at all; same tolerance. **What each check catches on failure:** @@ -47,13 +47,14 @@ fill assert identically on Blender 4.5 LTS and 5.1. The only gate in the file is the EEVEE engine id for the optional render (`BLENDER_EEVEE_NEXT` on 4.x, `BLENDER_EEVEE` on 5.x). -**Render:** two easel panels sharing one neon checker image. Left is the +**Render:** two framed lightbox displays on floor trays (rear kick legs, +status LED) sharing one neon checker image, shot at a slight 3/4. Left is the hazard (no UV layer) — flat teal of texel (0, 0). Right is the repair (pre-create + `calc_uvs`) — full magenta/cyan checker. If the UV contract failed, both panels would read the same — and the still is not just an illustration: the script re-reads its own render and exits non-zero unless the pixels prove the flat-vs-checker split (measured on 5.1.2: hazard spread -`0.0078`, repair spread `0.7294`). +`0.0078`, repair spread `0.7412`; identical on 4.5.11). ## Run diff --git a/examples/uv-layer-grid/preview.webp b/examples/uv-layer-grid/preview.webp index 943731b5fefe23427d79dce93b47f2f35db70842..e58b2f33be1f4576f90848f5fecd966b046ce765 100644 GIT binary patch literal 16798 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 CnxV@8 diff --git a/examples/uv-layer-grid/uv_layer_grid.py b/examples/uv-layer-grid/uv_layer_grid.py index 019e725..908b045 100644 --- a/examples/uv-layer-grid/uv_layer_grid.py +++ b/examples/uv-layer-grid/uv_layer_grid.py @@ -19,6 +19,7 @@ blender --background --python uv_layer_grid.py -- --output uv.png """ import bpy, bmesh, sys, os, math, argparse +from mathutils import Vector SEG = 8 SIZE = 1.0 @@ -244,15 +245,108 @@ def render_still(path, engine): scene = bpy.context.scene card = make_uv_testcard("UVCard") - # Left: the hazard — calc_uvs alone, no UV layer → flat teal of texel (0,0). - broken = textured_plane("Broken", card, with_uvs=False) - broken.location = (-1.18, 0.0, 0.94) - broken.rotation_euler = (math.radians(62), 0.0, math.radians(8)) - - # Right: the repair — pre-create UV layer, then calc_uvs fills it. - fixed = textured_plane("Fixed", card, with_uvs=True) - fixed.location = (1.18, 0.0, 0.94) - fixed.rotation_euler = (math.radians(62), 0.0, math.radians(-8)) + # --- Staging materials: quiet and dark, the panel faces carry the color -- + def pbr(name, base, rough, metal=0.0): + m = bpy.data.materials.new(name) + m.use_nodes = True + b = m.node_tree.nodes["Principled BSDF"] + b.inputs["Base Color"].default_value = (*base, 1.0) + b.inputs["Roughness"].default_value = rough + b.inputs["Metallic"].default_value = metal + return m + + frame_mat = pbr("Frame", (0.05, 0.053, 0.06), 0.32, 0.65) + stand_mat = pbr("Stand", (0.032, 0.035, 0.042), 0.45, 0.4) + led_mat = pbr("Led", (0.0, 0.0, 0.0), 0.6) + led_b = led_mat.node_tree.nodes["Principled BSDF"] + led_b.inputs["Emission Color"].default_value = (1.0, 0.45, 0.12, 1.0) + led_b.inputs["Emission Strength"].default_value = 4.0 + + def box(name, dims, loc, rot, mat, bevel=0.0): + dx, dy, dz = (d * 0.5 for d in dims) + verts = [ + (-dx, -dy, -dz), (dx, -dy, -dz), (dx, dy, -dz), (-dx, dy, -dz), + (-dx, -dy, dz), (dx, -dy, dz), (dx, dy, dz), (-dx, dy, dz), + ] + faces = [ + (0, 1, 2, 3), (4, 7, 6, 5), (0, 4, 5, 1), + (1, 5, 6, 2), (2, 6, 7, 3), (4, 0, 3, 7), + ] + me = bpy.data.meshes.new(name) + me.from_pydata(verts, [], faces) + me.materials.append(mat) + ob = bpy.data.objects.new(name, me) + ob.location = loc + ob.rotation_euler = rot + scene.collection.objects.link(ob) + if bevel > 0.0: + mod = ob.modifiers.new("Edge", "BEVEL") + mod.width = bevel + mod.segments = 2 + return ob + + def bar_between(name, p1, p2, width, mat): + a, b = Vector(p1), Vector(p2) + d = b - a + ob = box(name, (width, width, d.length), (a + b) * 0.5, (0, 0, 0), mat, 0.01) + ob.rotation_mode = "QUATERNION" + ob.rotation_quaternion = d.to_track_quat("Z", "Y") + return ob + + # --- Two framed lightbox displays, each on a floor tray with a rear + # kick leg. The face planes keep their origins at the face centers (the + # pixel witness probes the projected centers), with a ~0.2-unit bezel + # between the face edge and the frame so the probed patch stays on data. + LEAN = math.radians(75.0) # 15° back off vertical, easel-like + + def display(name, with_uvs, cx, cy, yaw_deg): + yaw = math.radians(yaw_deg) + asm = bpy.data.objects.new(name + "Asm", None) + asm.rotation_euler = (LEAN, 0.0, yaw) + rot = asm.rotation_euler.to_matrix() + # Face-center height such that the frame's bottom edge rests in tray. + contact = rot @ Vector((0.0, -1.17, 0.02)) + asm.location = (cx, cy, 0.07 - contact.z) + scene.collection.objects.link(asm) + + # Left: the hazard — calc_uvs alone, no UV layer → flat teal of + # texel (0,0). Right: the repair — pre-create, then calc_uvs fills. + face = textured_plane(name, card, with_uvs) + face.parent = asm + face.location = (0.0, 0.0, 0.075) + + plate = box(name + "Back", (2.34, 2.34, 0.14), (0, 0, 0), (0, 0, 0), + frame_mat, 0.02) + plate.parent = asm + bezels = ( + ((2.34, 0.17, 0.20), (0.0, 1.085, 0.02)), + ((2.34, 0.17, 0.20), (0.0, -1.085, 0.02)), + ((0.17, 2.0, 0.20), (1.085, 0.0, 0.02)), + ((0.17, 2.0, 0.20), (-1.085, 0.0, 0.02)), + ) + for i, (dims, loc) in enumerate(bezels): + bez = box(f"{name}Bez{i}", dims, loc, (0, 0, 0), frame_mat, 0.02) + bez.parent = asm + led = box(name + "Led", (0.06, 0.03, 0.035), (0.92, -1.085, 0.128), + (0, 0, 0), led_mat, 0.008) + led.parent = asm + + base = asm.location + box(name + "Tray", (2.0, 0.32, 0.10), + (base.x + contact.x, base.y + contact.y, 0.05), + (0, 0, yaw), stand_mat, 0.02) + back = rot @ Vector((0.0, 0.0, -1.0)) + back.z = 0.0 + back.normalize() + for side in (-0.75, 0.75): + attach = base + rot @ Vector((side, 0.55, -0.12)) + foot = (base.x + contact.x + side * math.cos(yaw) + back.x * 0.85, + base.y + contact.y - side * math.sin(yaw) + back.y * 0.85, + 0.02) + bar_between(f"{name}Leg{side:+.2f}", attach, foot, 0.06, stand_mat) + + display("Broken", False, -1.38, 0.30, 6.0) + display("Fixed", True, 1.45, -0.10, 9.0) floor_me = bpy.data.meshes.new("Floor") bm = bmesh.new() @@ -291,21 +385,23 @@ def light(name, loc, energy, size, col, rot): ob.rotation_euler = tuple(math.radians(a) for a in rot) scene.collection.objects.link(ob) - light("Key", (-3.8, -4.8, 5.8), 300.0, 4.5, (1.0, 0.96, 0.9), (52, 0, -32)) - light("Fill", (4.8, -2.8, 1.6), 55.0, 9.0, (0.75, 0.85, 1.0), (72, 0, 52)) - light("Rim", (0.2, 4.0, 2.8), 90.0, 3.2, (0.6, 0.78, 1.0), (-62, 0, 178)) - # Between the panels and the wall so it only rakes the backdrop: a - # contained warm pool, corners falling off to dark. - light("Wedge", (0.3, 5.4, 1.9), 380.0, 3.6, (1.0, 0.68, 0.38), (-72, 0, 180)) + # Aimed steeply down so its spill dies on the floor, not on the wall. + light("Key", (-4.4, -4.2, 6.4), 340.0, 5.0, (1.0, 0.96, 0.9), (60, 0, -32)) + light("Fill", (4.8, -2.8, 1.6), 80.0, 9.0, (0.75, 0.85, 1.0), (72, 0, 52)) + light("Rim", (0.2, 4.6, 3.0), 250.0, 3.5, (0.6, 0.78, 1.0), (-42, 0, 178)) + # Uplight between the displays and the wall, raking UP the backdrop: the + # visible wall band above the panel tops only spans z≈2.8–3.4, so the + # warm pool is aimed to live there instead of hiding behind the panels. + light("Wedge", (-2.2, 5.6, 2.3), 480.0, 3.0, (1.0, 0.76, 0.5), (-117, 0, 180)) aim = bpy.data.objects.new("Aim", None) - aim.location = (0.0, 0.0, 0.95) + aim.location = (0.1, 0.05, 1.0) scene.collection.objects.link(aim) cam_data = bpy.data.cameras.new("Cam") - cam_data.lens = 45.0 + cam_data.lens = 48.0 cam = bpy.data.objects.new("Cam", cam_data) - cam.location = (0.0, -6.6, 2.1) + cam.location = (3.1, -8.35, 2.2) con = cam.constraints.new("TRACK_TO") con.target = aim con.track_axis = "TRACK_NEGATIVE_Z" diff --git a/examples/vertex-weight-limit/README.md b/examples/vertex-weight-limit/README.md index 0e5d23a..7fb7ea1 100644 --- a/examples/vertex-weight-limit/README.md +++ b/examples/vertex-weight-limit/README.md @@ -17,22 +17,22 @@ weighting here, export in [`gltf-export-roundtrip`](../gltf-export-roundtrip/). **What it witnesses:** the skinning constraint every game engine enforces and AI-generated rigging code most often violates silently. -1. **The limit is a data-API operation, not a context operator.** Instead of - `bpy.ops.object.vertex_group_limit_total`, the example reads each vertex's - groups, keeps the top four by weight, `VertexGroup.remove`s the rest, and - renormalizes the survivors. Dropping without renormalizing leaves sums at - 0.984 — a mesh that shrinks toward the origin under load (the check's - measured failure, 1.616e-02 off unit sum). -2. **The armature modifier is still exactly linear blend skinning** after the - limit: every depsgraph-evaluated vertex equals - `Σ wᵢ · (pose.matrix @ bone.matrix_local.inverted()) @ rest`, with the - weights **read back from the mesh's own deform layer** (`v.groups`) — the - weights on the mesh are the contract, not the weights you meant to write. - Measured `lbs_err = 2.7e-07`. -3. **Pruning must not damage the pose.** Evaluated positions before and after - the limit are held within 0.05 (measured 2.8e-03), the pedestal mount stays - exactly pinned (Root is unposed), and the pre-limit authoring really carries - five influences in the cuffs — otherwise the witness would be vacuous. +- **The limit is a data-API operation, not a context operator.** Instead of + `bpy.ops.object.vertex_group_limit_total`, the example reads each vertex's + groups, keeps the top four by weight, `VertexGroup.remove`s the rest, and + renormalizes the survivors. Dropping without renormalizing leaves sums at + 0.984 — a mesh that shrinks toward the origin under load (the check's + measured failure, 1.616e-02 off unit sum). +- **The armature modifier is still exactly linear blend skinning** after the + limit: every depsgraph-evaluated vertex equals + `Σ wᵢ · (pose.matrix @ bone.matrix_local.inverted()) @ rest`, with the + weights **read back from the mesh's own deform layer** (`v.groups`) — the + weights on the mesh are the contract, not the weights you meant to write. + Measured `lbs_err = 2.7e-07`. +- **Pruning must not damage the pose.** Evaluated positions before and after + the limit are held within 0.05 (measured 2.8e-03), the pedestal mount stays + exactly pinned (Root is unposed), and the pre-limit authoring really carries + five influences in the cuffs — otherwise the witness would be vacuous. The vertex-group API (`v.groups`, `VertexGroup.add`/`remove`) is stable between Blender 4.5 LTS and 5.1 — the example runs identically on both, which is itself diff --git a/examples/vse-cut-list/README.md b/examples/vse-cut-list/README.md index cc0ecbb..547bdd1 100644 --- a/examples/vse-cut-list/README.md +++ b/examples/vse-cut-list/README.md @@ -13,33 +13,33 @@ a GAMMA_CROSS fed by a dedicated source pair T1/T2, a scene strip, and a text strip — asserted against closed-form spans on each version's canonical accessors, then re-asserted after a save/reload round-trip: -1. **Accessor rename** — 5.x: `sequence_editor.sequences` raises - AttributeError; only `.strips` exists. 4.5: both accessors exist and see - the same strips (the transition bridge). -2. **Creation signature** — `strips.new_effect(...)` ends a strip with - `frame_end=` on 4.5 but `length=` on 5.x; the wrong kwarg raises TypeError - on each side (asserted, not assumed). 5.x also rejects the removed - `TRANSFORM` effect type — per-strip `strip.transform` (StripTransform) - places strips in the frame on both versions. -3. **Frame-range closed form** — every strip's (start, end, duration) matches - the authored end-exclusive span: `frame_final_*` on 4.5; - `left_handle`/`right_handle`/`duration` on 5.x, where the `frame_final_*` - names are deprecated aliases (removal announced for 6.0) that must still - read equal — the bridge is asserted lossless, with the RNA - `is_deprecated` flag checked on 5.x and its absence checked on 4.5. -4. **Effect wiring** — `input_1`/`input_2` (not `input1`) on both versions, - in authored order, and the cross clamped to exactly the T1/T2 overlap. -5. **Scene strip** — 4-arg `new_scene(name, scene, channel, frame_start)` on - both versions (no `length`/`frame_end` kwarg); default span is the source - scene's frame range; the strip sources a *separate* Stage scene. -6. **Round-trip** — spans, channels, colors, GC wiring, text, and mosaic - transforms (pixel-unit offsets, tol 1e-3) all survive - `save_as_mainfile` → `open_mainfile`. -7. **Compositing (`--check-pixels`)** — a 96×54 render asserts each mosaic - cell center carries its strip color (tol 0.1), the cross cell is a true - mid blend (strictly between the sources on every channel), and a margin - point matches neither cross source — because a consumed input compositing - independently would paint it full-frame. +- **Accessor rename** — 5.x: `sequence_editor.sequences` raises + AttributeError; only `.strips` exists. 4.5: both accessors exist and see + the same strips (the transition bridge). +- **Creation signature** — `strips.new_effect(...)` ends a strip with + `frame_end=` on 4.5 but `length=` on 5.x; the wrong kwarg raises TypeError + on each side (asserted, not assumed). 5.x also rejects the removed + `TRANSFORM` effect type — per-strip `strip.transform` (StripTransform) + places strips in the frame on both versions. +- **Frame-range closed form** — every strip's (start, end, duration) matches + the authored end-exclusive span: `frame_final_*` on 4.5; + `left_handle`/`right_handle`/`duration` on 5.x, where the `frame_final_*` + names are deprecated aliases (removal announced for 6.0) that must still + read equal — the bridge is asserted lossless, with the RNA + `is_deprecated` flag checked on 5.x and its absence checked on 4.5. +- **Effect wiring** — `input_1`/`input_2` (not `input1`) on both versions, + in authored order, and the cross clamped to exactly the T1/T2 overlap. +- **Scene strip** — 4-arg `new_scene(name, scene, channel, frame_start)` on + both versions (no `length`/`frame_end` kwarg); default span is the source + scene's frame range; the strip sources a *separate* Stage scene. +- **Round-trip** — spans, channels, colors, GC wiring, text, and mosaic + transforms (pixel-unit offsets, tol 1e-3) all survive + `save_as_mainfile` → `open_mainfile`. +- **Compositing (`--check-pixels`)** — a 96×54 render asserts each mosaic + cell center carries its strip color (tol 0.1), the cross cell is a true + mid blend (strictly between the sources on every channel), and a margin + point matches neither cross source — because a consumed input compositing + independently would paint it full-frame. **What each check catches on failure:**

    A runnable example that builds a sci-fi supply crate — 35 beveled box shells with three material slots and box-mapped UVs — exports it with bpy.ops.export_scene.gltf, parses the file on disk, re-imports it, and verifies the whole round-trip against the depsgraph-evaluated mesh, following depsgraph-and-evaluated-data and headless-batch-scripting.