@codexo/exojs 0.4.0 → 0.6.1
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 +464 -163
- package/README.md +156 -141
- package/dist/esm/audio/AudioAnalyser.d.ts +0 -1
- package/dist/esm/audio/AudioAnalyser.js +0 -2
- package/dist/esm/audio/AudioAnalyser.js.map +1 -1
- package/dist/esm/core/Application.d.ts +4 -4
- package/dist/esm/core/Application.js +19 -19
- package/dist/esm/core/Application.js.map +1 -1
- package/dist/esm/core/Scene.d.ts +59 -24
- package/dist/esm/core/Scene.js +60 -18
- package/dist/esm/core/Scene.js.map +1 -1
- package/dist/esm/core/SceneManager.js +15 -9
- package/dist/esm/core/SceneManager.js.map +1 -1
- package/dist/esm/core/SceneNode.d.ts +45 -5
- package/dist/esm/core/SceneNode.js +136 -7
- package/dist/esm/core/SceneNode.js.map +1 -1
- package/dist/esm/index.js +3 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/math/index.d.ts +0 -1
- package/dist/esm/rendering/CallbackRenderPass.d.ts +3 -3
- package/dist/esm/rendering/CallbackRenderPass.js +2 -2
- package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
- package/dist/esm/rendering/Container.d.ts +10 -11
- package/dist/esm/rendering/Container.js +5 -5
- package/dist/esm/rendering/Container.js.map +1 -1
- package/dist/esm/rendering/Drawable.d.ts +2 -2
- package/dist/esm/rendering/Drawable.js +5 -5
- package/dist/esm/rendering/Drawable.js.map +1 -1
- package/dist/esm/rendering/{SceneRenderRuntime.d.ts → RenderBackend.d.ts} +21 -3
- package/dist/esm/rendering/RenderNode.d.ts +41 -5
- package/dist/esm/rendering/RenderNode.js +89 -24
- package/dist/esm/rendering/RenderNode.js.map +1 -1
- package/dist/esm/rendering/RenderPass.d.ts +2 -2
- package/dist/esm/rendering/RenderTargetPass.d.ts +3 -3
- package/dist/esm/rendering/RenderTargetPass.js +9 -9
- package/dist/esm/rendering/RenderTargetPass.js.map +1 -1
- package/dist/esm/rendering/Renderer.d.ts +3 -3
- package/dist/esm/rendering/RendererRegistry.d.ts +13 -7
- package/dist/esm/rendering/RendererRegistry.js +18 -10
- package/dist/esm/rendering/RendererRegistry.js.map +1 -1
- package/dist/esm/rendering/filters/BlurFilter.d.ts +2 -2
- package/dist/esm/rendering/filters/BlurFilter.js +5 -5
- package/dist/esm/rendering/filters/BlurFilter.js.map +1 -1
- package/dist/esm/rendering/filters/ColorFilter.d.ts +2 -2
- package/dist/esm/rendering/filters/ColorFilter.js +3 -3
- package/dist/esm/rendering/filters/ColorFilter.js.map +1 -1
- package/dist/esm/rendering/filters/Filter.d.ts +2 -2
- package/dist/esm/rendering/index.d.ts +6 -6
- package/dist/esm/rendering/primitives/Graphics.d.ts +3 -3
- package/dist/esm/rendering/primitives/Graphics.js.map +1 -1
- package/dist/esm/rendering/shader/Shader.d.ts +3 -3
- package/dist/esm/rendering/shader/Shader.js +10 -10
- package/dist/esm/rendering/text/Text.d.ts +2 -2
- package/dist/esm/rendering/text/Text.js +2 -2
- package/dist/esm/rendering/text/Text.js.map +1 -1
- package/dist/esm/rendering/texture/Sampler.d.ts +0 -3
- package/dist/esm/rendering/texture/Sampler.js +5 -7
- package/dist/esm/rendering/texture/Sampler.js.map +1 -1
- package/dist/esm/rendering/types.d.ts +4 -0
- package/dist/esm/rendering/types.js +4 -0
- package/dist/esm/rendering/types.js.map +1 -1
- package/dist/esm/rendering/video/Video.d.ts +2 -2
- package/dist/esm/rendering/video/Video.js +2 -2
- package/dist/esm/rendering/video/Video.js.map +1 -1
- package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.d.ts +2 -2
- package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js +35 -11
- package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.d.ts +13 -13
- package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.js +20 -20
- package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/{WebGl2RenderManager.d.ts → WebGl2Backend.d.ts} +15 -12
- package/dist/esm/rendering/webgl2/{WebGl2RenderManager.js → WebGl2Backend.js} +60 -38
- package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.d.ts +31 -0
- package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.js +186 -0
- package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.d.ts +38 -7
- package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js +281 -90
- package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.d.ts +2 -2
- package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.js +15 -10
- package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js +12 -0
- package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.d.ts +2 -0
- package/dist/esm/rendering/webgl2/{WebGl2ShaderRuntime.js → WebGl2ShaderProgram.js} +58 -18
- package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +26 -7
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +260 -62
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.d.ts +24 -1
- package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.js +6 -2
- package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.js.map +1 -1
- package/dist/esm/rendering/webgl2/glsl/mask-compose.frag.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/mask-compose.frag.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/mask-compose.vert.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/mask-compose.vert.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/particle.vert.js +1 -1
- package/dist/esm/rendering/webgl2/glsl/sprite.frag.js +1 -1
- package/dist/esm/rendering/webgl2/glsl/sprite.vert.js +1 -1
- package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.d.ts +9 -9
- package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.js +18 -18
- package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/{WebGpuRenderManager.d.ts → WebGpuBackend.d.ts} +17 -14
- package/dist/esm/rendering/webgpu/{WebGpuRenderManager.js → WebGpuBackend.js} +74 -40
- package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.d.ts +37 -0
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js +279 -0
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.d.ts +2 -3
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +65 -82
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.d.ts +2 -3
- package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.js +24 -25
- package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +28 -13
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +410 -382
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
- package/dist/esm/resources/Loader.js +5 -3
- package/dist/esm/resources/Loader.js.map +1 -1
- package/dist/exo.esm.js +2500 -1399
- package/dist/exo.esm.js.map +1 -1
- package/package.json +20 -11
- package/dist/esm/math/Transformable.d.ts +0 -47
- package/dist/esm/math/Transformable.js +0 -140
- package/dist/esm/math/Transformable.js.map +0 -1
- package/dist/esm/rendering/webgl2/WebGl2RenderManager.js.map +0 -1
- package/dist/esm/rendering/webgl2/WebGl2RendererRuntime.d.ts +0 -15
- package/dist/esm/rendering/webgl2/WebGl2ShaderRuntime.d.ts +0 -2
- package/dist/esm/rendering/webgl2/WebGl2ShaderRuntime.js.map +0 -1
- package/dist/esm/rendering/webgpu/WebGpuRenderManager.js.map +0 -1
- package/dist/esm/rendering/webgpu/WebGpuRendererRuntime.d.ts +0 -8
- package/dist/exo.esm.min.js +0 -2
- package/dist/exo.esm.min.js.map +0 -1
- package/dist/exo.global.js +0 -17328
- package/dist/exo.global.js.map +0 -1
- package/dist/exo.global.min.js +0 -2
- package/dist/exo.global.min.js.map +0 -1
|
@@ -1,80 +1,278 @@
|
|
|
1
|
+
import { AbstractWebGl2Renderer } from './AbstractWebGl2Renderer.js';
|
|
2
|
+
import { Shader } from '../shader/Shader.js';
|
|
3
|
+
import { createWebGl2ShaderProgram } from './WebGl2ShaderProgram.js';
|
|
4
|
+
import { WebGl2RenderBuffer } from './WebGl2RenderBuffer.js';
|
|
1
5
|
import { WebGl2VertexArrayObject } from './WebGl2VertexArrayObject.js';
|
|
2
|
-
import {
|
|
6
|
+
import { RenderingPrimitives, BufferTypes, BufferUsage } from '../types.js';
|
|
3
7
|
import vertexSource from './glsl/sprite.vert.js';
|
|
4
8
|
import fragmentSource from './glsl/sprite.frag.js';
|
|
5
9
|
|
|
6
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Instanced sprite renderer for WebGL2.
|
|
12
|
+
*
|
|
13
|
+
* Each batch issues a single `drawArraysInstanced(TRIANGLE_STRIP, 0, 4, N)`
|
|
14
|
+
* with no per-vertex buffer — `gl_VertexID` 0..3 selects which corner of
|
|
15
|
+
* the quad each invocation is computing. All per-sprite data lives in a
|
|
16
|
+
* single per-instance buffer (divisor = 1).
|
|
17
|
+
*
|
|
18
|
+
* Per-instance layout (56 bytes per sprite, 6 attributes):
|
|
19
|
+
* ```
|
|
20
|
+
* localBounds f32x4 (offset 0, 16 bytes) — left, top, right, bottom
|
|
21
|
+
* transformAB f32x3 (offset 16, 12 bytes) — first row of 2D affine
|
|
22
|
+
* transformCD f32x3 (offset 28, 12 bytes) — second row of 2D affine
|
|
23
|
+
* uvBounds u16x4 norm (offset 40, 8 bytes) — uMin, vMin, uMax, vMax
|
|
24
|
+
* color u8x4 norm (offset 48, 4 bytes) — RGBA tint
|
|
25
|
+
* textureSlot u32 (offset 52, 4 bytes) — multi-texture slot
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* vs. the previous per-vertex layout (80 bytes per quad), this saves
|
|
29
|
+
* roughly 30% bandwidth and ~75% of the CPU writes per sprite — the
|
|
30
|
+
* vertex shader expands one instance into four corners on the GPU
|
|
31
|
+
* instead of the CPU duplicating the same color/slot/transform across
|
|
32
|
+
* four vertex entries.
|
|
33
|
+
*/
|
|
34
|
+
const maxBatchTextures = 8;
|
|
35
|
+
const instanceStrideBytes = 56;
|
|
36
|
+
const wordsPerInstance = instanceStrideBytes / Uint32Array.BYTES_PER_ELEMENT;
|
|
37
|
+
class WebGl2SpriteRenderer extends AbstractWebGl2Renderer {
|
|
38
|
+
_shader;
|
|
39
|
+
_batchSize;
|
|
40
|
+
_instanceData;
|
|
41
|
+
_instanceFloat32;
|
|
42
|
+
_instanceUint32;
|
|
43
|
+
_activeTextures = new Array(maxBatchTextures).fill(null);
|
|
44
|
+
_textureSlots = new Map();
|
|
45
|
+
_slotCount = 0;
|
|
46
|
+
_instanceCount = 0;
|
|
47
|
+
_currentBlendMode = null;
|
|
48
|
+
_currentView = null;
|
|
49
|
+
_currentViewId = -1;
|
|
50
|
+
_instanceBuffer = null;
|
|
51
|
+
_vao = null;
|
|
52
|
+
_connection = null;
|
|
7
53
|
constructor(batchSize) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
super(batchSize, 16, vertexSource, fragmentSource);
|
|
54
|
+
super();
|
|
55
|
+
this._batchSize = batchSize;
|
|
56
|
+
this._shader = new Shader(vertexSource, fragmentSource);
|
|
57
|
+
this._instanceData = new ArrayBuffer(batchSize * instanceStrideBytes);
|
|
58
|
+
this._instanceFloat32 = new Float32Array(this._instanceData);
|
|
59
|
+
this._instanceUint32 = new Uint32Array(this._instanceData);
|
|
15
60
|
}
|
|
16
61
|
render(sprite) {
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
if (
|
|
62
|
+
const texture = sprite.texture;
|
|
63
|
+
if (texture === null) {
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
66
|
+
const backend = this.getBackend();
|
|
67
|
+
const blendMode = sprite.blendMode;
|
|
68
|
+
const batchFull = this._instanceCount >= this._batchSize;
|
|
69
|
+
const blendModeChanged = blendMode !== this._currentBlendMode;
|
|
70
|
+
const slotExhausted = !this._textureSlots.has(texture) && this._slotCount >= maxBatchTextures;
|
|
71
|
+
if (batchFull || blendModeChanged || slotExhausted) {
|
|
27
72
|
this.flush();
|
|
28
|
-
if (textureChanged) {
|
|
29
|
-
this.currentTexture = texture;
|
|
30
|
-
}
|
|
31
73
|
if (blendModeChanged) {
|
|
32
|
-
this.
|
|
33
|
-
|
|
74
|
+
this._currentBlendMode = blendMode;
|
|
75
|
+
backend.setBlendMode(blendMode);
|
|
34
76
|
}
|
|
35
77
|
}
|
|
36
|
-
|
|
37
|
-
|
|
78
|
+
let slot = this._textureSlots.get(texture);
|
|
79
|
+
if (slot === undefined) {
|
|
80
|
+
slot = this._slotCount++;
|
|
81
|
+
this._textureSlots.set(texture, slot);
|
|
82
|
+
this._activeTextures[slot] = texture;
|
|
83
|
+
backend.bindTexture(texture, slot);
|
|
38
84
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
//
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
//
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
85
|
+
const offset = this._instanceCount * wordsPerInstance;
|
|
86
|
+
const f32 = this._instanceFloat32;
|
|
87
|
+
const u32 = this._instanceUint32;
|
|
88
|
+
// localBounds: left, top, right, bottom (offset 0..3)
|
|
89
|
+
const bounds = sprite.getLocalBounds();
|
|
90
|
+
f32[offset + 0] = bounds.left;
|
|
91
|
+
f32[offset + 1] = bounds.top;
|
|
92
|
+
f32[offset + 2] = bounds.right;
|
|
93
|
+
f32[offset + 3] = bounds.bottom;
|
|
94
|
+
// transform rows (offset 4..6 = AB, 7..9 = CD)
|
|
95
|
+
const transform = sprite.getGlobalTransform();
|
|
96
|
+
f32[offset + 4] = transform.a;
|
|
97
|
+
f32[offset + 5] = transform.b;
|
|
98
|
+
f32[offset + 6] = transform.x;
|
|
99
|
+
f32[offset + 7] = transform.c;
|
|
100
|
+
f32[offset + 8] = transform.d;
|
|
101
|
+
f32[offset + 9] = transform.y;
|
|
102
|
+
// uvBounds at offset 10 — 8 bytes = 2 u32 slots, normalised u16x4.
|
|
103
|
+
// Pack (uMin, vMin, uMax, vMax) into two uint32s, with flipY swap
|
|
104
|
+
// applied at pack time so the shader can stay flip-agnostic.
|
|
105
|
+
const frame = sprite.textureFrame;
|
|
106
|
+
const texWidth = texture.width;
|
|
107
|
+
const texHeight = texture.height;
|
|
108
|
+
// Clamp to 16-bit unsigned range for normalisation.
|
|
109
|
+
const uMin = (frame.left / texWidth) * 0xFFFF & 0xFFFF;
|
|
110
|
+
const uMax = (frame.right / texWidth) * 0xFFFF & 0xFFFF;
|
|
111
|
+
const vMinRaw = (frame.top / texHeight) * 0xFFFF & 0xFFFF;
|
|
112
|
+
const vMaxRaw = (frame.bottom / texHeight) * 0xFFFF & 0xFFFF;
|
|
113
|
+
const vMin = texture.flipY ? vMaxRaw : vMinRaw;
|
|
114
|
+
const vMax = texture.flipY ? vMinRaw : vMaxRaw;
|
|
115
|
+
u32[offset + 10] = uMin | (vMin << 16);
|
|
116
|
+
u32[offset + 11] = uMax | (vMax << 16);
|
|
117
|
+
// color (u8x4 packed) at word 12
|
|
118
|
+
u32[offset + 12] = sprite.tint.toRgba();
|
|
119
|
+
// textureSlot (u32) at word 13
|
|
120
|
+
u32[offset + 13] = slot;
|
|
121
|
+
this._instanceCount++;
|
|
64
122
|
return this;
|
|
65
123
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
124
|
+
flush() {
|
|
125
|
+
const backend = this.getBackendOrNull();
|
|
126
|
+
const instanceBuffer = this._instanceBuffer;
|
|
127
|
+
const vao = this._vao;
|
|
128
|
+
if (this._instanceCount === 0 || backend === null || instanceBuffer === null || vao === null) {
|
|
129
|
+
this._resetSlots();
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const view = backend.view;
|
|
133
|
+
if (this._currentView !== view || this._currentViewId !== view.updateId) {
|
|
134
|
+
this._currentView = view;
|
|
135
|
+
this._currentViewId = view.updateId;
|
|
136
|
+
this._shader
|
|
137
|
+
.getUniform('u_projection')
|
|
138
|
+
.setValue(view.getTransform().toArray(false));
|
|
139
|
+
}
|
|
140
|
+
this._shader.sync();
|
|
141
|
+
backend.bindVertexArrayObject(vao);
|
|
142
|
+
instanceBuffer.upload(this._instanceFloat32.subarray(0, this._instanceCount * wordsPerInstance));
|
|
143
|
+
vao.drawInstanced(4, 0, this._instanceCount, RenderingPrimitives.TriangleStrip);
|
|
144
|
+
backend.stats.batches++;
|
|
145
|
+
backend.stats.drawCalls++;
|
|
146
|
+
this._instanceCount = 0;
|
|
147
|
+
this._resetSlots();
|
|
148
|
+
}
|
|
149
|
+
onConnect(backend) {
|
|
150
|
+
const gl = backend.context;
|
|
151
|
+
this._shader.connect(createWebGl2ShaderProgram(gl));
|
|
152
|
+
this._connection = this._createConnection(gl);
|
|
153
|
+
this._instanceBuffer = new WebGl2RenderBuffer(BufferTypes.ArrayBuffer, this._instanceData, BufferUsage.DynamicDraw)
|
|
154
|
+
.connect(this._createBufferRuntime(this._connection));
|
|
155
|
+
this._shader.sync();
|
|
156
|
+
this._vao = new WebGl2VertexArrayObject(RenderingPrimitives.TriangleStrip)
|
|
157
|
+
.addAttribute(this._instanceBuffer, this._shader.getAttribute('a_localBounds'), gl.FLOAT, false, instanceStrideBytes, 0, false, 1)
|
|
158
|
+
.addAttribute(this._instanceBuffer, this._shader.getAttribute('a_transformAB'), gl.FLOAT, false, instanceStrideBytes, 16, false, 1)
|
|
159
|
+
.addAttribute(this._instanceBuffer, this._shader.getAttribute('a_transformCD'), gl.FLOAT, false, instanceStrideBytes, 28, false, 1)
|
|
160
|
+
.addAttribute(this._instanceBuffer, this._shader.getAttribute('a_uvBounds'), gl.UNSIGNED_SHORT, true, instanceStrideBytes, 40, false, 1)
|
|
161
|
+
.addAttribute(this._instanceBuffer, this._shader.getAttribute('a_color'), gl.UNSIGNED_BYTE, true, instanceStrideBytes, 48, false, 1)
|
|
162
|
+
.addAttribute(this._instanceBuffer, this._shader.getAttribute('a_textureSlot'), gl.UNSIGNED_INT, false, instanceStrideBytes, 52, true, 1)
|
|
163
|
+
.connect(this._createVaoRuntime(this._connection));
|
|
164
|
+
// Pin the per-slot sampler uniforms to texture units 0..N-1.
|
|
165
|
+
const samplerUnit = new Int32Array(1);
|
|
166
|
+
for (let i = 0; i < maxBatchTextures; i++) {
|
|
167
|
+
samplerUnit[0] = i;
|
|
168
|
+
this._shader.getUniform(`u_texture${i}`).setValue(samplerUnit);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
onDisconnect() {
|
|
172
|
+
this._shader.disconnect();
|
|
173
|
+
this._instanceBuffer?.destroy();
|
|
174
|
+
this._instanceBuffer = null;
|
|
175
|
+
this._vao?.destroy();
|
|
176
|
+
this._vao = null;
|
|
177
|
+
this._connection = null;
|
|
178
|
+
this._currentBlendMode = null;
|
|
179
|
+
this._currentView = null;
|
|
180
|
+
this._currentViewId = -1;
|
|
181
|
+
this._instanceCount = 0;
|
|
72
182
|
}
|
|
73
|
-
|
|
74
|
-
this.
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
183
|
+
destroy() {
|
|
184
|
+
this.disconnect();
|
|
185
|
+
this._shader.destroy();
|
|
186
|
+
}
|
|
187
|
+
_resetSlots() {
|
|
188
|
+
if (this._slotCount > 0) {
|
|
189
|
+
for (let i = 0; i < this._slotCount; i++) {
|
|
190
|
+
this._activeTextures[i] = null;
|
|
191
|
+
}
|
|
192
|
+
this._textureSlots.clear();
|
|
193
|
+
this._slotCount = 0;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
_createConnection(gl) {
|
|
197
|
+
const vaoHandle = gl.createVertexArray();
|
|
198
|
+
if (vaoHandle === null) {
|
|
199
|
+
throw new Error('WebGl2SpriteRenderer: could not create vertex array object.');
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
gl,
|
|
203
|
+
buffers: new Map(),
|
|
204
|
+
vaoHandle,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
_createBufferRuntime(connection) {
|
|
208
|
+
const handle = connection.gl.createBuffer();
|
|
209
|
+
if (handle === null) {
|
|
210
|
+
throw new Error('WebGl2SpriteRenderer: could not create render buffer.');
|
|
211
|
+
}
|
|
212
|
+
return {
|
|
213
|
+
bind: (buffer) => {
|
|
214
|
+
connection.gl.bindBuffer(buffer.type, handle);
|
|
215
|
+
},
|
|
216
|
+
upload: (buffer, offset) => {
|
|
217
|
+
const gl = connection.gl;
|
|
218
|
+
const data = buffer.data;
|
|
219
|
+
const state = connection.buffers.get(buffer);
|
|
220
|
+
gl.bindBuffer(buffer.type, handle);
|
|
221
|
+
if (state && state.dataByteLength >= data.byteLength) {
|
|
222
|
+
gl.bufferSubData(buffer.type, offset, data);
|
|
223
|
+
state.dataByteLength = data.byteLength;
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
gl.bufferData(buffer.type, data, buffer.usage);
|
|
227
|
+
connection.buffers.set(buffer, { handle, dataByteLength: data.byteLength });
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
destroy: (buffer) => {
|
|
231
|
+
connection.gl.deleteBuffer(handle);
|
|
232
|
+
connection.buffers.delete(buffer);
|
|
233
|
+
buffer.disconnect();
|
|
234
|
+
},
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
_createVaoRuntime(connection) {
|
|
238
|
+
let appliedVersion = -1;
|
|
239
|
+
return {
|
|
240
|
+
bind: (vao) => {
|
|
241
|
+
const gl = connection.gl;
|
|
242
|
+
gl.bindVertexArray(connection.vaoHandle);
|
|
243
|
+
if (appliedVersion !== vao.version) {
|
|
244
|
+
let lastBuffer = null;
|
|
245
|
+
for (const attribute of vao.attributes) {
|
|
246
|
+
if (lastBuffer !== attribute.buffer) {
|
|
247
|
+
attribute.buffer.bind();
|
|
248
|
+
lastBuffer = attribute.buffer;
|
|
249
|
+
}
|
|
250
|
+
if (attribute.integer) {
|
|
251
|
+
gl.vertexAttribIPointer(attribute.location, attribute.size, attribute.type, attribute.stride, attribute.start);
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
gl.vertexAttribPointer(attribute.location, attribute.size, attribute.type, attribute.normalized, attribute.stride, attribute.start);
|
|
255
|
+
}
|
|
256
|
+
gl.enableVertexAttribArray(attribute.location);
|
|
257
|
+
gl.vertexAttribDivisor(attribute.location, attribute.divisor);
|
|
258
|
+
}
|
|
259
|
+
appliedVersion = vao.version;
|
|
260
|
+
}
|
|
261
|
+
},
|
|
262
|
+
unbind: () => {
|
|
263
|
+
connection.gl.bindVertexArray(null);
|
|
264
|
+
},
|
|
265
|
+
draw: (vao, size, start, type) => {
|
|
266
|
+
connection.gl.drawArrays(type, start, size);
|
|
267
|
+
},
|
|
268
|
+
drawInstanced: (_vao, count, start, instanceCount, type) => {
|
|
269
|
+
connection.gl.drawArraysInstanced(type, start, count, instanceCount);
|
|
270
|
+
},
|
|
271
|
+
destroy: (vao) => {
|
|
272
|
+
connection.gl.deleteVertexArray(connection.vaoHandle);
|
|
273
|
+
vao.disconnect();
|
|
274
|
+
},
|
|
275
|
+
};
|
|
78
276
|
}
|
|
79
277
|
}
|
|
80
278
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebGl2SpriteRenderer.js","sources":["../../../../../src/rendering/webgl2/WebGl2SpriteRenderer.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WebGl2SpriteRenderer.js","sources":["../../../../../src/rendering/webgl2/WebGl2SpriteRenderer.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -9,11 +9,33 @@ interface VaoAttribute {
|
|
|
9
9
|
readonly normalized: boolean;
|
|
10
10
|
readonly stride: number;
|
|
11
11
|
readonly start: number;
|
|
12
|
+
/**
|
|
13
|
+
* When true, the attribute is bound via `vertexAttribIPointer` so the
|
|
14
|
+
* shader receives the raw integer value (not normalised, not converted
|
|
15
|
+
* to float). Used for `uint`/`ivec`-typed shader inputs such as a
|
|
16
|
+
* batched-sprite texture-slot index.
|
|
17
|
+
*/
|
|
18
|
+
readonly integer: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Vertex-attribute divisor passed to `gl.vertexAttribDivisor`. Zero
|
|
21
|
+
* means per-vertex (the default). One means per-instance — the
|
|
22
|
+
* attribute advances once per drawArraysInstanced / drawElementsInstanced
|
|
23
|
+
* instance instead of once per vertex.
|
|
24
|
+
*/
|
|
25
|
+
readonly divisor: number;
|
|
12
26
|
}
|
|
13
27
|
export interface WebGl2VertexArrayObjectRuntime {
|
|
14
28
|
bind(vao: WebGl2VertexArrayObject): void;
|
|
15
29
|
unbind(vao: WebGl2VertexArrayObject): void;
|
|
16
30
|
draw(vao: WebGl2VertexArrayObject, size: number, start: number, type: RenderingPrimitives): void;
|
|
31
|
+
/**
|
|
32
|
+
* Instanced draw — `count` vertices/indices replicated `instanceCount`
|
|
33
|
+
* times. Per-vertex attributes (divisor 0) are shared across instances;
|
|
34
|
+
* per-instance attributes (divisor 1) advance once per instance.
|
|
35
|
+
* Optional: runtimes that don't drive instanced rendering can omit this
|
|
36
|
+
* and the VAO's `drawInstanced()` then no-ops via the optional-chain.
|
|
37
|
+
*/
|
|
38
|
+
drawInstanced?(vao: WebGl2VertexArrayObject, count: number, start: number, instanceCount: number, type: RenderingPrimitives): void;
|
|
17
39
|
destroy(vao: WebGl2VertexArrayObject): void;
|
|
18
40
|
}
|
|
19
41
|
export declare class WebGl2VertexArrayObject {
|
|
@@ -31,10 +53,11 @@ export declare class WebGl2VertexArrayObject {
|
|
|
31
53
|
disconnect(): this;
|
|
32
54
|
bind(): this;
|
|
33
55
|
unbind(): this;
|
|
34
|
-
addAttribute(buffer: WebGl2RenderBuffer, attribute: ShaderAttribute, type?: number, normalized?: boolean, stride?: number, start?: number): this;
|
|
56
|
+
addAttribute(buffer: WebGl2RenderBuffer, attribute: ShaderAttribute, type?: number, normalized?: boolean, stride?: number, start?: number, integer?: boolean, divisor?: number): this;
|
|
35
57
|
addIndex(buffer: WebGl2RenderBuffer): this;
|
|
36
58
|
clear(): this;
|
|
37
59
|
draw(size: number, start: number, type?: RenderingPrimitives): this;
|
|
60
|
+
drawInstanced(count: number, start: number, instanceCount: number, type?: RenderingPrimitives): this;
|
|
38
61
|
destroy(): void;
|
|
39
62
|
}
|
|
40
63
|
export {};
|
|
@@ -37,9 +37,9 @@ class WebGl2VertexArrayObject {
|
|
|
37
37
|
this._runtime?.unbind(this);
|
|
38
38
|
return this;
|
|
39
39
|
}
|
|
40
|
-
addAttribute(buffer, attribute, type = ShaderPrimitives.Float, normalized = false, stride = 0, start = 0) {
|
|
40
|
+
addAttribute(buffer, attribute, type = ShaderPrimitives.Float, normalized = false, stride = 0, start = 0, integer = false, divisor = 0) {
|
|
41
41
|
const { location, size } = attribute;
|
|
42
|
-
this._attributes.push({ buffer, location, size, type, normalized, stride, start });
|
|
42
|
+
this._attributes.push({ buffer, location, size, type, normalized, stride, start, integer, divisor });
|
|
43
43
|
this._version++;
|
|
44
44
|
return this;
|
|
45
45
|
}
|
|
@@ -58,6 +58,10 @@ class WebGl2VertexArrayObject {
|
|
|
58
58
|
this._runtime?.draw(this, size, start, type);
|
|
59
59
|
return this;
|
|
60
60
|
}
|
|
61
|
+
drawInstanced(count, start, instanceCount, type = this._drawMode) {
|
|
62
|
+
this._runtime?.drawInstanced?.(this, count, start, instanceCount, type);
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
61
65
|
destroy() {
|
|
62
66
|
this._runtime?.destroy(this);
|
|
63
67
|
this._runtime = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebGl2VertexArrayObject.js","sources":["../../../../../src/rendering/webgl2/WebGl2VertexArrayObject.ts"],"sourcesContent":[null],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"WebGl2VertexArrayObject.js","sources":["../../../../../src/rendering/webgl2/WebGl2VertexArrayObject.ts"],"sourcesContent":[null],"names":[],"mappings":";;MA2Ca,uBAAuB,CAAA;IAEf,WAAW,GAAwB,EAAE;IAC9C,YAAY,GAA8B,IAAI;AAC9C,IAAA,SAAS;IACT,QAAQ,GAA0C,IAAI;IACtD,QAAQ,GAAG,CAAC;IAEpB,WAAA,CAAmB,QAAA,GAAgC,mBAAmB,CAAC,SAAS,EAAA;AAC5E,QAAA,IAAI,CAAC,SAAS,GAAG,QAAQ;IAC7B;AAEA,IAAA,IAAW,UAAU,GAAA;QACjB,OAAO,IAAI,CAAC,WAAW;IAC3B;AAEA,IAAA,IAAW,WAAW,GAAA;QAClB,OAAO,IAAI,CAAC,YAAY;IAC5B;AAEA,IAAA,IAAW,QAAQ,GAAA;QACf,OAAO,IAAI,CAAC,SAAS;IACzB;AAEA,IAAA,IAAW,OAAO,GAAA;QACd,OAAO,IAAI,CAAC,QAAQ;IACxB;AAEO,IAAA,OAAO,CAAC,OAAuC,EAAA;AAClD,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;AAEvB,QAAA,OAAO,IAAI;IACf;IAEO,UAAU,GAAA;AACb,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AAEpB,QAAA,OAAO,IAAI;IACf;IAEO,IAAI,GAAA;AACP,QAAA,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC;AAEzB,QAAA,OAAO,IAAI;IACf;IAEO,MAAM,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC;AAE3B,QAAA,OAAO,IAAI;IACf;AAEO,IAAA,YAAY,CAAC,MAA0B,EAAE,SAA0B,EAAE,IAAA,GAAe,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,GAAG,CAAC,EAAA;AACtL,QAAA,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,SAAS;QAEpC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QACpG,IAAI,CAAC,QAAQ,EAAE;AAEf,QAAA,OAAO,IAAI;IACf;AAEO,IAAA,QAAQ,CAAC,MAA0B,EAAA;AACtC,QAAA,IAAI,CAAC,YAAY,GAAG,MAAM;QAC1B,IAAI,CAAC,QAAQ,EAAE;AAEf,QAAA,OAAO,IAAI;IACf;IAEO,KAAK,GAAA;AACR,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;AAC3B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QACxB,IAAI,CAAC,QAAQ,EAAE;AAEf,QAAA,OAAO,IAAI;IACf;IAEO,IAAI,CAAC,IAAY,EAAE,KAAa,EAAE,IAAA,GAA4B,IAAI,CAAC,SAAS,EAAA;AAC/E,QAAA,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC;AAE5C,QAAA,OAAO,IAAI;IACf;IAEO,aAAa,CAAC,KAAa,EAAE,KAAa,EAAE,aAAqB,EAAE,IAAA,GAA4B,IAAI,CAAC,SAAS,EAAA;AAChH,QAAA,IAAI,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC;AAEvE,QAAA,OAAO,IAAI;IACf;IAEO,OAAO,GAAA;AACV,QAAA,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;IAC5B;AACH;;;;"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
var fragmentSource = "#version 300 es\r\nprecision lowp float;\r\n\r\nuniform sampler2D u_content;\r\nuniform sampler2D u_mask;\r\n\r\nin vec2 v_texcoord;\r\n\r\nlayout(location = 0) out vec4 fragColor;\r\n\r\nvoid main(void) {\r\n vec4 contentColor = texture(u_content, v_texcoord);\r\n float maskAlpha = texture(u_mask, v_texcoord).a;\r\n\r\n fragColor = vec4(contentColor.rgb * maskAlpha, contentColor.a * maskAlpha);\r\n}\r\n";
|
|
2
|
+
|
|
3
|
+
export { fragmentSource as default };
|
|
4
|
+
//# sourceMappingURL=mask-compose.frag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mask-compose.frag.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
var vertexSource = "#version 300 es\r\nprecision lowp float;\r\n\r\nlayout(location = 0) in vec2 a_position;\r\nlayout(location = 1) in vec2 a_texcoord;\r\n\r\nuniform mat3 u_projection;\r\n\r\nout vec2 v_texcoord;\r\n\r\nvoid main(void) {\r\n gl_Position = vec4((u_projection * vec3(a_position, 1.0)).xy, 0.0, 1.0);\r\n v_texcoord = a_texcoord;\r\n}\r\n";
|
|
2
|
+
|
|
3
|
+
export { vertexSource as default };
|
|
4
|
+
//# sourceMappingURL=mask-compose.vert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mask-compose.vert.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var vertexSource = "#version 300 es\
|
|
1
|
+
var vertexSource = "#version 300 es\nprecision lowp float;\nprecision lowp int;\n\n// Per-instance attributes (one entry per particle, 24 bytes total).\nlayout(location = 0) in vec2 a_translation; // particle position in system-local space\nlayout(location = 1) in vec2 a_scale; // particle scale\nlayout(location = 2) in float a_rotation; // particle rotation in degrees\nlayout(location = 3) in vec4 a_color; // RGBA tint\n\nuniform mat3 u_projection;\nuniform mat3 u_systemTransform;\nuniform vec4 u_localBounds; // left, top, right, bottom (system.vertices)\nuniform vec4 u_uvBounds; // uMin, vMin, uMax, vMax (flipY-swapped)\n\nout vec2 v_texcoord;\nout vec4 v_color;\n\nvoid main(void) {\n // Static index buffer is [0,1,2,0,2,3] (triangle-list), so gl_VertexID 0..3\n // maps to TL, TR, BR, BL via the same bit math the sprite renderer uses.\n int vid = gl_VertexID;\n int cornerX = ((vid + 1) >> 1) & 1;\n int cornerY = vid >> 1;\n\n float localX = (cornerX == 0) ? u_localBounds.x : u_localBounds.z;\n float localY = (cornerY == 0) ? u_localBounds.y : u_localBounds.w;\n\n // Per-particle scale + rotation.\n vec2 rotation = vec2(sin(radians(a_rotation)), cos(radians(a_rotation)));\n vec2 transformed = vec2(\n (localX * (a_scale.x * rotation.y)) + (localY * (a_scale.y * rotation.x)),\n (localX * (a_scale.x * -rotation.x)) + (localY * (a_scale.y * rotation.y))\n );\n\n vec3 worldPos = vec3(transformed + a_translation, 1.0);\n\n gl_Position = vec4((u_projection * u_systemTransform * worldPos).xy, 0.0, 1.0);\n\n float u = (cornerX == 0) ? u_uvBounds.x : u_uvBounds.z;\n float v = (cornerY == 0) ? u_uvBounds.y : u_uvBounds.w;\n v_texcoord = vec2(u, v);\n\n v_color = vec4(a_color.rgb * a_color.a, a_color.a);\n}\n";
|
|
2
2
|
|
|
3
3
|
export { vertexSource as default };
|
|
4
4
|
//# sourceMappingURL=particle.vert.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var fragmentSource = "#version 300 es\r\nprecision lowp float;\r\n\r\nuniform sampler2D
|
|
1
|
+
var fragmentSource = "#version 300 es\r\nprecision lowp float;\r\nprecision lowp int;\r\n\r\n// Multi-texture sprite batching: up to 8 textures bound per draw call,\r\n// each fragment selects its source via a flat-interpolated slot index.\r\n//\r\n// GLSL ES 3.0 forbids non-constant array-of-sampler indexing unless the\r\n// expression is dynamically uniform — which a per-vertex slot is not\r\n// once different triangles in the same batch carry different slots. The\r\n// if/else chain below dispatches statically and dodges that constraint.\r\n\r\nuniform sampler2D u_texture0;\r\nuniform sampler2D u_texture1;\r\nuniform sampler2D u_texture2;\r\nuniform sampler2D u_texture3;\r\nuniform sampler2D u_texture4;\r\nuniform sampler2D u_texture5;\r\nuniform sampler2D u_texture6;\r\nuniform sampler2D u_texture7;\r\n\r\nin vec2 v_texcoord;\r\nin vec4 v_color;\r\nflat in uint v_textureSlot;\r\n\r\nlayout(location = 0) out vec4 fragColor;\r\n\r\nvoid main(void) {\r\n vec4 sampleColor;\r\n\r\n if (v_textureSlot == 0u) {\r\n sampleColor = texture(u_texture0, v_texcoord);\r\n } else if (v_textureSlot == 1u) {\r\n sampleColor = texture(u_texture1, v_texcoord);\r\n } else if (v_textureSlot == 2u) {\r\n sampleColor = texture(u_texture2, v_texcoord);\r\n } else if (v_textureSlot == 3u) {\r\n sampleColor = texture(u_texture3, v_texcoord);\r\n } else if (v_textureSlot == 4u) {\r\n sampleColor = texture(u_texture4, v_texcoord);\r\n } else if (v_textureSlot == 5u) {\r\n sampleColor = texture(u_texture5, v_texcoord);\r\n } else if (v_textureSlot == 6u) {\r\n sampleColor = texture(u_texture6, v_texcoord);\r\n } else {\r\n sampleColor = texture(u_texture7, v_texcoord);\r\n }\r\n\r\n fragColor = sampleColor * v_color;\r\n}\r\n";
|
|
2
2
|
|
|
3
3
|
export { fragmentSource as default };
|
|
4
4
|
//# sourceMappingURL=sprite.frag.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var vertexSource = "#version 300 es\
|
|
1
|
+
var vertexSource = "#version 300 es\nprecision lowp float;\nprecision lowp int;\n\n// Per-instance attributes (divisor = 1). Each Sprite contributes one entry\n// to the per-instance buffer; gl_VertexID 0..3 selects which corner of the\n// quad this invocation is computing.\nlayout(location = 0) in vec4 a_localBounds; // left, top, right, bottom (local space)\nlayout(location = 1) in vec3 a_transformAB; // a, b, x — first row of 2D affine\nlayout(location = 2) in vec3 a_transformCD; // c, d, y — second row\nlayout(location = 3) in vec4 a_uvBounds; // uMin, vMin, uMax, vMax (normalised, already flipY-swapped)\nlayout(location = 4) in vec4 a_color; // RGBA tint\nlayout(location = 5) in uint a_textureSlot;\n\nuniform mat3 u_projection;\n\nout vec2 v_texcoord;\nout vec4 v_color;\nflat out uint v_textureSlot;\n\nvoid main(void) {\n // gl_VertexID 0..3 → corner: 0=TL, 1=TR, 2=BL, 3=BR (TRIANGLE_STRIP order)\n int vid = gl_VertexID;\n int cornerX = vid & 1;\n int cornerY = (vid >> 1) & 1;\n\n // Local-space corner: pick from the bounds rectangle.\n float localX = (cornerX == 0) ? a_localBounds.x : a_localBounds.z;\n float localY = (cornerY == 0) ? a_localBounds.y : a_localBounds.w;\n\n // Apply the per-instance affine transform: world = M * (localX, localY, 1)\n float worldX = (a_transformAB.x * localX) + (a_transformAB.y * localY) + a_transformAB.z;\n float worldY = (a_transformCD.x * localX) + (a_transformCD.y * localY) + a_transformCD.z;\n\n gl_Position = vec4((u_projection * vec3(worldX, worldY, 1.0)).xy, 0.0, 1.0);\n\n // UV: pick from the bounds rectangle. The CPU pre-swaps Y bounds when\n // the texture is flipY, so the shader doesn't have to know.\n float u = (cornerX == 0) ? a_uvBounds.x : a_uvBounds.z;\n float v = (cornerY == 0) ? a_uvBounds.y : a_uvBounds.w;\n v_texcoord = vec2(u, v);\n\n v_color = vec4(a_color.rgb * a_color.a, a_color.a);\n v_textureSlot = a_textureSlot;\n}\n";
|
|
2
2
|
|
|
3
3
|
export { vertexSource as default };
|
|
4
4
|
//# sourceMappingURL=sprite.vert.js.map
|
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
import { RenderBackendType } from '../RenderBackendType';
|
|
2
2
|
import type { Drawable } from '../Drawable';
|
|
3
3
|
import type { Renderer } from '../Renderer';
|
|
4
|
-
import type {
|
|
4
|
+
import type { WebGpuBackend } from './WebGpuBackend';
|
|
5
5
|
/**
|
|
6
6
|
* Base class for WebGPU renderers.
|
|
7
7
|
*
|
|
8
8
|
* Manages the connect/disconnect lifecycle and provides a safe
|
|
9
|
-
* `
|
|
9
|
+
* `getBackend()` accessor that throws if the renderer is not connected.
|
|
10
10
|
*
|
|
11
11
|
* Subclasses must implement:
|
|
12
|
-
* - onConnect(
|
|
12
|
+
* - onConnect(backend): set up GPU resources (shader modules, pipelines, buffers)
|
|
13
13
|
* - onDisconnect(): tear down GPU resources
|
|
14
14
|
* - render(drawable): collect draw call data for the given drawable
|
|
15
15
|
* - flush(): encode and submit command buffers for all collected draw calls
|
|
16
16
|
*/
|
|
17
|
-
export declare abstract class AbstractWebGpuRenderer<Target extends Drawable> implements Renderer<
|
|
17
|
+
export declare abstract class AbstractWebGpuRenderer<Target extends Drawable> implements Renderer<WebGpuBackend, Target> {
|
|
18
18
|
readonly backendType = RenderBackendType.WebGpu;
|
|
19
|
-
|
|
20
|
-
connect(
|
|
19
|
+
protected _backend: WebGpuBackend | null;
|
|
20
|
+
connect(backend: WebGpuBackend): void;
|
|
21
21
|
disconnect(): void;
|
|
22
22
|
abstract render(drawable: Target): void;
|
|
23
23
|
abstract flush(): void;
|
|
24
|
-
protected abstract onConnect(
|
|
24
|
+
protected abstract onConnect(backend: WebGpuBackend): void;
|
|
25
25
|
protected abstract onDisconnect(): void;
|
|
26
|
-
protected
|
|
27
|
-
protected
|
|
26
|
+
protected getBackend(): WebGpuBackend;
|
|
27
|
+
protected getBackendOrNull(): WebGpuBackend | null;
|
|
28
28
|
}
|
|
@@ -5,44 +5,44 @@ import { RenderBackendType } from '../RenderBackendType.js';
|
|
|
5
5
|
* Base class for WebGPU renderers.
|
|
6
6
|
*
|
|
7
7
|
* Manages the connect/disconnect lifecycle and provides a safe
|
|
8
|
-
* `
|
|
8
|
+
* `getBackend()` accessor that throws if the renderer is not connected.
|
|
9
9
|
*
|
|
10
10
|
* Subclasses must implement:
|
|
11
|
-
* - onConnect(
|
|
11
|
+
* - onConnect(backend): set up GPU resources (shader modules, pipelines, buffers)
|
|
12
12
|
* - onDisconnect(): tear down GPU resources
|
|
13
13
|
* - render(drawable): collect draw call data for the given drawable
|
|
14
14
|
* - flush(): encode and submit command buffers for all collected draw calls
|
|
15
15
|
*/
|
|
16
16
|
class AbstractWebGpuRenderer {
|
|
17
17
|
backendType = RenderBackendType.WebGpu;
|
|
18
|
-
|
|
19
|
-
connect(
|
|
20
|
-
if (this.
|
|
18
|
+
_backend = null;
|
|
19
|
+
connect(backend) {
|
|
20
|
+
if (this._backend !== null) {
|
|
21
21
|
return;
|
|
22
22
|
}
|
|
23
|
-
if (
|
|
24
|
-
throw new Error(`${this.constructor.name} requires a WebGPU
|
|
25
|
-
+ `but received backendType ${String(
|
|
23
|
+
if (backend.backendType !== RenderBackendType.WebGpu) {
|
|
24
|
+
throw new Error(`${this.constructor.name} requires a WebGPU backend, `
|
|
25
|
+
+ `but received backendType ${String(backend.backendType)}.`);
|
|
26
26
|
}
|
|
27
|
-
this.
|
|
28
|
-
this.onConnect(
|
|
27
|
+
this._backend = backend;
|
|
28
|
+
this.onConnect(backend);
|
|
29
29
|
}
|
|
30
30
|
disconnect() {
|
|
31
|
-
if (this.
|
|
31
|
+
if (this._backend === null) {
|
|
32
32
|
return;
|
|
33
33
|
}
|
|
34
34
|
this.flush();
|
|
35
35
|
this.onDisconnect();
|
|
36
|
-
this.
|
|
36
|
+
this._backend = null;
|
|
37
37
|
}
|
|
38
|
-
|
|
39
|
-
if (this.
|
|
40
|
-
throw new Error(`${this.constructor.name} is not connected to a
|
|
38
|
+
getBackend() {
|
|
39
|
+
if (this._backend === null) {
|
|
40
|
+
throw new Error(`${this.constructor.name} is not connected to a backend.`);
|
|
41
41
|
}
|
|
42
|
-
return this.
|
|
42
|
+
return this._backend;
|
|
43
43
|
}
|
|
44
|
-
|
|
45
|
-
return this.
|
|
44
|
+
getBackendOrNull() {
|
|
45
|
+
return this._backend;
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractWebGpuRenderer.js","sources":["../../../../../src/rendering/webgpu/AbstractWebGpuRenderer.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAAA;AAOA;;;;;;;;;;;AAWG;MACmB,sBAAsB,CAAA;AAExB,IAAA,WAAW,GAAG,iBAAiB,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"AbstractWebGpuRenderer.js","sources":["../../../../../src/rendering/webgpu/AbstractWebGpuRenderer.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAAA;AAOA;;;;;;;;;;;AAWG;MACmB,sBAAsB,CAAA;AAExB,IAAA,WAAW,GAAG,iBAAiB,CAAC,MAAM;IAE5C,QAAQ,GAAyB,IAAI;AAExC,IAAA,OAAO,CAAC,OAAsB,EAAA;AACjC,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE;YACxB;QACJ;QAEA,IAAI,OAAO,CAAC,WAAW,KAAK,iBAAiB,CAAC,MAAM,EAAE;YAClD,MAAM,IAAI,KAAK,CACX,CAAA,EAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAA,4BAAA;kBACtB,CAAA,yBAAA,EAA4B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA,CAAA,CAAG,CAC/D;QACL;AAEA,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;IAC3B;IAEO,UAAU,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE;YACxB;QACJ;QAEA,IAAI,CAAC,KAAK,EAAE;QACZ,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACxB;IAQU,UAAU,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE;YACxB,MAAM,IAAI,KAAK,CAAC,CAAA,EAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAA,+BAAA,CAAiC,CAAC;QAC9E;QAEA,OAAO,IAAI,CAAC,QAAQ;IACxB;IAEU,gBAAgB,GAAA;QACtB,OAAO,IAAI,CAAC,QAAQ;IACxB;AACH;;;;"}
|