# Living Studio — how it is made

Living Studio combines three creative modes with eight original generative drawing worlds. [Optional learning investigations](lessons.html) remain separate. This is not a forty-tool collection or a Gaussian-splat renderer.

## Original artwork and owner source

The eight drawing worlds adapt assembl's owner-authored generative Studio: Braid, Proof Lattice, Glyph Assembly, Attractor Bloom, Ink Rings, Murmuration, Suminagashi and ASCII Forge. The source is `engines.js`, adapted from `assemblnz-f0afd79d/public/generative-studio/index.html` (source blob `13867b18b6a2e5bc4be482cf8890d8da6af3f226`, owner import `f911ad7a2a28c7008a8cdd7598a23e5774e5ef78`). No new licence is asserted for that owner code.

Liquid Atelier uses procedural marbling, not a physical fluid simulation. Sculptural Playground uses Three.js geometry and reflective materials. Luminous Type Garden grows stylised petals around editable letters. Liquid and Sculpture offer software fallbacks when GPU rendering is unavailable. Thumbnails are captures of the actual renderers.

Murmuration is choreographed particle artwork, not measured flocking. Ink Rings and Suminagashi are procedural art, not biological or fluid measurements. Proof Lattice shows generated data. Glass remains an unfinished material study; photoreal material fidelity is not claimed.

## Dependencies and licences

- p5 **1.11.3**, an unmodified, replaceable distribution: [local library](vendor/p5-1.11.3.min.js), [LGPL 2.1 notice](vendor/p5-LICENSE.txt), [corresponding upstream source](https://github.com/processing/p5.js/tree/v1.11.3), [unminified distribution](https://cdn.jsdelivr.net/npm/p5@1.11.3/lib/p5.js).
- Three.js **0.170**, locally vendored: [MIT licence](../../assets/vendor/three/LICENSE).
- Instrument Sans and Fredoka are Google Fonts distributed under the Open Font License.

## Interaction and export boundaries

Artwork is generated in your browser. No account or paid generation service is needed. Pause, reset, pointer and keyboard controls are provided. Reduced-motion preferences select a paused starting state.

Exports are PNG still captures with square, portrait or wide framing. The interface reports both captured and output dimensions: a larger export can upscale the canvas and does not promise extra detail. Optional text stays local. Native sharing is feature-detected and user-triggered. A4 printing uses 12 mm margins.

Desktop browser checks do not certify physical phone performance, AR, native sharing delivery or physical printing. These are creative and educational models, not scientific measurements.

## Sculpture Atelier · 30 October 2026

The studio opens on real parametric sculpture geometry: continuous knot, ripple halo, five-petal bloom and woven orbit. Seed, body thickness and rib count change the generated mesh. Porcelain, glass, chrome and blush resin are artistic materials; browser glass is a simplified real-time treatment and does not claim offline Cycles fidelity. Daylight, gallery and rose lighting are creative setups.

The WebGL and software renderers share `atelier-shapes.js` for their centreline. WebGL uses higher mesh resolution and physical materials. The explicitly labelled software 3D path projects actual mesh geometry with simplified reflective materials; its output is not a Blender render. Saved variations remain on this device, up to eight. JSON recipes and recipe URLs preserve supported parameters, camera turn and artwork time; they do not upload anything.

Modern worlds re-render at the requested PNG output dimensions before composition. Legacy drawing worlds retain canvas capture. Square output is 2400 × 2400, story 2160 × 3840 and wide 3200 × 2240. Larger pixel counts do not increase geometric detail. All outputs carry an assembl wordmark. OBJ exports contain artwork mesh geometry only; no manufacturing, collision, watertightness, physical material, metre-scale or printability claim is made.

Checks: `node --test study/patterns/atelier-shapes.test.js study/patterns/atelier-mesh.test.js study/patterns/studio.test.js study/patterns/runtime.test.cjs study/patterns/caption.test.cjs` (18 passing). Browser review exercised the software path, preset changes, saved variation restoration, a 2400-square PNG download and 375px-frame layout. GPU materials and physical-device performance remain unverified in this environment. The OBJ was prepared in the UI and its generated vertices/faces were validated by tests; automated browser file transfer timed out for OBJ.

## Living systems · 31 October 2026

Three worlds are real simulations rather than procedural drawings. They keep running after you let go, and they need WebGL2 with floating-point render targets. Where that is unavailable, the world says so and the other eleven remain.

- **Living Ink** solves the incompressible fluid equations on the GPU: semi-Lagrangian advection, 22 Jacobi pressure iterations and vorticity confinement (Stam 1999, *Stable Fluids*; Fedkiw, Stam and Jensen 2001; the approach popularised by Pavel Dobryakov's WebGL fluid). Dye is stored as light absorbance, so overlapping inks mix subtractively (Beer–Lambert) and each drop removes the same total light whatever its colour. The grid is coarse (144 cells on the short side, 96 on phones) and the walls are simplified. This is a playful real simulation, not engineering CFD. A small unprompted pour every few seconds keeps it moving; it is labelled in code as decoration, not physics.
- **Turing Garden** integrates the Gray–Scott reaction–diffusion model (Gray and Scott 1984; Pearson 1993) with a 9-point Laplacian on a wrapped grid. Pattern interpolates between feed/kill pairs from Robert Munafo's published map of regimes (dividing cells, coral growth, maze, fingerprint, worms), with a slight vertical drift so neighbouring regimes appear side by side. Your word seeds chemical B. Turing (1952) proposed reaction–diffusion as a mechanism for biological pattern; this model makes no claim about any particular organism.
- **Slime Mould** is an agent model after Jones (2010), inspired by *Physarum polycephalum*: about 98,000 agents (41,000 on phones) sense a shared trail at three points, turn, step and deposit; the trail diffuses and decays. Drawn food keeps releasing trail. Comparisons with transport networks (Tero et al. 2010, Tokyo rail) are about real slime moulds; this simplified model is not a route planner.

All three keep a fixed simulation grid and display it with cover framing, so PNG export re-renders the current state at output size without restarting it. Checks: `node --test study/patterns/*.test.*` (29 passing) and a headless Chromium (SwiftShader) review at 1280 × 860 and 390 × 844 in light and dark. Real-device frame rate is unverified.

## Make and test, sound and video · 31 October 2026

- **Kiln** turns a drawn stroke into a lathe profile (sorted by height, resampled to 48 points and smoothed), then adds a 0.07-unit wall, a rolled rim and an inner floor. The result is one closed outline, so the 128-segment lathe mesh is a closed solid. Glazes are real-time physically based materials with a bare bisque foot; this is not a kiln, glaze-chemistry or wall-strength model. OBJ export contains the artwork mesh (1 unit ≈ 10 cm) and has not been checked for printing, watertight tolerances or food use.
- **Flocking rules** is Craig Reynolds' boids (1987): separation, alignment and cohesion, each a capped steering force, and each weighted by its own slider. One focus bird shows its neighbourhood, its three steering arrows and their total. Time steps are fixed at 1/60 s and no coefficient drifts automatically, so two settings can be compared fairly. Dragging adds a "hawk" that birds flee. This is a model of the idea, not measured starling data.
- **Listen** (Living Ink) uses the microphone only after you press it. Loudness (RMS) sets how hard ink pours from the foot of the canvas, and the spectral centroid (150 Hz to 4.5 kHz, on a log scale) picks the ink. Both are computed in the browser each frame; no audio is recorded, stored or sent. Leaving Living Ink, or pressing Stop, releases the microphone.
- **Record a 6-second video** (Save) uses the browser's own MediaRecorder on the live canvas: MP4 where supported, otherwise WebM, at screen size and 30 frames a second. It is not re-rendered at a larger size, and files stay on the device.

Checks: `node --test study/patterns/*.test.*` (33 passing), including vessel closure and inner-wall tests and boid steering-direction tests. Headless Chromium (SwiftShader) review covered:
- a drawn Kiln stroke at 1280 and 390 px, a glaze change and an OBJ download (13,029 vertices, 25,600 faces);
- flocking with a hawk drag and a zero separation weight;
- Listen with Chromium's fake microphone;
- a recorded MP4.

Real microphones, real-device frame rates and iOS video formats are unverified.
