@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,257 @@
1
+ import { assertUniformName } from './uniforms.js';
2
+ import type {
3
+ TextureData,
4
+ TextureDefinition,
5
+ TextureDefinitionMap,
6
+ TextureUpdateMode,
7
+ TextureValue
8
+ } from './types.js';
9
+
10
+ /**
11
+ * Texture definition with defaults and normalized numeric limits applied.
12
+ */
13
+ export interface NormalizedTextureDefinition {
14
+ /**
15
+ * Normalized source value.
16
+ */
17
+ source: TextureValue;
18
+ /**
19
+ * Effective color space.
20
+ */
21
+ colorSpace: 'srgb' | 'linear';
22
+ /**
23
+ * Effective texture format.
24
+ */
25
+ format: GPUTextureFormat;
26
+ /**
27
+ * Effective flip-y flag.
28
+ */
29
+ flipY: boolean;
30
+ /**
31
+ * Effective mipmap toggle.
32
+ */
33
+ generateMipmaps: boolean;
34
+ /**
35
+ * Effective premultiplied-alpha flag.
36
+ */
37
+ premultipliedAlpha: boolean;
38
+ /**
39
+ * Effective dynamic update strategy.
40
+ */
41
+ update?: TextureUpdateMode;
42
+ /**
43
+ * Effective anisotropy level.
44
+ */
45
+ anisotropy: number;
46
+ /**
47
+ * Effective filter mode.
48
+ */
49
+ filter: GPUFilterMode;
50
+ /**
51
+ * Effective U address mode.
52
+ */
53
+ addressModeU: GPUAddressMode;
54
+ /**
55
+ * Effective V address mode.
56
+ */
57
+ addressModeV: GPUAddressMode;
58
+ /**
59
+ * Whether this texture is a storage texture (writable by compute).
60
+ */
61
+ storage: boolean;
62
+ /**
63
+ * Explicit width for storage textures. Undefined when derived from source.
64
+ */
65
+ width?: number;
66
+ /**
67
+ * Explicit height for storage textures. Undefined when derived from source.
68
+ */
69
+ height?: number;
70
+ }
71
+
72
+ /**
73
+ * Default sampling filter for textures when no explicit value is provided.
74
+ */
75
+ const DEFAULT_TEXTURE_FILTER: GPUFilterMode = 'linear';
76
+
77
+ /**
78
+ * Default addressing mode for textures when no explicit value is provided.
79
+ */
80
+ const DEFAULT_TEXTURE_ADDRESS_MODE: GPUAddressMode = 'clamp-to-edge';
81
+
82
+ /**
83
+ * Validates and returns sorted texture keys.
84
+ *
85
+ * @param textures - Texture definition map.
86
+ * @returns Lexicographically sorted texture keys.
87
+ */
88
+ export function resolveTextureKeys(textures: TextureDefinitionMap): string[] {
89
+ const keys = Object.keys(textures).sort();
90
+ for (const key of keys) {
91
+ assertUniformName(key);
92
+ }
93
+ return keys;
94
+ }
95
+
96
+ /**
97
+ * Applies defaults and clamps to a single texture definition.
98
+ *
99
+ * @param definition - Optional texture definition.
100
+ * @returns Normalized definition with deterministic defaults.
101
+ */
102
+ export function normalizeTextureDefinition(
103
+ definition: TextureDefinition | undefined
104
+ ): NormalizedTextureDefinition {
105
+ const isStorage = definition?.storage === true;
106
+ const defaultFormat = definition?.colorSpace === 'linear' ? 'rgba8unorm' : 'rgba8unorm-srgb';
107
+ const normalized: NormalizedTextureDefinition = {
108
+ source: definition?.source ?? null,
109
+ colorSpace: definition?.colorSpace ?? 'srgb',
110
+ format: definition?.format ?? defaultFormat,
111
+ flipY: definition?.flipY ?? true,
112
+ generateMipmaps: definition?.generateMipmaps ?? false,
113
+ premultipliedAlpha: definition?.premultipliedAlpha ?? false,
114
+ anisotropy: Math.max(1, Math.min(16, Math.floor(definition?.anisotropy ?? 1))),
115
+ filter: definition?.filter ?? DEFAULT_TEXTURE_FILTER,
116
+ addressModeU: definition?.addressModeU ?? DEFAULT_TEXTURE_ADDRESS_MODE,
117
+ addressModeV: definition?.addressModeV ?? DEFAULT_TEXTURE_ADDRESS_MODE,
118
+ storage: isStorage
119
+ };
120
+
121
+ if (definition?.width !== undefined) {
122
+ normalized.width = definition.width;
123
+ }
124
+ if (definition?.height !== undefined) {
125
+ normalized.height = definition.height;
126
+ }
127
+
128
+ if (definition?.update !== undefined) {
129
+ normalized.update = definition.update;
130
+ }
131
+
132
+ return normalized;
133
+ }
134
+
135
+ /**
136
+ * Normalizes all texture definitions for already-resolved texture keys.
137
+ *
138
+ * @param textures - Source texture definitions.
139
+ * @param textureKeys - Texture keys to normalize.
140
+ * @returns Normalized map keyed by `textureKeys`.
141
+ */
142
+ export function normalizeTextureDefinitions(
143
+ textures: TextureDefinitionMap,
144
+ textureKeys: string[]
145
+ ): Record<string, NormalizedTextureDefinition> {
146
+ const out: Record<string, NormalizedTextureDefinition> = {};
147
+ for (const key of textureKeys) {
148
+ out[key] = normalizeTextureDefinition(textures[key]);
149
+ }
150
+ return out;
151
+ }
152
+
153
+ /**
154
+ * Checks whether a texture value is a structured `{ source, width?, height? }` object.
155
+ */
156
+ export function isTextureData(value: TextureValue): value is TextureData {
157
+ return typeof value === 'object' && value !== null && 'source' in value;
158
+ }
159
+
160
+ /**
161
+ * Converts supported texture input variants to normalized `TextureData`.
162
+ *
163
+ * @param value - Texture value input.
164
+ * @returns Structured texture data or `null`.
165
+ */
166
+ export function toTextureData(value: TextureValue): TextureData | null {
167
+ if (value === null) {
168
+ return null;
169
+ }
170
+
171
+ if (isTextureData(value)) {
172
+ return value;
173
+ }
174
+
175
+ return { source: value };
176
+ }
177
+
178
+ /**
179
+ * Resolves effective runtime texture update strategy.
180
+ */
181
+ export function resolveTextureUpdateMode(input: {
182
+ source: TextureData['source'];
183
+ override?: TextureUpdateMode;
184
+ defaultMode?: TextureUpdateMode;
185
+ }): TextureUpdateMode {
186
+ if (input.override) {
187
+ return input.override;
188
+ }
189
+
190
+ if (input.defaultMode) {
191
+ return input.defaultMode;
192
+ }
193
+
194
+ if (isVideoTextureSource(input.source)) {
195
+ return 'perFrame';
196
+ }
197
+
198
+ return 'once';
199
+ }
200
+
201
+ /**
202
+ * Resolves texture dimensions from explicit values or source metadata.
203
+ *
204
+ * @param data - Texture payload.
205
+ * @returns Positive integer width/height.
206
+ * @throws {Error} When dimensions cannot be resolved to positive values.
207
+ */
208
+ export function resolveTextureSize(data: TextureData): {
209
+ width: number;
210
+ height: number;
211
+ } {
212
+ const source = data.source as {
213
+ width?: number;
214
+ height?: number;
215
+ naturalWidth?: number;
216
+ naturalHeight?: number;
217
+ videoWidth?: number;
218
+ videoHeight?: number;
219
+ };
220
+
221
+ const width = data.width ?? source.naturalWidth ?? source.videoWidth ?? source.width ?? 0;
222
+ const height = data.height ?? source.naturalHeight ?? source.videoHeight ?? source.height ?? 0;
223
+
224
+ if (width <= 0 || height <= 0) {
225
+ throw new Error('Texture source must have positive width and height');
226
+ }
227
+
228
+ return { width, height };
229
+ }
230
+
231
+ /**
232
+ * Computes the number of mipmap levels for a base texture size.
233
+ *
234
+ * @param width - Base width.
235
+ * @param height - Base height.
236
+ * @returns Total mip level count (minimum `1`).
237
+ */
238
+ export function getTextureMipLevelCount(width: number, height: number): number {
239
+ let levels = 1;
240
+ let currentWidth = Math.max(1, width);
241
+ let currentHeight = Math.max(1, height);
242
+
243
+ while (currentWidth > 1 || currentHeight > 1) {
244
+ currentWidth = Math.max(1, Math.floor(currentWidth / 2));
245
+ currentHeight = Math.max(1, Math.floor(currentHeight / 2));
246
+ levels += 1;
247
+ }
248
+
249
+ return levels;
250
+ }
251
+
252
+ /**
253
+ * Checks whether the source is an `HTMLVideoElement`.
254
+ */
255
+ export function isVideoTextureSource(source: TextureData['source']): source is HTMLVideoElement {
256
+ return typeof HTMLVideoElement !== 'undefined' && source instanceof HTMLVideoElement;
257
+ }