preseed/parts/p_sph.module — FONTAINE: real GPU SPH water (~340k live
particles, counting-sort binned once per frame, density+force substeps
pacing simulated time to the clock) staging a full water show on a
170x66-meter oval lake in a vast dusk parterre garden. At the lake's
center a monumental three-tier fountain island rises 14 meters; down the
lake's long axis runs a twenty-four-nozzle articulated line array, and
sixteen more articulated nozzles ring the island. The show opens on a
still mirror: a champagne crown ignites, a packet of jets sweeps the full
length of the lake, doubles into two packets crossing mid-lake, and the
island ring wakes chasing; at full glory every nozzle runs — traveling
height waves the length of the lake, a crisscross lattice of crossing
jets, a rotating spiral on the ring, punctuated by synchronized burst
salvos riding the score — while eight rosé tier jets arc from the middle
dish and the dishes cascade over scalloped rims. At the finale everything
cuts for one held breath and the crown fires a geyser over thirty meters
above the lake, line and ring shimmering beneath it, before the show
eases off and the water settles back into a golden mirror. A GPU drain
pump recycles all pooled water back out of every nozzle, so the whole
show runs continuously from a fixed particle budget.
The water renders through the engine's fluidSurface: the force pass
streams interleaved world-space render records (pos, vel, foam, tint)
to psph_render, and the surface splats them with velocity stretch,
per-particle color blending, and a churn foam layer driven by the sim's
agitation field — champagne, rosé, and pale gold visibly blend where
the show churns the lake.
shader(ref: ?, name: ?) → void
Each pass is resolved from a literal identity, which is what records this
module's dependency on the shader and carries it along wherever the module
goes.
| arg | type | description |
|---|
| ref | ? | |
| name | ? | |
basinGeom( ) → void
island basin rim wall: one lathe strip — interior wall from the basin
floor up, over the molded rim, down the outer face into the lake
plinthGeom( ) → void
central plinth rising from the basin to carry the lower dish
tierGeom(T: ?, backR: ?) → void
one tier dish: interior along the dish sphere → molded lip → underside
back to its pedestal collar — the same sphere the sim holds as a shell
| arg | type | description |
|---|
| T | ? | |
| backR | ? | |
ped1Geom( ) → void
pedestal between the lower and middle dishes: entasis shaft and collar
ped2Geom( ) → void
pedestal between the middle and upper dishes
finialGeom( ) → void
gilded finial: stem from the upper dish floor, urn belly, neck, crown cup
— the crown nozzle sits at its 14-meter tip
nozzleGeom( ) → void
one articulated island rim nozzle: a gilded urn that leans with its jet
nozzleRot(a: ?, k: ?, phase: ?, stepA: ?, tilt: ?, wave: ?) → void
nozzle aim: the same lean the shader gives the jet — tangential tilt from
the traveling wave over a fixed inward cant
| arg | type | description |
|---|
| a | ? | |
| k | ? | |
| phase | ? | |
| stepA | ? | |
| tilt | ? | |
| wave | ? | |
releaseBuffers(ctx: ?) → void
applyLook( ) → void
The dusk this garden is lit by. Scene-wide state — the sky, the key, the
ambient, the clear colour — so it belongs to `enter` and not to `build`: the
director may build a part up to a second before its cut, under the outgoing
part's fade, and a sunset installed there would land on the part still on
screen. The lights BELOW this, which stand in the part's own world area and
reach nothing outside it, stay in `build`.
seedAt(x: ?, y: ?, z: ?) → void
| arg | type | description |
|---|
| x | ? | |
| y | ? | |
| z | ? | |
emitStream(ctx: ?, k: ?, px: ?, py: ?, pz: ?, vx: ?, vy: ?, vz: ?, jx: ?, jz: ?, tint: ?, dt: ?) → void
emit a burst of live particles as a jet stream: positions spread along the
sub-frame trajectory so the stream reads as a column, not clumps
| arg | type | description |
|---|
| ctx | ? | |
| k | ? | |
| px | ? | |
| py | ? | |
| pz | ? | |
| vx | ? | |
| vy | ? | |
| vz | ? | |
| jx | ? | |
| jz | ? | |
| tint | ? | |
| dt | ? | |
emitJets(ctx: ?, t: ?, dt: ?, jetV: ?) → void
CPU emission: the crown stream and the staggered tier jets pour the show's
opening water in; the GPU pump keeps every nozzle fed from the lake after
| arg | type | description |
|---|
| ctx | ? | |
| t | ? | |
| dt | ? | |
| jetV | ? | |
ringWindow(head: ?, w: ?) → void
island ring choreography, as a 16-bit mask: a chasing packet, the full
ring through the glory, one held breath, an odd/even shimmer under the
geyser, and a closing window that shrinks away with the ease
| arg | type | description |
|---|
| head | ? | |
| w | ? | |
lineWindow(head: ?, w: ?) → void
lake line choreography, as a 24-bit mask: a five-jet packet sweeping the
full length of the lake, two packets crossing mid-lake, the whole line
through the glory, the breath, an alternating shimmer under the geyser,
and a window collapsing to the center with the ease
| arg | type | description |
|---|
| head | ? | |
| w | ? | |
drivePatterns(ctx: ?, t: ?, dt: ?) → void
the nozzle articulation program: traveling height waves, the crisscross
lattice, the rotating spiral / serpentine wave, the fast shimmer under
the geyser — decaying with the ease. Also times the burst salvos.
| arg | type | description |
|---|
| ctx | ? | |
| t | ? | |
| dt | ? | |
driveFountain(ctx: ?, t: ?, dt: ?) → void
the pump choreography: a trickle feeds the chases, the main ramp opens the
full show, the surge fires the geyser, and the fade lets the lake settle;
the crown / ring / line / tier shares follow the phase
| arg | type | description |
|---|
| ctx | ? | |
| t | ? | |
| dt | ? | |
stepSim(ctx: ?, substeps: ?, dtSub: ?) → void
| arg | type | description |
|---|
| ctx | ? | |
| substeps | ? | |
| dtSub | ? | |
update(ctx: ?, t: ?, dt: ?) → void
| arg | type | description |
|---|
| ctx | ? | |
| t | ? | |
| dt | ? | |