@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.
Files changed (138) hide show
  1. package/CHANGELOG.md +464 -163
  2. package/README.md +156 -141
  3. package/dist/esm/audio/AudioAnalyser.d.ts +0 -1
  4. package/dist/esm/audio/AudioAnalyser.js +0 -2
  5. package/dist/esm/audio/AudioAnalyser.js.map +1 -1
  6. package/dist/esm/core/Application.d.ts +4 -4
  7. package/dist/esm/core/Application.js +19 -19
  8. package/dist/esm/core/Application.js.map +1 -1
  9. package/dist/esm/core/Scene.d.ts +59 -24
  10. package/dist/esm/core/Scene.js +60 -18
  11. package/dist/esm/core/Scene.js.map +1 -1
  12. package/dist/esm/core/SceneManager.js +15 -9
  13. package/dist/esm/core/SceneManager.js.map +1 -1
  14. package/dist/esm/core/SceneNode.d.ts +45 -5
  15. package/dist/esm/core/SceneNode.js +136 -7
  16. package/dist/esm/core/SceneNode.js.map +1 -1
  17. package/dist/esm/index.js +3 -4
  18. package/dist/esm/index.js.map +1 -1
  19. package/dist/esm/math/index.d.ts +0 -1
  20. package/dist/esm/rendering/CallbackRenderPass.d.ts +3 -3
  21. package/dist/esm/rendering/CallbackRenderPass.js +2 -2
  22. package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
  23. package/dist/esm/rendering/Container.d.ts +10 -11
  24. package/dist/esm/rendering/Container.js +5 -5
  25. package/dist/esm/rendering/Container.js.map +1 -1
  26. package/dist/esm/rendering/Drawable.d.ts +2 -2
  27. package/dist/esm/rendering/Drawable.js +5 -5
  28. package/dist/esm/rendering/Drawable.js.map +1 -1
  29. package/dist/esm/rendering/{SceneRenderRuntime.d.ts → RenderBackend.d.ts} +21 -3
  30. package/dist/esm/rendering/RenderNode.d.ts +41 -5
  31. package/dist/esm/rendering/RenderNode.js +89 -24
  32. package/dist/esm/rendering/RenderNode.js.map +1 -1
  33. package/dist/esm/rendering/RenderPass.d.ts +2 -2
  34. package/dist/esm/rendering/RenderTargetPass.d.ts +3 -3
  35. package/dist/esm/rendering/RenderTargetPass.js +9 -9
  36. package/dist/esm/rendering/RenderTargetPass.js.map +1 -1
  37. package/dist/esm/rendering/Renderer.d.ts +3 -3
  38. package/dist/esm/rendering/RendererRegistry.d.ts +13 -7
  39. package/dist/esm/rendering/RendererRegistry.js +18 -10
  40. package/dist/esm/rendering/RendererRegistry.js.map +1 -1
  41. package/dist/esm/rendering/filters/BlurFilter.d.ts +2 -2
  42. package/dist/esm/rendering/filters/BlurFilter.js +5 -5
  43. package/dist/esm/rendering/filters/BlurFilter.js.map +1 -1
  44. package/dist/esm/rendering/filters/ColorFilter.d.ts +2 -2
  45. package/dist/esm/rendering/filters/ColorFilter.js +3 -3
  46. package/dist/esm/rendering/filters/ColorFilter.js.map +1 -1
  47. package/dist/esm/rendering/filters/Filter.d.ts +2 -2
  48. package/dist/esm/rendering/index.d.ts +6 -6
  49. package/dist/esm/rendering/primitives/Graphics.d.ts +3 -3
  50. package/dist/esm/rendering/primitives/Graphics.js.map +1 -1
  51. package/dist/esm/rendering/shader/Shader.d.ts +3 -3
  52. package/dist/esm/rendering/shader/Shader.js +10 -10
  53. package/dist/esm/rendering/text/Text.d.ts +2 -2
  54. package/dist/esm/rendering/text/Text.js +2 -2
  55. package/dist/esm/rendering/text/Text.js.map +1 -1
  56. package/dist/esm/rendering/texture/Sampler.d.ts +0 -3
  57. package/dist/esm/rendering/texture/Sampler.js +5 -7
  58. package/dist/esm/rendering/texture/Sampler.js.map +1 -1
  59. package/dist/esm/rendering/types.d.ts +4 -0
  60. package/dist/esm/rendering/types.js +4 -0
  61. package/dist/esm/rendering/types.js.map +1 -1
  62. package/dist/esm/rendering/video/Video.d.ts +2 -2
  63. package/dist/esm/rendering/video/Video.js +2 -2
  64. package/dist/esm/rendering/video/Video.js.map +1 -1
  65. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.d.ts +2 -2
  66. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js +35 -11
  67. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js.map +1 -1
  68. package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.d.ts +13 -13
  69. package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.js +20 -20
  70. package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.js.map +1 -1
  71. package/dist/esm/rendering/webgl2/{WebGl2RenderManager.d.ts → WebGl2Backend.d.ts} +15 -12
  72. package/dist/esm/rendering/webgl2/{WebGl2RenderManager.js → WebGl2Backend.js} +60 -38
  73. package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -0
  74. package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.d.ts +31 -0
  75. package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.js +186 -0
  76. package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.js.map +1 -0
  77. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.d.ts +38 -7
  78. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js +281 -90
  79. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js.map +1 -1
  80. package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.d.ts +2 -2
  81. package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.js +15 -10
  82. package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.js.map +1 -1
  83. package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js +12 -0
  84. package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js.map +1 -1
  85. package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.d.ts +2 -0
  86. package/dist/esm/rendering/webgl2/{WebGl2ShaderRuntime.js → WebGl2ShaderProgram.js} +58 -18
  87. package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.js.map +1 -0
  88. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +26 -7
  89. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +260 -62
  90. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
  91. package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.d.ts +24 -1
  92. package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.js +6 -2
  93. package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.js.map +1 -1
  94. package/dist/esm/rendering/webgl2/glsl/mask-compose.frag.js +4 -0
  95. package/dist/esm/rendering/webgl2/glsl/mask-compose.frag.js.map +1 -0
  96. package/dist/esm/rendering/webgl2/glsl/mask-compose.vert.js +4 -0
  97. package/dist/esm/rendering/webgl2/glsl/mask-compose.vert.js.map +1 -0
  98. package/dist/esm/rendering/webgl2/glsl/particle.vert.js +1 -1
  99. package/dist/esm/rendering/webgl2/glsl/sprite.frag.js +1 -1
  100. package/dist/esm/rendering/webgl2/glsl/sprite.vert.js +1 -1
  101. package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.d.ts +9 -9
  102. package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.js +18 -18
  103. package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.js.map +1 -1
  104. package/dist/esm/rendering/webgpu/{WebGpuRenderManager.d.ts → WebGpuBackend.d.ts} +17 -14
  105. package/dist/esm/rendering/webgpu/{WebGpuRenderManager.js → WebGpuBackend.js} +74 -40
  106. package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -0
  107. package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.d.ts +37 -0
  108. package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js +279 -0
  109. package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js.map +1 -0
  110. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.d.ts +2 -3
  111. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +65 -82
  112. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js.map +1 -1
  113. package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.d.ts +2 -3
  114. package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.js +24 -25
  115. package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.js.map +1 -1
  116. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +28 -13
  117. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +410 -382
  118. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
  119. package/dist/esm/resources/Loader.js +5 -3
  120. package/dist/esm/resources/Loader.js.map +1 -1
  121. package/dist/exo.esm.js +2500 -1399
  122. package/dist/exo.esm.js.map +1 -1
  123. package/package.json +20 -11
  124. package/dist/esm/math/Transformable.d.ts +0 -47
  125. package/dist/esm/math/Transformable.js +0 -140
  126. package/dist/esm/math/Transformable.js.map +0 -1
  127. package/dist/esm/rendering/webgl2/WebGl2RenderManager.js.map +0 -1
  128. package/dist/esm/rendering/webgl2/WebGl2RendererRuntime.d.ts +0 -15
  129. package/dist/esm/rendering/webgl2/WebGl2ShaderRuntime.d.ts +0 -2
  130. package/dist/esm/rendering/webgl2/WebGl2ShaderRuntime.js.map +0 -1
  131. package/dist/esm/rendering/webgpu/WebGpuRenderManager.js.map +0 -1
  132. package/dist/esm/rendering/webgpu/WebGpuRendererRuntime.d.ts +0 -8
  133. package/dist/exo.esm.min.js +0 -2
  134. package/dist/exo.esm.min.js.map +0 -1
  135. package/dist/exo.global.js +0 -17328
  136. package/dist/exo.global.js.map +0 -1
  137. package/dist/exo.global.min.js +0 -2
  138. 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 { AbstractWebGl2BatchedRenderer } from './AbstractWebGl2BatchedRenderer.js';
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
- class WebGl2SpriteRenderer extends AbstractWebGl2BatchedRenderer {
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
- * 4 x 4 Attributes:
10
- * 2 = position (x, y) +
11
- * 1 = texCoord (packed uv) +
12
- * 1 = color (ARGB int)
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 { texture, blendMode, tint, vertices, texCoords } = sprite;
18
- const batchFull = (this.batchIndex >= this.batchSize);
19
- const textureChanged = (texture !== this.currentTexture);
20
- const blendModeChanged = (blendMode !== this.currentBlendMode);
21
- const flush = (batchFull || textureChanged || blendModeChanged);
22
- const index = flush ? 0 : (this.batchIndex * this.attributeCount);
23
- const float32View = this.float32View;
24
- const uint32View = this.uint32View;
25
- const runtime = this.getRuntime();
26
- if (flush) {
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.currentBlendMode = blendMode;
33
- runtime.setBlendMode(blendMode);
74
+ this._currentBlendMode = blendMode;
75
+ backend.setBlendMode(blendMode);
34
76
  }
35
77
  }
36
- if (textureChanged && texture) {
37
- runtime.bindTexture(texture);
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
- // X / Y
40
- float32View[index + 0] = vertices[0];
41
- float32View[index + 1] = vertices[1];
42
- // X / Y
43
- float32View[index + 4] = vertices[2];
44
- float32View[index + 5] = vertices[3];
45
- // X / Y
46
- float32View[index + 8] = vertices[4];
47
- float32View[index + 9] = vertices[5];
48
- // X / Y
49
- float32View[index + 12] = vertices[6];
50
- float32View[index + 13] = vertices[7];
51
- // U / V
52
- uint32View[index + 2] = texCoords[0];
53
- uint32View[index + 6] = texCoords[1];
54
- // U / V
55
- uint32View[index + 10] = texCoords[2];
56
- uint32View[index + 14] = texCoords[3];
57
- // Tint
58
- uint32View[index + 3]
59
- = uint32View[index + 7]
60
- = uint32View[index + 11]
61
- = uint32View[index + 15]
62
- = tint.toRgba();
63
- this.batchIndex++;
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
- createVao(gl, indexBuffer, vertexBuffer) {
67
- return new WebGl2VertexArrayObject()
68
- .addIndex(indexBuffer)
69
- .addAttribute(vertexBuffer, this.shader.getAttribute('a_position'), gl.FLOAT, false, this.attributeCount, 0)
70
- .addAttribute(vertexBuffer, this.shader.getAttribute('a_texcoord'), gl.UNSIGNED_SHORT, true, this.attributeCount, 8)
71
- .addAttribute(vertexBuffer, this.shader.getAttribute('a_color'), gl.UNSIGNED_BYTE, true, this.attributeCount, 12);
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
- updateView(view) {
74
- this.shader
75
- .getUniform('u_projection')
76
- .setValue(view.getTransform().toArray(false));
77
- return this;
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":";;MAqBa,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;IAEO,YAAY,CAAC,MAA0B,EAAE,SAA0B,EAAE,IAAA,GAAe,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAA;AACxJ,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,CAAC;QAClF,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,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;;;;"}
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\r\nprecision lowp float;\r\n\r\nlayout(location = 0) in vec2 a_position;\r\nlayout(location = 1) in vec2 a_texcoord;\r\nlayout(location = 2) in vec2 a_translation;\r\nlayout(location = 3) in vec2 a_scale;\r\nlayout(location = 4) in float a_rotation;\r\nlayout(location = 5) in vec4 a_color;\n\nuniform mat3 u_projection;\nuniform mat3 u_translation;\n\r\nout vec2 v_texcoord;\r\nout vec4 v_color;\r\n\r\nvoid main(void) {\n vec2 rotation = vec2(sin(radians(a_rotation)), cos(radians(a_rotation)));\n vec3 position = vec3(\n (a_position.x * (a_scale.x * rotation.y)) + (a_position.y * (a_scale.y * rotation.x)) + a_translation.x,\n (a_position.x * (a_scale.x * -rotation.x)) + (a_position.y * (a_scale.y * rotation.y)) + a_translation.y,\n 1.0\n );\n\n gl_Position = vec4((u_projection * u_translation * position).xy, 0.0, 1.0);\n\r\n v_texcoord = a_texcoord;\r\n v_color = vec4(a_color.rgb * a_color.a, a_color.a);\r\n}\r\n";
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 u_texture;\r\n\r\nin vec2 v_texcoord;\r\nin vec4 v_color;\r\n\r\nlayout(location = 0) out vec4 fragColor;\r\n\r\nvoid main(void) {\r\n fragColor = texture(u_texture, v_texcoord) * v_color;\r\n}\r\n";
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\r\nprecision lowp float;\r\n\r\nlayout(location = 0) in vec2 a_position;\r\nlayout(location = 1) in vec2 a_texcoord;\r\nlayout(location = 2) in vec4 a_color;\r\n\r\nuniform mat3 u_projection;\r\n\r\nout vec2 v_texcoord;\r\nout vec4 v_color;\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\r\n v_texcoord = a_texcoord;\r\n v_color = vec4(a_color.rgb * a_color.a, a_color.a);\r\n}\r\n";
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 { WebGpuRendererRuntime } from './WebGpuRendererRuntime';
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
- * `getRuntime()` accessor that throws if the renderer is not connected.
9
+ * `getBackend()` accessor that throws if the renderer is not connected.
10
10
  *
11
11
  * Subclasses must implement:
12
- * - onConnect(runtime): set up GPU resources (shader modules, pipelines, buffers)
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<WebGpuRendererRuntime, Target> {
17
+ export declare abstract class AbstractWebGpuRenderer<Target extends Drawable> implements Renderer<WebGpuBackend, Target> {
18
18
  readonly backendType = RenderBackendType.WebGpu;
19
- private _runtime;
20
- connect(runtime: WebGpuRendererRuntime): void;
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(runtime: WebGpuRendererRuntime): void;
24
+ protected abstract onConnect(backend: WebGpuBackend): void;
25
25
  protected abstract onDisconnect(): void;
26
- protected getRuntime(): WebGpuRendererRuntime;
27
- protected getRuntimeOrNull(): WebGpuRendererRuntime | null;
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
- * `getRuntime()` accessor that throws if the renderer is not connected.
8
+ * `getBackend()` accessor that throws if the renderer is not connected.
9
9
  *
10
10
  * Subclasses must implement:
11
- * - onConnect(runtime): set up GPU resources (shader modules, pipelines, buffers)
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
- _runtime = null;
19
- connect(runtime) {
20
- if (this._runtime !== null) {
18
+ _backend = null;
19
+ connect(backend) {
20
+ if (this._backend !== null) {
21
21
  return;
22
22
  }
23
- if (runtime.backendType !== RenderBackendType.WebGpu) {
24
- throw new Error(`${this.constructor.name} requires a WebGPU runtime, `
25
- + `but received backendType ${String(runtime.backendType)}.`);
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._runtime = runtime;
28
- this.onConnect(runtime);
27
+ this._backend = backend;
28
+ this.onConnect(backend);
29
29
  }
30
30
  disconnect() {
31
- if (this._runtime === null) {
31
+ if (this._backend === null) {
32
32
  return;
33
33
  }
34
34
  this.flush();
35
35
  this.onDisconnect();
36
- this._runtime = null;
36
+ this._backend = null;
37
37
  }
38
- getRuntime() {
39
- if (this._runtime === null) {
40
- throw new Error(`${this.constructor.name} is not connected to a runtime.`);
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._runtime;
42
+ return this._backend;
43
43
  }
44
- getRuntimeOrNull() {
45
- return this._runtime;
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;IAE9C,QAAQ,GAAiC,IAAI;AAE9C,IAAA,OAAO,CAAC,OAA8B,EAAA;AACzC,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;;;;"}
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;;;;"}