Skip to content

Commit 764c90f

Browse files
authored
feat: witness ID-property delete and USD evaluation_mode
Witness the custom ID-property delete contract and wm.usd_export evaluation_mode RENDER vs VIEWPORT.
1 parent 6d966b4 commit 764c90f

20 files changed

Lines changed: 2184 additions & 10 deletions

File tree

‎.cursor-plugin/plugin.json‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
"examples/collision-hull-proxy",
6868
"examples/color-attribute-wheel",
6969
"examples/compositor-glare",
70+
"examples/cross-version-property-delete",
7071
"examples/curve-bevel-arc",
7172
"examples/custom-normals-shade",
7273
"examples/damped-track-aim",
@@ -99,6 +100,7 @@
99100
"examples/text-version-stamp",
100101
"examples/triangulate-tangents",
101102
"examples/turntable",
103+
"examples/usd-export-evaluation-mode",
102104
"examples/uv-layer-grid",
103105
"examples/vertex-color-ao",
104106
"examples/vertex-weight-limit",

‎AGENTS.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ a `.cursor-plugin/plugin.json` manifest so the ecosystem drift checker
2020
classifies it as a `cursor-plugin`. This is content the AI loads when the user
2121
asks Blender questions or works on Blender add-ons in Cursor or Claude Code.
2222

23-
The content base is 13 skills, 6 rules, 2 templates, 17 snippets, and 45
23+
The content base is 13 skills, 6 rules, 2 templates, 17 snippets, and 47
2424
examples (counts are CI-enforced against README.md and the manifest). The full
2525
inventory tables and per-item purposes live in `CLAUDE.md`. Example anatomy
2626
and authoring rules: copy `examples/bmesh-gear/`; the render look is specified
@@ -35,7 +35,7 @@ Blender-Developer-Tools/
3535
rules/<rule-name>.mdc # 6 rule files
3636
templates/<template-name>/ # 2 starter templates
3737
snippets/<snippet-name>.py # 17 standalone Python snippets
38-
examples/<name>/ # 45 runnable smoke-gated examples (+ gallery.json)
38+
examples/<name>/ # 47 runnable smoke-gated examples (+ gallery.json)
3939
examples/gallery_framing.py # shared Layer 1 framing measurement (render path only)
4040
scripts/build_gallery.py # generates docs/gallery/ (stdlib only)
4141
scripts/site/ # vendored landing-page build (build_site.py + template)

‎CLAUDE.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ skills/<skill-name>/SKILL.md - AI workflow definitions, 13 total
2121
rules/<rule-name>.mdc - Anti-pattern rules, 6 total
2222
templates/<template-name>/ - Starter projects, 2 total
2323
snippets/<snippet-name>.py - Standalone code patterns, 17 total
24-
examples/<name>/ - Runnable smoke-gated examples, 45 total (+ gallery.json)
24+
examples/<name>/ - Runnable smoke-gated examples, 47 total (+ gallery.json)
2525
scripts/build_gallery.py - Regenerates docs/gallery/ from gallery.json (stdlib only)
2626
scripts/site/ - Vendored landing-page build (Jinja2)
2727
docs/gallery/ - Committed generated gallery pages + hero renders
@@ -83,7 +83,7 @@ v0.1.0: canonical object creation and deletion, depsgraph evaluated mesh, bmesh
8383

8484
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'`.
8585

86-
## Examples (45)
86+
## Examples (47)
8787

8888
Runnable scripts at `examples/<name>/`, each asserting a real API contract with
8989
deterministic checks (exit non-zero on failure) and optionally rendering a still via

‎README.md‎

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
</p>
1919

2020
<p align="center">
21-
<strong>13 skills</strong> &nbsp;&bull;&nbsp; <strong>6 rules</strong> &nbsp;&bull;&nbsp; <strong>2 templates</strong> &nbsp;&bull;&nbsp; <strong>17 snippets</strong> &nbsp;&bull;&nbsp; <strong>45 examples</strong>
21+
<strong>13 skills</strong> &nbsp;&bull;&nbsp; <strong>6 rules</strong> &nbsp;&bull;&nbsp; <strong>2 templates</strong> &nbsp;&bull;&nbsp; <strong>17 snippets</strong> &nbsp;&bull;&nbsp; <strong>47 examples</strong>
2222
</p>
2323

2424
<p align="center">
@@ -36,7 +36,7 @@
3636

3737
## Overview
3838

39-
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.
39+
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.
4040

4141
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.
4242

@@ -203,7 +203,7 @@ Gallery still is a dual-elevation diptych so the contract reads at thumbnail sca
203203
</details>
204204

205205
<details>
206-
<summary><strong>Mesh, curves &amp; text</strong> — 10 examples</summary>
206+
<summary><strong>Mesh, curves &amp; text</strong> — 11 examples</summary>
207207

208208
<table>
209209
<tr>
@@ -308,6 +308,21 @@ A depsgraph-evaluated export — builds a cube with `SUBSURF`, measures the eval
308308
`evaluated_get().to_mesh()` / `to_mesh_clear()`, and asserts `wm.obj_export` ships the
309309
modifier-applied geometry (exported vertex count == evaluated > base).
310310

311+
</td>
312+
</tr>
313+
<tr>
314+
<td width="46%" valign="middle">
315+
<a href="examples/usd-export-evaluation-mode/"><img src="examples/usd-export-evaluation-mode/preview.webp" alt="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" /></a>
316+
</td>
317+
<td valign="middle">
318+
319+
### [usd-export-evaluation-mode](examples/usd-export-evaluation-mode/)
320+
321+
`wm.usd_export` `evaluation_mode='RENDER'` versus `'VIEWPORT'`. TESSELLATE writes
322+
the closed-form Catmull-Clark counts (26/24 vs 98/96); default BEST_MATCH writes
323+
the 8-vert cage and the mode is silent. Asserts the USDA point counts, not the
324+
still.
325+
311326
</td>
312327
</tr>
313328
<tr>
@@ -496,7 +511,7 @@ and every orbit lands on its closed form.
496511
</details>
497512

498513
<details>
499-
<summary><strong>Context &amp; Grease Pencil</strong> — 3 examples</summary>
514+
<summary><strong>Context &amp; Grease Pencil</strong> — 4 examples</summary>
500515

501516
<table>
502517
<tr>
@@ -511,6 +526,20 @@ Three unit cubes joined into a staircase under `bpy.context.temp_override` — t
511526
replacement for the removed `context.copy()` dict-pass form. Asserts one mesh remains,
512527
sources are gone, and local Z spans all three steps.
513528

529+
</td>
530+
</tr>
531+
<tr>
532+
<td width="46%" valign="middle">
533+
<a href="examples/cross-version-property-delete/"><img src="examples/cross-version-property-delete/preview.webp" alt="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)" /></a>
534+
</td>
535+
<td valign="middle">
536+
537+
### [cross-version-property-delete](examples/cross-version-property-delete/)
538+
539+
Custom ID properties are removed with `del id_block[key]`, not `property_unset`.
540+
IDs are built with `bpy.data.objects.new` — the snippet `__main__` keys off
541+
`active_object` and is dark headless. Same `del` on 4.5 LTS and 5.x.
542+
514543
</td>
515544
</tr>
516545
<tr>

‎ROADMAP.md‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ Audit pass on v0.1.0 content: standards-version markers bumped from `1.9.1` to `
9191

9292
Not committed; target list for the next content version. (v0.3.0 shipped the smoke-gated `examples/` track.)
9393

94+
- ~~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
95+
- ~~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
96+
- 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
9497
- ~~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.
9598
- `modal-operators` skill -- `invoke` returning `RUNNING_MODAL`, the `modal()` event handler, modal cancellation patterns
9699
- `usd-pipelines` skill -- USD export options, `evaluation_mode`, instancing, the USD vs glTF tradeoffs
13.6 KB
Loading
7.25 KB
Loading
81.7 KB
Loading
75.3 KB
Loading

0 commit comments

Comments
 (0)