import type { SceneFrame } from "./framing"; export type Settings = { mode: "particles" | "wireframe" | "silhouette"; count: number; size: number; brightness: number; color: | "original" | "spectrum" | "ice" | "amber" | "mono" | "lavender" | "rose"; duration: number; axis: "x" | "y" | "z"; elevation: number; azimuth: number; zoom: number; cue: number; }; export const DEFAULTS: Settings = { mode: "particles", count: 38000, size: 1.3, brightness: 0.8, color: "ice", duration: 6, axis: "y", elevation: 12, azimuth: 0, zoom: 1.08, cue: 0, }; export const PRESETS = [ { key: "torus", label: "Knot" }, { key: "sphere", label: "Sphere" }, { key: "arrow", label: "Arrow" }, { key: "cube", label: "Cube" }, { key: "ring", label: "Ring" }, { key: "helix", label: "Helix" }, { key: "star", label: "Star" }, { key: "diamond", label: "Diamond" }, { key: "cone", label: "Cone" }, { key: "pyramid", label: "Pyramid" }, ]; export type Model = { name: string; triangles: Float32Array; wires: Float32Array; particles: Float32Array; id: number; rotationDirection: 1 | -1; rotationBounds: { axial: [number, number, number]; radial: [number, number, number]; }; }; export type ImportedAsset = { name: string; clips: { name: string; duration: number }[]; warning?: string; sourceFiles: File[]; dispose: () => void; build: (clip: number, time: number) => Promise; }; export type SceneSnapshot = { model: Model; settings: Settings; angle: number; width: number; height: number; frame: SceneFrame; pixelRatio: number; backend: Renderer["backend"]; }; export interface Renderer { readonly backend: "webgpu" | "canvas"; canvas: HTMLCanvasElement; onError?: (message: string) => void; resize: (width: number, height: number, ratio: number) => void; draw: ( model: Model, settings: Settings, angle: number, frame?: Readonly, ) => void; dispose: () => void; }