@codexo/exojs 0.6.11 → 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 (189) hide show
  1. package/CHANGELOG.md +1356 -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 +29 -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 +2 -0
  145. package/dist/esm/math/swept-collision.d.ts +90 -0
  146. package/dist/esm/math/swept-collision.js +255 -0
  147. package/dist/esm/math/swept-collision.js.map +1 -0
  148. package/dist/esm/particles/ParticleSystem.js +1 -0
  149. package/dist/esm/particles/ParticleSystem.js.map +1 -1
  150. package/dist/esm/particles/affectors/TorqueAffector.js +1 -1
  151. package/dist/esm/rendering/Container.d.ts +1 -0
  152. package/dist/esm/rendering/Container.js +19 -0
  153. package/dist/esm/rendering/Container.js.map +1 -1
  154. package/dist/esm/rendering/RenderNode.d.ts +27 -0
  155. package/dist/esm/rendering/RenderNode.js +44 -0
  156. package/dist/esm/rendering/RenderNode.js.map +1 -1
  157. package/dist/esm/rendering/View.d.ts +6 -4
  158. package/dist/esm/rendering/View.js +12 -2
  159. package/dist/esm/rendering/View.js.map +1 -1
  160. package/dist/esm/rendering/filters/WebGl2ShaderFilter.d.ts +109 -0
  161. package/dist/esm/rendering/filters/WebGl2ShaderFilter.js +268 -0
  162. package/dist/esm/rendering/filters/WebGl2ShaderFilter.js.map +1 -0
  163. package/dist/esm/rendering/filters/WebGpuShaderFilter.d.ts +111 -0
  164. package/dist/esm/rendering/filters/WebGpuShaderFilter.js +397 -0
  165. package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -0
  166. package/dist/esm/rendering/index.d.ts +3 -0
  167. package/dist/esm/rendering/mesh/Mesh.js +1 -0
  168. package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
  169. package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.d.ts +34 -0
  170. package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.js +60 -0
  171. package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.js.map +1 -0
  172. package/dist/esm/rendering/sprite/Sprite.d.ts +6 -1
  173. package/dist/esm/rendering/sprite/Sprite.js +41 -19
  174. package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
  175. package/dist/esm/rendering/video/Video.d.ts +4 -0
  176. package/dist/esm/rendering/video/Video.js +32 -4
  177. package/dist/esm/rendering/video/Video.js.map +1 -1
  178. package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +4 -4
  179. package/dist/esm/rendering/webgl2/WebGl2Backend.js +7 -16
  180. package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
  181. package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +10 -8
  182. package/dist/esm/rendering/webgpu/WebGpuBackend.js +30 -40
  183. package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
  184. package/dist/exo.esm.js +8021 -2459
  185. package/dist/exo.esm.js.map +1 -1
  186. package/package.json +14 -2
  187. package/dist/esm/core/Quadtree.d.ts +0 -20
  188. package/dist/esm/core/Quadtree.js +0 -86
  189. package/dist/esm/core/Quadtree.js.map +0 -1
@@ -0,0 +1,268 @@
1
+ import { Color } from '../../core/Color.js';
2
+ import { Shader } from '../shader/Shader.js';
3
+ import { RenderBackendType } from '../RenderBackendType.js';
4
+ import { RenderTargetPass } from '../RenderTargetPass.js';
5
+ import { RenderingPrimitives, BufferTypes, BufferUsage } from '../types.js';
6
+ import { createWebGl2ShaderProgram } from '../webgl2/WebGl2ShaderProgram.js';
7
+ import { WebGl2RenderBuffer } from '../webgl2/WebGl2RenderBuffer.js';
8
+ import { WebGl2VertexArrayObject } from '../webgl2/WebGl2VertexArrayObject.js';
9
+ import { Texture } from '../texture/Texture.js';
10
+ import { upgradeFragmentShaderToGl300 } from '../shader/upgradeFragmentShaderToGl300.js';
11
+ import { Filter } from './Filter.js';
12
+
13
+ /**
14
+ * Default fullscreen-quad vertex shader. Positions are already in clip
15
+ * space (-1..1), so no projection matrix is needed.
16
+ */
17
+ const defaultVertexSource = `#version 300 es
18
+ in vec2 aPosition;
19
+ in vec2 aUv;
20
+ out vec2 vUv;
21
+ void main() {
22
+ vUv = aUv;
23
+ gl_Position = vec4(aPosition, 0.0, 1.0);
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 quadVertices = 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 vertexStride = 16;
44
+ /**
45
+ * A high-level {@link Filter} subclass that renders the input texture
46
+ * through a user-provided GLSL fragment shader on the **WebGL2** backend.
47
+ *
48
+ * For the WebGPU backend use {@link WebGpuShaderFilter}.
49
+ *
50
+ * ## Usage
51
+ *
52
+ * ```ts
53
+ * const filter = new WebGl2ShaderFilter({
54
+ * fragmentSource: `
55
+ * #version 300 es
56
+ * precision mediump float;
57
+ * uniform sampler2D uTexture;
58
+ * uniform vec2 uResolution;
59
+ * uniform float uTime;
60
+ * in vec2 vUv;
61
+ * out vec4 fragColor;
62
+ * void main() {
63
+ * fragColor = texture(uTexture, vUv);
64
+ * }
65
+ * `,
66
+ * uniforms: { uTime: 0.0 },
67
+ * });
68
+ *
69
+ * // Update uniforms each frame:
70
+ * filter.uniforms.uTime = performance.now() / 1000;
71
+ * sprite.filters = [filter];
72
+ * ```
73
+ *
74
+ * ## Auto-bound uniforms
75
+ *
76
+ * The backend automatically sets `uTexture` (slot 0) and `uResolution`
77
+ * before each draw. User uniforms start at texture slot 1.
78
+ */
79
+ class WebGl2ShaderFilter extends Filter {
80
+ /**
81
+ * Mutable map of uniform values. Set values via property
82
+ * assignment; they are flushed to the GPU before each apply().
83
+ *
84
+ * filter.uniforms.uTime = 1.234;
85
+ * filter.uniforms.uColor = [1, 0.5, 0, 1]; // vec4
86
+ */
87
+ uniforms;
88
+ _fragmentSource;
89
+ _vertexSource;
90
+ _shader = null;
91
+ _connection = null;
92
+ constructor(options) {
93
+ super();
94
+ if (!options.fragmentSource) {
95
+ throw new Error('WebGl2ShaderFilter requires fragmentSource for the WebGL2 backend.');
96
+ }
97
+ const autoUpgrade = options.autoUpgrade !== false;
98
+ this._fragmentSource = autoUpgrade
99
+ ? upgradeFragmentShaderToGl300(options.fragmentSource)
100
+ : options.fragmentSource;
101
+ this._vertexSource = options.vertexSource ?? defaultVertexSource;
102
+ this.uniforms = { ...(options.uniforms ?? {}) };
103
+ }
104
+ apply(backend, input, output) {
105
+ if (backend.backendType === RenderBackendType.WebGpu) {
106
+ throw new Error('WebGl2ShaderFilter requires the WebGL2 backend. Use WebGpuShaderFilter on WebGPU.');
107
+ }
108
+ const gl2Backend = backend;
109
+ this._ensureConnected(gl2Backend);
110
+ const shader = this._shader;
111
+ backend.execute(new RenderTargetPass((b) => {
112
+ const gl2 = b;
113
+ // Bind shader (calls ShaderProgram.bind → gl.useProgram + sync dirty uniforms)
114
+ gl2.bindShader(shader);
115
+ // Auto-bind input texture to slot 0 (uTexture)
116
+ gl2.bindTexture(input, 0);
117
+ if (shader.uniforms.has('uTexture')) {
118
+ shader.getUniform('uTexture').setValue(new Int32Array([0]));
119
+ }
120
+ // Auto-bind uResolution
121
+ if (shader.uniforms.has('uResolution')) {
122
+ shader.getUniform('uResolution').setValue(new Float32Array([output.width, output.height]));
123
+ }
124
+ // Sync user uniforms — texture uniforms start at slot 1
125
+ let textureSlot = 1;
126
+ for (const [name, value] of Object.entries(this.uniforms)) {
127
+ if (!shader.uniforms.has(name)) {
128
+ continue;
129
+ }
130
+ const uniform = shader.getUniform(name);
131
+ if (value instanceof Texture) {
132
+ gl2.bindTexture(value, textureSlot);
133
+ uniform.setValue(new Int32Array([textureSlot]));
134
+ textureSlot++;
135
+ }
136
+ else {
137
+ uniform.setValue(this._marshalValue(value));
138
+ }
139
+ }
140
+ // Flush dirty uniforms to the GPU
141
+ shader.sync();
142
+ // Draw the fullscreen quad
143
+ const connection = this._connection;
144
+ gl2.bindVertexArrayObject(connection.vao);
145
+ connection.vao.draw(4, 0, RenderingPrimitives.TriangleStrip);
146
+ }, {
147
+ target: output,
148
+ view: output.view,
149
+ clearColor: Color.transparentBlack,
150
+ }));
151
+ }
152
+ destroy() {
153
+ if (this._connection !== null) {
154
+ this._connection.vertexBuffer.destroy();
155
+ this._connection.vao.destroy();
156
+ this._connection = null;
157
+ }
158
+ if (this._shader !== null) {
159
+ this._shader.destroy();
160
+ this._shader = null;
161
+ }
162
+ for (const key of Object.keys(this.uniforms)) {
163
+ delete this.uniforms[key];
164
+ }
165
+ }
166
+ // ---------------------------------------------------------------------------
167
+ // Private helpers
168
+ // ---------------------------------------------------------------------------
169
+ _ensureConnected(backend) {
170
+ if (this._shader !== null) {
171
+ return;
172
+ }
173
+ const gl = backend.context;
174
+ // Create and connect the shader
175
+ const shader = new Shader(this._vertexSource, this._fragmentSource);
176
+ shader.connect(createWebGl2ShaderProgram(gl));
177
+ // Force shader finalization so attributes are populated before VAO setup.
178
+ // sync() calls finalize() internally, which blocks until compilation is
179
+ // done and extracts attribute/uniform reflection data.
180
+ shader.sync();
181
+ // Build the fullscreen-quad vertex buffer (static, per-instance)
182
+ const vaoHandle = gl.createVertexArray();
183
+ if (vaoHandle === null) {
184
+ throw new Error('WebGl2ShaderFilter: could not create vertex array object.');
185
+ }
186
+ const vertexBuffer = this._createVertexBuffer(gl);
187
+ const vao = this._createVao(gl, vaoHandle, shader, vertexBuffer);
188
+ this._shader = shader;
189
+ this._connection = { gl, vertexBuffer, vao };
190
+ }
191
+ _createVertexBuffer(gl) {
192
+ const handle = gl.createBuffer();
193
+ if (handle === null) {
194
+ throw new Error('WebGl2ShaderFilter: could not create vertex buffer.');
195
+ }
196
+ const buffer = new WebGl2RenderBuffer(BufferTypes.ArrayBuffer, quadVertices, BufferUsage.StaticDraw);
197
+ buffer.connect({
198
+ bind: () => {
199
+ gl.bindBuffer(gl.ARRAY_BUFFER, handle);
200
+ },
201
+ upload: (buf, _offset) => {
202
+ gl.bindBuffer(gl.ARRAY_BUFFER, handle);
203
+ gl.bufferData(gl.ARRAY_BUFFER, buf.data, buf.usage);
204
+ },
205
+ destroy: (buf) => {
206
+ gl.deleteBuffer(handle);
207
+ buf.disconnect();
208
+ },
209
+ });
210
+ return buffer;
211
+ }
212
+ _createVao(gl, vaoHandle, shader, vertexBuffer) {
213
+ let appliedVersion = -1;
214
+ const vao = new WebGl2VertexArrayObject(RenderingPrimitives.TriangleStrip);
215
+ if (shader.attributes.has('aPosition')) {
216
+ vao.addAttribute(vertexBuffer, shader.getAttribute('aPosition'), gl.FLOAT, false, vertexStride, 0);
217
+ }
218
+ if (shader.attributes.has('aUv')) {
219
+ vao.addAttribute(vertexBuffer, shader.getAttribute('aUv'), gl.FLOAT, false, vertexStride, 8);
220
+ }
221
+ vao.connect({
222
+ bind: (v) => {
223
+ gl.bindVertexArray(vaoHandle);
224
+ if (appliedVersion !== v.version) {
225
+ let lastBuffer = null;
226
+ for (const attribute of v.attributes) {
227
+ const buf = attribute.buffer;
228
+ if (lastBuffer !== buf) {
229
+ buf.bind();
230
+ lastBuffer = buf;
231
+ }
232
+ gl.vertexAttribPointer(attribute.location, attribute.size, attribute.type, attribute.normalized, attribute.stride, attribute.start);
233
+ gl.enableVertexAttribArray(attribute.location);
234
+ }
235
+ appliedVersion = v.version;
236
+ }
237
+ },
238
+ unbind: () => {
239
+ gl.bindVertexArray(null);
240
+ },
241
+ draw: (_v, size, start, type) => {
242
+ gl.drawArrays(type, start, size);
243
+ },
244
+ destroy: (v) => {
245
+ gl.deleteVertexArray(vaoHandle);
246
+ v.disconnect();
247
+ },
248
+ });
249
+ return vao;
250
+ }
251
+ /**
252
+ * Marshal a non-texture uniform value to a TypedArray suitable for
253
+ * {@link ShaderUniform#setValue}.
254
+ */
255
+ _marshalValue(value) {
256
+ if (value instanceof Float32Array || value instanceof Int32Array) {
257
+ return value;
258
+ }
259
+ if (typeof value === 'number') {
260
+ return new Float32Array([value]);
261
+ }
262
+ // readonly tuple [a, b], [a, b, c], or [a, b, c, d]
263
+ return new Float32Array(value);
264
+ }
265
+ }
266
+
267
+ export { WebGl2ShaderFilter };
268
+ //# sourceMappingURL=WebGl2ShaderFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebGl2ShaderFilter.js","sources":["../../../../../src/rendering/filters/WebGl2ShaderFilter.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import type { RenderTexture } from '@/rendering/texture/RenderTexture';
2
+ import type { RenderBackend } from '@/rendering/RenderBackend';
3
+ import { Filter } from './Filter';
4
+ import type { ShaderFilterUniformValue } from './WebGl2ShaderFilter';
5
+ export type { ShaderFilterUniformValue };
6
+ export interface WebGpuShaderFilterOptions {
7
+ /**
8
+ * WGSL source code for the fragment shader. Required.
9
+ *
10
+ * The shader receives these auto-bound entries via @group(0):
11
+ * @group(0) @binding(0) var<uniform> uResolution: vec2<f32>; // output dimensions
12
+ * @group(0) @binding(1) var uTexture: texture_2d<f32>;
13
+ * @group(0) @binding(2) var uSampler: sampler;
14
+ *
15
+ * User uniforms go in @group(1):
16
+ * @group(1) @binding(0) var<uniform> uniforms: <UserUniformsStruct>;
17
+ *
18
+ * User uniforms are packed into a single uniform buffer with 16-byte
19
+ * alignment per member. Declare your WGSL struct to match this layout.
20
+ * Texture/RenderTexture uniforms are placed as separate bind group entries
21
+ * starting at @group(1) @binding(1).
22
+ */
23
+ fragmentSource: string;
24
+ /**
25
+ * WGSL source for the vertex shader. Optional; defaults to a fullscreen
26
+ * pass-through quad with a varying `vUv: vec2<f32>`.
27
+ */
28
+ vertexSource?: string;
29
+ /**
30
+ * Initial uniform values. Can be updated at runtime by writing
31
+ * to the `uniforms` property:
32
+ *
33
+ * filter.uniforms.uTime = performance.now() / 1000;
34
+ */
35
+ uniforms?: Record<string, ShaderFilterUniformValue>;
36
+ }
37
+ /**
38
+ * A high-level {@link Filter} subclass that renders the input texture through
39
+ * a user-provided WGSL fragment shader on the **WebGPU** backend.
40
+ *
41
+ * For the WebGL2 backend use {@link WebGl2ShaderFilter}.
42
+ *
43
+ * ## Usage
44
+ *
45
+ * ```ts
46
+ * const filter = new WebGpuShaderFilter({
47
+ * fragmentSource: `
48
+ * @group(0) @binding(0) var<uniform> uResolution: vec2<f32>;
49
+ * @group(0) @binding(1) var uTexture: texture_2d<f32>;
50
+ * @group(0) @binding(2) var uSampler: sampler;
51
+ *
52
+ * @fragment
53
+ * fn main(@location(0) vUv: vec2<f32>) -> @location(0) vec4<f32> {
54
+ * return textureSample(uTexture, uSampler, vUv);
55
+ * }
56
+ * `,
57
+ * uniforms: { uTime: 0.0 },
58
+ * });
59
+ *
60
+ * // Update uniforms each frame:
61
+ * filter.uniforms.uTime = performance.now() / 1000;
62
+ * sprite.filters = [filter];
63
+ * ```
64
+ *
65
+ * ## Auto-bound uniforms (group 0)
66
+ *
67
+ * - `@binding(0)` — `var<uniform> uResolution: vec2<f32>` (output dimensions)
68
+ * - `@binding(1)` — `var uTexture: texture_2d<f32>` (filter input)
69
+ * - `@binding(2)` — `var uSampler: sampler`
70
+ *
71
+ * ## User uniforms (group 1)
72
+ *
73
+ * All non-texture user uniforms are packed into a single uniform buffer at
74
+ * `@binding(0)`. Each member occupies a 16-byte aligned slot (conservative
75
+ * alignment). Declare your WGSL struct to match this layout.
76
+ *
77
+ * Texture/RenderTexture uniforms are bound as separate entries starting at
78
+ * `@binding(1)` (texture) and `@binding(N+1)` (sampler), in declaration order.
79
+ */
80
+ export declare class WebGpuShaderFilter extends Filter {
81
+ /**
82
+ * Mutable map of uniform values. Set values via property assignment;
83
+ * they are flushed to the GPU before each apply().
84
+ *
85
+ * filter.uniforms.uTime = 1.234;
86
+ * filter.uniforms.uColor = [1, 0.5, 0, 1]; // vec4
87
+ */
88
+ readonly uniforms: Record<string, ShaderFilterUniformValue>;
89
+ private readonly _fragmentSource;
90
+ private readonly _vertexSource;
91
+ private _connection;
92
+ constructor(options: WebGpuShaderFilterOptions);
93
+ apply(backend: RenderBackend, input: RenderTexture, output: RenderTexture): void;
94
+ destroy(): void;
95
+ private _ensureConnected;
96
+ /**
97
+ * Build the GPUBindGroupLayout for group 1 (user uniforms).
98
+ *
99
+ * Layout:
100
+ * binding 0 — uniform buffer (scalar/vector uniforms), if any scalar uniforms exist
101
+ * binding 1, 3, 5, ... — texture entries (one per texture uniform, in order)
102
+ * binding 2, 4, 6, ... — sampler entries (paired with textures)
103
+ */
104
+ private _buildUserBindGroupLayout;
105
+ /**
106
+ * Build and return the GPUBindGroup for group 1 on each frame.
107
+ * Marshals scalar uniforms into the user uniform buffer and assembles
108
+ * texture/sampler bind group entries.
109
+ */
110
+ private _buildUserBindGroup;
111
+ }