@lightningjs/renderer 3.0.0-beta7 → 3.0.0-beta8

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 (231) hide show
  1. package/dist/exports/utils.d.ts +2 -1
  2. package/dist/exports/utils.js +2 -1
  3. package/dist/exports/utils.js.map +1 -1
  4. package/dist/src/core/CoreNode.d.ts +24 -49
  5. package/dist/src/core/CoreNode.js +251 -255
  6. package/dist/src/core/CoreNode.js.map +1 -1
  7. package/dist/src/core/CoreTextNode.d.ts +1 -1
  8. package/dist/src/core/CoreTextNode.js +14 -15
  9. package/dist/src/core/CoreTextNode.js.map +1 -1
  10. package/dist/src/core/CoreTextureManager.js +5 -4
  11. package/dist/src/core/CoreTextureManager.js.map +1 -1
  12. package/dist/src/core/Stage.d.ts +12 -27
  13. package/dist/src/core/Stage.js +50 -37
  14. package/dist/src/core/Stage.js.map +1 -1
  15. package/dist/src/core/TextureMemoryManager.d.ts +9 -0
  16. package/dist/src/core/TextureMemoryManager.js +78 -48
  17. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  18. package/dist/src/core/animations/CoreAnimation.js +5 -0
  19. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  20. package/dist/src/core/animations/CoreAnimationController.d.ts +1 -0
  21. package/dist/src/core/animations/CoreAnimationController.js +7 -1
  22. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  23. package/dist/src/core/renderers/CoreRenderer.d.ts +1 -0
  24. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  25. package/dist/src/core/renderers/CoreShaderNode.d.ts +1 -0
  26. package/dist/src/core/renderers/CoreShaderNode.js +9 -0
  27. package/dist/src/core/renderers/CoreShaderNode.js.map +1 -1
  28. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +1 -0
  29. package/dist/src/core/renderers/canvas/CanvasRenderer.js +3 -0
  30. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  31. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +1 -4
  32. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
  33. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +0 -3
  34. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  35. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +1 -0
  36. package/dist/src/core/renderers/webgl/WebGlRenderer.js +56 -54
  37. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  38. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +1 -4
  39. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  40. package/dist/src/core/shaders/canvas/LinearGradient.js +5 -3
  41. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -1
  42. package/dist/src/core/shaders/canvas/RadialGradient.js +13 -11
  43. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
  44. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +7 -5
  45. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  46. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +10 -8
  47. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
  48. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +7 -5
  49. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
  50. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +1 -1
  51. package/dist/src/core/shaders/templates/BorderTemplate.js +1 -1
  52. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -1
  53. package/dist/src/core/shaders/templates/HolePunchTemplate.js +1 -1
  54. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -1
  55. package/dist/src/core/shaders/templates/RoundedTemplate.js +1 -1
  56. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -1
  57. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +1 -1
  58. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +1 -1
  59. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +1 -1
  60. package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +1 -1
  61. package/dist/src/core/shaders/{templates/shaderUtils.d.ts → utils.d.ts} +1 -1
  62. package/dist/src/core/shaders/{templates/shaderUtils.js → utils.js} +2 -2
  63. package/dist/src/core/shaders/utils.js.map +1 -0
  64. package/dist/src/core/shaders/webgl/HolePunch.js +4 -3
  65. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -1
  66. package/dist/src/core/shaders/webgl/LinearGradient.js +5 -4
  67. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  68. package/dist/src/core/shaders/webgl/RadialGradient.js +6 -5
  69. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  70. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +18 -7
  71. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  72. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +30 -17
  73. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  74. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +0 -50
  75. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  76. package/dist/src/core/textures/ImageTexture.d.ts +1 -1
  77. package/dist/src/core/textures/ImageTexture.js +1 -1
  78. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  79. package/dist/src/core/textures/Texture.d.ts +8 -0
  80. package/dist/src/core/textures/Texture.js +13 -0
  81. package/dist/src/core/textures/Texture.js.map +1 -1
  82. package/dist/src/core/utils.d.ts +1 -1
  83. package/dist/src/main-api/Inspector.d.ts +6 -1
  84. package/dist/src/main-api/Inspector.js +42 -4
  85. package/dist/src/main-api/Inspector.js.map +1 -1
  86. package/dist/src/main-api/Renderer.d.ts +62 -43
  87. package/dist/src/main-api/Renderer.js +119 -31
  88. package/dist/src/main-api/Renderer.js.map +1 -1
  89. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  90. package/exports/utils.ts +7 -1
  91. package/package.json +1 -1
  92. package/src/core/CoreNode.ts +301 -313
  93. package/src/core/CoreTextNode.ts +23 -20
  94. package/src/core/CoreTextureManager.ts +5 -4
  95. package/src/core/Stage.ts +68 -65
  96. package/src/core/TextureMemoryManager.ts +104 -63
  97. package/src/core/animations/CoreAnimation.ts +7 -0
  98. package/src/core/animations/CoreAnimationController.ts +8 -1
  99. package/src/core/renderers/CoreRenderer.ts +1 -0
  100. package/src/core/renderers/CoreShaderNode.ts +10 -0
  101. package/src/core/renderers/canvas/CanvasRenderer.ts +4 -0
  102. package/src/core/renderers/canvas/CanvasShaderNode.ts +1 -4
  103. package/src/core/renderers/webgl/WebGlCtxTexture.ts +0 -3
  104. package/src/core/renderers/webgl/WebGlRenderer.ts +64 -65
  105. package/src/core/renderers/webgl/WebGlShaderNode.ts +2 -4
  106. package/src/core/shaders/canvas/LinearGradient.ts +8 -6
  107. package/src/core/shaders/canvas/RadialGradient.ts +22 -36
  108. package/src/core/shaders/canvas/RoundedWithBorder.ts +10 -8
  109. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +14 -12
  110. package/src/core/shaders/canvas/RoundedWithShadow.ts +8 -7
  111. package/src/core/shaders/templates/BorderTemplate.ts +1 -1
  112. package/src/core/shaders/templates/HolePunchTemplate.ts +1 -1
  113. package/src/core/shaders/templates/RoundedTemplate.ts +1 -1
  114. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +1 -1
  115. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +1 -1
  116. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +1 -1
  117. package/src/core/shaders/templates/ShadowTemplate.ts +1 -1
  118. package/src/core/shaders/{templates/shaderUtils.ts → utils.ts} +2 -3
  119. package/src/core/shaders/webgl/HolePunch.ts +4 -7
  120. package/src/core/shaders/webgl/LinearGradient.ts +5 -4
  121. package/src/core/shaders/webgl/RadialGradient.ts +7 -6
  122. package/src/core/shaders/webgl/RoundedWithBorder.ts +18 -7
  123. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +30 -21
  124. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +2 -58
  125. package/src/core/textures/ImageTexture.ts +17 -16
  126. package/src/core/textures/Texture.ts +14 -0
  127. package/src/main-api/Inspector.ts +52 -5
  128. package/src/main-api/Renderer.ts +222 -77
  129. package/dist/src/core/platform.d.ts +0 -10
  130. package/dist/src/core/platform.js +0 -56
  131. package/dist/src/core/platform.js.map +0 -1
  132. package/dist/src/core/renderers/CoreShader.d.ts +0 -9
  133. package/dist/src/core/renderers/CoreShader.js +0 -28
  134. package/dist/src/core/renderers/CoreShader.js.map +0 -1
  135. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +0 -33
  136. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +0 -250
  137. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +0 -1
  138. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +0 -16
  139. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +0 -123
  140. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +0 -1
  141. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.d.ts +0 -10
  142. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js +0 -43
  143. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js.map +0 -1
  144. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.d.ts +0 -12
  145. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +0 -55
  146. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +0 -1
  147. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.d.ts +0 -9
  148. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +0 -38
  149. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +0 -1
  150. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +0 -57
  151. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +0 -227
  152. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +0 -1
  153. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +0 -34
  154. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +0 -114
  155. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +0 -1
  156. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +0 -133
  157. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +0 -613
  158. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +0 -1
  159. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +0 -83
  160. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +0 -231
  161. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +0 -1
  162. package/dist/src/core/renderers/webgl/shaders/DefaultShader.d.ts +0 -9
  163. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +0 -87
  164. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +0 -1
  165. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.d.ts +0 -10
  166. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +0 -119
  167. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +0 -1
  168. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +0 -29
  169. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +0 -413
  170. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +0 -1
  171. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.d.ts +0 -28
  172. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +0 -131
  173. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +0 -1
  174. package/dist/src/core/renderers/webgl/shaders/SdfShader.d.ts +0 -47
  175. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +0 -160
  176. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +0 -1
  177. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.d.ts +0 -31
  178. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +0 -71
  179. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +0 -1
  180. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.d.ts +0 -30
  181. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +0 -58
  182. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +0 -1
  183. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.d.ts +0 -31
  184. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +0 -71
  185. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +0 -1
  186. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.d.ts +0 -31
  187. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +0 -71
  188. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +0 -1
  189. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.d.ts +0 -31
  190. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +0 -71
  191. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +0 -1
  192. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.d.ts +0 -9
  193. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +0 -136
  194. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +0 -1
  195. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.d.ts +0 -36
  196. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +0 -85
  197. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +0 -1
  198. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.d.ts +0 -45
  199. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +0 -104
  200. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +0 -1
  201. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +0 -22
  202. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +0 -45
  203. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +0 -1
  204. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.d.ts +0 -58
  205. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +0 -80
  206. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js.map +0 -1
  207. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +0 -35
  208. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +0 -129
  209. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +0 -1
  210. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +0 -39
  211. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +0 -116
  212. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +0 -1
  213. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.d.ts +0 -61
  214. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +0 -127
  215. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js.map +0 -1
  216. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.d.ts +0 -40
  217. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +0 -71
  218. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +0 -1
  219. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.d.ts +0 -115
  220. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js +0 -61
  221. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +0 -1
  222. package/dist/src/core/shaders/templates/shaderUtils.js.map +0 -1
  223. package/dist/src/core/temp.d.ts +0 -1
  224. package/dist/src/core/temp.js +0 -77
  225. package/dist/src/core/temp.js.map +0 -1
  226. package/dist/src/main-api/DynamicShaderController.d.ts +0 -29
  227. package/dist/src/main-api/DynamicShaderController.js +0 -58
  228. package/dist/src/main-api/DynamicShaderController.js.map +0 -1
  229. package/dist/src/main-api/ShaderController.d.ts +0 -31
  230. package/dist/src/main-api/ShaderController.js +0 -37
  231. package/dist/src/main-api/ShaderController.js.map +0 -1
@@ -25,7 +25,12 @@ import type {
25
25
  TrFailedEventHandler,
26
26
  TrLoadedEventHandler,
27
27
  } from './text-rendering/renderers/TextRenderer.js';
28
- import { CoreNode, UpdateType, type CoreNodeProps } from './CoreNode.js';
28
+ import {
29
+ CoreNode,
30
+ CoreNodeRenderState,
31
+ UpdateType,
32
+ type CoreNodeProps,
33
+ } from './CoreNode.js';
29
34
  import type { Stage } from './Stage.js';
30
35
  import type { CoreRenderer } from './renderers/CoreRenderer.js';
31
36
  import type {
@@ -33,7 +38,6 @@ import type {
33
38
  NodeTextLoadedPayload,
34
39
  } from '../common/CommonTypes.js';
35
40
  import type { RectWithValid } from './lib/utils.js';
36
- import { assertTruthy } from '../utils.js';
37
41
 
38
42
  export interface CoreTextNodeProps extends CoreNodeProps, TrProps {
39
43
  /**
@@ -130,7 +134,7 @@ export class CoreTextNode extends CoreNode implements CoreTextNodeProps {
130
134
  this.props.width = calcWidth;
131
135
  this.props.height = calcHeight;
132
136
  }
133
- this.updateLocalTransform();
137
+ this.setUpdateType(UpdateType.Local);
134
138
 
135
139
  // Incase the RAF loop has been stopped already before text was loaded,
136
140
  // we request a render so it can be drawn.
@@ -211,7 +215,7 @@ export class CoreTextNode extends CoreNode implements CoreTextNodeProps {
211
215
  this._textRendererOverride,
212
216
  );
213
217
 
214
- if (!textRenderer) {
218
+ if (textRenderer === null) {
215
219
  console.warn(
216
220
  'Text Renderer not found for font',
217
221
  this.trState.props.fontFamily,
@@ -370,23 +374,24 @@ export class CoreTextNode extends CoreNode implements CoreTextNodeProps {
370
374
  override update(delta: number, parentClippingRect: RectWithValid) {
371
375
  super.update(delta, parentClippingRect);
372
376
 
373
- assertTruthy(this.globalTransform);
374
-
375
377
  // globalTransform is updated in super.update(delta)
376
- this.textRenderer.set.x(this.trState, this.globalTransform.tx);
377
- this.textRenderer.set.y(this.trState, this.globalTransform.ty);
378
+ this.textRenderer.set.x(this.trState, this.globalTransform!.tx);
379
+ this.textRenderer.set.y(this.trState, this.globalTransform!.ty);
378
380
  }
379
381
 
380
- override checkBasicRenderability() {
381
- if (this.worldAlpha === 0 || this.isOutOfBounds() === true) {
382
- return false;
382
+ override updateIsRenderable() {
383
+ // If the node is out of bounds or has an alpha of 0, it is not renderable
384
+ if (
385
+ this.worldAlpha === 0 ||
386
+ this.renderState <= CoreNodeRenderState.OutOfBounds
387
+ ) {
388
+ this.setRenderable(false);
389
+ return;
383
390
  }
384
391
 
385
- if (this.trState && this.trState.props.text !== '') {
386
- return true;
392
+ if (this.trState !== undefined && this.trState.props.text !== '') {
393
+ this.setRenderable(true);
387
394
  }
388
-
389
- return false;
390
395
  }
391
396
 
392
397
  override setRenderable(isRenderable: boolean) {
@@ -395,11 +400,9 @@ export class CoreTextNode extends CoreNode implements CoreTextNodeProps {
395
400
  }
396
401
 
397
402
  override renderQuads(renderer: CoreRenderer) {
398
- assertTruthy(this.globalTransform);
399
-
400
403
  // If the text renderer does not support rendering quads, fallback to the
401
404
  // default renderQuads method
402
- if (!this.textRenderer.renderQuads) {
405
+ if (this.textRenderer.renderQuads === undefined) {
403
406
  super.renderQuads(renderer);
404
407
  return;
405
408
  }
@@ -408,8 +411,8 @@ export class CoreTextNode extends CoreNode implements CoreTextNodeProps {
408
411
 
409
412
  // Prevent quad rendering if parent has a render texture
410
413
  // and this node is not the render texture
411
- if (this.parentHasRenderTexture) {
412
- if (!renderer.renderToTextureActive) {
414
+ if (this.parentHasRenderTexture === true) {
415
+ if (renderer.renderToTextureActive === false) {
413
416
  return;
414
417
  }
415
418
  // Prevent quad rendering if parent render texture is not the active render texture
@@ -488,12 +488,13 @@ export class CoreTextureManager extends EventEmitter {
488
488
  return;
489
489
  }
490
490
 
491
- const startTime = this.platform.getTimeStamp();
491
+ const platform = this.platform;
492
+ const startTime = platform.getTimeStamp();
492
493
 
493
494
  // Process priority queue
494
495
  while (
495
496
  this.priorityQueue.length > 0 &&
496
- this.platform.getTimeStamp() - startTime < maxProcessingTime
497
+ platform.getTimeStamp() - startTime < maxProcessingTime
497
498
  ) {
498
499
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
499
500
  const texture = this.priorityQueue.pop()!;
@@ -505,7 +506,7 @@ export class CoreTextureManager extends EventEmitter {
505
506
  // Process uploads
506
507
  while (
507
508
  this.uploadTextureQueue.length > 0 &&
508
- this.platform.getTimeStamp() - startTime < maxProcessingTime
509
+ platform.getTimeStamp() - startTime < maxProcessingTime
509
510
  ) {
510
511
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
511
512
  this.uploadTexture(this.uploadTextureQueue.pop()!);
@@ -514,7 +515,7 @@ export class CoreTextureManager extends EventEmitter {
514
515
  // Process downloads
515
516
  while (
516
517
  this.downloadTextureSourceQueue.length > 0 &&
517
- this.platform.getTimeStamp() - startTime < maxProcessingTime
518
+ platform.getTimeStamp() - startTime < maxProcessingTime
518
519
  ) {
519
520
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
520
521
  const texture = this.downloadTextureSourceQueue.shift()!;
package/src/core/Stage.ts CHANGED
@@ -46,8 +46,6 @@ import {
46
46
  type TextureMemoryManagerSettings,
47
47
  } from './TextureMemoryManager.js';
48
48
  import { CoreRenderer } from './renderers/CoreRenderer.js';
49
- import type { WebGlRenderer } from './renderers/webgl/WebGlRenderer.js';
50
- import type { CanvasRenderer } from './renderers/canvas/CanvasRenderer.js';
51
49
  import { CoreTextNode, type CoreTextNodeProps } from './CoreTextNode.js';
52
50
  import { santizeCustomDataMap } from '../main-api/utils.js';
53
51
  import type { SdfTextRenderer } from './text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js';
@@ -59,30 +57,19 @@ import type { Texture } from './textures/Texture.js';
59
57
  import { ColorTexture } from './textures/ColorTexture.js';
60
58
  import type { Platform } from './platforms/Platform.js';
61
59
  import type { WebPlatform } from './platforms/web/WebPlatform.js';
60
+ import type { RendererMainSettings } from '../main-api/Renderer.js';
62
61
 
63
- export interface StageOptions {
64
- appWidth: number;
65
- appHeight: number;
62
+ export type StageOptions = Omit<
63
+ RendererMainSettings,
64
+ 'inspector' | 'platform'
65
+ > & {
66
66
  textureMemory: TextureMemoryManagerSettings;
67
- boundsMargin: number | [number, number, number, number];
68
- deviceLogicalPixelRatio: number;
69
- devicePhysicalPixelRatio: number;
70
67
  canvas: HTMLCanvasElement | OffscreenCanvas;
71
- clearColor: number;
72
68
  fpsUpdateInterval: number;
73
- enableContextSpy: boolean;
74
- forceWebGL2: boolean;
75
- numImageWorkers: number;
76
- renderEngine: typeof WebGlRenderer | typeof CanvasRenderer;
77
69
  eventBus: EventEmitter;
78
- quadBufferSize: number;
79
- fontEngines: (typeof CanvasTextRenderer | typeof SdfTextRenderer)[];
80
- inspector: boolean;
81
- strictBounds: boolean;
82
- textureProcessingTimeLimit: number;
83
- createImageBitmapSupport: 'auto' | 'basic' | 'options' | 'full';
84
70
  platform: Platform | WebPlatform;
85
- }
71
+ inspector: boolean;
72
+ };
86
73
 
87
74
  export type StageFpsUpdateHandler = (
88
75
  stage: Stage,
@@ -114,11 +101,11 @@ export class Stage {
114
101
  public readonly interactiveNodes: Set<CoreNode> = new Set();
115
102
  public boundsMargin: [number, number, number, number];
116
103
  public readonly defShaderNode: CoreShaderNode | null = null;
117
- public readonly strictBound: Bound;
118
- public readonly preloadBound: Bound;
104
+ public strictBound: Bound;
105
+ public preloadBound: Bound;
119
106
  public readonly strictBounds: boolean;
120
107
  public readonly defaultTexture: Texture | null = null;
121
- public readonly pixelRatio: number;
108
+ public pixelRatio: number;
122
109
  public readonly bufferMemory: number = 2e6;
123
110
  public readonly platform: Platform | WebPlatform;
124
111
  public readonly calculateTextureCoord: boolean;
@@ -152,7 +139,7 @@ export class Stage {
152
139
  /**
153
140
  * Stage constructor
154
141
  */
155
- constructor(readonly options: StageOptions) {
142
+ constructor(public options: StageOptions) {
156
143
  const {
157
144
  canvas,
158
145
  clearColor,
@@ -385,12 +372,12 @@ export class Stage {
385
372
  * Start a new frame draw
386
373
  */
387
374
  drawFrame() {
388
- const { renderer, renderRequested } = this;
389
- assertTruthy(renderer);
375
+ const { renderer, renderRequested, root } = this;
376
+ const txMemManager = this.txMemManager;
390
377
 
391
378
  // Update tree if needed
392
- if (this.root.updateType !== 0) {
393
- this.root.update(this.deltaTime, this.root.clippingRect);
379
+ if (root.updateType !== 0) {
380
+ root.update(this.deltaTime, root.clippingRect);
394
381
  }
395
382
 
396
383
  // Process some textures
@@ -400,12 +387,12 @@ export class Stage {
400
387
  renderer.reset();
401
388
 
402
389
  // Check if we need to cleanup textures
403
- if (this.txMemManager.criticalCleanupRequested === true) {
404
- this.txMemManager.cleanup(false);
390
+ if (txMemManager.criticalCleanupRequested === true) {
391
+ txMemManager.cleanup(false);
405
392
 
406
- if (this.txMemManager.criticalCleanupRequested === true) {
393
+ if (txMemManager.criticalCleanupRequested === true) {
407
394
  // If we still need to cleanup, request another but aggressive cleanup
408
- this.txMemManager.cleanup(true);
395
+ txMemManager.cleanup(true);
409
396
  }
410
397
  }
411
398
 
@@ -419,13 +406,13 @@ export class Stage {
419
406
  this.addQuads(this.root);
420
407
 
421
408
  // Perform render pass
422
- renderer?.render();
409
+ renderer.render();
423
410
 
424
411
  this.calculateFps();
425
412
  this.calculateQuads();
426
413
 
427
414
  // Reset renderRequested flag if it was set
428
- if (renderRequested) {
415
+ if (renderRequested === true) {
429
416
  this.renderRequested = false;
430
417
  }
431
418
  }
@@ -663,7 +650,20 @@ export class Stage {
663
650
  }
664
651
 
665
652
  /**
666
- * Find all nodes at a given point
653
+ * Update the viewport bounds
654
+ */
655
+ updateViewportBounds() {
656
+ const { appWidth, appHeight } = this.options;
657
+ this.strictBound = createBound(0, 0, appWidth, appHeight);
658
+ this.preloadBound = createPreloadBounds(
659
+ this.strictBound,
660
+ this.boundsMargin,
661
+ );
662
+ this.root.setUpdateType(UpdateType.RenderBounds | UpdateType.Children);
663
+ this.root.childUpdateType |= UpdateType.RenderBounds;
664
+ }
665
+
666
+ /** Find all nodes at a given point
667
667
  * @param data
668
668
  */
669
669
  findNodesAtPoint(data: Point): CoreNode[] {
@@ -713,18 +713,23 @@ export class Stage {
713
713
  */
714
714
  protected resolveNodeDefaults(props: Partial<CoreNodeProps>): CoreNodeProps {
715
715
  const color = props.color ?? 0xffffffff;
716
- const colorTl = props.colorTl ?? props.colorTop ?? props.colorLeft ?? color;
717
- const colorTr =
718
- props.colorTr ?? props.colorTop ?? props.colorRight ?? color;
719
- const colorBl =
720
- props.colorBl ?? props.colorBottom ?? props.colorLeft ?? color;
721
- const colorBr =
722
- props.colorBr ?? props.colorBottom ?? props.colorRight ?? color;
723
-
724
- let data = {};
725
- if (this.options.inspector === true) {
726
- data = santizeCustomDataMap(props.data ?? {});
727
- }
716
+ const colorTop = props.colorTop ?? color;
717
+ const colorBottom = props.colorBottom ?? color;
718
+ const colorLeft = props.colorLeft ?? color;
719
+ const colorRight = props.colorRight ?? color;
720
+
721
+ const colorTl = props.colorTl ?? colorTop ?? colorLeft ?? color;
722
+ const colorTr = props.colorTr ?? colorTop ?? colorRight ?? color;
723
+ const colorBl = props.colorBl ?? colorBottom ?? colorLeft ?? color;
724
+ const colorBr = props.colorBr ?? colorBottom ?? colorRight ?? color;
725
+
726
+ const scale = props.scale ?? null;
727
+ const mount = props.mount ?? 0;
728
+ const pivot = props.pivot ?? 0.5;
729
+
730
+ const data = this.options.inspector
731
+ ? santizeCustomDataMap(props.data ?? {})
732
+ : {};
728
733
 
729
734
  return {
730
735
  x: props.x ?? 0,
@@ -736,39 +741,37 @@ export class Stage {
736
741
  boundsMargin: props.boundsMargin ?? null,
737
742
  clipping: props.clipping ?? false,
738
743
  color,
739
- colorTop: props.colorTop ?? color,
740
- colorBottom: props.colorBottom ?? color,
741
- colorLeft: props.colorLeft ?? color,
742
- colorRight: props.colorRight ?? color,
743
- colorBl,
744
- colorBr,
744
+ colorTop,
745
+ colorBottom,
746
+ colorLeft,
747
+ colorRight,
745
748
  colorTl,
746
749
  colorTr,
750
+ colorBl,
751
+ colorBr,
747
752
  zIndex: props.zIndex ?? 0,
748
753
  zIndexLocked: props.zIndexLocked ?? 0,
749
754
  parent: props.parent ?? null,
750
755
  texture: props.texture ?? null,
751
756
  textureOptions: props.textureOptions ?? {},
752
757
  shader: props.shader ?? this.defShaderNode,
753
- // Since setting the `src` will trigger a texture load, we need to set it after
754
- // we set the texture. Otherwise, problems happen.
755
758
  src: props.src ?? null,
756
759
  srcHeight: props.srcHeight,
757
760
  srcWidth: props.srcWidth,
758
761
  srcX: props.srcX,
759
762
  srcY: props.srcY,
760
- scale: props.scale ?? null,
761
- scaleX: props.scaleX ?? props.scale ?? 1,
762
- scaleY: props.scaleY ?? props.scale ?? 1,
763
- mount: props.mount ?? 0,
764
- mountX: props.mountX ?? props.mount ?? 0,
765
- mountY: props.mountY ?? props.mount ?? 0,
766
- pivot: props.pivot ?? 0.5,
767
- pivotX: props.pivotX ?? props.pivot ?? 0.5,
768
- pivotY: props.pivotY ?? props.pivot ?? 0.5,
763
+ scale,
764
+ scaleX: props.scaleX ?? scale ?? 1,
765
+ scaleY: props.scaleY ?? scale ?? 1,
766
+ mount,
767
+ mountX: props.mountX ?? mount,
768
+ mountY: props.mountY ?? mount,
769
+ pivot,
770
+ pivotX: props.pivotX ?? pivot,
771
+ pivotY: props.pivotY ?? pivot,
769
772
  rotation: props.rotation ?? 0,
770
773
  rtt: props.rtt ?? false,
771
- data: data,
774
+ data,
772
775
  imageType: props.imageType,
773
776
  interactive: props.interactive ?? false,
774
777
  strictBounds: props.strictBounds ?? this.strictBounds,
@@ -117,15 +117,21 @@ export class TextureMemoryManager {
117
117
  private memUsed = 0;
118
118
  private loadedTextures: Map<Texture, number> = new Map();
119
119
  private orphanedTextures: Texture[] = [];
120
- private criticalThreshold: number;
121
- private targetThreshold: number;
122
- private cleanupInterval: number;
123
- private debugLogging: boolean;
120
+ private criticalThreshold: number = 124e6;
121
+ private targetThreshold: number = 0.5;
122
+ private cleanupInterval: number = 5000;
123
+ private debugLogging: boolean = false;
124
+ private loggingID: ReturnType<typeof setInterval> =
125
+ 0 as unknown as ReturnType<typeof setInterval>;
124
126
  private lastCleanupTime = 0;
125
- private baselineMemoryAllocation: number;
127
+ private baselineMemoryAllocation: number = 26e6;
126
128
 
127
129
  public criticalCleanupRequested = false;
128
- public doNotExceedCriticalThreshold: boolean;
130
+ public doNotExceedCriticalThreshold: boolean = false;
131
+ private originalSetTextureMemUse: (
132
+ texture: Texture,
133
+ byteSize: number,
134
+ ) => void;
129
135
 
130
136
  /**
131
137
  * The current frame time in milliseconds
@@ -138,46 +144,9 @@ export class TextureMemoryManager {
138
144
  public frameTime = 0;
139
145
 
140
146
  constructor(private stage: Stage, settings: TextureMemoryManagerSettings) {
141
- const { criticalThreshold, doNotExceedCriticalThreshold } = settings;
142
- this.doNotExceedCriticalThreshold = doNotExceedCriticalThreshold || false;
143
- this.criticalThreshold = Math.round(criticalThreshold);
144
- const targetFraction = Math.max(
145
- 0,
146
- Math.min(1, settings.targetThresholdLevel),
147
- );
148
- this.cleanupInterval = settings.cleanupInterval;
149
- this.debugLogging = settings.debugLogging;
150
- this.baselineMemoryAllocation = Math.round(
151
- settings.baselineMemoryAllocation,
152
- );
153
- this.targetThreshold = Math.max(
154
- Math.round(criticalThreshold * targetFraction),
155
- this.baselineMemoryAllocation,
156
- );
157
- this.memUsed = Math.round(settings.baselineMemoryAllocation);
147
+ this.originalSetTextureMemUse = this.setTextureMemUse;
158
148
 
159
- if (settings.debugLogging) {
160
- let lastMemUse = 0;
161
- setInterval(() => {
162
- if (lastMemUse !== this.memUsed) {
163
- lastMemUse = this.memUsed;
164
- console.log(
165
- `[TextureMemoryManager] Memory used: ${bytesToMb(
166
- this.memUsed,
167
- )} mb / ${bytesToMb(this.criticalThreshold)} mb (${(
168
- (this.memUsed / this.criticalThreshold) *
169
- 100
170
- ).toFixed(1)}%)`,
171
- );
172
- }
173
- }, 1000);
174
- }
175
-
176
- // If the threshold is 0, we disable the memory manager by replacing the
177
- // setTextureMemUse method with a no-op function.
178
- if (criticalThreshold === 0) {
179
- this.setTextureMemUse = () => {};
180
- }
149
+ this.updateSettings(settings);
181
150
  }
182
151
 
183
152
  /**
@@ -248,14 +217,14 @@ export class TextureMemoryManager {
248
217
 
249
218
  cleanupQuick(critical: boolean) {
250
219
  // Free non-renderable textures until we reach the target threshold
220
+ const platform = this.stage.platform;
251
221
  const memTarget = this.targetThreshold;
252
- const txManager = this.stage.txManager;
253
- const timestamp = this.stage.platform.getTimeStamp();
222
+ const timestamp = platform.getTimeStamp();
254
223
 
255
224
  while (
256
225
  this.memUsed >= memTarget &&
257
226
  this.orphanedTextures.length > 0 &&
258
- (critical || this.stage.platform.getTimeStamp() - timestamp < 10)
227
+ (critical || platform.getTimeStamp() - timestamp < 10)
259
228
  ) {
260
229
  const texture = this.orphanedTextures.shift();
261
230
 
@@ -268,15 +237,28 @@ export class TextureMemoryManager {
268
237
  continue;
269
238
  }
270
239
 
271
- texture.free();
272
- txManager.removeTextureFromCache(texture);
240
+ this.destroyTexture(texture);
273
241
  }
274
242
  }
275
243
 
244
+ /**
245
+ * Destroy a texture and remove it from the memory manager
246
+ *
247
+ * @param texture - The texture to destroy
248
+ */
249
+ destroyTexture(texture: Texture) {
250
+ const txManager = this.stage.txManager;
251
+ txManager.removeTextureFromQueue(texture);
252
+ txManager.removeTextureFromCache(texture);
253
+
254
+ texture.destroy();
255
+
256
+ this.removeFromOrphanedTextures(texture);
257
+ this.loadedTextures.delete(texture);
258
+ }
276
259
  cleanupDeep(critical: boolean) {
277
260
  // Free non-renderable textures until we reach the target threshold
278
261
  const memTarget = critical ? this.criticalThreshold : this.targetThreshold;
279
- const txManager = this.stage.txManager;
280
262
 
281
263
  // sort by renderability
282
264
  const filteredAndSortedTextures: Texture[] = [];
@@ -314,21 +296,21 @@ export class TextureMemoryManager {
314
296
  break;
315
297
  }
316
298
 
317
- texture.free();
318
- this.removeFromOrphanedTextures(texture);
319
- txManager.removeTextureFromCache(texture);
320
- txManager.removeTextureFromQueue(texture);
299
+ this.destroyTexture(texture);
321
300
  }
322
301
  }
323
302
 
324
303
  cleanup(aggressive: boolean = false) {
325
304
  const critical = this.criticalCleanupRequested;
305
+ const criticalThreshold = this.criticalThreshold;
306
+ const memUsed = this.memUsed;
307
+ const stage = this.stage;
326
308
  this.lastCleanupTime = this.frameTime;
327
309
 
328
310
  if (critical === true) {
329
- this.stage.queueFrameEvent('criticalCleanup', {
311
+ stage.queueFrameEvent('criticalCleanup', {
330
312
  memUsed: this.memUsed,
331
- criticalThreshold: this.criticalThreshold,
313
+ criticalThreshold: criticalThreshold,
332
314
  });
333
315
  }
334
316
 
@@ -342,19 +324,19 @@ export class TextureMemoryManager {
342
324
  this.cleanupQuick(critical);
343
325
 
344
326
  // if we're still above the target threshold, do a deep cleanup
345
- if (aggressive === true && this.memUsed >= this.criticalThreshold) {
327
+ if (aggressive === true && memUsed >= criticalThreshold) {
346
328
  this.cleanupDeep(critical);
347
329
  }
348
330
 
349
- if (this.memUsed >= this.criticalThreshold) {
350
- this.stage.queueFrameEvent('criticalCleanupFailed', {
351
- memUsed: this.memUsed,
352
- criticalThreshold: this.criticalThreshold,
331
+ if (memUsed >= criticalThreshold) {
332
+ stage.queueFrameEvent('criticalCleanupFailed', {
333
+ memUsed: memUsed,
334
+ criticalThreshold: criticalThreshold,
353
335
  });
354
336
 
355
337
  if (this.debugLogging === true || isProductionEnvironment === false) {
356
338
  console.warn(
357
- `[TextureMemoryManager] Memory usage above critical threshold after cleanup: ${this.memUsed}`,
339
+ `[TextureMemoryManager] Memory usage above critical threshold after cleanup: ${memUsed}`,
358
340
  );
359
341
  }
360
342
  } else {
@@ -391,4 +373,63 @@ export class TextureMemoryManager {
391
373
  baselineMemoryAllocation: this.baselineMemoryAllocation,
392
374
  };
393
375
  }
376
+
377
+ public updateSettings(settings: TextureMemoryManagerSettings): void {
378
+ const { criticalThreshold, doNotExceedCriticalThreshold } = settings;
379
+
380
+ this.doNotExceedCriticalThreshold = doNotExceedCriticalThreshold || false;
381
+ this.criticalThreshold = Math.round(criticalThreshold);
382
+
383
+ if (this.memUsed === 0) {
384
+ this.memUsed = Math.round(settings.baselineMemoryAllocation);
385
+ } else {
386
+ const memUsedExBaseline = this.memUsed - this.baselineMemoryAllocation;
387
+ this.memUsed = Math.round(
388
+ settings.baselineMemoryAllocation + memUsedExBaseline,
389
+ );
390
+ }
391
+ this.baselineMemoryAllocation = Math.round(
392
+ settings.baselineMemoryAllocation,
393
+ );
394
+ const targetFraction = Math.max(
395
+ 0,
396
+ Math.min(1, settings.targetThresholdLevel),
397
+ );
398
+ this.targetThreshold = Math.max(
399
+ Math.round(criticalThreshold * targetFraction),
400
+ this.baselineMemoryAllocation,
401
+ );
402
+
403
+ this.cleanupInterval = settings.cleanupInterval;
404
+ this.debugLogging = settings.debugLogging;
405
+
406
+ if (this.loggingID && !settings.debugLogging) {
407
+ clearInterval(this.loggingID);
408
+ this.loggingID = 0 as unknown as ReturnType<typeof setInterval>;
409
+ }
410
+ if (settings.debugLogging && !this.loggingID) {
411
+ let lastMemUse = 0;
412
+ this.loggingID = setInterval(() => {
413
+ if (lastMemUse !== this.memUsed) {
414
+ lastMemUse = this.memUsed;
415
+ console.log(
416
+ `[TextureMemoryManager] Memory used: ${bytesToMb(
417
+ this.memUsed,
418
+ )} mb / ${bytesToMb(this.criticalThreshold)} mb (${(
419
+ (this.memUsed / this.criticalThreshold) *
420
+ 100
421
+ ).toFixed(1)}%)`,
422
+ );
423
+ }
424
+ }, 1000);
425
+ }
426
+
427
+ // If the threshold is 0, we disable the memory manager by replacing the
428
+ // setTextureMemUse method with a no-op function.
429
+ if (criticalThreshold === 0) {
430
+ this.setTextureMemUse = () => {};
431
+ } else {
432
+ this.setTextureMemUse = this.originalSetTextureMemUse;
433
+ }
434
+ }
394
435
  }
@@ -215,6 +215,13 @@ export class CoreAnimation extends EventEmitter {
215
215
  update(dt: number) {
216
216
  const { duration, loop, easing, stopMethod } = this.settings;
217
217
  const { delayFor } = this;
218
+
219
+ if (this.node.destroyed) {
220
+ // cleanup
221
+ this.emit('destroyed', {});
222
+ return;
223
+ }
224
+
218
225
  if (duration === 0 && delayFor === 0) {
219
226
  this.emit('finished', {});
220
227
  return;
@@ -1,4 +1,3 @@
1
- /* eslint-disable @typescript-eslint/unbound-method */
2
1
  /*
3
2
  * If not stated otherwise in this file or this component's LICENSE file the
4
3
  * following copyright and licenses apply:
@@ -52,6 +51,7 @@ export class CoreAnimationController
52
51
  this.onAnimating = this.onAnimating.bind(this);
53
52
  this.onFinished = this.onFinished.bind(this);
54
53
  this.onTick = this.onTick.bind(this);
54
+ this.onDestroy = this.onDestroy.bind(this);
55
55
  }
56
56
 
57
57
  start(): IAnimationController {
@@ -96,6 +96,7 @@ export class CoreAnimationController
96
96
  this.animation.once('finished', this.onFinished);
97
97
  this.animation.on('animating', this.onAnimating);
98
98
  this.animation.on('tick', this.onTick);
99
+ this.animation.on('destroyed', this.onDestroy);
99
100
  // Then register the animation
100
101
  this.manager.registerAnimation(this.animation);
101
102
  }
@@ -107,6 +108,7 @@ export class CoreAnimationController
107
108
  this.animation.off('finished', this.onFinished);
108
109
  this.animation.off('animating', this.onAnimating);
109
110
  this.animation.off('tick', this.onTick);
111
+ this.animation.off('destroy', this.onDestroy);
110
112
  }
111
113
 
112
114
  private makeStoppedPromise(): void {
@@ -117,6 +119,11 @@ export class CoreAnimationController
117
119
  }
118
120
  }
119
121
 
122
+ private onDestroy(this: CoreAnimationController): void {
123
+ this.unregisterAnimation();
124
+ this.state = 'stopped';
125
+ }
126
+
120
127
  private onFinished(this: CoreAnimationController): void {
121
128
  assertTruthy(this.stoppedResolve);
122
129
  // If the animation is looping, then we need to restart it.
@@ -104,6 +104,7 @@ export abstract class CoreRenderer {
104
104
  abstract renderToTexture(node: CoreNode): void;
105
105
  abstract getBufferInfo(): BufferInfo | null;
106
106
  abstract getQuadCount(): number | null;
107
+ abstract updateViewport(): void;
107
108
  abstract updateClearColor(color: number): void;
108
109
  getTextureCoords?(node: CoreNode): TextureCoords;
109
110
  }