@lightningjs/renderer 3.0.0-beta20 → 3.0.0-beta22

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 (159) hide show
  1. package/dist/exports/index.d.ts +1 -0
  2. package/dist/exports/index.js +1 -0
  3. package/dist/exports/index.js.map +1 -1
  4. package/dist/src/common/CommonTypes.d.ts +2 -1
  5. package/dist/src/core/CoreNode.d.ts +53 -7
  6. package/dist/src/core/CoreNode.js +175 -65
  7. package/dist/src/core/CoreNode.js.map +1 -1
  8. package/dist/src/core/CoreTextNode.d.ts +1 -1
  9. package/dist/src/core/CoreTextNode.js +3 -5
  10. package/dist/src/core/CoreTextNode.js.map +1 -1
  11. package/dist/src/core/CoreTextureManager.js +1 -1
  12. package/dist/src/core/CoreTextureManager.js.map +1 -1
  13. package/dist/src/core/Stage.d.ts +2 -1
  14. package/dist/src/core/Stage.js +9 -7
  15. package/dist/src/core/Stage.js.map +1 -1
  16. package/dist/src/core/TextureMemoryManager.d.ts +1 -1
  17. package/dist/src/core/TextureMemoryManager.js +3 -3
  18. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  19. package/dist/src/core/lib/ImageWorker.d.ts +2 -2
  20. package/dist/src/core/lib/ImageWorker.js +30 -11
  21. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  22. package/dist/src/core/lib/WebGlContextWrapper.js +1 -1
  23. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  24. package/dist/src/core/lib/utils.d.ts +6 -2
  25. package/dist/src/core/lib/utils.js +21 -21
  26. package/dist/src/core/lib/utils.js.map +1 -1
  27. package/dist/src/core/renderers/CoreRenderer.d.ts +1 -31
  28. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  29. package/dist/src/core/renderers/CoreShaderNode.d.ts +4 -0
  30. package/dist/src/core/renderers/CoreShaderNode.js +15 -0
  31. package/dist/src/core/renderers/CoreShaderNode.js.map +1 -1
  32. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +3 -3
  33. package/dist/src/core/renderers/canvas/CanvasRenderer.js +38 -33
  34. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  35. package/dist/src/core/renderers/canvas/CanvasShaderNode.d.ts +1 -2
  36. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
  37. package/dist/src/core/renderers/webgl/SdfRenderOp.d.ts +33 -0
  38. package/dist/src/core/renderers/webgl/SdfRenderOp.js +97 -0
  39. package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -0
  40. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +1 -1
  41. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  42. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +12 -8
  43. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  44. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +6 -18
  45. package/dist/src/core/renderers/webgl/WebGlRenderer.js +48 -61
  46. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  47. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +2 -4
  48. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  49. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +3 -4
  50. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +40 -29
  51. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  52. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +8 -24
  53. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
  54. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +8 -25
  55. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -1
  56. package/dist/src/core/shaders/canvas/Border.d.ts +8 -2
  57. package/dist/src/core/shaders/canvas/Border.js +62 -23
  58. package/dist/src/core/shaders/canvas/Border.js.map +1 -1
  59. package/dist/src/core/shaders/canvas/HolePunch.js +2 -1
  60. package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -1
  61. package/dist/src/core/shaders/canvas/LinearGradient.js +5 -3
  62. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -1
  63. package/dist/src/core/shaders/canvas/RadialGradient.js +7 -5
  64. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
  65. package/dist/src/core/shaders/canvas/Rounded.js +2 -2
  66. package/dist/src/core/shaders/canvas/Rounded.js.map +1 -1
  67. package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +6 -3
  68. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +39 -9
  69. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  70. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +2 -3
  71. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +44 -7
  72. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
  73. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +5 -4
  74. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
  75. package/dist/src/core/shaders/canvas/Shadow.js +4 -2
  76. package/dist/src/core/shaders/canvas/Shadow.js.map +1 -1
  77. package/dist/src/core/shaders/canvas/utils/render.d.ts +1 -1
  78. package/dist/src/core/shaders/canvas/utils/render.js +31 -18
  79. package/dist/src/core/shaders/canvas/utils/render.js.map +1 -1
  80. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +10 -0
  81. package/dist/src/core/shaders/templates/BorderTemplate.js +20 -0
  82. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -1
  83. package/dist/src/core/shaders/webgl/Border.js +66 -14
  84. package/dist/src/core/shaders/webgl/Border.js.map +1 -1
  85. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +90 -31
  86. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  87. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +98 -38
  88. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  89. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +5 -4
  90. package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -1
  91. package/dist/src/core/shaders/webgl/Shadow.js +12 -6
  92. package/dist/src/core/shaders/webgl/Shadow.js.map +1 -1
  93. package/dist/src/core/text-rendering/CanvasFont.d.ts +14 -0
  94. package/dist/src/core/text-rendering/CanvasFont.js +115 -0
  95. package/dist/src/core/text-rendering/CanvasFont.js.map +1 -0
  96. package/dist/src/core/text-rendering/CoreFont.d.ts +33 -0
  97. package/dist/src/core/text-rendering/CoreFont.js +48 -0
  98. package/dist/src/core/text-rendering/CoreFont.js.map +1 -0
  99. package/dist/src/core/text-rendering/FontManager.d.ts +11 -0
  100. package/dist/src/core/text-rendering/FontManager.js +41 -0
  101. package/dist/src/core/text-rendering/FontManager.js.map +1 -0
  102. package/dist/src/core/text-rendering/SdfFont.d.ts +29 -0
  103. package/dist/src/core/text-rendering/SdfFont.js +142 -0
  104. package/dist/src/core/text-rendering/SdfFont.js.map +1 -0
  105. package/dist/src/core/text-rendering/SdfTextRenderer.js +12 -20
  106. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -1
  107. package/dist/src/core/textures/Texture.d.ts +4 -3
  108. package/dist/src/core/textures/Texture.js.map +1 -1
  109. package/dist/src/main-api/Inspector.d.ts +5 -1
  110. package/dist/src/main-api/Inspector.js +164 -1
  111. package/dist/src/main-api/Inspector.js.map +1 -1
  112. package/dist/src/main-api/Renderer.d.ts +10 -0
  113. package/dist/src/main-api/Renderer.js +2 -0
  114. package/dist/src/main-api/Renderer.js.map +1 -1
  115. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  116. package/exports/index.ts +5 -0
  117. package/package.json +1 -1
  118. package/src/common/CommonTypes.ts +2 -1
  119. package/src/core/Autosizer.ts +224 -0
  120. package/src/core/CoreNode.test.ts +116 -2
  121. package/src/core/CoreNode.ts +247 -78
  122. package/src/core/CoreTextNode.ts +3 -5
  123. package/src/core/CoreTextureManager.ts +1 -1
  124. package/src/core/Stage.ts +10 -7
  125. package/src/core/TextureMemoryManager.ts +3 -3
  126. package/src/core/lib/ImageWorker.ts +36 -11
  127. package/src/core/lib/WebGlContextWrapper.ts +1 -1
  128. package/src/core/lib/utils.ts +28 -25
  129. package/src/core/renderers/CoreRenderer.ts +1 -32
  130. package/src/core/renderers/CoreShaderNode.ts +20 -0
  131. package/src/core/renderers/canvas/CanvasRenderer.ts +43 -51
  132. package/src/core/renderers/canvas/CanvasShaderNode.ts +1 -2
  133. package/src/core/renderers/webgl/SdfRenderOp.ts +105 -0
  134. package/src/core/renderers/webgl/WebGlCtxTexture.ts +16 -9
  135. package/src/core/renderers/webgl/WebGlRenderer.ts +56 -78
  136. package/src/core/renderers/webgl/WebGlShaderNode.ts +2 -7
  137. package/src/core/renderers/webgl/WebGlShaderProgram.ts +48 -38
  138. package/src/core/shaders/canvas/Border.ts +86 -29
  139. package/src/core/shaders/canvas/HolePunch.ts +2 -1
  140. package/src/core/shaders/canvas/LinearGradient.ts +8 -6
  141. package/src/core/shaders/canvas/RadialGradient.ts +7 -10
  142. package/src/core/shaders/canvas/Rounded.ts +5 -5
  143. package/src/core/shaders/canvas/RoundedWithBorder.ts +68 -18
  144. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +71 -23
  145. package/src/core/shaders/canvas/RoundedWithShadow.ts +6 -5
  146. package/src/core/shaders/canvas/Shadow.ts +7 -5
  147. package/src/core/shaders/canvas/utils/render.ts +45 -36
  148. package/src/core/shaders/templates/BorderTemplate.ts +30 -0
  149. package/src/core/shaders/webgl/Border.ts +66 -15
  150. package/src/core/shaders/webgl/RoundedWithBorder.ts +90 -31
  151. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +98 -38
  152. package/src/core/shaders/webgl/RoundedWithShadow.ts +5 -4
  153. package/src/core/shaders/webgl/Shadow.ts +12 -6
  154. package/src/core/text-rendering/SdfTextRenderer.ts +18 -21
  155. package/src/core/textures/Texture.ts +10 -6
  156. package/src/main-api/Inspector.ts +221 -3
  157. package/src/main-api/Renderer.ts +13 -0
  158. package/dist/tsconfig.tsbuildinfo +0 -1
  159. package/src/core/renderers/webgl/WebGlRenderOp.ts +0 -170
@@ -11,6 +11,8 @@ import type {
11
11
  } from '../common/IAnimationController.js';
12
12
  import { isProductionEnvironment } from '../utils.js';
13
13
  import { CoreTextNode, type CoreTextNodeProps } from '../core/CoreTextNode.js';
14
+ import type { Texture } from '../core/textures/Texture.js';
15
+ import { TextureType } from '../core/textures/Texture.js';
14
16
 
15
17
  /**
16
18
  * Inspector Options
@@ -204,6 +206,22 @@ const gradientColorPropertyMap = [
204
206
  'colorBr',
205
207
  ];
206
208
 
209
+ const textureTypeNames: Record<number, string> = {
210
+ [TextureType.generic]: 'generic',
211
+ [TextureType.color]: 'color',
212
+ [TextureType.image]: 'image',
213
+ [TextureType.noise]: 'noise',
214
+ [TextureType.renderToTexture]: 'renderToTexture',
215
+ [TextureType.subTexture]: 'subTexture',
216
+ };
217
+
218
+ interface TextureMetrics {
219
+ previousState: string;
220
+ loadedCount: number;
221
+ failedCount: number;
222
+ freedCount: number;
223
+ }
224
+
207
225
  const knownProperties = new Set<string>([
208
226
  ...Object.keys(stylePropertyMap),
209
227
  ...Object.keys(domPropertyMap),
@@ -223,6 +241,7 @@ export class Inspector {
223
241
  private width = 1920;
224
242
  private scaleX = 1;
225
243
  private scaleY = 1;
244
+ private textureMetrics = new Map<Texture, TextureMetrics>();
226
245
 
227
246
  // Performance monitoring for frequent setter calls
228
247
  private static setterCallCount = new Map<
@@ -773,10 +792,13 @@ export class Inspector {
773
792
  return this.createProxy(node, div);
774
793
  }
775
794
 
776
- createTextNode(node: CoreNode): CoreTextNode {
777
- const div = this.createDiv(node.id, node.props);
795
+ createTextNode(node: CoreTextNode): CoreTextNode {
796
+ // eslint-disable-next-line
797
+ // @ts-ignore - textProps is a private property and keeping it that way
798
+ // but we need it from the inspector to set the initial properties on the div element
799
+ const div = this.createDiv(node.id, node.textProps);
778
800
  (div as HTMLElement & { node: CoreNode }).node = node;
779
- (node as CoreNode & { div: HTMLElement }).div = div;
801
+ (node as CoreTextNode & { div: HTMLElement }).div = div;
780
802
 
781
803
  return this.createProxy(node, div) as CoreTextNode;
782
804
  }
@@ -785,6 +807,94 @@ export class Inspector {
785
807
  node: CoreNode | CoreTextNode,
786
808
  div: HTMLElement,
787
809
  ): CoreNode | CoreTextNode {
810
+ // Store texture event listeners for cleanup
811
+ const textureListeners = new Map<
812
+ Texture,
813
+ {
814
+ onLoaded: () => void;
815
+ onFailed: () => void;
816
+ onFreed: () => void;
817
+ }
818
+ >();
819
+
820
+ const coreNodeListeners = new Map<
821
+ CoreNode,
822
+ {
823
+ onLoaded: () => void;
824
+ }
825
+ >();
826
+
827
+ const setupCoreNodeListeners = (coreNode: CoreNode) => {
828
+ const onLoaded = () => {
829
+ this.updateTextNodeDimensions(div, coreNode as CoreTextNode);
830
+ };
831
+ coreNode.on('loaded', onLoaded);
832
+ coreNodeListeners.set(coreNode, { onLoaded });
833
+ };
834
+
835
+ // Helper function to setup texture event listeners
836
+ const setupTextureListeners = (texture: Texture | null) => {
837
+ // Clean up existing listeners first
838
+ textureListeners.forEach((listeners, oldTexture) => {
839
+ oldTexture.off('loaded', listeners.onLoaded);
840
+ oldTexture.off('failed', listeners.onFailed);
841
+ oldTexture.off('freed', listeners.onFreed);
842
+ });
843
+ textureListeners.clear();
844
+
845
+ // Setup new listeners if texture exists
846
+ if (texture) {
847
+ // Initialize metrics if not exists
848
+ if (!this.textureMetrics.has(texture)) {
849
+ this.textureMetrics.set(texture, {
850
+ previousState: texture.state,
851
+ loadedCount: 0,
852
+ failedCount: 0,
853
+ freedCount: 0,
854
+ });
855
+ }
856
+
857
+ const onLoaded = () => {
858
+ const metrics = this.textureMetrics.get(texture);
859
+ if (metrics) {
860
+ metrics.previousState =
861
+ metrics.previousState !== texture.state
862
+ ? metrics.previousState
863
+ : 'loading';
864
+ metrics.loadedCount++;
865
+ }
866
+ this.updateTextureAttributes(div, texture);
867
+ };
868
+ const onFailed = () => {
869
+ const metrics = this.textureMetrics.get(texture);
870
+ if (metrics) {
871
+ metrics.previousState =
872
+ metrics.previousState !== texture.state
873
+ ? metrics.previousState
874
+ : 'loading';
875
+ metrics.failedCount++;
876
+ }
877
+ this.updateTextureAttributes(div, texture);
878
+ };
879
+ const onFreed = () => {
880
+ const metrics = this.textureMetrics.get(texture);
881
+ if (metrics) {
882
+ metrics.previousState =
883
+ metrics.previousState !== texture.state
884
+ ? metrics.previousState
885
+ : texture.state;
886
+ metrics.freedCount++;
887
+ }
888
+ this.updateTextureAttributes(div, texture);
889
+ };
890
+
891
+ texture.on('loaded', onLoaded);
892
+ texture.on('failed', onFailed);
893
+ texture.on('freed', onFreed);
894
+
895
+ textureListeners.set(texture, { onLoaded, onFailed, onFreed });
896
+ }
897
+ };
788
898
  // Define traps for each property in knownProperties
789
899
  knownProperties.forEach((property) => {
790
900
  let originalProp = Object.getOwnPropertyDescriptor(node, property);
@@ -799,6 +909,10 @@ export class Inspector {
799
909
  return;
800
910
  }
801
911
 
912
+ if (property === 'text') {
913
+ setupCoreNodeListeners(node);
914
+ }
915
+
802
916
  Object.defineProperty(node, property, {
803
917
  get() {
804
918
  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
@@ -815,6 +929,15 @@ export class Inspector {
815
929
  value,
816
930
  node.props,
817
931
  );
932
+
933
+ // Setup texture event listeners if this is a texture property
934
+ if (property === 'texture') {
935
+ const textureValue =
936
+ value && typeof value === 'object' && 'state' in value
937
+ ? (value as Texture)
938
+ : null;
939
+ setupTextureListeners(textureValue);
940
+ }
818
941
  },
819
942
  configurable: true,
820
943
  enumerable: true,
@@ -824,6 +947,21 @@ export class Inspector {
824
947
  const originalDestroy = node.destroy;
825
948
  Object.defineProperty(node, 'destroy', {
826
949
  value: () => {
950
+ // Clean up texture event listeners and metrics
951
+ textureListeners.forEach((listeners, texture) => {
952
+ texture.off('loaded', listeners.onLoaded);
953
+ texture.off('failed', listeners.onFailed);
954
+ texture.off('freed', listeners.onFreed);
955
+ // Clean up metrics for this texture
956
+ this.textureMetrics.delete(texture);
957
+ });
958
+ textureListeners.clear();
959
+
960
+ coreNodeListeners.forEach((listeners, coreNode) => {
961
+ coreNode.off('loaded', listeners.onLoaded);
962
+ });
963
+ coreNodeListeners.clear();
964
+
827
965
  this.destroyNode(node.id);
828
966
  originalDestroy.call(node);
829
967
  },
@@ -853,6 +991,86 @@ export class Inspector {
853
991
  return node;
854
992
  }
855
993
 
994
+ updateTextNodeDimensions(div: HTMLElement, node: CoreTextNode) {
995
+ const textMetrics = node.renderInfo;
996
+ if (textMetrics) {
997
+ div.style.width = `${textMetrics.width}px`;
998
+ div.style.height = `${textMetrics.height}px`;
999
+ } else {
1000
+ div.style.removeProperty('width');
1001
+ div.style.removeProperty('height');
1002
+ }
1003
+ }
1004
+
1005
+ updateTextureAttributes(div: HTMLElement, texture: Texture) {
1006
+ // Update texture state
1007
+ div.setAttribute('data-texture-state', texture.state);
1008
+
1009
+ // Update texture type
1010
+ div.setAttribute(
1011
+ 'data-texture-type',
1012
+ textureTypeNames[texture.type] || 'unknown',
1013
+ );
1014
+
1015
+ // Update texture dimensions if available
1016
+ if (texture.dimensions) {
1017
+ div.setAttribute('data-texture-width', String(texture.dimensions.w));
1018
+ div.setAttribute('data-texture-height', String(texture.dimensions.h));
1019
+ } else {
1020
+ div.removeAttribute('data-texture-width');
1021
+ div.removeAttribute('data-texture-height');
1022
+ }
1023
+
1024
+ // Update renderable owners count
1025
+ div.setAttribute(
1026
+ 'data-texture-owners',
1027
+ String(texture.renderableOwners.length),
1028
+ );
1029
+
1030
+ // Update retry count
1031
+ div.setAttribute('data-texture-retry-count', String(texture.retryCount));
1032
+
1033
+ // Update max retry count if available
1034
+ if (texture.maxRetryCount !== null) {
1035
+ div.setAttribute(
1036
+ 'data-texture-max-retry-count',
1037
+ String(texture.maxRetryCount),
1038
+ );
1039
+ } else {
1040
+ div.removeAttribute('data-texture-max-retry-count');
1041
+ }
1042
+
1043
+ // Update metrics if available
1044
+ const metrics = this.textureMetrics.get(texture);
1045
+ if (metrics) {
1046
+ div.setAttribute('data-texture-previous-state', metrics.previousState);
1047
+ div.setAttribute(
1048
+ 'data-texture-loaded-count',
1049
+ String(metrics.loadedCount),
1050
+ );
1051
+ div.setAttribute(
1052
+ 'data-texture-failed-count',
1053
+ String(metrics.failedCount),
1054
+ );
1055
+ div.setAttribute('data-texture-freed-count', String(metrics.freedCount));
1056
+ } else {
1057
+ div.removeAttribute('data-texture-previous-state');
1058
+ div.removeAttribute('data-texture-loaded-count');
1059
+ div.removeAttribute('data-texture-failed-count');
1060
+ div.removeAttribute('data-texture-freed-count');
1061
+ }
1062
+
1063
+ // Update error information if present
1064
+ if (texture.error) {
1065
+ div.setAttribute(
1066
+ 'data-texture-error',
1067
+ texture.error.code || texture.error.message,
1068
+ );
1069
+ } else {
1070
+ div.removeAttribute('data-texture-error');
1071
+ }
1072
+ }
1073
+
856
1074
  public destroy() {
857
1075
  // Stop animation stats timer
858
1076
  this.stopAnimationStatsTimer();
@@ -238,6 +238,17 @@ export interface RendererRuntimeSettings {
238
238
  */
239
239
  fpsUpdateInterval: number;
240
240
 
241
+ /**
242
+ * Clears the render buffer on reset
243
+ *
244
+ * @remarks
245
+ * If false, the renderer will not clear the buffer before rendering a new frame.
246
+ * This is useful if you want to preserve the previous frame.
247
+ *
248
+ * @defaultValue `true`
249
+ */
250
+ enableClear: boolean;
251
+
241
252
  /**
242
253
  * DOM Inspector
243
254
  *
@@ -525,6 +536,7 @@ export class RendererMain extends EventEmitter {
525
536
  settings.devicePhysicalPixelRatio || window.devicePixelRatio || 1,
526
537
  clearColor: settings.clearColor ?? 0x00000000,
527
538
  fpsUpdateInterval: settings.fpsUpdateInterval || 0,
539
+ enableClear: settings.enableClear ?? true,
528
540
  targetFPS: settings.targetFPS || 0,
529
541
  numImageWorkers:
530
542
  settings.numImageWorkers !== undefined ? settings.numImageWorkers : 2,
@@ -586,6 +598,7 @@ export class RendererMain extends EventEmitter {
586
598
  enableContextSpy: settings.enableContextSpy!,
587
599
  forceWebGL2: settings.forceWebGL2!,
588
600
  fpsUpdateInterval: settings.fpsUpdateInterval!,
601
+ enableClear: settings.enableClear!,
589
602
  numImageWorkers: settings.numImageWorkers!,
590
603
  renderEngine: settings.renderEngine!,
591
604
  textureMemory: resolvedTxSettings,
@@ -1 +0,0 @@
1
- {"fileNames":[],"fileInfos":[],"root":[],"options":{"allowJs":true,"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"experimentalDecorators":true,"module":100,"noImplicitAny":false,"noImplicitOverride":true,"noUncheckedIndexedAccess":true,"outDir":"./","rootDir":"..","sourceMap":true,"strict":true,"target":9,"verbatimModuleSyntax":true},"version":"5.9.2"}
@@ -1,170 +0,0 @@
1
- /*
2
- * If not stated otherwise in this file or this component's LICENSE file the
3
- * following copyright and licenses apply:
4
- *
5
- * Copyright 2023 Comcast Cable Communications Management, LLC.
6
- *
7
- * Licensed under the Apache License, Version 2.0 (the License);
8
- * you may not use this file except in compliance with the License.
9
- * You may obtain a copy of the License at
10
- *
11
- * http://www.apache.org/licenses/LICENSE-2.0
12
- *
13
- * Unless required by applicable law or agreed to in writing, software
14
- * distributed under the License is distributed on an "AS IS" BASIS,
15
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- * See the License for the specific language governing permissions and
17
- * limitations under the License.
18
- */
19
-
20
- import { CoreRenderOp } from '../CoreRenderOp.js';
21
- import type { WebGlCtxTexture } from './WebGlCtxTexture.js';
22
- import type { WebGlRenderer } from './WebGlRenderer.js';
23
- import type { BufferCollection } from './internal/BufferCollection.js';
24
- import type { WebGlShaderNode } from './WebGlShaderNode.js';
25
- import type { QuadOptions } from '../CoreRenderer.js';
26
- import type { CoreTextNode } from '../../CoreTextNode.js';
27
- import type { RectWithValid } from '../../lib/utils.js';
28
- import type { Dimensions } from '../../../common/CommonTypes.js';
29
-
30
- type ReqQuad =
31
- | 'alpha'
32
- | 'shader'
33
- | 'parentHasRenderTexture'
34
- | 'rtt'
35
- | 'clippingRect'
36
- | 'height'
37
- | 'width'
38
- | 'time';
39
- type RenderOpQuadOptions = Pick<QuadOptions, ReqQuad> &
40
- Partial<Omit<QuadOptions, ReqQuad>> & {
41
- sdfShaderProps?: Record<string, unknown>;
42
- sdfBuffers?: BufferCollection;
43
- };
44
-
45
- /**
46
- * Can render multiple quads with multiple textures (up to vertex shader texture limit)
47
- *
48
- */
49
- export class WebGlRenderOp extends CoreRenderOp {
50
- numQuads = 0;
51
- textures: WebGlCtxTexture[] = [];
52
-
53
- /**
54
- * need to improve this when TextRenderers are refactored
55
- */
56
- readonly sdfShaderProps: Record<string, unknown> | undefined;
57
- readonly sdfNode: CoreTextNode | undefined;
58
- readonly maxTextures: number;
59
- readonly buffers: BufferCollection;
60
- readonly shader: WebGlShaderNode;
61
- readonly width: number;
62
- readonly height: number;
63
- readonly clippingRect: RectWithValid;
64
- readonly rtt: boolean;
65
- readonly parentHasRenderTexture: boolean;
66
- readonly framebufferDimensions: Dimensions | null;
67
- readonly alpha: number;
68
- readonly pixelRatio: number;
69
- readonly time?: number | null;
70
-
71
- constructor(
72
- readonly renderer: WebGlRenderer,
73
- quad: RenderOpQuadOptions,
74
- readonly bufferIdx: number,
75
- ) {
76
- super();
77
- this.buffers = quad.sdfBuffers || renderer.quadBufferCollection;
78
- this.shader = quad.shader as WebGlShaderNode;
79
- this.width = quad.width;
80
- this.height = quad.height;
81
- this.clippingRect = quad.clippingRect;
82
- this.parentHasRenderTexture = quad.parentHasRenderTexture;
83
- this.framebufferDimensions = quad.framebufferDimensions || null;
84
- this.rtt = quad.rtt;
85
- this.alpha = quad.alpha;
86
- this.pixelRatio =
87
- this.parentHasRenderTexture === true ? 1 : renderer.stage.pixelRatio;
88
- this.time = quad.time;
89
-
90
- /**
91
- * related to line 51
92
- */
93
- this.sdfShaderProps = quad.sdfShaderProps;
94
-
95
- this.maxTextures = this.shader.program.supportsIndexedTextures
96
- ? (renderer.glw.getParameter(
97
- renderer.glw.MAX_VERTEX_TEXTURE_IMAGE_UNITS,
98
- ) as number)
99
- : 1;
100
- }
101
-
102
- addTexture(texture: WebGlCtxTexture): number {
103
- const { textures, maxTextures } = this;
104
- let existingIdx = -1;
105
- const texturesLength = textures.length;
106
- for (let i = 0; i < texturesLength; i++) {
107
- const t = textures[i];
108
- if (t === texture) {
109
- existingIdx = i;
110
- break;
111
- }
112
- }
113
-
114
- if (existingIdx !== -1) {
115
- return existingIdx;
116
- }
117
-
118
- if (texturesLength >= maxTextures) {
119
- return 0xffffffff;
120
- }
121
- this.textures.push(texture);
122
- return texturesLength;
123
- }
124
-
125
- draw() {
126
- const { glw, options, stage } = this.renderer;
127
-
128
- stage.shManager.useShader(this.shader.program);
129
- this.shader.program.bindRenderOp(this);
130
-
131
- // Clipping
132
- if (this.clippingRect.valid === true) {
133
- const clipX = Math.round(this.clippingRect.x * this.pixelRatio);
134
- const clipWidth = Math.round(this.clippingRect.width * this.pixelRatio);
135
- const clipHeight = Math.round(this.clippingRect.height * this.pixelRatio);
136
- let clipY = Math.round(
137
- options.canvas.height -
138
- clipHeight -
139
- this.clippingRect.y * this.pixelRatio,
140
- );
141
- // if parent has render texture, we need to adjust the scissor rect
142
- // to be relative to the parent's framebuffer
143
- if (this.parentHasRenderTexture) {
144
- clipY = this.framebufferDimensions
145
- ? this.framebufferDimensions.h - this.height
146
- : 0;
147
- }
148
-
149
- glw.setScissorTest(true);
150
- glw.scissor(clipX, clipY, clipWidth, clipHeight);
151
- } else {
152
- glw.setScissorTest(false);
153
- }
154
-
155
- // Check if this is SDF rendering (has sdfBuffers)
156
- if (this.sdfShaderProps !== undefined) {
157
- // SDF rendering uses drawArrays with explicit triangle vertices (6 vertices per quad)
158
- glw.drawArrays(glw.TRIANGLES, 0, 6 * this.numQuads);
159
- } else {
160
- // Regular rendering uses drawElements with index buffer (4 vertices per quad)
161
- const quadIdx = (this.bufferIdx / 32) * 6 * 2;
162
- glw.drawElements(
163
- glw.TRIANGLES,
164
- 6 * this.numQuads,
165
- glw.UNSIGNED_SHORT,
166
- quadIdx,
167
- );
168
- }
169
- }
170
- }