diff --git a/.cursor-plugin/plugin.json b/.cursor-plugin/plugin.json index 755f3fe..1159229 100644 --- a/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugin.json @@ -85,6 +85,7 @@ "examples/shader-node-group", "examples/shape-key-blend", "examples/sky-texture-sun-elevation", + "examples/soccer-ball-goldberg", "examples/swatch-grid", "examples/temp-override-join", "examples/text-version-stamp", diff --git a/.github/workflows/blender-smoke.yml b/.github/workflows/blender-smoke.yml index c4655eb..3b85ec4 100644 --- a/.github/workflows/blender-smoke.yml +++ b/.github/workflows/blender-smoke.yml @@ -516,3 +516,16 @@ jobs: # on failure. xvfb-run -a "$BLENDER" --background \ --python examples/prop-origin-transform/prop_origin_transform.py -- + + - name: Shipped example - soccer ball Goldberg (polyhedron invariants + panel binding) + run: | + set -euo pipefail + # Check only (no render): a bmesh icosphere truncated at 1/3 per edge + # into the Goldberg polyhedron; asserts closed-form counts (60/90/32, + # Euler 2), 12-pentagon/20-hexagon census, uniform degree 3, + # watertightness, edge-length uniformity, face planarity vs an + # independent Newell normal, centroid-at-origin circumsphere, and + # panel materials bound by face vertex count. Exits non-zero on + # failure. + xvfb-run -a "$BLENDER" --background \ + --python examples/soccer-ball-goldberg/soccer_ball_goldberg.py -- diff --git a/README.md b/README.md index 4275c99..5526a24 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@

- 12 skills  •  6 rules  •  2 templates  •  17 snippets  •  36 examples + 12 skills  •  6 rules  •  2 templates  •  17 snippets  •  37 examples

@@ -36,7 +36,7 @@ ## Overview -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. +This repository ships **12 skills, 6 rules, 2 templates, 17 snippets, and 37 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. @@ -700,6 +700,26 @@ Extends [`parent-inverse-orrery`](examples/parent-inverse-orrery/) without retreading orbits. Dual-panel still: TRAP (bare parent — empty socket + teleported flange) vs MPI KEEP. + + + + +Soccer ball Goldberg: a white soccer ball with black pentagon panels on a dark studio floor — a bmesh icosphere truncated at one-third per edge into the Goldberg polyhedron, proving closed-form counts, uniform degree, equal edges, planar faces, one circumsphere, and panels bound by face vertex count + + + +### [soccer-ball-goldberg](examples/soccer-ball-goldberg/) + +The truncated icosahedron as a bmesh contract: every icosphere edge cut at +exactly `1/3`, faces ordered by link-topology walks (nothing hand-listed), +and every invariant asserted as a closed form — `60/90/32`, Euler 2, uniform +degree 3, edge lengths within 3e-5, planar faces against an independent +Newell normal, one circumsphere, and the black pentagons / white hexagons +bound by face vertex count, never enumeration order. Sibling to +[`bmesh-gear`](examples/bmesh-gear/) (parametric extrusion): this one +witnesses polyhedral invariants plus per-face-class material binding. The +smoothed render inverts on sight if the panel binding does. + diff --git a/ROADMAP.md b/ROADMAP.md index 9c1e9ef..f5fa95f 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -120,6 +120,11 @@ Not committed; target list for the next content version. (v0.3.0 shipped the smo - 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~~ **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 +- ~~Goldberg polyhedron topology witness~~ **SHIPPED** as `examples/soccer-ball-goldberg/` — soccer ball as a truncated icosahedron: bmesh icosphere cut at 1/3 per edge, faces ordered by link-topology walks; closed forms 60/90/32 + Euler 2, census 12×5+20×6, uniform degree 3, edge dev 6.5e-06, planarity 1.9e-06 (independent Newell normal), circumsphere dev 9.0e-06, panels bound by face vertex count (enumeration-order probes exit 13); float32 noise floor ~9e-6 → 3e-5 gates; byte-identical on 4.5.11 and 5.1.2 +- Mirror-modifier symmetry witness: half-model completed by Mirror evaluated through the depsgraph — evaluated-vs-original counts (2n − welded centerline), exact ±X partner for every evaluated vertex, merge-threshold weld proof, failure dramatically visible (half a subject / split seam). Strongest subject: a generic vehicle body +- Chess-piece lathe witness: a turned piece (rook/pawn) via Screw modifier or bmesh spin from an authored profile — evaluated verts == profile × steps (minus pole merges), ring radii match the profile closed form, axis of revolution exact +- Dice-pair per-face witness: material/attribute assignment driven by face normal direction, opposite-faces-sum-to-7 as an independently computed invariant, pip placement from a closed-form lattice +- Bicycle-wheel radial witness: spokes via radial Array with object offset — exact angular spacing, spoke count, hub/rim concentricity, every evaluated spoke endpoint on its computed rim coordinate - ~~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` diff --git a/docs/gallery/assets/soccer-ball-goldberg-hero.webp b/docs/gallery/assets/soccer-ball-goldberg-hero.webp new file mode 100644 index 0000000..1fb6445 Binary files /dev/null and b/docs/gallery/assets/soccer-ball-goldberg-hero.webp differ diff --git a/docs/gallery/contact-sheets/soccer-ball-goldberg-contact-sheet.webp b/docs/gallery/contact-sheets/soccer-ball-goldberg-contact-sheet.webp new file mode 100644 index 0000000..0ea8cf9 Binary files /dev/null and b/docs/gallery/contact-sheets/soccer-ball-goldberg-contact-sheet.webp differ diff --git a/docs/gallery/index.html b/docs/gallery/index.html index fe50ab4..feada58 100644 --- a/docs/gallery/index.html +++ b/docs/gallery/index.html @@ -609,6 +609,17 @@

prop-origin-transform

View example +
+ + soccer-ball-goldberg — A soccer ball as a Goldberg polyhedron: a bmesh icosphere truncated at 1/3 per edge, faces ordered by link-topology walks, panels bound by face vertex count. + +
+

soccer-ball-goldberg

+

A soccer ball as a Goldberg polyhedron: a bmesh icosphere truncated at 1/3 per edge, faces ordered by link-topology walks, panels bound by face vertex count.

+

witnesses Goldberg invariants are closed forms — counts, degree 3, uniform edges, planar faces, one circumsphere — and panels bind by vertex count, never enumeration order.

+ View example +
+