@wavegrid/layout
v1.2.0
Published
Config-driven fixture layouts — grids, rings, and filled rings — the single source of truth for cannon geometry
Maintainers
Readme
@wavegrid/layout
Config-driven fixture layouts — the single source of truth for cannon geometry.
Every other package (patterns, animations, scenes, the artist UI, the 3D viewer,
OSC routing) reads positions from a Layout instead of re-deriving them from
(numCannons, gridColumns). A Layout is plain, JSON-serializable data, so the
server resolves it once and broadcasts it to every client.
Shapes
import { gridLayout, ringLayout, filledRingLayout, resolveLayout } from '@wavegrid/layout';
gridLayout({ cols: 7, rows: 7 }); // the OG 49-cannon grid
gridLayout({ cols: 7, rows: 2 }); // 7×2
ringLayout({ count: 6 }); // 6 cannons in a circle
filledRingLayout({ count: 25 }); // 25 in a filled disc (grid + circular mask)
resolveLayout({ preset: 'ring-6' }); // by preset id
resolveLayout({ kind: 'ring', count: 12 });Each Fixture carries u/v (normalized), x/y (centered), angle, radius,
ring, and grid row/col (when the layout has grid coordinates). Patterns and
animations consume these directly, so the same effect runs on a rectangle or a
circle.
Config + run mode
import { loadWavegridConfig } from '@wavegrid/layout';
const { config, layout, runMode } = loadWavegridConfig();
// runMode: 'simple' when count < simpleModeMax (default 40), else 'distributed'Config is loaded with confstash:
defaults → project file (wavegrid.config.* / .wavegridrc) → env → overrides.
