@lightningjs/renderer 3.0.4 → 3.0.5

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 (206) hide show
  1. package/dist/src/common/EventEmitter.d.ts +7 -4
  2. package/dist/src/common/EventEmitter.js +1 -1
  3. package/dist/src/common/EventEmitter.js.map +1 -1
  4. package/dist/src/core/AutosizeManager.d.ts +29 -0
  5. package/dist/src/core/AutosizeManager.js +169 -0
  6. package/dist/src/core/AutosizeManager.js.map +1 -0
  7. package/dist/src/core/CoreTextNodeCanvas.d.ts +215 -0
  8. package/dist/src/core/CoreTextNodeCanvas.js +236 -0
  9. package/dist/src/core/CoreTextNodeCanvas.js.map +1 -0
  10. package/dist/src/core/Stage.js +10 -0
  11. package/dist/src/core/Stage.js.map +1 -1
  12. package/dist/src/core/TextureMemoryManager.js +4 -3
  13. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  14. package/dist/src/core/animations/Animation.d.ts +21 -0
  15. package/dist/src/core/animations/Animation.js +194 -0
  16. package/dist/src/core/animations/Animation.js.map +1 -0
  17. package/dist/src/core/animations/AnimationManager.d.ts +1 -1
  18. package/dist/src/core/animations/AnimationManager.js +5 -5
  19. package/dist/src/core/animations/AnimationManager.js.map +1 -1
  20. package/dist/src/core/animations/CoreAnimation.d.ts +11 -2
  21. package/dist/src/core/animations/CoreAnimation.js +44 -38
  22. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  23. package/dist/src/core/animations/CoreAnimationController.d.ts +6 -0
  24. package/dist/src/core/animations/CoreAnimationController.js +16 -3
  25. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  26. package/dist/src/core/animations/Playback.d.ts +64 -0
  27. package/dist/src/core/animations/Playback.js +169 -0
  28. package/dist/src/core/animations/Playback.js.map +1 -0
  29. package/dist/src/core/animations/Ticker.d.ts +71 -0
  30. package/dist/src/core/animations/Ticker.js +89 -0
  31. package/dist/src/core/animations/Ticker.js.map +1 -0
  32. package/dist/src/core/animations/Transition.d.ts +38 -0
  33. package/dist/src/core/animations/Transition.js +35 -0
  34. package/dist/src/core/animations/Transition.js.map +1 -0
  35. package/dist/src/core/animations/TransitionsController.d.ts +10 -0
  36. package/dist/src/core/animations/TransitionsController.js +39 -0
  37. package/dist/src/core/animations/TransitionsController.js.map +1 -0
  38. package/dist/src/core/animations/utils.d.ts +2 -0
  39. package/dist/src/core/animations/utils.js +136 -0
  40. package/dist/src/core/animations/utils.js.map +1 -0
  41. package/dist/src/core/lib/ImageWorker.d.ts +2 -2
  42. package/dist/src/core/lib/ImageWorker.js +11 -30
  43. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  44. package/dist/src/core/lib/WebGlContextWrapper.d.ts +5 -16
  45. package/dist/src/core/lib/WebGlContextWrapper.js +1 -35
  46. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  47. package/dist/src/core/lib/textureCompression.d.ts +2 -14
  48. package/dist/src/core/lib/textureCompression.js +67 -320
  49. package/dist/src/core/lib/textureCompression.js.map +1 -1
  50. package/dist/src/core/platform.js +9 -38
  51. package/dist/src/core/platform.js.map +1 -1
  52. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +0 -1
  53. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +3 -11
  54. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -1
  55. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +1 -2
  56. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +11 -16
  57. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -1
  58. package/dist/src/core/renderers/canvas/CanvasRenderer.js +14 -1
  59. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  60. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +1 -1
  61. package/dist/src/core/renderers/canvas/CanvasTexture.js +16 -6
  62. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -1
  63. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +0 -13
  64. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +192 -113
  65. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +1 -1
  66. package/dist/src/core/renderers/canvas/internal/ColorUtils.d.ts +2 -0
  67. package/dist/src/core/renderers/canvas/internal/ColorUtils.js +14 -0
  68. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +1 -1
  69. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.d.ts +1 -2
  70. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +5 -12
  71. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +1 -1
  72. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +6 -18
  73. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +60 -102
  74. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  75. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +1 -1
  76. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +1 -3
  77. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +31 -74
  78. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  79. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +7 -2
  80. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +50 -21
  81. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -1
  82. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +2 -3
  83. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +1 -3
  84. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +1 -1
  85. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +1 -0
  86. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +23 -0
  87. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  88. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +2 -2
  89. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  90. package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +1 -0
  91. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  92. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +6 -3
  93. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +1 -1
  94. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +11 -0
  95. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +1 -1
  96. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +10 -5
  97. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
  98. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +10 -5
  99. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -1
  100. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +12 -0
  101. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -1
  102. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +1 -1
  103. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +1 -1
  104. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +1 -1
  105. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +1 -1
  106. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +2 -2
  107. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +5 -5
  108. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +1 -1
  109. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +1 -0
  110. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +30 -14
  111. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
  112. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +0 -1
  113. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +3 -13
  114. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -1
  115. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +1 -1
  116. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +5 -5
  117. package/dist/src/core/shaders/webgl/SdfShadowShader.d.ts +9 -0
  118. package/dist/src/core/shaders/webgl/SdfShadowShader.js +100 -0
  119. package/dist/src/core/shaders/webgl/SdfShadowShader.js.map +1 -0
  120. package/dist/src/core/text-rendering/CanvasFont.d.ts +1 -1
  121. package/dist/src/core/text-rendering/CanvasFont.js +7 -16
  122. package/dist/src/core/text-rendering/CanvasFont.js.map +1 -1
  123. package/dist/src/core/text-rendering/CoreFont.d.ts +1 -1
  124. package/dist/src/core/text-rendering/CoreFont.js +1 -1
  125. package/dist/src/core/text-rendering/CoreFont.js.map +1 -1
  126. package/dist/src/core/text-rendering/FontManager.js +2 -1
  127. package/dist/src/core/text-rendering/FontManager.js.map +1 -1
  128. package/dist/src/core/text-rendering/canvas/Settings.d.ts +64 -0
  129. package/dist/src/core/text-rendering/canvas/Settings.js +20 -0
  130. package/dist/src/core/text-rendering/canvas/Settings.js.map +1 -0
  131. package/dist/src/core/text-rendering/canvas/Utils.d.ts +20 -0
  132. package/dist/src/core/text-rendering/canvas/Utils.js +144 -0
  133. package/dist/src/core/text-rendering/canvas/Utils.js.map +1 -0
  134. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.d.ts +60 -0
  135. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js +183 -0
  136. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js.map +1 -0
  137. package/dist/src/core/text-rendering/canvas/draw.d.ts +5 -0
  138. package/dist/src/core/text-rendering/canvas/draw.js +132 -0
  139. package/dist/src/core/text-rendering/canvas/draw.js.map +1 -0
  140. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +2 -2
  141. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
  142. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +3 -4
  143. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +46 -98
  144. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  145. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +1 -1
  146. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +2 -2
  147. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +66 -8
  148. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
  149. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +1 -1
  150. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +1 -1
  151. package/dist/src/core/text-rendering/renderers/canvas/CanvasTextRenderer.d.ts +26 -0
  152. package/dist/src/core/text-rendering/renderers/canvas/CanvasTextRenderer.js +158 -0
  153. package/dist/src/core/text-rendering/renderers/canvas/CanvasTextRenderer.js.map +1 -0
  154. package/dist/src/core/text-rendering/renderers/canvas/internal/draw.d.ts +5 -0
  155. package/dist/src/core/text-rendering/renderers/canvas/internal/draw.js +127 -0
  156. package/dist/src/core/text-rendering/renderers/canvas/internal/draw.js.map +1 -0
  157. package/dist/src/core/text-rendering/renderers/canvas/internal/mergeDefaults.d.ts +2 -0
  158. package/dist/src/core/text-rendering/renderers/canvas/internal/mergeDefaults.js +50 -0
  159. package/dist/src/core/text-rendering/renderers/canvas/internal/mergeDefaults.js.map +1 -0
  160. package/dist/src/core/text-rendering/renderers/canvas/internal/renderInfo.d.ts +33 -0
  161. package/dist/src/core/text-rendering/renderers/canvas/internal/renderInfo.js +192 -0
  162. package/dist/src/core/text-rendering/renderers/canvas/internal/renderInfo.js.map +1 -0
  163. package/dist/src/core/text-rendering/renderers/canvas/internal/types.d.ts +66 -0
  164. package/dist/src/core/text-rendering/renderers/canvas/internal/types.js +2 -0
  165. package/dist/src/core/text-rendering/renderers/canvas/internal/types.js.map +1 -0
  166. package/dist/src/core/text-rendering/renderers/canvas/internal/utils.d.ts +91 -0
  167. package/dist/src/core/text-rendering/renderers/canvas/internal/utils.js +282 -0
  168. package/dist/src/core/text-rendering/renderers/canvas/internal/utils.js.map +1 -0
  169. package/dist/src/core/text-rendering/sdf/PeekableGenerator.d.ts +12 -0
  170. package/dist/src/core/text-rendering/sdf/PeekableGenerator.js +61 -0
  171. package/dist/src/core/text-rendering/sdf/PeekableGenerator.js.map +1 -0
  172. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.d.ts +45 -0
  173. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.js +69 -0
  174. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.js.map +1 -0
  175. package/dist/src/core/text-rendering/sdf/Utils.d.ts +26 -0
  176. package/dist/src/core/text-rendering/sdf/Utils.js +301 -0
  177. package/dist/src/core/text-rendering/sdf/Utils.js.map +1 -0
  178. package/dist/src/core/text-rendering/sdf/index.d.ts +1 -0
  179. package/dist/src/core/text-rendering/sdf/index.js +20 -0
  180. package/dist/src/core/text-rendering/sdf/index.js.map +1 -0
  181. package/dist/src/core/textures/ImageTexture.js +11 -0
  182. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  183. package/dist/src/core/textures/Texture.js +5 -0
  184. package/dist/src/core/textures/Texture.js.map +1 -1
  185. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  186. package/dist/tsconfig.tsbuildinfo +1 -0
  187. package/package.json +1 -1
  188. package/src/common/EventEmitter.ts +6 -8
  189. package/src/core/Stage.ts +11 -0
  190. package/src/core/TextureMemoryManager.ts +4 -3
  191. package/src/core/animations/AnimationManager.ts +5 -5
  192. package/src/core/animations/CoreAnimation.ts +61 -45
  193. package/src/core/animations/CoreAnimationController.ts +16 -7
  194. package/src/core/renderers/canvas/CanvasRenderer.ts +19 -1
  195. package/src/core/renderers/canvas/CanvasTexture.ts +23 -8
  196. package/src/core/renderers/webgl/WebGlShaderNode.ts +24 -0
  197. package/src/core/renderers/webgl/WebGlShaderProgram.ts +3 -3
  198. package/src/core/renderers/webgl/internal/ShaderUtils.ts +1 -0
  199. package/src/core/textures/ImageTexture.ts +18 -0
  200. package/src/core/textures/Texture.ts +6 -0
  201. package/dist/src/core/lib/fps.d.ts +0 -15
  202. package/dist/src/core/lib/fps.js +0 -62
  203. package/dist/src/core/lib/fps.js.map +0 -1
  204. package/dist/src/core/text-rendering/TextGenerator.d.ts +0 -10
  205. package/dist/src/core/text-rendering/TextGenerator.js +0 -36
  206. package/dist/src/core/text-rendering/TextGenerator.js.map +0 -1
@@ -83,7 +83,19 @@ export class CanvasRenderer extends CoreRenderer {
83
83
  }
84
84
 
85
85
  const hasTransform = ta !== 1;
86
- const hasClipping = clippingRect.w !== 0 && clippingRect.h !== 0;
86
+ const clippingValid = clippingRect.valid === true;
87
+
88
+ // If the clipping rect is valid but zero-area, the node is fully clipped — skip rendering
89
+ if (
90
+ clippingValid === true &&
91
+ clippingRect.w === 0 &&
92
+ clippingRect.h === 0
93
+ ) {
94
+ return;
95
+ }
96
+
97
+ const hasClipping =
98
+ clippingValid === true && clippingRect.w !== 0 && clippingRect.h !== 0;
87
99
  const shader = node.props.shader;
88
100
  const hasShader = shader !== null;
89
101
 
@@ -146,6 +158,9 @@ export class CanvasRenderer extends CoreRenderer {
146
158
  const tintColor = parseColor(color);
147
159
  if (textureType !== TextureType.subTexture) {
148
160
  const image = (texture.ctxTexture as CanvasTexture).getImage(tintColor);
161
+ if (image === null) {
162
+ return;
163
+ }
149
164
  this.context.globalAlpha = tintColor.a ?? node.worldAlpha;
150
165
  this.context.drawImage(image, tx, ty, width, height);
151
166
  this.context.globalAlpha = 1;
@@ -154,6 +169,9 @@ export class CanvasRenderer extends CoreRenderer {
154
169
  const image = (
155
170
  (texture as SubTexture).parentTexture.ctxTexture as CanvasTexture
156
171
  ).getImage(tintColor);
172
+ if (image === null) {
173
+ return;
174
+ }
157
175
  const props = (texture as SubTexture).props;
158
176
 
159
177
  this.context.globalAlpha = tintColor.a ?? node.worldAlpha;
@@ -21,6 +21,7 @@ import type { Dimensions } from '../../../common/CommonTypes.js';
21
21
  import { assertTruthy } from '../../../utils.js';
22
22
  import { formatRgba, type IParsedColor } from '../../lib/colorParser.js';
23
23
  import { CoreContextTexture } from '../CoreContextTexture.js';
24
+ import type { Texture } from '../../textures/Texture.js';
24
25
 
25
26
  export class CanvasTexture extends CoreContextTexture {
26
27
  protected image:
@@ -36,10 +37,23 @@ export class CanvasTexture extends CoreContextTexture {
36
37
  | undefined;
37
38
 
38
39
  async load(): Promise<void> {
40
+ // Capture textureData synchronously before any await - a pending
41
+ // freeTextureDataTask microtask could null textureSource.textureData
42
+ // during the first async suspension, causing onLoadRequest to fail.
43
+ const textureData = this.textureSource.textureData;
44
+ assertTruthy(textureData?.data, 'Texture data is null before load');
45
+
39
46
  this.textureSource.setState('loading');
40
47
 
41
48
  try {
42
- const size = await this.onLoadRequest();
49
+ const size = await this.onLoadRequest(textureData.data);
50
+
51
+ // Guard against the texture being freed while the load was in flight
52
+ if (this.textureSource.state === 'freed') {
53
+ this.image = undefined;
54
+ return;
55
+ }
56
+
43
57
  this.textureSource.setState('loaded', size);
44
58
  this.textureSource.freeTextureData();
45
59
  this.updateMemSize();
@@ -82,9 +96,11 @@ export class CanvasTexture extends CoreContextTexture {
82
96
 
83
97
  getImage(
84
98
  color: IParsedColor,
85
- ): ImageBitmap | HTMLCanvasElement | HTMLImageElement {
99
+ ): ImageBitmap | HTMLCanvasElement | HTMLImageElement | null {
86
100
  const image = this.image;
87
- assertTruthy(image, 'Attempt to get unloaded image texture');
101
+ if (image === undefined) {
102
+ return null;
103
+ }
88
104
 
89
105
  if (color.isWhite) {
90
106
  if (this.tintCache) {
@@ -133,10 +149,9 @@ export class CanvasTexture extends CoreContextTexture {
133
149
  return canvas;
134
150
  }
135
151
 
136
- private async onLoadRequest(): Promise<Dimensions> {
137
- assertTruthy(this.textureSource?.textureData?.data, 'Texture data is null');
138
- const { data } = this.textureSource.textureData;
139
-
152
+ private async onLoadRequest(
153
+ data: NonNullable<NonNullable<Texture['textureData']>['data']>,
154
+ ): Promise<Dimensions> {
140
155
  // TODO: canvas from text renderer should be able to provide the canvas directly
141
156
  // instead of having to re-draw it into a new canvas...
142
157
  if (data instanceof ImageData) {
@@ -144,7 +159,7 @@ export class CanvasTexture extends CoreContextTexture {
144
159
  canvas.width = data.width;
145
160
  canvas.height = data.height;
146
161
  const ctx = canvas.getContext('2d');
147
- if (ctx) ctx.putImageData(data, 0, 0);
162
+ if (ctx !== null) ctx.putImageData(data, 0, 0);
148
163
  this.image = canvas;
149
164
  return { w: data.width, h: data.height };
150
165
  } else if (
@@ -62,6 +62,7 @@ export class WebGlShaderNode<
62
62
  undefined;
63
63
  private valueKey: string = '';
64
64
  uniforms: UniformCollection = {
65
+ hasStoredUniforms: false,
65
66
  single: {},
66
67
  vec2: {},
67
68
  vec3: {},
@@ -83,6 +84,7 @@ export class WebGlShaderNode<
83
84
  this.update = () => {
84
85
  if (this.props === undefined) {
85
86
  this.updater!(this.node as CoreNode, this.props);
87
+ this.updateUniformUsage();
86
88
  return;
87
89
  }
88
90
 
@@ -106,12 +108,14 @@ export class WebGlShaderNode<
106
108
  }
107
109
  //create empty uniform collection when calculating new values
108
110
  this.uniforms = {
111
+ hasStoredUniforms: false,
109
112
  single: {},
110
113
  vec2: {},
111
114
  vec3: {},
112
115
  vec4: {},
113
116
  };
114
117
  this.updater!(this.node as CoreNode);
118
+ this.updateUniformUsage();
115
119
  stage.shManager.setShaderValues(
116
120
  this.valueKey,
117
121
  this.uniforms as unknown as Record<string, unknown>,
@@ -120,6 +124,26 @@ export class WebGlShaderNode<
120
124
  }
121
125
  }
122
126
 
127
+ updateUniformUsage(): void {
128
+ for (const _ in this.uniforms.single) {
129
+ this.uniforms.hasStoredUniforms = true;
130
+ return;
131
+ }
132
+ for (const _ in this.uniforms.vec2) {
133
+ this.uniforms.hasStoredUniforms = true;
134
+ return;
135
+ }
136
+ for (const _ in this.uniforms.vec3) {
137
+ this.uniforms.hasStoredUniforms = true;
138
+ return;
139
+ }
140
+ for (const _ in this.uniforms.vec4) {
141
+ this.uniforms.hasStoredUniforms = true;
142
+ return;
143
+ }
144
+ this.uniforms.hasStoredUniforms = false;
145
+ }
146
+
123
147
  /**
124
148
  * Sets the value of a RGBA variable
125
149
  * @param location
@@ -258,12 +258,12 @@ export class WebGlShaderProgram implements CoreShaderProgram {
258
258
  }
259
259
 
260
260
  const shader = renderOp.shader as WebGlShaderNode;
261
- if (shader.props !== undefined) {
261
+ const uniforms = shader.uniforms;
262
+
263
+ if (uniforms.hasStoredUniforms === true) {
262
264
  /**
263
265
  * loop over all precalculated uniform types
264
266
  */
265
- const uniforms = shader.uniforms;
266
-
267
267
  for (const key in uniforms.single) {
268
268
  const { method, value } = uniforms.single[key]!;
269
269
  this.glw[method as keyof UniformSet1Param](key, value as never);
@@ -42,6 +42,7 @@ export type Vec4 = [number, number, number, number];
42
42
  export type UniformValue = SingleValue | Vec2 | Vec3 | Vec4;
43
43
 
44
44
  export interface UniformCollection {
45
+ hasStoredUniforms: boolean;
45
46
  single: Record<string, Uniform<SingleValue>>;
46
47
  vec2: Record<string, Uniform<Vec2>>;
47
48
  vec3: Record<string, Uniform<Vec3>>;
@@ -143,6 +143,24 @@ export class ImageTexture extends Texture {
143
143
  }
144
144
 
145
145
  override async getTextureSource(): Promise<TextureData> {
146
+ // Compressed textures are not supported by the Canvas2D renderer.
147
+ // Fail fast here before incurring a network fetch or binary decode.
148
+ if (this.txManager.renderer?.mode === 'canvas') {
149
+ const { src, type } = this.props;
150
+ if (
151
+ type === 'compressed' ||
152
+ (typeof src === 'string' && isCompressedTextureContainer(src) === true)
153
+ ) {
154
+ const err = new Error(
155
+ `ImageTexture: Compressed textures are not supported in Canvas2D render mode (src: ${String(
156
+ src,
157
+ )})`,
158
+ );
159
+ this.setState('failed', err);
160
+ return { data: null };
161
+ }
162
+ }
163
+
146
164
  let resp: TextureData;
147
165
  try {
148
166
  resp = await this.determineImageTypeAndLoadImage();
@@ -252,6 +252,11 @@ export abstract class Texture extends EventEmitter {
252
252
  return false;
253
253
  }
254
254
 
255
+ // Don't cleanup a texture that is in the process of loading
256
+ if (this.state === 'loading') {
257
+ return false;
258
+ }
259
+
255
260
  // Don't cleanup if not renderable
256
261
  if (this.renderable === true) {
257
262
  return false;
@@ -353,6 +358,7 @@ export abstract class Texture extends EventEmitter {
353
358
  */
354
359
  free(): void {
355
360
  this.ctxTexture?.free();
361
+ this.ctxTexture = undefined;
356
362
  }
357
363
 
358
364
  /**
@@ -1,15 +0,0 @@
1
- /**
2
- * Class that keeps track of the invocations of Context methods when
3
- * the `enableContextSpy` renderer option is enabled.
4
- */
5
- export interface FrameCounter {
6
- start: number;
7
- end: number;
8
- frameCount: number;
9
- frames: Record<number | string, number>;
10
- increment: (frameDelta: number) => void;
11
- get averageFps(): number;
12
- }
13
- export declare function setFrameBuckets(newBuckets: number[]): void;
14
- export declare function setFpsInterval(newInterval: number): void;
15
- export declare function createFrameCounter(frameTime: number): FrameCounter;
@@ -1,62 +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
- let buckets = [20, 40, 60, 80, 100];
20
- let overflowBucketLabel = '>' + buckets[buckets.length - 1];
21
- let fpsInterval = 1000; // 1 second
22
- const frameCounter = {
23
- start: 0,
24
- end: 0,
25
- frameCount: 0,
26
- frames: {},
27
- increment(frameDelta) {
28
- this.frameCount++;
29
- for (let i = 0; i < buckets.length; i++) {
30
- const bucket = buckets[i];
31
- if (frameDelta <= bucket) {
32
- this.frames[bucket]++;
33
- return;
34
- }
35
- }
36
- this.frames[overflowBucketLabel]++;
37
- },
38
- get averageFps() {
39
- //calculate fps based on frame count and elapsed time
40
- return this.frameCount / (this.end - this.start) * 1000;
41
- }
42
- };
43
- export function setFrameBuckets(newBuckets) {
44
- buckets = newBuckets;
45
- overflowBucketLabel = '>' + buckets[buckets.length - 1];
46
- }
47
- export function setFpsInterval(newInterval) {
48
- fpsInterval = newInterval;
49
- }
50
- export function createFrameCounter(frameTime) {
51
- const counter = Object.create(frameCounter);
52
- counter.start = frameTime;
53
- counter.end = frameTime + fpsInterval;
54
- //fill frames with 0 for each bucket
55
- for (let i = 0; i < buckets.length; i++) {
56
- const bucket = buckets[i];
57
- counter.frames[bucket] = 0;
58
- }
59
- counter.frames[overflowBucketLabel] = 0;
60
- return counter;
61
- }
62
- //# sourceMappingURL=fps.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fps.js","sourceRoot":"","sources":["../../../../src/core/lib/fps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAgBH,IAAI,OAAO,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;AACpC,IAAI,mBAAmB,GAAG,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC5D,IAAI,WAAW,GAAG,IAAI,CAAC,CAAC,WAAW;AAEnC,MAAM,YAAY,GAAkB;IAClC,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,UAAU,EAAE,CAAC;IACb,MAAM,EAAE,EAAE;IACV,SAAS,CAAC,UAAkB;QAC1B,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAW,CAAC;YACpC,IAAI,UAAU,IAAI,MAAM,EAAE,CAAC;gBACzB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAE,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;QACH,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAE,EAAE,CAAC;IACtC,CAAC;IACD,IAAI,UAAU;QACZ,qDAAqD;QACrD,OAAO,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAC1D,CAAC;CACF,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,UAAoB;IAClD,OAAO,GAAG,UAAU,CAAC;IACrB,mBAAmB,GAAG,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,WAAW,GAAG,WAAW,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAiB,CAAC;IAC5D,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,GAAG,GAAG,SAAS,GAAG,WAAW,CAAC;IACtC,oCAAoC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAW,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACxC,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,10 +0,0 @@
1
- import type { Stage } from "../Stage";
2
- import type { FontLoadOptions, TextRenderer, TextRenderers } from "./TextRenderer";
3
- export default class TextGenerator {
4
- readonly stage: Stage;
5
- private layoutCache;
6
- fontEngines: Record<string, TextRenderer>;
7
- constructor(stage: Stage, fontEngines: TextRenderer[]);
8
- loadFont(rendererType: TextRenderers, options: FontLoadOptions): any;
9
- destroy(): void;
10
- }
@@ -1,36 +0,0 @@
1
- export default class TextGenerator {
2
- stage;
3
- layoutCache = new Map();
4
- fontEngines = {};
5
- constructor(stage, fontEngines) {
6
- this.stage = stage;
7
- if (stage.renderer.mode === 'canvas') {
8
- //filter out SDF renderer if the main renderer is canvas, since SDF rendering is not supported in that case
9
- fontEngines = fontEngines.filter(engine => {
10
- if (engine.type === 'canvas') {
11
- return true;
12
- }
13
- console.warn(`SDF text rendering is not supported in canvas mode. The SDF text renderer will be ignored.`);
14
- return false;
15
- });
16
- }
17
- for (let i = 0; i < fontEngines.length; i++) {
18
- const engine = fontEngines[i];
19
- this.fontEngines[engine.type] = engine;
20
- engine.init(stage);
21
- }
22
- }
23
- loadFont(rendererType, options) {
24
- const rendererTypeKey = String(rendererType);
25
- const fontEngine = this.fontEngines[rendererTypeKey];
26
- if (fontEngine === undefined) {
27
- throw new Error(`Font handler for renderer type '${rendererTypeKey}' not found. Available types: ${Object.keys(this.fontEngines).join(', ')}`);
28
- }
29
- return fontEngine.font.loadFont(this.stage, options);
30
- }
31
- destroy() {
32
- // Clean up resources if necessary
33
- this.layoutCache.clear();
34
- }
35
- }
36
- //# sourceMappingURL=TextGenerator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TextGenerator.js","sourceRoot":"","sources":["../../../../src/core/text-rendering/TextGenerator.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,OAAO,aAAa;IAKX;IAJb,WAAW,GAA4B,IAAI,GAAG,EAAE,CAAC;IAEzD,WAAW,GAAiC,EAAE,CAAC;IAE/C,YAAqB,KAAY,EAAE,WAA2B;QAAzC,UAAK,GAAL,KAAK,CAAO;QAC/B,IAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpC,2GAA2G;YAC3G,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;gBACxC,IAAG,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC5B,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,4FAA4F,CAAC,CAAC;gBAC3G,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC;QAED,KAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAE,CAAC;YAC/B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAGD,QAAQ,CAAC,YAA2B,EAAE,OAAwB;QAC5D,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QAErD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACb,mCAAmC,eAAe,iCAAiC,MAAM,CAAC,IAAI,CAC5F,IAAI,CAAC,WAAW,CACjB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACf,CAAC;QACJ,CAAC;QAED,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,OAAO;QAEL,kCAAkC;QAClC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;CACF"}