@codexo/exojs 0.6.12 → 0.7.11

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 (186) hide show
  1. package/CHANGELOG.md +1316 -0
  2. package/dist/esm/audio/AbstractMedia.d.ts +18 -0
  3. package/dist/esm/audio/AbstractMedia.js +66 -0
  4. package/dist/esm/audio/AbstractMedia.js.map +1 -1
  5. package/dist/esm/audio/AudioAnalyser.d.ts +62 -23
  6. package/dist/esm/audio/AudioAnalyser.js +261 -57
  7. package/dist/esm/audio/AudioAnalyser.js.map +1 -1
  8. package/dist/esm/audio/AudioBus.d.ts +45 -0
  9. package/dist/esm/audio/AudioBus.js +219 -0
  10. package/dist/esm/audio/AudioBus.js.map +1 -0
  11. package/dist/esm/audio/AudioFilter.d.ts +9 -0
  12. package/dist/esm/audio/AudioFilter.js +7 -0
  13. package/dist/esm/audio/AudioFilter.js.map +1 -0
  14. package/dist/esm/audio/AudioListener.d.ts +20 -0
  15. package/dist/esm/audio/AudioListener.js +86 -0
  16. package/dist/esm/audio/AudioListener.js.map +1 -0
  17. package/dist/esm/audio/AudioManager.d.ts +31 -0
  18. package/dist/esm/audio/AudioManager.js +102 -0
  19. package/dist/esm/audio/AudioManager.js.map +1 -0
  20. package/dist/esm/audio/BeatDetector.d.ts +121 -0
  21. package/dist/esm/audio/BeatDetector.js +936 -0
  22. package/dist/esm/audio/BeatDetector.js.map +1 -0
  23. package/dist/esm/audio/Envelope.d.ts +44 -0
  24. package/dist/esm/audio/Envelope.js +60 -0
  25. package/dist/esm/audio/Envelope.js.map +1 -0
  26. package/dist/esm/audio/Music.d.ts +8 -0
  27. package/dist/esm/audio/Music.js +33 -4
  28. package/dist/esm/audio/Music.js.map +1 -1
  29. package/dist/esm/audio/OscillatorSound.d.ts +98 -0
  30. package/dist/esm/audio/OscillatorSound.js +342 -0
  31. package/dist/esm/audio/OscillatorSound.js.map +1 -0
  32. package/dist/esm/audio/Sound.d.ts +94 -9
  33. package/dist/esm/audio/Sound.js +283 -117
  34. package/dist/esm/audio/Sound.js.map +1 -1
  35. package/dist/esm/audio/crossFade.d.ts +19 -0
  36. package/dist/esm/audio/crossFade.js +26 -0
  37. package/dist/esm/audio/crossFade.js.map +1 -0
  38. package/dist/esm/audio/dsp/fft.d.ts +22 -0
  39. package/dist/esm/audio/dsp/mel.d.ts +43 -0
  40. package/dist/esm/audio/dsp/tempogram.d.ts +51 -0
  41. package/dist/esm/audio/filters/ChorusFilter.d.ts +47 -0
  42. package/dist/esm/audio/filters/ChorusFilter.js +139 -0
  43. package/dist/esm/audio/filters/ChorusFilter.js.map +1 -0
  44. package/dist/esm/audio/filters/CompressorFilter.d.ts +31 -0
  45. package/dist/esm/audio/filters/CompressorFilter.js +97 -0
  46. package/dist/esm/audio/filters/CompressorFilter.js.map +1 -0
  47. package/dist/esm/audio/filters/DelayFilter.d.ts +23 -0
  48. package/dist/esm/audio/filters/DelayFilter.js +100 -0
  49. package/dist/esm/audio/filters/DelayFilter.js.map +1 -0
  50. package/dist/esm/audio/filters/DuckingFilter.d.ts +31 -0
  51. package/dist/esm/audio/filters/DuckingFilter.js +152 -0
  52. package/dist/esm/audio/filters/DuckingFilter.js.map +1 -0
  53. package/dist/esm/audio/filters/EqualizerFilter.d.ts +29 -0
  54. package/dist/esm/audio/filters/EqualizerFilter.js +94 -0
  55. package/dist/esm/audio/filters/EqualizerFilter.js.map +1 -0
  56. package/dist/esm/audio/filters/GranularFilter.d.ts +56 -0
  57. package/dist/esm/audio/filters/GranularFilter.js +170 -0
  58. package/dist/esm/audio/filters/GranularFilter.js.map +1 -0
  59. package/dist/esm/audio/filters/HighpassFilter.d.ts +19 -0
  60. package/dist/esm/audio/filters/HighpassFilter.js +62 -0
  61. package/dist/esm/audio/filters/HighpassFilter.js.map +1 -0
  62. package/dist/esm/audio/filters/LowpassFilter.d.ts +19 -0
  63. package/dist/esm/audio/filters/LowpassFilter.js +62 -0
  64. package/dist/esm/audio/filters/LowpassFilter.js.map +1 -0
  65. package/dist/esm/audio/filters/PitchShiftFilter.d.ts +42 -0
  66. package/dist/esm/audio/filters/PitchShiftFilter.js +130 -0
  67. package/dist/esm/audio/filters/PitchShiftFilter.js.map +1 -0
  68. package/dist/esm/audio/filters/ReverbFilter.d.ts +24 -0
  69. package/dist/esm/audio/filters/ReverbFilter.js +107 -0
  70. package/dist/esm/audio/filters/ReverbFilter.js.map +1 -0
  71. package/dist/esm/audio/filters/VocoderFilter.d.ts +38 -0
  72. package/dist/esm/audio/filters/VocoderFilter.js +163 -0
  73. package/dist/esm/audio/filters/VocoderFilter.js.map +1 -0
  74. package/dist/esm/audio/filters/WorkletFilter.d.ts +46 -0
  75. package/dist/esm/audio/filters/WorkletFilter.js +101 -0
  76. package/dist/esm/audio/filters/WorkletFilter.js.map +1 -0
  77. package/dist/esm/audio/filters/index.d.ts +12 -0
  78. package/dist/esm/audio/index.d.ts +15 -1
  79. package/dist/esm/audio/worklet/registerWorklet.d.ts +10 -0
  80. package/dist/esm/audio/worklet/registerWorklet.js +44 -0
  81. package/dist/esm/audio/worklet/registerWorklet.js.map +1 -0
  82. package/dist/esm/core/Application.d.ts +19 -0
  83. package/dist/esm/core/Application.js +76 -2
  84. package/dist/esm/core/Application.js.map +1 -1
  85. package/dist/esm/core/SceneNode.d.ts +9 -1
  86. package/dist/esm/core/SceneNode.js +44 -6
  87. package/dist/esm/core/SceneNode.js.map +1 -1
  88. package/dist/esm/core/Time.js +1 -1
  89. package/dist/esm/core/index.d.ts +0 -1
  90. package/dist/esm/debug/BoundingBoxesLayer.d.ts +18 -0
  91. package/dist/esm/debug/BoundingBoxesLayer.js +128 -0
  92. package/dist/esm/debug/BoundingBoxesLayer.js.map +1 -0
  93. package/dist/esm/debug/DebugLayer.d.ts +29 -0
  94. package/dist/esm/debug/DebugLayer.js +26 -0
  95. package/dist/esm/debug/DebugLayer.js.map +1 -0
  96. package/dist/esm/debug/DebugOverlay.d.ts +48 -0
  97. package/dist/esm/debug/DebugOverlay.js +117 -0
  98. package/dist/esm/debug/DebugOverlay.js.map +1 -0
  99. package/dist/esm/debug/HitTestLayer.d.ts +23 -0
  100. package/dist/esm/debug/HitTestLayer.js +109 -0
  101. package/dist/esm/debug/HitTestLayer.js.map +1 -0
  102. package/dist/esm/debug/PerformanceLayer.d.ts +21 -0
  103. package/dist/esm/debug/PerformanceLayer.js +175 -0
  104. package/dist/esm/debug/PerformanceLayer.js.map +1 -0
  105. package/dist/esm/debug/PointerStackLayer.d.ts +23 -0
  106. package/dist/esm/debug/PointerStackLayer.js +152 -0
  107. package/dist/esm/debug/PointerStackLayer.js.map +1 -0
  108. package/dist/esm/debug/index.d.ts +6 -0
  109. package/dist/esm/debug/index.js +7 -0
  110. package/dist/esm/debug/index.js.map +1 -0
  111. package/dist/esm/index.js +28 -2
  112. package/dist/esm/index.js.map +1 -1
  113. package/dist/esm/input/InputManager.d.ts +10 -0
  114. package/dist/esm/input/InputManager.js +35 -5
  115. package/dist/esm/input/InputManager.js.map +1 -1
  116. package/dist/esm/input/InteractionEvent.d.ts +18 -0
  117. package/dist/esm/input/InteractionEvent.js +29 -0
  118. package/dist/esm/input/InteractionEvent.js.map +1 -0
  119. package/dist/esm/input/InteractionManager.d.ts +134 -0
  120. package/dist/esm/input/InteractionManager.js +546 -0
  121. package/dist/esm/input/InteractionManager.js.map +1 -0
  122. package/dist/esm/input/index.d.ts +2 -0
  123. package/dist/esm/input/interaction-hooks.d.ts +34 -0
  124. package/dist/esm/input/interaction-hooks.js +35 -0
  125. package/dist/esm/input/interaction-hooks.js.map +1 -0
  126. package/dist/esm/math/Circle.d.ts +12 -2
  127. package/dist/esm/math/Circle.js +82 -14
  128. package/dist/esm/math/Circle.js.map +1 -1
  129. package/dist/esm/math/Interval.js +1 -1
  130. package/dist/esm/math/ObservableVector.d.ts +2 -2
  131. package/dist/esm/math/ObservableVector.js +4 -2
  132. package/dist/esm/math/ObservableVector.js.map +1 -1
  133. package/dist/esm/math/Polygon.d.ts +15 -1
  134. package/dist/esm/math/Polygon.js +58 -6
  135. package/dist/esm/math/Polygon.js.map +1 -1
  136. package/dist/esm/math/Quadtree.d.ts +47 -0
  137. package/dist/esm/math/Quadtree.js +168 -0
  138. package/dist/esm/math/Quadtree.js.map +1 -0
  139. package/dist/esm/math/Random.js +1 -1
  140. package/dist/esm/math/Size.js +1 -1
  141. package/dist/esm/math/Vector.js +1 -1
  142. package/dist/esm/math/collision-detection.js +4 -1
  143. package/dist/esm/math/collision-detection.js.map +1 -1
  144. package/dist/esm/math/index.d.ts +1 -0
  145. package/dist/esm/particles/ParticleSystem.js +1 -0
  146. package/dist/esm/particles/ParticleSystem.js.map +1 -1
  147. package/dist/esm/particles/affectors/TorqueAffector.js +1 -1
  148. package/dist/esm/rendering/Container.d.ts +1 -0
  149. package/dist/esm/rendering/Container.js +19 -0
  150. package/dist/esm/rendering/Container.js.map +1 -1
  151. package/dist/esm/rendering/RenderNode.d.ts +27 -0
  152. package/dist/esm/rendering/RenderNode.js +44 -0
  153. package/dist/esm/rendering/RenderNode.js.map +1 -1
  154. package/dist/esm/rendering/View.d.ts +6 -4
  155. package/dist/esm/rendering/View.js +12 -2
  156. package/dist/esm/rendering/View.js.map +1 -1
  157. package/dist/esm/rendering/filters/WebGl2ShaderFilter.d.ts +109 -0
  158. package/dist/esm/rendering/filters/WebGl2ShaderFilter.js +268 -0
  159. package/dist/esm/rendering/filters/WebGl2ShaderFilter.js.map +1 -0
  160. package/dist/esm/rendering/filters/WebGpuShaderFilter.d.ts +111 -0
  161. package/dist/esm/rendering/filters/WebGpuShaderFilter.js +397 -0
  162. package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -0
  163. package/dist/esm/rendering/index.d.ts +3 -0
  164. package/dist/esm/rendering/mesh/Mesh.js +1 -0
  165. package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
  166. package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.d.ts +34 -0
  167. package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.js +60 -0
  168. package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.js.map +1 -0
  169. package/dist/esm/rendering/sprite/Sprite.d.ts +6 -1
  170. package/dist/esm/rendering/sprite/Sprite.js +41 -19
  171. package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
  172. package/dist/esm/rendering/video/Video.d.ts +4 -0
  173. package/dist/esm/rendering/video/Video.js +32 -4
  174. package/dist/esm/rendering/video/Video.js.map +1 -1
  175. package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +4 -4
  176. package/dist/esm/rendering/webgl2/WebGl2Backend.js +7 -16
  177. package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
  178. package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +10 -8
  179. package/dist/esm/rendering/webgpu/WebGpuBackend.js +30 -40
  180. package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
  181. package/dist/exo.esm.js +7764 -2453
  182. package/dist/exo.esm.js.map +1 -1
  183. package/package.json +14 -2
  184. package/dist/esm/core/Quadtree.d.ts +0 -20
  185. package/dist/esm/core/Quadtree.js +0 -86
  186. package/dist/esm/core/Quadtree.js.map +0 -1
@@ -0,0 +1,397 @@
1
+ import { Color } from '../../core/Color.js';
2
+ import { RenderBackendType } from '../RenderBackendType.js';
3
+ import { RenderTargetPass } from '../RenderTargetPass.js';
4
+ import { Texture } from '../texture/Texture.js';
5
+ import { Filter } from './Filter.js';
6
+
7
+ /// <reference types="@webgpu/types" />
8
+ /**
9
+ * Default fullscreen-quad vertex shader (WGSL). Positions are already in
10
+ * clip space (-1..1), so no projection matrix is needed.
11
+ */
12
+ const defaultVertexSource = `
13
+ struct VsOut {
14
+ @builtin(position) position: vec4<f32>,
15
+ @location(0) vUv: vec2<f32>,
16
+ };
17
+
18
+ @vertex
19
+ fn main(@location(0) aPosition: vec2<f32>, @location(1) aUv: vec2<f32>) -> VsOut {
20
+ var out: VsOut;
21
+ out.position = vec4<f32>(aPosition, 0.0, 1.0);
22
+ out.vUv = aUv;
23
+ return out;
24
+ }
25
+ `;
26
+ /**
27
+ * Interleaved position+UV data for a fullscreen TRIANGLE_STRIP quad.
28
+ * Layout per vertex: [posX, posY, uvX, uvY]
29
+ *
30
+ * Vertices (clip-space positions, 0..1 UVs):
31
+ * 0: bottom-left (-1, -1, 0, 0)
32
+ * 1: bottom-right ( 1, -1, 1, 0)
33
+ * 2: top-left (-1, 1, 0, 1)
34
+ * 3: top-right ( 1, 1, 1, 1)
35
+ */
36
+ const quadVertexData = new Float32Array([
37
+ -1, -1, 0, 0,
38
+ 1, -1, 1, 0,
39
+ -1, 1, 0, 1,
40
+ 1, 1, 1, 1,
41
+ ]);
42
+ /** Bytes per vertex: 2 floats position + 2 floats UV = 16 bytes */
43
+ const vertexStrideBytes = 16;
44
+ /** Resolution uniform buffer size: vec2<f32> = 8 bytes, padded to 16 */
45
+ const resolutionBufferBytes = 16;
46
+ /** Returns true when the value is a texture (goes into a bind group, not a UBO). */
47
+ function isTextureValue(value) {
48
+ return value instanceof Texture
49
+ || (typeof value === 'object' && value !== null && 'width' in value && 'height' in value && !(value instanceof Float32Array) && !(value instanceof Int32Array) && !Array.isArray(value));
50
+ }
51
+ /**
52
+ * A high-level {@link Filter} subclass that renders the input texture through
53
+ * a user-provided WGSL fragment shader on the **WebGPU** backend.
54
+ *
55
+ * For the WebGL2 backend use {@link WebGl2ShaderFilter}.
56
+ *
57
+ * ## Usage
58
+ *
59
+ * ```ts
60
+ * const filter = new WebGpuShaderFilter({
61
+ * fragmentSource: `
62
+ * @group(0) @binding(0) var<uniform> uResolution: vec2<f32>;
63
+ * @group(0) @binding(1) var uTexture: texture_2d<f32>;
64
+ * @group(0) @binding(2) var uSampler: sampler;
65
+ *
66
+ * @fragment
67
+ * fn main(@location(0) vUv: vec2<f32>) -> @location(0) vec4<f32> {
68
+ * return textureSample(uTexture, uSampler, vUv);
69
+ * }
70
+ * `,
71
+ * uniforms: { uTime: 0.0 },
72
+ * });
73
+ *
74
+ * // Update uniforms each frame:
75
+ * filter.uniforms.uTime = performance.now() / 1000;
76
+ * sprite.filters = [filter];
77
+ * ```
78
+ *
79
+ * ## Auto-bound uniforms (group 0)
80
+ *
81
+ * - `@binding(0)` — `var<uniform> uResolution: vec2<f32>` (output dimensions)
82
+ * - `@binding(1)` — `var uTexture: texture_2d<f32>` (filter input)
83
+ * - `@binding(2)` — `var uSampler: sampler`
84
+ *
85
+ * ## User uniforms (group 1)
86
+ *
87
+ * All non-texture user uniforms are packed into a single uniform buffer at
88
+ * `@binding(0)`. Each member occupies a 16-byte aligned slot (conservative
89
+ * alignment). Declare your WGSL struct to match this layout.
90
+ *
91
+ * Texture/RenderTexture uniforms are bound as separate entries starting at
92
+ * `@binding(1)` (texture) and `@binding(N+1)` (sampler), in declaration order.
93
+ */
94
+ class WebGpuShaderFilter extends Filter {
95
+ /**
96
+ * Mutable map of uniform values. Set values via property assignment;
97
+ * they are flushed to the GPU before each apply().
98
+ *
99
+ * filter.uniforms.uTime = 1.234;
100
+ * filter.uniforms.uColor = [1, 0.5, 0, 1]; // vec4
101
+ */
102
+ uniforms;
103
+ _fragmentSource;
104
+ _vertexSource;
105
+ _connection = null;
106
+ constructor(options) {
107
+ super();
108
+ if (!options.fragmentSource) {
109
+ throw new Error('WebGpuShaderFilter requires fragmentSource.');
110
+ }
111
+ this._fragmentSource = options.fragmentSource;
112
+ this._vertexSource = options.vertexSource ?? defaultVertexSource;
113
+ this.uniforms = { ...(options.uniforms ?? {}) };
114
+ }
115
+ apply(backend, input, output) {
116
+ if (backend.backendType !== RenderBackendType.WebGpu) {
117
+ throw new Error('WebGpuShaderFilter requires the WebGPU backend. Use WebGl2ShaderFilter on WebGL2.');
118
+ }
119
+ const gpuBackend = backend;
120
+ this._ensureConnected(gpuBackend, output);
121
+ const conn = this._connection;
122
+ backend.execute(new RenderTargetPass((b) => {
123
+ const gpu = b;
124
+ const device = conn.device;
125
+ // ---- Update auto-bound resolution uniform ----
126
+ const resData = new Float32Array([output.width, output.height, 0, 0]);
127
+ device.queue.writeBuffer(conn.resolutionBuffer, 0, resData);
128
+ // ---- Build auto-bind group (group 0) ----
129
+ const inputBinding = gpu.getTextureBinding(input);
130
+ const autoBindGroup = device.createBindGroup({
131
+ layout: conn.autoBindGroupLayout,
132
+ entries: [
133
+ { binding: 0, resource: { buffer: conn.resolutionBuffer } },
134
+ { binding: 1, resource: inputBinding.view },
135
+ { binding: 2, resource: conn.sampler },
136
+ ],
137
+ });
138
+ // ---- Build user bind group (group 1) ----
139
+ const userBindGroup = this._buildUserBindGroup(gpu, conn);
140
+ // ---- Encode render pass ----
141
+ const device2 = gpu.device;
142
+ const encoder = device2.createCommandEncoder();
143
+ const pass = encoder.beginRenderPass({
144
+ colorAttachments: [gpu.createColorAttachment()],
145
+ });
146
+ gpu.stats.renderPasses++;
147
+ pass.setPipeline(conn.pipeline);
148
+ pass.setVertexBuffer(0, conn.vertexBuffer);
149
+ pass.setBindGroup(0, autoBindGroup);
150
+ pass.setBindGroup(1, userBindGroup);
151
+ pass.draw(4);
152
+ gpu.stats.drawCalls++;
153
+ pass.end();
154
+ gpu.submit(encoder.finish());
155
+ }, {
156
+ target: output,
157
+ view: output.view,
158
+ clearColor: Color.transparentBlack,
159
+ }));
160
+ }
161
+ destroy() {
162
+ if (this._connection !== null) {
163
+ this._connection.vertexBuffer.destroy();
164
+ this._connection.resolutionBuffer.destroy();
165
+ this._connection.userUniformBuffer?.destroy();
166
+ this._connection = null;
167
+ }
168
+ for (const key of Object.keys(this.uniforms)) {
169
+ delete this.uniforms[key];
170
+ }
171
+ }
172
+ // ---------------------------------------------------------------------------
173
+ // Private helpers
174
+ // ---------------------------------------------------------------------------
175
+ _ensureConnected(backend, output) {
176
+ if (this._connection !== null) {
177
+ return;
178
+ }
179
+ const device = backend.device;
180
+ // Shader modules
181
+ const vsModule = device.createShaderModule({ code: this._vertexSource });
182
+ const fsModule = device.createShaderModule({ code: this._fragmentSource });
183
+ // ---- Group 0 layout: resolution uniform + input texture + sampler ----
184
+ const autoBindGroupLayout = device.createBindGroupLayout({
185
+ entries: [
186
+ {
187
+ binding: 0,
188
+ visibility: GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
189
+ buffer: { type: 'uniform' },
190
+ },
191
+ {
192
+ binding: 1,
193
+ visibility: GPUShaderStage.FRAGMENT,
194
+ texture: {},
195
+ },
196
+ {
197
+ binding: 2,
198
+ visibility: GPUShaderStage.FRAGMENT,
199
+ sampler: {},
200
+ },
201
+ ],
202
+ });
203
+ // ---- Group 1 layout: user UBO + optional texture/sampler pairs ----
204
+ const userBindGroupLayout = this._buildUserBindGroupLayout(device);
205
+ // ---- Pipeline layout ----
206
+ const pipelineLayout = device.createPipelineLayout({
207
+ bindGroupLayouts: [autoBindGroupLayout, userBindGroupLayout],
208
+ });
209
+ // ---- Render pipeline ----
210
+ const targetFormat = backend.renderTargetFormat;
211
+ const pipeline = device.createRenderPipeline({
212
+ layout: pipelineLayout,
213
+ vertex: {
214
+ module: vsModule,
215
+ entryPoint: 'main',
216
+ buffers: [
217
+ {
218
+ arrayStride: vertexStrideBytes,
219
+ attributes: [
220
+ { shaderLocation: 0, offset: 0, format: 'float32x2' },
221
+ { shaderLocation: 1, offset: 8, format: 'float32x2' },
222
+ ],
223
+ },
224
+ ],
225
+ },
226
+ fragment: {
227
+ module: fsModule,
228
+ entryPoint: 'main',
229
+ targets: [{ format: targetFormat }],
230
+ },
231
+ primitive: { topology: 'triangle-strip' },
232
+ });
233
+ // ---- Vertex buffer (fullscreen quad, static) ----
234
+ const vertexBuffer = device.createBuffer({
235
+ size: quadVertexData.byteLength,
236
+ usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
237
+ });
238
+ device.queue.writeBuffer(vertexBuffer, 0, quadVertexData);
239
+ // ---- Resolution uniform buffer ----
240
+ const resolutionBuffer = device.createBuffer({
241
+ size: resolutionBufferBytes,
242
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
243
+ });
244
+ // ---- Sampler ----
245
+ const sampler = device.createSampler({
246
+ magFilter: 'linear',
247
+ minFilter: 'linear',
248
+ addressModeU: 'clamp-to-edge',
249
+ addressModeV: 'clamp-to-edge',
250
+ });
251
+ this._connection = {
252
+ device,
253
+ vertexBuffer,
254
+ resolutionBuffer,
255
+ autoBindGroupLayout,
256
+ userBindGroupLayout,
257
+ pipelineLayout,
258
+ pipeline,
259
+ sampler,
260
+ userUniformBuffer: null,
261
+ };
262
+ }
263
+ /**
264
+ * Build the GPUBindGroupLayout for group 1 (user uniforms).
265
+ *
266
+ * Layout:
267
+ * binding 0 — uniform buffer (scalar/vector uniforms), if any scalar uniforms exist
268
+ * binding 1, 3, 5, ... — texture entries (one per texture uniform, in order)
269
+ * binding 2, 4, 6, ... — sampler entries (paired with textures)
270
+ */
271
+ _buildUserBindGroupLayout(device) {
272
+ const entries = [];
273
+ const hasScalarUniforms = Object.values(this.uniforms).some((v) => !isTextureValue(v));
274
+ if (hasScalarUniforms) {
275
+ entries.push({
276
+ binding: 0,
277
+ visibility: GPUShaderStage.FRAGMENT,
278
+ buffer: { type: 'uniform' },
279
+ });
280
+ }
281
+ let bindingIndex = 1;
282
+ for (const value of Object.values(this.uniforms)) {
283
+ if (!isTextureValue(value)) {
284
+ continue;
285
+ }
286
+ // texture entry
287
+ entries.push({
288
+ binding: bindingIndex,
289
+ visibility: GPUShaderStage.FRAGMENT,
290
+ texture: {},
291
+ });
292
+ bindingIndex++;
293
+ // sampler entry
294
+ entries.push({
295
+ binding: bindingIndex,
296
+ visibility: GPUShaderStage.FRAGMENT,
297
+ sampler: {},
298
+ });
299
+ bindingIndex++;
300
+ }
301
+ // If no entries at all, add a dummy uniform buffer entry so the layout is valid
302
+ if (entries.length === 0) {
303
+ entries.push({
304
+ binding: 0,
305
+ visibility: GPUShaderStage.FRAGMENT,
306
+ buffer: { type: 'uniform' },
307
+ });
308
+ }
309
+ return device.createBindGroupLayout({ entries });
310
+ }
311
+ /**
312
+ * Build and return the GPUBindGroup for group 1 on each frame.
313
+ * Marshals scalar uniforms into the user uniform buffer and assembles
314
+ * texture/sampler bind group entries.
315
+ */
316
+ _buildUserBindGroup(backend, conn) {
317
+ const device = conn.device;
318
+ const entries = [];
319
+ // ---- Collect scalar uniforms and marshal into a UBO ----
320
+ const scalarEntries = Object.entries(this.uniforms).filter(([, v]) => !isTextureValue(v));
321
+ if (scalarEntries.length > 0) {
322
+ // Each uniform gets a 16-byte aligned slot (conservative WGSL alignment)
323
+ const bufferSize = scalarEntries.length * 16;
324
+ const data = new Float32Array(bufferSize / 4);
325
+ let slot = 0;
326
+ for (const [, value] of scalarEntries) {
327
+ const baseFloatIndex = slot * 4; // 16 bytes = 4 floats per slot
328
+ if (typeof value === 'number') {
329
+ data[baseFloatIndex] = value;
330
+ }
331
+ else if (value instanceof Float32Array) {
332
+ data.set(value, baseFloatIndex);
333
+ }
334
+ else if (value instanceof Int32Array) {
335
+ // Int32Array values — reinterpret as float (best-effort for V1)
336
+ for (let i = 0; i < value.length; i++) {
337
+ data[baseFloatIndex + i] = value[i];
338
+ }
339
+ }
340
+ else {
341
+ // Readonly tuple [a], [a,b], [a,b,c], [a,b,c,d]
342
+ const arr = value;
343
+ for (let i = 0; i < arr.length; i++) {
344
+ data[baseFloatIndex + i] = arr[i];
345
+ }
346
+ }
347
+ slot++;
348
+ }
349
+ // Reuse / create user uniform buffer
350
+ if (conn.userUniformBuffer === null || conn.userUniformBuffer.size < bufferSize) {
351
+ conn.userUniformBuffer?.destroy();
352
+ conn.userUniformBuffer = device.createBuffer({
353
+ size: bufferSize,
354
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
355
+ });
356
+ }
357
+ device.queue.writeBuffer(conn.userUniformBuffer, 0, data);
358
+ entries.push({
359
+ binding: 0,
360
+ resource: { buffer: conn.userUniformBuffer },
361
+ });
362
+ }
363
+ else {
364
+ // No scalar uniforms — still need binding 0 to satisfy the layout.
365
+ // Create a minimal 16-byte dummy buffer if needed.
366
+ if (conn.userUniformBuffer === null) {
367
+ conn.userUniformBuffer = device.createBuffer({
368
+ size: 16,
369
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
370
+ });
371
+ }
372
+ entries.push({
373
+ binding: 0,
374
+ resource: { buffer: conn.userUniformBuffer },
375
+ });
376
+ }
377
+ // ---- Texture/sampler entries ----
378
+ let bindingIndex = 1;
379
+ for (const [, value] of Object.entries(this.uniforms)) {
380
+ if (!isTextureValue(value)) {
381
+ continue;
382
+ }
383
+ const binding = backend.getTextureBinding(value);
384
+ entries.push({ binding: bindingIndex, resource: binding.view });
385
+ bindingIndex++;
386
+ entries.push({ binding: bindingIndex, resource: binding.sampler });
387
+ bindingIndex++;
388
+ }
389
+ return device.createBindGroup({
390
+ layout: conn.userBindGroupLayout,
391
+ entries,
392
+ });
393
+ }
394
+ }
395
+
396
+ export { WebGpuShaderFilter };
397
+ //# sourceMappingURL=WebGpuShaderFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebGpuShaderFilter.js","sources":["../../../../../src/rendering/filters/WebGpuShaderFilter.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ export * from './primitives/Graphics';
3
3
  export * from './shader/Shader';
4
4
  export * from './shader/ShaderAttribute';
5
5
  export * from './shader/ShaderUniform';
6
+ export * from './shader/upgradeFragmentShaderToGl300';
6
7
  export * from './sprite/Sprite';
7
8
  export * from './sprite/Spritesheet';
8
9
  export * from './sprite/AnimatedSprite';
@@ -51,3 +52,5 @@ export * from './View';
51
52
  export * from './filters/Filter';
52
53
  export * from './filters/BlurFilter';
53
54
  export * from './filters/ColorFilter';
55
+ export * from './filters/WebGl2ShaderFilter';
56
+ export * from './filters/WebGpuShaderFilter';
@@ -106,6 +106,7 @@ class Mesh extends Drawable {
106
106
  maxY = y;
107
107
  }
108
108
  this.localBounds.set(minX, minY, maxX - minX, maxY - minY);
109
+ this._invalidateBoundsCascade();
109
110
  return this;
110
111
  }
111
112
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Mesh.js","sources":["../../../../../src/rendering/mesh/Mesh.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Mesh.js","sources":["../../../../../src/rendering/mesh/Mesh.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Upgrades legacy GLSL ES 1.00 fragment shader source to GLSL ES 3.00.
3
+ *
4
+ * If the source already has `#version 300 es` directive, returned unchanged.
5
+ *
6
+ * Transformations applied (1.00 → 3.00):
7
+ * - Adds `#version 300 es` header
8
+ * - Adds `precision highp float;` (always — required because the
9
+ * `out vec4 fragColor;` declaration immediately below uses a
10
+ * float-typed variable; GLSL ES 3.00 requires precision to be
11
+ * declared before any float-typed declaration). User precision
12
+ * declarations later in the source are still respected for
13
+ * subsequent code (last-precision-wins semantics).
14
+ * - Adds `out vec4 fragColor;` declaration
15
+ * - `gl_FragColor` → `fragColor` (word-boundary aware)
16
+ * - `texture2D(` → `texture(`
17
+ * - `textureCube(` → `texture(`
18
+ * - `texture2DProj(` → `textureProj(`
19
+ * - `varying` → `in`
20
+ *
21
+ * NOT supported (these will produce GLSL compile errors that the user must
22
+ * manually port):
23
+ * - `gl_FragData[N]` (multi-render-target output) — requires multiple
24
+ * `out` declarations with `layout(location=N)`
25
+ * - `texture2DLod` / `textureCubeLod` — semantics depend on context;
26
+ * map to `textureLod` manually
27
+ * - `gl_FragDepthEXT` (extension) — use `gl_FragDepth` directly
28
+ *
29
+ * Note: `varying` inside comments will also be replaced. This is expected
30
+ * behaviour and documented explicitly.
31
+ *
32
+ * Idempotent — calling twice returns the same source.
33
+ */
34
+ export declare function upgradeFragmentShaderToGl300(source: string): string;
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Upgrades legacy GLSL ES 1.00 fragment shader source to GLSL ES 3.00.
3
+ *
4
+ * If the source already has `#version 300 es` directive, returned unchanged.
5
+ *
6
+ * Transformations applied (1.00 → 3.00):
7
+ * - Adds `#version 300 es` header
8
+ * - Adds `precision highp float;` (always — required because the
9
+ * `out vec4 fragColor;` declaration immediately below uses a
10
+ * float-typed variable; GLSL ES 3.00 requires precision to be
11
+ * declared before any float-typed declaration). User precision
12
+ * declarations later in the source are still respected for
13
+ * subsequent code (last-precision-wins semantics).
14
+ * - Adds `out vec4 fragColor;` declaration
15
+ * - `gl_FragColor` → `fragColor` (word-boundary aware)
16
+ * - `texture2D(` → `texture(`
17
+ * - `textureCube(` → `texture(`
18
+ * - `texture2DProj(` → `textureProj(`
19
+ * - `varying` → `in`
20
+ *
21
+ * NOT supported (these will produce GLSL compile errors that the user must
22
+ * manually port):
23
+ * - `gl_FragData[N]` (multi-render-target output) — requires multiple
24
+ * `out` declarations with `layout(location=N)`
25
+ * - `texture2DLod` / `textureCubeLod` — semantics depend on context;
26
+ * map to `textureLod` manually
27
+ * - `gl_FragDepthEXT` (extension) — use `gl_FragDepth` directly
28
+ *
29
+ * Note: `varying` inside comments will also be replaced. This is expected
30
+ * behaviour and documented explicitly.
31
+ *
32
+ * Idempotent — calling twice returns the same source.
33
+ */
34
+ function upgradeFragmentShaderToGl300(source) {
35
+ // Already 3.00 → return unchanged
36
+ if (/^\s*#version\s+300\s+es/.test(source)) {
37
+ return source;
38
+ }
39
+ // Strip any older #version directive
40
+ const stripped = source.replace(/^\s*#version[^\n]*\n/, '');
41
+ // Token-level replacements (word-boundary safe)
42
+ const transformed = stripped
43
+ .replace(/\bgl_FragColor\b/g, 'fragColor')
44
+ .replace(/\btexture2D(?=\s*\()/g, 'texture')
45
+ .replace(/\btextureCube(?=\s*\()/g, 'texture')
46
+ .replace(/\btexture2DProj(?=\s*\()/g, 'textureProj')
47
+ .replace(/\bvarying\b/g, 'in');
48
+ // Build header. Precision MUST be set before `out vec4 fragColor;`
49
+ // because GLSL ES 3.00 requires precision declared before any
50
+ // float-typed declaration. If the user has their own precision later
51
+ // in the source, GLSL's last-precision-wins rule means their
52
+ // preference applies to their own code; ours just covers fragColor.
53
+ const header = '#version 300 es\n' +
54
+ 'precision highp float;\n' +
55
+ 'out vec4 fragColor;\n';
56
+ return header + transformed;
57
+ }
58
+
59
+ export { upgradeFragmentShaderToGl300 };
60
+ //# sourceMappingURL=upgradeFragmentShaderToGl300.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgradeFragmentShaderToGl300.js","sources":["../../../../../src/rendering/shader/upgradeFragmentShaderToGl300.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCG;AACG,SAAU,4BAA4B,CAAC,MAAc,EAAA;;AAEvD,IAAA,IAAI,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;AACxC,QAAA,OAAO,MAAM;IACjB;;IAGA,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC;;IAG3D,MAAM,WAAW,GAAG;AACf,SAAA,OAAO,CAAC,mBAAmB,EAAE,WAAW;AACxC,SAAA,OAAO,CAAC,uBAAuB,EAAE,SAAS;AAC1C,SAAA,OAAO,CAAC,yBAAyB,EAAE,SAAS;AAC5C,SAAA,OAAO,CAAC,2BAA2B,EAAE,aAAa;AAClD,SAAA,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;;;;;;IAOlC,MAAM,MAAM,GACR,mBAAmB;QACnB,0BAA0B;AAC1B,QAAA,uBAAuB;IAE3B,OAAO,MAAM,GAAG,WAAW;AAC/B;;;;"}
@@ -14,13 +14,16 @@ export declare enum SpriteFlags {
14
14
  TransformInverse = 16,
15
15
  BoundingBox = 32,
16
16
  TextureCoords = 64,
17
- VertexTint = 128
17
+ VertexTint = 128,
18
+ Vertices = 1024,
19
+ Normals = 2048
18
20
  }
19
21
  export declare class Sprite extends Drawable {
20
22
  private _texture;
21
23
  private _textureFrame;
22
24
  private _vertices;
23
25
  private _texCoords;
26
+ private readonly _normals;
24
27
  constructor(texture: Texture | RenderTexture | null);
25
28
  get texture(): Texture | RenderTexture | null;
26
29
  set texture(texture: Texture | RenderTexture | null);
@@ -39,5 +42,7 @@ export declare class Sprite extends Drawable {
39
42
  getNormals(): Array<Vector>;
40
43
  project(axis: Vector, result?: Interval): Interval;
41
44
  contains(x: number, y: number): boolean;
45
+ _invalidateSubtreeTransform(): void;
46
+ _invalidateBoundsCascade(): void;
42
47
  destroy(): void;
43
48
  }