@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
JavaScript
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