declare module "@yawn/core" { export type RowFormat = "f32" | "u32" | "i32"; export interface RowDescriptor { name: string; rows: number; stride: number; format: RowFormat; offset: number; bytes: number; } export class SharedRows { readonly buffer: SharedArrayBuffer; readonly descriptor: RowDescriptor; readonly name: string; readonly rows: number; readonly stride: number; readonly format: RowFormat; readonly view: Float32Array | Uint32Array | Int32Array; row(index: number): Float32Array | Uint32Array | Int32Array; read(index: number): number[]; write(index: number, values: ArrayLike): this; share(): { buffer: SharedArrayBuffer; descriptor: RowDescriptor }; } export interface ProfileFrame { frame: number; milliseconds: number; readbackMilliseconds: number; adapter: string; canvas: { width: number; height: number }; passes: Array<{ name: string; milliseconds: number }>; } export class YawnCore { constructor(canvas: HTMLCanvasElement, options?: { arenaBytes?: number; debug?: boolean }); readonly ready: Promise; createRows(options: { name: string; rows: number; stride: number; format: RowFormat }): Promise; createRowsBatch(rows: Array<{ name: string; rows: number; stride: number; format: RowFormat }>): Promise; deleteRows(name: string): Promise; allocateObject(name: string): Promise; deleteObject(name: string, id: number): Promise; compileGraph(serialized: string): Promise; switchLoadout(id: string): Promise; play(): Promise; pause(): Promise; setFps(fps: number): Promise; setProfiler(enabled: boolean): Promise; onProfile(listener: (frame: ProfileFrame) => void): () => void; array(name: string): SharedRows; dispose(): void; } } declare module "@yawn/handles" { import { SharedRows, YawnCore } from "@yawn/core"; export interface SceneOptions { arenaBytes?: number; debug?: boolean; fps?: number; hdr?: boolean } export class Scene { constructor(canvas: HTMLCanvasElement, options?: SceneOptions); readonly core: YawnCore; readonly ready: Promise; readonly hdr: boolean; array(name: string): SharedRows; ensureRows(name: string, rows: number, stride: number, format: "f32" | "u32" | "i32"): Promise; reserve(additional: { nodes?: number; materials?: number }): Promise; batchWrites(operation: () => T): T; batchGraphUpdates(operation: () => T | Promise): Promise; dispose(): void; } export interface Vector3View { x: number; y: number; z: number; set(values: ArrayLike): void } export interface RotorView extends Vector3View { w: number } export interface NodeOptions { position?: ArrayLike; rotor?: ArrayLike; scale?: ArrayLike } export class Node { constructor(scene: Scene, options?: NodeOptions); readonly scene: Scene; readonly ready: Promise; readonly id: number; readonly position: Vector3View; readonly rotor: RotorView; readonly scale: Vector3View; setPosition(value: ArrayLike): this; setRotor(value: ArrayLike): this; setScale(value: ArrayLike): this; translate(x: number, y: number, z: number): this; rotateX(radians: number): this; rotateY(radians: number): this; rotateZ(radians: number): this; dispose(): Promise; } export interface PBRMaterialOptions { baseColor?: ArrayLike; metallic?: number; roughness?: number; emissive?: ArrayLike; } export class PBRMaterial { constructor(scene: Scene, options?: PBRMaterialOptions); readonly ready: Promise; readonly id: number; metallic: number; roughness: number; readonly baseColor: { 0: number; 1: number; 2: number; 3: number }; dispose(): Promise; } export type VertexKind = "positions" | "normals" | "tangents" | "uvs" | "colors" | "indices"; export interface MeshOptions extends NodeOptions { geometryId?: number; material?: PBRMaterial; vertexData?: Partial>>; visible?: boolean; } export class Mesh extends Node { constructor(scene: Scene, options?: MeshOptions); geometryId: number; vertexCount: number; indexCount: number; isVisible: boolean; material: PBRMaterial; clone(options?: Omit): Mesh; setVertexData(kind: VertexKind, data: ArrayLike): Promise; setMaterialForFaces(material: PBRMaterial, faces: number | number[]): Promise; } export interface CameraOptions extends NodeOptions { fov?: number; near?: number; far?: number; aspect?: number } export class Camera extends Node { fov: number; near: number; far: number; aspect: number; } export class ArcRotateCamera extends Camera { constructor(scene: Scene, options?: CameraOptions & { target?: Node; alpha?: number; beta?: number; radius?: number; controls?: { element: HTMLElement; pointer?: boolean; controller?: boolean } }); alpha: number; beta: number; radius: number; } export class FreeCamera extends Camera { constructor(scene: Scene, options?: CameraOptions & { controls?: { element: HTMLElement; keyboard?: boolean; pointer?: boolean; controller?: boolean; speed?: number } }); } export class FollowCamera extends Camera { constructor(scene: Scene, options?: CameraOptions & { target?: Node; distance?: number; height?: number; smoothing?: number }); } export interface LightOptions extends NodeOptions { color?: ArrayLike; intensity?: number } export class PointLight extends Node { constructor(scene: Scene, options?: LightOptions & { range?: number }); intensity: number; range: number } export class AmbientLight extends Node { constructor(scene: Scene, options?: LightOptions); intensity: number } export class DirectionalLight extends Node { constructor(scene: Scene, options?: LightOptions); intensity: number } export class SpotLight extends Node { constructor(scene: Scene, options?: LightOptions & { range?: number; innerAngle?: number; outerAngle?: number }) } export class RectAreaLight extends Node { constructor(scene: Scene, options?: LightOptions & { width?: number; height?: number }) } export class ComputePass { constructor(options: Record); readonly id: string } export class FXAA { constructor(scene: Scene, options?: Record); readonly ready: Promise; dispose(): Promise } export class ColorGrading extends FXAA { constructor(scene: Scene, options?: { toneMap?: "aces" | "reinhard" | "linear"; amount?: number }) } export class DynamicExposure extends FXAA { constructor(scene: Scene, options?: { exposure?: number }) } export class SSAO extends FXAA { constructor(scene: Scene, options?: { amount?: number }) } export function importGltf(scene: Scene, url: string | URL): Promise; } declare const canvas: HTMLCanvasElement; declare function log(...values: unknown[]): void;