@lightningjs/renderer 3.0.0-beta7 → 3.0.0-beta9

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 (240) 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 +257 -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.d.ts +4 -9
  11. package/dist/src/core/CoreTextureManager.js +41 -78
  12. package/dist/src/core/CoreTextureManager.js.map +1 -1
  13. package/dist/src/core/Stage.d.ts +12 -27
  14. package/dist/src/core/Stage.js +50 -37
  15. package/dist/src/core/Stage.js.map +1 -1
  16. package/dist/src/core/TextureMemoryManager.d.ts +10 -1
  17. package/dist/src/core/TextureMemoryManager.js +103 -50
  18. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  19. package/dist/src/core/animations/CoreAnimation.js +5 -0
  20. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  21. package/dist/src/core/animations/CoreAnimationController.d.ts +1 -0
  22. package/dist/src/core/animations/CoreAnimationController.js +11 -4
  23. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  24. package/dist/src/core/lib/WebGlContextWrapper.d.ts +19 -2
  25. package/dist/src/core/lib/WebGlContextWrapper.js +56 -25
  26. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  27. package/dist/src/core/renderers/CoreRenderer.d.ts +1 -0
  28. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  29. package/dist/src/core/renderers/CoreShaderNode.d.ts +1 -0
  30. package/dist/src/core/renderers/CoreShaderNode.js +9 -0
  31. package/dist/src/core/renderers/CoreShaderNode.js.map +1 -1
  32. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +1 -0
  33. package/dist/src/core/renderers/canvas/CanvasRenderer.js +3 -0
  34. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  35. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +1 -4
  36. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
  37. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +0 -3
  38. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  39. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +1 -0
  40. package/dist/src/core/renderers/webgl/WebGlRenderer.js +56 -54
  41. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  42. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +1 -4
  43. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  44. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +4 -2
  45. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +31 -13
  46. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  47. package/dist/src/core/shaders/canvas/LinearGradient.js +5 -3
  48. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -1
  49. package/dist/src/core/shaders/canvas/RadialGradient.js +13 -11
  50. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
  51. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +7 -5
  52. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  53. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +10 -8
  54. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
  55. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +7 -5
  56. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
  57. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +1 -1
  58. package/dist/src/core/shaders/templates/BorderTemplate.js +1 -1
  59. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -1
  60. package/dist/src/core/shaders/templates/HolePunchTemplate.js +1 -1
  61. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -1
  62. package/dist/src/core/shaders/templates/RoundedTemplate.js +1 -1
  63. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -1
  64. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +1 -1
  65. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +1 -1
  66. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +1 -1
  67. package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +1 -1
  68. package/dist/src/core/shaders/{templates/shaderUtils.d.ts → utils.d.ts} +1 -1
  69. package/dist/src/core/shaders/{templates/shaderUtils.js → utils.js} +2 -2
  70. package/dist/src/core/shaders/utils.js.map +1 -0
  71. package/dist/src/core/shaders/webgl/HolePunch.js +4 -3
  72. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -1
  73. package/dist/src/core/shaders/webgl/LinearGradient.js +5 -4
  74. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  75. package/dist/src/core/shaders/webgl/RadialGradient.js +6 -5
  76. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  77. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +18 -7
  78. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  79. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +30 -17
  80. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  81. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +0 -50
  82. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  83. package/dist/src/core/textures/ImageTexture.d.ts +1 -1
  84. package/dist/src/core/textures/ImageTexture.js +1 -1
  85. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  86. package/dist/src/core/textures/Texture.d.ts +12 -0
  87. package/dist/src/core/textures/Texture.js +19 -0
  88. package/dist/src/core/textures/Texture.js.map +1 -1
  89. package/dist/src/core/utils.d.ts +1 -1
  90. package/dist/src/main-api/Inspector.d.ts +6 -1
  91. package/dist/src/main-api/Inspector.js +42 -4
  92. package/dist/src/main-api/Inspector.js.map +1 -1
  93. package/dist/src/main-api/Renderer.d.ts +62 -43
  94. package/dist/src/main-api/Renderer.js +119 -31
  95. package/dist/src/main-api/Renderer.js.map +1 -1
  96. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  97. package/exports/utils.ts +7 -1
  98. package/package.json +1 -1
  99. package/src/core/CoreNode.ts +307 -313
  100. package/src/core/CoreTextNode.ts +23 -20
  101. package/src/core/CoreTextureManager.ts +40 -99
  102. package/src/core/Stage.ts +68 -65
  103. package/src/core/TextureMemoryManager.ts +135 -67
  104. package/src/core/animations/CoreAnimation.ts +7 -0
  105. package/src/core/animations/CoreAnimationController.ts +13 -4
  106. package/src/core/lib/WebGlContextWrapper.ts +69 -75
  107. package/src/core/renderers/CoreRenderer.ts +1 -0
  108. package/src/core/renderers/CoreShaderNode.ts +10 -0
  109. package/src/core/renderers/canvas/CanvasRenderer.ts +4 -0
  110. package/src/core/renderers/canvas/CanvasShaderNode.ts +1 -4
  111. package/src/core/renderers/webgl/WebGlCtxTexture.ts +0 -3
  112. package/src/core/renderers/webgl/WebGlRenderer.ts +64 -65
  113. package/src/core/renderers/webgl/WebGlShaderNode.ts +2 -4
  114. package/src/core/renderers/webgl/WebGlShaderProgram.ts +37 -14
  115. package/src/core/shaders/canvas/LinearGradient.ts +8 -6
  116. package/src/core/shaders/canvas/RadialGradient.ts +22 -36
  117. package/src/core/shaders/canvas/RoundedWithBorder.ts +10 -8
  118. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +14 -12
  119. package/src/core/shaders/canvas/RoundedWithShadow.ts +8 -7
  120. package/src/core/shaders/templates/BorderTemplate.ts +1 -1
  121. package/src/core/shaders/templates/HolePunchTemplate.ts +1 -1
  122. package/src/core/shaders/templates/RoundedTemplate.ts +1 -1
  123. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +1 -1
  124. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +1 -1
  125. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +1 -1
  126. package/src/core/shaders/templates/ShadowTemplate.ts +1 -1
  127. package/src/core/shaders/{templates/shaderUtils.ts → utils.ts} +2 -3
  128. package/src/core/shaders/webgl/HolePunch.ts +4 -7
  129. package/src/core/shaders/webgl/LinearGradient.ts +5 -4
  130. package/src/core/shaders/webgl/RadialGradient.ts +7 -6
  131. package/src/core/shaders/webgl/RoundedWithBorder.ts +18 -7
  132. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +30 -21
  133. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +2 -58
  134. package/src/core/textures/ImageTexture.ts +17 -16
  135. package/src/core/textures/Texture.ts +23 -0
  136. package/src/main-api/Inspector.ts +52 -5
  137. package/src/main-api/Renderer.ts +222 -77
  138. package/dist/src/core/platform.d.ts +0 -10
  139. package/dist/src/core/platform.js +0 -56
  140. package/dist/src/core/platform.js.map +0 -1
  141. package/dist/src/core/renderers/CoreShader.d.ts +0 -9
  142. package/dist/src/core/renderers/CoreShader.js +0 -28
  143. package/dist/src/core/renderers/CoreShader.js.map +0 -1
  144. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +0 -33
  145. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +0 -250
  146. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +0 -1
  147. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +0 -16
  148. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +0 -123
  149. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +0 -1
  150. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.d.ts +0 -10
  151. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js +0 -43
  152. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js.map +0 -1
  153. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.d.ts +0 -12
  154. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +0 -55
  155. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +0 -1
  156. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.d.ts +0 -9
  157. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +0 -38
  158. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +0 -1
  159. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +0 -57
  160. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +0 -227
  161. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +0 -1
  162. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +0 -34
  163. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +0 -114
  164. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +0 -1
  165. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +0 -133
  166. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +0 -613
  167. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +0 -1
  168. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +0 -83
  169. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +0 -231
  170. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +0 -1
  171. package/dist/src/core/renderers/webgl/shaders/DefaultShader.d.ts +0 -9
  172. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +0 -87
  173. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +0 -1
  174. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.d.ts +0 -10
  175. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +0 -119
  176. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +0 -1
  177. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +0 -29
  178. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +0 -413
  179. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +0 -1
  180. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.d.ts +0 -28
  181. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +0 -131
  182. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +0 -1
  183. package/dist/src/core/renderers/webgl/shaders/SdfShader.d.ts +0 -47
  184. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +0 -160
  185. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +0 -1
  186. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.d.ts +0 -31
  187. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +0 -71
  188. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +0 -1
  189. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.d.ts +0 -30
  190. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +0 -58
  191. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +0 -1
  192. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.d.ts +0 -31
  193. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +0 -71
  194. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +0 -1
  195. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.d.ts +0 -31
  196. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +0 -71
  197. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +0 -1
  198. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.d.ts +0 -31
  199. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +0 -71
  200. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +0 -1
  201. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.d.ts +0 -9
  202. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +0 -136
  203. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +0 -1
  204. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.d.ts +0 -36
  205. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +0 -85
  206. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +0 -1
  207. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.d.ts +0 -45
  208. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +0 -104
  209. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +0 -1
  210. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +0 -22
  211. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +0 -45
  212. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +0 -1
  213. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.d.ts +0 -58
  214. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +0 -80
  215. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js.map +0 -1
  216. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +0 -35
  217. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +0 -129
  218. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +0 -1
  219. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +0 -39
  220. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +0 -116
  221. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +0 -1
  222. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.d.ts +0 -61
  223. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +0 -127
  224. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js.map +0 -1
  225. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.d.ts +0 -40
  226. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +0 -71
  227. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +0 -1
  228. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.d.ts +0 -115
  229. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js +0 -61
  230. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +0 -1
  231. package/dist/src/core/shaders/templates/shaderUtils.js.map +0 -1
  232. package/dist/src/core/temp.d.ts +0 -1
  233. package/dist/src/core/temp.js +0 -77
  234. package/dist/src/core/temp.js.map +0 -1
  235. package/dist/src/main-api/DynamicShaderController.d.ts +0 -29
  236. package/dist/src/main-api/DynamicShaderController.js +0 -58
  237. package/dist/src/main-api/DynamicShaderController.js.map +0 -1
  238. package/dist/src/main-api/ShaderController.d.ts +0 -31
  239. package/dist/src/main-api/ShaderController.js +0 -37
  240. package/dist/src/main-api/ShaderController.js.map +0 -1
@@ -18,7 +18,7 @@
18
18
  */
19
19
  import { isProductionEnvironment } from '../utils.js';
20
20
  import type { Stage } from './Stage.js';
21
- import { TextureType, type Texture } from './textures/Texture.js';
21
+ import { Texture, TextureType, type TextureState } from './textures/Texture.js';
22
22
  import { bytesToMb } from './utils.js';
23
23
 
24
24
  export interface TextureMemoryManagerSettings {
@@ -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);
158
-
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
- }
147
+ this.originalSetTextureMemUse = this.setTextureMemUse;
175
148
 
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,40 @@ export class TextureMemoryManager {
268
237
  continue;
269
238
  }
270
239
 
271
- texture.free();
272
- txManager.removeTextureFromCache(texture);
240
+ // Skip textures that are in transitional states - we only want to clean up
241
+ // textures that are in a stable state (loaded, failed, or freed)
242
+ if (Texture.TRANSITIONAL_TEXTURE_STATES.includes(texture.state)) {
243
+ continue;
244
+ }
245
+
246
+ this.destroyTexture(texture);
273
247
  }
274
248
  }
275
249
 
250
+ /**
251
+ * Destroy a texture and remove it from the memory manager
252
+ *
253
+ * @param texture - The texture to destroy
254
+ */
255
+ destroyTexture(texture: Texture) {
256
+ if (this.debugLogging === true) {
257
+ console.log(
258
+ `[TextureMemoryManager] Destroying texture. State: ${texture.state}`,
259
+ );
260
+ }
261
+
262
+ const txManager = this.stage.txManager;
263
+ txManager.removeTextureFromQueue(texture);
264
+ txManager.removeTextureFromCache(texture);
265
+
266
+ texture.destroy();
267
+
268
+ this.removeFromOrphanedTextures(texture);
269
+ this.loadedTextures.delete(texture);
270
+ }
276
271
  cleanupDeep(critical: boolean) {
277
272
  // Free non-renderable textures until we reach the target threshold
278
273
  const memTarget = critical ? this.criticalThreshold : this.targetThreshold;
279
- const txManager = this.stage.txManager;
280
274
 
281
275
  // sort by renderability
282
276
  const filteredAndSortedTextures: Texture[] = [];
@@ -314,21 +308,27 @@ export class TextureMemoryManager {
314
308
  break;
315
309
  }
316
310
 
317
- texture.free();
318
- this.removeFromOrphanedTextures(texture);
319
- txManager.removeTextureFromCache(texture);
320
- txManager.removeTextureFromQueue(texture);
311
+ // Skip textures that are in transitional states - we only want to clean up
312
+ // textures that are in a stable state (loaded, failed, or freed)
313
+ if (Texture.TRANSITIONAL_TEXTURE_STATES.includes(texture.state)) {
314
+ break;
315
+ }
316
+
317
+ this.destroyTexture(texture);
321
318
  }
322
319
  }
323
320
 
324
321
  cleanup(aggressive: boolean = false) {
325
322
  const critical = this.criticalCleanupRequested;
323
+ const criticalThreshold = this.criticalThreshold;
324
+ const memUsed = this.memUsed;
325
+ const stage = this.stage;
326
326
  this.lastCleanupTime = this.frameTime;
327
327
 
328
328
  if (critical === true) {
329
- this.stage.queueFrameEvent('criticalCleanup', {
329
+ stage.queueFrameEvent('criticalCleanup', {
330
330
  memUsed: this.memUsed,
331
- criticalThreshold: this.criticalThreshold,
331
+ criticalThreshold: criticalThreshold,
332
332
  });
333
333
  }
334
334
 
@@ -338,23 +338,32 @@ export class TextureMemoryManager {
338
338
  );
339
339
  }
340
340
 
341
+ // Note: We skip textures in transitional states during cleanup:
342
+ // - 'initial': These textures haven't started loading yet
343
+ // - 'fetching': These textures are in the process of being fetched
344
+ // - 'fetched': These textures have been fetched but not yet uploaded to GPU
345
+ // - 'loading': These textures are being uploaded to the GPU
346
+ //
347
+ // For 'failed' and 'freed' states, we only remove them from the tracking
348
+ // arrays without trying to free GPU resources that don't exist.
349
+
341
350
  // try a quick cleanup first
342
351
  this.cleanupQuick(critical);
343
352
 
344
353
  // if we're still above the target threshold, do a deep cleanup
345
- if (aggressive === true && this.memUsed >= this.criticalThreshold) {
354
+ if (aggressive === true && memUsed >= criticalThreshold) {
346
355
  this.cleanupDeep(critical);
347
356
  }
348
357
 
349
- if (this.memUsed >= this.criticalThreshold) {
350
- this.stage.queueFrameEvent('criticalCleanupFailed', {
351
- memUsed: this.memUsed,
352
- criticalThreshold: this.criticalThreshold,
358
+ if (memUsed >= criticalThreshold) {
359
+ stage.queueFrameEvent('criticalCleanupFailed', {
360
+ memUsed: memUsed,
361
+ criticalThreshold: criticalThreshold,
353
362
  });
354
363
 
355
364
  if (this.debugLogging === true || isProductionEnvironment === false) {
356
365
  console.warn(
357
- `[TextureMemoryManager] Memory usage above critical threshold after cleanup: ${this.memUsed}`,
366
+ `[TextureMemoryManager] Memory usage above critical threshold after cleanup: ${memUsed}`,
358
367
  );
359
368
  }
360
369
  } else {
@@ -374,9 +383,9 @@ export class TextureMemoryManager {
374
383
  const renderableMemUsed = [...this.loadedTextures.keys()].reduce(
375
384
  (acc, texture) => {
376
385
  renderableTexturesLoaded += texture.renderable ? 1 : 0;
377
- return (
378
- acc + (texture.renderable ? this.loadedTextures.get(texture)! : 0)
379
- );
386
+ // Get the memory used by the texture, defaulting to 0 if not found
387
+ const textureMemory = this.loadedTextures.get(texture) ?? 0;
388
+ return acc + (texture.renderable ? textureMemory : 0);
380
389
  },
381
390
  this.baselineMemoryAllocation,
382
391
  );
@@ -391,4 +400,63 @@ export class TextureMemoryManager {
391
400
  baselineMemoryAllocation: this.baselineMemoryAllocation,
392
401
  };
393
402
  }
403
+
404
+ public updateSettings(settings: TextureMemoryManagerSettings): void {
405
+ const { criticalThreshold, doNotExceedCriticalThreshold } = settings;
406
+
407
+ this.doNotExceedCriticalThreshold = doNotExceedCriticalThreshold || false;
408
+ this.criticalThreshold = Math.round(criticalThreshold);
409
+
410
+ if (this.memUsed === 0) {
411
+ this.memUsed = Math.round(settings.baselineMemoryAllocation);
412
+ } else {
413
+ const memUsedExBaseline = this.memUsed - this.baselineMemoryAllocation;
414
+ this.memUsed = Math.round(
415
+ settings.baselineMemoryAllocation + memUsedExBaseline,
416
+ );
417
+ }
418
+ this.baselineMemoryAllocation = Math.round(
419
+ settings.baselineMemoryAllocation,
420
+ );
421
+ const targetFraction = Math.max(
422
+ 0,
423
+ Math.min(1, settings.targetThresholdLevel),
424
+ );
425
+ this.targetThreshold = Math.max(
426
+ Math.round(criticalThreshold * targetFraction),
427
+ this.baselineMemoryAllocation,
428
+ );
429
+
430
+ this.cleanupInterval = settings.cleanupInterval;
431
+ this.debugLogging = settings.debugLogging;
432
+
433
+ if (this.loggingID && !settings.debugLogging) {
434
+ clearInterval(this.loggingID);
435
+ this.loggingID = 0 as unknown as ReturnType<typeof setInterval>;
436
+ }
437
+ if (settings.debugLogging && !this.loggingID) {
438
+ let lastMemUse = 0;
439
+ this.loggingID = setInterval(() => {
440
+ if (lastMemUse !== this.memUsed) {
441
+ lastMemUse = this.memUsed;
442
+ console.log(
443
+ `[TextureMemoryManager] Memory used: ${bytesToMb(
444
+ this.memUsed,
445
+ )} mb / ${bytesToMb(this.criticalThreshold)} mb (${(
446
+ (this.memUsed / this.criticalThreshold) *
447
+ 100
448
+ ).toFixed(1)}%)`,
449
+ );
450
+ }
451
+ }, 1000);
452
+ }
453
+
454
+ // If the threshold is 0, we disable the memory manager by replacing the
455
+ // setTextureMemUse method with a no-op function.
456
+ if (criticalThreshold === 0) {
457
+ this.setTextureMemUse = () => {};
458
+ } else {
459
+ this.setTextureMemUse = this.originalSetTextureMemUse;
460
+ }
461
+ }
394
462
  }
@@ -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,8 +119,12 @@ 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
- assertTruthy(this.stoppedResolve);
122
128
  // If the animation is looping, then we need to restart it.
123
129
  const { loop, stopMethod } = this.animation.settings;
124
130
 
@@ -136,8 +142,11 @@ export class CoreAnimationController
136
142
  this.unregisterAnimation();
137
143
 
138
144
  // resolve promise
139
- this.stoppedResolve();
140
- this.stoppedResolve = null;
145
+ if (this.stoppedResolve !== null) {
146
+ this.stoppedResolve();
147
+ this.stoppedResolve = null;
148
+ }
149
+
141
150
  this.emit('stopped', this);
142
151
  this.state = 'stopped';
143
152
  }
@@ -50,6 +50,7 @@ export class WebGlContextWrapper {
50
50
  private boundArrayBuffer: WebGLBuffer | null;
51
51
  private boundElementArrayBuffer: WebGLBuffer | null;
52
52
  private curProgram: WebGLProgram | null;
53
+ private curUniformLocations: Record<string, WebGLUniformLocation> = {};
53
54
  //#endregion Cached WebGL State
54
55
 
55
56
  //#region Canvas
@@ -689,16 +690,23 @@ export class WebGlContextWrapper {
689
690
  * @param program
690
691
  * @returns object with numbers
691
692
  */
692
- getUniformLocations(program: WebGLProgram): Record<string, number> {
693
+ getUniformLocations(
694
+ program: WebGLProgram,
695
+ ): Record<string, WebGLUniformLocation> {
693
696
  const gl = this.gl;
694
697
  const length = gl.getProgramParameter(
695
698
  program,
696
699
  gl.ACTIVE_UNIFORMS,
697
700
  ) as number;
698
- const result = {} as Record<string, number>;
701
+ const result = {} as Record<string, WebGLUniformLocation>;
699
702
  for (let i = 0; i < length; i++) {
700
- const { name } = gl.getActiveUniform(program, i) as WebGLActiveInfo;
701
- result[name] = i;
703
+ const info = gl.getActiveUniform(program, i) as WebGLActiveInfo;
704
+ //remove bracket + value from uniform name;
705
+ let name = info.name.replace(/\[.*?\]/g, '');
706
+ result[name] = gl.getUniformLocation(
707
+ program,
708
+ name,
709
+ ) as WebGLUniformLocation;
702
710
  }
703
711
  return result;
704
712
  }
@@ -730,12 +738,16 @@ export class WebGlContextWrapper {
730
738
  * @param program
731
739
  * @returns
732
740
  */
733
- useProgram(program: WebGLProgram | null) {
741
+ useProgram(
742
+ program: WebGLProgram | null,
743
+ uniformLocations: Record<string, WebGLUniformLocation>,
744
+ ) {
734
745
  if (this.curProgram === program) {
735
746
  return;
736
747
  }
737
748
  this.gl.useProgram(program);
738
749
  this.curProgram = program;
750
+ this.curUniformLocations = uniformLocations;
739
751
  }
740
752
 
741
753
  /**
@@ -745,10 +757,7 @@ export class WebGlContextWrapper {
745
757
  * @param v0 - The value to set.
746
758
  */
747
759
  uniform1f(location: string, v0: number) {
748
- this.gl.uniform1f(
749
- this.gl.getUniformLocation(this.curProgram!, location),
750
- v0,
751
- );
760
+ this.gl.uniform1f(this.curUniformLocations[location] || null, v0);
752
761
  }
753
762
 
754
763
  /**
@@ -758,10 +767,7 @@ export class WebGlContextWrapper {
758
767
  * @param value - The array of values to set.
759
768
  */
760
769
  uniform1fv(location: string, value: Float32Array) {
761
- this.gl.uniform1fv(
762
- this.gl.getUniformLocation(this.curProgram!, location),
763
- value,
764
- );
770
+ this.gl.uniform1fv(this.curUniformLocations[location] || null, value);
765
771
  }
766
772
 
767
773
  /**
@@ -771,10 +777,7 @@ export class WebGlContextWrapper {
771
777
  * @param v0 - The value to set.
772
778
  */
773
779
  uniform1i(location: string, v0: number) {
774
- this.gl.uniform1i(
775
- this.gl.getUniformLocation(this.curProgram!, location),
776
- v0,
777
- );
780
+ this.gl.uniform1i(this.curUniformLocations[location] || null, v0);
778
781
  }
779
782
 
780
783
  /**
@@ -784,10 +787,7 @@ export class WebGlContextWrapper {
784
787
  * @param value - The array of values to set.
785
788
  */
786
789
  uniform1iv(location: string, value: Int32Array) {
787
- this.gl.uniform1iv(
788
- this.gl.getUniformLocation(this.curProgram!, location),
789
- value,
790
- );
790
+ this.gl.uniform1iv(this.curUniformLocations[location] || null, value);
791
791
  }
792
792
 
793
793
  /**
@@ -798,11 +798,7 @@ export class WebGlContextWrapper {
798
798
  * @param v1 - The second component of the vector.
799
799
  */
800
800
  uniform2f(location: string, v0: number, v1: number) {
801
- this.gl.uniform2f(
802
- this.gl.getUniformLocation(this.curProgram!, location),
803
- v0,
804
- v1,
805
- );
801
+ this.gl.uniform2f(this.curUniformLocations[location] || null, v0, v1);
806
802
  }
807
803
 
808
804
  /**
@@ -813,7 +809,7 @@ export class WebGlContextWrapper {
813
809
  */
814
810
  uniform2fa(location: string, value: Vec2) {
815
811
  this.gl.uniform2f(
816
- this.gl.getUniformLocation(this.curProgram!, location),
812
+ this.curUniformLocations[location] || null,
817
813
  value[0],
818
814
  value[1],
819
815
  );
@@ -826,10 +822,7 @@ export class WebGlContextWrapper {
826
822
  * @param value - The array of vec2 values to set.
827
823
  */
828
824
  uniform2fv(location: string, value: Float32Array) {
829
- this.gl.uniform2fv(
830
- this.gl.getUniformLocation(this.curProgram!, location),
831
- value,
832
- );
825
+ this.gl.uniform2fv(this.curUniformLocations[location] || null, value);
833
826
  }
834
827
 
835
828
  /**
@@ -840,11 +833,7 @@ export class WebGlContextWrapper {
840
833
  * @param v1 - The second component of the vector.
841
834
  */
842
835
  uniform2i(location: string, v0: number, v1: number) {
843
- this.gl.uniform2i(
844
- this.gl.getUniformLocation(this.curProgram!, location),
845
- v0,
846
- v1,
847
- );
836
+ this.gl.uniform2i(this.curUniformLocations[location] || null, v0, v1);
848
837
  }
849
838
 
850
839
  /**
@@ -854,10 +843,7 @@ export class WebGlContextWrapper {
854
843
  * @param value - The array of ivec2 values to set.
855
844
  */
856
845
  uniform2iv(location: string, value: Int32Array) {
857
- this.gl.uniform2iv(
858
- this.gl.getUniformLocation(this.curProgram!, location),
859
- value,
860
- );
846
+ this.gl.uniform2iv(this.curUniformLocations[location] || null, value);
861
847
  }
862
848
 
863
849
  /**
@@ -869,12 +855,7 @@ export class WebGlContextWrapper {
869
855
  * @param v2 - The third component of the vector.
870
856
  */
871
857
  uniform3f(location: string, v0: number, v1: number, v2: number) {
872
- this.gl.uniform3f(
873
- this.gl.getUniformLocation(this.curProgram!, location),
874
- v0,
875
- v1,
876
- v2,
877
- );
858
+ this.gl.uniform3f(this.curUniformLocations[location] || null, v0, v1, v2);
878
859
  }
879
860
 
880
861
  /**
@@ -885,7 +866,7 @@ export class WebGlContextWrapper {
885
866
  */
886
867
  uniform3fa(location: string, value: Vec3) {
887
868
  this.gl.uniform3f(
888
- this.gl.getUniformLocation(this.curProgram!, location),
869
+ this.curUniformLocations[location] || null,
889
870
  value[0],
890
871
  value[1],
891
872
  value[2],
@@ -899,10 +880,7 @@ export class WebGlContextWrapper {
899
880
  * @param value - The array of vec3 values to set.
900
881
  */
901
882
  uniform3fv(location: string, value: Float32Array) {
902
- this.gl.uniform3fv(
903
- this.gl.getUniformLocation(this.curProgram!, location),
904
- value,
905
- );
883
+ this.gl.uniform3fv(this.curUniformLocations[location] || null, value);
906
884
  }
907
885
 
908
886
  /**
@@ -914,12 +892,7 @@ export class WebGlContextWrapper {
914
892
  * @param v2 - The third component of the vector.
915
893
  */
916
894
  uniform3i(location: string, v0: number, v1: number, v2: number) {
917
- this.gl.uniform3i(
918
- this.gl.getUniformLocation(this.curProgram!, location),
919
- v0,
920
- v1,
921
- v2,
922
- );
895
+ this.gl.uniform3i(this.curUniformLocations[location] || null, v0, v1, v2);
923
896
  }
924
897
 
925
898
  /**
@@ -929,10 +902,7 @@ export class WebGlContextWrapper {
929
902
  * @param value - The array of ivec3 values to set.
930
903
  */
931
904
  uniform3iv(location: string, value: Int32Array) {
932
- this.gl.uniform3iv(
933
- this.gl.getUniformLocation(this.curProgram!, location),
934
- value,
935
- );
905
+ this.gl.uniform3iv(this.curUniformLocations[location] || null, value);
936
906
  }
937
907
 
938
908
  /**
@@ -946,7 +916,7 @@ export class WebGlContextWrapper {
946
916
  */
947
917
  uniform4f(location: string, v0: number, v1: number, v2: number, v3: number) {
948
918
  this.gl.uniform4f(
949
- this.gl.getUniformLocation(this.curProgram!, location),
919
+ this.curUniformLocations[location] || null,
950
920
  v0,
951
921
  v1,
952
922
  v2,
@@ -962,7 +932,7 @@ export class WebGlContextWrapper {
962
932
  */
963
933
  uniform4fa(location: string, value: Vec4) {
964
934
  this.gl.uniform4f(
965
- this.gl.getUniformLocation(this.curProgram!, location),
935
+ this.curUniformLocations[location] || null,
966
936
  value[0],
967
937
  value[1],
968
938
  value[2],
@@ -977,10 +947,7 @@ export class WebGlContextWrapper {
977
947
  * @param value - The array of vec4 values to set.
978
948
  */
979
949
  uniform4fv(location: string, value: Float32Array) {
980
- this.gl.uniform4fv(
981
- this.gl.getUniformLocation(this.curProgram!, location),
982
- value,
983
- );
950
+ this.gl.uniform4fv(this.curUniformLocations[location] || null, value);
984
951
  }
985
952
 
986
953
  /**
@@ -994,7 +961,7 @@ export class WebGlContextWrapper {
994
961
  */
995
962
  uniform4i(location: string, v0: number, v1: number, v2: number, v3: number) {
996
963
  this.gl.uniform4i(
997
- this.gl.getUniformLocation(this.curProgram!, location),
964
+ this.curUniformLocations[location] || null,
998
965
  v0,
999
966
  v1,
1000
967
  v2,
@@ -1009,10 +976,7 @@ export class WebGlContextWrapper {
1009
976
  * @param value - The array of ivec4 values to set.
1010
977
  */
1011
978
  uniform4iv(location: string, value: Int32Array) {
1012
- this.gl.uniform4iv(
1013
- this.gl.getUniformLocation(this.curProgram!, location),
1014
- value,
1015
- );
979
+ this.gl.uniform4iv(this.curUniformLocations[location] || null, value);
1016
980
  }
1017
981
 
1018
982
  /**
@@ -1024,7 +988,7 @@ export class WebGlContextWrapper {
1024
988
  */
1025
989
  uniformMatrix2fv(location: string, value: Float32Array) {
1026
990
  this.gl.uniformMatrix2fv(
1027
- this.gl.getUniformLocation(this.curProgram!, location),
991
+ this.curUniformLocations[location] || null,
1028
992
  false,
1029
993
  value,
1030
994
  );
@@ -1037,7 +1001,7 @@ export class WebGlContextWrapper {
1037
1001
  */
1038
1002
  uniformMatrix3fv(location: string, value: Float32Array) {
1039
1003
  this.gl.uniformMatrix3fv(
1040
- this.gl.getUniformLocation(this.curProgram!, location),
1004
+ this.curUniformLocations[location] || null,
1041
1005
  false,
1042
1006
  value,
1043
1007
  );
@@ -1050,7 +1014,7 @@ export class WebGlContextWrapper {
1050
1014
  */
1051
1015
  uniformMatrix4fv(location: string, value: Float32Array) {
1052
1016
  this.gl.uniformMatrix4fv(
1053
- this.gl.getUniformLocation(this.curProgram!, location),
1017
+ this.curUniformLocations[location] || null,
1054
1018
  false,
1055
1019
  value,
1056
1020
  );
@@ -1319,6 +1283,36 @@ export class WebGlContextWrapper {
1319
1283
  deleteShader(shader: WebGLShader) {
1320
1284
  this.gl.deleteShader(shader);
1321
1285
  }
1286
+
1287
+ /**
1288
+ * ```
1289
+ * gl.deleteBuffer(buffer);
1290
+ * ```
1291
+ *
1292
+ * @param buffer - The buffer to delete
1293
+ */
1294
+ deleteBuffer(buffer: WebGLBuffer) {
1295
+ const { gl } = this;
1296
+ gl.deleteBuffer(buffer);
1297
+
1298
+ // Reset bound buffers if they match the deleted buffer
1299
+ if (this.boundArrayBuffer === buffer) {
1300
+ this.boundArrayBuffer = null;
1301
+ }
1302
+ }
1303
+
1304
+ /**
1305
+ * ```
1306
+ * gl.deleteVertexArray(vertexArray);
1307
+ * ```
1308
+ *
1309
+ * @param vertexArray - The vertex array object to delete
1310
+ */
1311
+ deleteVertexArray(vertexArray: WebGLVertexArrayObject) {
1312
+ if (this.isWebGl2()) {
1313
+ (this.gl as WebGL2RenderingContext).deleteVertexArray(vertexArray);
1314
+ }
1315
+ }
1322
1316
  }
1323
1317
 
1324
1318
  // prettier-ignore
@@ -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
  }