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
4 changes: 3 additions & 1 deletion .cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,10 @@
],
"examples": [
"examples/depsgraph-export",
"examples/driver-wave",
"examples/gn-sdf-remesh",
"examples/swatch-grid",
"examples/turntable"
"examples/turntable",
"examples/wave-displace"
]
}
20 changes: 20 additions & 0 deletions .github/workflows/blender-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -155,3 +155,23 @@ jobs:
# > base. Exits non-zero on failure.
xvfb-run -a "$BLENDER" --background \
--python examples/depsgraph-export/depsgraph_export.py --

- name: Shipped example - wave displace (foreach bulk IO)
run: |
set -euo pipefail
# Frame-independent check only (no render): 9409 verts displaced via one
# foreach_get + one foreach_set; asserts count unchanged, Z span matches the
# amplitude, and a probe vertex matches the closed-form wave. Exits non-zero
# on failure.
xvfb-run -a "$BLENDER" --background \
--python examples/wave-displace/wave_displace.py --

- name: Shipped example - driver wave (driver_namespace + depsgraph)
run: |
set -euo pipefail
# Frame-independent check only (no render): sixteen SCRIPTED drivers call a
# driver_namespace function; asserts the driven values on the evaluated copy
# AND the flushed-back original both match the closed form. Exits non-zero
# on failure.
xvfb-run -a "$BLENDER" --background \
--python examples/driver-wave/driver_wave.py --
28 changes: 28 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,34 @@ A depsgraph-evaluated export — builds a cube with `SUBSURF`, measures the eval
`evaluated_get().to_mesh()` / `to_mesh_clear()`, and asserts `wm.obj_export` ships the
modifier-applied geometry (exported vertex count == evaluated > base).

</td>
</tr>
<tr>
<td width="46%" valign="middle">
<a href="examples/wave-displace/"><img src="examples/wave-displace/preview.webp" alt="Wave displace: a dense grid displaced into smooth standing-wave dunes, rendered with EEVEE" /></a>
</td>
<td valign="middle">

### [wave-displace](examples/wave-displace/)

Bulk vertex IO at real scale — 9,409 vertices displaced into a standing wave with **one
`foreach_get` and one `foreach_set`**, no per-vertex access. Asserts the count is unchanged,
the Z span matches the amplitude, and a probe vertex matches the closed-form wave.

</td>
</tr>
<tr>
<td width="46%" valign="middle">
<a href="examples/driver-wave/"><img src="examples/driver-wave/preview.webp" alt="Driver wave: sixteen columns whose heights form a sine skyline, each driven by a driver_namespace function, rendered with EEVEE" /></a>
</td>
<td valign="middle">

### [driver-wave](examples/driver-wave/)

A `driver_namespace` function driving sixteen column heights through SCRIPTED drivers.
Witnesses the evaluation contract: driven values appear after a view-layer update on the
evaluated copy **and** the flushed-back original, and both must match the closed form.

</td>
</tr>
</table>
Expand Down
Binary file added docs/gallery/assets/driver-wave-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 added docs/gallery/assets/wave-displace-hero.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
417 changes: 417 additions & 0 deletions docs/gallery/driver-wave/index.html

Large diffs are not rendered by default.

25 changes: 25 additions & 0 deletions docs/gallery/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -176,9 +176,12 @@ <h1>Examples Gallery</h1>
<button class="chip active" data-tag="" type="button">All</button>
<button class="chip" data-tag="animation" type="button">animation</button>
<button class="chip" data-tag="depsgraph" type="button">depsgraph</button>
<button class="chip" data-tag="drivers" type="button">drivers</button>
<button class="chip" data-tag="export" type="button">export</button>
<button class="chip" data-tag="geometry-nodes" type="button">geometry-nodes</button>
<button class="chip" data-tag="materials" type="button">materials</button>
<button class="chip" data-tag="mesh" type="button">mesh</button>
<button class="chip" data-tag="performance" type="button">performance</button>
<button class="chip" data-tag="rendering" type="button">rendering</button>
</div>
<main id="main">
Expand Down Expand Up @@ -227,6 +230,28 @@ <h2><a href="depsgraph-export/">depsgraph-export</a></h2>
<a class="card-link" href="depsgraph-export/">View example <span aria-hidden="true">&rarr;</span></a>
</div>
</article>
<article class="card" data-tags="mesh performance">
<a class="card-media" href="wave-displace/" aria-label="wave-displace example detail page">
<img src="assets/wave-displace-hero.webp" alt="wave-displace — Bulk vertex IO at real scale — 9,409 vertices displaced into a standing wave with one foreach_get and one foreach_set, no per-vertex access" loading="lazy" decoding="async" />
</a>
<div class="card-body">
<h2><a href="wave-displace/">wave-displace</a></h2>
<p class="teaches">Bulk vertex IO at real scale — 9,409 vertices displaced into a standing wave with one foreach_get and one foreach_set, no per-vertex access.</p>
<p class="witnesses"><span class="tag">witnesses</span> The bulk path is correct, not just fast: vertex count unchanged, Z span matches the wave amplitude, probe vertex matches the closed form exactly.</p>
<a class="card-link" href="wave-displace/">View example <span aria-hidden="true">&rarr;</span></a>
</div>
</article>
<article class="card" data-tags="drivers animation">
<a class="card-media" href="driver-wave/" aria-label="driver-wave example detail page">
<img src="assets/driver-wave-hero.webp" alt="driver-wave — A driver_namespace function driving sixteen column heights through SCRIPTED drivers — the sine skyline is entirely driver-evaluated" loading="lazy" decoding="async" />
</a>
<div class="card-body">
<h2><a href="driver-wave/">driver-wave</a></h2>
<p class="teaches">A driver_namespace function driving sixteen column heights through SCRIPTED drivers — the sine skyline is entirely driver-evaluated.</p>
<p class="witnesses"><span class="tag">witnesses</span> Driven values appear after a view-layer update in two places that must agree: the evaluated copy and the original datablock the animation system flushes for display.</p>
<a class="card-link" href="driver-wave/">View example <span aria-hidden="true">&rarr;</span></a>
</div>
</article>
</div>
</main>
<footer>
Expand Down
Loading
Loading