From b5cac0bceb7c37a2395e542eb6e896a3a2d5151f Mon Sep 17 00:00:00 2001 From: fOuttaMyPaint Date: Wed, 9 Sep 2026 18:52:00 -0400 Subject: [PATCH] feat: witness ID-property delete and USD evaluation_mode The snippet __main__ is dark headless because it keys off active_object; the example builds IDs via the data API. USD evaluation_mode is silent under default BEST_MATCH; TESSELLATE is what makes RENDER vs VIEWPORT observable. Signed-off-by: fOuttaMyPaint --- .cursor-plugin/plugin.json | 2 + AGENTS.md | 4 +- CLAUDE.md | 4 +- README.md | 37 +- ROADMAP.md | 3 + .../cross-version-property-delete-hero.webp | Bin 0 -> 13938 bytes .../usd-export-evaluation-mode-hero.webp | Bin 0 -> 7420 bytes ...version-property-delete-contact-sheet.webp | Bin 0 -> 83680 bytes ...-export-evaluation-mode-contact-sheet.webp | Bin 0 -> 77060 bytes .../cross-version-property-delete/index.html | 660 +++++++++++++++++ docs/gallery/index.html | 25 +- .../usd-export-evaluation-mode/index.html | 663 ++++++++++++++++++ .../cross-version-property-delete/README.md | 38 + .../cross_version_property_delete.py | 342 +++++++++ .../preview.webp | Bin 0 -> 13004 bytes examples/gallery.json | 24 + examples/usd-export-evaluation-mode/README.md | 43 ++ .../usd-export-evaluation-mode/preview.webp | Bin 0 -> 6954 bytes .../usd_export_evaluation_mode.py | 345 +++++++++ tests/smoke/catalog.json | 4 +- 20 files changed, 2184 insertions(+), 10 deletions(-) create mode 100644 docs/gallery/assets/cross-version-property-delete-hero.webp create mode 100644 docs/gallery/assets/usd-export-evaluation-mode-hero.webp create mode 100644 docs/gallery/contact-sheets/cross-version-property-delete-contact-sheet.webp create mode 100644 docs/gallery/contact-sheets/usd-export-evaluation-mode-contact-sheet.webp create mode 100644 docs/gallery/cross-version-property-delete/index.html create mode 100644 docs/gallery/usd-export-evaluation-mode/index.html create mode 100644 examples/cross-version-property-delete/README.md create mode 100644 examples/cross-version-property-delete/cross_version_property_delete.py create mode 100644 examples/cross-version-property-delete/preview.webp create mode 100644 examples/usd-export-evaluation-mode/README.md create mode 100644 examples/usd-export-evaluation-mode/preview.webp create mode 100644 examples/usd-export-evaluation-mode/usd_export_evaluation_mode.py diff --git a/.cursor-plugin/plugin.json b/.cursor-plugin/plugin.json index 7e21d53..b83e9ea 100644 --- a/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugin.json @@ -67,6 +67,7 @@ "examples/collision-hull-proxy", "examples/color-attribute-wheel", "examples/compositor-glare", + "examples/cross-version-property-delete", "examples/curve-bevel-arc", "examples/custom-normals-shade", "examples/damped-track-aim", @@ -99,6 +100,7 @@ "examples/text-version-stamp", "examples/triangulate-tangents", "examples/turntable", + "examples/usd-export-evaluation-mode", "examples/uv-layer-grid", "examples/vertex-color-ao", "examples/vertex-weight-limit", diff --git a/AGENTS.md b/AGENTS.md index aa6fab6..613b3ed 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -20,7 +20,7 @@ a `.cursor-plugin/plugin.json` manifest so the ecosystem drift checker classifies it as a `cursor-plugin`. This is content the AI loads when the user asks Blender questions or works on Blender add-ons in Cursor or Claude Code. -The content base is 13 skills, 6 rules, 2 templates, 17 snippets, and 45 +The content base is 13 skills, 6 rules, 2 templates, 17 snippets, and 47 examples (counts are CI-enforced against README.md and the manifest). The full inventory tables and per-item purposes live in `CLAUDE.md`. Example anatomy and authoring rules: copy `examples/bmesh-gear/`; the render look is specified @@ -35,7 +35,7 @@ Blender-Developer-Tools/ rules/.mdc # 6 rule files templates// # 2 starter templates snippets/.py # 17 standalone Python snippets - examples// # 45 runnable smoke-gated examples (+ gallery.json) + examples// # 47 runnable smoke-gated examples (+ gallery.json) examples/gallery_framing.py # shared Layer 1 framing measurement (render path only) scripts/build_gallery.py # generates docs/gallery/ (stdlib only) scripts/site/ # vendored landing-page build (build_site.py + template) diff --git a/CLAUDE.md b/CLAUDE.md index 05e289a..9e5386d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -21,7 +21,7 @@ skills//SKILL.md - AI workflow definitions, 13 total rules/.mdc - Anti-pattern rules, 6 total templates// - Starter projects, 2 total snippets/.py - Standalone code patterns, 17 total -examples// - Runnable smoke-gated examples, 45 total (+ gallery.json) +examples// - Runnable smoke-gated examples, 47 total (+ gallery.json) scripts/build_gallery.py - Regenerates docs/gallery/ from gallery.json (stdlib only) scripts/site/ - Vendored landing-page build (Jinja2) docs/gallery/ - Committed generated gallery pages + hero renders @@ -83,7 +83,7 @@ v0.1.0: canonical object creation and deletion, depsgraph evaluated mesh, bmesh v0.2.0: Principled BSDF material, driver-with-custom-function via `driver_namespace`, application handler registration, shader node group with cross-version `interface` API, `foreach_get` bulk vertex read, version-branch skeleton, and USD export with `evaluation_mode='RENDER'`. -## Examples (45) +## Examples (47) Runnable scripts at `examples//`, each asserting a real API contract with deterministic checks (exit non-zero on failure) and optionally rendering a still via diff --git a/README.md b/README.md index 129d1f6..191720b 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@

- 13 skills  •  6 rules  •  2 templates  •  17 snippets  •  45 examples + 13 skills  •  6 rules  •  2 templates  •  17 snippets  •  47 examples

@@ -36,7 +36,7 @@ ## Overview -This repository ships **13 skills, 6 rules, 2 templates, 17 snippets, and 45 runnable examples** for Blender Python development targeting Blender 5.2 LTS (current stable) with Blender 4.5 LTS fallback support. Blender 5.1 is prior stable. +This repository ships **13 skills, 6 rules, 2 templates, 17 snippets, and 47 runnable examples** for Blender Python development targeting Blender 5.2 LTS (current stable) with Blender 4.5 LTS fallback support. Blender 5.1 is prior stable. The content is consumed by AI coding agents (Cursor, Claude Code, any MCP-capable client) when working on Blender add-ons, geometry nodes scripts, batch pipelines, or animation tooling. There is no build step. Edit the markdown and Python files directly. @@ -203,7 +203,7 @@ Gallery still is a dual-elevation diptych so the contract reads at thumbnail sca

-Mesh, curves & text — 10 examples +Mesh, curves & text — 11 examples @@ -308,6 +308,21 @@ A depsgraph-evaluated export — builds a cube with `SUBSURF`, measures the eval `evaluated_get().to_mesh()` / `to_mesh_clear()`, and asserts `wm.obj_export` ships the modifier-applied geometry (exported vertex count == evaluated > base). + + + + + @@ -496,7 +511,7 @@ and every orbit lands on its closed form.
-Context & Grease Pencil — 3 examples +Context & Grease Pencil — 4 examples
+USD export evaluation_mode: two steel SUBSURF cubes on a dark studio floor — left faceted viewport tessellation, right smoother render tessellation, warm wedge on the back wall + + +### [usd-export-evaluation-mode](examples/usd-export-evaluation-mode/) + +`wm.usd_export` `evaluation_mode='RENDER'` versus `'VIEWPORT'`. TESSELLATE writes +the closed-form Catmull-Clark counts (26/24 vs 98/96); default BEST_MATCH writes +the 8-vert cage and the mode is silent. Asserts the USDA point counts, not the +still. +
@@ -511,6 +526,20 @@ Three unit cubes joined into a staircase under `bpy.context.temp_override` — t replacement for the removed `context.copy()` dict-pass form. Asserts one mesh remains, sources are gone, and local Z spans all three steps. + + + + + diff --git a/ROADMAP.md b/ROADMAP.md index c6114cc..b11b713 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -91,6 +91,9 @@ Audit pass on v0.1.0 content: standards-version markers bumped from `1.9.1` to ` Not committed; target list for the next content version. (v0.3.0 shipped the smoke-gated `examples/` track.) +- ~~Custom ID-property delete witness~~ **SHIPPED** as `examples/cross-version-property-delete/` — IDs built via `bpy.data.objects.new` (not `active_object`); `property_unset` is TypeError and leaves the key; `del` removes it on 4.5 LTS and 5.x +- ~~USD export evaluation_mode witness~~ **SHIPPED** as `examples/usd-export-evaluation-mode/` — probed `wm.usd_export` on CI Linux portables 5.2.1 (`9e2066aef7ef`) and 4.5.13 (`daeeeca98fb0`); TESSELLATE+VIEWPORT 26/24, TESSELLATE+RENDER 98/96; BEST_MATCH writes the 8-vert catmullClark cage so the mode is silent +- Tighten inverted smoke canaries: assert the expected `[FAIL]` marker text (`skipped on ... should run` / `missing post-exit sidecar`) alongside wrapper exit 1, so a canary that dies for the wrong reason does not satisfy the gate - ~~Fleet Pages facelift + examples support~~ **RESOLVED differently (2026-07-03)**: the meta-repo migration was dropped — the fleet template only scaffolds new tools, and each tool's site evolves independently after that. This repo vendored the site build into `scripts/site/`, redesigned landing + gallery as the Blender-viewport system (see `docs/gallery/DESIGN_NOTES.md`), added the examples grid, nav link, and full hero stats locally. `scripts/build_gallery.py` and `examples/gallery.json` are now permanent, not a prototype awaiting lift-and-shift. - `modal-operators` skill -- `invoke` returning `RUNNING_MODAL`, the `modal()` event handler, modal cancellation patterns - `usd-pipelines` skill -- USD export options, `evaluation_mode`, instancing, the USD vs glTF tradeoffs diff --git a/docs/gallery/assets/cross-version-property-delete-hero.webp b/docs/gallery/assets/cross-version-property-delete-hero.webp new file mode 100644 index 0000000000000000000000000000000000000000..4f3e33aa1205af862c0979bca91d111d9f4c17bc GIT binary patch literal 13938 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 MKfgr)(qa$*0JCx_K>z>% literal 0 HcmV?d00001 diff --git a/docs/gallery/assets/usd-export-evaluation-mode-hero.webp b/docs/gallery/assets/usd-export-evaluation-mode-hero.webp new file mode 100644 index 0000000000000000000000000000000000000000..e12e1841850466540f511449046311c1312e9ea6 GIT binary patch literal 7420 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 literal 0 HcmV?d00001 diff --git a/docs/gallery/contact-sheets/cross-version-property-delete-contact-sheet.webp b/docs/gallery/contact-sheets/cross-version-property-delete-contact-sheet.webp new file mode 100644 index 0000000000000000000000000000000000000000..7cadb6fe5a1588b9740f79a0b8c5fc836c649b4c GIT binary patch literal 83680 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 `9W?WpX=*cYwZUhlw%O*0_oBEisa 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 + + + + + cross-version-property-delete — Examples — Blender Developer Tools + + + + + + + + + + + + + + + + + + +
+

cross-version-property-delete

+

Custom ID properties are removed with del, not property_unset. The IDs are built through bpy.data.objects.new so the check does not depend on active_object.

+
+
+ +

Rendered headless by the example itself — click to zoom.

+
witnesses Factory-empty has no active_object; property_unset raises TypeError and leaves the key; del removes it (clear_has=False). --skip-delete and --unset-instead exit 7.
+
+
blender --background --python examples/cross-version-property-delete/cross_version_property_delete.py --
+ +
+
+

A pair of machined specimen tags that witnesses the custom ID-property delete contract from cross-version-property-delete.py and custom-properties — not the snippet's __main__, which keys off context.active_object and prints nothing in --background.

+

The IDs are built with bpy.data.objects.new. The Keep tag still carries ["accession"] = 42 (emissive enamel). The Clear tag had del obj["accession"] (empty pocket). Same del on 4.5 LTS and 5.x; there is no version branch.

+

What it witnesses: property_unset is a TypeError on a custom ID key and does not remove it. del id_block[key] does. After factory-empty, there is no active_object.

+

What failure each check would catch:

+
  • exit 2 — someone set an active object; the snippet __main__ would have been the only path
  • exit 3 — the ID property never landed
  • exit 4 — property_unset removed the key or failed to raise
  • exit 7 — del did not run (--skip-delete / --unset-instead falsify this: measured clear_has=True)
+

Run

+
blender --background --python cross_version_property_delete.py --
+blender --background --python cross_version_property_delete.py -- --output tags.png
+

--skip-delete and --unset-instead are falsification switches: both leave the Clear plate tagged and exit 7.

+

The --output render path measures framing against the Layer 1 band via examples/gallery_framing.py (exit 10 on violation) before writing the still.

+
+
+

Source

+
+ examples/cross-version-property-delete/cross_version_property_delete.py + View on GitHub → +
+
"""Custom ID-property delete — a runnable example.
+
+Witnesses the contract the snippet ``cross-version-property-delete`` teaches,
+not the snippet's ``__main__`` (which keys off ``context.active_object`` and
+is dark headless). Builds the ID through ``bpy.data.objects.new`` and asserts:
+
+1. ``obj["accession"] = 42`` lands in ``obj.keys()``.
+2. ``property_unset("accession")`` is a TypeError and does **not** remove
+   the ID property — that RNA call resets a registered property to default.
+3. ``del obj["accession"]`` removes it. Same on 4.5 LTS and 5.x; no version
+   branch.
+
+By default it runs only the correctness check (no render) — the CI smoke
+check. Pass --output to also render a still:
+
+    blender --background --python cross_version_property_delete.py --
+    blender --background --python cross_version_property_delete.py -- --output t.png
+"""
+import bpy, bmesh, sys, os, math, argparse
+
+sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir))
+sys.dont_write_bytecode = True
+import gallery_framing
+
+KEY = "accession"
+VALUE = 42
+
+
+def beveled_box(name, size, bevel, segments=2):
+    me = bpy.data.meshes.new(name)
+    bm = bmesh.new()
+    try:
+        bmesh.ops.create_cube(bm, size=1.0)
+        for v in bm.verts:
+            v.co.x *= size[0]
+            v.co.y *= size[1]
+            v.co.z *= size[2]
+        bm.normal_update()
+        bmesh.ops.bevel(
+            bm, geom=list(bm.edges), offset=bevel, segments=segments,
+            profile=0.5, affect="EDGES", clamp_overlap=True,
+        )
+        bm.to_mesh(me)
+    finally:
+        bm.free()
+    ob = bpy.data.objects.new(name, me)
+    bpy.context.collection.objects.link(ob)
+    return ob
+
+
+def cylinder(name, radius, depth, loc, segs=24):
+    me = bpy.data.meshes.new(name)
+    bm = bmesh.new()
+    try:
+        bmesh.ops.create_cone(
+            bm, cap_ends=True, cap_tris=False, segments=segs,
+            radius1=radius, radius2=radius, depth=depth,
+        )
+        bm.to_mesh(me)
+    finally:
+        bm.free()
+    ob = bpy.data.objects.new(name, me)
+    ob.location = loc
+    bpy.context.collection.objects.link(ob)
+    return ob
+
+
+def build_tag(name, x, yaw):
+    """Machined specimen tag: plate, pocket, hanging ring. No ID property yet."""
+    plate = beveled_box(f"{name}Plate", (1.70, 0.10, 1.05), 0.035)
+    plate.location = (x, 0.0, 1.15)
+    plate.rotation_euler = (0.0, 0.0, yaw)
+    pocket = beveled_box(f"{name}Pocket", (0.92, 0.04, 0.48), 0.02)
+    pocket.parent = plate
+    pocket.location = (0.18, -0.05, -0.03)
+    ring = cylinder(f"{name}Ring", 0.11, 0.05, (0.0, 0.0, 0.0), segs=20)
+    ring.parent = plate
+    ring.location = (-0.68, 0.0, 0.33)
+    ring.rotation_euler = (math.pi / 2, 0.0, 0.0)
+    return plate, pocket, ring
+
+
+def add_inlay(name, plate):
+    """Emissive enamel only when the ID property is still on the plate."""
+    inlay = beveled_box(f"{name}Inlay", (0.82, 0.03, 0.40), 0.015)
+    inlay.parent = plate
+    inlay.location = (0.18, -0.07, -0.03)
+    return inlay
+
+
+def build():
+    bpy.ops.wm.read_factory_settings(use_empty=True)
+    keep_parts = build_tag("Keep", -1.15, 0.0)
+    clear_parts = build_tag("Clear", 1.15, 0.0)
+    post = cylinder("StandPost", 0.07, 1.55, (0.0, 0.22, 0.78))
+    base = beveled_box("StandBase", (3.4, 0.9, 0.12), 0.04)
+    base.location = (0.0, 0.15, 0.06)
+    bar = beveled_box("StandBar", (2.6, 0.08, 0.08), 0.02)
+    bar.location = (0.0, 0.22, 1.52)
+    return keep_parts, clear_parts, [post, base, bar]
+
+
+def remove_custom_property(id_block, key):
+    if key not in id_block.keys():
+        return False
+    del id_block[key]
+    return True
+
+
+def check(keep_plate, clear_plate, skip_delete=False, unset_instead=False):
+    if bpy.context.active_object is not None:
+        print(
+            "ERROR: expected no active_object after factory empty + data-API build; "
+            "the snippet __main__ would have been dark for the same reason",
+            file=sys.stderr,
+        )
+        return 2
+
+    keep_plate[KEY] = VALUE
+    clear_plate[KEY] = VALUE
+    if KEY not in keep_plate.keys() or keep_plate[KEY] != VALUE:
+        print(f"ERROR: ID property {KEY} did not land on Keep plate", file=sys.stderr)
+        return 3
+    if KEY not in clear_plate.keys():
+        print(f"ERROR: ID property {KEY} did not land on Clear plate", file=sys.stderr)
+        return 3
+
+    try:
+        keep_plate.property_unset(KEY)
+        print("ERROR: property_unset on a custom ID key returned instead of TypeError",
+              file=sys.stderr)
+        return 4
+    except TypeError as exc:
+        print(f"property_unset TypeError={exc}")
+    if KEY not in keep_plate.keys():
+        print("ERROR: property_unset removed the ID property — it must not", file=sys.stderr)
+        return 4
+
+    if unset_instead:
+        try:
+            clear_plate.property_unset(KEY)
+        except TypeError:
+            pass
+    elif not skip_delete:
+        if not remove_custom_property(clear_plate, KEY):
+            print("ERROR: del did not report removal", file=sys.stderr)
+            return 5
+
+    keep_has = KEY in keep_plate.keys()
+    clear_has = KEY in clear_plate.keys()
+    print(
+        f"active_object=None keep_has={keep_has} clear_has={clear_has} "
+        f"skip_delete={skip_delete} unset_instead={unset_instead}"
+    )
+    if not keep_has:
+        print("ERROR: Keep plate lost the ID property", file=sys.stderr)
+        return 6
+    if clear_has:
+        print(
+            "ERROR: Clear plate still has the ID property — del did not run "
+            "(property_unset is not a delete)",
+            file=sys.stderr,
+        )
+        return 7
+    return 0
+
+
+def eevee_engine_id():
+    return "BLENDER_EEVEE" if bpy.app.version >= (5, 0, 0) else "BLENDER_EEVEE_NEXT"
+
+
+def principled(name, color, metallic, roughness, emission=None):
+    mat = bpy.data.materials.new(name)
+    mat.use_nodes = True
+    bsdf = mat.node_tree.nodes["Principled BSDF"]
+    bsdf.inputs["Base Color"].default_value = color
+    bsdf.inputs["Metallic"].default_value = metallic
+    bsdf.inputs["Roughness"].default_value = roughness
+    if emission is not None:
+        sock = bsdf.inputs.get("Emission Color") or bsdf.inputs["Emission"]
+        sock.default_value = emission
+        bsdf.inputs["Emission Strength"].default_value = 4.5
+    return mat
+
+
+def assign(ob, mat):
+    ob.data.materials.clear()
+    ob.data.materials.append(mat)
+
+
+def render_still(keep_parts, clear_parts, stand, path, engine):
+    scene = bpy.context.scene
+    brass = principled("Brass", (0.78, 0.50, 0.18, 1.0), 1.0, 0.22)
+    pocket = principled("Pocket", (0.04, 0.042, 0.05, 1.0), 0.2, 0.55)
+    enamel = principled(
+        "Enamel", (0.02, 0.35, 0.55, 1.0), 0.0, 0.35,
+        emission=(0.05, 0.55, 0.85, 1.0),
+    )
+    steel = principled("Steel", (0.18, 0.19, 0.21, 1.0), 1.0, 0.38)
+
+    keep_plate, keep_pocket, keep_ring = keep_parts
+    clear_plate, clear_pocket, clear_ring = clear_parts
+    for ob in (keep_plate, keep_ring, clear_plate, clear_ring):
+        assign(ob, brass)
+    assign(keep_pocket, pocket)
+    assign(clear_pocket, pocket)
+    for ob in stand:
+        assign(ob, steel)
+
+    inlay = None
+    if KEY in keep_plate.keys():
+        inlay = add_inlay("Keep", keep_plate)
+        assign(inlay, enamel)
+    if KEY in clear_plate.keys():
+        ghost = add_inlay("Clear", clear_plate)
+        assign(ghost, enamel)
+
+    floor_me = bpy.data.meshes.new("Floor")
+    bm = bmesh.new()
+    try:
+        bmesh.ops.create_grid(bm, x_segments=1, y_segments=1, size=30.0)
+        bm.to_mesh(floor_me)
+    finally:
+        bm.free()
+    floor_me.materials.append(principled("Studio", (0.03, 0.032, 0.037, 1.0), 0.0, 0.7))
+    floor = bpy.data.objects.new("Floor", floor_me)
+    scene.collection.objects.link(floor)
+    wall = bpy.data.objects.new("Wall", floor_me.copy())
+    wall.data.materials.clear()
+    wall.data.materials.append(principled("Wall", (0.03, 0.032, 0.037, 1.0), 0.0, 0.7))
+    wall.location = (0.0, 9.0, 0.0)
+    wall.rotation_euler = (math.pi / 2, 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.02, 0.021, 0.025, 1.0)
+    scene.world = world
+
+    def light(name, loc, energy, size, col, rot):
+        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)
+        scene.collection.objects.link(ob)
+
+    light("Key", (-4.0, -5.0, 6.0), 520.0, 5.0, (1.0, 0.96, 0.9), (46, 0, -35))
+    light("Fill", (5.0, -3.5, 3.0), 110.0, 9.0, (0.75, 0.85, 1.0), (62, 0, 50))
+    light("Wedge", (2.5, 5.5, 4.0), 380.0, 6.0, (1.0, 0.76, 0.5), (-68, 0, 190))
+    light("Glint", (1.6, -5.0, 6.0), 850.0, 0.9, (1.0, 0.9, 0.7), (40, 0, 18))
+
+    aim = bpy.data.objects.new("Aim", None)
+    aim.location = (0.0, 0.0, 1.15)
+    aim.hide_render = True
+    scene.collection.objects.link(aim)
+    cam_data = bpy.data.cameras.new("Cam")
+    cam_data.lens = 50.0
+    cam = bpy.data.objects.new("Cam", cam_data)
+    cam.location = (3.55, -6.59, 3.30)
+    scene.collection.objects.link(cam)
+    scene.camera = cam
+    track = cam.constraints.new("TRACK_TO")
+    track.target = aim
+    track.track_axis = "TRACK_NEGATIVE_Z"
+    track.up_axis = "UP_Y"
+
+    scene.render.engine = "CYCLES" if engine == "cycles" else eevee_engine_id()
+    if engine == "cycles":
+        scene.cycles.samples = 32
+    else:
+        try:
+            scene.eevee.taa_render_samples = 64
+        except AttributeError:
+            pass
+    scene.render.resolution_x = 1280
+    scene.render.resolution_y = 720
+    scene.render.image_settings.file_format = "PNG"
+    scene.render.filepath = path
+    scene.view_settings.view_transform = "Standard"
+
+    hero = [keep_plate, clear_plate, keep_ring, clear_ring] + list(stand)
+    if inlay is not None:
+        hero.append(inlay)
+    fcode = gallery_framing.check_framing(
+        scene, cam, hero=hero, elements=hero, stage=[floor, wall],
+    )
+    if fcode:
+        return fcode
+    bpy.ops.render.render(write_still=True)
+    if not (os.path.exists(path) and os.path.getsize(path) > 0):
+        print("ERROR: render produced no file", file=sys.stderr)
+        return 12
+    return 0
+
+
+def main():
+    argv = sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else []
+    p = argparse.ArgumentParser()
+    p.add_argument("--output", default=None)
+    p.add_argument("--engine", default="eevee", choices=("eevee", "cycles"))
+    p.add_argument(
+        "--skip-delete", action="store_true",
+        help="falsification: leave the Clear plate tagged",
+    )
+    p.add_argument(
+        "--unset-instead", action="store_true",
+        help="falsification: call property_unset instead of del",
+    )
+    args = p.parse_args(argv)
+
+    keep_parts, clear_parts, stand = build()
+    code = check(
+        keep_parts[0], clear_parts[0],
+        skip_delete=args.skip_delete, unset_instead=args.unset_instead,
+    )
+    if code:
+        return code
+
+    if args.output:
+        rcode = render_still(
+            keep_parts, clear_parts, stand,
+            os.path.abspath(args.output), args.engine,
+        )
+        if rcode:
+            return rcode
+        print(f"rendered still {args.output}")
+
+    print("cross-version-property-delete OK")
+    return 0
+
+
+if __name__ == "__main__":
+    try:
+        sys.exit(main())
+    except Exception as e:
+        import traceback
+        traceback.print_exc()
+        print(f"FATAL: {e}", file=sys.stderr)
+        sys.exit(1)
+
+
+
+ +
+
+ generated from examples/gallery.json + CC-BY-NC-ND-4.0 + exit 0 +
+
+ + + diff --git a/docs/gallery/index.html b/docs/gallery/index.html index 7cd1d1a..19fae33 100644 --- a/docs/gallery/index.html +++ b/docs/gallery/index.html @@ -272,7 +272,7 @@

Examples Gallery

autocomplete="off" spellcheck="false" aria-label="Search examples" /> - 45 examples + 47 examples
@@ -308,6 +308,7 @@

Examples Gallery

+ @@ -817,6 +818,28 @@

vertex-color-ao

View example
+
+ + cross-version-property-delete — Custom ID properties are removed with del, not property_unset. + +
+

cross-version-property-delete

+

Custom ID properties are removed with del, not property_unset. The IDs are built through bpy.data.objects.new so the check does not depend on active_object.

+

witnesses Factory-empty has no active_object; property_unset raises TypeError and leaves the key; del removes it (clear_has=False). --skip-delete and --unset-instead exit 7.

+ View example +
+
+
+ + usd-export-evaluation-mode — The USD exporter evaluation_mode chooses viewport versus render modifier quality. + +
+

usd-export-evaluation-mode

+

The USD exporter evaluation_mode chooses viewport versus render modifier quality. TESSELLATE makes the split observable; BEST_MATCH writes the cage and the mode is silent.

+

witnesses TESSELLATE+VIEWPORT writes 26/24; TESSELLATE+RENDER writes 98/96 subdivisionScheme=none; BEST_MATCH writes the 8-vert catmullClark cage. --evaluation-mode VIEWPORT and --subdivision BEST_MATCH exit 4.

+ View example +
+
diff --git a/docs/gallery/usd-export-evaluation-mode/index.html b/docs/gallery/usd-export-evaluation-mode/index.html new file mode 100644 index 0000000..b81ae09 --- /dev/null +++ b/docs/gallery/usd-export-evaluation-mode/index.html @@ -0,0 +1,663 @@ + + + + + + usd-export-evaluation-mode — Examples — Blender Developer Tools + + + + + + + + + + + + + + + + + + +
+

usd-export-evaluation-mode

+

The USD exporter evaluation_mode chooses viewport versus render modifier quality. TESSELLATE makes the split observable; BEST_MATCH writes the cage and the mode is silent.

+
+
+ +

Rendered headless by the example itself — click to zoom.

+
witnesses TESSELLATE+VIEWPORT writes 26/24; TESSELLATE+RENDER writes 98/96 subdivisionScheme=none; BEST_MATCH writes the 8-vert catmullClark cage. --evaluation-mode VIEWPORT and --subdivision BEST_MATCH exit 4.
+
+
blender --background --python examples/usd-export-evaluation-mode/usd_export_evaluation_mode.py --
+ +
+
+

A SUBSURF cube exported through wm.usd_export that witnesses evaluation_mode='RENDER' against 'VIEWPORT' — the contract usd-export-evaluation-mode.py names but does not prove.

+

Catmull-Clark on a cube is closed form: verts = 2 + 6 × 4^n (n=1 → 26, n=2 → 98). TESSELLATE + VIEWPORT writes 26 points / 24 quads; TESSELLATE + RENDER writes 98 / 96. Default export_subdivision='BEST_MATCH' writes the 8-vert cage plus subdivisionScheme = catmullClark, so evaluation_mode is silent — both files are the cage. TESSELLATE is what makes the mode observable.

+

The still is numeric-adjacent: left is viewport tessellation (flat-shaded L1), right is render tessellation (smoothed L2). The USDA point counts are the evidence; the two balls depict the two qualities the exporter chooses between.

+

What failure each check would catch:

+
  • exit 3 — VIEWPORT TESSELLATE did not write the L1 closed form
  • exit 4 — RENDER TESSELLATE wrote viewport quality or the BEST_MATCH cage (--evaluation-mode VIEWPORT measured 26/24; --subdivision BEST_MATCH measured 8/6 catmullClark)
  • exit 5 — BEST_MATCH stopped writing the cage
  • exit 6 — RENDER and VIEWPORT files are identical
+

The still depicts viewport vs render tessellation of the same SUBSURF cube (flat-shaded L1 vs smoothed L2). The USDA point counts are the evidence.

+

Probed on the CI Linux portables Blender 5.2.1 LTS (9e2066aef7ef) and Blender 4.5.13 LTS (daeeeca98fb0): wm.usd_export exists, poll() is true in --background, evaluation_mode is {RENDER, VIEWPORT}. The --output render path measures framing via examples/gallery_framing.py (exit 10 on violation).

+

Run

+
blender --background --python usd_export_evaluation_mode.py --
+blender --background --python usd_export_evaluation_mode.py -- --output u.png
+
+
+

Source

+
+ examples/usd-export-evaluation-mode/usd_export_evaluation_mode.py + View on GitHub → +
+
"""USD evaluation_mode — a runnable example.
+
+Witnesses ``bpy.ops.wm.usd_export`` ``evaluation_mode='RENDER'`` against
+``VIEWPORT``, which the snippet names but does not prove. A SUBSURF cube
+with ``levels=1`` / ``render_levels=2`` is tessellated into USDA:
+
+* Catmull-Clark on a cube is closed form: verts = 2 + 6 × 4^n
+  (n=1 → 26, n=2 → 98). TESSELLATE + VIEWPORT must write 26 points;
+  TESSELLATE + RENDER must write 98.
+* Default ``export_subdivision='BEST_MATCH'`` writes the 8-vert cage plus
+  ``subdivisionScheme = catmullClark``. evaluation_mode is then silent —
+  both files are the cage. TESSELLATE is what makes the mode observable.
+
+By default it runs only the correctness check (no render) — the CI smoke
+check. Pass --output to also render a still:
+
+    blender --background --python usd_export_evaluation_mode.py --
+    blender --background --python usd_export_evaluation_mode.py -- --output u.png
+"""
+import bpy, bmesh, sys, os, math, argparse, tempfile
+
+sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir))
+sys.dont_write_bytecode = True
+import gallery_framing
+
+LEVEL_VP = 1
+LEVEL_RD = 2
+
+
+def cube_cc_verts(level):
+    """Catmull-Clark vertex count for a cube after `level` subdivisions."""
+    return 2 + 6 * (4 ** level)
+
+
+def cube_cc_faces(level):
+    return 6 * (4 ** level)
+
+
+def usda_array_body(text, needle):
+    """Return the contents of `needle = [ ... ]`, skipping the type's `[]`."""
+    key = needle + " = ["
+    i = text.find(key)
+    if i < 0:
+        return None
+    i += len(key)
+    depth = 1
+    j = i
+    while j < len(text) and depth:
+        if text[j] == "[":
+            depth += 1
+        elif text[j] == "]":
+            depth -= 1
+        j += 1
+    return text[i:j - 1]
+
+
+def usda_point_count(text):
+    body = usda_array_body(text, "point3f[] points")
+    if body is None:
+        return 0
+    return body.count("(")
+
+
+def usda_face_count(text):
+    body = usda_array_body(text, "int[] faceVertexCounts")
+    if body is None:
+        return 0
+    return body.count(",") + (1 if body.strip() else 0)
+
+
+def usda_scheme(text):
+    key = 'uniform token subdivisionScheme = "'
+    i = text.find(key)
+    if i < 0:
+        return None
+    i += len(key)
+    return text[i:text.find('"', i)]
+
+
+def build():
+    bpy.ops.wm.read_factory_settings(use_empty=True)
+    me = bpy.data.meshes.new("Ingot")
+    bm = bmesh.new()
+    try:
+        bmesh.ops.create_cube(bm, size=2.0)
+        bm.to_mesh(me)
+    finally:
+        bm.free()
+    obj = bpy.data.objects.new("Ingot", me)
+    bpy.context.collection.objects.link(obj)
+    mod = obj.modifiers.new("Subsurf", "SUBSURF")
+    mod.levels = LEVEL_VP
+    mod.render_levels = LEVEL_RD
+    return obj, mod
+
+
+def export_usda(path, evaluation_mode, export_subdivision):
+    if os.path.exists(path):
+        os.remove(path)
+    rna = bpy.ops.wm.usd_export.get_rna_type()
+    have = {p.identifier for p in rna.properties}
+    for key in ("filepath", "evaluation_mode", "export_subdivision"):
+        if key not in have:
+            raise RuntimeError(f"wm.usd_export missing RNA property {key}")
+    result = bpy.ops.wm.usd_export(
+        filepath=path,
+        evaluation_mode=evaluation_mode,
+        export_subdivision=export_subdivision,
+        selected_objects_only=False,
+        export_animation=False,
+        export_hair=False,
+        export_materials=False,
+    )
+    if result != {"FINISHED"}:
+        raise RuntimeError(f"usd_export {result} for {path}")
+    if not (os.path.exists(path) and os.path.getsize(path) > 0):
+        raise RuntimeError(f"no USDA written to {path}")
+    return open(path, encoding="utf-8").read()
+
+
+def check(obj, mod, out_dir, force_mode=None, force_subdiv=None):
+    expect_vp = cube_cc_verts(LEVEL_VP)
+    expect_rd = cube_cc_verts(LEVEL_RD)
+    expect_f_vp = cube_cc_faces(LEVEL_VP)
+    expect_f_rd = cube_cc_faces(LEVEL_RD)
+    base = len(obj.data.vertices)
+    if base != 8:
+        print(f"ERROR: base cube verts {base} != 8", file=sys.stderr)
+        return 2
+
+    mode = force_mode or "RENDER"
+    subdiv = force_subdiv or "TESSELLATE"
+    path_rd = os.path.join(out_dir, "render.usda")
+    path_vp = os.path.join(out_dir, "viewport.usda")
+    path_cage = os.path.join(out_dir, "cage.usda")
+
+    text_rd = export_usda(path_rd, mode, subdiv)
+    text_vp = export_usda(path_vp, "VIEWPORT", "TESSELLATE")
+    text_cage = export_usda(path_cage, "RENDER", "BEST_MATCH")
+
+    pts_rd = usda_point_count(text_rd)
+    pts_vp = usda_point_count(text_vp)
+    pts_cage = usda_point_count(text_cage)
+    faces_rd = usda_face_count(text_rd)
+    faces_vp = usda_face_count(text_vp)
+    scheme_rd = usda_scheme(text_rd)
+    scheme_cage = usda_scheme(text_cage)
+
+    print(
+        f"base={base} usda_vp={pts_vp}/{faces_vp} usda_rd={pts_rd}/{faces_rd} "
+        f"usda_cage={pts_cage} scheme_rd={scheme_rd} scheme_cage={scheme_cage} "
+        f"mode={mode} subdiv={subdiv}"
+    )
+    print(
+        f"closed_form vp_verts={expect_vp} rd_verts={expect_rd} "
+        f"vp_faces={expect_f_vp} rd_faces={expect_f_rd}"
+    )
+
+    if pts_vp != expect_vp or faces_vp != expect_f_vp:
+        print(
+            f"ERROR: VIEWPORT TESSELLATE wrote {pts_vp} points / {faces_vp} faces, "
+            f"expected {expect_vp}/{expect_f_vp}",
+            file=sys.stderr,
+        )
+        return 3
+    if pts_rd != expect_rd or faces_rd != expect_f_rd or scheme_rd != "none":
+        print(
+            f"ERROR: RENDER TESSELLATE wrote {pts_rd} points / {faces_rd} faces "
+            f"scheme={scheme_rd}, expected {expect_rd}/{expect_f_rd} scheme=none "
+            "(VIEWPORT quality or BEST_MATCH cage would not match)",
+            file=sys.stderr,
+        )
+        return 4
+    if pts_cage != base or scheme_cage != "catmullClark":
+        print(
+            f"ERROR: BEST_MATCH should write the cage ({base} points, catmullClark), "
+            f"got {pts_cage} scheme={scheme_cage}",
+            file=sys.stderr,
+        )
+        return 5
+    if pts_rd == pts_vp:
+        print("ERROR: RENDER and VIEWPORT USDA point counts are identical", file=sys.stderr)
+        return 6
+    return 0
+
+
+def eevee_engine_id():
+    return "BLENDER_EEVEE" if bpy.app.version >= (5, 0, 0) else "BLENDER_EEVEE_NEXT"
+
+
+def principled(name, color, metallic, roughness):
+    mat = bpy.data.materials.new(name)
+    mat.use_nodes = True
+    bsdf = mat.node_tree.nodes["Principled BSDF"]
+    bsdf.inputs["Base Color"].default_value = color
+    bsdf.inputs["Metallic"].default_value = metallic
+    bsdf.inputs["Roughness"].default_value = roughness
+    return mat
+
+
+def render_still(obj, path, engine):
+    """Left: viewport tessellation (levels=1). Right: render tessellation (levels=2)."""
+    scene = bpy.context.scene
+    steel = principled("Steel", (0.55, 0.57, 0.60, 1.0), 1.0, 0.58)
+
+    left = obj
+    left.location = (-1.55, 0.0, 1.0)
+    left.rotation_euler = (0.0, 0.0, math.radians(28))
+    left.data.materials.append(steel)
+    left.modifiers["Subsurf"].levels = LEVEL_VP
+    for poly in left.data.polygons:
+        poly.use_smooth = False
+
+    right_me = left.data.copy()
+    right = bpy.data.objects.new("IngotRender", right_me)
+    right.location = (1.55, 0.0, 1.0)
+    right.rotation_euler = (0.0, 0.0, math.radians(28))
+    right.data.materials.append(steel)
+    bpy.context.collection.objects.link(right)
+    rm = right.modifiers.new("Subsurf", "SUBSURF")
+    rm.levels = LEVEL_RD
+    rm.render_levels = LEVEL_RD
+    for poly in right.data.polygons:
+        poly.use_smooth = True
+
+    floor_me = bpy.data.meshes.new("Floor")
+    bm = bmesh.new()
+    try:
+        bmesh.ops.create_grid(bm, x_segments=1, y_segments=1, size=30.0)
+        bm.to_mesh(floor_me)
+    finally:
+        bm.free()
+    floor_me.materials.append(principled("Studio", (0.03, 0.032, 0.037, 1.0), 0.0, 0.7))
+    floor = bpy.data.objects.new("Floor", floor_me)
+    scene.collection.objects.link(floor)
+    wall = bpy.data.objects.new("Wall", floor_me.copy())
+    wall.data.materials.clear()
+    wall.data.materials.append(principled("Wall", (0.03, 0.032, 0.037, 1.0), 0.0, 0.7))
+    wall.location = (0.0, 9.0, 0.0)
+    wall.rotation_euler = (math.pi / 2, 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.02, 0.021, 0.025, 1.0)
+    scene.world = world
+
+    def light(name, loc, energy, size, col, rot):
+        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)
+        scene.collection.objects.link(ob)
+
+    light("Key", (-4.0, -5.0, 6.0), 200.0, 7.0, (1.0, 0.96, 0.9), (46, 0, -35))
+    light("Fill", (5.0, -3.5, 3.0), 180.0, 9.0, (0.75, 0.85, 1.0), (62, 0, 50))
+    light("Wedge", (2.5, 5.5, 4.0), 360.0, 6.0, (1.0, 0.76, 0.5), (-68, 0, 190))
+
+    aim = bpy.data.objects.new("Aim", None)
+    aim.location = (0.0, 0.0, 1.0)
+    aim.hide_render = True
+    scene.collection.objects.link(aim)
+    cam_data = bpy.data.cameras.new("Cam")
+    cam_data.lens = 50.0
+    cam = bpy.data.objects.new("Cam", cam_data)
+    cam.location = (4.16, -5.85, 3.00)
+    scene.collection.objects.link(cam)
+    scene.camera = cam
+    track = cam.constraints.new("TRACK_TO")
+    track.target = aim
+    track.track_axis = "TRACK_NEGATIVE_Z"
+    track.up_axis = "UP_Y"
+
+    scene.render.engine = "CYCLES" if engine == "cycles" else eevee_engine_id()
+    if engine == "cycles":
+        scene.cycles.samples = 32
+    else:
+        try:
+            scene.eevee.taa_render_samples = 64
+        except AttributeError:
+            pass
+    scene.render.resolution_x = 1280
+    scene.render.resolution_y = 720
+    scene.render.image_settings.file_format = "PNG"
+    scene.render.filepath = path
+    scene.view_settings.view_transform = "Standard"
+
+    fcode = gallery_framing.check_framing(
+        scene, cam, hero=[left, right], elements=[left, right], stage=[floor, wall],
+    )
+    if fcode:
+        return fcode
+    bpy.ops.render.render(write_still=True)
+    if not (os.path.exists(path) and os.path.getsize(path) > 0):
+        print("ERROR: render produced no file", file=sys.stderr)
+        return 12
+    return 0
+
+
+def main():
+    argv = sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else []
+    p = argparse.ArgumentParser()
+    p.add_argument("--output", default=None)
+    p.add_argument("--engine", default="eevee", choices=("eevee", "cycles"))
+    p.add_argument(
+        "--evaluation-mode", default="RENDER", choices=("RENDER", "VIEWPORT"),
+        help="falsification: VIEWPORT fails the RENDER closed form",
+    )
+    p.add_argument(
+        "--subdivision", default="TESSELLATE",
+        choices=("TESSELLATE", "BEST_MATCH", "IGNORE"),
+        help="falsification: BEST_MATCH writes the cage",
+    )
+    args = p.parse_args(argv)
+
+    obj, mod = build()
+    out_dir = tempfile.mkdtemp(prefix="bdt_usd_")
+    code = check(
+        obj, mod, out_dir,
+        force_mode=args.evaluation_mode, force_subdiv=args.subdivision,
+    )
+    if code:
+        return code
+
+    if args.output:
+        rcode = render_still(obj, os.path.abspath(args.output), args.engine)
+        if rcode:
+            return rcode
+        print(f"rendered still {args.output}")
+
+    print("usd-export-evaluation-mode OK")
+    return 0
+
+
+if __name__ == "__main__":
+    try:
+        sys.exit(main())
+    except Exception as e:
+        import traceback
+        traceback.print_exc()
+        print(f"FATAL: {e}", file=sys.stderr)
+        sys.exit(1)
+
+
+
+ +
+
+ generated from examples/gallery.json + CC-BY-NC-ND-4.0 + exit 0 +
+
+ + + diff --git a/examples/cross-version-property-delete/README.md b/examples/cross-version-property-delete/README.md new file mode 100644 index 0000000..93d0ac4 --- /dev/null +++ b/examples/cross-version-property-delete/README.md @@ -0,0 +1,38 @@ +# Cross-version property delete + +A pair of machined specimen tags that witnesses the custom **ID-property** +delete contract from +[`cross-version-property-delete.py`](../../snippets/cross-version-property-delete.py) +and [`custom-properties`](../../skills/custom-properties/SKILL.md) — not the +snippet's `__main__`, which keys off `context.active_object` and prints +nothing in `--background`. + +The IDs are built with `bpy.data.objects.new`. The Keep tag still carries +`["accession"] = 42` (emissive enamel). The Clear tag had `del obj["accession"]` +(empty pocket). Same `del` on 4.5 LTS and 5.x; there is no version branch. + +**What it witnesses:** `property_unset` is a TypeError on a custom ID key and +does **not** remove it. `del id_block[key]` does. After factory-empty, there is +no `active_object`. + +**What failure each check would catch:** + +- exit 2 — someone set an active object; the snippet `__main__` would have + been the only path +- exit 3 — the ID property never landed +- exit 4 — `property_unset` removed the key or failed to raise +- exit 7 — `del` did not run (`--skip-delete` / `--unset-instead` falsify + this: measured `clear_has=True`) + +## Run + +```bash +blender --background --python cross_version_property_delete.py -- +blender --background --python cross_version_property_delete.py -- --output tags.png +``` + +`--skip-delete` and `--unset-instead` are falsification switches: both leave +the Clear plate tagged and exit 7. + +The `--output` render path measures framing against the Layer 1 band via +`examples/gallery_framing.py` (exit 10 on violation) before writing the still. diff --git a/examples/cross-version-property-delete/cross_version_property_delete.py b/examples/cross-version-property-delete/cross_version_property_delete.py new file mode 100644 index 0000000..9e862a3 --- /dev/null +++ b/examples/cross-version-property-delete/cross_version_property_delete.py @@ -0,0 +1,342 @@ +"""Custom ID-property delete — a runnable example. + +Witnesses the contract the snippet ``cross-version-property-delete`` teaches, +not the snippet's ``__main__`` (which keys off ``context.active_object`` and +is dark headless). Builds the ID through ``bpy.data.objects.new`` and asserts: + +1. ``obj["accession"] = 42`` lands in ``obj.keys()``. +2. ``property_unset("accession")`` is a TypeError and does **not** remove + the ID property — that RNA call resets a registered property to default. +3. ``del obj["accession"]`` removes it. Same on 4.5 LTS and 5.x; no version + branch. + +By default it runs only the correctness check (no render) — the CI smoke +check. Pass --output to also render a still: + + blender --background --python cross_version_property_delete.py -- + blender --background --python cross_version_property_delete.py -- --output t.png +""" +import bpy, bmesh, sys, os, math, argparse + +sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir)) +sys.dont_write_bytecode = True +import gallery_framing + +KEY = "accession" +VALUE = 42 + + +def beveled_box(name, size, bevel, segments=2): + me = bpy.data.meshes.new(name) + bm = bmesh.new() + try: + bmesh.ops.create_cube(bm, size=1.0) + for v in bm.verts: + v.co.x *= size[0] + v.co.y *= size[1] + v.co.z *= size[2] + bm.normal_update() + bmesh.ops.bevel( + bm, geom=list(bm.edges), offset=bevel, segments=segments, + profile=0.5, affect="EDGES", clamp_overlap=True, + ) + bm.to_mesh(me) + finally: + bm.free() + ob = bpy.data.objects.new(name, me) + bpy.context.collection.objects.link(ob) + return ob + + +def cylinder(name, radius, depth, loc, segs=24): + me = bpy.data.meshes.new(name) + bm = bmesh.new() + try: + bmesh.ops.create_cone( + bm, cap_ends=True, cap_tris=False, segments=segs, + radius1=radius, radius2=radius, depth=depth, + ) + bm.to_mesh(me) + finally: + bm.free() + ob = bpy.data.objects.new(name, me) + ob.location = loc + bpy.context.collection.objects.link(ob) + return ob + + +def build_tag(name, x, yaw): + """Machined specimen tag: plate, pocket, hanging ring. No ID property yet.""" + plate = beveled_box(f"{name}Plate", (1.70, 0.10, 1.05), 0.035) + plate.location = (x, 0.0, 1.15) + plate.rotation_euler = (0.0, 0.0, yaw) + pocket = beveled_box(f"{name}Pocket", (0.92, 0.04, 0.48), 0.02) + pocket.parent = plate + pocket.location = (0.18, -0.05, -0.03) + ring = cylinder(f"{name}Ring", 0.11, 0.05, (0.0, 0.0, 0.0), segs=20) + ring.parent = plate + ring.location = (-0.68, 0.0, 0.33) + ring.rotation_euler = (math.pi / 2, 0.0, 0.0) + return plate, pocket, ring + + +def add_inlay(name, plate): + """Emissive enamel only when the ID property is still on the plate.""" + inlay = beveled_box(f"{name}Inlay", (0.82, 0.03, 0.40), 0.015) + inlay.parent = plate + inlay.location = (0.18, -0.07, -0.03) + return inlay + + +def build(): + bpy.ops.wm.read_factory_settings(use_empty=True) + keep_parts = build_tag("Keep", -1.15, 0.0) + clear_parts = build_tag("Clear", 1.15, 0.0) + post = cylinder("StandPost", 0.07, 1.55, (0.0, 0.22, 0.78)) + base = beveled_box("StandBase", (3.4, 0.9, 0.12), 0.04) + base.location = (0.0, 0.15, 0.06) + bar = beveled_box("StandBar", (2.6, 0.08, 0.08), 0.02) + bar.location = (0.0, 0.22, 1.52) + return keep_parts, clear_parts, [post, base, bar] + + +def remove_custom_property(id_block, key): + if key not in id_block.keys(): + return False + del id_block[key] + return True + + +def check(keep_plate, clear_plate, skip_delete=False, unset_instead=False): + if bpy.context.active_object is not None: + print( + "ERROR: expected no active_object after factory empty + data-API build; " + "the snippet __main__ would have been dark for the same reason", + file=sys.stderr, + ) + return 2 + + keep_plate[KEY] = VALUE + clear_plate[KEY] = VALUE + if KEY not in keep_plate.keys() or keep_plate[KEY] != VALUE: + print(f"ERROR: ID property {KEY} did not land on Keep plate", file=sys.stderr) + return 3 + if KEY not in clear_plate.keys(): + print(f"ERROR: ID property {KEY} did not land on Clear plate", file=sys.stderr) + return 3 + + try: + keep_plate.property_unset(KEY) + print("ERROR: property_unset on a custom ID key returned instead of TypeError", + file=sys.stderr) + return 4 + except TypeError as exc: + print(f"property_unset TypeError={exc}") + if KEY not in keep_plate.keys(): + print("ERROR: property_unset removed the ID property — it must not", file=sys.stderr) + return 4 + + if unset_instead: + try: + clear_plate.property_unset(KEY) + except TypeError: + pass + elif not skip_delete: + if not remove_custom_property(clear_plate, KEY): + print("ERROR: del did not report removal", file=sys.stderr) + return 5 + + keep_has = KEY in keep_plate.keys() + clear_has = KEY in clear_plate.keys() + print( + f"active_object=None keep_has={keep_has} clear_has={clear_has} " + f"skip_delete={skip_delete} unset_instead={unset_instead}" + ) + if not keep_has: + print("ERROR: Keep plate lost the ID property", file=sys.stderr) + return 6 + if clear_has: + print( + "ERROR: Clear plate still has the ID property — del did not run " + "(property_unset is not a delete)", + file=sys.stderr, + ) + return 7 + return 0 + + +def eevee_engine_id(): + return "BLENDER_EEVEE" if bpy.app.version >= (5, 0, 0) else "BLENDER_EEVEE_NEXT" + + +def principled(name, color, metallic, roughness, emission=None): + mat = bpy.data.materials.new(name) + mat.use_nodes = True + bsdf = mat.node_tree.nodes["Principled BSDF"] + bsdf.inputs["Base Color"].default_value = color + bsdf.inputs["Metallic"].default_value = metallic + bsdf.inputs["Roughness"].default_value = roughness + if emission is not None: + sock = bsdf.inputs.get("Emission Color") or bsdf.inputs["Emission"] + sock.default_value = emission + bsdf.inputs["Emission Strength"].default_value = 4.5 + return mat + + +def assign(ob, mat): + ob.data.materials.clear() + ob.data.materials.append(mat) + + +def render_still(keep_parts, clear_parts, stand, path, engine): + scene = bpy.context.scene + brass = principled("Brass", (0.78, 0.50, 0.18, 1.0), 1.0, 0.22) + pocket = principled("Pocket", (0.04, 0.042, 0.05, 1.0), 0.2, 0.55) + enamel = principled( + "Enamel", (0.02, 0.35, 0.55, 1.0), 0.0, 0.35, + emission=(0.05, 0.55, 0.85, 1.0), + ) + steel = principled("Steel", (0.18, 0.19, 0.21, 1.0), 1.0, 0.38) + + keep_plate, keep_pocket, keep_ring = keep_parts + clear_plate, clear_pocket, clear_ring = clear_parts + for ob in (keep_plate, keep_ring, clear_plate, clear_ring): + assign(ob, brass) + assign(keep_pocket, pocket) + assign(clear_pocket, pocket) + for ob in stand: + assign(ob, steel) + + inlay = None + if KEY in keep_plate.keys(): + inlay = add_inlay("Keep", keep_plate) + assign(inlay, enamel) + if KEY in clear_plate.keys(): + ghost = add_inlay("Clear", clear_plate) + assign(ghost, enamel) + + floor_me = bpy.data.meshes.new("Floor") + bm = bmesh.new() + try: + bmesh.ops.create_grid(bm, x_segments=1, y_segments=1, size=30.0) + bm.to_mesh(floor_me) + finally: + bm.free() + floor_me.materials.append(principled("Studio", (0.03, 0.032, 0.037, 1.0), 0.0, 0.7)) + floor = bpy.data.objects.new("Floor", floor_me) + scene.collection.objects.link(floor) + wall = bpy.data.objects.new("Wall", floor_me.copy()) + wall.data.materials.clear() + wall.data.materials.append(principled("Wall", (0.03, 0.032, 0.037, 1.0), 0.0, 0.7)) + wall.location = (0.0, 9.0, 0.0) + wall.rotation_euler = (math.pi / 2, 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.02, 0.021, 0.025, 1.0) + scene.world = world + + def light(name, loc, energy, size, col, rot): + 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) + scene.collection.objects.link(ob) + + light("Key", (-4.0, -5.0, 6.0), 520.0, 5.0, (1.0, 0.96, 0.9), (46, 0, -35)) + light("Fill", (5.0, -3.5, 3.0), 110.0, 9.0, (0.75, 0.85, 1.0), (62, 0, 50)) + light("Wedge", (2.5, 5.5, 4.0), 380.0, 6.0, (1.0, 0.76, 0.5), (-68, 0, 190)) + light("Glint", (1.6, -5.0, 6.0), 850.0, 0.9, (1.0, 0.9, 0.7), (40, 0, 18)) + + aim = bpy.data.objects.new("Aim", None) + aim.location = (0.0, 0.0, 1.15) + aim.hide_render = True + scene.collection.objects.link(aim) + cam_data = bpy.data.cameras.new("Cam") + cam_data.lens = 50.0 + cam = bpy.data.objects.new("Cam", cam_data) + cam.location = (3.55, -6.59, 3.30) + scene.collection.objects.link(cam) + scene.camera = cam + track = cam.constraints.new("TRACK_TO") + track.target = aim + track.track_axis = "TRACK_NEGATIVE_Z" + track.up_axis = "UP_Y" + + scene.render.engine = "CYCLES" if engine == "cycles" else eevee_engine_id() + if engine == "cycles": + scene.cycles.samples = 32 + else: + try: + scene.eevee.taa_render_samples = 64 + except AttributeError: + pass + scene.render.resolution_x = 1280 + scene.render.resolution_y = 720 + scene.render.image_settings.file_format = "PNG" + scene.render.filepath = path + scene.view_settings.view_transform = "Standard" + + hero = [keep_plate, clear_plate, keep_ring, clear_ring] + list(stand) + if inlay is not None: + hero.append(inlay) + fcode = gallery_framing.check_framing( + scene, cam, hero=hero, elements=hero, stage=[floor, wall], + ) + if fcode: + return fcode + bpy.ops.render.render(write_still=True) + if not (os.path.exists(path) and os.path.getsize(path) > 0): + print("ERROR: render produced no file", file=sys.stderr) + return 12 + return 0 + + +def main(): + argv = sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else [] + p = argparse.ArgumentParser() + p.add_argument("--output", default=None) + p.add_argument("--engine", default="eevee", choices=("eevee", "cycles")) + p.add_argument( + "--skip-delete", action="store_true", + help="falsification: leave the Clear plate tagged", + ) + p.add_argument( + "--unset-instead", action="store_true", + help="falsification: call property_unset instead of del", + ) + args = p.parse_args(argv) + + keep_parts, clear_parts, stand = build() + code = check( + keep_parts[0], clear_parts[0], + skip_delete=args.skip_delete, unset_instead=args.unset_instead, + ) + if code: + return code + + if args.output: + rcode = render_still( + keep_parts, clear_parts, stand, + os.path.abspath(args.output), args.engine, + ) + if rcode: + return rcode + print(f"rendered still {args.output}") + + print("cross-version-property-delete OK") + return 0 + + +if __name__ == "__main__": + try: + sys.exit(main()) + except Exception as e: + import traceback + traceback.print_exc() + print(f"FATAL: {e}", file=sys.stderr) + sys.exit(1) diff --git a/examples/cross-version-property-delete/preview.webp b/examples/cross-version-property-delete/preview.webp new file mode 100644 index 0000000000000000000000000000000000000000..91899af14620c9959b897c97ec6cabeeefa6ac20 GIT binary patch literal 13004 zcmV;-GBeFmNk&G*G5`QqMM6+kP&gpCG5`S3+yR{dDzF5j0zOeFkw&AUrX-?sSXjUc z32AQexiSBQ1L;A3USGe#UqoZ3y{3Qk*SRi=d4XLmyrB<8YEv;o?TJ^lYC|F`O6_}}?o*)M#5N5A>^>VKK~j``OA$Nj?ipZ_WU zKlKAMjjeyd{_Fjtz`xi3y7lqFU&weL{AcxNxPScd=kiBTzr{b4|F-^*>9yNW>b^Qz zPwjW8cdx%?{gU=-pJ)5pfq(Aw@3^O;C;SfqzxRHmAL9bE?xgFmBMeu}o%1Jr$=@^y z0rZ}^15Y}9P;+4VPh5eMzGU!F(x7Y~N$Zd@cg&#rg+ww6rGiw25S>uev~8-NR6abV zAacYG`hkGTo`{2bU(n+iER%p!nSKYdQV7pm1L$bi#v@{*GjqCbgKAhOq89r5^nKtx*!L^&jPYG zaie14ADiDj_9~mo5^kXm)9ls2Op>+L84HR2S5C4oEnm3QE$v zSZ}CnVwqwL>1t~<=k;k_o4Uva!B)Dwt6?-m_OB~n_cW#9pYj4aL&MSg%gFl>+SU=1 zBkzP_8}DVtC0+_SjP&g`F)&dGe2T*oHsz(UD@tXt zqlEBKl5tToQ#B?=$5)a@a;$G;B7j}mA{EE@>2uId)e;Ho(UZMbM$Z1sMcS;sNB<8_ zn=-rya~q3UczC8>C$qd=(t3hT*D7!<7)=l}KIAZt-WqE~9zt}RS_WcvAk|vJ$vzt< z_pF7tR}*Us?}~jtIz052rkYzTvjI-$RwBG|;{L+#Vy`D4rJGKTsQyztNp1ZfK@^Xu`dT&(uSi;tfD?32V(CUm~#h)8k=yL2tnEDOz4% zhKOf1p};{zt#B5W_!(N%Z{&3sE|`1X(?e>PEHS=ontl_ zAw!dE!Y~)o1tcx-&rCb8hDgrwx0>XQZm_vqHP3x}Wcb0`ZwCVF+1*@FUy;g1I5ADI zj5CXIzIZwO>Ds}I=#|UIqed$^3DQ2nqoWp#B(1X2_(5EcL$UG(|Dtyav)MWc3-{%R zZAo-4NvEgPRedEoVU3QcdUA#nLW!L1CcSoUX13Z;b~HytS%PpJ3uVq~ab=jj$pcQl zbdfxvT8RW@tCqGFvX#1~%cS1%=ZBwo-7C&P3`P!akQu6*7V5XXIKlfbq>^o)kB0?s zzK4YW!yDY>CpU+eSR2vc1}lgP8QT+HS4%SUsOeF|eDZT8de9qrkbS5jf|-%+!F=L^ zNuQ>iVl_%*I=0!8PVe=0gBOE1L@zGo{svD4TZym>olc6`XuLhC{IQ7nl7~2+oyMbq1I>bEQ!udl zvipwwZPk7ezXF*xkFXBVO=u~Kx9HZ)>q6>RW^ieVfS0lX;y^>cuk``+yMg=XS+zxk z;O-<9M+i8rwrRBUT9Q3e6MqS!_5_xY(M~(+B%?XAEI$z?R9ey|`2$VPS1j@h-M>kv2u_>PP*ozN(Iu zg7HfIy9B^(X1Mc{c>nz2s0{seR4ILK+`U+*ntD1nH~@m;G(m;B`vBjtM?t>wDq=be zb$#d5WVzLsH)ohy1h_=g)!IUGRNr(VP~+`LNL#`NN(jQlu+Y zVhsoaW+`m;8&^cMp$g(F`BPO`oxL4=$ygQNmxZ+f0=uDQ3xh?2vNv4 z(X;50VE&{M&!PF7UEbL=UKYm(Ov$}x>$wa()KGT_9613j9)>)n6fJ`HPg$3xgs9C= z4`-bbIr?nT^#@7Ru9LzCq~7(o_YlypD6kS#l!9<$i)venMHiw?x*KkLX_uIg|(%WdaGkI?Z$t^r)ae!pQ$6(KMKoM02ErnG-~SCl6C!Lv0Vmj($>| z4X%-~IkhS)6#Kt0X%gH+Pft?CQ*%WR!yUNXmN>m}!JW-JKBSL*!yKQJNTwLydm%AO z2GY%dx@})!kkS6Ckm>ee%S(+~r4J!P5N=!5GRJs8x?gC2gC)TF4V7lqivt0?nCgP2 z($zc6m18p3aU8HK8#7uA3;+O8R>%l7GmRn|l6V7CR290_;M**YsQc^KUtzIewo0eu;1;Y_)ZRRmjDJK~ zYN97sjgkB7X{r~06nPqF#|P%qCgTXTcZvCJ2EF0y4|sape-_6OwgW*`7n`hCMvnW8 z2H5#5C5@{LoL2g9TUTDq$~K>q5X^yq1EvKWeA4DGRC!K0j$$!DG-*sTAkMd(pL^la zYdCe`h#7t8e_RCH&3>V$yKEESVo5$zvyvZ6DEvO$MNUlA&A4tn(9tL~$j0YyyP{nV zI#c|kZ9N&!z5{d-xZ7K~OAAZ=x^URg^H=_IwyIu1dBhsMLyQr8>d-Jr*ChoXsmZ+^ zltU18rzQ6*a4u}6=SHI{VfG3a?d)xR8?ebIe^)L*dVJd@JHyAZHGg%L=R3SHArsK= z#C6@ZL%~y#yW+zkJ|2)1sg$U!N{f|3`Wp$iW@Y1>51p-hK|b_p_$&JmSvu*Y;r?3H zGP}Ow8By6vIqn6jOn$w64k1)o{!(N|?C8@M{wAAAub_W90srLBV}sOP&ds%;FA}g7 zP2e{H)E|O0G%4Ar9{`%db91&V^o{n{vvG*cq`k<&sJ!gMS%& z4~d+mllW<`p{^wt?c z9D#A#ac{7Y)(r&4tD6k!R;2;@V82Z4DM-&C9QgX_lNgA(-OAJj1HcvxSL?Yve4g@~ z!_k@-_87e1aFtCP`-DqQ1NWbcD0HD`q^~W8O6(vhQ{~{jYC}g^N&e#RX{-d4=4~K% zB=ckwxb%BhI_{81V#>hn;DTFW)bf{rW^$;|hapusZbM-^b3o0}B+@zR?_slwrw&>3eI< z?KHj{W=!>+o^sFy^llujJP1)W&Z-1?{8B1EfTzm5X_OEx{iE#&3Q(2``2$n)d3@m# zBbp+qRLFr{3&m1YdxRS|vFA*K{yLN)y5wKlYZ+?8>s9xi>rx&t+!fvT)s%R?NgCK3 z_^J3Q42hTU*psn5yxpz^O(@Pqavp7p?7Uixs*c2}JidfV45mdHGVM0L&UOWZXUq&C z$L&fHUov;hL63v9U(?wFN@?0-90FpsM~WhHCE$x1Hi$-(y_9 z8kY?m@0u;B8%8LDqDrTUuWlr#m)*xP36Mn(Q&E&sgBcet%|DM1C`qt@_@yBx#4w;= z01zSPkS0rbcIRMg=E0oCMylXRHQ#l~tl?J7SrgB)Y0zfKow?NYlkXms9!sQlp4YZ8>obYbt~c~`oj0}X_8Bwj)1)Mkg!wiKhsYrtI1^dKrv zS5m}o`-htg9{h<7kPr7Z$p^TMXXe2IGWtZ?JC_@#@WGqe(WTqhoV_CN+?Z--cn+5= z;!FFfu79oY;IGWgR0cp_=1P}>1$^ttG%z*bx?xe9(Ggz;xXLhHH%^omtDUFuNTchG#nHSr0h@WIGFra%xSA%%BYrV1m%!r+qy zZAL{7yo+D}4>O|WRT?i2fCmb`T=#AW#PtXG=rRWaOrZJI`~|E40^zPvpg<$a5f7-6 zsNd*&cXf)S{E%VUK)^XA1QN&{>?$xX$&-k6Y@fY;kHnlSKs$Z;Sj~_s1W<9AsnF&D zJ*9my@Mh17$Bc^a+k8a#g4uPZR=W3bnV;u6g_QjRSh7#o(Fd`rL)a(+FiZg%_ATez zu|YiP@xEx;+}b1sAYVm46mmMByvRo7YpNlee?xDNuEEXln+}yX%!*EUm9u5d=XkeJ z?{j`DEx7&~wVaU;4G1xVA-5EBKUn2zJMz36woLWE2}}A!uYqP$^#4GtuHVhwN_?QafQ^Mfc*ba$drl%8w)$~2+S|pq! z;Npac@em`NrTq4IlFMAiDPC?P-g$5~;5xPXyI$7KiJ>rm|C9nJx$OP0W?>i{NjC(7 zOJsikEVlRO;IJmOh*(O-ofIdjn>!!%QDH1>e8J z{xQ0U2P>4}?C9%6-DX%5d23(4Cx-(49!8)&Ot!&SfX2`kgBVeusGK>F03d$=?d3h| zLV$1@|3g@v9ipV{?vysH)Qcj7e9}ct{H9VNhoa{_mQt zIA~|XeS&)NZ9YdqKnvYw9?5UVk0Id=(CauCE!M+e_91Hu@Bu({e8RYoCs$5;R|vXP4CW{Xp|1p@x-Z+xnhMe=V%dI~U|&ota}Ci9s85&}#Wo zfq_629I980UYsc3pgG3Khy4Fc$;4Z2l|M^CGv70+{h(8a+gQT!q!boR*3q@82Iu95 zHZAouTQ+Y$(As>e2{&@aDnp%}F#C;uoTR-vDxZ!lxB{guL@|Ic2pymO#l)vx@}p2DZZ| zeiJFo;`x96^I>at!%t`;7)S*%lT#4l)I8+c;sDRYCNgF>DqehfH#SwHLAV}0Acl^( z5(W7+tCdyu2}q#>`Aob1K$r=bjDhvtEc)W(Wm0ePQFKL=0?*)UFcohVp^yqAG5ob1 z`D0(S`i~by1#PWe0pZs3?m9MM{Fm~Qe8l{zcmMUaE*>2$oQ2mjJA-x7{`&Nfb87$b zwDUarNYli#Azr%lkq2IzLx88osk==^IzfQ1;O;!2Z7QfL=v`&#>R081*(DllHCnQD z<*k%nLo7eeZ42vEay9u4n2oz9tkgNBV_c14{f#6&$GpR=-U{}DERqkW zZt7KGO_kG>Lm^dU##p z3rl$-Kk*odp*@WiXS^Q6K@N@JWlGdqx@`Lo!XNWisYaooEbjeUgocn z3|-!7_ii%~%U5O-5wBLeA9q)zn*_N)M%JTqnjsUQ?n7kOO z8Bx5EV{)_Pa<;CN!9YHFZxtIDo()}qI-&b?#(>u${0tIRqSzxy7{>JYj$m}F&MB@S zU}v7$y~8-lkA>alm&h~y6(K_Ec^~LcOLld=(i=!+g!c+Un*T|KMcKb@eQVB{A7wWH zceeLT$77U6lN`KtM@9&%+P!gaEwk2!OrW*g*Ce@Io?X)RZQZ zB&#f_%L(>RbsavZ6VlMGA$7Hloi)xZx0I;r_!!HDCrM~_5@_8DrpnN||0r?ED##!%D#F6yb zC1u4Vx@Dp*#)6bv4aI-(UPR`;YpN{mK2^b#?%}B_YDkt0&G0|~X;U9V7s?<0oo~N4 zJs`CBaE;WKj%~z;aYUjtUOPJasJeLior1=in=Cb~M$Es#dCb}LSl>@5AFZBFwg#$a z>zlVNXC*E};zm~H{E=x46r!6^@rMOQ2{}F5v0ZoVuJeSTTX5xk-4?21v;liV1lUOt zWFjf-JiaYw_zx9b$h%MxDd%nTMD7#F%r7ddzJ}pU9d%M2`a^YkR3aYT@mrPeF6d&% zQf9vdv8`uNobugtV5{ktOP_R}Tq=@MT6Njo~fX1%uNr2fJP z``Np6UdKBt^!j~d57dsI`Zh=`-842IL4zZ~7_EU@c-T!y0zG~d-#aJT0Ve@0^yBy$ zOF>s)Sm7fq8=}&Q4kMp#I`IKRI5ybpC6@5{W3-;^N)o>drfmbdktR4k7=vFr>U?)W zJ(E{KmHEmB{E^QC>So{w$1ohyH#|sXiB`69P|Mj&(ii*ryw*K~*({NE=3~r5_SyE4-{TbZk`aR5 zM%Df$GhnoZ82K@s4Ug?_JxB<<(XfpUN^Vcp4_2f)+c`tG`PhUAXv&<9Ntp4#Mv|6n zwT?#D;5o}(LUB(uq9Iu0(7{!|6>thVqzgTh#E}j#!#a_GpJJIzmGw&7%rBUlXiEf7 z7>&B7v;Z2ZMp*HC5722%8b-IYEXY4|MG^It`?D~S*q`RdQ8kY#?E(LchtT&cKSv@C zQq{yeIUK+{^uMeB4fLvTtcQPmq#|H8>ZG#5GC5`kw^IPtL4|3c!^avah7V8CloPpoht6=7(=>2N8{@ki` zoOhHbrCAK2=jo<7dVEO$(t?Wtp`RFngjez|gbh5ZQBrlnOY&u58{|<{xe}rxPGJcu z=v;D>7eBV>(*YC6RP0W~^m{4aWWzs%)~6Q*{|UnH`Oups zly173I%R*g{`*I9ORo|Z`gi}~Ku0k*sO(Ut==|qlg$$;bQH(w?JQgJ}i#uOqrudtoC z{5pWn5&(_kx$~EvHCg1)3~uvlhP>-`E3T7@>L`&mdNI68N!*d!B)Pet4rsm zj*Dw6NUp_CF%^Far^kJdc^;acx5)TQX!}QXisWb5uxB!N`dMp5!9;v3EQxKHbQ;u}jK4kba0&#lH4`TFsGquWZ=1jCrIE_O1A4_tZN z_SX1EcA7yFkKoY+VOrTZLe7s0M6d4hen-6OU1fhmUT*8eCCHKuX|?+J-ER6p zet(`qpGK?6SZ<9*+1|uoWfi5P$h}^QVQ_%$Wh=B);kuKA|6Ov>=KT| zhV(~(9K9<>HbQeYnkU;c7%k+oeha*0tElg{fCa0`iMKAo#=%uM)ck2yK_FhAb3bPV zW@8CLA%wq6y6WNb1fDRuv!23C3GK&gj;h zhZ>dAOSK~XNx7?T|~i8Ib8{yphW~SI2>mxJKHr++AEX!vt~Z-GBq-iL`C})y0Re?%rtab;rPG z`8$&opanUaU&R`Xm7TQK90IPu)R+@t&*s!?jw|;!bAWWa;;|3X$#d(?FI7(Y1_O0w zKxilhi7F_&$4I}n7~viG*hsbQWI{C!XwB)jOs~-Lc{y?-s=u?nS5J>XW~d1Q_-d;n zi$s%*a1f}?ddg1>#;UWh1jy}!i5mO@Z^^IZ3gL!i%!-caLTm<ByT6zpJzs71f zD`7J86&V97D_K=jQ+7i5Q2nse$9g(9*95mG8gS?Aw)VZsLO&d&(e^t#&Dsg{p@+;n z9zFZ8Sdc93^E+W5LIFOEV%`8E3$9b>e+hRct`{|2t;DNOKz?!5T3uC~`zin%{^bp*^e9I@2cvyc}lmwY1SiZ!5_&*ijxpw+gaFVLEjq1V=jH*U>9Vf7~4@ znUo`ZR=MCZ_|OF!6yw8rR3Y$e@^KcrA^9xY=)%0+UK~)DbE|76sVGdXlLdQB1AN3!?#B=xsiU7>+1=aWG;UnB^M~Tu9ZdAWO-T%aJeREXP_((XZosWa zq)Z!X-lZl!y*>^>ui`7OW#T*I>lg7izpFwDR+86G7c7S2s3dJ53d6B{fH!P?uZ_$6 zZt`k_hlQcL0z7^VNSRy^86@8Hd*$QaM!jxZ0WiTyvxT=ectWOimpr(=5-J*uJ+L}M z_izp25RbEAS7uAP&Wo-HRhP_eqo!Cg=9bKb&}tmPRKM=aNJNfgE#wUg6m&ex)M*SE z`EywR1B?uWwI|+b5FYYbwhfCq{PJ;HiI1!Al01uDNc-GOBa)Suo_)asCTnOJVW2p} zFIlRK3wz%Vo6u}7`Hm~R*YRi|7d)3oHZBdyYz;VJ=C!Hzcvn_n##q5;Sm%}SCUm#Q zJd7zp3(b+7ovpn;T?YnRmC{hw+K&p!q21&eq4nciBlMV3;JL!Z5KX9SRA3r(G$1gS zdKCyyZ%+)QbKP~Bb6+UCkXnU|Z#0wUC<)j4M@J~_8Bwa5X^kD_d~GxG0hZO$j^rcl zMtVjI?N}{QthPmayD>XRZgqe+BT6&zKe)@%pK(|uhnlj22j>wra;S?)tLY-=VLwj) zjfzY}Brq(&*$FfwhaA>}UESO|EUmy$jk0#Ss#El8>Zge^AieIFhxu}qOSzm1XLa{{ zqspkA<@NFb$cb(a9bjICj=z+rJh+iUe&B)T z;-x9o7BRzaKCX&X#EP8mACm`C0-S9Y zGPN@1v=?*Bb*oVW&Xh@7H9acZxp(Y<03jvWOxfVRS7ZjE7k_xRRA_~rgKNNH!I(Be;=2O|aNtE}9VIAsH0W2O!$a1N~+L|Xjkfn&6bc9go!1R|L;d%5Al?FJo=%87Xh( zuib7IDz>mB-ppNRkV>>8kps=ZL+^Z)z62whv(+U!MAx4MF1PMLiE?TQ%nkv7mN7al zMHq=_P4$_uq7tPz8)2N6{pknft&+W)%%xw@ zgC~rhV-&|2Bmz$sracL8uwKklJs%4quOrEqy?CGj$!5y$vQxaa#UKD)mA@hlep5;O%fyaa+y5quMZR)BWYCQ z5-=>n9%=z2w7eKSTc1R$wJ*Ddkd=?@s}FgECi;wyGX=Fqmmfn3sLp!kU5mSq z0?y^7Yw-9WO#y)%kbL~D&0&Bf;Un!(70}ePXB9f>jI}BtonuwAg~A)dF$Sl3I*cYs z(lK7iy2R1%Az~C3uizF)_h;o3W3C2|3;A+d(@dKctvxlPI9#i_m}32{);_iW(sw|J z*e|o+B1Y&OWqR+Tzow%bMA8b#OHhPnr0T4WyvZ_E&(pK}_9*?lYmI)C#J_VnC;xX@ zjpU5*tu%|&KgRh`)2nk_sncO7%EZklm$ZDEWn%C=s^$$hZktv%(vnd}IDMtXpAK+& z$?k;C;9X=Zz85@;nyFqKZH@B+<&wEdMjcAd8E*2W8{zh0PqC~MD}Ix&iMO1@v8pv| z@j}sxj_4OqNkT0hg3@34i?Vmj^_N1or&1rVi#HW`JVam?2mX}D-}t4rIWKR>r<8}N zk$1?hb1fz4H}EBVoDPe!ccquV9ZvQDC%H@lk8|?j0p*H@tzh?7=zNTn64I>qGbZK~CLT#8Zdv-hdlm=~SB+}3~B5I?U)|?B$BTj^lA%TyX zm)E|9P2GCpfeO76C3|$NE<=GD`QRbo5y^BODj~t)*%w{)NEJ5Gt2>ESb$4`Q-kDH3 z5rI8&=Mg?sXp>`6?=$a=ziV&e_waGa7o8&KnGfgI!t;B2t_H2tWs}R-#|~}I9;5TY zc|6SDB-AIe`ch!?W1XLMovUumBN%TSB~|>Xc_d&Ao&J6C5UiX>)Y zqe)ii-3>M{s%BUkZ^gbqtGoH0y1Ui=S{T;CuBU6Mu1~|tSIK>S7i5y395>(3e5R9A z8yZ`a3Q{D=9Ie1od!+)`7e6BH1yNT=%P9!Q_PpAqS#2YD?_8li3f(!}t~6bJ%!$_hqld*eQ_*{2*^ZQr1Vg7_KNfM?>fNjH%6XkvK4@jQ|as zr~8SWJ3PBEq#2#~HOD+&vK2AnX;_Xg3Xk9b00*CePL6@g>#o5cU;B!t@+zp;9ZNHn zUWKWlO@q(&(b`Jc!vf2mH*vJ`+T!aaE9=(HirG8{dB23b2i#7K5!`Dbc31L5uK<4@ zxM{muoTyU}&ryr_F9q?+0%_!=NQ9CriN@T_tXAVhGb;bJ@~Fo_ei#u^DJ9I_%VsSCn}H(nLiGm)D0u$o)A|tC`&8D zBmn1~w#sz@!`W(p%?TMhFr+!GYh=^<^9tt^5@Bc)p#92u9CV&+1)R0QoApmJqjRNF zYjfPu@X@3sUX{&AL5Vr2FoeNEL0|#*J;9)WQg-l@Gh$!*(|HXoeJK%V2sJm5k25RU z6tU9Esf&5@+h%}a@cqLbA#=7U@cVy6bvpDw?-qb($eC*SEI1HaC=ITSB0%(<_Z=wRvb+YbUv4#P9OEHQl@$^VHOwHPg*CioQSqPQlL4a&K+6lq?wnONg~e$FA1JeC9M8nr;64* zPzz^RvgkbYva-ys?Hpl-{}wDWiR8GbssGm`rlxKmHP4vjv0LohVHSbu%|=AMdpe9p zL)&^RP?w|+h*Va})jxt^ybki@N&o|2Onfe@Zpe2iYgKduo*??#>I1blR><^-53vL-y8BG#U-V4_r$BdwP&thvKYU^ayz zyWa)XA{TFlFoPX^#p_7+W0EZ1JA$*;#}7IQpz+TxAYty`KtzH#!W zAMZO#2@FEsx&t^sd z4=cP^)ZCJI3Fu<7kGrLabZr5M_=>a)v`Z`kh2KsrWV^`Gq(#^9EU%^d%ljslY3pYy zC}=d?Fl)XNcnI(0sstx8^YAf{(_t@;eni}^K$h;B(MX6iiXurHUd{<-s*}Hy&>YVBLL4 zA;1Hz#Vx4!@Q9z;jL$Yi6*%2|>eUE7Tk+elb>gqc02^#{QlP5(-_Oj|Eqa~DIKBL% zY5l9(B>Aj@C^T4D#~jmA##K2h1KHw8F2sXCE0lirqZHvn(##^C1ujUjYSmI(5M|x{ z-e0b5O9W){a&Nm^5bG<58884&8R+>6m|S6lWHP>x#1P7${MKqJJ_;fEQR3Xl3*E18 zGS>w!%mSRtUr4UAjT_HMilxw^14~J(^FYo%0z^$^9HBoYZD{x?lTD0PE1m4El<%~b zW>u8!`e8HyE+KA`250fDe0JnINO|oX;KOJ z0$feCTl#A7DyC|3pch|lQ|Hhu4}wUNC3Xbgfa_H9v>wF7oOc)n7Ah#D#ZmimZouwj zmM8ZCe>iN2LfNH<0%SX{35C*3tt}ufR3Jq#hI z^ER98-fSo|RHatuiJI5TnasS@l-?;$A&DrTTovCdb0$;>KHL#1#1VV7;J&USGD>?Z zcx4~Tn4azI2Y>T^NvMGq*oJ6_WlW$jDQ3?4mdKRX(SN17I5 zNP?W?XHTZa&PJ(Wj97gbkBV|b^8>W0aeY+3PRW(Se$IMK0%pPBH+(U%28G6{QlqPk z)x(P}l{E(RJp@_6lk{qZVWcJt_0{!Cndv8N)t{RrH70J)h`}N-tr(3f!OR|zsNE5s zxnps1E>aWCkunqe+FMCY5tii{2&du(p!olX{GZf`{vm6`O1$2FJtK&3rO-aS6WQKR z&Gi{Schl(HIsisaX9cJTNxXu$2bby%Vd)pBgKNs+j2NY+f~0~#Ynhi?Hh|)}dCkfe z?{S|s?xZn`6IV?t7DCi9wr;rz2}OfK1P@17O5det((N{0siMv?)4k>T94F)*{Q?kY zKC0f}WQ*?pW3xvDHK;zck9fYEze&MzpnO*#@)+usGuBRTyDy<%BlP3oSs&FI)=V#f zTPnM0)o6YrLR|EJGw;mn zx7NugGfpdbbF~e~u-5rH%!*wjkj>`jHw$H-o!OnGJgZLH#0}z{H(IaMb6G`w=T};X zG5L09ClD|#Y-}Ncp3;b(RUt*0fTIESbU=@37k~AZ>N{WU+}~1; zY#X*iVCRz+5LxPgGYPZ0J!1*sbp#sU&9PWq6uc&Q*&@Tn^C`V`YtN%V*av6Ti%o&@ z^nZ+GosWx?fnD^nRaFYFkt6`e)+_i4%tk7+OHZt}nmwhoTfu7L_i9KUT6l~VrK%}W z;;C`DcCPojMG!uOw`V|kmARXSuhhZiBp&K#r_euqh!|SipRNa%u z$__wiU)rJFBLZ8wY9DbDkj26enm%~q6%hKcDGPp|B?ioZ132k<>*rsE7T*sGl)FhZ O@{&5>00IOc00020Aru1u literal 0 HcmV?d00001 diff --git a/examples/gallery.json b/examples/gallery.json index bd2c145..0ccaf0a 100644 --- a/examples/gallery.json +++ b/examples/gallery.json @@ -570,6 +570,30 @@ "game-pipeline", "render" ] + }, + { + "name": "cross-version-property-delete", + "dir": "examples/cross-version-property-delete", + "teaches": "Custom ID properties are removed with del, not property_unset. The IDs are built through bpy.data.objects.new so the check does not depend on active_object.", + "witnessesFix": "Factory-empty has no active_object; property_unset raises TypeError and leaves the key; del removes it (clear_has=False). --skip-delete and --unset-instead exit 7.", + "hero": "docs/gallery/assets/cross-version-property-delete-hero.webp", + "preview": "examples/cross-version-property-delete/preview.webp", + "tags": [ + "context", + "properties" + ] + }, + { + "name": "usd-export-evaluation-mode", + "dir": "examples/usd-export-evaluation-mode", + "teaches": "The USD exporter evaluation_mode chooses viewport versus render modifier quality. TESSELLATE makes the split observable; BEST_MATCH writes the cage and the mode is silent.", + "witnessesFix": "TESSELLATE+VIEWPORT writes 26/24; TESSELLATE+RENDER writes 98/96 subdivisionScheme=none; BEST_MATCH writes the 8-vert catmullClark cage. --evaluation-mode VIEWPORT and --subdivision BEST_MATCH exit 4.", + "hero": "docs/gallery/assets/usd-export-evaluation-mode-hero.webp", + "preview": "examples/usd-export-evaluation-mode/preview.webp", + "tags": [ + "depsgraph", + "export" + ] } ] } diff --git a/examples/usd-export-evaluation-mode/README.md b/examples/usd-export-evaluation-mode/README.md new file mode 100644 index 0000000..bb2ef91 --- /dev/null +++ b/examples/usd-export-evaluation-mode/README.md @@ -0,0 +1,43 @@ +# USD export evaluation_mode + +A SUBSURF cube exported through `wm.usd_export` that witnesses +`evaluation_mode='RENDER'` against `'VIEWPORT'` — the contract +[`usd-export-evaluation-mode.py`](../../snippets/usd-export-evaluation-mode.py) +names but does not prove. + +Catmull-Clark on a cube is closed form: verts = `2 + 6 × 4^n` (n=1 → 26, +n=2 → 98). TESSELLATE + VIEWPORT writes 26 points / 24 quads; TESSELLATE + +RENDER writes 98 / 96. Default `export_subdivision='BEST_MATCH'` writes the +8-vert cage plus `subdivisionScheme = catmullClark`, so evaluation_mode is +silent — both files are the cage. TESSELLATE is what makes the mode +observable. + +The still is numeric-adjacent: left is viewport tessellation (flat-shaded +L1), right is render tessellation (smoothed L2). The USDA point counts are +the evidence; the two balls depict the two qualities the exporter chooses +between. + +**What failure each check would catch:** + +- exit 3 — VIEWPORT TESSELLATE did not write the L1 closed form +- exit 4 — RENDER TESSELLATE wrote viewport quality or the BEST_MATCH cage + (`--evaluation-mode VIEWPORT` measured 26/24; `--subdivision BEST_MATCH` + measured 8/6 `catmullClark`) +- exit 5 — BEST_MATCH stopped writing the cage +- exit 6 — RENDER and VIEWPORT files are identical + +The still depicts viewport vs render tessellation of the same SUBSURF cube +(flat-shaded L1 vs smoothed L2). The USDA point counts are the evidence. + +Probed on the CI Linux portables **Blender 5.2.1 LTS** (`9e2066aef7ef`) and +**Blender 4.5.13 LTS** (`daeeeca98fb0`): `wm.usd_export` exists, `poll()` is +true in `--background`, `evaluation_mode` is `{RENDER, VIEWPORT}`. The +`--output` render path measures framing via `examples/gallery_framing.py` +(exit 10 on violation). + +## Run + +```bash +blender --background --python usd_export_evaluation_mode.py -- +blender --background --python usd_export_evaluation_mode.py -- --output u.png +``` diff --git a/examples/usd-export-evaluation-mode/preview.webp b/examples/usd-export-evaluation-mode/preview.webp new file mode 100644 index 0000000000000000000000000000000000000000..44bae881a2c5eec2d129a4dd244768d64ae49183 GIT binary patch literal 6954 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 literal 0 HcmV?d00001 diff --git a/examples/usd-export-evaluation-mode/usd_export_evaluation_mode.py b/examples/usd-export-evaluation-mode/usd_export_evaluation_mode.py new file mode 100644 index 0000000..6e37dbb --- /dev/null +++ b/examples/usd-export-evaluation-mode/usd_export_evaluation_mode.py @@ -0,0 +1,345 @@ +"""USD evaluation_mode — a runnable example. + +Witnesses ``bpy.ops.wm.usd_export`` ``evaluation_mode='RENDER'`` against +``VIEWPORT``, which the snippet names but does not prove. A SUBSURF cube +with ``levels=1`` / ``render_levels=2`` is tessellated into USDA: + +* Catmull-Clark on a cube is closed form: verts = 2 + 6 × 4^n + (n=1 → 26, n=2 → 98). TESSELLATE + VIEWPORT must write 26 points; + TESSELLATE + RENDER must write 98. +* Default ``export_subdivision='BEST_MATCH'`` writes the 8-vert cage plus + ``subdivisionScheme = catmullClark``. evaluation_mode is then silent — + both files are the cage. TESSELLATE is what makes the mode observable. + +By default it runs only the correctness check (no render) — the CI smoke +check. Pass --output to also render a still: + + blender --background --python usd_export_evaluation_mode.py -- + blender --background --python usd_export_evaluation_mode.py -- --output u.png +""" +import bpy, bmesh, sys, os, math, argparse, tempfile + +sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir)) +sys.dont_write_bytecode = True +import gallery_framing + +LEVEL_VP = 1 +LEVEL_RD = 2 + + +def cube_cc_verts(level): + """Catmull-Clark vertex count for a cube after `level` subdivisions.""" + return 2 + 6 * (4 ** level) + + +def cube_cc_faces(level): + return 6 * (4 ** level) + + +def usda_array_body(text, needle): + """Return the contents of `needle = [ ... ]`, skipping the type's `[]`.""" + key = needle + " = [" + i = text.find(key) + if i < 0: + return None + i += len(key) + depth = 1 + j = i + while j < len(text) and depth: + if text[j] == "[": + depth += 1 + elif text[j] == "]": + depth -= 1 + j += 1 + return text[i:j - 1] + + +def usda_point_count(text): + body = usda_array_body(text, "point3f[] points") + if body is None: + return 0 + return body.count("(") + + +def usda_face_count(text): + body = usda_array_body(text, "int[] faceVertexCounts") + if body is None: + return 0 + return body.count(",") + (1 if body.strip() else 0) + + +def usda_scheme(text): + key = 'uniform token subdivisionScheme = "' + i = text.find(key) + if i < 0: + return None + i += len(key) + return text[i:text.find('"', i)] + + +def build(): + bpy.ops.wm.read_factory_settings(use_empty=True) + me = bpy.data.meshes.new("Ingot") + bm = bmesh.new() + try: + bmesh.ops.create_cube(bm, size=2.0) + bm.to_mesh(me) + finally: + bm.free() + obj = bpy.data.objects.new("Ingot", me) + bpy.context.collection.objects.link(obj) + mod = obj.modifiers.new("Subsurf", "SUBSURF") + mod.levels = LEVEL_VP + mod.render_levels = LEVEL_RD + return obj, mod + + +def export_usda(path, evaluation_mode, export_subdivision): + if os.path.exists(path): + os.remove(path) + rna = bpy.ops.wm.usd_export.get_rna_type() + have = {p.identifier for p in rna.properties} + for key in ("filepath", "evaluation_mode", "export_subdivision"): + if key not in have: + raise RuntimeError(f"wm.usd_export missing RNA property {key}") + result = bpy.ops.wm.usd_export( + filepath=path, + evaluation_mode=evaluation_mode, + export_subdivision=export_subdivision, + selected_objects_only=False, + export_animation=False, + export_hair=False, + export_materials=False, + ) + if result != {"FINISHED"}: + raise RuntimeError(f"usd_export {result} for {path}") + if not (os.path.exists(path) and os.path.getsize(path) > 0): + raise RuntimeError(f"no USDA written to {path}") + return open(path, encoding="utf-8").read() + + +def check(obj, mod, out_dir, force_mode=None, force_subdiv=None): + expect_vp = cube_cc_verts(LEVEL_VP) + expect_rd = cube_cc_verts(LEVEL_RD) + expect_f_vp = cube_cc_faces(LEVEL_VP) + expect_f_rd = cube_cc_faces(LEVEL_RD) + base = len(obj.data.vertices) + if base != 8: + print(f"ERROR: base cube verts {base} != 8", file=sys.stderr) + return 2 + + mode = force_mode or "RENDER" + subdiv = force_subdiv or "TESSELLATE" + path_rd = os.path.join(out_dir, "render.usda") + path_vp = os.path.join(out_dir, "viewport.usda") + path_cage = os.path.join(out_dir, "cage.usda") + + text_rd = export_usda(path_rd, mode, subdiv) + text_vp = export_usda(path_vp, "VIEWPORT", "TESSELLATE") + text_cage = export_usda(path_cage, "RENDER", "BEST_MATCH") + + pts_rd = usda_point_count(text_rd) + pts_vp = usda_point_count(text_vp) + pts_cage = usda_point_count(text_cage) + faces_rd = usda_face_count(text_rd) + faces_vp = usda_face_count(text_vp) + scheme_rd = usda_scheme(text_rd) + scheme_cage = usda_scheme(text_cage) + + print( + f"base={base} usda_vp={pts_vp}/{faces_vp} usda_rd={pts_rd}/{faces_rd} " + f"usda_cage={pts_cage} scheme_rd={scheme_rd} scheme_cage={scheme_cage} " + f"mode={mode} subdiv={subdiv}" + ) + print( + f"closed_form vp_verts={expect_vp} rd_verts={expect_rd} " + f"vp_faces={expect_f_vp} rd_faces={expect_f_rd}" + ) + + if pts_vp != expect_vp or faces_vp != expect_f_vp: + print( + f"ERROR: VIEWPORT TESSELLATE wrote {pts_vp} points / {faces_vp} faces, " + f"expected {expect_vp}/{expect_f_vp}", + file=sys.stderr, + ) + return 3 + if pts_rd != expect_rd or faces_rd != expect_f_rd or scheme_rd != "none": + print( + f"ERROR: RENDER TESSELLATE wrote {pts_rd} points / {faces_rd} faces " + f"scheme={scheme_rd}, expected {expect_rd}/{expect_f_rd} scheme=none " + "(VIEWPORT quality or BEST_MATCH cage would not match)", + file=sys.stderr, + ) + return 4 + if pts_cage != base or scheme_cage != "catmullClark": + print( + f"ERROR: BEST_MATCH should write the cage ({base} points, catmullClark), " + f"got {pts_cage} scheme={scheme_cage}", + file=sys.stderr, + ) + return 5 + if pts_rd == pts_vp: + print("ERROR: RENDER and VIEWPORT USDA point counts are identical", file=sys.stderr) + return 6 + return 0 + + +def eevee_engine_id(): + return "BLENDER_EEVEE" if bpy.app.version >= (5, 0, 0) else "BLENDER_EEVEE_NEXT" + + +def principled(name, color, metallic, roughness): + mat = bpy.data.materials.new(name) + mat.use_nodes = True + bsdf = mat.node_tree.nodes["Principled BSDF"] + bsdf.inputs["Base Color"].default_value = color + bsdf.inputs["Metallic"].default_value = metallic + bsdf.inputs["Roughness"].default_value = roughness + return mat + + +def render_still(obj, path, engine): + """Left: viewport tessellation (levels=1). Right: render tessellation (levels=2).""" + scene = bpy.context.scene + steel = principled("Steel", (0.55, 0.57, 0.60, 1.0), 1.0, 0.58) + + left = obj + left.location = (-1.55, 0.0, 1.0) + left.rotation_euler = (0.0, 0.0, math.radians(28)) + left.data.materials.append(steel) + left.modifiers["Subsurf"].levels = LEVEL_VP + for poly in left.data.polygons: + poly.use_smooth = False + + right_me = left.data.copy() + right = bpy.data.objects.new("IngotRender", right_me) + right.location = (1.55, 0.0, 1.0) + right.rotation_euler = (0.0, 0.0, math.radians(28)) + right.data.materials.append(steel) + bpy.context.collection.objects.link(right) + rm = right.modifiers.new("Subsurf", "SUBSURF") + rm.levels = LEVEL_RD + rm.render_levels = LEVEL_RD + for poly in right.data.polygons: + poly.use_smooth = True + + floor_me = bpy.data.meshes.new("Floor") + bm = bmesh.new() + try: + bmesh.ops.create_grid(bm, x_segments=1, y_segments=1, size=30.0) + bm.to_mesh(floor_me) + finally: + bm.free() + floor_me.materials.append(principled("Studio", (0.03, 0.032, 0.037, 1.0), 0.0, 0.7)) + floor = bpy.data.objects.new("Floor", floor_me) + scene.collection.objects.link(floor) + wall = bpy.data.objects.new("Wall", floor_me.copy()) + wall.data.materials.clear() + wall.data.materials.append(principled("Wall", (0.03, 0.032, 0.037, 1.0), 0.0, 0.7)) + wall.location = (0.0, 9.0, 0.0) + wall.rotation_euler = (math.pi / 2, 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.02, 0.021, 0.025, 1.0) + scene.world = world + + def light(name, loc, energy, size, col, rot): + 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) + scene.collection.objects.link(ob) + + light("Key", (-4.0, -5.0, 6.0), 200.0, 7.0, (1.0, 0.96, 0.9), (46, 0, -35)) + light("Fill", (5.0, -3.5, 3.0), 180.0, 9.0, (0.75, 0.85, 1.0), (62, 0, 50)) + light("Wedge", (2.5, 5.5, 4.0), 360.0, 6.0, (1.0, 0.76, 0.5), (-68, 0, 190)) + + aim = bpy.data.objects.new("Aim", None) + aim.location = (0.0, 0.0, 1.0) + aim.hide_render = True + scene.collection.objects.link(aim) + cam_data = bpy.data.cameras.new("Cam") + cam_data.lens = 50.0 + cam = bpy.data.objects.new("Cam", cam_data) + cam.location = (4.16, -5.85, 3.00) + scene.collection.objects.link(cam) + scene.camera = cam + track = cam.constraints.new("TRACK_TO") + track.target = aim + track.track_axis = "TRACK_NEGATIVE_Z" + track.up_axis = "UP_Y" + + scene.render.engine = "CYCLES" if engine == "cycles" else eevee_engine_id() + if engine == "cycles": + scene.cycles.samples = 32 + else: + try: + scene.eevee.taa_render_samples = 64 + except AttributeError: + pass + scene.render.resolution_x = 1280 + scene.render.resolution_y = 720 + scene.render.image_settings.file_format = "PNG" + scene.render.filepath = path + scene.view_settings.view_transform = "Standard" + + fcode = gallery_framing.check_framing( + scene, cam, hero=[left, right], elements=[left, right], stage=[floor, wall], + ) + if fcode: + return fcode + bpy.ops.render.render(write_still=True) + if not (os.path.exists(path) and os.path.getsize(path) > 0): + print("ERROR: render produced no file", file=sys.stderr) + return 12 + return 0 + + +def main(): + argv = sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else [] + p = argparse.ArgumentParser() + p.add_argument("--output", default=None) + p.add_argument("--engine", default="eevee", choices=("eevee", "cycles")) + p.add_argument( + "--evaluation-mode", default="RENDER", choices=("RENDER", "VIEWPORT"), + help="falsification: VIEWPORT fails the RENDER closed form", + ) + p.add_argument( + "--subdivision", default="TESSELLATE", + choices=("TESSELLATE", "BEST_MATCH", "IGNORE"), + help="falsification: BEST_MATCH writes the cage", + ) + args = p.parse_args(argv) + + obj, mod = build() + out_dir = tempfile.mkdtemp(prefix="bdt_usd_") + code = check( + obj, mod, out_dir, + force_mode=args.evaluation_mode, force_subdiv=args.subdivision, + ) + if code: + return code + + if args.output: + rcode = render_still(obj, os.path.abspath(args.output), args.engine) + if rcode: + return rcode + print(f"rendered still {args.output}") + + print("usd-export-evaluation-mode OK") + return 0 + + +if __name__ == "__main__": + try: + sys.exit(main()) + except Exception as e: + import traceback + traceback.print_exc() + print(f"FATAL: {e}", file=sys.stderr) + sys.exit(1) diff --git a/tests/smoke/catalog.json b/tests/smoke/catalog.json index 644de31..9ada032 100644 --- a/tests/smoke/catalog.json +++ b/tests/smoke/catalog.json @@ -53,5 +53,7 @@ {"name": "modular-kit-snap", "script": "examples/modular-kit-snap/modular_kit_snap.py"}, {"name": "lightmap-uv-channel", "script": "examples/lightmap-uv-channel/lightmap_uv_channel.py"}, {"name": "socket-attach-points", "script": "examples/socket-attach-points/socket_attach_points.py"}, - {"name": "vertex-color-ao", "script": "examples/vertex-color-ao/vertex_color_ao.py"} + {"name": "vertex-color-ao", "script": "examples/vertex-color-ao/vertex_color_ao.py"}, + {"name": "cross-version-property-delete", "script": "examples/cross-version-property-delete/cross_version_property_delete.py"}, + {"name": "usd-export-evaluation-mode", "script": "examples/usd-export-evaluation-mode/usd_export_evaluation_mode.py"} ]
+Cross-version property delete: two brass specimen tags on a dark studio stand — left tag with a cyan emissive enamel inlay (ID property kept), right tag with an empty grey pocket (ID property deleted) + + +### [cross-version-property-delete](examples/cross-version-property-delete/) + +Custom ID properties are removed with `del id_block[key]`, not `property_unset`. +IDs are built with `bpy.data.objects.new` — the snippet `__main__` keys off +`active_object` and is dark headless. Same `del` on 4.5 LTS and 5.x. +