@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,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';
|
|
@@ -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
|
}
|