Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"examples/mesh-hygiene-audit",
"examples/parent-inverse-orrery",
"examples/png-exr-alpha",
"examples/prop-origin-transform",
"examples/shader-node-group",
"examples/shape-key-blend",
"examples/sky-texture-sun-elevation",
Expand Down
11 changes: 11 additions & 0 deletions .github/workflows/blender-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -505,3 +505,14 @@ jobs:
# positive signed volume, Euler V-E+F == 2. Exits non-zero on failure.
xvfb-run -a "$BLENDER" --background \
--python examples/mesh-hygiene-audit/mesh_hygiene_audit.py --

- name: Shipped example - prop origin transform (base origin + scale + MPI)
run: |
set -euo pipefail
# Check only (no render): street pedestal; asserts scale (1,1,1) after
# data-API apply, local bbox min.z == 0, world AABB unchanged, bare
# parent jumps accessory, matrix_parent_inverse restores world location,
# and matrix_world stays stale until view_layer.update(). Exits non-zero
# on failure.
xvfb-run -a "$BLENDER" --background \
--python examples/prop-origin-transform/prop_origin_transform.py --
23 changes: 20 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
</p>

<p align="center">
<strong>12 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>35 examples</strong>
<strong>12 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>36 examples</strong>
</p>

<p align="center">
Expand All @@ -36,7 +36,7 @@

## Overview

This repository ships **12 skills, 6 rules, 2 templates, 17 snippets, and 35 runnable examples** for Blender Python development targeting Blender 5.1 (current stable) with Blender 4.5 LTS fallback support.
This repository ships **12 skills, 6 rules, 2 templates, 17 snippets, and 36 runnable examples** for Blender Python development targeting Blender 5.1 (current stable) with Blender 4.5 LTS fallback support.

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.

Expand Down Expand Up @@ -537,7 +537,7 @@ portable path is `radius`.
</details>

<details>
<summary><strong>Game asset pipeline</strong> — 8 examples</summary>
<summary><strong>Game asset pipeline</strong> — 9 examples</summary>

<table>
<tr>
Expand Down Expand Up @@ -682,6 +682,23 @@ closed solid (measured 24/44/22, volume 0.989248). Companion to
and [`bmesh-gear`](examples/bmesh-gear/) (parametric closed solids). Dual-panel
still: DIRTY (injected boundary + loose vert) vs CLEAN.

</td>
</tr>
<tr>
<td width="46%" valign="middle">
<a href="examples/prop-origin-transform/"><img src="examples/prop-origin-transform/preview.webp" alt="Prop origin transform: dual-panel TRAP vs MPI KEEP street pedestals — left bare-parent accessory teleports with expected-seat ghost, right accessory stays put, emissive origin markers at base — proving scale apply, base origin, and matrix_parent_inverse" /></a>
</td>
<td valign="middle">

### [prop-origin-transform](examples/prop-origin-transform/)

The origin / scale-apply / MPI contract a prop pipeline relies on before
engine ingest: data-API scale bake to exactly `(1,1,1)`, local bbox
`min.z == 0` (origin at base), world AABB unchanged across the bake, and
`matrix_parent_inverse` so a bolted accessory does not teleport. Extends
[`parent-inverse-orrery`](examples/parent-inverse-orrery/) without retreading
orbits. Dual-panel still: TRAP (bare parent) vs MPI KEEP.

</td>
</tr>
</table>
Expand Down
3 changes: 2 additions & 1 deletion ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,10 @@ Not committed; target list for the next content version. (v0.3.0 shipped the smo
- Camera DOF + focus_distance witness: `cam.dof.use_dof`, focus plane vs defocus variance on high-freq cards (Stage deviation — depth needs background content)
- Volumetric scatter optical-depth witness: Volume Scatter density → Beer–Lambert transmittance along a known path (Cycles; Stage deviation)
- Freestyle SVG / line-set witness: Freestyle line set on a silhouette (full render pass; prefer Line Art first)
- prop-origin-transform witness — origin to base center, `transform_apply` through the data API, delta transforms, `matrix_parent_inverse` so parented children do not teleport; closed forms: post-apply scale exactly (1,1,1), local bbox min Z == 0, world bbox unchanged (builds on `parent-inverse-orrery`, does not duplicate it)
- ~~prop-origin-transform witness~~ **SHIPPED** as `examples/prop-origin-transform/` — origin to base center + data-API scale apply + `matrix_parent_inverse` for a bolted accessory; scale `(1,1,1)`, local `min.z==0`, world AABB delta 0, bare jump ~0.43 m, MPI err ~3e-8; stale `matrix_world` until `view_layer.update()`; byte-identical on 4.5.11 and 5.1.2
- ~~mesh-hygiene-audit witness~~ **SHIPPED** as `examples/mesh-hygiene-audit/` — engine-ingest topology checklist on a stepped street electrical pedestal: no ngons, no loose verts, manifold edges (exactly 2 faces), no zero-area faces (`min_area` printed), positive signed volume, Euler `V−E+F==2` (24/44/22, volume 0.989248); byte-identical on 4.5.11 and 5.1.2; dual-panel dirty vs clean still
- UV atlas pack witness — lightmap/unique UV island packing with non-overlap + utilization closed forms (deferred behind hygiene/origin; overlaps `uv-layer-grid` / `triangulate-tangents` / `gltf-export-roundtrip` UV arc)
- Attribute domain witness: writing a POINT-domain color attribute and reading it as if it were CORNER (or vice versa) silently shears colors across shared verts — companion to `color-attribute-wheel`

## Future (uncommitted)

Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
13 changes: 13 additions & 0 deletions docs/gallery/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -199,12 +199,14 @@ <h1>Examples Gallery</h1>
<button class="chip" data-tag="node-groups" type="button">node-groups</button>
<button class="chip" data-tag="objects" type="button">objects</button>
<button class="chip" data-tag="operators" type="button">operators</button>
<button class="chip" data-tag="parenting" type="button">parenting</button>
<button class="chip" data-tag="performance" type="button">performance</button>
<button class="chip" data-tag="render" type="button">render</button>
<button class="chip" data-tag="rendering" type="button">rendering</button>
<button class="chip" data-tag="sequencer" type="button">sequencer</button>
<button class="chip" data-tag="shape-keys" type="button">shape-keys</button>
<button class="chip" data-tag="sky" type="button">sky</button>
<button class="chip" data-tag="transform" type="button">transform</button>
<button class="chip" data-tag="transforms" type="button">transforms</button>
<button class="chip" data-tag="uv" type="button">uv</button>
<button class="chip" data-tag="world" type="button">world</button>
Expand Down Expand Up @@ -596,6 +598,17 @@ <h2><a href="mesh-hygiene-audit/">mesh-hygiene-audit</a></h2>
<a class="card-link" href="mesh-hygiene-audit/">View example <span aria-hidden="true">&rarr;</span></a>
</div>
</article>
<article class="card" data-tags="transform parenting game-pipeline">
<a class="card-media" href="prop-origin-transform/" aria-label="prop-origin-transform example detail page">
<img src="assets/prop-origin-transform-hero.webp" alt="prop-origin-transform — Street pedestal origin-to-base-center + data-API scale apply + matrix_parent_inverse for a bolted accessory." loading="lazy" decoding="async" />
</a>
<div class="card-body">
<h2><a href="prop-origin-transform/">prop-origin-transform</a></h2>
<p class="teaches">Street pedestal origin-to-base-center + data-API scale apply + matrix_parent_inverse for a bolted accessory. After bake: scale exactly (1,1,1), local min.z==0, world AABB delta 0. Bare parent jumps the accessory (~0.43 m); MPI restores world location (~3e-8). view_layer.update() before reading matrix_world.</p>
<p class="witnesses"><span class="tag">witnesses</span> AI code parents with child.parent = parent alone (accessory teleports), skips view_layer.update() before matrix_world, or leaves non-uniform scale / centered origin for engine ingest. Skipping apply, origin bake, or MPI each fails a closed-form gate.</p>
<a class="card-link" href="prop-origin-transform/">View example <span aria-hidden="true">&rarr;</span></a>
</div>
</article>
</div>
</main>
<footer>
Expand Down
Loading
Loading