From 63965466674560ef71107a1521086c3ec14df1bb Mon Sep 17 00:00:00 2001 From: fOuttaMyPaint Date: Sun, 19 Jul 2026 16:33:12 -0400 Subject: [PATCH] feat: add vertex-weight-limit example witnessing the 4-influence skinning cap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Game engines cap skinning at four bone influences per vertex, and AI-generated rigging code violates it silently or reaches for the context-heavy bpy.ops path. This example authors deliberately rich five-bone boot weights on a mech arm, enforces the cap through the data API (top-four keep, VertexGroup.remove, renormalize), and proves the armature modifier is still exact linear blend skinning read back from the mesh's own deform layer — the weights on the mesh are the contract. The vertex-group API is stable across 4.5 LTS and 5.1; the example produces identical measured values on both. Signed-off-by: fOuttaMyPaint --- .cursor-plugin/plugin.json | 1 + .github/workflows/blender-smoke.yml | 11 + README.md | 23 +- ROADMAP.md | 4 + .../assets/vertex-weight-limit-hero.webp | Bin 0 -> 10932 bytes .../vertex-weight-limit-contact-sheet.webp | Bin 0 -> 36586 bytes docs/gallery/index.html | 11 + docs/gallery/vertex-weight-limit/index.html | 679 ++++++++++++++++++ examples/gallery.json | 12 + examples/vertex-weight-limit/README.md | 52 ++ examples/vertex-weight-limit/preview.webp | Bin 0 -> 9894 bytes .../vertex_weight_limit.py | 434 +++++++++++ 12 files changed, 1224 insertions(+), 3 deletions(-) create mode 100644 docs/gallery/assets/vertex-weight-limit-hero.webp create mode 100644 docs/gallery/contact-sheets/vertex-weight-limit-contact-sheet.webp create mode 100644 docs/gallery/vertex-weight-limit/index.html create mode 100644 examples/vertex-weight-limit/README.md create mode 100644 examples/vertex-weight-limit/preview.webp create mode 100644 examples/vertex-weight-limit/vertex_weight_limit.py diff --git a/.cursor-plugin/plugin.json b/.cursor-plugin/plugin.json index ba19941..676ee22 100644 --- a/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugin.json @@ -82,6 +82,7 @@ "examples/text-version-stamp", "examples/turntable", "examples/uv-layer-grid", + "examples/vertex-weight-limit", "examples/vse-cut-list", "examples/wave-displace" ] diff --git a/.github/workflows/blender-smoke.yml b/.github/workflows/blender-smoke.yml index 97eba6b..86d7bf5 100644 --- a/.github/workflows/blender-smoke.yml +++ b/.github/workflows/blender-smoke.yml @@ -393,3 +393,14 @@ jobs: # (bbox) preservation within 1e-3. Exits non-zero on failure. xvfb-run -a "$BLENDER" --background \ --python examples/lod-decimate-chain/lod_decimate_chain.py -- + + - name: Shipped example - vertex weight limit (4-influence cap + LBS) + run: | + set -euo pipefail + # Check only (no render): a five-bone mech arm with rich 5-influence + # boots, pruned to the 4-influence engine cap via the data API; + # asserts pre/post-limit influence counts, unit weight sums, pose + # preservation (pre vs post pruning), exact LBS from the mesh's own + # deform layer, and a pinned Root mount. Exits non-zero on failure. + xvfb-run -a "$BLENDER" --background \ + --python examples/vertex-weight-limit/vertex_weight_limit.py -- diff --git a/README.md b/README.md index febd367..f7cce23 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@

- 12 skills  •  6 rules  •  2 templates  •  17 snippets  •  25 examples + 12 skills  •  6 rules  •  2 templates  •  17 snippets  •  26 examples

@@ -36,7 +36,7 @@ ## Overview -This repository ships **12 skills, 6 rules, 2 templates, 17 snippets, and 25 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 26 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. @@ -466,7 +466,7 @@ round-trips through the raw `POINT` buffer.

-Game asset pipeline — 2 examples +Game asset pipeline — 3 examples @@ -502,6 +502,23 @@ keeps its closed-form counts), each LOD's evaluated triangle count lands within survives within 1e-3 — with the aggressive-ratio nose-tip collapse documented as the caught failure mode. + + + + +
+Vertex weight limit: a posed mech arm on a dark studio floor - orange armor shells, black ribbed elbow boot, glowing teal forearm ring, claw gripper - deformed by weights pruned to the four-influence engine cap + + +### [vertex-weight-limit](examples/vertex-weight-limit/) + +The game-engine max-four-bone-influences constraint, enforced through the data +API (`v.groups` + `VertexGroup.remove` + renormalize) rather than the +`bpy.ops.object.vertex_group_limit_total` context path. Asserts the pre-limit +boots really carry five influences, no vertex ends over the cap, weights still +sum to one, the pose survives pruning, and the modifier is still exact linear +blend skinning read back from the mesh's own deform layer. +
diff --git a/ROADMAP.md b/ROADMAP.md index e35ba57..b38560b 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -105,6 +105,10 @@ Not committed; target list for the next content version. (v0.3.0 shipped the smo - ~~VSE sequences-to-strips witness~~ **SHIPPED** as `examples/vse-cut-list/` — `.sequences` removed on 5.x (4.5 bridges to `.strips`), `new_effect` end kwarg `frame_end=` (4.5) vs `length=` (5.x), `frame_final_*` deprecated in favor of `left_handle`/`right_handle`/`duration`, TRANSFORM effect type removed, GAMMA_CROSS clamps to the source overlap, effect strips consume inputs only when stacked above them, same-scene scene strips render transparent; save/reload round-trip + tiny-render pixel witness - ~~glTF export round-trip witness~~ **SHIPPED** as `examples/gltf-export-roundtrip/` — `export_yup` bakes `(x,y,z)→(x,z,−y)` into vertex data with no node rotation (probed identical on 4.5.11 and 5.1.2), `export_apply` ships the evaluated mesh (one disk vertex per evaluated loop), TEXCOORD_0 is V-flipped on disk, per-triangle material bindings survive; exporter/importer RNA signatures byte-identical between 4.5.11 and 5.1.2 (guarded against future renames); `Mesh.calc_normals()` removal on 5.x surfaced during authoring - ~~LOD decimate chain witness~~ **SHIPPED** as `examples/lod-decimate-chain/` — Decimate COLLAPSE evaluated through the depsgraph is non-destructive (obj.data keeps closed-form counts), evaluated tris hit `ratio × base` within 5% (measured 0.0–0.44%), silhouette bbox survives within 1e-3 (measured 7.7e-6); a stacked Decimate halves the effective ratio, an aggressive 0.02 ratio collapses the nose tip — both caught failure modes +- ~~Vertex weight limit witness~~ **SHIPPED** as `examples/vertex-weight-limit/` — the 4-influence engine cap enforced via the data API (`v.groups` + `VertexGroup.remove` + renormalize); unit sums (measured 3e-8), pose preserved (4.9e-3), exact LBS from the mesh's own deform layer (2.7e-7), Root mount pinned +- Triangulate + tangent-space witness: `mesh.calc_loop_triangles` + `calc_tangents` producing the deterministic loop topology and orthonormal tangent basis a game engine's normal mapping depends on — the fourth direction of the game-pipeline arc, identified but not built +- glTF skinned-mesh export witness: follow-up to `gltf-export-roundtrip` + `vertex-weight-limit` — export a rigged mesh (weights + joints) to glTF and round-trip the skin, asserting influence counts and joint bindings survive the format +- Degenerate-bevel weld hazard (snippet or rule): bevel width ≥ half a box dimension creates zero-area faces whose loops weld on glTF export (found authoring `gltf-export-roundtrip`, where the count check caught a 36-vertex weld) - GAMMA_CROSS blend-curve witness: the cross blend is not the naive linear mix (mid-cross measured (0.341, 0.349, 0.463) from crimson (0.85, 0.10, 0.22) and teal (0.06, 0.75, 0.80)) — derive and assert the gamma-space closed form per frame; follow-up to `vse-cut-list` - Falsy `bpy_prop_collection` trap snippet: an empty collection is falsy, so `editor.strips or editor.sequences` silently falls through to the legacy accessor on an empty timeline — always branch on `hasattr`; likely generalizes across the API (found authoring `vse-cut-list`) diff --git a/docs/gallery/assets/vertex-weight-limit-hero.webp b/docs/gallery/assets/vertex-weight-limit-hero.webp new file mode 100644 index 0000000000000000000000000000000000000000..f8d27da4359077acfce8400e2eff538c625dfe10 GIT binary patch literal 10932 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 W))cp&Q;FEnlMJ<*?VB$7hX4R>N*(b4 literal 0 HcmV?d00001 diff --git a/docs/gallery/contact-sheets/vertex-weight-limit-contact-sheet.webp b/docs/gallery/contact-sheets/vertex-weight-limit-contact-sheet.webp new file mode 100644 index 0000000000000000000000000000000000000000..4d6852dfe202cdac82254b13b97038b83aeedaf2 GIT binary patch literal 36586 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 (j1dGCNDMC{@ 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 literal 0 HcmV?d00001 diff --git a/docs/gallery/index.html b/docs/gallery/index.html index ac03ee7..a66c34e 100644 --- a/docs/gallery/index.html +++ b/docs/gallery/index.html @@ -480,6 +480,17 @@

lod-decimate-chain

View example +
+ + vertex-weight-limit — A rigged mech arm pruned to the game-engine cap of four bone influences per vertex, through the data API. + +
+

vertex-weight-limit

+

A rigged mech arm pruned to the game-engine cap of four bone influences per vertex, through the data API. The check proves no vertex exceeds the cap, weights still sum to one, the pose survives pruning, and the modifier is still exact linear blend skinning.

+

witnesses Limit-total and normalize without bpy.ops: keep the top four groups, VertexGroup.remove the rest, renormalize. LBS is verified against the weights read back from the mesh's own deform layer, not the authoring function.

+ View example +
+