@motion-core/motion-gpu 0.4.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +99 -0
- package/dist/advanced.js +3 -1
- package/dist/core/advanced.js +3 -1
- package/dist/core/compute-bindgroup-cache.d.ts +13 -0
- package/dist/core/compute-bindgroup-cache.d.ts.map +1 -0
- package/dist/core/compute-bindgroup-cache.js +45 -0
- package/dist/core/compute-bindgroup-cache.js.map +1 -0
- package/dist/core/compute-shader.d.ts +135 -0
- package/dist/core/compute-shader.d.ts.map +1 -0
- package/dist/core/compute-shader.js +238 -0
- package/dist/core/compute-shader.js.map +1 -0
- package/dist/core/error-diagnostics.d.ts +8 -1
- package/dist/core/error-diagnostics.d.ts.map +1 -1
- package/dist/core/error-diagnostics.js +7 -3
- package/dist/core/error-diagnostics.js.map +1 -1
- package/dist/core/error-report.d.ts +1 -1
- package/dist/core/error-report.d.ts.map +1 -1
- package/dist/core/error-report.js +82 -1
- package/dist/core/error-report.js.map +1 -1
- package/dist/core/frame-registry.d.ts.map +1 -1
- package/dist/core/frame-registry.js +1 -1
- package/dist/core/frame-registry.js.map +1 -1
- package/dist/core/index.d.ts +5 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +3 -1
- package/dist/core/material-preprocess.d.ts.map +1 -1
- package/dist/core/material-preprocess.js +5 -3
- package/dist/core/material-preprocess.js.map +1 -1
- package/dist/core/material.d.ts +22 -6
- package/dist/core/material.d.ts.map +1 -1
- package/dist/core/material.js +32 -4
- package/dist/core/material.js.map +1 -1
- package/dist/core/render-graph.d.ts +7 -3
- package/dist/core/render-graph.d.ts.map +1 -1
- package/dist/core/render-graph.js +22 -6
- package/dist/core/render-graph.js.map +1 -1
- package/dist/core/renderer.d.ts.map +1 -1
- package/dist/core/renderer.js +489 -29
- package/dist/core/renderer.js.map +1 -1
- package/dist/core/runtime-loop.d.ts +2 -2
- package/dist/core/runtime-loop.d.ts.map +1 -1
- package/dist/core/runtime-loop.js +74 -14
- package/dist/core/runtime-loop.js.map +1 -1
- package/dist/core/shader.d.ts +16 -3
- package/dist/core/shader.d.ts.map +1 -1
- package/dist/core/shader.js +22 -2
- package/dist/core/shader.js.map +1 -1
- package/dist/core/storage-buffers.d.ts +37 -0
- package/dist/core/storage-buffers.d.ts.map +1 -0
- package/dist/core/storage-buffers.js +95 -0
- package/dist/core/storage-buffers.js.map +1 -0
- package/dist/core/texture-loader.d.ts.map +1 -1
- package/dist/core/texture-loader.js +4 -0
- package/dist/core/texture-loader.js.map +1 -1
- package/dist/core/textures.d.ts +16 -0
- package/dist/core/textures.d.ts.map +1 -1
- package/dist/core/textures.js +8 -2
- package/dist/core/textures.js.map +1 -1
- package/dist/core/types.d.ts +146 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/passes/ComputePass.d.ts +83 -0
- package/dist/passes/ComputePass.d.ts.map +1 -0
- package/dist/passes/ComputePass.js +92 -0
- package/dist/passes/ComputePass.js.map +1 -0
- package/dist/passes/PingPongComputePass.d.ts +104 -0
- package/dist/passes/PingPongComputePass.d.ts.map +1 -0
- package/dist/passes/PingPongComputePass.js +132 -0
- package/dist/passes/PingPongComputePass.js.map +1 -0
- package/dist/passes/ShaderPass.d.ts.map +1 -1
- package/dist/passes/ShaderPass.js +2 -1
- package/dist/passes/ShaderPass.js.map +1 -1
- package/dist/passes/index.d.ts +2 -0
- package/dist/passes/index.d.ts.map +1 -1
- package/dist/passes/index.js +3 -1
- package/dist/react/FragCanvas.d.ts +2 -2
- package/dist/react/FragCanvas.d.ts.map +1 -1
- package/dist/react/FragCanvas.js.map +1 -1
- package/dist/react/MotionGPUErrorOverlay.d.ts.map +1 -1
- package/dist/react/MotionGPUErrorOverlay.js +123 -20
- package/dist/react/MotionGPUErrorOverlay.js.map +1 -1
- package/dist/react/advanced.js +3 -1
- package/dist/react/index.d.ts +5 -2
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +3 -1
- package/dist/svelte/FragCanvas.svelte +2 -2
- package/dist/svelte/FragCanvas.svelte.d.ts +2 -2
- package/dist/svelte/FragCanvas.svelte.d.ts.map +1 -1
- package/dist/svelte/MotionGPUErrorOverlay.svelte +137 -7
- package/dist/svelte/MotionGPUErrorOverlay.svelte.d.ts.map +1 -1
- package/dist/svelte/advanced.js +3 -1
- package/dist/svelte/index.d.ts +5 -2
- package/dist/svelte/index.d.ts.map +1 -1
- package/dist/svelte/index.js +3 -1
- package/package.json +1 -1
- package/src/lib/core/compute-bindgroup-cache.ts +73 -0
- package/src/lib/core/compute-shader.ts +412 -0
- package/src/lib/core/error-diagnostics.ts +29 -4
- package/src/lib/core/error-report.ts +155 -1
- package/src/lib/core/frame-registry.ts +2 -1
- package/src/lib/core/index.ts +18 -1
- package/src/lib/core/material-preprocess.ts +17 -6
- package/src/lib/core/material.ts +103 -21
- package/src/lib/core/render-graph.ts +39 -9
- package/src/lib/core/renderer.ts +768 -48
- package/src/lib/core/runtime-loop.ts +116 -16
- package/src/lib/core/shader.ts +58 -4
- package/src/lib/core/storage-buffers.ts +142 -0
- package/src/lib/core/texture-loader.ts +6 -0
- package/src/lib/core/textures.ts +29 -2
- package/src/lib/core/types.ts +165 -4
- package/src/lib/passes/ComputePass.ts +136 -0
- package/src/lib/passes/PingPongComputePass.ts +180 -0
- package/src/lib/passes/ShaderPass.ts +2 -1
- package/src/lib/passes/index.ts +6 -0
- package/src/lib/react/FragCanvas.tsx +3 -3
- package/src/lib/react/MotionGPUErrorOverlay.tsx +137 -5
- package/src/lib/react/index.ts +18 -1
- package/src/lib/svelte/FragCanvas.svelte +2 -2
- package/src/lib/svelte/MotionGPUErrorOverlay.svelte +137 -7
- package/src/lib/svelte/index.ts +18 -1
|
@@ -175,6 +175,7 @@ async function loadTextureFromUrl(url, options = {}) {
|
|
|
175
175
|
bitmap.close();
|
|
176
176
|
throw createAbortError();
|
|
177
177
|
}
|
|
178
|
+
let disposed = false;
|
|
178
179
|
const loaded = {
|
|
179
180
|
url,
|
|
180
181
|
source: bitmap,
|
|
@@ -182,7 +183,10 @@ async function loadTextureFromUrl(url, options = {}) {
|
|
|
182
183
|
height: bitmap.height,
|
|
183
184
|
colorSpace: normalized.colorSpace,
|
|
184
185
|
dispose: () => {
|
|
186
|
+
if (disposed) return;
|
|
187
|
+
disposed = true;
|
|
185
188
|
bitmap?.close();
|
|
189
|
+
bitmap = null;
|
|
186
190
|
}
|
|
187
191
|
};
|
|
188
192
|
if (normalized.update !== void 0) loaded.update = normalized.update;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"texture-loader.js","names":[],"sources":["../../src/lib/core/texture-loader.ts"],"sourcesContent":["import type { TextureUpdateMode } from './types.js';\n\n/**\n * Options controlling bitmap decode behavior.\n */\nexport interface TextureDecodeOptions {\n\t/**\n\t * Controls color-space conversion during decode.\n\t */\n\tcolorSpaceConversion?: 'default' | 'none';\n\t/**\n\t * Controls alpha premultiplication during decode.\n\t */\n\tpremultiplyAlpha?: 'default' | 'none' | 'premultiply';\n\t/**\n\t * Controls bitmap orientation during decode.\n\t */\n\timageOrientation?: 'none' | 'flipY';\n}\n\n/**\n * Options controlling URL-based texture loading and decode behavior.\n */\nexport interface TextureLoadOptions {\n\t/**\n\t * Desired texture color space.\n\t */\n\tcolorSpace?: 'srgb' | 'linear';\n\t/**\n\t * Fetch options forwarded to `fetch`.\n\t */\n\trequestInit?: RequestInit;\n\t/**\n\t * Decode options forwarded to `createImageBitmap`.\n\t */\n\tdecode?: TextureDecodeOptions;\n\t/**\n\t * Optional cancellation signal for this request.\n\t */\n\tsignal?: AbortSignal;\n\t/**\n\t * Optional runtime update strategy metadata attached to loaded textures.\n\t */\n\tupdate?: TextureUpdateMode;\n\t/**\n\t * Optional runtime flip-y metadata attached to loaded textures.\n\t */\n\tflipY?: boolean;\n\t/**\n\t * Optional runtime premultiplied-alpha metadata attached to loaded textures.\n\t */\n\tpremultipliedAlpha?: boolean;\n\t/**\n\t * Optional runtime mipmap metadata attached to loaded textures.\n\t */\n\tgenerateMipmaps?: boolean;\n}\n\n/**\n * Loaded texture payload returned by URL loaders.\n */\nexport interface LoadedTexture {\n\t/**\n\t * Source URL.\n\t */\n\turl: string;\n\t/**\n\t * Decoded bitmap source.\n\t */\n\tsource: ImageBitmap;\n\t/**\n\t * Bitmap width in pixels.\n\t */\n\twidth: number;\n\t/**\n\t * Bitmap height in pixels.\n\t */\n\theight: number;\n\t/**\n\t * Effective color space.\n\t */\n\tcolorSpace: 'srgb' | 'linear';\n\t/**\n\t * Effective runtime update strategy.\n\t */\n\tupdate?: TextureUpdateMode;\n\t/**\n\t * Effective runtime flip-y metadata.\n\t */\n\tflipY?: boolean;\n\t/**\n\t * Effective runtime premultiplied-alpha metadata.\n\t */\n\tpremultipliedAlpha?: boolean;\n\t/**\n\t * Effective runtime mipmap metadata.\n\t */\n\tgenerateMipmaps?: boolean;\n\t/**\n\t * Releases bitmap resources.\n\t */\n\tdispose: () => void;\n}\n\ninterface NormalizedTextureLoadOptions {\n\tcolorSpace: 'srgb' | 'linear';\n\trequestInit?: RequestInit;\n\tdecode: Required<TextureDecodeOptions>;\n\tsignal?: AbortSignal;\n\tupdate?: TextureUpdateMode;\n\tflipY?: boolean;\n\tpremultipliedAlpha?: boolean;\n\tgenerateMipmaps?: boolean;\n}\n\ninterface TextureResourceCacheEntry {\n\tkey: string;\n\trefs: number;\n\tcontroller: AbortController;\n\tsettled: boolean;\n\tblobPromise: Promise<Blob>;\n}\n\nconst resourceCache = new Map<string, TextureResourceCacheEntry>();\n\nfunction createAbortError(): Error {\n\ttry {\n\t\treturn new DOMException('Texture request was aborted', 'AbortError');\n\t} catch {\n\t\tconst error = new Error('Texture request was aborted');\n\t\t(error as Error & { name: string }).name = 'AbortError';\n\t\treturn error;\n\t}\n}\n\n/**\n * Checks whether error represents abort cancellation.\n */\nexport function isAbortError(error: unknown): boolean {\n\treturn (\n\t\terror instanceof Error &&\n\t\t(error.name === 'AbortError' || error.message.toLowerCase().includes('aborted'))\n\t);\n}\n\nfunction toBodyFingerprint(body: BodyInit | null | undefined): string | null {\n\tif (body == null) {\n\t\treturn null;\n\t}\n\n\tif (typeof body === 'string') {\n\t\treturn `string:${body}`;\n\t}\n\n\tif (body instanceof URLSearchParams) {\n\t\treturn `urlsearchparams:${body.toString()}`;\n\t}\n\n\tif (typeof FormData !== 'undefined' && body instanceof FormData) {\n\t\tconst entries = Array.from(body.entries()).map(([key, value]) => `${key}:${String(value)}`);\n\t\treturn `formdata:${entries.join('&')}`;\n\t}\n\n\tif (body instanceof Blob) {\n\t\treturn `blob:${body.type}:${body.size}`;\n\t}\n\n\tif (body instanceof ArrayBuffer) {\n\t\treturn `arraybuffer:${body.byteLength}`;\n\t}\n\n\tif (ArrayBuffer.isView(body)) {\n\t\treturn `view:${body.byteLength}`;\n\t}\n\n\treturn `opaque:${Object.prototype.toString.call(body)}`;\n}\n\nfunction normalizeRequestInit(requestInit: RequestInit | undefined): Record<string, unknown> {\n\tif (!requestInit) {\n\t\treturn {};\n\t}\n\n\tconst headers = new Headers(requestInit.headers);\n\tconst headerEntries = Array.from(headers.entries()).sort(([a], [b]) => a.localeCompare(b));\n\tconst normalized: Record<string, unknown> = {};\n\n\tnormalized.method = (requestInit.method ?? 'GET').toUpperCase();\n\tnormalized.mode = requestInit.mode ?? null;\n\tnormalized.cache = requestInit.cache ?? null;\n\tnormalized.credentials = requestInit.credentials ?? null;\n\tnormalized.redirect = requestInit.redirect ?? null;\n\tnormalized.referrer = requestInit.referrer ?? null;\n\tnormalized.referrerPolicy = requestInit.referrerPolicy ?? null;\n\tnormalized.integrity = requestInit.integrity ?? null;\n\tnormalized.keepalive = requestInit.keepalive ?? false;\n\tnormalized.priority = requestInit.priority ?? null;\n\tnormalized.headers = headerEntries;\n\tnormalized.body = toBodyFingerprint(requestInit.body);\n\n\treturn normalized;\n}\n\nfunction normalizeTextureLoadOptions(options: TextureLoadOptions): NormalizedTextureLoadOptions {\n\tconst colorSpace = options.colorSpace ?? 'srgb';\n\n\tconst normalized: NormalizedTextureLoadOptions = {\n\t\tcolorSpace,\n\t\tdecode: {\n\t\t\tcolorSpaceConversion:\n\t\t\t\toptions.decode?.colorSpaceConversion ?? (colorSpace === 'linear' ? 'none' : 'default'),\n\t\t\tpremultiplyAlpha: options.decode?.premultiplyAlpha ?? 'default',\n\t\t\timageOrientation: options.decode?.imageOrientation ?? 'none'\n\t\t}\n\t};\n\n\tif (options.requestInit !== undefined) {\n\t\tnormalized.requestInit = options.requestInit;\n\t}\n\tif (options.signal !== undefined) {\n\t\tnormalized.signal = options.signal;\n\t}\n\tif (options.update !== undefined) {\n\t\tnormalized.update = options.update;\n\t}\n\tif (options.flipY !== undefined) {\n\t\tnormalized.flipY = options.flipY;\n\t}\n\tif (options.premultipliedAlpha !== undefined) {\n\t\tnormalized.premultipliedAlpha = options.premultipliedAlpha;\n\t}\n\tif (options.generateMipmaps !== undefined) {\n\t\tnormalized.generateMipmaps = options.generateMipmaps;\n\t}\n\n\treturn normalized;\n}\n\n/**\n * Builds deterministic resource cache key from full URL IO config.\n */\nexport function buildTextureResourceCacheKey(\n\turl: string,\n\toptions: TextureLoadOptions = {}\n): string {\n\tconst normalized = normalizeTextureLoadOptions(options);\n\treturn JSON.stringify({\n\t\turl,\n\t\tcolorSpace: normalized.colorSpace,\n\t\trequestInit: normalizeRequestInit(normalized.requestInit),\n\t\tdecode: normalized.decode\n\t});\n}\n\n/**\n * Clears the internal texture resource cache.\n */\nexport function clearTextureBlobCache(): void {\n\tfor (const entry of resourceCache.values()) {\n\t\tif (!entry.settled) {\n\t\t\tentry.controller.abort();\n\t\t}\n\t}\n\tresourceCache.clear();\n}\n\nfunction acquireTextureBlob(\n\turl: string,\n\toptions: TextureLoadOptions\n): {\n\tentry: TextureResourceCacheEntry;\n\trelease: () => void;\n} {\n\tconst key = buildTextureResourceCacheKey(url, options);\n\tconst existing = resourceCache.get(key);\n\tif (existing) {\n\t\texisting.refs += 1;\n\t\tlet released = false;\n\t\treturn {\n\t\t\tentry: existing,\n\t\t\trelease: () => {\n\t\t\t\tif (released) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treleased = true;\n\t\t\t\texisting.refs = Math.max(0, existing.refs - 1);\n\t\t\t\tif (existing.refs === 0) {\n\t\t\t\t\tif (!existing.settled) {\n\t\t\t\t\t\texisting.controller.abort();\n\t\t\t\t\t}\n\t\t\t\t\tresourceCache.delete(key);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\tconst normalized = normalizeTextureLoadOptions(options);\n\tconst controller = new AbortController();\n\tconst requestInit = {\n\t\t...(normalized.requestInit ?? {}),\n\t\tsignal: controller.signal\n\t} satisfies RequestInit;\n\tconst entry: TextureResourceCacheEntry = {\n\t\tkey,\n\t\trefs: 1,\n\t\tcontroller,\n\t\tsettled: false,\n\t\tblobPromise: fetch(url, requestInit)\n\t\t\t.then(async (response) => {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new Error(`Texture request failed (${response.status}) for ${url}`);\n\t\t\t\t}\n\t\t\t\treturn response.blob();\n\t\t\t})\n\t\t\t.then((blob) => {\n\t\t\t\tentry.settled = true;\n\t\t\t\treturn blob;\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tresourceCache.delete(key);\n\t\t\t\tthrow error;\n\t\t\t})\n\t};\n\n\tresourceCache.set(key, entry);\n\tlet released = false;\n\treturn {\n\t\tentry,\n\t\trelease: () => {\n\t\t\tif (released) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treleased = true;\n\t\t\tentry.refs = Math.max(0, entry.refs - 1);\n\t\t\tif (entry.refs === 0) {\n\t\t\t\tif (!entry.settled) {\n\t\t\t\t\tentry.controller.abort();\n\t\t\t\t}\n\t\t\t\tresourceCache.delete(key);\n\t\t\t}\n\t\t}\n\t};\n}\n\nasync function awaitWithAbort<T>(promise: Promise<T>, signal: AbortSignal | undefined): Promise<T> {\n\tif (!signal) {\n\t\treturn promise;\n\t}\n\n\tif (signal.aborted) {\n\t\tthrow createAbortError();\n\t}\n\n\treturn new Promise<T>((resolve, reject) => {\n\t\tconst onAbort = (): void => {\n\t\t\treject(createAbortError());\n\t\t};\n\n\t\tsignal.addEventListener('abort', onAbort, { once: true });\n\n\t\tpromise.then(resolve, reject).finally(() => {\n\t\t\tsignal.removeEventListener('abort', onAbort);\n\t\t});\n\t});\n}\n\n/**\n * Loads a single texture from URL and converts it to an `ImageBitmap`.\n *\n * @param url - Texture URL.\n * @param options - Loading options.\n * @returns Loaded texture object.\n * @throws {Error} When runtime does not support `createImageBitmap` or request fails.\n */\nexport async function loadTextureFromUrl(\n\turl: string,\n\toptions: TextureLoadOptions = {}\n): Promise<LoadedTexture> {\n\tif (typeof createImageBitmap !== 'function') {\n\t\tthrow new Error('createImageBitmap is not available in this runtime');\n\t}\n\n\tconst normalized = normalizeTextureLoadOptions(options);\n\tconst { entry, release } = acquireTextureBlob(url, options);\n\tlet bitmap: ImageBitmap | null = null;\n\n\ttry {\n\t\tconst blob = await awaitWithAbort(entry.blobPromise, normalized.signal);\n\n\t\tconst bitmapOptions: ImageBitmapOptions = {\n\t\t\tcolorSpaceConversion: normalized.decode.colorSpaceConversion,\n\t\t\tpremultiplyAlpha: normalized.decode.premultiplyAlpha,\n\t\t\timageOrientation: normalized.decode.imageOrientation\n\t\t};\n\t\tconst allDefaults =\n\t\t\tbitmapOptions.colorSpaceConversion === 'default' &&\n\t\t\tbitmapOptions.premultiplyAlpha === 'default' &&\n\t\t\tbitmapOptions.imageOrientation === 'none';\n\n\t\tbitmap = allDefaults\n\t\t\t? await createImageBitmap(blob)\n\t\t\t: await createImageBitmap(blob, bitmapOptions);\n\n\t\tif (normalized.signal?.aborted) {\n\t\t\tbitmap.close();\n\t\t\tthrow createAbortError();\n\t\t}\n\n\t\tconst loaded: LoadedTexture = {\n\t\t\turl,\n\t\t\tsource: bitmap,\n\t\t\twidth: bitmap.width,\n\t\t\theight: bitmap.height,\n\t\t\tcolorSpace: normalized.colorSpace,\n\t\t\tdispose: () => {\n\t\t\t\tbitmap?.close();\n\t\t\t}\n\t\t};\n\n\t\tif (normalized.update !== undefined) {\n\t\t\tloaded.update = normalized.update;\n\t\t}\n\t\tif (normalized.flipY !== undefined) {\n\t\t\tloaded.flipY = normalized.flipY;\n\t\t}\n\t\tif (normalized.premultipliedAlpha !== undefined) {\n\t\t\tloaded.premultipliedAlpha = normalized.premultipliedAlpha;\n\t\t}\n\t\tif (normalized.generateMipmaps !== undefined) {\n\t\t\tloaded.generateMipmaps = normalized.generateMipmaps;\n\t\t}\n\n\t\treturn loaded;\n\t} catch (error) {\n\t\tif (bitmap) {\n\t\t\tbitmap.close();\n\t\t}\n\t\tthrow error;\n\t} finally {\n\t\trelease();\n\t}\n}\n\n/**\n * Loads many textures in parallel from URLs.\n *\n * @param urls - Texture URLs.\n * @param options - Shared loading options.\n * @returns Promise resolving to loaded textures in input order.\n */\nexport async function loadTexturesFromUrls(\n\turls: string[],\n\toptions: TextureLoadOptions = {}\n): Promise<LoadedTexture[]> {\n\tconst settled = await Promise.allSettled(urls.map((url) => loadTextureFromUrl(url, options)));\n\tconst loaded: LoadedTexture[] = [];\n\tlet firstError: unknown = null;\n\n\tfor (const entry of settled) {\n\t\tif (entry.status === 'fulfilled') {\n\t\t\tloaded.push(entry.value);\n\t\t\tcontinue;\n\t\t}\n\n\t\tfirstError ??= entry.reason;\n\t}\n\n\tif (firstError) {\n\t\tfor (const texture of loaded) {\n\t\t\ttexture.dispose();\n\t\t}\n\t\tthrow firstError;\n\t}\n\n\treturn loaded;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"texture-loader.js","names":[],"sources":["../../src/lib/core/texture-loader.ts"],"sourcesContent":["import type { TextureUpdateMode } from './types.js';\n\n/**\n * Options controlling bitmap decode behavior.\n */\nexport interface TextureDecodeOptions {\n\t/**\n\t * Controls color-space conversion during decode.\n\t */\n\tcolorSpaceConversion?: 'default' | 'none';\n\t/**\n\t * Controls alpha premultiplication during decode.\n\t */\n\tpremultiplyAlpha?: 'default' | 'none' | 'premultiply';\n\t/**\n\t * Controls bitmap orientation during decode.\n\t */\n\timageOrientation?: 'none' | 'flipY';\n}\n\n/**\n * Options controlling URL-based texture loading and decode behavior.\n */\nexport interface TextureLoadOptions {\n\t/**\n\t * Desired texture color space.\n\t */\n\tcolorSpace?: 'srgb' | 'linear';\n\t/**\n\t * Fetch options forwarded to `fetch`.\n\t */\n\trequestInit?: RequestInit;\n\t/**\n\t * Decode options forwarded to `createImageBitmap`.\n\t */\n\tdecode?: TextureDecodeOptions;\n\t/**\n\t * Optional cancellation signal for this request.\n\t */\n\tsignal?: AbortSignal;\n\t/**\n\t * Optional runtime update strategy metadata attached to loaded textures.\n\t */\n\tupdate?: TextureUpdateMode;\n\t/**\n\t * Optional runtime flip-y metadata attached to loaded textures.\n\t */\n\tflipY?: boolean;\n\t/**\n\t * Optional runtime premultiplied-alpha metadata attached to loaded textures.\n\t */\n\tpremultipliedAlpha?: boolean;\n\t/**\n\t * Optional runtime mipmap metadata attached to loaded textures.\n\t */\n\tgenerateMipmaps?: boolean;\n}\n\n/**\n * Loaded texture payload returned by URL loaders.\n */\nexport interface LoadedTexture {\n\t/**\n\t * Source URL.\n\t */\n\turl: string;\n\t/**\n\t * Decoded bitmap source.\n\t */\n\tsource: ImageBitmap;\n\t/**\n\t * Bitmap width in pixels.\n\t */\n\twidth: number;\n\t/**\n\t * Bitmap height in pixels.\n\t */\n\theight: number;\n\t/**\n\t * Effective color space.\n\t */\n\tcolorSpace: 'srgb' | 'linear';\n\t/**\n\t * Effective runtime update strategy.\n\t */\n\tupdate?: TextureUpdateMode;\n\t/**\n\t * Effective runtime flip-y metadata.\n\t */\n\tflipY?: boolean;\n\t/**\n\t * Effective runtime premultiplied-alpha metadata.\n\t */\n\tpremultipliedAlpha?: boolean;\n\t/**\n\t * Effective runtime mipmap metadata.\n\t */\n\tgenerateMipmaps?: boolean;\n\t/**\n\t * Releases bitmap resources.\n\t */\n\tdispose: () => void;\n}\n\ninterface NormalizedTextureLoadOptions {\n\tcolorSpace: 'srgb' | 'linear';\n\trequestInit?: RequestInit;\n\tdecode: Required<TextureDecodeOptions>;\n\tsignal?: AbortSignal;\n\tupdate?: TextureUpdateMode;\n\tflipY?: boolean;\n\tpremultipliedAlpha?: boolean;\n\tgenerateMipmaps?: boolean;\n}\n\ninterface TextureResourceCacheEntry {\n\tkey: string;\n\trefs: number;\n\tcontroller: AbortController;\n\tsettled: boolean;\n\tblobPromise: Promise<Blob>;\n}\n\nconst resourceCache = new Map<string, TextureResourceCacheEntry>();\n\nfunction createAbortError(): Error {\n\ttry {\n\t\treturn new DOMException('Texture request was aborted', 'AbortError');\n\t} catch {\n\t\tconst error = new Error('Texture request was aborted');\n\t\t(error as Error & { name: string }).name = 'AbortError';\n\t\treturn error;\n\t}\n}\n\n/**\n * Checks whether error represents abort cancellation.\n */\nexport function isAbortError(error: unknown): boolean {\n\treturn (\n\t\terror instanceof Error &&\n\t\t(error.name === 'AbortError' || error.message.toLowerCase().includes('aborted'))\n\t);\n}\n\nfunction toBodyFingerprint(body: BodyInit | null | undefined): string | null {\n\tif (body == null) {\n\t\treturn null;\n\t}\n\n\tif (typeof body === 'string') {\n\t\treturn `string:${body}`;\n\t}\n\n\tif (body instanceof URLSearchParams) {\n\t\treturn `urlsearchparams:${body.toString()}`;\n\t}\n\n\tif (typeof FormData !== 'undefined' && body instanceof FormData) {\n\t\tconst entries = Array.from(body.entries()).map(([key, value]) => `${key}:${String(value)}`);\n\t\treturn `formdata:${entries.join('&')}`;\n\t}\n\n\tif (body instanceof Blob) {\n\t\treturn `blob:${body.type}:${body.size}`;\n\t}\n\n\tif (body instanceof ArrayBuffer) {\n\t\treturn `arraybuffer:${body.byteLength}`;\n\t}\n\n\tif (ArrayBuffer.isView(body)) {\n\t\treturn `view:${body.byteLength}`;\n\t}\n\n\treturn `opaque:${Object.prototype.toString.call(body)}`;\n}\n\nfunction normalizeRequestInit(requestInit: RequestInit | undefined): Record<string, unknown> {\n\tif (!requestInit) {\n\t\treturn {};\n\t}\n\n\tconst headers = new Headers(requestInit.headers);\n\tconst headerEntries = Array.from(headers.entries()).sort(([a], [b]) => a.localeCompare(b));\n\tconst normalized: Record<string, unknown> = {};\n\n\tnormalized.method = (requestInit.method ?? 'GET').toUpperCase();\n\tnormalized.mode = requestInit.mode ?? null;\n\tnormalized.cache = requestInit.cache ?? null;\n\tnormalized.credentials = requestInit.credentials ?? null;\n\tnormalized.redirect = requestInit.redirect ?? null;\n\tnormalized.referrer = requestInit.referrer ?? null;\n\tnormalized.referrerPolicy = requestInit.referrerPolicy ?? null;\n\tnormalized.integrity = requestInit.integrity ?? null;\n\tnormalized.keepalive = requestInit.keepalive ?? false;\n\tnormalized.priority = requestInit.priority ?? null;\n\tnormalized.headers = headerEntries;\n\tnormalized.body = toBodyFingerprint(requestInit.body);\n\n\treturn normalized;\n}\n\nfunction normalizeTextureLoadOptions(options: TextureLoadOptions): NormalizedTextureLoadOptions {\n\tconst colorSpace = options.colorSpace ?? 'srgb';\n\n\tconst normalized: NormalizedTextureLoadOptions = {\n\t\tcolorSpace,\n\t\tdecode: {\n\t\t\tcolorSpaceConversion:\n\t\t\t\toptions.decode?.colorSpaceConversion ?? (colorSpace === 'linear' ? 'none' : 'default'),\n\t\t\tpremultiplyAlpha: options.decode?.premultiplyAlpha ?? 'default',\n\t\t\timageOrientation: options.decode?.imageOrientation ?? 'none'\n\t\t}\n\t};\n\n\tif (options.requestInit !== undefined) {\n\t\tnormalized.requestInit = options.requestInit;\n\t}\n\tif (options.signal !== undefined) {\n\t\tnormalized.signal = options.signal;\n\t}\n\tif (options.update !== undefined) {\n\t\tnormalized.update = options.update;\n\t}\n\tif (options.flipY !== undefined) {\n\t\tnormalized.flipY = options.flipY;\n\t}\n\tif (options.premultipliedAlpha !== undefined) {\n\t\tnormalized.premultipliedAlpha = options.premultipliedAlpha;\n\t}\n\tif (options.generateMipmaps !== undefined) {\n\t\tnormalized.generateMipmaps = options.generateMipmaps;\n\t}\n\n\treturn normalized;\n}\n\n/**\n * Builds deterministic resource cache key from full URL IO config.\n */\nexport function buildTextureResourceCacheKey(\n\turl: string,\n\toptions: TextureLoadOptions = {}\n): string {\n\tconst normalized = normalizeTextureLoadOptions(options);\n\treturn JSON.stringify({\n\t\turl,\n\t\tcolorSpace: normalized.colorSpace,\n\t\trequestInit: normalizeRequestInit(normalized.requestInit),\n\t\tdecode: normalized.decode\n\t});\n}\n\n/**\n * Clears the internal texture resource cache.\n */\nexport function clearTextureBlobCache(): void {\n\tfor (const entry of resourceCache.values()) {\n\t\tif (!entry.settled) {\n\t\t\tentry.controller.abort();\n\t\t}\n\t}\n\tresourceCache.clear();\n}\n\nfunction acquireTextureBlob(\n\turl: string,\n\toptions: TextureLoadOptions\n): {\n\tentry: TextureResourceCacheEntry;\n\trelease: () => void;\n} {\n\tconst key = buildTextureResourceCacheKey(url, options);\n\tconst existing = resourceCache.get(key);\n\tif (existing) {\n\t\texisting.refs += 1;\n\t\tlet released = false;\n\t\treturn {\n\t\t\tentry: existing,\n\t\t\trelease: () => {\n\t\t\t\tif (released) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treleased = true;\n\t\t\t\texisting.refs = Math.max(0, existing.refs - 1);\n\t\t\t\tif (existing.refs === 0) {\n\t\t\t\t\tif (!existing.settled) {\n\t\t\t\t\t\texisting.controller.abort();\n\t\t\t\t\t}\n\t\t\t\t\tresourceCache.delete(key);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\tconst normalized = normalizeTextureLoadOptions(options);\n\tconst controller = new AbortController();\n\tconst requestInit = {\n\t\t...(normalized.requestInit ?? {}),\n\t\tsignal: controller.signal\n\t} satisfies RequestInit;\n\tconst entry: TextureResourceCacheEntry = {\n\t\tkey,\n\t\trefs: 1,\n\t\tcontroller,\n\t\tsettled: false,\n\t\tblobPromise: fetch(url, requestInit)\n\t\t\t.then(async (response) => {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new Error(`Texture request failed (${response.status}) for ${url}`);\n\t\t\t\t}\n\t\t\t\treturn response.blob();\n\t\t\t})\n\t\t\t.then((blob) => {\n\t\t\t\tentry.settled = true;\n\t\t\t\treturn blob;\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tresourceCache.delete(key);\n\t\t\t\tthrow error;\n\t\t\t})\n\t};\n\n\tresourceCache.set(key, entry);\n\tlet released = false;\n\treturn {\n\t\tentry,\n\t\trelease: () => {\n\t\t\tif (released) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treleased = true;\n\t\t\tentry.refs = Math.max(0, entry.refs - 1);\n\t\t\tif (entry.refs === 0) {\n\t\t\t\tif (!entry.settled) {\n\t\t\t\t\tentry.controller.abort();\n\t\t\t\t}\n\t\t\t\tresourceCache.delete(key);\n\t\t\t}\n\t\t}\n\t};\n}\n\nasync function awaitWithAbort<T>(promise: Promise<T>, signal: AbortSignal | undefined): Promise<T> {\n\tif (!signal) {\n\t\treturn promise;\n\t}\n\n\tif (signal.aborted) {\n\t\tthrow createAbortError();\n\t}\n\n\treturn new Promise<T>((resolve, reject) => {\n\t\tconst onAbort = (): void => {\n\t\t\treject(createAbortError());\n\t\t};\n\n\t\tsignal.addEventListener('abort', onAbort, { once: true });\n\n\t\tpromise.then(resolve, reject).finally(() => {\n\t\t\tsignal.removeEventListener('abort', onAbort);\n\t\t});\n\t});\n}\n\n/**\n * Loads a single texture from URL and converts it to an `ImageBitmap`.\n *\n * @param url - Texture URL.\n * @param options - Loading options.\n * @returns Loaded texture object.\n * @throws {Error} When runtime does not support `createImageBitmap` or request fails.\n */\nexport async function loadTextureFromUrl(\n\turl: string,\n\toptions: TextureLoadOptions = {}\n): Promise<LoadedTexture> {\n\tif (typeof createImageBitmap !== 'function') {\n\t\tthrow new Error('createImageBitmap is not available in this runtime');\n\t}\n\n\tconst normalized = normalizeTextureLoadOptions(options);\n\tconst { entry, release } = acquireTextureBlob(url, options);\n\tlet bitmap: ImageBitmap | null = null;\n\n\ttry {\n\t\tconst blob = await awaitWithAbort(entry.blobPromise, normalized.signal);\n\n\t\tconst bitmapOptions: ImageBitmapOptions = {\n\t\t\tcolorSpaceConversion: normalized.decode.colorSpaceConversion,\n\t\t\tpremultiplyAlpha: normalized.decode.premultiplyAlpha,\n\t\t\timageOrientation: normalized.decode.imageOrientation\n\t\t};\n\t\tconst allDefaults =\n\t\t\tbitmapOptions.colorSpaceConversion === 'default' &&\n\t\t\tbitmapOptions.premultiplyAlpha === 'default' &&\n\t\t\tbitmapOptions.imageOrientation === 'none';\n\n\t\tbitmap = allDefaults\n\t\t\t? await createImageBitmap(blob)\n\t\t\t: await createImageBitmap(blob, bitmapOptions);\n\n\t\tif (normalized.signal?.aborted) {\n\t\t\tbitmap.close();\n\t\t\tthrow createAbortError();\n\t\t}\n\n\t\tlet disposed = false;\n\t\tconst loaded: LoadedTexture = {\n\t\t\turl,\n\t\t\tsource: bitmap,\n\t\t\twidth: bitmap.width,\n\t\t\theight: bitmap.height,\n\t\t\tcolorSpace: normalized.colorSpace,\n\t\t\tdispose: () => {\n\t\t\t\tif (disposed) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tdisposed = true;\n\t\t\t\tbitmap?.close();\n\t\t\t\tbitmap = null;\n\t\t\t}\n\t\t};\n\n\t\tif (normalized.update !== undefined) {\n\t\t\tloaded.update = normalized.update;\n\t\t}\n\t\tif (normalized.flipY !== undefined) {\n\t\t\tloaded.flipY = normalized.flipY;\n\t\t}\n\t\tif (normalized.premultipliedAlpha !== undefined) {\n\t\t\tloaded.premultipliedAlpha = normalized.premultipliedAlpha;\n\t\t}\n\t\tif (normalized.generateMipmaps !== undefined) {\n\t\t\tloaded.generateMipmaps = normalized.generateMipmaps;\n\t\t}\n\n\t\treturn loaded;\n\t} catch (error) {\n\t\tif (bitmap) {\n\t\t\tbitmap.close();\n\t\t}\n\t\tthrow error;\n\t} finally {\n\t\trelease();\n\t}\n}\n\n/**\n * Loads many textures in parallel from URLs.\n *\n * @param urls - Texture URLs.\n * @param options - Shared loading options.\n * @returns Promise resolving to loaded textures in input order.\n */\nexport async function loadTexturesFromUrls(\n\turls: string[],\n\toptions: TextureLoadOptions = {}\n): Promise<LoadedTexture[]> {\n\tconst settled = await Promise.allSettled(urls.map((url) => loadTextureFromUrl(url, options)));\n\tconst loaded: LoadedTexture[] = [];\n\tlet firstError: unknown = null;\n\n\tfor (const entry of settled) {\n\t\tif (entry.status === 'fulfilled') {\n\t\t\tloaded.push(entry.value);\n\t\t\tcontinue;\n\t\t}\n\n\t\tfirstError ??= entry.reason;\n\t}\n\n\tif (firstError) {\n\t\tfor (const texture of loaded) {\n\t\t\ttexture.dispose();\n\t\t}\n\t\tthrow firstError;\n\t}\n\n\treturn loaded;\n}\n"],"mappings":";AA2HA,IAAM,gCAAgB,IAAI,KAAwC;AAElE,SAAS,mBAA0B;AAClC,KAAI;AACH,SAAO,IAAI,aAAa,+BAA+B,aAAa;SAC7D;EACP,MAAM,wBAAQ,IAAI,MAAM,8BAA8B;AACrD,QAAmC,OAAO;AAC3C,SAAO;;;;;;AAOT,SAAgB,aAAa,OAAyB;AACrD,QACC,iBAAiB,UAChB,MAAM,SAAS,gBAAgB,MAAM,QAAQ,aAAa,CAAC,SAAS,UAAU;;AAIjF,SAAS,kBAAkB,MAAkD;AAC5E,KAAI,QAAQ,KACX,QAAO;AAGR,KAAI,OAAO,SAAS,SACnB,QAAO,UAAU;AAGlB,KAAI,gBAAgB,gBACnB,QAAO,mBAAmB,KAAK,UAAU;AAG1C,KAAI,OAAO,aAAa,eAAe,gBAAgB,SAEtD,QAAO,YADS,MAAM,KAAK,KAAK,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,GAAG,OAAO,MAAM,GAAG,CAChE,KAAK,IAAI;AAGrC,KAAI,gBAAgB,KACnB,QAAO,QAAQ,KAAK,KAAK,GAAG,KAAK;AAGlC,KAAI,gBAAgB,YACnB,QAAO,eAAe,KAAK;AAG5B,KAAI,YAAY,OAAO,KAAK,CAC3B,QAAO,QAAQ,KAAK;AAGrB,QAAO,UAAU,OAAO,UAAU,SAAS,KAAK,KAAK;;AAGtD,SAAS,qBAAqB,aAA+D;AAC5F,KAAI,CAAC,YACJ,QAAO,EAAE;CAGV,MAAM,UAAU,IAAI,QAAQ,YAAY,QAAQ;CAChD,MAAM,gBAAgB,MAAM,KAAK,QAAQ,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC;CAC1F,MAAM,aAAsC,EAAE;AAE9C,YAAW,UAAU,YAAY,UAAU,OAAO,aAAa;AAC/D,YAAW,OAAO,YAAY,QAAQ;AACtC,YAAW,QAAQ,YAAY,SAAS;AACxC,YAAW,cAAc,YAAY,eAAe;AACpD,YAAW,WAAW,YAAY,YAAY;AAC9C,YAAW,WAAW,YAAY,YAAY;AAC9C,YAAW,iBAAiB,YAAY,kBAAkB;AAC1D,YAAW,YAAY,YAAY,aAAa;AAChD,YAAW,YAAY,YAAY,aAAa;AAChD,YAAW,WAAW,YAAY,YAAY;AAC9C,YAAW,UAAU;AACrB,YAAW,OAAO,kBAAkB,YAAY,KAAK;AAErD,QAAO;;AAGR,SAAS,4BAA4B,SAA2D;CAC/F,MAAM,aAAa,QAAQ,cAAc;CAEzC,MAAM,aAA2C;EAChD;EACA,QAAQ;GACP,sBACC,QAAQ,QAAQ,yBAAyB,eAAe,WAAW,SAAS;GAC7E,kBAAkB,QAAQ,QAAQ,oBAAoB;GACtD,kBAAkB,QAAQ,QAAQ,oBAAoB;GACtD;EACD;AAED,KAAI,QAAQ,gBAAgB,OAC3B,YAAW,cAAc,QAAQ;AAElC,KAAI,QAAQ,WAAW,OACtB,YAAW,SAAS,QAAQ;AAE7B,KAAI,QAAQ,WAAW,OACtB,YAAW,SAAS,QAAQ;AAE7B,KAAI,QAAQ,UAAU,OACrB,YAAW,QAAQ,QAAQ;AAE5B,KAAI,QAAQ,uBAAuB,OAClC,YAAW,qBAAqB,QAAQ;AAEzC,KAAI,QAAQ,oBAAoB,OAC/B,YAAW,kBAAkB,QAAQ;AAGtC,QAAO;;;;;AAMR,SAAgB,6BACf,KACA,UAA8B,EAAE,EACvB;CACT,MAAM,aAAa,4BAA4B,QAAQ;AACvD,QAAO,KAAK,UAAU;EACrB;EACA,YAAY,WAAW;EACvB,aAAa,qBAAqB,WAAW,YAAY;EACzD,QAAQ,WAAW;EACnB,CAAC;;;;;AAMH,SAAgB,wBAA8B;AAC7C,MAAK,MAAM,SAAS,cAAc,QAAQ,CACzC,KAAI,CAAC,MAAM,QACV,OAAM,WAAW,OAAO;AAG1B,eAAc,OAAO;;AAGtB,SAAS,mBACR,KACA,SAIC;CACD,MAAM,MAAM,6BAA6B,KAAK,QAAQ;CACtD,MAAM,WAAW,cAAc,IAAI,IAAI;AACvC,KAAI,UAAU;AACb,WAAS,QAAQ;EACjB,IAAI,WAAW;AACf,SAAO;GACN,OAAO;GACP,eAAe;AACd,QAAI,SACH;AAED,eAAW;AACX,aAAS,OAAO,KAAK,IAAI,GAAG,SAAS,OAAO,EAAE;AAC9C,QAAI,SAAS,SAAS,GAAG;AACxB,SAAI,CAAC,SAAS,QACb,UAAS,WAAW,OAAO;AAE5B,mBAAc,OAAO,IAAI;;;GAG3B;;CAGF,MAAM,aAAa,4BAA4B,QAAQ;CACvD,MAAM,aAAa,IAAI,iBAAiB;CACxC,MAAM,cAAc;EACnB,GAAI,WAAW,eAAe,EAAE;EAChC,QAAQ,WAAW;EACnB;CACD,MAAM,QAAmC;EACxC;EACA,MAAM;EACN;EACA,SAAS;EACT,aAAa,MAAM,KAAK,YAAY,CAClC,KAAK,OAAO,aAAa;AACzB,OAAI,CAAC,SAAS,GACb,OAAM,IAAI,MAAM,2BAA2B,SAAS,OAAO,QAAQ,MAAM;AAE1E,UAAO,SAAS,MAAM;IACrB,CACD,MAAM,SAAS;AACf,SAAM,UAAU;AAChB,UAAO;IACN,CACD,OAAO,UAAU;AACjB,iBAAc,OAAO,IAAI;AACzB,SAAM;IACL;EACH;AAED,eAAc,IAAI,KAAK,MAAM;CAC7B,IAAI,WAAW;AACf,QAAO;EACN;EACA,eAAe;AACd,OAAI,SACH;AAED,cAAW;AACX,SAAM,OAAO,KAAK,IAAI,GAAG,MAAM,OAAO,EAAE;AACxC,OAAI,MAAM,SAAS,GAAG;AACrB,QAAI,CAAC,MAAM,QACV,OAAM,WAAW,OAAO;AAEzB,kBAAc,OAAO,IAAI;;;EAG3B;;AAGF,eAAe,eAAkB,SAAqB,QAA6C;AAClG,KAAI,CAAC,OACJ,QAAO;AAGR,KAAI,OAAO,QACV,OAAM,kBAAkB;AAGzB,QAAO,IAAI,SAAY,SAAS,WAAW;EAC1C,MAAM,gBAAsB;AAC3B,UAAO,kBAAkB,CAAC;;AAG3B,SAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,MAAM,CAAC;AAEzD,UAAQ,KAAK,SAAS,OAAO,CAAC,cAAc;AAC3C,UAAO,oBAAoB,SAAS,QAAQ;IAC3C;GACD;;;;;;;;;;AAWH,eAAsB,mBACrB,KACA,UAA8B,EAAE,EACP;AACzB,KAAI,OAAO,sBAAsB,WAChC,OAAM,IAAI,MAAM,qDAAqD;CAGtE,MAAM,aAAa,4BAA4B,QAAQ;CACvD,MAAM,EAAE,OAAO,YAAY,mBAAmB,KAAK,QAAQ;CAC3D,IAAI,SAA6B;AAEjC,KAAI;EACH,MAAM,OAAO,MAAM,eAAe,MAAM,aAAa,WAAW,OAAO;EAEvE,MAAM,gBAAoC;GACzC,sBAAsB,WAAW,OAAO;GACxC,kBAAkB,WAAW,OAAO;GACpC,kBAAkB,WAAW,OAAO;GACpC;AAMD,WAJC,cAAc,yBAAyB,aACvC,cAAc,qBAAqB,aACnC,cAAc,qBAAqB,SAGjC,MAAM,kBAAkB,KAAK,GAC7B,MAAM,kBAAkB,MAAM,cAAc;AAE/C,MAAI,WAAW,QAAQ,SAAS;AAC/B,UAAO,OAAO;AACd,SAAM,kBAAkB;;EAGzB,IAAI,WAAW;EACf,MAAM,SAAwB;GAC7B;GACA,QAAQ;GACR,OAAO,OAAO;GACd,QAAQ,OAAO;GACf,YAAY,WAAW;GACvB,eAAe;AACd,QAAI,SACH;AAED,eAAW;AACX,YAAQ,OAAO;AACf,aAAS;;GAEV;AAED,MAAI,WAAW,WAAW,OACzB,QAAO,SAAS,WAAW;AAE5B,MAAI,WAAW,UAAU,OACxB,QAAO,QAAQ,WAAW;AAE3B,MAAI,WAAW,uBAAuB,OACrC,QAAO,qBAAqB,WAAW;AAExC,MAAI,WAAW,oBAAoB,OAClC,QAAO,kBAAkB,WAAW;AAGrC,SAAO;UACC,OAAO;AACf,MAAI,OACH,QAAO,OAAO;AAEf,QAAM;WACG;AACT,WAAS;;;;;;;;;;AAWX,eAAsB,qBACrB,MACA,UAA8B,EAAE,EACL;CAC3B,MAAM,UAAU,MAAM,QAAQ,WAAW,KAAK,KAAK,QAAQ,mBAAmB,KAAK,QAAQ,CAAC,CAAC;CAC7F,MAAM,SAA0B,EAAE;CAClC,IAAI,aAAsB;AAE1B,MAAK,MAAM,SAAS,SAAS;AAC5B,MAAI,MAAM,WAAW,aAAa;AACjC,UAAO,KAAK,MAAM,MAAM;AACxB;;AAGD,iBAAe,MAAM;;AAGtB,KAAI,YAAY;AACf,OAAK,MAAM,WAAW,OACrB,SAAQ,SAAS;AAElB,QAAM;;AAGP,QAAO"}
|
package/dist/core/textures.d.ts
CHANGED
|
@@ -48,6 +48,22 @@ export interface NormalizedTextureDefinition {
|
|
|
48
48
|
* Effective V address mode.
|
|
49
49
|
*/
|
|
50
50
|
addressModeV: GPUAddressMode;
|
|
51
|
+
/**
|
|
52
|
+
* Whether this texture is a storage texture (writable by compute).
|
|
53
|
+
*/
|
|
54
|
+
storage: boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Whether this texture should be exposed as a fragment-stage sampled binding.
|
|
57
|
+
*/
|
|
58
|
+
fragmentVisible: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Explicit width for storage textures. Undefined when derived from source.
|
|
61
|
+
*/
|
|
62
|
+
width?: number;
|
|
63
|
+
/**
|
|
64
|
+
* Explicit height for storage textures. Undefined when derived from source.
|
|
65
|
+
*/
|
|
66
|
+
height?: number;
|
|
51
67
|
}
|
|
52
68
|
/**
|
|
53
69
|
* Validates and returns sorted texture keys.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textures.d.ts","sourceRoot":"","sources":["../../src/lib/core/textures.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,EACX,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,EACZ,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC3C;;OAEG;IACH,MAAM,EAAE,YAAY,CAAC;IACrB;;OAEG;IACH,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC9B;;OAEG;IACH,MAAM,EAAE,gBAAgB,CAAC;IACzB;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB;;OAEG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;OAEG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,MAAM,EAAE,aAAa,CAAC;IACtB;;OAEG;IACH,YAAY,EAAE,cAAc,CAAC;IAC7B;;OAEG;IACH,YAAY,EAAE,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"textures.d.ts","sourceRoot":"","sources":["../../src/lib/core/textures.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,EACX,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,EACZ,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC3C;;OAEG;IACH,MAAM,EAAE,YAAY,CAAC;IACrB;;OAEG;IACH,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC9B;;OAEG;IACH,MAAM,EAAE,gBAAgB,CAAC;IACzB;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB;;OAEG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;OAEG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,MAAM,EAAE,aAAa,CAAC;IACtB;;OAEG;IACH,YAAY,EAAE,cAAc,CAAC;IAC7B;;OAEG;IACH,YAAY,EAAE,cAAc,CAAC;IAC7B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAYD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAM3E;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACzC,UAAU,EAAE,iBAAiB,GAAG,SAAS,GACvC,2BAA2B,CA8B7B;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAC1C,QAAQ,EAAE,oBAAoB,EAC9B,WAAW,EAAE,MAAM,EAAE,GACnB,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAM7C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,IAAI,WAAW,CAEvE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,GAAG,IAAI,CAUrE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC/C,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,WAAW,CAAC,EAAE,iBAAiB,CAAC;CAChC,GAAG,iBAAiB,CAcpB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACf,CAkBA;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAY7E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,GAAG,MAAM,IAAI,gBAAgB,CAE9F"}
|
package/dist/core/textures.js
CHANGED
|
@@ -26,18 +26,24 @@ function resolveTextureKeys(textures) {
|
|
|
26
26
|
* @returns Normalized definition with deterministic defaults.
|
|
27
27
|
*/
|
|
28
28
|
function normalizeTextureDefinition(definition) {
|
|
29
|
+
const isStorage = definition?.storage === true;
|
|
30
|
+
const defaultFormat = definition?.colorSpace === "linear" ? "rgba8unorm" : "rgba8unorm-srgb";
|
|
29
31
|
const normalized = {
|
|
30
32
|
source: definition?.source ?? null,
|
|
31
33
|
colorSpace: definition?.colorSpace ?? "srgb",
|
|
32
|
-
format: definition?.
|
|
34
|
+
format: definition?.format ?? defaultFormat,
|
|
33
35
|
flipY: definition?.flipY ?? true,
|
|
34
36
|
generateMipmaps: definition?.generateMipmaps ?? false,
|
|
35
37
|
premultipliedAlpha: definition?.premultipliedAlpha ?? false,
|
|
36
38
|
anisotropy: Math.max(1, Math.min(16, Math.floor(definition?.anisotropy ?? 1))),
|
|
37
39
|
filter: definition?.filter ?? DEFAULT_TEXTURE_FILTER,
|
|
38
40
|
addressModeU: definition?.addressModeU ?? DEFAULT_TEXTURE_ADDRESS_MODE,
|
|
39
|
-
addressModeV: definition?.addressModeV ?? DEFAULT_TEXTURE_ADDRESS_MODE
|
|
41
|
+
addressModeV: definition?.addressModeV ?? DEFAULT_TEXTURE_ADDRESS_MODE,
|
|
42
|
+
storage: isStorage,
|
|
43
|
+
fragmentVisible: definition?.fragmentVisible ?? true
|
|
40
44
|
};
|
|
45
|
+
if (definition?.width !== void 0) normalized.width = definition.width;
|
|
46
|
+
if (definition?.height !== void 0) normalized.height = definition.height;
|
|
41
47
|
if (definition?.update !== void 0) normalized.update = definition.update;
|
|
42
48
|
return normalized;
|
|
43
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textures.js","names":[],"sources":["../../src/lib/core/textures.ts"],"sourcesContent":["import { assertUniformName } from './uniforms.js';\nimport type {\n\tTextureData,\n\tTextureDefinition,\n\tTextureDefinitionMap,\n\tTextureUpdateMode,\n\tTextureValue\n} from './types.js';\n\n/**\n * Texture definition with defaults and normalized numeric limits applied.\n */\nexport interface NormalizedTextureDefinition {\n\t/**\n\t * Normalized source value.\n\t */\n\tsource: TextureValue;\n\t/**\n\t * Effective color space.\n\t */\n\tcolorSpace: 'srgb' | 'linear';\n\t/**\n\t * Effective texture format.\n\t */\n\tformat: GPUTextureFormat;\n\t/**\n\t * Effective flip-y flag.\n\t */\n\tflipY: boolean;\n\t/**\n\t * Effective mipmap toggle.\n\t */\n\tgenerateMipmaps: boolean;\n\t/**\n\t * Effective premultiplied-alpha flag.\n\t */\n\tpremultipliedAlpha: boolean;\n\t/**\n\t * Effective dynamic update strategy.\n\t */\n\tupdate?: TextureUpdateMode;\n\t/**\n\t * Effective anisotropy level.\n\t */\n\tanisotropy: number;\n\t/**\n\t * Effective filter mode.\n\t */\n\tfilter: GPUFilterMode;\n\t/**\n\t * Effective U address mode.\n\t */\n\taddressModeU: GPUAddressMode;\n\t/**\n\t * Effective V address mode.\n\t */\n\taddressModeV: GPUAddressMode;\n}\n\n/**\n * Default sampling filter for textures when no explicit value is provided.\n */\nconst DEFAULT_TEXTURE_FILTER: GPUFilterMode = 'linear';\n\n/**\n * Default addressing mode for textures when no explicit value is provided.\n */\nconst DEFAULT_TEXTURE_ADDRESS_MODE: GPUAddressMode = 'clamp-to-edge';\n\n/**\n * Validates and returns sorted texture keys.\n *\n * @param textures - Texture definition map.\n * @returns Lexicographically sorted texture keys.\n */\nexport function resolveTextureKeys(textures: TextureDefinitionMap): string[] {\n\tconst keys = Object.keys(textures).sort();\n\tfor (const key of keys) {\n\t\tassertUniformName(key);\n\t}\n\treturn keys;\n}\n\n/**\n * Applies defaults and clamps to a single texture definition.\n *\n * @param definition - Optional texture definition.\n * @returns Normalized definition with deterministic defaults.\n */\nexport function normalizeTextureDefinition(\n\tdefinition: TextureDefinition | undefined\n): NormalizedTextureDefinition {\n\tconst normalized: NormalizedTextureDefinition = {\n\t\tsource: definition?.source ?? null,\n\t\tcolorSpace: definition?.colorSpace ?? 'srgb',\n\t\tformat: definition?.
|
|
1
|
+
{"version":3,"file":"textures.js","names":[],"sources":["../../src/lib/core/textures.ts"],"sourcesContent":["import { assertUniformName } from './uniforms.js';\nimport type {\n\tTextureData,\n\tTextureDefinition,\n\tTextureDefinitionMap,\n\tTextureUpdateMode,\n\tTextureValue\n} from './types.js';\n\n/**\n * Texture definition with defaults and normalized numeric limits applied.\n */\nexport interface NormalizedTextureDefinition {\n\t/**\n\t * Normalized source value.\n\t */\n\tsource: TextureValue;\n\t/**\n\t * Effective color space.\n\t */\n\tcolorSpace: 'srgb' | 'linear';\n\t/**\n\t * Effective texture format.\n\t */\n\tformat: GPUTextureFormat;\n\t/**\n\t * Effective flip-y flag.\n\t */\n\tflipY: boolean;\n\t/**\n\t * Effective mipmap toggle.\n\t */\n\tgenerateMipmaps: boolean;\n\t/**\n\t * Effective premultiplied-alpha flag.\n\t */\n\tpremultipliedAlpha: boolean;\n\t/**\n\t * Effective dynamic update strategy.\n\t */\n\tupdate?: TextureUpdateMode;\n\t/**\n\t * Effective anisotropy level.\n\t */\n\tanisotropy: number;\n\t/**\n\t * Effective filter mode.\n\t */\n\tfilter: GPUFilterMode;\n\t/**\n\t * Effective U address mode.\n\t */\n\taddressModeU: GPUAddressMode;\n\t/**\n\t * Effective V address mode.\n\t */\n\taddressModeV: GPUAddressMode;\n\t/**\n\t * Whether this texture is a storage texture (writable by compute).\n\t */\n\tstorage: boolean;\n\t/**\n\t * Whether this texture should be exposed as a fragment-stage sampled binding.\n\t */\n\tfragmentVisible: boolean;\n\t/**\n\t * Explicit width for storage textures. Undefined when derived from source.\n\t */\n\twidth?: number;\n\t/**\n\t * Explicit height for storage textures. Undefined when derived from source.\n\t */\n\theight?: number;\n}\n\n/**\n * Default sampling filter for textures when no explicit value is provided.\n */\nconst DEFAULT_TEXTURE_FILTER: GPUFilterMode = 'linear';\n\n/**\n * Default addressing mode for textures when no explicit value is provided.\n */\nconst DEFAULT_TEXTURE_ADDRESS_MODE: GPUAddressMode = 'clamp-to-edge';\n\n/**\n * Validates and returns sorted texture keys.\n *\n * @param textures - Texture definition map.\n * @returns Lexicographically sorted texture keys.\n */\nexport function resolveTextureKeys(textures: TextureDefinitionMap): string[] {\n\tconst keys = Object.keys(textures).sort();\n\tfor (const key of keys) {\n\t\tassertUniformName(key);\n\t}\n\treturn keys;\n}\n\n/**\n * Applies defaults and clamps to a single texture definition.\n *\n * @param definition - Optional texture definition.\n * @returns Normalized definition with deterministic defaults.\n */\nexport function normalizeTextureDefinition(\n\tdefinition: TextureDefinition | undefined\n): NormalizedTextureDefinition {\n\tconst isStorage = definition?.storage === true;\n\tconst defaultFormat = definition?.colorSpace === 'linear' ? 'rgba8unorm' : 'rgba8unorm-srgb';\n\tconst normalized: NormalizedTextureDefinition = {\n\t\tsource: definition?.source ?? null,\n\t\tcolorSpace: definition?.colorSpace ?? 'srgb',\n\t\tformat: definition?.format ?? defaultFormat,\n\t\tflipY: definition?.flipY ?? true,\n\t\tgenerateMipmaps: definition?.generateMipmaps ?? false,\n\t\tpremultipliedAlpha: definition?.premultipliedAlpha ?? false,\n\t\tanisotropy: Math.max(1, Math.min(16, Math.floor(definition?.anisotropy ?? 1))),\n\t\tfilter: definition?.filter ?? DEFAULT_TEXTURE_FILTER,\n\t\taddressModeU: definition?.addressModeU ?? DEFAULT_TEXTURE_ADDRESS_MODE,\n\t\taddressModeV: definition?.addressModeV ?? DEFAULT_TEXTURE_ADDRESS_MODE,\n\t\tstorage: isStorage,\n\t\tfragmentVisible: definition?.fragmentVisible ?? true\n\t};\n\n\tif (definition?.width !== undefined) {\n\t\tnormalized.width = definition.width;\n\t}\n\tif (definition?.height !== undefined) {\n\t\tnormalized.height = definition.height;\n\t}\n\n\tif (definition?.update !== undefined) {\n\t\tnormalized.update = definition.update;\n\t}\n\n\treturn normalized;\n}\n\n/**\n * Normalizes all texture definitions for already-resolved texture keys.\n *\n * @param textures - Source texture definitions.\n * @param textureKeys - Texture keys to normalize.\n * @returns Normalized map keyed by `textureKeys`.\n */\nexport function normalizeTextureDefinitions(\n\ttextures: TextureDefinitionMap,\n\ttextureKeys: string[]\n): Record<string, NormalizedTextureDefinition> {\n\tconst out: Record<string, NormalizedTextureDefinition> = {};\n\tfor (const key of textureKeys) {\n\t\tout[key] = normalizeTextureDefinition(textures[key]);\n\t}\n\treturn out;\n}\n\n/**\n * Checks whether a texture value is a structured `{ source, width?, height? }` object.\n */\nexport function isTextureData(value: TextureValue): value is TextureData {\n\treturn typeof value === 'object' && value !== null && 'source' in value;\n}\n\n/**\n * Converts supported texture input variants to normalized `TextureData`.\n *\n * @param value - Texture value input.\n * @returns Structured texture data or `null`.\n */\nexport function toTextureData(value: TextureValue): TextureData | null {\n\tif (value === null) {\n\t\treturn null;\n\t}\n\n\tif (isTextureData(value)) {\n\t\treturn value;\n\t}\n\n\treturn { source: value };\n}\n\n/**\n * Resolves effective runtime texture update strategy.\n */\nexport function resolveTextureUpdateMode(input: {\n\tsource: TextureData['source'];\n\toverride?: TextureUpdateMode;\n\tdefaultMode?: TextureUpdateMode;\n}): TextureUpdateMode {\n\tif (input.override) {\n\t\treturn input.override;\n\t}\n\n\tif (input.defaultMode) {\n\t\treturn input.defaultMode;\n\t}\n\n\tif (isVideoTextureSource(input.source)) {\n\t\treturn 'perFrame';\n\t}\n\n\treturn 'once';\n}\n\n/**\n * Resolves texture dimensions from explicit values or source metadata.\n *\n * @param data - Texture payload.\n * @returns Positive integer width/height.\n * @throws {Error} When dimensions cannot be resolved to positive values.\n */\nexport function resolveTextureSize(data: TextureData): {\n\twidth: number;\n\theight: number;\n} {\n\tconst source = data.source as {\n\t\twidth?: number;\n\t\theight?: number;\n\t\tnaturalWidth?: number;\n\t\tnaturalHeight?: number;\n\t\tvideoWidth?: number;\n\t\tvideoHeight?: number;\n\t};\n\n\tconst width = data.width ?? source.naturalWidth ?? source.videoWidth ?? source.width ?? 0;\n\tconst height = data.height ?? source.naturalHeight ?? source.videoHeight ?? source.height ?? 0;\n\n\tif (width <= 0 || height <= 0) {\n\t\tthrow new Error('Texture source must have positive width and height');\n\t}\n\n\treturn { width, height };\n}\n\n/**\n * Computes the number of mipmap levels for a base texture size.\n *\n * @param width - Base width.\n * @param height - Base height.\n * @returns Total mip level count (minimum `1`).\n */\nexport function getTextureMipLevelCount(width: number, height: number): number {\n\tlet levels = 1;\n\tlet currentWidth = Math.max(1, width);\n\tlet currentHeight = Math.max(1, height);\n\n\twhile (currentWidth > 1 || currentHeight > 1) {\n\t\tcurrentWidth = Math.max(1, Math.floor(currentWidth / 2));\n\t\tcurrentHeight = Math.max(1, Math.floor(currentHeight / 2));\n\t\tlevels += 1;\n\t}\n\n\treturn levels;\n}\n\n/**\n * Checks whether the source is an `HTMLVideoElement`.\n */\nexport function isVideoTextureSource(source: TextureData['source']): source is HTMLVideoElement {\n\treturn typeof HTMLVideoElement !== 'undefined' && source instanceof HTMLVideoElement;\n}\n"],"mappings":";;;;;AA8EA,IAAM,yBAAwC;;;;AAK9C,IAAM,+BAA+C;;;;;;;AAQrD,SAAgB,mBAAmB,UAA0C;CAC5E,MAAM,OAAO,OAAO,KAAK,SAAS,CAAC,MAAM;AACzC,MAAK,MAAM,OAAO,KACjB,mBAAkB,IAAI;AAEvB,QAAO;;;;;;;;AASR,SAAgB,2BACf,YAC8B;CAC9B,MAAM,YAAY,YAAY,YAAY;CAC1C,MAAM,gBAAgB,YAAY,eAAe,WAAW,eAAe;CAC3E,MAAM,aAA0C;EAC/C,QAAQ,YAAY,UAAU;EAC9B,YAAY,YAAY,cAAc;EACtC,QAAQ,YAAY,UAAU;EAC9B,OAAO,YAAY,SAAS;EAC5B,iBAAiB,YAAY,mBAAmB;EAChD,oBAAoB,YAAY,sBAAsB;EACtD,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,YAAY,cAAc,EAAE,CAAC,CAAC;EAC9E,QAAQ,YAAY,UAAU;EAC9B,cAAc,YAAY,gBAAgB;EAC1C,cAAc,YAAY,gBAAgB;EAC1C,SAAS;EACT,iBAAiB,YAAY,mBAAmB;EAChD;AAED,KAAI,YAAY,UAAU,OACzB,YAAW,QAAQ,WAAW;AAE/B,KAAI,YAAY,WAAW,OAC1B,YAAW,SAAS,WAAW;AAGhC,KAAI,YAAY,WAAW,OAC1B,YAAW,SAAS,WAAW;AAGhC,QAAO;;;;;;;;;AAUR,SAAgB,4BACf,UACA,aAC8C;CAC9C,MAAM,MAAmD,EAAE;AAC3D,MAAK,MAAM,OAAO,YACjB,KAAI,OAAO,2BAA2B,SAAS,KAAK;AAErD,QAAO;;;;;AAMR,SAAgB,cAAc,OAA2C;AACxE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,YAAY;;;;;;;;AASnE,SAAgB,cAAc,OAAyC;AACtE,KAAI,UAAU,KACb,QAAO;AAGR,KAAI,cAAc,MAAM,CACvB,QAAO;AAGR,QAAO,EAAE,QAAQ,OAAO;;;;;AAMzB,SAAgB,yBAAyB,OAInB;AACrB,KAAI,MAAM,SACT,QAAO,MAAM;AAGd,KAAI,MAAM,YACT,QAAO,MAAM;AAGd,KAAI,qBAAqB,MAAM,OAAO,CACrC,QAAO;AAGR,QAAO;;;;;;;;;AAUR,SAAgB,mBAAmB,MAGjC;CACD,MAAM,SAAS,KAAK;CASpB,MAAM,QAAQ,KAAK,SAAS,OAAO,gBAAgB,OAAO,cAAc,OAAO,SAAS;CACxF,MAAM,SAAS,KAAK,UAAU,OAAO,iBAAiB,OAAO,eAAe,OAAO,UAAU;AAE7F,KAAI,SAAS,KAAK,UAAU,EAC3B,OAAM,IAAI,MAAM,qDAAqD;AAGtE,QAAO;EAAE;EAAO;EAAQ;;;;;;;;;AAUzB,SAAgB,wBAAwB,OAAe,QAAwB;CAC9E,IAAI,SAAS;CACb,IAAI,eAAe,KAAK,IAAI,GAAG,MAAM;CACrC,IAAI,gBAAgB,KAAK,IAAI,GAAG,OAAO;AAEvC,QAAO,eAAe,KAAK,gBAAgB,GAAG;AAC7C,iBAAe,KAAK,IAAI,GAAG,KAAK,MAAM,eAAe,EAAE,CAAC;AACxD,kBAAgB,KAAK,IAAI,GAAG,KAAK,MAAM,gBAAgB,EAAE,CAAC;AAC1D,YAAU;;AAGX,QAAO;;;;;AAMR,SAAgB,qBAAqB,QAA2D;AAC/F,QAAO,OAAO,qBAAqB,eAAe,kBAAkB"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -175,6 +175,26 @@ export interface TextureDefinition {
|
|
|
175
175
|
* V axis address mode.
|
|
176
176
|
*/
|
|
177
177
|
addressModeV?: GPUAddressMode;
|
|
178
|
+
/**
|
|
179
|
+
* When true, this texture is also writable by compute passes.
|
|
180
|
+
*/
|
|
181
|
+
storage?: boolean;
|
|
182
|
+
/**
|
|
183
|
+
* Required when storage is true. Must be a storage-compatible format.
|
|
184
|
+
*/
|
|
185
|
+
format?: GPUTextureFormat;
|
|
186
|
+
/**
|
|
187
|
+
* Explicit texture width. Required for storage textures without a source.
|
|
188
|
+
*/
|
|
189
|
+
width?: number;
|
|
190
|
+
/**
|
|
191
|
+
* Explicit texture height. Required for storage textures without a source.
|
|
192
|
+
*/
|
|
193
|
+
height?: number;
|
|
194
|
+
/**
|
|
195
|
+
* When true, texture is visible (sampled) in fragment shader. Default: true.
|
|
196
|
+
*/
|
|
197
|
+
fragmentVisible?: boolean;
|
|
178
198
|
}
|
|
179
199
|
/**
|
|
180
200
|
* Texture definition map keyed by uniform-compatible texture names.
|
|
@@ -184,6 +204,39 @@ export type TextureDefinitionMap<TKey extends string = string> = Record<TKey, Te
|
|
|
184
204
|
* Runtime texture value map keyed by texture uniform names.
|
|
185
205
|
*/
|
|
186
206
|
export type TextureMap<TKey extends string = string> = Record<TKey, TextureValue>;
|
|
207
|
+
/**
|
|
208
|
+
* Access mode for storage buffers in compute shaders.
|
|
209
|
+
*/
|
|
210
|
+
export type StorageBufferAccess = 'read' | 'read-write';
|
|
211
|
+
/**
|
|
212
|
+
* WGSL storage buffer element type.
|
|
213
|
+
*/
|
|
214
|
+
export type StorageBufferType = 'array<f32>' | 'array<vec2f>' | 'array<vec3f>' | 'array<vec4f>' | 'array<u32>' | 'array<i32>' | 'array<vec4u>' | 'array<vec4i>';
|
|
215
|
+
/**
|
|
216
|
+
* Definition of a single storage buffer resource.
|
|
217
|
+
*/
|
|
218
|
+
export interface StorageBufferDefinition {
|
|
219
|
+
/**
|
|
220
|
+
* Buffer size in bytes. Must be > 0 and multiple of 4.
|
|
221
|
+
*/
|
|
222
|
+
size: number;
|
|
223
|
+
/**
|
|
224
|
+
* WGSL type annotation for codegen.
|
|
225
|
+
*/
|
|
226
|
+
type: StorageBufferType;
|
|
227
|
+
/**
|
|
228
|
+
* Access mode in compute shader. Default: 'read-write'.
|
|
229
|
+
*/
|
|
230
|
+
access?: StorageBufferAccess;
|
|
231
|
+
/**
|
|
232
|
+
* Initial data uploaded on creation.
|
|
233
|
+
*/
|
|
234
|
+
initialData?: Float32Array | Uint32Array | Int32Array;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Map of named storage buffer definitions.
|
|
238
|
+
*/
|
|
239
|
+
export type StorageBufferDefinitionMap<TKey extends string = string> = Record<TKey, StorageBufferDefinition>;
|
|
187
240
|
/**
|
|
188
241
|
* Output color space requested for final canvas presentation.
|
|
189
242
|
*/
|
|
@@ -329,6 +382,39 @@ export interface RenderPassContext extends Required<RenderPassFlags> {
|
|
|
329
382
|
preserve?: boolean;
|
|
330
383
|
}) => GPURenderPassEncoder;
|
|
331
384
|
}
|
|
385
|
+
/**
|
|
386
|
+
* Context provided to compute pass render calls.
|
|
387
|
+
*/
|
|
388
|
+
export interface ComputePassContext {
|
|
389
|
+
/**
|
|
390
|
+
* Active GPU device.
|
|
391
|
+
*/
|
|
392
|
+
device: GPUDevice;
|
|
393
|
+
/**
|
|
394
|
+
* Shared command encoder for this frame.
|
|
395
|
+
*/
|
|
396
|
+
commandEncoder: GPUCommandEncoder;
|
|
397
|
+
/**
|
|
398
|
+
* Frame width in pixels.
|
|
399
|
+
*/
|
|
400
|
+
width: number;
|
|
401
|
+
/**
|
|
402
|
+
* Frame height in pixels.
|
|
403
|
+
*/
|
|
404
|
+
height: number;
|
|
405
|
+
/**
|
|
406
|
+
* Frame timestamp in seconds.
|
|
407
|
+
*/
|
|
408
|
+
time: number;
|
|
409
|
+
/**
|
|
410
|
+
* Frame delta in seconds.
|
|
411
|
+
*/
|
|
412
|
+
delta: number;
|
|
413
|
+
/**
|
|
414
|
+
* Begins a compute pass on the shared command encoder.
|
|
415
|
+
*/
|
|
416
|
+
beginComputePass: () => GPUComputePassEncoder;
|
|
417
|
+
}
|
|
332
418
|
/**
|
|
333
419
|
* Formal render pass contract used by MotionGPU render graph.
|
|
334
420
|
*/
|
|
@@ -362,6 +448,20 @@ export interface RenderPass extends RenderPassFlags {
|
|
|
362
448
|
*/
|
|
363
449
|
dispose?: () => void;
|
|
364
450
|
}
|
|
451
|
+
/**
|
|
452
|
+
* Minimal interface for compute passes in the render graph.
|
|
453
|
+
* Compute passes do not participate in slot routing.
|
|
454
|
+
*/
|
|
455
|
+
export interface ComputePassLike {
|
|
456
|
+
readonly isCompute: true;
|
|
457
|
+
enabled?: boolean;
|
|
458
|
+
setSize?: (width: number, height: number) => void;
|
|
459
|
+
dispose?: () => void;
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Union type for all pass types accepted by the render graph.
|
|
463
|
+
*/
|
|
464
|
+
export type AnyPass = RenderPass | ComputePassLike;
|
|
365
465
|
/**
|
|
366
466
|
* Frame submission strategy for the scheduler.
|
|
367
467
|
*/
|
|
@@ -390,6 +490,16 @@ export interface FrameState {
|
|
|
390
490
|
* Sets a texture value for current/next frame.
|
|
391
491
|
*/
|
|
392
492
|
setTexture: (name: string, value: TextureValue) => void;
|
|
493
|
+
/**
|
|
494
|
+
* Writes data to a named storage buffer.
|
|
495
|
+
*/
|
|
496
|
+
writeStorageBuffer: (name: string, data: ArrayBufferView, options?: {
|
|
497
|
+
offset?: number;
|
|
498
|
+
}) => void;
|
|
499
|
+
/**
|
|
500
|
+
* Async readback of storage buffer data.
|
|
501
|
+
*/
|
|
502
|
+
readStorageBuffer: (name: string) => Promise<ArrayBuffer>;
|
|
393
503
|
/**
|
|
394
504
|
* Invalidates frame for on-demand rendering.
|
|
395
505
|
*/
|
|
@@ -414,6 +524,17 @@ export interface FrameState {
|
|
|
414
524
|
/**
|
|
415
525
|
* Internal renderer construction options resolved from material/context state.
|
|
416
526
|
*/
|
|
527
|
+
/**
|
|
528
|
+
* Pending storage buffer write queued from FrameState.
|
|
529
|
+
*/
|
|
530
|
+
export interface PendingStorageWrite {
|
|
531
|
+
/** Storage buffer name. */
|
|
532
|
+
name: string;
|
|
533
|
+
/** Data to write. */
|
|
534
|
+
data: ArrayBufferView;
|
|
535
|
+
/** Byte offset into the storage buffer. */
|
|
536
|
+
offset: number;
|
|
537
|
+
}
|
|
417
538
|
export interface RendererOptions {
|
|
418
539
|
/**
|
|
419
540
|
* Target canvas.
|
|
@@ -470,22 +591,34 @@ export interface RendererOptions {
|
|
|
470
591
|
* Texture definitions by key.
|
|
471
592
|
*/
|
|
472
593
|
textureDefinitions: TextureDefinitionMap;
|
|
594
|
+
/**
|
|
595
|
+
* Sorted storage buffer keys.
|
|
596
|
+
*/
|
|
597
|
+
storageBufferKeys?: string[];
|
|
598
|
+
/**
|
|
599
|
+
* Storage buffer definitions by key.
|
|
600
|
+
*/
|
|
601
|
+
storageBufferDefinitions?: Record<string, import('./types.js').StorageBufferDefinition>;
|
|
602
|
+
/**
|
|
603
|
+
* Sorted storage texture keys (textures with storage:true).
|
|
604
|
+
*/
|
|
605
|
+
storageTextureKeys?: string[];
|
|
473
606
|
/**
|
|
474
607
|
* Static render target definitions.
|
|
475
608
|
*/
|
|
476
609
|
renderTargets?: RenderTargetDefinitionMap;
|
|
477
610
|
/**
|
|
478
|
-
* Static render passes.
|
|
611
|
+
* Static render and compute passes.
|
|
479
612
|
*/
|
|
480
|
-
passes?:
|
|
613
|
+
passes?: AnyPass[];
|
|
481
614
|
/**
|
|
482
615
|
* Dynamic render targets provider.
|
|
483
616
|
*/
|
|
484
617
|
getRenderTargets?: () => RenderTargetDefinitionMap | undefined;
|
|
485
618
|
/**
|
|
486
|
-
* Dynamic render passes provider.
|
|
619
|
+
* Dynamic render and compute passes provider.
|
|
487
620
|
*/
|
|
488
|
-
getPasses?: () =>
|
|
621
|
+
getPasses?: () => AnyPass[] | undefined;
|
|
489
622
|
/**
|
|
490
623
|
* Requested output color space.
|
|
491
624
|
*/
|
|
@@ -530,7 +663,16 @@ export interface Renderer {
|
|
|
530
663
|
width: number;
|
|
531
664
|
height: number;
|
|
532
665
|
};
|
|
666
|
+
pendingStorageWrites?: PendingStorageWrite[] | undefined;
|
|
533
667
|
}) => void;
|
|
668
|
+
/**
|
|
669
|
+
* Returns the GPU buffer for a named storage buffer, if allocated.
|
|
670
|
+
*/
|
|
671
|
+
getStorageBuffer?: (name: string) => GPUBuffer | undefined;
|
|
672
|
+
/**
|
|
673
|
+
* Returns the active GPU device (for readback operations).
|
|
674
|
+
*/
|
|
675
|
+
getDevice?: () => GPUDevice;
|
|
534
676
|
/**
|
|
535
677
|
* Releases GPU resources and subscriptions.
|
|
536
678
|
*/
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/core/types.ts"],"names":[],"mappings":";AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AAE1E;;;;;GAKG;AACH;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,EAAE,GAAG,YAAY,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY,CAC5B,KAAK,SAAS,WAAW,GAAG,WAAW,EACvC,MAAM,SAAS,kBAAkB,CAAC,KAAK,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC;IAEpE;;OAEG;IACH,IAAI,EAAE,KAAK,CAAC;IACZ;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GACrB,MAAM,GACN,CAAC,MAAM,EAAE,MAAM,CAAC,GAChB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GACxB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAChC,YAAY,CAAC,KAAK,CAAC,GACnB,YAAY,CAAC,OAAO,CAAC,GACrB,YAAY,CAAC,OAAO,CAAC,GACrB,YAAY,CAAC,OAAO,CAAC,GACrB,YAAY,CAAC,SAAS,CAAC,CAAC;AAE3B;;GAEG;AACH,MAAM,MAAM,UAAU,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AAElF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,IAAI,EAAE,WAAW,CAAC;IAClB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B;;OAEG;IACH,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC3C;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,gBAAgB,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAElG;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B;;OAEG;IACH,MAAM,EAAE,aAAa,CAAC;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC/B;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;OAEG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,aAAa,GAAG,IAAI,CAAC;AAE9D;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,cAAc,GAAG,UAAU,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC;;OAEG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC/B;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;OAEG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;OAEG;IACH,YAAY,CAAC,EAAE,cAAc,CAAC;IAC9B;;OAEG;IACH,YAAY,CAAC,EAAE,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/core/types.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -7,5 +7,7 @@ import { loadTexturesFromUrls } from "./core/texture-loader.js";
|
|
|
7
7
|
import { BlitPass } from "./passes/BlitPass.js";
|
|
8
8
|
import { CopyPass } from "./passes/CopyPass.js";
|
|
9
9
|
import { ShaderPass } from "./passes/ShaderPass.js";
|
|
10
|
+
import { ComputePass } from "./passes/ComputePass.js";
|
|
11
|
+
import { PingPongComputePass } from "./passes/PingPongComputePass.js";
|
|
10
12
|
import "./core/index.js";
|
|
11
|
-
export { BlitPass, CopyPass, ShaderPass, createCurrentWritable, createFrameRegistry, createMotionGPURuntimeLoop, defineMaterial, loadTexturesFromUrls, resolveMaterial, toMotionGPUErrorReport };
|
|
13
|
+
export { BlitPass, ComputePass, CopyPass, PingPongComputePass, ShaderPass, createCurrentWritable, createFrameRegistry, createMotionGPURuntimeLoop, defineMaterial, loadTexturesFromUrls, resolveMaterial, toMotionGPUErrorReport };
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dispatch context provided to dynamic dispatch callbacks.
|
|
3
|
+
*/
|
|
4
|
+
export interface ComputeDispatchContext {
|
|
5
|
+
width: number;
|
|
6
|
+
height: number;
|
|
7
|
+
time: number;
|
|
8
|
+
delta: number;
|
|
9
|
+
workgroupSize: [number, number, number];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Options for constructing a `ComputePass`.
|
|
13
|
+
*/
|
|
14
|
+
export interface ComputePassOptions {
|
|
15
|
+
/**
|
|
16
|
+
* Compute shader WGSL source code.
|
|
17
|
+
* Must declare `@compute @workgroup_size(...) fn compute(@builtin(global_invocation_id) ...)`.
|
|
18
|
+
*/
|
|
19
|
+
compute: string;
|
|
20
|
+
/**
|
|
21
|
+
* Dispatch workgroup counts.
|
|
22
|
+
* - Static tuple: `[x]`, `[x, y]`, or `[x, y, z]`
|
|
23
|
+
* - `'auto'`: derived from canvas size / workgroup size
|
|
24
|
+
* - Function: dynamic dispatch based on frame context
|
|
25
|
+
*/
|
|
26
|
+
dispatch?: [number, number?, number?] | 'auto' | ((ctx: ComputeDispatchContext) => [number, number, number]);
|
|
27
|
+
/**
|
|
28
|
+
* Enables/disables this compute pass.
|
|
29
|
+
*/
|
|
30
|
+
enabled?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Compute pass class used within the render graph.
|
|
34
|
+
*
|
|
35
|
+
* Validates compute shader contract, parses workgroup size,
|
|
36
|
+
* and resolves dispatch dimensions. Does **not** manage GPU resources
|
|
37
|
+
* (that responsibility belongs to the renderer).
|
|
38
|
+
*/
|
|
39
|
+
export declare class ComputePass {
|
|
40
|
+
/**
|
|
41
|
+
* Enables/disables this pass without removing it from graph.
|
|
42
|
+
*/
|
|
43
|
+
enabled: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Discriminant flag for render graph to identify compute passes.
|
|
46
|
+
*/
|
|
47
|
+
readonly isCompute: true;
|
|
48
|
+
private compute;
|
|
49
|
+
private workgroupSize;
|
|
50
|
+
private dispatch;
|
|
51
|
+
constructor(options: ComputePassOptions);
|
|
52
|
+
/**
|
|
53
|
+
* Replaces current compute shader and updates workgroup size.
|
|
54
|
+
*
|
|
55
|
+
* @param compute - New compute shader WGSL source.
|
|
56
|
+
* @throws {Error} When shader does not match the compute contract.
|
|
57
|
+
*/
|
|
58
|
+
setCompute(compute: string): void;
|
|
59
|
+
/**
|
|
60
|
+
* Updates dispatch strategy.
|
|
61
|
+
*/
|
|
62
|
+
setDispatch(dispatch: ComputePassOptions['dispatch']): void;
|
|
63
|
+
/**
|
|
64
|
+
* Returns current compute shader source.
|
|
65
|
+
*/
|
|
66
|
+
getCompute(): string;
|
|
67
|
+
/**
|
|
68
|
+
* Returns parsed workgroup size from current compute shader.
|
|
69
|
+
*/
|
|
70
|
+
getWorkgroupSize(): [number, number, number];
|
|
71
|
+
/**
|
|
72
|
+
* Resolves dispatch workgroup counts for current frame.
|
|
73
|
+
*
|
|
74
|
+
* @param ctx - Dispatch context with canvas dimensions and timing.
|
|
75
|
+
* @returns Tuple [x, y, z] workgroup counts.
|
|
76
|
+
*/
|
|
77
|
+
resolveDispatch(ctx: ComputeDispatchContext): [number, number, number];
|
|
78
|
+
/**
|
|
79
|
+
* Releases resources (no-op since GPU resource lifecycle is renderer-managed).
|
|
80
|
+
*/
|
|
81
|
+
dispose(): void;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=ComputePass.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComputePass.d.ts","sourceRoot":"","sources":["../../src/lib/passes/ComputePass.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,QAAQ,CAAC,EACN,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GAC1B,MAAM,GACN,CAAC,CAAC,GAAG,EAAE,sBAAsB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/D;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;GAMG;AACH,qBAAa,WAAW;IACvB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAG,IAAI,CAAU;IAEnC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAA2B;IAChD,OAAO,CAAC,QAAQ,CAAiC;gBAErC,OAAO,EAAE,kBAAkB;IASvC;;;;;OAKG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAOjC;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,kBAAkB,CAAC,UAAU,CAAC,GAAG,IAAI;IAI3D;;OAEG;IACH,UAAU,IAAI,MAAM;IAIpB;;OAEG;IACH,gBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IAI5C;;;;;OAKG;IACH,eAAe,CAAC,GAAG,EAAE,sBAAsB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IAoBtE;;OAEG;IACH,OAAO,IAAI,IAAI;CAGf"}
|