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
Binary file added docs/gallery/asset-sheets/terrain-scatter.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/gallery/assets/car-mirror-symmetry-hero.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/gallery/assets/terrain-scatter-hero.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 5 additions & 2 deletions docs/gallery/car-mirror-symmetry/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ <h1>car-mirror-symmetry</h1>
<ul><li><strong>Original holds the half.</strong> Body datablock is exactly 126 verts / 231 edges / 106 faces (14 × 9, loft closed forms), with exactly 28 centerline verts (probe: modifier applied into data → exit 3, datablock reads <code>(224, 434, 212)</code>).</li><li><strong>Evaluated is the welded whole.</strong> Exactly <code>2n − c = 224</code> verts (probe: <code>use_mirror_merge = False</code> → exit 5, <strong>252</strong> verts — the doubled seam; probe: one centerline vert pulled off the plane → exit 4, <strong>27 ≠ 28</strong> welded; probe: mirror axis off → exit 5, <strong>126</strong> — the half-car). The evaluated shell is watertight (every edge borders 2 faces) with Euler characteristic <strong>2</strong> — the two halves weld into a topological sphere.</li><li><strong>Exact ±X partners.</strong> Every evaluated vertex has a partner at negated X: measured deviation <strong>0.000e+00</strong> (mirror copies exactly; tol 2e-5 guards float32), evaluated bbox symmetric (<code>min.x == −max.x</code>).</li><li><strong>Mirrored parts.</strong> Wheels (96/81 half → 192/162 evaluated) and lamps (8/6 → 16/12) each double across the plane with partner deviation 0.0 — and each object origin reads <code>x == 0</code>.</li></ul>
<p><strong>Why the checks target the modifier, not the base:</strong> mutating a non-plane base vertex cannot break the ±X pairing — the evaluated set is always <code>half ∪ mirror(half)</code>, symmetric by construction. Realistic failures live in the modifier (merge off, axis off, modifier applied into data, origin off the plane), which is what the probes break.</p>
<p><strong>Version witness:</strong> check output is byte-identical on Blender 4.5.11 LTS and 5.1.2. Mirror, <code>evaluated_get</code> / <code>to_mesh</code> / <code>to_mesh_clear</code> (no argument — passing the mesh raises TypeError on both), and <code>TRACK_TO</code> constraint behavior are stable across the pair; only the EEVEE engine id is version-gated.</p>
<p>The render is the proof: hide the mirror and the still is literally half a car — halved windshield and hood at the centerline, one headlamp. Render notes: the loft is faceted by design (flat shading, no bevel modifier — the modifier stack is Mirror only, so counts stay closed-form); the window band is glass by construction class (steepest roof-rise slope is the windshield, steepest drop the rear window, ring segment 5 the side windows), and the glass is dielectric — metallic glass mirrors the key light and renders the windshield as a hot salmon slab.</p>
<p>The render is the proof: hide the mirror and the still is literally half a car — halved windshield and hood at the centerline, one headlamp. Render notes: the loft is faceted by design (flat shading, no bevel modifier — the modifier stack is Mirror only, so counts stay closed-form); the window band is glass by construction class (steepest roof-rise slope is the windshield, steepest drop the rear window, ring segment 5 the side windows), and the glass is dielectric — metallic glass mirrors the key light and renders the windshield as a hot salmon slab. The camera stands on the key light&#x27;s side of the car: from the other side it saw only the flank the key cannot reach, and the whole visible side rendered near-black. The car is mirror-symmetric, so the composition is the same either way. The bright streak along the cowl below the windshield is the key&#x27;s highlight in a crease that faces it.</p>
<h2>Run</h2>
<pre><code># Cheap correctness check (no render) — the CI check:
blender --background --python car_mirror_symmetry.py --
Expand Down Expand Up @@ -788,7 +788,10 @@ <h2>Source</h2>
cam_data = bpy.data.cameras.new(<span class="s">&quot;Cam&quot;</span>)
cam_data.lens = <span class="n">52.0</span>
cam = bpy.data.objects.new(<span class="s">&quot;Cam&quot;</span>, cam_data)
cam.location = (<span class="n">4.4</span>, -<span class="n">5.3</span>, <span class="n">2.1</span>)
<span class="c"># On the key&#x27;s side (-X): the car is mirror-symmetric, so this is the</span>
<span class="c"># same composition, but at +X the camera saw the flank the key cannot</span>
<span class="c"># reach and the whole visible side rendered near-black.</span>
cam.location = (-<span class="n">4.4</span>, -<span class="n">5.3</span>, <span class="n">2.1</span>)
scene.collection.objects.link(cam)
track = cam.constraints.new(<span class="s">&#x27;TRACK_TO&#x27;</span>) <span class="c"># data API, not bpy.ops (damped-track-aim)</span>
track.target = aim
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/gallery/contact-sheets/terrain-scatter-contact-sheet.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 3 additions & 3 deletions docs/gallery/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -981,12 +981,12 @@ <h2><a href="treasure-chest/">treasure-chest</a></h2>
</article>
<article class="card" data-tags="mesh export showcase">
<a class="card-media" href="terrain-scatter/" tabindex="-1" aria-hidden="true">
<img src="assets/terrain-scatter-hero.webp" alt="A square tile of dark rolling earth with nine faceted grey rocks seated across the hill, none touching." loading="lazy" decoding="async" />
<img src="assets/terrain-scatter-hero.webp" alt="A square tile of dark rolling earth with a rounded edge, nine faceted grey stones from cobble to boulder sunk into the ground across the hill." loading="lazy" decoding="async" />
</a>
<div class="card-body">
<h2><a href="terrain-scatter/">terrain-scatter</a></h2>
<p class="teaches">A Geometry Nodes hill tile with seated icosphere scatter through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.</p>
<p class="witnesses"><span class="tag">witnesses</span> Recomputed: 1758 tris, two materials with 720 stone faces, UVs in 0..1 with zero AABB overlap, outer AABB 1.800×1.800×0.552 m, grounded zmin, 9 stones of ≥80 faces seated on sampled dirt Z (offset −35 mm, floor zmin 0.113 m), LOD ratios in band, convex collider 81 tris, hygiene zero, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z 16; --poke-rock 17; --float-rocks 18; --box-rocks 19.</p>
<p class="teaches">A Geometry Nodes hill tile with embedded, varied stone scatter through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.</p>
<p class="witnesses"><span class="tag">witnesses</span> Recomputed: 2398 tris, two materials with 720 stone faces, UVs in 0..1 with zero AABB overlap, outer AABB 1.800x1.800x0.570 m, grounded zmin, 9 stones of &gt;=80 faces each sealed into the ground in 8/8 sectors, footprint ratio 9.8, rim tilt step 33.5 deg, no stone pairs overlapping, LOD ratios in band, convex collider 36 tris, hygiene zero, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z 16; --poke-rock 17; --float-rocks 18; --box-rocks 19; --pile-rocks 20; --perch-rocks 21; --uniform-rocks 22; --sharp-rim 23.</p>
<a class="card-link" href="terrain-scatter/">View showcase piece<span class="sr-only"> terrain-scatter</span> <span aria-hidden="true">&rarr;</span></a>
</div>
</article>
Expand Down
Loading
Loading