@motion-core/motion-gpu 0.4.0 → 0.4.2

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 (207) hide show
  1. package/dist/advanced.d.ts +1 -0
  2. package/dist/advanced.d.ts.map +1 -0
  3. package/dist/advanced.js +12 -6
  4. package/dist/core/advanced.d.ts +1 -0
  5. package/dist/core/advanced.d.ts.map +1 -0
  6. package/dist/core/advanced.js +12 -5
  7. package/dist/core/current-value.d.ts +1 -0
  8. package/dist/core/current-value.d.ts.map +1 -0
  9. package/dist/core/current-value.js +35 -34
  10. package/dist/core/current-value.js.map +1 -0
  11. package/dist/core/error-diagnostics.d.ts +1 -0
  12. package/dist/core/error-diagnostics.d.ts.map +1 -0
  13. package/dist/core/error-diagnostics.js +70 -137
  14. package/dist/core/error-diagnostics.js.map +1 -0
  15. package/dist/core/error-report.d.ts +1 -0
  16. package/dist/core/error-report.d.ts.map +1 -0
  17. package/dist/core/error-report.js +184 -233
  18. package/dist/core/error-report.js.map +1 -0
  19. package/dist/core/frame-registry.d.ts +1 -0
  20. package/dist/core/frame-registry.d.ts.map +1 -0
  21. package/dist/core/frame-registry.js +546 -662
  22. package/dist/core/frame-registry.js.map +1 -0
  23. package/dist/core/index.d.ts +1 -0
  24. package/dist/core/index.d.ts.map +1 -0
  25. package/dist/core/index.js +11 -12
  26. package/dist/core/material-preprocess.d.ts +1 -0
  27. package/dist/core/material-preprocess.d.ts.map +1 -0
  28. package/dist/core/material-preprocess.js +128 -151
  29. package/dist/core/material-preprocess.js.map +1 -0
  30. package/dist/core/material.d.ts +1 -0
  31. package/dist/core/material.d.ts.map +1 -0
  32. package/dist/core/material.js +263 -317
  33. package/dist/core/material.js.map +1 -0
  34. package/dist/core/recompile-policy.d.ts +1 -0
  35. package/dist/core/recompile-policy.d.ts.map +1 -0
  36. package/dist/core/recompile-policy.js +18 -13
  37. package/dist/core/recompile-policy.js.map +1 -0
  38. package/dist/core/render-graph.d.ts +1 -0
  39. package/dist/core/render-graph.d.ts.map +1 -0
  40. package/dist/core/render-graph.js +61 -68
  41. package/dist/core/render-graph.js.map +1 -0
  42. package/dist/core/render-targets.d.ts +2 -0
  43. package/dist/core/render-targets.d.ts.map +1 -0
  44. package/dist/core/render-targets.js +52 -53
  45. package/dist/core/render-targets.js.map +1 -0
  46. package/dist/core/renderer.d.ts +1 -0
  47. package/dist/core/renderer.d.ts.map +1 -0
  48. package/dist/core/renderer.js +942 -1081
  49. package/dist/core/renderer.js.map +1 -0
  50. package/dist/core/runtime-loop.d.ts +2 -0
  51. package/dist/core/runtime-loop.d.ts.map +1 -0
  52. package/dist/core/runtime-loop.js +305 -362
  53. package/dist/core/runtime-loop.js.map +1 -0
  54. package/dist/core/scheduler-helpers.d.ts +1 -0
  55. package/dist/core/scheduler-helpers.d.ts.map +1 -0
  56. package/dist/core/scheduler-helpers.js +52 -51
  57. package/dist/core/scheduler-helpers.js.map +1 -0
  58. package/dist/core/shader.d.ts +1 -0
  59. package/dist/core/shader.d.ts.map +1 -0
  60. package/dist/core/shader.js +92 -117
  61. package/dist/core/shader.js.map +1 -0
  62. package/dist/core/texture-loader.d.ts +1 -0
  63. package/dist/core/texture-loader.d.ts.map +1 -0
  64. package/dist/core/texture-loader.js +205 -273
  65. package/dist/core/texture-loader.js.map +1 -0
  66. package/dist/core/textures.d.ts +2 -0
  67. package/dist/core/textures.d.ts.map +1 -0
  68. package/dist/core/textures.js +106 -116
  69. package/dist/core/textures.js.map +1 -0
  70. package/dist/core/types.d.ts +2 -0
  71. package/dist/core/types.d.ts.map +1 -0
  72. package/dist/core/types.js +0 -4
  73. package/dist/core/uniforms.d.ts +1 -0
  74. package/dist/core/uniforms.d.ts.map +1 -0
  75. package/dist/core/uniforms.js +170 -191
  76. package/dist/core/uniforms.js.map +1 -0
  77. package/dist/index.d.ts +1 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +11 -6
  80. package/dist/passes/BlitPass.d.ts +1 -0
  81. package/dist/passes/BlitPass.d.ts.map +1 -0
  82. package/dist/passes/BlitPass.js +23 -18
  83. package/dist/passes/BlitPass.js.map +1 -0
  84. package/dist/passes/CopyPass.d.ts +2 -0
  85. package/dist/passes/CopyPass.d.ts.map +1 -0
  86. package/dist/passes/CopyPass.js +58 -52
  87. package/dist/passes/CopyPass.js.map +1 -0
  88. package/dist/passes/FullscreenPass.d.ts +2 -0
  89. package/dist/passes/FullscreenPass.d.ts.map +1 -0
  90. package/dist/passes/FullscreenPass.js +127 -130
  91. package/dist/passes/FullscreenPass.js.map +1 -0
  92. package/dist/passes/ShaderPass.d.ts +1 -0
  93. package/dist/passes/ShaderPass.d.ts.map +1 -0
  94. package/dist/passes/ShaderPass.js +40 -37
  95. package/dist/passes/ShaderPass.js.map +1 -0
  96. package/dist/passes/index.d.ts +1 -0
  97. package/dist/passes/index.d.ts.map +1 -0
  98. package/dist/passes/index.js +4 -3
  99. package/dist/react/FragCanvas.d.ts +2 -0
  100. package/dist/react/FragCanvas.d.ts.map +1 -0
  101. package/dist/react/FragCanvas.js +234 -211
  102. package/dist/react/FragCanvas.js.map +1 -0
  103. package/dist/react/MotionGPUErrorOverlay.d.ts +1 -0
  104. package/dist/react/MotionGPUErrorOverlay.d.ts.map +1 -0
  105. package/dist/react/MotionGPUErrorOverlay.js +384 -48
  106. package/dist/react/MotionGPUErrorOverlay.js.map +1 -0
  107. package/dist/react/Portal.d.ts +1 -0
  108. package/dist/react/Portal.d.ts.map +1 -0
  109. package/dist/react/Portal.js +18 -21
  110. package/dist/react/Portal.js.map +1 -0
  111. package/dist/react/advanced.d.ts +1 -0
  112. package/dist/react/advanced.d.ts.map +1 -0
  113. package/dist/react/advanced.js +12 -6
  114. package/dist/react/frame-context.d.ts +1 -0
  115. package/dist/react/frame-context.d.ts.map +1 -0
  116. package/dist/react/frame-context.js +88 -94
  117. package/dist/react/frame-context.js.map +1 -0
  118. package/dist/react/index.d.ts +1 -0
  119. package/dist/react/index.d.ts.map +1 -0
  120. package/dist/react/index.js +10 -9
  121. package/dist/react/motiongpu-context.d.ts +1 -0
  122. package/dist/react/motiongpu-context.d.ts.map +1 -0
  123. package/dist/react/motiongpu-context.js +18 -15
  124. package/dist/react/motiongpu-context.js.map +1 -0
  125. package/dist/react/use-motiongpu-user-context.d.ts +1 -0
  126. package/dist/react/use-motiongpu-user-context.d.ts.map +1 -0
  127. package/dist/react/use-motiongpu-user-context.js +83 -82
  128. package/dist/react/use-motiongpu-user-context.js.map +1 -0
  129. package/dist/react/use-texture.d.ts +1 -0
  130. package/dist/react/use-texture.d.ts.map +1 -0
  131. package/dist/react/use-texture.js +132 -152
  132. package/dist/react/use-texture.js.map +1 -0
  133. package/dist/svelte/FragCanvas.svelte.d.ts +2 -0
  134. package/dist/svelte/FragCanvas.svelte.d.ts.map +1 -0
  135. package/dist/svelte/MotionGPUErrorOverlay.svelte +17 -20
  136. package/dist/svelte/MotionGPUErrorOverlay.svelte.d.ts +1 -0
  137. package/dist/svelte/MotionGPUErrorOverlay.svelte.d.ts.map +1 -0
  138. package/dist/svelte/Portal.svelte.d.ts +1 -0
  139. package/dist/svelte/Portal.svelte.d.ts.map +1 -0
  140. package/dist/svelte/advanced.d.ts +1 -0
  141. package/dist/svelte/advanced.d.ts.map +1 -0
  142. package/dist/svelte/advanced.js +11 -6
  143. package/dist/svelte/frame-context.d.ts +1 -0
  144. package/dist/svelte/frame-context.d.ts.map +1 -0
  145. package/dist/svelte/frame-context.js +27 -27
  146. package/dist/svelte/frame-context.js.map +1 -0
  147. package/dist/svelte/index.d.ts +1 -0
  148. package/dist/svelte/index.d.ts.map +1 -0
  149. package/dist/svelte/index.js +10 -9
  150. package/dist/svelte/motiongpu-context.d.ts +1 -0
  151. package/dist/svelte/motiongpu-context.d.ts.map +1 -0
  152. package/dist/svelte/motiongpu-context.js +24 -21
  153. package/dist/svelte/motiongpu-context.js.map +1 -0
  154. package/dist/svelte/use-motiongpu-user-context.d.ts +1 -0
  155. package/dist/svelte/use-motiongpu-user-context.d.ts.map +1 -0
  156. package/dist/svelte/use-motiongpu-user-context.js +69 -70
  157. package/dist/svelte/use-motiongpu-user-context.js.map +1 -0
  158. package/dist/svelte/use-texture.d.ts +1 -0
  159. package/dist/svelte/use-texture.d.ts.map +1 -0
  160. package/dist/svelte/use-texture.js +125 -147
  161. package/dist/svelte/use-texture.js.map +1 -0
  162. package/package.json +15 -7
  163. package/src/lib/advanced.ts +6 -0
  164. package/src/lib/core/advanced.ts +12 -0
  165. package/src/lib/core/current-value.ts +64 -0
  166. package/src/lib/core/error-diagnostics.ts +236 -0
  167. package/src/lib/core/error-report.ts +406 -0
  168. package/src/lib/core/frame-registry.ts +1189 -0
  169. package/src/lib/core/index.ts +77 -0
  170. package/src/lib/core/material-preprocess.ts +284 -0
  171. package/src/lib/core/material.ts +667 -0
  172. package/src/lib/core/recompile-policy.ts +31 -0
  173. package/src/lib/core/render-graph.ts +143 -0
  174. package/src/lib/core/render-targets.ts +107 -0
  175. package/src/lib/core/renderer.ts +1547 -0
  176. package/src/lib/core/runtime-loop.ts +458 -0
  177. package/src/lib/core/scheduler-helpers.ts +136 -0
  178. package/src/lib/core/shader.ts +258 -0
  179. package/src/lib/core/texture-loader.ts +476 -0
  180. package/src/lib/core/textures.ts +235 -0
  181. package/src/lib/core/types.ts +582 -0
  182. package/src/lib/core/uniforms.ts +282 -0
  183. package/src/lib/index.ts +6 -0
  184. package/src/lib/passes/BlitPass.ts +54 -0
  185. package/src/lib/passes/CopyPass.ts +80 -0
  186. package/src/lib/passes/FullscreenPass.ts +173 -0
  187. package/src/lib/passes/ShaderPass.ts +88 -0
  188. package/src/lib/passes/index.ts +3 -0
  189. package/src/lib/react/MotionGPUErrorOverlay.tsx +392 -0
  190. package/src/lib/react/advanced.ts +36 -0
  191. package/src/lib/react/frame-context.ts +169 -0
  192. package/src/lib/react/index.ts +51 -0
  193. package/src/lib/react/motiongpu-context.ts +88 -0
  194. package/src/lib/react/use-motiongpu-user-context.ts +186 -0
  195. package/src/lib/react/use-texture.ts +233 -0
  196. package/src/lib/svelte/FragCanvas.svelte +249 -0
  197. package/src/lib/svelte/MotionGPUErrorOverlay.svelte +382 -0
  198. package/src/lib/svelte/Portal.svelte +31 -0
  199. package/src/lib/svelte/advanced.ts +32 -0
  200. package/src/lib/svelte/frame-context.ts +87 -0
  201. package/src/lib/svelte/index.ts +51 -0
  202. package/src/lib/svelte/motiongpu-context.ts +97 -0
  203. package/src/lib/svelte/use-motiongpu-user-context.ts +145 -0
  204. package/src/lib/svelte/use-texture.ts +232 -0
  205. package/dist/react/MotionGPUErrorOverlay.tsx +0 -129
  206. /package/{dist → src/lib}/react/FragCanvas.tsx +0 -0
  207. /package/{dist → src/lib}/react/Portal.tsx +0 -0
@@ -0,0 +1,143 @@
1
+ import type { RenderPass, RenderPassInputSlot, RenderPassOutputSlot } from './types.js';
2
+
3
+ /**
4
+ * Resolved render-pass step with defaults applied.
5
+ */
6
+ export interface RenderGraphStep {
7
+ /**
8
+ * User pass instance.
9
+ */
10
+ pass: RenderPass;
11
+ /**
12
+ * Resolved input slot.
13
+ */
14
+ input: RenderPassInputSlot;
15
+ /**
16
+ * Resolved output slot.
17
+ */
18
+ output: RenderPassOutputSlot;
19
+ /**
20
+ * Whether ping-pong swap should be performed after render.
21
+ */
22
+ needsSwap: boolean;
23
+ /**
24
+ * Whether pass should clear output before drawing.
25
+ */
26
+ clear: boolean;
27
+ /**
28
+ * Effective clear color.
29
+ */
30
+ clearColor: [number, number, number, number];
31
+ /**
32
+ * Whether output should be preserved after pass ends.
33
+ */
34
+ preserve: boolean;
35
+ }
36
+
37
+ /**
38
+ * Immutable render-graph execution plan for one frame.
39
+ */
40
+ export interface RenderGraphPlan {
41
+ /**
42
+ * Resolved enabled steps in execution order.
43
+ */
44
+ steps: RenderGraphStep[];
45
+ /**
46
+ * Output slot holding final frame result before presentation.
47
+ */
48
+ finalOutput: RenderPassOutputSlot;
49
+ }
50
+
51
+ /**
52
+ * Creates a copy of RGBA clear color.
53
+ */
54
+ function cloneClearColor(
55
+ color: [number, number, number, number]
56
+ ): [number, number, number, number] {
57
+ return [color[0], color[1], color[2], color[3]];
58
+ }
59
+
60
+ /**
61
+ * Builds validated render graph plan from runtime pass list.
62
+ *
63
+ * @param passes - Runtime passes.
64
+ * @param defaultClearColor - Global clear color fallback.
65
+ * @returns Resolved render graph plan.
66
+ */
67
+ export function planRenderGraph(
68
+ passes: RenderPass[] | undefined,
69
+ defaultClearColor: [number, number, number, number],
70
+ renderTargetSlots?: Iterable<string>
71
+ ): RenderGraphPlan {
72
+ const steps: RenderGraphStep[] = [];
73
+ const declaredTargets = new Set(renderTargetSlots ?? []);
74
+ const availableSlots = new Set<RenderPassInputSlot | RenderPassOutputSlot>(['source']);
75
+ let finalOutput: RenderPassOutputSlot = 'canvas';
76
+ let enabledIndex = 0;
77
+
78
+ for (const pass of passes ?? []) {
79
+ if (pass.enabled === false) {
80
+ continue;
81
+ }
82
+
83
+ const needsSwap = pass.needsSwap ?? true;
84
+ const input: RenderPassInputSlot = pass.input ?? 'source';
85
+ const output: RenderPassOutputSlot = pass.output ?? (needsSwap ? 'target' : 'source');
86
+
87
+ if (input === 'canvas') {
88
+ throw new Error(`Render pass #${enabledIndex} cannot read from "canvas".`);
89
+ }
90
+
91
+ const inputIsNamed = input !== 'source' && input !== 'target';
92
+ if (inputIsNamed && !declaredTargets.has(input)) {
93
+ throw new Error(`Render pass #${enabledIndex} reads unknown target "${input}".`);
94
+ }
95
+
96
+ const outputIsNamed = output !== 'source' && output !== 'target' && output !== 'canvas';
97
+ if (outputIsNamed && !declaredTargets.has(output)) {
98
+ throw new Error(`Render pass #${enabledIndex} writes unknown target "${output}".`);
99
+ }
100
+
101
+ if (needsSwap && (input !== 'source' || output !== 'target')) {
102
+ throw new Error(
103
+ `Render pass #${enabledIndex} uses needsSwap=true but does not follow source->target flow.`
104
+ );
105
+ }
106
+
107
+ if (!availableSlots.has(input)) {
108
+ throw new Error(`Render pass #${enabledIndex} reads "${input}" before it is written.`);
109
+ }
110
+
111
+ const clear = pass.clear ?? false;
112
+ const clearColor = cloneClearColor(pass.clearColor ?? defaultClearColor);
113
+ const preserve = pass.preserve ?? true;
114
+
115
+ steps.push({
116
+ pass,
117
+ input,
118
+ output,
119
+ needsSwap,
120
+ clear,
121
+ clearColor,
122
+ preserve
123
+ });
124
+
125
+ if (needsSwap) {
126
+ availableSlots.add('target');
127
+ availableSlots.add('source');
128
+ finalOutput = 'source';
129
+ } else {
130
+ if (output !== 'canvas') {
131
+ availableSlots.add(output);
132
+ }
133
+ finalOutput = output;
134
+ }
135
+
136
+ enabledIndex += 1;
137
+ }
138
+
139
+ return {
140
+ steps,
141
+ finalOutput
142
+ };
143
+ }
@@ -0,0 +1,107 @@
1
+ import { assertUniformName } from './uniforms.js';
2
+ import type { RenderTargetDefinitionMap } from './types.js';
3
+
4
+ /**
5
+ * Concrete render target configuration resolved for current canvas size.
6
+ */
7
+ export interface ResolvedRenderTargetDefinition {
8
+ /**
9
+ * Render target key.
10
+ */
11
+ key: string;
12
+ /**
13
+ * Resolved width in pixels.
14
+ */
15
+ width: number;
16
+ /**
17
+ * Resolved height in pixels.
18
+ */
19
+ height: number;
20
+ /**
21
+ * Resolved format.
22
+ */
23
+ format: GPUTextureFormat;
24
+ }
25
+
26
+ /**
27
+ * Asserts positive finite numeric input for render target options.
28
+ */
29
+ function assertPositiveFinite(name: string, value: number): void {
30
+ if (!Number.isFinite(value) || value <= 0) {
31
+ throw new Error(`${name} must be a finite number greater than 0`);
32
+ }
33
+ }
34
+
35
+ /**
36
+ * Resolves a render target dimension from explicit value or scaled canvas size.
37
+ */
38
+ function resolveDimension(
39
+ explicitValue: number | undefined,
40
+ canvasDimension: number,
41
+ scale: number
42
+ ): number {
43
+ if (explicitValue !== undefined) {
44
+ assertPositiveFinite('RenderTarget dimension', explicitValue);
45
+ return Math.max(1, Math.floor(explicitValue));
46
+ }
47
+
48
+ return Math.max(1, Math.floor(canvasDimension * scale));
49
+ }
50
+
51
+ /**
52
+ * Resolves all render target definitions for a specific canvas size.
53
+ *
54
+ * @param definitions - Declarative definitions.
55
+ * @param canvasWidth - Current canvas width in pixels.
56
+ * @param canvasHeight - Current canvas height in pixels.
57
+ * @param defaultFormat - Fallback texture format.
58
+ * @returns Sorted concrete render target definitions.
59
+ */
60
+ export function resolveRenderTargetDefinitions(
61
+ definitions: RenderTargetDefinitionMap | undefined,
62
+ canvasWidth: number,
63
+ canvasHeight: number,
64
+ defaultFormat: GPUTextureFormat
65
+ ): ResolvedRenderTargetDefinition[] {
66
+ if (!definitions) {
67
+ return [];
68
+ }
69
+
70
+ const keys = Object.keys(definitions).sort();
71
+ const resolved: ResolvedRenderTargetDefinition[] = [];
72
+
73
+ for (const key of keys) {
74
+ assertUniformName(key);
75
+ const definition = definitions[key];
76
+ const scale = definition?.scale ?? 1;
77
+ assertPositiveFinite('RenderTarget scale', scale);
78
+
79
+ const width = resolveDimension(definition?.width, canvasWidth, scale);
80
+ const height = resolveDimension(definition?.height, canvasHeight, scale);
81
+
82
+ resolved.push({
83
+ key,
84
+ width,
85
+ height,
86
+ format: definition?.format ?? defaultFormat
87
+ });
88
+ }
89
+
90
+ return resolved;
91
+ }
92
+
93
+ /**
94
+ * Builds a deterministic signature used to detect render target topology changes.
95
+ *
96
+ * @param resolvedDefinitions - Concrete target definitions.
97
+ * @returns Stable signature string.
98
+ */
99
+ export function buildRenderTargetSignature(
100
+ resolvedDefinitions: ResolvedRenderTargetDefinition[]
101
+ ): string {
102
+ return resolvedDefinitions
103
+ .map((definition) => {
104
+ return `${definition.key}:${definition.format}:${definition.width}x${definition.height}`;
105
+ })
106
+ .join('|');
107
+ }