@lightningjs/renderer 2.19.1 → 2.20.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 (134) hide show
  1. package/dist/src/common/CommonTypes.d.ts +11 -0
  2. package/dist/src/core/AutosizeManager.d.ts +29 -0
  3. package/dist/src/core/AutosizeManager.js +171 -0
  4. package/dist/src/core/AutosizeManager.js.map +1 -0
  5. package/dist/src/core/CoreNode.d.ts +1 -1
  6. package/dist/src/core/CoreNode.js +8 -0
  7. package/dist/src/core/CoreNode.js.map +1 -1
  8. package/dist/src/core/Stage.js +2 -1
  9. package/dist/src/core/Stage.js.map +1 -1
  10. package/dist/src/core/animations/Animation.d.ts +16 -0
  11. package/dist/src/core/animations/Animation.js +111 -0
  12. package/dist/src/core/animations/Animation.js.map +1 -0
  13. package/dist/src/core/animations/CoreTransition.d.ts +24 -0
  14. package/dist/src/core/animations/CoreTransition.js +63 -0
  15. package/dist/src/core/animations/CoreTransition.js.map +1 -0
  16. package/dist/src/core/animations/Playback.d.ts +62 -0
  17. package/dist/src/core/animations/Playback.js +155 -0
  18. package/dist/src/core/animations/Playback.js.map +1 -0
  19. package/dist/src/core/animations/Transition.d.ts +25 -0
  20. package/dist/src/core/animations/Transition.js +63 -0
  21. package/dist/src/core/animations/Transition.js.map +1 -0
  22. package/dist/src/core/animations/utils.d.ts +2 -0
  23. package/dist/src/core/animations/utils.js +137 -0
  24. package/dist/src/core/animations/utils.js.map +1 -0
  25. package/dist/src/core/lib/WebGlContextWrapper.d.ts +19 -5
  26. package/dist/src/core/lib/WebGlContextWrapper.js +35 -0
  27. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  28. package/dist/src/core/lib/collectionUtils.d.ts +5 -0
  29. package/dist/src/core/lib/collectionUtils.js +100 -0
  30. package/dist/src/core/lib/collectionUtils.js.map +1 -0
  31. package/dist/src/core/lib/textureCompression.d.ts +14 -2
  32. package/dist/src/core/lib/textureCompression.js +301 -65
  33. package/dist/src/core/lib/textureCompression.js.map +1 -1
  34. package/dist/src/core/platforms/Platform.d.ts +5 -0
  35. package/dist/src/core/platforms/Platform.js.map +1 -1
  36. package/dist/src/core/platforms/web/WebPlatform.d.ts +1 -0
  37. package/dist/src/core/platforms/web/WebPlatform.js +3 -0
  38. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -1
  39. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +4 -0
  40. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +14 -11
  41. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  42. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +1 -1
  43. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +43 -8
  44. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  45. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +2 -7
  46. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +18 -49
  47. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -1
  48. package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +0 -2
  49. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  50. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +3 -6
  51. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +1 -1
  52. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +0 -11
  53. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +1 -1
  54. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +5 -10
  55. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
  56. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +5 -10
  57. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -1
  58. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +0 -12
  59. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -1
  60. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +1 -1
  61. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +1 -1
  62. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +1 -1
  63. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +1 -1
  64. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +5 -5
  65. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +1 -1
  66. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +1 -1
  67. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +1 -1
  68. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +1 -1
  69. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +5 -5
  70. package/dist/src/core/shaders/webgl/LinearGradient.js +2 -1
  71. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  72. package/dist/src/core/shaders/webgl/RadialGradient.js +7 -6
  73. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  74. package/dist/src/core/text-rendering/CanvasFontHandler.js +4 -1
  75. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -1
  76. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +4 -6
  77. package/dist/src/core/text-rendering/CanvasTextRenderer.js +15 -23
  78. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -1
  79. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +125 -28
  80. package/dist/src/core/text-rendering/SdfFontHandler.js +337 -4
  81. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -1
  82. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +5 -6
  83. package/dist/src/core/text-rendering/SdfTextRenderer.js +19 -23
  84. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -1
  85. package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +14 -16
  86. package/dist/src/core/text-rendering/TextLayoutEngine.js +248 -192
  87. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -1
  88. package/dist/src/core/text-rendering/TextRenderer.d.ts +25 -11
  89. package/dist/src/core/textures/Texture.d.ts +12 -5
  90. package/dist/src/core/textures/Texture.js.map +1 -1
  91. package/dist/src/main-api/Inspector.js +9 -5
  92. package/dist/src/main-api/Inspector.js.map +1 -1
  93. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  94. package/package.json +1 -1
  95. package/src/common/CommonTypes.ts +16 -0
  96. package/src/core/CoreNode.test.ts +49 -0
  97. package/src/core/CoreNode.ts +10 -0
  98. package/src/core/Stage.ts +3 -1
  99. package/src/core/lib/WebGlContextWrapper.ts +49 -0
  100. package/src/core/lib/textureCompression.ts +416 -75
  101. package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +16 -14
  102. package/src/core/renderers/webgl/WebGlCoreRenderOp.ts +1 -1
  103. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +44 -11
  104. package/src/core/renderers/webgl/WebGlCoreShader.ts +27 -75
  105. package/src/core/renderers/webgl/internal/ShaderUtils.ts +0 -2
  106. package/src/core/renderers/webgl/shaders/DefaultShader.ts +3 -6
  107. package/src/core/renderers/webgl/shaders/DefaultShaderBatched.ts +0 -11
  108. package/src/core/renderers/webgl/shaders/DynamicShader.ts +5 -10
  109. package/src/core/renderers/webgl/shaders/RoundedRectangle.ts +5 -10
  110. package/src/core/renderers/webgl/shaders/SdfShader.ts +0 -12
  111. package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +1 -1
  112. package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +1 -1
  113. package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +1 -1
  114. package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +1 -1
  115. package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +5 -5
  116. package/src/core/renderers/webgl/shaders/effects/HolePunchEffect.ts +1 -1
  117. package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +1 -1
  118. package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +1 -1
  119. package/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.ts +1 -1
  120. package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +5 -5
  121. package/src/core/textures/Texture.ts +13 -6
  122. package/src/main-api/Inspector.ts +9 -5
  123. package/dist/src/core/text-rendering/CanvasFont.d.ts +0 -14
  124. package/dist/src/core/text-rendering/CanvasFont.js +0 -111
  125. package/dist/src/core/text-rendering/CanvasFont.js.map +0 -1
  126. package/dist/src/core/text-rendering/CoreFont.d.ts +0 -33
  127. package/dist/src/core/text-rendering/CoreFont.js +0 -48
  128. package/dist/src/core/text-rendering/CoreFont.js.map +0 -1
  129. package/dist/src/core/text-rendering/FontManager.d.ts +0 -11
  130. package/dist/src/core/text-rendering/FontManager.js +0 -42
  131. package/dist/src/core/text-rendering/FontManager.js.map +0 -1
  132. package/dist/src/core/text-rendering/SdfFont.d.ts +0 -29
  133. package/dist/src/core/text-rendering/SdfFont.js +0 -142
  134. package/dist/src/core/text-rendering/SdfFont.js.map +0 -1
@@ -21,6 +21,7 @@ import type { Dimensions } from '../../../common/CommonTypes.js';
21
21
  import { assertTruthy } from '../../../utils.js';
22
22
  import type { TextureMemoryManager } from '../../TextureMemoryManager.js';
23
23
  import type { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
24
+ import { uploadCompressedTexture } from '../../lib/textureCompression.js';
24
25
  import type { Texture } from '../../textures/Texture.js';
25
26
  import { CoreContextTexture } from '../CoreContextTexture.js';
26
27
  import { isHTMLImageElement } from './internal/RendererUtils.js';
@@ -43,6 +44,11 @@ export class WebGlCoreCtxTexture extends CoreContextTexture {
43
44
  private _w = 0;
44
45
  private _h = 0;
45
46
 
47
+ txCoordX1 = 0;
48
+ txCoordY1 = 0;
49
+ txCoordX2 = 1;
50
+ txCoordY2 = 1;
51
+
46
52
  constructor(
47
53
  protected glw: WebGlContextWrapper,
48
54
  memManager: TextureMemoryManager,
@@ -211,26 +217,22 @@ export class WebGlCoreCtxTexture extends CoreContextTexture {
211
217
 
212
218
  this.setTextureMemUse(height * width * formatBytes * memoryPadding);
213
219
  } else if (tdata && 'mipmaps' in tdata && tdata.mipmaps) {
214
- const { mipmaps, width = 0, height = 0, type, glInternalFormat } = tdata;
215
- const view =
216
- type === 'ktx'
217
- ? new DataView(mipmaps[0] ?? new ArrayBuffer(0))
218
- : (mipmaps[0] as unknown as ArrayBufferView);
219
-
220
- glw.bindTexture(this._nativeCtxTexture);
221
-
222
- glw.compressedTexImage2D(0, glInternalFormat, width, height, 0, view);
223
- glw.texParameteri(glw.TEXTURE_WRAP_S, glw.CLAMP_TO_EDGE);
224
- glw.texParameteri(glw.TEXTURE_WRAP_T, glw.CLAMP_TO_EDGE);
225
- glw.texParameteri(glw.TEXTURE_MAG_FILTER, glw.LINEAR);
226
- glw.texParameteri(glw.TEXTURE_MIN_FILTER, glw.LINEAR);
220
+ const { mipmaps, type, blockInfo } = tdata;
221
+ uploadCompressedTexture[type]!(glw, this._nativeCtxTexture, tdata);
227
222
 
228
223
  // Check for errors after compressed texture operations
229
224
  if (this.checkGLError() === true) {
230
225
  return { width: 0, height: 0 };
231
226
  }
232
227
 
233
- this.setTextureMemUse(view.byteLength);
228
+ width = tdata.width;
229
+ height = tdata.height;
230
+ this.txCoordX2 =
231
+ width / (Math.ceil(width / blockInfo.width) * blockInfo.width);
232
+ this.txCoordY2 =
233
+ height / (Math.ceil(height / blockInfo.height) * blockInfo.height);
234
+
235
+ this.setTextureMemUse(mipmaps[0]?.byteLength ?? 0);
234
236
  } else if (tdata && tdata instanceof Uint8Array) {
235
237
  // Color Texture
236
238
  width = 1;
@@ -88,7 +88,7 @@ export class WebGlCoreRenderOp extends CoreRenderOp {
88
88
  shader.bindRenderOp(this, shaderProps);
89
89
 
90
90
  // TODO: Reduce calculations required
91
- const quadIdx = (this.bufferIdx / 24) * 6 * 2;
91
+ const quadIdx = (this.bufferIdx / 32) * 6 * 2;
92
92
 
93
93
  // Clipping
94
94
  if (this.clippingRect.valid) {
@@ -136,7 +136,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
136
136
  this.defaultShader = this.defShaderCtrl.shader as WebGlCoreShader;
137
137
  const quadBuffer = glw.createBuffer();
138
138
  assertTruthy(quadBuffer);
139
- const stride = 6 * Float32Array.BYTES_PER_ELEMENT;
139
+ const stride = 8 * Float32Array.BYTES_PER_ELEMENT;
140
140
  this.quadBufferCollection = new BufferCollection([
141
141
  {
142
142
  buffer: quadBuffer,
@@ -173,6 +173,14 @@ export class WebGlCoreRenderer extends CoreRenderer {
173
173
  stride,
174
174
  offset: 5 * Float32Array.BYTES_PER_ELEMENT,
175
175
  },
176
+ a_nodeCoordinate: {
177
+ name: 'a_nodeCoordinate',
178
+ size: 2,
179
+ type: glw.FLOAT,
180
+ normalized: false,
181
+ stride,
182
+ offset: 6 * Float32Array.BYTES_PER_ELEMENT,
183
+ },
176
184
  },
177
185
  },
178
186
  ]);
@@ -261,6 +269,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
261
269
  assertTruthy(curRenderOp);
262
270
  }
263
271
 
272
+ let ctxTexture = undefined;
273
+
264
274
  let texCoordX1 = 0;
265
275
  let texCoordY1 = 0;
266
276
  let texCoordX2 = 1;
@@ -281,6 +291,13 @@ export class WebGlCoreRenderer extends CoreRenderer {
281
291
  texCoordY1 = ty / parentH;
282
292
  texCoordY2 = texCoordY1 + th / parentH;
283
293
  texture = (texture as SubTexture).parentTexture;
294
+ ctxTexture = texture.ctxTexture as WebGlCoreCtxTexture;
295
+ } else {
296
+ ctxTexture = texture.ctxTexture as WebGlCoreCtxTexture;
297
+ texCoordX1 = ctxTexture.txCoordX1;
298
+ texCoordY1 = ctxTexture.txCoordY1;
299
+ texCoordX2 = ctxTexture.txCoordX2;
300
+ texCoordY2 = ctxTexture.txCoordY2;
284
301
  }
285
302
 
286
303
  if (
@@ -327,14 +344,6 @@ export class WebGlCoreRenderer extends CoreRenderer {
327
344
  [texCoordY1, texCoordY2] = [texCoordY2, texCoordY1];
328
345
  }
329
346
 
330
- let ctxTexture = texture.ctxTexture as WebGlCoreCtxTexture;
331
- if (ctxTexture === undefined) {
332
- ctxTexture = this.stage.defaultTexture?.ctxTexture as WebGlCoreCtxTexture;
333
- console.warn(
334
- 'WebGL Renderer: Texture does not have a ctxTexture, using default texture instead',
335
- );
336
- }
337
-
338
347
  const textureIdx = this.addTexture(ctxTexture, bufferIdx);
339
348
 
340
349
  assertTruthy(this.curRenderOp !== null);
@@ -346,6 +355,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
346
355
  fQuadBuffer[bufferIdx++] = texCoordY1; // texCoordY
347
356
  uiQuadBuffer[bufferIdx++] = params.colorTl; // color
348
357
  fQuadBuffer[bufferIdx++] = textureIdx; // texIndex
358
+ fQuadBuffer[bufferIdx++] = 0;
359
+ fQuadBuffer[bufferIdx++] = 0;
349
360
 
350
361
  // Upper-Right
351
362
  fQuadBuffer[bufferIdx++] = params.renderCoords.x2;
@@ -354,6 +365,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
354
365
  fQuadBuffer[bufferIdx++] = texCoordY1;
355
366
  uiQuadBuffer[bufferIdx++] = params.colorTr;
356
367
  fQuadBuffer[bufferIdx++] = textureIdx;
368
+ fQuadBuffer[bufferIdx++] = 1;
369
+ fQuadBuffer[bufferIdx++] = 0;
357
370
 
358
371
  // Lower-Left
359
372
  fQuadBuffer[bufferIdx++] = params.renderCoords.x4;
@@ -362,6 +375,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
362
375
  fQuadBuffer[bufferIdx++] = texCoordY2;
363
376
  uiQuadBuffer[bufferIdx++] = params.colorBl;
364
377
  fQuadBuffer[bufferIdx++] = textureIdx;
378
+ fQuadBuffer[bufferIdx++] = 0;
379
+ fQuadBuffer[bufferIdx++] = 1;
365
380
 
366
381
  // Lower-Right
367
382
  fQuadBuffer[bufferIdx++] = params.renderCoords.x3;
@@ -370,6 +385,9 @@ export class WebGlCoreRenderer extends CoreRenderer {
370
385
  fQuadBuffer[bufferIdx++] = texCoordY2;
371
386
  uiQuadBuffer[bufferIdx++] = params.colorBr;
372
387
  fQuadBuffer[bufferIdx++] = textureIdx;
388
+
389
+ fQuadBuffer[bufferIdx++] = 1;
390
+ fQuadBuffer[bufferIdx++] = 1;
373
391
  } else if (params.tb !== 0 || params.tc !== 0) {
374
392
  // Upper-Left
375
393
  fQuadBuffer[bufferIdx++] = params.tx; // vertexX
@@ -378,6 +396,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
378
396
  fQuadBuffer[bufferIdx++] = texCoordY1; // texCoordY
379
397
  uiQuadBuffer[bufferIdx++] = params.colorTl; // color
380
398
  fQuadBuffer[bufferIdx++] = textureIdx; // texIndex
399
+ fQuadBuffer[bufferIdx++] = 0;
400
+ fQuadBuffer[bufferIdx++] = 0;
381
401
 
382
402
  // Upper-Right
383
403
  fQuadBuffer[bufferIdx++] = params.tx + params.width * params.ta;
@@ -386,6 +406,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
386
406
  fQuadBuffer[bufferIdx++] = texCoordY1;
387
407
  uiQuadBuffer[bufferIdx++] = params.colorTr;
388
408
  fQuadBuffer[bufferIdx++] = textureIdx;
409
+ fQuadBuffer[bufferIdx++] = 1;
410
+ fQuadBuffer[bufferIdx++] = 0;
389
411
 
390
412
  // Lower-Left
391
413
  fQuadBuffer[bufferIdx++] = params.tx + params.height * params.tb;
@@ -394,6 +416,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
394
416
  fQuadBuffer[bufferIdx++] = texCoordY2;
395
417
  uiQuadBuffer[bufferIdx++] = params.colorBl;
396
418
  fQuadBuffer[bufferIdx++] = textureIdx;
419
+ fQuadBuffer[bufferIdx++] = 0;
420
+ fQuadBuffer[bufferIdx++] = 1;
397
421
 
398
422
  // Lower-Right
399
423
  fQuadBuffer[bufferIdx++] =
@@ -404,6 +428,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
404
428
  fQuadBuffer[bufferIdx++] = texCoordY2;
405
429
  uiQuadBuffer[bufferIdx++] = params.colorBr;
406
430
  fQuadBuffer[bufferIdx++] = textureIdx;
431
+ fQuadBuffer[bufferIdx++] = 1;
432
+ fQuadBuffer[bufferIdx++] = 1;
407
433
  } else {
408
434
  // Calculate the right corner of the quad
409
435
  // multiplied by the scale
@@ -417,6 +443,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
417
443
  fQuadBuffer[bufferIdx++] = texCoordY1; // texCoordY
418
444
  uiQuadBuffer[bufferIdx++] = params.colorTl; // color
419
445
  fQuadBuffer[bufferIdx++] = textureIdx; // texIndex
446
+ fQuadBuffer[bufferIdx++] = 0;
447
+ fQuadBuffer[bufferIdx++] = 0;
420
448
 
421
449
  // Upper-Right
422
450
  fQuadBuffer[bufferIdx++] = rightCornerX;
@@ -425,6 +453,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
425
453
  fQuadBuffer[bufferIdx++] = texCoordY1;
426
454
  uiQuadBuffer[bufferIdx++] = params.colorTr;
427
455
  fQuadBuffer[bufferIdx++] = textureIdx;
456
+ fQuadBuffer[bufferIdx++] = 1;
457
+ fQuadBuffer[bufferIdx++] = 0;
428
458
 
429
459
  // Lower-Left
430
460
  fQuadBuffer[bufferIdx++] = params.tx;
@@ -433,6 +463,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
433
463
  fQuadBuffer[bufferIdx++] = texCoordY2;
434
464
  uiQuadBuffer[bufferIdx++] = params.colorBl;
435
465
  fQuadBuffer[bufferIdx++] = textureIdx;
466
+ fQuadBuffer[bufferIdx++] = 0;
467
+ fQuadBuffer[bufferIdx++] = 1;
436
468
 
437
469
  // Lower-Right
438
470
  fQuadBuffer[bufferIdx++] = rightCornerX;
@@ -441,9 +473,10 @@ export class WebGlCoreRenderer extends CoreRenderer {
441
473
  fQuadBuffer[bufferIdx++] = texCoordY2;
442
474
  uiQuadBuffer[bufferIdx++] = params.colorBr;
443
475
  fQuadBuffer[bufferIdx++] = textureIdx;
476
+ fQuadBuffer[bufferIdx++] = 1;
477
+ fQuadBuffer[bufferIdx++] = 1;
444
478
  }
445
479
  // Update the length of the current render op
446
- this.curRenderOp.length += WORDS_PER_QUAD;
447
480
  this.curRenderOp.numQuads++;
448
481
  this.curBufferIdx = bufferIdx;
449
482
  }
@@ -595,7 +628,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
595
628
  this.quadBufferUsage = this.curBufferIdx * arr.BYTES_PER_ELEMENT;
596
629
 
597
630
  // Calculate the size of each quad in bytes (4 vertices per quad) times the size of each vertex in bytes
598
- const QUAD_SIZE_IN_BYTES = 4 * (6 * arr.BYTES_PER_ELEMENT); // 6 attributes per vertex
631
+ const QUAD_SIZE_IN_BYTES = 4 * (8 * arr.BYTES_PER_ELEMENT); // 8 attributes per vertex
599
632
  this.numQuadsRendered = this.quadBufferUsage / QUAD_SIZE_IN_BYTES;
600
633
  }
601
634
 
@@ -65,7 +65,6 @@ export interface AlphaShaderProp {
65
65
  }
66
66
 
67
67
  export abstract class WebGlCoreShader extends CoreShader {
68
- protected boundBufferCollection: BufferCollection | null = null;
69
68
  protected buffersBound = false;
70
69
  protected program: WebGLProgram;
71
70
  /**
@@ -77,11 +76,8 @@ export abstract class WebGlCoreShader extends CoreShader {
77
76
  protected vao: WebGLVertexArrayObject | undefined;
78
77
  protected renderer: WebGlCoreRenderer;
79
78
  protected glw: WebGlContextWrapper;
80
- protected attributeBuffers: Record<string, WebGLBuffer>;
81
- protected attributeLocations: Record<string, number>;
82
- protected attributeNames: string[];
79
+ protected attributeLocations: string[];
83
80
  protected uniformLocations: Record<string, WebGLUniformLocation>;
84
- protected uniformTypes: Record<string, keyof UniformMethodMap>;
85
81
  readonly supportsIndexedTextures: boolean;
86
82
 
87
83
  constructor(options: ShaderOptions) {
@@ -160,61 +156,8 @@ export abstract class WebGlCoreShader extends CoreShader {
160
156
  }
161
157
  this.program = program;
162
158
 
163
- this.attributeLocations = {} as Record<string, number>;
164
- this.attributeBuffers = {} as Record<string, number>;
165
- this.attributeNames = [];
166
-
167
- [...options.attributes].forEach((attributeName) => {
168
- const location = glw.getAttribLocation(this.program, attributeName);
169
- if (location < 0) {
170
- throw new Error(
171
- `${this.constructor.name}: Vertex shader must have an attribute "${attributeName}"!`,
172
- );
173
- }
174
- const buffer = glw.createBuffer();
175
- if (!buffer) {
176
- throw new Error(
177
- `${this.constructor.name}: Could not create buffer for attribute "${attributeName}"`,
178
- );
179
- }
180
-
181
- this.attributeLocations[attributeName] = location;
182
- this.attributeBuffers[attributeName] = buffer;
183
- this.attributeNames.push(attributeName);
184
- });
185
-
186
- this.uniformLocations = {} as Record<string, WebGLRenderingContext>;
187
- this.uniformTypes = {} as Record<string, keyof UniformMethodMap>;
188
- options.uniforms.forEach((uniform: UniformInfo) => {
189
- const location = glw.getUniformLocation(this.program, uniform.name);
190
- this.uniformTypes[uniform.name] = uniform.uniform;
191
- if (!location) {
192
- console.warn(
193
- `Shader "${this.constructor.name}" could not get uniform location for "${uniform.name}"`,
194
- );
195
- return;
196
- }
197
- this.uniformLocations[uniform.name] = location;
198
- });
199
- }
200
-
201
- private bindBufferAttribute(
202
- location: number,
203
- buffer: WebGLBuffer,
204
- attribute: AttributeInfo,
205
- ) {
206
- const { glw } = this;
207
- glw.enableVertexAttribArray(location);
208
-
209
- glw.vertexAttribPointer(
210
- buffer,
211
- location,
212
- attribute.size,
213
- attribute.type,
214
- attribute.normalized,
215
- attribute.stride,
216
- attribute.offset,
217
- );
159
+ this.attributeLocations = glw.getAttributeLocations(this.program);
160
+ this.uniformLocations = glw.getUniformLocations(this.program);
218
161
  }
219
162
 
220
163
  disableAttribute(location: number) {
@@ -222,10 +165,11 @@ export abstract class WebGlCoreShader extends CoreShader {
222
165
  }
223
166
 
224
167
  disableAttributes() {
225
- for (const loc in this.attributeLocations) {
226
- this.disableAttribute(this.attributeLocations[loc] as number);
168
+ const glw = this.glw;
169
+ const attribLen = this.attributeLocations.length;
170
+ for (let i = 0; i < attribLen; i++) {
171
+ glw.disableVertexAttribArray(i);
227
172
  }
228
- this.boundBufferCollection = null;
229
173
  }
230
174
 
231
175
  /**
@@ -325,21 +269,29 @@ export abstract class WebGlCoreShader extends CoreShader {
325
269
  }
326
270
 
327
271
  bindBufferCollection(buffer: BufferCollection) {
328
- if (this.boundBufferCollection === buffer) {
329
- return;
330
- }
331
- for (const attributeName in this.attributeLocations) {
332
- const resolvedBuffer = buffer.getBuffer(attributeName);
333
- const resolvedInfo = buffer.getAttributeInfo(attributeName);
334
- assertTruthy(resolvedBuffer, `Buffer for "${attributeName}" not found`);
335
- assertTruthy(resolvedInfo);
336
- this.bindBufferAttribute(
337
- this.attributeLocations[attributeName]!,
272
+ const { glw } = this;
273
+ const attribs = this.attributeLocations;
274
+ const attribLen = attribs.length;
275
+
276
+ for (let i = 0; i < attribLen; i++) {
277
+ const name = attribs[i]!;
278
+
279
+ const resolvedBuffer = buffer.getBuffer(name);
280
+ const resolvedInfo = buffer.getAttributeInfo(name);
281
+ if (resolvedBuffer === undefined || resolvedInfo === undefined) {
282
+ continue;
283
+ }
284
+ glw.enableVertexAttribArray(i);
285
+ glw.vertexAttribPointer(
338
286
  resolvedBuffer,
339
- resolvedInfo,
287
+ i,
288
+ resolvedInfo.size,
289
+ resolvedInfo.type,
290
+ resolvedInfo.normalized,
291
+ resolvedInfo.stride,
292
+ resolvedInfo.offset,
340
293
  );
341
294
  }
342
- this.boundBufferCollection = buffer;
343
295
  }
344
296
 
345
297
  protected override bindProps(props: Record<string, unknown>) {
@@ -37,8 +37,6 @@ export interface UniformInfo {
37
37
 
38
38
  export interface ShaderOptions {
39
39
  renderer: WebGlCoreRenderer;
40
- attributes: string[];
41
- uniforms: UniformInfo[];
42
40
  shaderSources?: ShaderProgramSources;
43
41
  supportsIndexedTextures?: boolean;
44
42
  webgl1Extensions?: string[];
@@ -26,12 +26,6 @@ export class DefaultShader extends WebGlCoreShader {
26
26
  constructor(renderer: WebGlCoreRenderer) {
27
27
  super({
28
28
  renderer,
29
- attributes: ['a_position', 'a_textureCoordinate', 'a_color'],
30
- uniforms: [
31
- { name: 'u_resolution', uniform: 'uniform2fv' },
32
- { name: 'u_pixelRatio', uniform: 'uniform1f' },
33
- { name: 'u_texture', uniform: 'uniform2fv' },
34
- ],
35
29
  });
36
30
  }
37
31
 
@@ -51,6 +45,7 @@ export class DefaultShader extends WebGlCoreShader {
51
45
 
52
46
  attribute vec2 a_position;
53
47
  attribute vec2 a_textureCoordinate;
48
+ attribute vec2 a_nodeCoordinate;
54
49
  attribute vec4 a_color;
55
50
 
56
51
  uniform vec2 u_resolution;
@@ -59,6 +54,7 @@ export class DefaultShader extends WebGlCoreShader {
59
54
 
60
55
  varying vec4 v_color;
61
56
  varying vec2 v_textureCoordinate;
57
+ varying vec2 v_nodeCoordinate;
62
58
 
63
59
  void main() {
64
60
  vec2 normalized = a_position * u_pixelRatio;
@@ -66,6 +62,7 @@ export class DefaultShader extends WebGlCoreShader {
66
62
 
67
63
  v_color = a_color;
68
64
  v_textureCoordinate = a_textureCoordinate;
65
+ v_nodeCoordinate = a_nodeCoordinate;
69
66
 
70
67
  gl_Position = vec4(normalized.x * screenSpace.x - 1.0, normalized.y * -abs(screenSpace.y) + 1.0, 0.0, 1.0);
71
68
  gl_Position.y = -sign(screenSpace.y) * gl_Position.y;
@@ -29,17 +29,6 @@ export class DefaultShaderBatched extends WebGlCoreShader {
29
29
  constructor(renderer: WebGlCoreRenderer) {
30
30
  super({
31
31
  renderer,
32
- attributes: [
33
- 'a_position',
34
- 'a_textureCoordinate',
35
- 'a_color',
36
- 'a_textureIndex',
37
- ],
38
- uniforms: [
39
- { name: 'u_resolution', uniform: 'uniform2fv' },
40
- { name: 'u_pixelRatio', uniform: 'uniform1f' },
41
- { name: 'u_textures[0]', uniform: 'uniform1iv' },
42
- ],
43
32
  });
44
33
  }
45
34
 
@@ -118,15 +118,6 @@ export class DynamicShader extends WebGlCoreShader {
118
118
  const shader = DynamicShader.createShader(props, effectContructors);
119
119
  super({
120
120
  renderer,
121
- attributes: ['a_position', 'a_textureCoordinate', 'a_color'],
122
- uniforms: [
123
- { name: 'u_resolution', uniform: 'uniform2fv' },
124
- { name: 'u_pixelRatio', uniform: 'uniform1f' },
125
- { name: 'u_texture', uniform: 'uniform2fv' },
126
- { name: 'u_dimensions', uniform: 'uniform2fv' },
127
- { name: 'u_alpha', uniform: 'uniform1f' },
128
- ...shader.uniforms,
129
- ],
130
121
  shaderSources: {
131
122
  vertex: shader.vertex,
132
123
  fragment: shader.fragment,
@@ -504,6 +495,7 @@ export class DynamicShader extends WebGlCoreShader {
504
495
  # endif
505
496
 
506
497
  attribute vec2 a_textureCoordinate;
498
+ attribute vec2 a_nodeCoordinate;
507
499
  attribute vec2 a_position;
508
500
  attribute vec4 a_color;
509
501
  attribute float a_textureIndex;
@@ -514,6 +506,7 @@ export class DynamicShader extends WebGlCoreShader {
514
506
  varying vec4 v_color;
515
507
  varying vec2 v_textureCoordinate;
516
508
  varying float v_textureIndex;
509
+ varying vec2 v_nodeCoordinate;
517
510
 
518
511
  void main(){
519
512
  vec2 normalized = a_position * u_pixelRatio / u_resolution;
@@ -524,6 +517,7 @@ export class DynamicShader extends WebGlCoreShader {
524
517
  v_color = a_color;
525
518
  v_textureCoordinate = a_textureCoordinate;
526
519
  v_textureIndex = a_textureIndex;
520
+ v_nodeCoordinate = a_nodeCoordinate;
527
521
 
528
522
  // flip y
529
523
  gl_Position = vec4(clip_space * vec2(1.0, -1.0), 0, 1);
@@ -555,13 +549,14 @@ export class DynamicShader extends WebGlCoreShader {
555
549
 
556
550
  varying vec4 v_color;
557
551
  varying vec2 v_textureCoordinate;
552
+ varying vec2 v_nodeCoordinate;
558
553
 
559
554
  ${methods}
560
555
 
561
556
  ${effectMethods}
562
557
 
563
558
  void main() {
564
- vec2 p = v_textureCoordinate.xy * u_dimensions - u_dimensions * 0.5;
559
+ vec2 p = v_nodeCoordinate.xy * u_dimensions - u_dimensions * 0.5;
565
560
  vec2 d = abs(p) - (u_dimensions) * 0.5;
566
561
  float lng_DefaultMask = min(max(d.x, d.y), 0.0) + length(max(d, 0.0));
567
562
 
@@ -45,14 +45,6 @@ export class RoundedRectangle extends WebGlCoreShader {
45
45
  constructor(renderer: WebGlCoreRenderer) {
46
46
  super({
47
47
  renderer,
48
- attributes: ['a_position', 'a_textureCoordinate', 'a_color'],
49
- uniforms: [
50
- { name: 'u_resolution', uniform: 'uniform2fv' },
51
- { name: 'u_pixelRatio', uniform: 'uniform1f' },
52
- { name: 'u_texture', uniform: 'uniform2f' },
53
- { name: 'u_dimensions', uniform: 'uniform2fv' },
54
- { name: 'u_radius', uniform: 'uniform1f' },
55
- ],
56
48
  });
57
49
  }
58
50
 
@@ -109,13 +101,14 @@ export class RoundedRectangle extends WebGlCoreShader {
109
101
  attribute vec2 a_textureCoordinate;
110
102
  attribute vec4 a_color;
111
103
  attribute float a_textureIndex;
112
- attribute float a_depth;
104
+ attribute vec2 a_nodeCoordinate;
113
105
 
114
106
  uniform vec2 u_resolution;
115
107
  uniform float u_pixelRatio;
116
108
 
117
109
  varying vec4 v_color;
118
110
  varying vec2 v_textureCoordinate;
111
+ varying vec2 v_nodeCoordinate;
119
112
 
120
113
  void main() {
121
114
  vec2 normalized = a_position * u_pixelRatio / u_resolution;
@@ -125,6 +118,7 @@ export class RoundedRectangle extends WebGlCoreShader {
125
118
  // pass to fragment
126
119
  v_color = a_color;
127
120
  v_textureCoordinate = a_textureCoordinate;
121
+ v_nodeCoordinate = a_nodeCoordinate;
128
122
 
129
123
  // flip y
130
124
  gl_Position = vec4(clip_space * vec2(1.0, -1.0), 0, 1);
@@ -144,6 +138,7 @@ export class RoundedRectangle extends WebGlCoreShader {
144
138
 
145
139
  varying vec4 v_color;
146
140
  varying vec2 v_textureCoordinate;
141
+ varying vec2 v_nodeCoordinate;
147
142
 
148
143
  float boxDist(vec2 p, vec2 size, float radius){
149
144
  size -= vec2(radius);
@@ -159,7 +154,7 @@ export class RoundedRectangle extends WebGlCoreShader {
159
154
  vec4 color = texture2D(u_texture, v_textureCoordinate) * v_color;
160
155
  vec2 halfDimensions = u_dimensions * 0.5;
161
156
 
162
- float d = boxDist(v_textureCoordinate.xy * u_dimensions - halfDimensions, halfDimensions + 0.5, u_radius);
157
+ float d = boxDist(v_nodeCoordinate.xy * u_dimensions - halfDimensions, halfDimensions + 0.5, u_radius);
163
158
  gl_FragColor = mix(vec4(0.0), color, fillMask(d));
164
159
  }
165
160
  `,
@@ -64,18 +64,6 @@ export class SdfShader extends WebGlCoreShader {
64
64
  constructor(renderer: WebGlCoreRenderer) {
65
65
  super({
66
66
  renderer,
67
- attributes: ['a_position', 'a_textureCoordinate'],
68
- uniforms: [
69
- { name: 'u_resolution', uniform: 'uniform2fv' },
70
- { name: 'u_transform', uniform: 'uniformMatrix3fv' },
71
- { name: 'u_scrollY', uniform: 'uniform1f' },
72
- { name: 'u_pixelRatio', uniform: 'uniform1f' },
73
- { name: 'u_texture', uniform: 'uniform2f' },
74
- { name: 'u_color', uniform: 'uniform4fv' },
75
- { name: 'u_size', uniform: 'uniform1f' },
76
- { name: 'u_distanceRange', uniform: 'uniform1f' },
77
- { name: 'u_debug', uniform: 'uniform1i' },
78
- ],
79
67
  });
80
68
  }
81
69
 
@@ -91,7 +91,7 @@ export class BorderBottomEffect extends ShaderEffect {
91
91
 
92
92
  static override onEffectMask = `
93
93
  vec2 pos = vec2(0.0, u_dimensions.y - width * 0.5);
94
- float mask = $rectDist(v_textureCoordinate.xy * u_dimensions - pos, vec2(u_dimensions.x, width*0.5));
94
+ float mask = $rectDist(v_nodeCoordinate.xy * u_dimensions - pos, vec2(u_dimensions.x, width*0.5));
95
95
  return mix(shaderColor, maskColor, $fillMask(mask));
96
96
  `;
97
97
 
@@ -91,7 +91,7 @@ export class BorderLeftEffect extends ShaderEffect {
91
91
 
92
92
  static override onEffectMask = `
93
93
  vec2 pos = vec2(width * 0.5, 0.0);
94
- float mask = $rectDist(v_textureCoordinate.xy * u_dimensions - pos, vec2(width*0.5, u_dimensions.y));
94
+ float mask = $rectDist(v_nodeCoordinate.xy * u_dimensions - pos, vec2(width*0.5, u_dimensions.y));
95
95
  return mix(shaderColor, maskColor, $fillMask(mask));
96
96
  `;
97
97
 
@@ -91,7 +91,7 @@ export class BorderRightEffect extends ShaderEffect {
91
91
 
92
92
  static override onEffectMask = `
93
93
  vec2 pos = vec2(u_dimensions.x - width * 0.5, 0.0);
94
- float mask = $rectDist(v_textureCoordinate.xy * u_dimensions - pos, vec2(width*0.5, u_dimensions.y));
94
+ float mask = $rectDist(v_nodeCoordinate.xy * u_dimensions - pos, vec2(width*0.5, u_dimensions.y));
95
95
  return mix(shaderColor, maskColor, $fillMask(mask));
96
96
  `;
97
97
 
@@ -91,7 +91,7 @@ export class BorderTopEffect extends ShaderEffect {
91
91
 
92
92
  static override onEffectMask = `
93
93
  vec2 pos = vec2(0.0, width * 0.5);
94
- float mask = $rectDist(v_textureCoordinate.xy * u_dimensions - pos, vec2(u_dimensions.x, width*0.5));
94
+ float mask = $rectDist(v_nodeCoordinate.xy * u_dimensions - pos, vec2(u_dimensions.x, width*0.5));
95
95
  return mix(shaderColor, maskColor, $fillMask(mask));
96
96
  `;
97
97
 
@@ -82,7 +82,7 @@ export class FadeOutEffect extends ShaderEffect {
82
82
  }
83
83
 
84
84
  static override onColorize = `
85
- vec2 point = v_textureCoordinate.xy * u_dimensions.xy;
85
+ vec2 point = v_nodeCoordinate.xy * u_dimensions.xy;
86
86
  vec2 pos1;
87
87
  vec2 pos2;
88
88
  vec2 d;
@@ -99,16 +99,16 @@ export class FadeOutEffect extends ShaderEffect {
99
99
  }
100
100
 
101
101
  if(fade[1] > 0.0) {
102
- pos1 = vec2(point.x - u_dimensions.x - fade[1], v_textureCoordinate.y);
103
- pos2 = vec2(point.x - u_dimensions.x, v_textureCoordinate.y);
102
+ pos1 = vec2(point.x - u_dimensions.x - fade[1], v_nodeCoordinate.y);
103
+ pos2 = vec2(point.x - u_dimensions.x, v_nodeCoordinate.y);
104
104
  d = pos1 - pos2;
105
105
  c = dot(pos2, d) / dot(d, d);
106
106
  result = mix(vec4(0.0), result, smoothstep(0.0, 1.0, clamp(c, 0.0, 1.0)));
107
107
  }
108
108
 
109
109
  if(fade[2] > 0.0) {
110
- pos1 = vec2(v_textureCoordinate.x, point.y - u_dimensions.y - fade[2]);
111
- pos2 = vec2(v_textureCoordinate.x, point.y - u_dimensions.y);
110
+ pos1 = vec2(v_nodeCoordinate.x, point.y - u_dimensions.y - fade[2]);
111
+ pos2 = vec2(v_nodeCoordinate.x, point.y - u_dimensions.y);
112
112
  d = pos1 - pos2;
113
113
  c = dot(pos2, d) / dot(d, d);
114
114
  result = mix(vec4(0.0), result, smoothstep(0.0, 1.0, clamp(c, 0.0, 1.0)));
@@ -142,7 +142,7 @@ export class HolePunchEffect extends ShaderEffect {
142
142
  static override onShaderMask = `
143
143
  vec2 halfDimensions = u_dimensions * 0.5;
144
144
  vec2 size = vec2(width, height) * 0.5;
145
- vec2 basePos = v_textureCoordinate.xy * u_dimensions.xy - vec2(x, y);
145
+ vec2 basePos = v_nodeCoordinate.xy * u_dimensions.xy - vec2(x, y);
146
146
  vec2 pos = basePos - size;
147
147
  float r = radius[0] * step(pos.x, 0.5) * step(pos.y, 0.5);
148
148
  r = r + radius[1] * step(0.5, pos.x) * step(pos.y, 0.5);
@@ -146,7 +146,7 @@ export class LinearGradientEffect extends ShaderEffect {
146
146
  vec2 f = $calcPoint(lineDist * 0.5, a);
147
147
  vec2 t = $calcPoint(lineDist * 0.5, a + PI);
148
148
  vec2 gradVec = t - f;
149
- float dist = dot(v_textureCoordinate.xy * u_dimensions - f, gradVec) / dot(gradVec, gradVec);
149
+ float dist = dot(v_nodeCoordinate.xy * u_dimensions - f, gradVec) / dot(gradVec, gradVec);
150
150
 
151
151
  //return early if dist is lower or equal to first stop
152
152
  if(dist <= stops[0]) {