UNPKG

@motion-core/motion-gpu

Version:

Framework-agnostic WebGPU runtime for fullscreen WGSL shaders with explicit Svelte, React, and Vue adapter entrypoints.

62 lines (61 loc) 2.21 kB
import { assertUniformName } from "./uniforms.js"; //#region src/lib/core/render-targets.ts /** * Asserts positive finite numeric input for render target options. */ function assertPositiveFinite(name, value) { if (!Number.isFinite(value) || value <= 0) throw new Error(`${name} must be a finite number greater than 0`); } /** * Resolves a render target dimension from explicit value or scaled canvas size. */ function resolveDimension(explicitValue, canvasDimension, scale) { if (explicitValue !== void 0) { assertPositiveFinite("RenderTarget dimension", explicitValue); return Math.max(1, Math.floor(explicitValue)); } return Math.max(1, Math.floor(canvasDimension * scale)); } /** * Resolves all render target definitions for a specific canvas size. * * @param definitions - Declarative definitions. * @param canvasWidth - Current canvas width in pixels. * @param canvasHeight - Current canvas height in pixels. * @param defaultFormat - Fallback texture format. * @returns Sorted concrete render target definitions. */ function resolveRenderTargetDefinitions(definitions, canvasWidth, canvasHeight, defaultFormat) { if (!definitions) return []; const keys = Object.keys(definitions).sort(); const resolved = []; for (const key of keys) { assertUniformName(key); const definition = definitions[key]; const scale = definition?.scale ?? 1; assertPositiveFinite("RenderTarget scale", scale); const width = resolveDimension(definition?.width, canvasWidth, scale); const height = resolveDimension(definition?.height, canvasHeight, scale); resolved.push({ key, width, height, format: definition?.format ?? defaultFormat }); } return resolved; } /** * Builds a deterministic signature used to detect render target topology changes. * * @param resolvedDefinitions - Concrete target definitions. * @returns Stable signature string. */ function buildRenderTargetSignature(resolvedDefinitions) { return resolvedDefinitions.map((definition) => { return `${definition.key}:${definition.format}:${definition.width}x${definition.height}`; }).join("|"); } //#endregion export { buildRenderTargetSignature, resolveRenderTargetDefinitions }; //# sourceMappingURL=render-targets.js.map