@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.
- package/CHANGELOG.md +1356 -0
- package/dist/esm/audio/AbstractMedia.d.ts +18 -0
- package/dist/esm/audio/AbstractMedia.js +66 -0
- package/dist/esm/audio/AbstractMedia.js.map +1 -1
- package/dist/esm/audio/AudioAnalyser.d.ts +62 -23
- package/dist/esm/audio/AudioAnalyser.js +261 -57
- package/dist/esm/audio/AudioAnalyser.js.map +1 -1
- package/dist/esm/audio/AudioBus.d.ts +45 -0
- package/dist/esm/audio/AudioBus.js +219 -0
- package/dist/esm/audio/AudioBus.js.map +1 -0
- package/dist/esm/audio/AudioFilter.d.ts +9 -0
- package/dist/esm/audio/AudioFilter.js +7 -0
- package/dist/esm/audio/AudioFilter.js.map +1 -0
- package/dist/esm/audio/AudioListener.d.ts +20 -0
- package/dist/esm/audio/AudioListener.js +86 -0
- package/dist/esm/audio/AudioListener.js.map +1 -0
- package/dist/esm/audio/AudioManager.d.ts +31 -0
- package/dist/esm/audio/AudioManager.js +102 -0
- package/dist/esm/audio/AudioManager.js.map +1 -0
- package/dist/esm/audio/BeatDetector.d.ts +121 -0
- package/dist/esm/audio/BeatDetector.js +936 -0
- package/dist/esm/audio/BeatDetector.js.map +1 -0
- package/dist/esm/audio/Envelope.d.ts +44 -0
- package/dist/esm/audio/Envelope.js +60 -0
- package/dist/esm/audio/Envelope.js.map +1 -0
- package/dist/esm/audio/Music.d.ts +8 -0
- package/dist/esm/audio/Music.js +33 -4
- package/dist/esm/audio/Music.js.map +1 -1
- package/dist/esm/audio/OscillatorSound.d.ts +98 -0
- package/dist/esm/audio/OscillatorSound.js +342 -0
- package/dist/esm/audio/OscillatorSound.js.map +1 -0
- package/dist/esm/audio/Sound.d.ts +94 -9
- package/dist/esm/audio/Sound.js +283 -117
- package/dist/esm/audio/Sound.js.map +1 -1
- package/dist/esm/audio/crossFade.d.ts +19 -0
- package/dist/esm/audio/crossFade.js +26 -0
- package/dist/esm/audio/crossFade.js.map +1 -0
- package/dist/esm/audio/dsp/fft.d.ts +22 -0
- package/dist/esm/audio/dsp/mel.d.ts +43 -0
- package/dist/esm/audio/dsp/tempogram.d.ts +51 -0
- package/dist/esm/audio/filters/ChorusFilter.d.ts +47 -0
- package/dist/esm/audio/filters/ChorusFilter.js +139 -0
- package/dist/esm/audio/filters/ChorusFilter.js.map +1 -0
- package/dist/esm/audio/filters/CompressorFilter.d.ts +31 -0
- package/dist/esm/audio/filters/CompressorFilter.js +97 -0
- package/dist/esm/audio/filters/CompressorFilter.js.map +1 -0
- package/dist/esm/audio/filters/DelayFilter.d.ts +23 -0
- package/dist/esm/audio/filters/DelayFilter.js +100 -0
- package/dist/esm/audio/filters/DelayFilter.js.map +1 -0
- package/dist/esm/audio/filters/DuckingFilter.d.ts +31 -0
- package/dist/esm/audio/filters/DuckingFilter.js +152 -0
- package/dist/esm/audio/filters/DuckingFilter.js.map +1 -0
- package/dist/esm/audio/filters/EqualizerFilter.d.ts +29 -0
- package/dist/esm/audio/filters/EqualizerFilter.js +94 -0
- package/dist/esm/audio/filters/EqualizerFilter.js.map +1 -0
- package/dist/esm/audio/filters/GranularFilter.d.ts +56 -0
- package/dist/esm/audio/filters/GranularFilter.js +170 -0
- package/dist/esm/audio/filters/GranularFilter.js.map +1 -0
- package/dist/esm/audio/filters/HighpassFilter.d.ts +19 -0
- package/dist/esm/audio/filters/HighpassFilter.js +62 -0
- package/dist/esm/audio/filters/HighpassFilter.js.map +1 -0
- package/dist/esm/audio/filters/LowpassFilter.d.ts +19 -0
- package/dist/esm/audio/filters/LowpassFilter.js +62 -0
- package/dist/esm/audio/filters/LowpassFilter.js.map +1 -0
- package/dist/esm/audio/filters/PitchShiftFilter.d.ts +42 -0
- package/dist/esm/audio/filters/PitchShiftFilter.js +130 -0
- package/dist/esm/audio/filters/PitchShiftFilter.js.map +1 -0
- package/dist/esm/audio/filters/ReverbFilter.d.ts +24 -0
- package/dist/esm/audio/filters/ReverbFilter.js +107 -0
- package/dist/esm/audio/filters/ReverbFilter.js.map +1 -0
- package/dist/esm/audio/filters/VocoderFilter.d.ts +38 -0
- package/dist/esm/audio/filters/VocoderFilter.js +163 -0
- package/dist/esm/audio/filters/VocoderFilter.js.map +1 -0
- package/dist/esm/audio/filters/WorkletFilter.d.ts +46 -0
- package/dist/esm/audio/filters/WorkletFilter.js +101 -0
- package/dist/esm/audio/filters/WorkletFilter.js.map +1 -0
- package/dist/esm/audio/filters/index.d.ts +12 -0
- package/dist/esm/audio/index.d.ts +15 -1
- package/dist/esm/audio/worklet/registerWorklet.d.ts +10 -0
- package/dist/esm/audio/worklet/registerWorklet.js +44 -0
- package/dist/esm/audio/worklet/registerWorklet.js.map +1 -0
- package/dist/esm/core/Application.d.ts +19 -0
- package/dist/esm/core/Application.js +76 -2
- package/dist/esm/core/Application.js.map +1 -1
- package/dist/esm/core/SceneNode.d.ts +9 -1
- package/dist/esm/core/SceneNode.js +44 -6
- package/dist/esm/core/SceneNode.js.map +1 -1
- package/dist/esm/core/Time.js +1 -1
- package/dist/esm/core/index.d.ts +0 -1
- package/dist/esm/debug/BoundingBoxesLayer.d.ts +18 -0
- package/dist/esm/debug/BoundingBoxesLayer.js +128 -0
- package/dist/esm/debug/BoundingBoxesLayer.js.map +1 -0
- package/dist/esm/debug/DebugLayer.d.ts +29 -0
- package/dist/esm/debug/DebugLayer.js +26 -0
- package/dist/esm/debug/DebugLayer.js.map +1 -0
- package/dist/esm/debug/DebugOverlay.d.ts +48 -0
- package/dist/esm/debug/DebugOverlay.js +117 -0
- package/dist/esm/debug/DebugOverlay.js.map +1 -0
- package/dist/esm/debug/HitTestLayer.d.ts +23 -0
- package/dist/esm/debug/HitTestLayer.js +109 -0
- package/dist/esm/debug/HitTestLayer.js.map +1 -0
- package/dist/esm/debug/PerformanceLayer.d.ts +21 -0
- package/dist/esm/debug/PerformanceLayer.js +175 -0
- package/dist/esm/debug/PerformanceLayer.js.map +1 -0
- package/dist/esm/debug/PointerStackLayer.d.ts +23 -0
- package/dist/esm/debug/PointerStackLayer.js +152 -0
- package/dist/esm/debug/PointerStackLayer.js.map +1 -0
- package/dist/esm/debug/index.d.ts +6 -0
- package/dist/esm/debug/index.js +7 -0
- package/dist/esm/debug/index.js.map +1 -0
- package/dist/esm/index.js +29 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/input/InputManager.d.ts +10 -0
- package/dist/esm/input/InputManager.js +35 -5
- package/dist/esm/input/InputManager.js.map +1 -1
- package/dist/esm/input/InteractionEvent.d.ts +18 -0
- package/dist/esm/input/InteractionEvent.js +29 -0
- package/dist/esm/input/InteractionEvent.js.map +1 -0
- package/dist/esm/input/InteractionManager.d.ts +134 -0
- package/dist/esm/input/InteractionManager.js +546 -0
- package/dist/esm/input/InteractionManager.js.map +1 -0
- package/dist/esm/input/index.d.ts +2 -0
- package/dist/esm/input/interaction-hooks.d.ts +34 -0
- package/dist/esm/input/interaction-hooks.js +35 -0
- package/dist/esm/input/interaction-hooks.js.map +1 -0
- package/dist/esm/math/Circle.d.ts +12 -2
- package/dist/esm/math/Circle.js +82 -14
- package/dist/esm/math/Circle.js.map +1 -1
- package/dist/esm/math/Interval.js +1 -1
- package/dist/esm/math/ObservableVector.d.ts +2 -2
- package/dist/esm/math/ObservableVector.js +4 -2
- package/dist/esm/math/ObservableVector.js.map +1 -1
- package/dist/esm/math/Polygon.d.ts +15 -1
- package/dist/esm/math/Polygon.js +58 -6
- package/dist/esm/math/Polygon.js.map +1 -1
- package/dist/esm/math/Quadtree.d.ts +47 -0
- package/dist/esm/math/Quadtree.js +168 -0
- package/dist/esm/math/Quadtree.js.map +1 -0
- package/dist/esm/math/Random.js +1 -1
- package/dist/esm/math/Size.js +1 -1
- package/dist/esm/math/Vector.js +1 -1
- package/dist/esm/math/collision-detection.js +4 -1
- package/dist/esm/math/collision-detection.js.map +1 -1
- package/dist/esm/math/index.d.ts +2 -0
- package/dist/esm/math/swept-collision.d.ts +90 -0
- package/dist/esm/math/swept-collision.js +255 -0
- package/dist/esm/math/swept-collision.js.map +1 -0
- package/dist/esm/particles/ParticleSystem.js +1 -0
- package/dist/esm/particles/ParticleSystem.js.map +1 -1
- package/dist/esm/particles/affectors/TorqueAffector.js +1 -1
- package/dist/esm/rendering/Container.d.ts +1 -0
- package/dist/esm/rendering/Container.js +19 -0
- package/dist/esm/rendering/Container.js.map +1 -1
- package/dist/esm/rendering/RenderNode.d.ts +27 -0
- package/dist/esm/rendering/RenderNode.js +44 -0
- package/dist/esm/rendering/RenderNode.js.map +1 -1
- package/dist/esm/rendering/View.d.ts +6 -4
- package/dist/esm/rendering/View.js +12 -2
- package/dist/esm/rendering/View.js.map +1 -1
- package/dist/esm/rendering/filters/WebGl2ShaderFilter.d.ts +109 -0
- package/dist/esm/rendering/filters/WebGl2ShaderFilter.js +268 -0
- package/dist/esm/rendering/filters/WebGl2ShaderFilter.js.map +1 -0
- package/dist/esm/rendering/filters/WebGpuShaderFilter.d.ts +111 -0
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js +397 -0
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -0
- package/dist/esm/rendering/index.d.ts +3 -0
- package/dist/esm/rendering/mesh/Mesh.js +1 -0
- package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
- package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.d.ts +34 -0
- package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.js +60 -0
- package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.js.map +1 -0
- package/dist/esm/rendering/sprite/Sprite.d.ts +6 -1
- package/dist/esm/rendering/sprite/Sprite.js +41 -19
- package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
- package/dist/esm/rendering/video/Video.d.ts +4 -0
- package/dist/esm/rendering/video/Video.js +32 -4
- package/dist/esm/rendering/video/Video.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +4 -4
- package/dist/esm/rendering/webgl2/WebGl2Backend.js +7 -16
- package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +10 -8
- package/dist/esm/rendering/webgpu/WebGpuBackend.js +30 -40
- package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
- package/dist/exo.esm.js +8021 -2459
- package/dist/exo.esm.js.map +1 -1
- package/package.json +14 -2
- package/dist/esm/core/Quadtree.d.ts +0 -20
- package/dist/esm/core/Quadtree.js +0 -86
- 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
|
+
}
|