@codexo/exojs 0.10.0 → 0.11.0

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 (90) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/dist/esm/core/dev.d.ts +21 -0
  3. package/dist/esm/core/dev.js +18 -0
  4. package/dist/esm/core/dev.js.map +1 -0
  5. package/dist/esm/particles/modules/AlphaFadeOverLifetime.d.ts +2 -2
  6. package/dist/esm/particles/modules/AlphaFadeOverLifetime.js +5 -1
  7. package/dist/esm/particles/modules/AlphaFadeOverLifetime.js.map +1 -1
  8. package/dist/esm/rendering/TransformBuffer.d.ts +44 -0
  9. package/dist/esm/rendering/TransformBuffer.js +64 -0
  10. package/dist/esm/rendering/TransformBuffer.js.map +1 -1
  11. package/dist/esm/rendering/gradient/Gradient.d.ts +35 -2
  12. package/dist/esm/rendering/gradient/Gradient.js +51 -5
  13. package/dist/esm/rendering/gradient/Gradient.js.map +1 -1
  14. package/dist/esm/rendering/gradient/LinearGradient.d.ts +11 -3
  15. package/dist/esm/rendering/gradient/LinearGradient.js +23 -0
  16. package/dist/esm/rendering/gradient/LinearGradient.js.map +1 -1
  17. package/dist/esm/rendering/gradient/RadialGradient.d.ts +11 -3
  18. package/dist/esm/rendering/gradient/RadialGradient.js +19 -0
  19. package/dist/esm/rendering/gradient/RadialGradient.js.map +1 -1
  20. package/dist/esm/rendering/index.d.ts +1 -1
  21. package/dist/esm/rendering/pass/RenderPassCoordinator.d.ts +2 -2
  22. package/dist/esm/rendering/pass/RenderPassDescriptor.d.ts +2 -2
  23. package/dist/esm/rendering/pass/RenderPassDescriptor.js +1 -1
  24. package/dist/esm/rendering/plan/RenderCommand.d.ts +21 -2
  25. package/dist/esm/rendering/plan/RenderCommand.js +34 -1
  26. package/dist/esm/rendering/plan/RenderCommand.js.map +1 -1
  27. package/dist/esm/rendering/plan/RenderInstruction.d.ts +51 -0
  28. package/dist/esm/rendering/plan/RenderInstruction.js +45 -0
  29. package/dist/esm/rendering/plan/RenderInstruction.js.map +1 -0
  30. package/dist/esm/rendering/plan/RenderPlanPlayer.d.ts +4 -0
  31. package/dist/esm/rendering/plan/RenderPlanPlayer.js +58 -7
  32. package/dist/esm/rendering/plan/RenderPlanPlayer.js.map +1 -1
  33. package/dist/esm/rendering/primitives/Graphics.d.ts +70 -5
  34. package/dist/esm/rendering/primitives/Graphics.js +172 -14
  35. package/dist/esm/rendering/primitives/Graphics.js.map +1 -1
  36. package/dist/esm/rendering/sprite/spriteMaterialSources.d.ts +13 -8
  37. package/dist/esm/rendering/sprite/spriteMaterialSources.js +35 -14
  38. package/dist/esm/rendering/sprite/spriteMaterialSources.js.map +1 -1
  39. package/dist/esm/rendering/text/BitmapText.d.ts +2 -0
  40. package/dist/esm/rendering/text/BitmapText.js +8 -1
  41. package/dist/esm/rendering/text/BitmapText.js.map +1 -1
  42. package/dist/esm/rendering/text/BmFont.js +3 -0
  43. package/dist/esm/rendering/text/BmFont.js.map +1 -1
  44. package/dist/esm/rendering/text/GlyphSdf.d.ts +14 -0
  45. package/dist/esm/rendering/text/GlyphSdf.js +41 -11
  46. package/dist/esm/rendering/text/GlyphSdf.js.map +1 -1
  47. package/dist/esm/rendering/text/TextStyle.d.ts +5 -0
  48. package/dist/esm/rendering/text/TextStyle.js +1 -1
  49. package/dist/esm/rendering/text/TextStyle.js.map +1 -1
  50. package/dist/esm/rendering/texture/RenderTexture.js.map +1 -1
  51. package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +23 -1
  52. package/dist/esm/rendering/webgl2/WebGl2Backend.js +50 -0
  53. package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
  54. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +3 -3
  55. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -1
  56. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.d.ts +8 -0
  57. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js +8 -0
  58. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js.map +1 -1
  59. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +2 -0
  60. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +62 -39
  61. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
  62. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.d.ts +7 -0
  63. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js +7 -0
  64. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js.map +1 -1
  65. package/dist/esm/rendering/webgl2/glsl/sprite.vert.js +1 -1
  66. package/dist/esm/rendering/webgl2/glsl/text-color.frag.js +1 -1
  67. package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +16 -3
  68. package/dist/esm/rendering/webgpu/WebGpuBackend.js +49 -4
  69. package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
  70. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +53 -41
  71. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
  72. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.d.ts +7 -0
  73. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +17 -11
  74. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js.map +1 -1
  75. package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.d.ts +2 -2
  76. package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js +2 -2
  77. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +9 -1
  78. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +122 -77
  79. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
  80. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.d.ts +7 -0
  81. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js +22 -13
  82. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js.map +1 -1
  83. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts +32 -0
  84. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js +58 -12
  85. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js.map +1 -1
  86. package/dist/esm/resources/Loader.js +1 -1
  87. package/dist/esm/resources/Loader.js.map +1 -1
  88. package/dist/exo.esm.js +1022 -265
  89. package/dist/exo.esm.js.map +1 -1
  90. package/package.json +9 -5
@@ -4,24 +4,45 @@ import { quadraticCurveTo, bezierCurveTo, tau, clamp } from '../../math/utils.js
4
4
  import { Vector } from '../../math/Vector.js';
5
5
  import { Container } from '../Container.js';
6
6
  import { Mesh } from '../mesh/Mesh.js';
7
+ import { ScaleModes } from '../types.js';
7
8
 
9
+ /**
10
+ * Edge length of the square gradient texture rasterized for gradient paints.
11
+ * The full 2D UV field is baked so both linear and radial gradients map across
12
+ * the filled shape's bounding box without per-axis special-casing.
13
+ */
14
+ const gradientTextureSize = 256;
8
15
  /**
9
16
  * Immediate-mode 2D shape API backed by {@link Mesh} children.
10
17
  *
11
18
  * Each draw call (e.g. `drawCircle`, `drawRectangle`, `drawLine`) appends a
12
- * new {@link Mesh} child colored with the current `fillColor` or `lineColor`.
19
+ * new {@link Mesh} child painted with the active fill or stroke style. A style
20
+ * is either a solid {@link Color} or a {@link Gradient}, assigned through
21
+ * {@link fillStyle} / {@link strokeStyle}. The {@link fillColor} /
22
+ * {@link lineColor} accessors are color-only conveniences over those styles.
13
23
  * The active `lineWidth` controls stroke thickness for path and outline draws.
14
24
  * Path commands (`moveTo`, `lineTo`, `quadraticCurveTo`, etc.) track a cursor
15
25
  * point and flush a Mesh on each segment.
16
26
  *
27
+ * Gradient styles are rasterized once to a {@link DataTexture} via
28
+ * {@link Gradient.toTexture} and sampled across each shape's local bounding
29
+ * box, so {@link LinearGradient} and {@link RadialGradient} render through the
30
+ * same texture path as a textured Mesh. The textures are owned by the Graphics
31
+ * and released on {@link clear} / {@link destroy}.
32
+ *
17
33
  * Call {@link clear} to remove all child meshes and reset pen state. Because
18
34
  * each shape is a separate Mesh, `Graphics` inherits full filter, blend,
19
35
  * tint, and mask support from {@link Container}.
20
36
  */
21
37
  class Graphics extends Container {
22
38
  _lineWidth = 0;
23
- _lineColor = new Color();
24
39
  _fillColor = new Color();
40
+ _lineColor = new Color();
41
+ _fillStyle = this._fillColor;
42
+ _strokeStyle = this._lineColor;
43
+ _fillStyleTexture = null;
44
+ _strokeStyleTexture = null;
45
+ _ownedTextures = new Set();
25
46
  _currentPoint = new Vector(0, 0);
26
47
  get lineWidth() {
27
48
  return this._lineWidth;
@@ -29,17 +50,59 @@ class Graphics extends Container {
29
50
  set lineWidth(lineWidth) {
30
51
  this._lineWidth = lineWidth;
31
52
  }
53
+ /** Solid stroke color slot: the last solid color assigned to the stroke. */
32
54
  get lineColor() {
33
55
  return this._lineColor;
34
56
  }
57
+ /**
58
+ * Convenience solid-color setter for the stroke. Copies `lineColor` into the
59
+ * color slot and makes it the active {@link strokeStyle}, replacing any
60
+ * gradient stroke style.
61
+ */
35
62
  set lineColor(lineColor) {
36
- this._lineColor.copy(lineColor);
63
+ this.strokeStyle = lineColor;
37
64
  }
65
+ /** Solid fill color slot: the last solid color assigned to the fill. */
38
66
  get fillColor() {
39
67
  return this._fillColor;
40
68
  }
69
+ /**
70
+ * Convenience solid-color setter for the fill. Copies `fillColor` into the
71
+ * color slot and makes it the active {@link fillStyle}, replacing any
72
+ * gradient fill style.
73
+ */
41
74
  set fillColor(fillColor) {
42
- this._fillColor.copy(fillColor);
75
+ this.fillStyle = fillColor;
76
+ }
77
+ /** Active fill style: a solid {@link Color} or a {@link Gradient}. */
78
+ get fillStyle() {
79
+ return this._fillStyle;
80
+ }
81
+ /**
82
+ * Set the fill style. Accepts a solid {@link Color}, a {@link Gradient}
83
+ * (cloned on assignment and rasterized lazily on first fill), or `null` to
84
+ * revert to the solid color held by {@link fillColor}. A {@link Color} value
85
+ * is copied into the {@link fillColor} slot; the most recently assigned style
86
+ * wins.
87
+ */
88
+ set fillStyle(style) {
89
+ this._fillStyle = this._resolveStyle(style, this._fillColor);
90
+ this._fillStyleTexture = null;
91
+ }
92
+ /** Active stroke style: a solid {@link Color} or a {@link Gradient}. */
93
+ get strokeStyle() {
94
+ return this._strokeStyle;
95
+ }
96
+ /**
97
+ * Set the stroke style. Accepts a solid {@link Color}, a {@link Gradient}
98
+ * (cloned on assignment and rasterized lazily on first stroke), or `null` to
99
+ * revert to the solid color held by {@link lineColor}. A {@link Color} value
100
+ * is copied into the {@link lineColor} slot; the most recently assigned style
101
+ * wins.
102
+ */
103
+ set strokeStyle(style) {
104
+ this._strokeStyle = this._resolveStyle(style, this._lineColor);
105
+ this._strokeStyleTexture = null;
43
106
  }
44
107
  get currentPoint() {
45
108
  return this._currentPoint;
@@ -163,19 +226,19 @@ class Graphics extends Container {
163
226
  /** Draw a stroked line between two explicit points, independent of the current pen position. */
164
227
  drawLine(startX, startY, endX, endY) {
165
228
  const data = buildLine(startX, startY, endX, endY, this._lineWidth);
166
- this.addChild(this._createMesh(data, this._lineColor));
229
+ this.addChild(this._createStrokeMesh(data));
167
230
  return this;
168
231
  }
169
232
  /** Draw a stroked polyline from a flat `[x0,y0, x1,y1, ...]` coordinate array. */
170
233
  drawPath(path) {
171
234
  const data = buildPath(path, this._lineWidth);
172
- this.addChild(this._createMesh(data, this._lineColor));
235
+ this.addChild(this._createStrokeMesh(data));
173
236
  return this;
174
237
  }
175
238
  /** Fill a closed polygon defined by `[x0,y0, x1,y1, ...]` and optionally stroke its outline. */
176
239
  drawPolygon(path) {
177
240
  const data = buildPolygon(path);
178
- this.addChild(this._createMesh(data, this._fillColor));
241
+ this.addChild(this._createFillMesh(data));
179
242
  if (this._lineWidth > 0) {
180
243
  this.drawPath(data.points);
181
244
  }
@@ -184,7 +247,7 @@ class Graphics extends Container {
184
247
  /** Fill a circle and optionally stroke its outline if `lineWidth > 0`. */
185
248
  drawCircle(centerX, centerY, radius) {
186
249
  const data = buildCircle(centerX, centerY, radius);
187
- this.addChild(this._createMesh(data, this._fillColor));
250
+ this.addChild(this._createFillMesh(data));
188
251
  if (this._lineWidth > 0) {
189
252
  this.drawPath(data.points);
190
253
  }
@@ -193,7 +256,7 @@ class Graphics extends Container {
193
256
  /** Fill an ellipse and optionally stroke its outline if `lineWidth > 0`. */
194
257
  drawEllipse(centerX, centerY, radiusX, radiusY) {
195
258
  const data = buildEllipse(centerX, centerY, radiusX, radiusY);
196
- this.addChild(this._createMesh(data, this._fillColor));
259
+ this.addChild(this._createFillMesh(data));
197
260
  if (this._lineWidth > 0) {
198
261
  this.drawPath(data.points);
199
262
  }
@@ -202,7 +265,7 @@ class Graphics extends Container {
202
265
  /** Fill a rectangle and optionally stroke its outline if `lineWidth > 0`. */
203
266
  drawRectangle(x, y, width, height) {
204
267
  const data = buildRectangle(x, y, width, height);
205
- this.addChild(this._createMesh(data, this._fillColor));
268
+ this.addChild(this._createFillMesh(data));
206
269
  if (this._lineWidth > 0) {
207
270
  this.drawPath(data.points);
208
271
  }
@@ -214,18 +277,23 @@ class Graphics extends Container {
214
277
  */
215
278
  drawStar(centerX, centerY, points, radius, innerRadius = radius / 2, rotation = 0) {
216
279
  const data = buildStar(centerX, centerY, points, radius, innerRadius, rotation);
217
- this.addChild(this._createMesh(data, this._fillColor));
280
+ this.addChild(this._createFillMesh(data));
218
281
  if (this._lineWidth > 0) {
219
282
  this.drawPath(data.points);
220
283
  }
221
284
  return this;
222
285
  }
223
- /** Remove all child meshes and reset pen state (position, colors, line width). */
286
+ /** Remove all child meshes and reset pen state (position, fill/stroke styles, line width). */
224
287
  clear() {
225
288
  this.removeChildren();
226
289
  this._lineWidth = 0;
227
- this._lineColor.copy(Color.black);
228
290
  this._fillColor.copy(Color.black);
291
+ this._lineColor.copy(Color.black);
292
+ this._fillStyle = this._fillColor;
293
+ this._strokeStyle = this._lineColor;
294
+ this._fillStyleTexture = null;
295
+ this._strokeStyleTexture = null;
296
+ this._destroyOwnedTextures();
229
297
  this._currentPoint.set(0, 0);
230
298
  return this;
231
299
  }
@@ -236,7 +304,38 @@ class Graphics extends Container {
236
304
  this._fillColor.destroy();
237
305
  this._currentPoint.destroy();
238
306
  }
239
- _createMesh(data, color) {
307
+ /**
308
+ * Resolve an assigned style into the stored paint. A {@link Color} is copied
309
+ * into the solid `colorSlot` (keeping the {@link fillColor} / {@link lineColor}
310
+ * convenience getters in sync) and that slot is returned; `null` reverts to
311
+ * the slot; a {@link Gradient} is cloned so later external mutation cannot
312
+ * change the stored paint.
313
+ */
314
+ _resolveStyle(style, colorSlot) {
315
+ if (style === null) {
316
+ return colorSlot;
317
+ }
318
+ if (style instanceof Color) {
319
+ colorSlot.copy(style);
320
+ return colorSlot;
321
+ }
322
+ return style.clone();
323
+ }
324
+ _createFillMesh(data) {
325
+ if (this._fillStyle instanceof Color) {
326
+ return this._createSolidMesh(data, this._fillStyle);
327
+ }
328
+ this._fillStyleTexture ??= this._rasterizeGradient(this._fillStyle);
329
+ return this._createGradientMesh(data, this._fillStyleTexture);
330
+ }
331
+ _createStrokeMesh(data) {
332
+ if (this._strokeStyle instanceof Color) {
333
+ return this._createSolidMesh(data, this._strokeStyle);
334
+ }
335
+ this._strokeStyleTexture ??= this._rasterizeGradient(this._strokeStyle);
336
+ return this._createGradientMesh(data, this._strokeStyleTexture);
337
+ }
338
+ _createSolidMesh(data, color) {
240
339
  const mesh = new Mesh({
241
340
  vertices: data.vertices,
242
341
  indices: data.indices,
@@ -244,7 +343,66 @@ class Graphics extends Container {
244
343
  mesh.tint = color;
245
344
  return mesh;
246
345
  }
346
+ /**
347
+ * Build a textured mesh whose UVs span the shape's local bounding box, so the
348
+ * gradient texture samples across the filled/stroked geometry. The default
349
+ * white tint and vertex color leave the sampled gradient color unmodulated.
350
+ */
351
+ _createGradientMesh(data, texture) {
352
+ return new Mesh({
353
+ vertices: data.vertices,
354
+ indices: data.indices,
355
+ uvs: computeBoundsUvs(data.vertices),
356
+ texture,
357
+ });
358
+ }
359
+ _rasterizeGradient(gradient) {
360
+ const texture = gradient.toTexture(gradientTextureSize, gradientTextureSize, {
361
+ samplerOptions: { scaleMode: ScaleModes.Linear },
362
+ });
363
+ this._ownedTextures.add(texture);
364
+ return texture;
365
+ }
366
+ _destroyOwnedTextures() {
367
+ for (const texture of this._ownedTextures) {
368
+ texture.destroy();
369
+ }
370
+ this._ownedTextures.clear();
371
+ }
247
372
  }
373
+ /**
374
+ * Normalize each `(x, y)` vertex into `0..1` UV space relative to the flat
375
+ * vertex array's axis-aligned bounding box. Degenerate (zero-width/height)
376
+ * spans collapse to `0` to avoid division by zero.
377
+ */
378
+ const computeBoundsUvs = (vertices) => {
379
+ let minX = Infinity;
380
+ let minY = Infinity;
381
+ let maxX = -Infinity;
382
+ let maxY = -Infinity;
383
+ for (let i = 0; i < vertices.length; i += 2) {
384
+ const x = vertices[i];
385
+ const y = vertices[i + 1];
386
+ if (x < minX)
387
+ minX = x;
388
+ if (x > maxX)
389
+ maxX = x;
390
+ if (y < minY)
391
+ minY = y;
392
+ if (y > maxY)
393
+ maxY = y;
394
+ }
395
+ const spanX = maxX - minX;
396
+ const spanY = maxY - minY;
397
+ const invX = spanX > 0 ? 1 / spanX : 0;
398
+ const invY = spanY > 0 ? 1 / spanY : 0;
399
+ const uvs = new Float32Array(vertices.length);
400
+ for (let i = 0; i < vertices.length; i += 2) {
401
+ uvs[i] = (vertices[i] - minX) * invX;
402
+ uvs[i + 1] = (vertices[i + 1] - minY) * invY;
403
+ }
404
+ return uvs;
405
+ };
248
406
 
249
407
  export { Graphics };
250
408
  //# sourceMappingURL=Graphics.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Graphics.js","sources":["../../../../../src/rendering/primitives/Graphics.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Graphics.js","sources":["../../../../../src/rendering/primitives/Graphics.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -8,10 +8,15 @@
8
8
  * `WebGl2SpriteRenderer` pairs {@link spriteVertexGlsl} with the material's
9
9
  * fragment (ignoring any author-supplied `glsl.vertex`), and
10
10
  * `WebGpuSpriteRenderer` prepends {@link spriteVertexWgsl} to the material's
11
- * fragment WGSL. Both pin the per-instance attribute locations 0–5 and the
11
+ * fragment WGSL. Both pin the per-instance attribute locations and the
12
12
  * projection binding exactly as the default sprite path does, so a custom
13
13
  * material keeps the single `drawArraysInstanced` / `drawIndexed` batch.
14
14
  *
15
+ * Both paths (locations 0, 3, 4, 5, 6) fetch each instance's world transform
16
+ * from the shared transform storage keyed by `a_nodeIndex` / `nodeIndex`: the
17
+ * WebGL2 path samples the `u_transforms` texture, the WGSL path reads the
18
+ * `transforms` storage buffer (group(0) binding(1)).
19
+ *
15
20
  * A custom fragment receives the interpolated `v_texcoord` and premultiplied
16
21
  * `v_color`, plus the per-batch base texture bound as `u_texture` (WebGL2 unit 0
17
22
  * / WGSL group(1) binding 0). Material uniforms and additional textures bind on
@@ -22,15 +27,15 @@
22
27
  * corner expansion and attribute contract to the default sprite vertex shader.
23
28
  * @internal
24
29
  */
25
- export declare const spriteVertexGlsl = "#version 300 es\nprecision highp float;\nprecision highp 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 \u2014 first row of 2D affine\nlayout(location = 2) in vec3 a_transformCD; // c, d, y \u2014 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 \u2192 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 float localX = (cornerX == 0) ? a_localBounds.x : a_localBounds.z;\n float localY = (cornerY == 0) ? a_localBounds.y : a_localBounds.w;\n\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 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";
30
+ export declare const spriteVertexGlsl = "#version 300 es\nprecision highp float;\nprecision highp 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 = 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;\nlayout(location = 6) in uint a_nodeIndex; // row into the shared transform buffer\n\nuniform mat3 u_projection;\nuniform sampler2D u_transforms; // shared per-frame transform buffer (3 texels/row)\n\nout vec2 v_texcoord;\nout vec4 v_color;\nflat out uint v_textureSlot;\n\nvoid main(void) {\n // gl_VertexID 0..3 \u2192 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 float localX = (cornerX == 0) ? a_localBounds.x : a_localBounds.z;\n float localY = (cornerY == 0) ? a_localBounds.y : a_localBounds.w;\n\n // Fetch the per-instance world transform from the shared buffer (row =\n // a_nodeIndex): texel 0 = (a, b, c, d), texel 1 = (tx, ty, 0, 0).\n int row = int(a_nodeIndex);\n vec4 m0 = texelFetch(u_transforms, ivec2(0, row), 0);\n vec4 m1 = texelFetch(u_transforms, ivec2(1, row), 0);\n\n float worldX = (m0.x * localX) + (m0.y * localY) + m1.x;\n float worldY = (m0.z * localX) + (m0.w * localY) + m1.y;\n\n gl_Position = vec4((u_projection * vec3(worldX, worldY, 1.0)).xy, 0.0, 1.0);\n\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";
26
31
  /**
27
32
  * WGSL vertex stage + shared bindings for the custom sprite-material path.
28
33
  * Prepend to a material's fragment WGSL: it declares the per-instance
29
- * `VertexInput` (locations 05), the `VertexOutput` a custom `@fragment`
30
- * consumes, the group(0) projection uniform, the group(1) base texture and
31
- * sampler (`u_texture` / `u_sampler`), and the `vertexMain` entry point. The
32
- * fragment author adds their group(2) bindings and a `fragmentMain` reading
33
- * `VertexOutput`.
34
+ * `VertexInput` (locations 0, 3, 4, 5, 6), the `VertexOutput` a custom
35
+ * `@fragment` consumes, the group(0) projection uniform + shared transform
36
+ * storage buffer, the group(1) base texture and sampler (`u_texture` /
37
+ * `u_sampler`), and the `vertexMain` entry point. The fragment author adds their
38
+ * group(2) bindings and a `fragmentMain` reading `VertexOutput`.
34
39
  * @internal
35
40
  */
36
- export declare const spriteVertexWgsl = "\nstruct ProjectionUniforms {\n matrix: mat4x4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> projection: ProjectionUniforms;\n\n@group(1) @binding(0) var u_texture: texture_2d<f32>;\n@group(1) @binding(1) var u_sampler: sampler;\n\nstruct VertexInput {\n @location(0) localBounds: vec4<f32>,\n @location(1) transformAB: vec3<f32>,\n @location(2) transformCD: vec3<f32>,\n @location(3) uvBounds: vec4<f32>,\n @location(4) color: vec4<f32>,\n @location(5) textureSlot: u32,\n};\n\nstruct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) texcoord: vec2<f32>,\n @location(1) color: vec4<f32>,\n};\n\n@vertex\nfn vertexMain(input: VertexInput, @builtin(vertex_index) vid: u32) -> VertexOutput {\n var output: VertexOutput;\n\n let cornerX = ((vid + 1u) >> 1u) & 1u;\n let cornerY = vid >> 1u;\n\n let localX = select(input.localBounds.x, input.localBounds.z, cornerX == 1u);\n let localY = select(input.localBounds.y, input.localBounds.w, cornerY == 1u);\n\n let worldX = input.transformAB.x * localX + input.transformAB.y * localY + input.transformAB.z;\n let worldY = input.transformCD.x * localX + input.transformCD.y * localY + input.transformCD.z;\n\n output.position = projection.matrix * vec4<f32>(worldX, worldY, 0.0, 1.0);\n\n let u = select(input.uvBounds.x, input.uvBounds.z, cornerX == 1u);\n let v = select(input.uvBounds.y, input.uvBounds.w, cornerY == 1u);\n output.texcoord = vec2<f32>(u, v);\n\n output.color = vec4<f32>(input.color.rgb * input.color.a, input.color.a);\n\n return output;\n}\n";
41
+ export declare const spriteVertexWgsl = "\nstruct ProjectionUniforms {\n matrix: mat4x4<f32>,\n};\n\nstruct TransformSlot {\n m0: vec4<f32>,\n m1: vec4<f32>,\n m2: vec4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> projection: ProjectionUniforms;\n@group(0) @binding(1) var<storage, read> transforms: array<TransformSlot>;\n\n@group(1) @binding(0) var u_texture: texture_2d<f32>;\n@group(1) @binding(1) var u_sampler: sampler;\n\nstruct VertexInput {\n @location(0) localBounds: vec4<f32>,\n @location(3) uvBounds: vec4<f32>,\n @location(4) color: vec4<f32>,\n @location(5) textureSlot: u32,\n @location(6) nodeIndex: u32,\n};\n\nstruct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) texcoord: vec2<f32>,\n @location(1) color: vec4<f32>,\n};\n\n@vertex\nfn vertexMain(input: VertexInput, @builtin(vertex_index) vid: u32) -> VertexOutput {\n var output: VertexOutput;\n\n let cornerX = ((vid + 1u) >> 1u) & 1u;\n let cornerY = vid >> 1u;\n\n let localX = select(input.localBounds.x, input.localBounds.z, cornerX == 1u);\n let localY = select(input.localBounds.y, input.localBounds.w, cornerY == 1u);\n\n // Fetch this instance's world transform from the shared storage buffer,\n // keyed by nodeIndex: m0 = (a, b, c, d), m1 = (tx, ty, 0, 0). (m2 carries the\n // node tint, unused here \u2014 the sprite keeps its own per-instance color.)\n let slot = transforms[input.nodeIndex];\n let worldX = slot.m0.x * localX + slot.m0.y * localY + slot.m1.x;\n let worldY = slot.m0.z * localX + slot.m0.w * localY + slot.m1.y;\n\n output.position = projection.matrix * vec4<f32>(worldX, worldY, 0.0, 1.0);\n\n let u = select(input.uvBounds.x, input.uvBounds.z, cornerX == 1u);\n let v = select(input.uvBounds.y, input.uvBounds.w, cornerY == 1u);\n output.texcoord = vec2<f32>(u, v);\n\n output.color = vec4<f32>(input.color.rgb * input.color.a, input.color.a);\n\n return output;\n}\n";
@@ -8,10 +8,15 @@
8
8
  * `WebGl2SpriteRenderer` pairs {@link spriteVertexGlsl} with the material's
9
9
  * fragment (ignoring any author-supplied `glsl.vertex`), and
10
10
  * `WebGpuSpriteRenderer` prepends {@link spriteVertexWgsl} to the material's
11
- * fragment WGSL. Both pin the per-instance attribute locations 0–5 and the
11
+ * fragment WGSL. Both pin the per-instance attribute locations and the
12
12
  * projection binding exactly as the default sprite path does, so a custom
13
13
  * material keeps the single `drawArraysInstanced` / `drawIndexed` batch.
14
14
  *
15
+ * Both paths (locations 0, 3, 4, 5, 6) fetch each instance's world transform
16
+ * from the shared transform storage keyed by `a_nodeIndex` / `nodeIndex`: the
17
+ * WebGL2 path samples the `u_transforms` texture, the WGSL path reads the
18
+ * `transforms` storage buffer (group(0) binding(1)).
19
+ *
15
20
  * A custom fragment receives the interpolated `v_texcoord` and premultiplied
16
21
  * `v_color`, plus the per-batch base texture bound as `u_texture` (WebGL2 unit 0
17
22
  * / WGSL group(1) binding 0). Material uniforms and additional textures bind on
@@ -30,13 +35,13 @@ precision highp int;
30
35
  // to the per-instance buffer; gl_VertexID 0..3 selects which corner of the
31
36
  // quad this invocation is computing.
32
37
  layout(location = 0) in vec4 a_localBounds; // left, top, right, bottom (local space)
33
- layout(location = 1) in vec3 a_transformAB; // a, b, x — first row of 2D affine
34
- layout(location = 2) in vec3 a_transformCD; // c, d, y — second row
35
38
  layout(location = 3) in vec4 a_uvBounds; // uMin, vMin, uMax, vMax (normalised, already flipY-swapped)
36
39
  layout(location = 4) in vec4 a_color; // RGBA tint
37
40
  layout(location = 5) in uint a_textureSlot;
41
+ layout(location = 6) in uint a_nodeIndex; // row into the shared transform buffer
38
42
 
39
43
  uniform mat3 u_projection;
44
+ uniform sampler2D u_transforms; // shared per-frame transform buffer (3 texels/row)
40
45
 
41
46
  out vec2 v_texcoord;
42
47
  out vec4 v_color;
@@ -51,8 +56,14 @@ void main(void) {
51
56
  float localX = (cornerX == 0) ? a_localBounds.x : a_localBounds.z;
52
57
  float localY = (cornerY == 0) ? a_localBounds.y : a_localBounds.w;
53
58
 
54
- float worldX = (a_transformAB.x * localX) + (a_transformAB.y * localY) + a_transformAB.z;
55
- float worldY = (a_transformCD.x * localX) + (a_transformCD.y * localY) + a_transformCD.z;
59
+ // Fetch the per-instance world transform from the shared buffer (row =
60
+ // a_nodeIndex): texel 0 = (a, b, c, d), texel 1 = (tx, ty, 0, 0).
61
+ int row = int(a_nodeIndex);
62
+ vec4 m0 = texelFetch(u_transforms, ivec2(0, row), 0);
63
+ vec4 m1 = texelFetch(u_transforms, ivec2(1, row), 0);
64
+
65
+ float worldX = (m0.x * localX) + (m0.y * localY) + m1.x;
66
+ float worldY = (m0.z * localX) + (m0.w * localY) + m1.y;
56
67
 
57
68
  gl_Position = vec4((u_projection * vec3(worldX, worldY, 1.0)).xy, 0.0, 1.0);
58
69
 
@@ -67,11 +78,11 @@ void main(void) {
67
78
  /**
68
79
  * WGSL vertex stage + shared bindings for the custom sprite-material path.
69
80
  * Prepend to a material's fragment WGSL: it declares the per-instance
70
- * `VertexInput` (locations 05), the `VertexOutput` a custom `@fragment`
71
- * consumes, the group(0) projection uniform, the group(1) base texture and
72
- * sampler (`u_texture` / `u_sampler`), and the `vertexMain` entry point. The
73
- * fragment author adds their group(2) bindings and a `fragmentMain` reading
74
- * `VertexOutput`.
81
+ * `VertexInput` (locations 0, 3, 4, 5, 6), the `VertexOutput` a custom
82
+ * `@fragment` consumes, the group(0) projection uniform + shared transform
83
+ * storage buffer, the group(1) base texture and sampler (`u_texture` /
84
+ * `u_sampler`), and the `vertexMain` entry point. The fragment author adds their
85
+ * group(2) bindings and a `fragmentMain` reading `VertexOutput`.
75
86
  * @internal
76
87
  */
77
88
  const spriteVertexWgsl = `
@@ -79,18 +90,24 @@ struct ProjectionUniforms {
79
90
  matrix: mat4x4<f32>,
80
91
  };
81
92
 
93
+ struct TransformSlot {
94
+ m0: vec4<f32>,
95
+ m1: vec4<f32>,
96
+ m2: vec4<f32>,
97
+ };
98
+
82
99
  @group(0) @binding(0) var<uniform> projection: ProjectionUniforms;
100
+ @group(0) @binding(1) var<storage, read> transforms: array<TransformSlot>;
83
101
 
84
102
  @group(1) @binding(0) var u_texture: texture_2d<f32>;
85
103
  @group(1) @binding(1) var u_sampler: sampler;
86
104
 
87
105
  struct VertexInput {
88
106
  @location(0) localBounds: vec4<f32>,
89
- @location(1) transformAB: vec3<f32>,
90
- @location(2) transformCD: vec3<f32>,
91
107
  @location(3) uvBounds: vec4<f32>,
92
108
  @location(4) color: vec4<f32>,
93
109
  @location(5) textureSlot: u32,
110
+ @location(6) nodeIndex: u32,
94
111
  };
95
112
 
96
113
  struct VertexOutput {
@@ -109,8 +126,12 @@ fn vertexMain(input: VertexInput, @builtin(vertex_index) vid: u32) -> VertexOutp
109
126
  let localX = select(input.localBounds.x, input.localBounds.z, cornerX == 1u);
110
127
  let localY = select(input.localBounds.y, input.localBounds.w, cornerY == 1u);
111
128
 
112
- let worldX = input.transformAB.x * localX + input.transformAB.y * localY + input.transformAB.z;
113
- let worldY = input.transformCD.x * localX + input.transformCD.y * localY + input.transformCD.z;
129
+ // Fetch this instance's world transform from the shared storage buffer,
130
+ // keyed by nodeIndex: m0 = (a, b, c, d), m1 = (tx, ty, 0, 0). (m2 carries the
131
+ // node tint, unused here — the sprite keeps its own per-instance color.)
132
+ let slot = transforms[input.nodeIndex];
133
+ let worldX = slot.m0.x * localX + slot.m0.y * localY + slot.m1.x;
134
+ let worldY = slot.m0.z * localX + slot.m0.w * localY + slot.m1.y;
114
135
 
115
136
  output.position = projection.matrix * vec4<f32>(worldX, worldY, 0.0, 1.0);
116
137
 
@@ -1 +1 @@
1
- {"version":3,"file":"spriteMaterialSources.js","sources":["../../../../../src/rendering/sprite/spriteMaterialSources.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;AAkBG;AAEH;;;;AAIG;AACI,MAAM,gBAAgB,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2ChC;;;;;;;;;AASG;AACI,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"spriteMaterialSources.js","sources":["../../../../../src/rendering/sprite/spriteMaterialSources.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;AAuBG;AAEH;;;;AAIG;AACI,MAAM,gBAAgB,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDhC;;;;;;;;;AASG;AACI,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -35,6 +35,8 @@ export declare class BmFontAdapter implements GlyphProvider {
35
35
  private readonly _scale;
36
36
  /** Fallback advance for characters not present in the font (≈ ½ line height). */
37
37
  private readonly _fallbackAdvance;
38
+ /** Identifier used as part of the warnOnce key — derived from the first page filename. */
39
+ private readonly _fontId;
38
40
  constructor(fontData: BmFontData, textures: readonly Texture[], scale: number);
39
41
  getGlyph(char: string, _fontSize: number): GlyphInfo;
40
42
  getKerning(prev: string, next: string, _fontSize: number): number;
@@ -1,3 +1,4 @@
1
+ import { warnOnce, assert } from '../../core/dev.js';
1
2
  import { AbstractText } from './AbstractText.js';
2
3
  import { layoutText, buildTextPageQuads } from './TextLayout.js';
3
4
  import { TextStyle } from './TextStyle.js';
@@ -19,11 +20,14 @@ class BmFontAdapter {
19
20
  _scale;
20
21
  /** Fallback advance for characters not present in the font (≈ ½ line height). */
21
22
  _fallbackAdvance;
23
+ /** Identifier used as part of the warnOnce key — derived from the first page filename. */
24
+ _fontId;
22
25
  constructor(fontData, textures, scale) {
23
26
  this._fontData = fontData;
24
27
  this._textures = textures;
25
28
  this._scale = scale;
26
29
  this._fallbackAdvance = fontData.lineHeight * scale * 0.5;
30
+ this._fontId = fontData.pages[0] ?? 'unknown';
27
31
  }
28
32
  getGlyph(char, _fontSize) {
29
33
  const cp = char.codePointAt(0) ?? 0;
@@ -32,7 +36,9 @@ class BmFontAdapter {
32
36
  const lh = this._fontData.lineHeight;
33
37
  const base = this._fontData.base;
34
38
  if (g === undefined) {
35
- // Unknown glyph — return an invisible placeholder with a cursor advance.
39
+ // Unknown glyph — warn once per font + codepoint, then return an invisible
40
+ // placeholder with a cursor advance so layout still makes progress.
41
+ warnOnce(`bitmaptext:${this._fontId}:${cp}`, `BitmapText: missing glyph U+${cp.toString(16).toUpperCase().padStart(4, '0')} ('${char}') in "${this._fontId}"`);
36
42
  return {
37
43
  x: 0,
38
44
  y: 0,
@@ -47,6 +53,7 @@ class BmFontAdapter {
47
53
  uvBottom: 0,
48
54
  };
49
55
  }
56
+ assert(g.page < this._textures.length, `BitmapText: glyph page index ${g.page} is out of range — font "${this._fontId}" has ${this._textures.length} page(s)`);
50
57
  const texW = this._textures[g.page]?.width ?? 1;
51
58
  const texH = this._textures[g.page]?.height ?? 1;
52
59
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"BitmapText.js","sources":["../../../../../src/rendering/text/BitmapText.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BitmapText.js","sources":["../../../../../src/rendering/text/BitmapText.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import { assert } from '../../core/dev.js';
2
+
1
3
  /**
2
4
  * A loaded BMFont asset: the parsed descriptor plus all page textures.
3
5
  *
@@ -15,6 +17,7 @@ class BmFont {
15
17
  fontData;
16
18
  textures;
17
19
  constructor(fontData, textures) {
20
+ assert(textures.length === fontData.pages.length, `BmFont: texture count (${textures.length}) must match page count (${fontData.pages.length})`);
18
21
  this.fontData = fontData;
19
22
  this.textures = textures;
20
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BmFont.js","sources":["../../../../../src/rendering/text/BmFont.ts"],"sourcesContent":[null],"names":[],"mappings":"AAmCA;;;;;;;;;;;;AAYG;MACU,MAAM,CAAA;AACD,IAAA,QAAQ;AACR,IAAA,QAAQ;IAExB,WAAA,CAAmB,QAAoB,EAAE,QAA4B,EAAA;AACnE,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;IAC1B;AACD;;;;"}
1
+ {"version":3,"file":"BmFont.js","sources":["../../../../../src/rendering/text/BmFont.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAoCA;;;;;;;;;;;;AAYG;MACU,MAAM,CAAA;AACD,IAAA,QAAQ;AACR,IAAA,QAAQ;IAExB,WAAA,CAAmB,QAAoB,EAAE,QAA4B,EAAA;QACnE,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,0BAA0B,QAAQ,CAAC,MAAM,CAAA,yBAAA,EAA4B,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAA,CAAA,CAAG,CAAC;AAChJ,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;IAC1B;AACD;;;;"}
@@ -69,6 +69,10 @@ export declare class GlyphSdf {
69
69
  private readonly _radius;
70
70
  private readonly _cutoff;
71
71
  private readonly _font;
72
+ private readonly _fontSize;
73
+ private _fontAscent;
74
+ private _fontDescent;
75
+ private _metricsReady;
72
76
  private _canvasW;
73
77
  private _canvasH;
74
78
  private readonly _canvas;
@@ -88,5 +92,15 @@ export declare class GlyphSdf {
88
92
  * fresh `Uint8ClampedArray`; the caller may hold a reference to it safely
89
93
  * across subsequent `draw()` calls.
90
94
  */
95
+ /**
96
+ * Ensure font-level ascent/descent are measured. Called once per GlyphSdf
97
+ * instance — deferred to the first draw() so the canvas context is ready.
98
+ * Uses `fontBoundingBoxAscent/Descent` when available; falls back to
99
+ * `actualBoundingBoxAscent/Descent` measured from a reference string that
100
+ * covers ascenders ('H'), descenders ('g'), and diacritics ('É').
101
+ * Either way the same values are used for EVERY glyph so all tiles share a
102
+ * consistent height and a consistent baseline position within the tile.
103
+ */
104
+ private _ensureFontMetrics;
91
105
  draw(char: string): GlyphSdfResult;
92
106
  }