Xenova's picture
Xenova HF Staff
Upload 63 files
f323fc1 verified
Raw History Blame Contribute Delete
2.03 kB
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<Model>;
};
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<SceneFrame>,
) => void;
dispose: () => void;
}