@motion-core/motion-gpu 0.4.1 → 0.5.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.
Files changed (228) hide show
  1. package/README.md +99 -0
  2. package/dist/advanced.d.ts +1 -0
  3. package/dist/advanced.d.ts.map +1 -0
  4. package/dist/advanced.js +14 -6
  5. package/dist/core/advanced.d.ts +1 -0
  6. package/dist/core/advanced.d.ts.map +1 -0
  7. package/dist/core/advanced.js +14 -5
  8. package/dist/core/compute-shader.d.ts +87 -0
  9. package/dist/core/compute-shader.d.ts.map +1 -0
  10. package/dist/core/compute-shader.js +205 -0
  11. package/dist/core/compute-shader.js.map +1 -0
  12. package/dist/core/current-value.d.ts +1 -0
  13. package/dist/core/current-value.d.ts.map +1 -0
  14. package/dist/core/current-value.js +35 -34
  15. package/dist/core/current-value.js.map +1 -0
  16. package/dist/core/error-diagnostics.d.ts +1 -0
  17. package/dist/core/error-diagnostics.d.ts.map +1 -0
  18. package/dist/core/error-diagnostics.js +70 -137
  19. package/dist/core/error-diagnostics.js.map +1 -0
  20. package/dist/core/error-report.d.ts +2 -1
  21. package/dist/core/error-report.d.ts.map +1 -0
  22. package/dist/core/error-report.js +247 -233
  23. package/dist/core/error-report.js.map +1 -0
  24. package/dist/core/frame-registry.d.ts +1 -0
  25. package/dist/core/frame-registry.d.ts.map +1 -0
  26. package/dist/core/frame-registry.js +546 -662
  27. package/dist/core/frame-registry.js.map +1 -0
  28. package/dist/core/index.d.ts +6 -2
  29. package/dist/core/index.d.ts.map +1 -0
  30. package/dist/core/index.js +13 -12
  31. package/dist/core/material-preprocess.d.ts +1 -0
  32. package/dist/core/material-preprocess.d.ts.map +1 -0
  33. package/dist/core/material-preprocess.js +131 -152
  34. package/dist/core/material-preprocess.js.map +1 -0
  35. package/dist/core/material.d.ts +23 -6
  36. package/dist/core/material.d.ts.map +1 -0
  37. package/dist/core/material.js +290 -317
  38. package/dist/core/material.js.map +1 -0
  39. package/dist/core/recompile-policy.d.ts +1 -0
  40. package/dist/core/recompile-policy.d.ts.map +1 -0
  41. package/dist/core/recompile-policy.js +18 -13
  42. package/dist/core/recompile-policy.js.map +1 -0
  43. package/dist/core/render-graph.d.ts +8 -3
  44. package/dist/core/render-graph.d.ts.map +1 -0
  45. package/dist/core/render-graph.js +77 -68
  46. package/dist/core/render-graph.js.map +1 -0
  47. package/dist/core/render-targets.d.ts +1 -0
  48. package/dist/core/render-targets.d.ts.map +1 -0
  49. package/dist/core/render-targets.js +52 -53
  50. package/dist/core/render-targets.js.map +1 -0
  51. package/dist/core/renderer.d.ts +1 -0
  52. package/dist/core/renderer.d.ts.map +1 -0
  53. package/dist/core/renderer.js +1337 -1081
  54. package/dist/core/renderer.js.map +1 -0
  55. package/dist/core/runtime-loop.d.ts +3 -2
  56. package/dist/core/runtime-loop.d.ts.map +1 -0
  57. package/dist/core/runtime-loop.js +353 -362
  58. package/dist/core/runtime-loop.js.map +1 -0
  59. package/dist/core/scheduler-helpers.d.ts +1 -0
  60. package/dist/core/scheduler-helpers.d.ts.map +1 -0
  61. package/dist/core/scheduler-helpers.js +52 -51
  62. package/dist/core/scheduler-helpers.js.map +1 -0
  63. package/dist/core/shader.d.ts +10 -1
  64. package/dist/core/shader.d.ts.map +1 -0
  65. package/dist/core/shader.js +109 -115
  66. package/dist/core/shader.js.map +1 -0
  67. package/dist/core/storage-buffers.d.ts +37 -0
  68. package/dist/core/storage-buffers.d.ts.map +1 -0
  69. package/dist/core/storage-buffers.js +95 -0
  70. package/dist/core/storage-buffers.js.map +1 -0
  71. package/dist/core/texture-loader.d.ts +1 -0
  72. package/dist/core/texture-loader.d.ts.map +1 -0
  73. package/dist/core/texture-loader.js +209 -273
  74. package/dist/core/texture-loader.js.map +1 -0
  75. package/dist/core/textures.d.ts +13 -0
  76. package/dist/core/textures.d.ts.map +1 -0
  77. package/dist/core/textures.js +111 -116
  78. package/dist/core/textures.js.map +1 -0
  79. package/dist/core/types.d.ts +147 -4
  80. package/dist/core/types.d.ts.map +1 -0
  81. package/dist/core/types.js +0 -4
  82. package/dist/core/uniforms.d.ts +1 -0
  83. package/dist/core/uniforms.d.ts.map +1 -0
  84. package/dist/core/uniforms.js +170 -191
  85. package/dist/core/uniforms.js.map +1 -0
  86. package/dist/index.d.ts +1 -0
  87. package/dist/index.d.ts.map +1 -0
  88. package/dist/index.js +13 -6
  89. package/dist/passes/BlitPass.d.ts +1 -0
  90. package/dist/passes/BlitPass.d.ts.map +1 -0
  91. package/dist/passes/BlitPass.js +23 -18
  92. package/dist/passes/BlitPass.js.map +1 -0
  93. package/dist/passes/ComputePass.d.ts +83 -0
  94. package/dist/passes/ComputePass.d.ts.map +1 -0
  95. package/dist/passes/ComputePass.js +92 -0
  96. package/dist/passes/ComputePass.js.map +1 -0
  97. package/dist/passes/CopyPass.d.ts +1 -0
  98. package/dist/passes/CopyPass.d.ts.map +1 -0
  99. package/dist/passes/CopyPass.js +58 -52
  100. package/dist/passes/CopyPass.js.map +1 -0
  101. package/dist/passes/FullscreenPass.d.ts +1 -0
  102. package/dist/passes/FullscreenPass.d.ts.map +1 -0
  103. package/dist/passes/FullscreenPass.js +127 -130
  104. package/dist/passes/FullscreenPass.js.map +1 -0
  105. package/dist/passes/PingPongComputePass.d.ts +104 -0
  106. package/dist/passes/PingPongComputePass.d.ts.map +1 -0
  107. package/dist/passes/PingPongComputePass.js +132 -0
  108. package/dist/passes/PingPongComputePass.js.map +1 -0
  109. package/dist/passes/ShaderPass.d.ts +1 -0
  110. package/dist/passes/ShaderPass.d.ts.map +1 -0
  111. package/dist/passes/ShaderPass.js +41 -37
  112. package/dist/passes/ShaderPass.js.map +1 -0
  113. package/dist/passes/index.d.ts +3 -0
  114. package/dist/passes/index.d.ts.map +1 -0
  115. package/dist/passes/index.js +6 -3
  116. package/dist/react/FragCanvas.d.ts +3 -2
  117. package/dist/react/FragCanvas.d.ts.map +1 -0
  118. package/dist/react/FragCanvas.js +234 -211
  119. package/dist/react/FragCanvas.js.map +1 -0
  120. package/dist/react/MotionGPUErrorOverlay.d.ts +1 -0
  121. package/dist/react/MotionGPUErrorOverlay.d.ts.map +1 -0
  122. package/dist/react/MotionGPUErrorOverlay.js +200 -14
  123. package/dist/react/MotionGPUErrorOverlay.js.map +1 -0
  124. package/dist/react/Portal.d.ts +1 -0
  125. package/dist/react/Portal.d.ts.map +1 -0
  126. package/dist/react/Portal.js +18 -21
  127. package/dist/react/Portal.js.map +1 -0
  128. package/dist/react/advanced.d.ts +1 -0
  129. package/dist/react/advanced.d.ts.map +1 -0
  130. package/dist/react/advanced.js +14 -6
  131. package/dist/react/frame-context.d.ts +1 -0
  132. package/dist/react/frame-context.d.ts.map +1 -0
  133. package/dist/react/frame-context.js +88 -94
  134. package/dist/react/frame-context.js.map +1 -0
  135. package/dist/react/index.d.ts +6 -2
  136. package/dist/react/index.d.ts.map +1 -0
  137. package/dist/react/index.js +12 -9
  138. package/dist/react/motiongpu-context.d.ts +1 -0
  139. package/dist/react/motiongpu-context.d.ts.map +1 -0
  140. package/dist/react/motiongpu-context.js +18 -15
  141. package/dist/react/motiongpu-context.js.map +1 -0
  142. package/dist/react/use-motiongpu-user-context.d.ts +1 -0
  143. package/dist/react/use-motiongpu-user-context.d.ts.map +1 -0
  144. package/dist/react/use-motiongpu-user-context.js +83 -82
  145. package/dist/react/use-motiongpu-user-context.js.map +1 -0
  146. package/dist/react/use-texture.d.ts +1 -0
  147. package/dist/react/use-texture.d.ts.map +1 -0
  148. package/dist/react/use-texture.js +132 -152
  149. package/dist/react/use-texture.js.map +1 -0
  150. package/dist/svelte/FragCanvas.svelte +2 -2
  151. package/dist/svelte/FragCanvas.svelte.d.ts +3 -2
  152. package/dist/svelte/FragCanvas.svelte.d.ts.map +1 -0
  153. package/dist/svelte/MotionGPUErrorOverlay.svelte +137 -7
  154. package/dist/svelte/MotionGPUErrorOverlay.svelte.d.ts +1 -0
  155. package/dist/svelte/MotionGPUErrorOverlay.svelte.d.ts.map +1 -0
  156. package/dist/svelte/Portal.svelte.d.ts +1 -0
  157. package/dist/svelte/Portal.svelte.d.ts.map +1 -0
  158. package/dist/svelte/advanced.d.ts +1 -0
  159. package/dist/svelte/advanced.d.ts.map +1 -0
  160. package/dist/svelte/advanced.js +13 -6
  161. package/dist/svelte/frame-context.d.ts +1 -0
  162. package/dist/svelte/frame-context.d.ts.map +1 -0
  163. package/dist/svelte/frame-context.js +27 -27
  164. package/dist/svelte/frame-context.js.map +1 -0
  165. package/dist/svelte/index.d.ts +6 -2
  166. package/dist/svelte/index.d.ts.map +1 -0
  167. package/dist/svelte/index.js +12 -9
  168. package/dist/svelte/motiongpu-context.d.ts +1 -0
  169. package/dist/svelte/motiongpu-context.d.ts.map +1 -0
  170. package/dist/svelte/motiongpu-context.js +24 -21
  171. package/dist/svelte/motiongpu-context.js.map +1 -0
  172. package/dist/svelte/use-motiongpu-user-context.d.ts +1 -0
  173. package/dist/svelte/use-motiongpu-user-context.d.ts.map +1 -0
  174. package/dist/svelte/use-motiongpu-user-context.js +69 -70
  175. package/dist/svelte/use-motiongpu-user-context.js.map +1 -0
  176. package/dist/svelte/use-texture.d.ts +1 -0
  177. package/dist/svelte/use-texture.d.ts.map +1 -0
  178. package/dist/svelte/use-texture.js +125 -147
  179. package/dist/svelte/use-texture.js.map +1 -0
  180. package/package.json +12 -7
  181. package/src/lib/advanced.ts +6 -0
  182. package/src/lib/core/advanced.ts +12 -0
  183. package/src/lib/core/compute-shader.ts +326 -0
  184. package/src/lib/core/current-value.ts +64 -0
  185. package/src/lib/core/error-diagnostics.ts +236 -0
  186. package/src/lib/core/error-report.ts +535 -0
  187. package/src/lib/core/frame-registry.ts +1190 -0
  188. package/src/lib/core/index.ts +94 -0
  189. package/src/lib/core/material-preprocess.ts +295 -0
  190. package/src/lib/core/material.ts +748 -0
  191. package/src/lib/core/recompile-policy.ts +31 -0
  192. package/src/lib/core/render-graph.ts +173 -0
  193. package/src/lib/core/render-targets.ts +107 -0
  194. package/src/lib/core/renderer.ts +2161 -0
  195. package/src/lib/core/runtime-loop.ts +537 -0
  196. package/src/lib/core/scheduler-helpers.ts +136 -0
  197. package/src/lib/core/shader.ts +301 -0
  198. package/src/lib/core/storage-buffers.ts +142 -0
  199. package/src/lib/core/texture-loader.ts +482 -0
  200. package/src/lib/core/textures.ts +257 -0
  201. package/src/lib/core/types.ts +743 -0
  202. package/src/lib/core/uniforms.ts +282 -0
  203. package/src/lib/index.ts +6 -0
  204. package/src/lib/passes/BlitPass.ts +54 -0
  205. package/src/lib/passes/ComputePass.ts +136 -0
  206. package/src/lib/passes/CopyPass.ts +80 -0
  207. package/src/lib/passes/FullscreenPass.ts +173 -0
  208. package/src/lib/passes/PingPongComputePass.ts +180 -0
  209. package/src/lib/passes/ShaderPass.ts +89 -0
  210. package/src/lib/passes/index.ts +9 -0
  211. package/src/lib/react/FragCanvas.tsx +345 -0
  212. package/src/lib/react/MotionGPUErrorOverlay.tsx +524 -0
  213. package/src/lib/react/Portal.tsx +34 -0
  214. package/src/lib/react/advanced.ts +36 -0
  215. package/src/lib/react/frame-context.ts +169 -0
  216. package/src/lib/react/index.ts +68 -0
  217. package/src/lib/react/motiongpu-context.ts +88 -0
  218. package/src/lib/react/use-motiongpu-user-context.ts +186 -0
  219. package/src/lib/react/use-texture.ts +233 -0
  220. package/src/lib/svelte/FragCanvas.svelte +249 -0
  221. package/src/lib/svelte/MotionGPUErrorOverlay.svelte +512 -0
  222. package/src/lib/svelte/Portal.svelte +31 -0
  223. package/src/lib/svelte/advanced.ts +32 -0
  224. package/src/lib/svelte/frame-context.ts +87 -0
  225. package/src/lib/svelte/index.ts +68 -0
  226. package/src/lib/svelte/motiongpu-context.ts +97 -0
  227. package/src/lib/svelte/use-motiongpu-user-context.ts +145 -0
  228. package/src/lib/svelte/use-texture.ts +232 -0
@@ -0,0 +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\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"}
@@ -48,6 +48,18 @@ 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
+ * Explicit width for storage textures. Undefined when derived from source.
57
+ */
58
+ width?: number;
59
+ /**
60
+ * Explicit height for storage textures. Undefined when derived from source.
61
+ */
62
+ height?: number;
51
63
  }
52
64
  /**
53
65
  * Validates and returns sorted texture keys.
@@ -113,3 +125,4 @@ export declare function getTextureMipLevelCount(width: number, height: number):
113
125
  * Checks whether the source is an `HTMLVideoElement`.
114
126
  */
115
127
  export declare function isVideoTextureSource(source: TextureData['source']): source is HTMLVideoElement;
128
+ //# sourceMappingURL=textures.d.ts.map
@@ -0,0 +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;IAC7B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;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,CA6B7B;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"}
@@ -1,136 +1,131 @@
1
- import { assertUniformName } from './uniforms.js';
1
+ import { assertUniformName } from "./uniforms.js";
2
+ //#region src/lib/core/textures.ts
2
3
  /**
3
- * Default sampling filter for textures when no explicit value is provided.
4
- */
5
- const DEFAULT_TEXTURE_FILTER = 'linear';
4
+ * Default sampling filter for textures when no explicit value is provided.
5
+ */
6
+ var DEFAULT_TEXTURE_FILTER = "linear";
6
7
  /**
7
- * Default addressing mode for textures when no explicit value is provided.
8
- */
9
- const DEFAULT_TEXTURE_ADDRESS_MODE = 'clamp-to-edge';
8
+ * Default addressing mode for textures when no explicit value is provided.
9
+ */
10
+ var DEFAULT_TEXTURE_ADDRESS_MODE = "clamp-to-edge";
10
11
  /**
11
- * Validates and returns sorted texture keys.
12
- *
13
- * @param textures - Texture definition map.
14
- * @returns Lexicographically sorted texture keys.
15
- */
16
- export function resolveTextureKeys(textures) {
17
- const keys = Object.keys(textures).sort();
18
- for (const key of keys) {
19
- assertUniformName(key);
20
- }
21
- return keys;
12
+ * Validates and returns sorted texture keys.
13
+ *
14
+ * @param textures - Texture definition map.
15
+ * @returns Lexicographically sorted texture keys.
16
+ */
17
+ function resolveTextureKeys(textures) {
18
+ const keys = Object.keys(textures).sort();
19
+ for (const key of keys) assertUniformName(key);
20
+ return keys;
22
21
  }
23
22
  /**
24
- * Applies defaults and clamps to a single texture definition.
25
- *
26
- * @param definition - Optional texture definition.
27
- * @returns Normalized definition with deterministic defaults.
28
- */
29
- export function normalizeTextureDefinition(definition) {
30
- const normalized = {
31
- source: definition?.source ?? null,
32
- colorSpace: definition?.colorSpace ?? 'srgb',
33
- format: definition?.colorSpace === 'linear' ? 'rgba8unorm' : 'rgba8unorm-srgb',
34
- flipY: definition?.flipY ?? true,
35
- generateMipmaps: definition?.generateMipmaps ?? false,
36
- premultipliedAlpha: definition?.premultipliedAlpha ?? false,
37
- anisotropy: Math.max(1, Math.min(16, Math.floor(definition?.anisotropy ?? 1))),
38
- filter: definition?.filter ?? DEFAULT_TEXTURE_FILTER,
39
- addressModeU: definition?.addressModeU ?? DEFAULT_TEXTURE_ADDRESS_MODE,
40
- addressModeV: definition?.addressModeV ?? DEFAULT_TEXTURE_ADDRESS_MODE
41
- };
42
- if (definition?.update !== undefined) {
43
- normalized.update = definition.update;
44
- }
45
- return normalized;
23
+ * Applies defaults and clamps to a single texture definition.
24
+ *
25
+ * @param definition - Optional texture definition.
26
+ * @returns Normalized definition with deterministic defaults.
27
+ */
28
+ function normalizeTextureDefinition(definition) {
29
+ const isStorage = definition?.storage === true;
30
+ const defaultFormat = definition?.colorSpace === "linear" ? "rgba8unorm" : "rgba8unorm-srgb";
31
+ const normalized = {
32
+ source: definition?.source ?? null,
33
+ colorSpace: definition?.colorSpace ?? "srgb",
34
+ format: definition?.format ?? defaultFormat,
35
+ flipY: definition?.flipY ?? true,
36
+ generateMipmaps: definition?.generateMipmaps ?? false,
37
+ premultipliedAlpha: definition?.premultipliedAlpha ?? false,
38
+ anisotropy: Math.max(1, Math.min(16, Math.floor(definition?.anisotropy ?? 1))),
39
+ filter: definition?.filter ?? DEFAULT_TEXTURE_FILTER,
40
+ addressModeU: definition?.addressModeU ?? DEFAULT_TEXTURE_ADDRESS_MODE,
41
+ addressModeV: definition?.addressModeV ?? DEFAULT_TEXTURE_ADDRESS_MODE,
42
+ storage: isStorage
43
+ };
44
+ if (definition?.width !== void 0) normalized.width = definition.width;
45
+ if (definition?.height !== void 0) normalized.height = definition.height;
46
+ if (definition?.update !== void 0) normalized.update = definition.update;
47
+ return normalized;
46
48
  }
47
49
  /**
48
- * Normalizes all texture definitions for already-resolved texture keys.
49
- *
50
- * @param textures - Source texture definitions.
51
- * @param textureKeys - Texture keys to normalize.
52
- * @returns Normalized map keyed by `textureKeys`.
53
- */
54
- export function normalizeTextureDefinitions(textures, textureKeys) {
55
- const out = {};
56
- for (const key of textureKeys) {
57
- out[key] = normalizeTextureDefinition(textures[key]);
58
- }
59
- return out;
50
+ * Normalizes all texture definitions for already-resolved texture keys.
51
+ *
52
+ * @param textures - Source texture definitions.
53
+ * @param textureKeys - Texture keys to normalize.
54
+ * @returns Normalized map keyed by `textureKeys`.
55
+ */
56
+ function normalizeTextureDefinitions(textures, textureKeys) {
57
+ const out = {};
58
+ for (const key of textureKeys) out[key] = normalizeTextureDefinition(textures[key]);
59
+ return out;
60
60
  }
61
61
  /**
62
- * Checks whether a texture value is a structured `{ source, width?, height? }` object.
63
- */
64
- export function isTextureData(value) {
65
- return typeof value === 'object' && value !== null && 'source' in value;
62
+ * Checks whether a texture value is a structured `{ source, width?, height? }` object.
63
+ */
64
+ function isTextureData(value) {
65
+ return typeof value === "object" && value !== null && "source" in value;
66
66
  }
67
67
  /**
68
- * Converts supported texture input variants to normalized `TextureData`.
69
- *
70
- * @param value - Texture value input.
71
- * @returns Structured texture data or `null`.
72
- */
73
- export function toTextureData(value) {
74
- if (value === null) {
75
- return null;
76
- }
77
- if (isTextureData(value)) {
78
- return value;
79
- }
80
- return { source: value };
68
+ * Converts supported texture input variants to normalized `TextureData`.
69
+ *
70
+ * @param value - Texture value input.
71
+ * @returns Structured texture data or `null`.
72
+ */
73
+ function toTextureData(value) {
74
+ if (value === null) return null;
75
+ if (isTextureData(value)) return value;
76
+ return { source: value };
81
77
  }
82
78
  /**
83
- * Resolves effective runtime texture update strategy.
84
- */
85
- export function resolveTextureUpdateMode(input) {
86
- if (input.override) {
87
- return input.override;
88
- }
89
- if (input.defaultMode) {
90
- return input.defaultMode;
91
- }
92
- if (isVideoTextureSource(input.source)) {
93
- return 'perFrame';
94
- }
95
- return 'once';
79
+ * Resolves effective runtime texture update strategy.
80
+ */
81
+ function resolveTextureUpdateMode(input) {
82
+ if (input.override) return input.override;
83
+ if (input.defaultMode) return input.defaultMode;
84
+ if (isVideoTextureSource(input.source)) return "perFrame";
85
+ return "once";
96
86
  }
97
87
  /**
98
- * Resolves texture dimensions from explicit values or source metadata.
99
- *
100
- * @param data - Texture payload.
101
- * @returns Positive integer width/height.
102
- * @throws {Error} When dimensions cannot be resolved to positive values.
103
- */
104
- export function resolveTextureSize(data) {
105
- const source = data.source;
106
- const width = data.width ?? source.naturalWidth ?? source.videoWidth ?? source.width ?? 0;
107
- const height = data.height ?? source.naturalHeight ?? source.videoHeight ?? source.height ?? 0;
108
- if (width <= 0 || height <= 0) {
109
- throw new Error('Texture source must have positive width and height');
110
- }
111
- return { width, height };
88
+ * Resolves texture dimensions from explicit values or source metadata.
89
+ *
90
+ * @param data - Texture payload.
91
+ * @returns Positive integer width/height.
92
+ * @throws {Error} When dimensions cannot be resolved to positive values.
93
+ */
94
+ function resolveTextureSize(data) {
95
+ const source = data.source;
96
+ const width = data.width ?? source.naturalWidth ?? source.videoWidth ?? source.width ?? 0;
97
+ const height = data.height ?? source.naturalHeight ?? source.videoHeight ?? source.height ?? 0;
98
+ if (width <= 0 || height <= 0) throw new Error("Texture source must have positive width and height");
99
+ return {
100
+ width,
101
+ height
102
+ };
112
103
  }
113
104
  /**
114
- * Computes the number of mipmap levels for a base texture size.
115
- *
116
- * @param width - Base width.
117
- * @param height - Base height.
118
- * @returns Total mip level count (minimum `1`).
119
- */
120
- export function getTextureMipLevelCount(width, height) {
121
- let levels = 1;
122
- let currentWidth = Math.max(1, width);
123
- let currentHeight = Math.max(1, height);
124
- while (currentWidth > 1 || currentHeight > 1) {
125
- currentWidth = Math.max(1, Math.floor(currentWidth / 2));
126
- currentHeight = Math.max(1, Math.floor(currentHeight / 2));
127
- levels += 1;
128
- }
129
- return levels;
105
+ * Computes the number of mipmap levels for a base texture size.
106
+ *
107
+ * @param width - Base width.
108
+ * @param height - Base height.
109
+ * @returns Total mip level count (minimum `1`).
110
+ */
111
+ function getTextureMipLevelCount(width, height) {
112
+ let levels = 1;
113
+ let currentWidth = Math.max(1, width);
114
+ let currentHeight = Math.max(1, height);
115
+ while (currentWidth > 1 || currentHeight > 1) {
116
+ currentWidth = Math.max(1, Math.floor(currentWidth / 2));
117
+ currentHeight = Math.max(1, Math.floor(currentHeight / 2));
118
+ levels += 1;
119
+ }
120
+ return levels;
130
121
  }
131
122
  /**
132
- * Checks whether the source is an `HTMLVideoElement`.
133
- */
134
- export function isVideoTextureSource(source) {
135
- return typeof HTMLVideoElement !== 'undefined' && source instanceof HTMLVideoElement;
123
+ * Checks whether the source is an `HTMLVideoElement`.
124
+ */
125
+ function isVideoTextureSource(source) {
126
+ return typeof HTMLVideoElement !== "undefined" && source instanceof HTMLVideoElement;
136
127
  }
128
+ //#endregion
129
+ export { getTextureMipLevelCount, isTextureData, isVideoTextureSource, normalizeTextureDefinition, normalizeTextureDefinitions, resolveTextureKeys, resolveTextureSize, resolveTextureUpdateMode, toTextureData };
130
+
131
+ //# sourceMappingURL=textures.js.map
@@ -0,0 +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\t/**\n\t * Whether this texture is a storage texture (writable by compute).\n\t */\n\tstorage: 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};\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":";;;;;AA0EA,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;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"}
@@ -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?: RenderPass[];
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?: () => RenderPass[] | undefined;
621
+ getPasses?: () => AnyPass[] | undefined;
489
622
  /**
490
623
  * Requested output color space.
491
624
  */
@@ -530,9 +663,19 @@ export interface Renderer {
530
663
  width: number;
531
664
  height: number;
532
665
  };
666
+ pendingStorageWrites?: PendingStorageWrite[];
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
  */
537
679
  destroy: () => void;
538
680
  }
681
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/core/types.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- /**
2
- * Core runtime and API contracts used by MotionGPU's renderer, hooks and scheduler.
3
- */
4
- export {};
@@ -46,3 +46,4 @@ export declare function packUniforms(uniforms: UniformMap, layout: UniformLayout
46
46
  * @throws {Error} When `data` size does not match the required layout size.
47
47
  */
48
48
  export declare function packUniformsInto(uniforms: UniformMap, layout: UniformLayout, data: Float32Array): void;
49
+ //# sourceMappingURL=uniforms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniforms.d.ts","sourceRoot":"","sources":["../../src/lib/core/uniforms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,aAAa,EAEb,UAAU,EAEV,WAAW,EACX,YAAY,EACZ,MAAM,YAAY,CAAC;AAwEpB;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAIpD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,CAsBjE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAkCtF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,UAAU,GAAG,aAAa,CA0BxE;AAyCD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,GAAG,YAAY,CAItF;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC/B,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,YAAY,GAChB,IAAI,CAkBN"}