@lightningjs/renderer 0.9.3 → 1.0.0-rc.0

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 (295) hide show
  1. package/README.md +0 -82
  2. package/dist/exports/index.d.ts +40 -3
  3. package/dist/exports/index.js +35 -3
  4. package/dist/exports/index.js.map +1 -1
  5. package/dist/src/core/CoreNode.d.ts +462 -46
  6. package/dist/src/core/CoreNode.js +171 -103
  7. package/dist/src/core/CoreNode.js.map +1 -1
  8. package/dist/src/core/CoreShaderManager.d.ts +19 -8
  9. package/dist/src/core/CoreShaderManager.js +21 -21
  10. package/dist/src/core/CoreShaderManager.js.map +1 -1
  11. package/dist/src/core/CoreTextNode.d.ts +30 -4
  12. package/dist/src/core/CoreTextNode.js +24 -1
  13. package/dist/src/core/CoreTextNode.js.map +1 -1
  14. package/dist/src/core/CoreTextureManager.d.ts +31 -82
  15. package/dist/src/core/CoreTextureManager.js +39 -126
  16. package/dist/src/core/CoreTextureManager.js.map +1 -1
  17. package/dist/src/core/Stage.d.ts +67 -9
  18. package/dist/src/core/Stage.js +174 -30
  19. package/dist/src/core/Stage.js.map +1 -1
  20. package/dist/src/core/TextureMemoryManager.d.ts +97 -8
  21. package/dist/src/core/TextureMemoryManager.js +142 -19
  22. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  23. package/dist/src/core/animations/CoreAnimation.d.ts +14 -6
  24. package/dist/src/core/animations/CoreAnimation.js +136 -44
  25. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  26. package/dist/src/core/lib/ImageWorker.js +59 -52
  27. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  28. package/dist/src/core/lib/utils.d.ts +1 -0
  29. package/dist/src/core/lib/utils.js +3 -2
  30. package/dist/src/core/lib/utils.js.map +1 -1
  31. package/dist/src/core/platform.js +7 -1
  32. package/dist/src/core/platform.js.map +1 -1
  33. package/dist/src/core/renderers/CoreContextTexture.d.ts +3 -2
  34. package/dist/src/core/renderers/CoreContextTexture.js +7 -1
  35. package/dist/src/core/renderers/CoreContextTexture.js.map +1 -1
  36. package/dist/src/core/renderers/CoreRenderer.d.ts +5 -1
  37. package/dist/src/core/renderers/CoreRenderer.js +0 -1
  38. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  39. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +3 -0
  40. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +16 -1
  41. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -1
  42. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +0 -1
  43. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +2 -5
  44. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -1
  45. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +2 -2
  46. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +1 -1
  47. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +0 -1
  48. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +7 -10
  49. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  50. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +3 -0
  51. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +47 -9
  52. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  53. package/dist/src/core/renderers/webgl/newShader/abcMock.js +2 -0
  54. package/dist/src/core/renderers/webgl/newShader/abcMock.js.map +1 -0
  55. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +24 -8
  56. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +70 -37
  57. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
  58. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +2 -2
  59. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +1 -1
  60. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +2 -2
  61. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +1 -1
  62. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +2 -2
  63. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +1 -1
  64. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +2 -2
  65. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +1 -1
  66. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +2 -2
  67. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +1 -1
  68. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.d.ts +8 -0
  69. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +103 -0
  70. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +1 -1
  71. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +3 -18
  72. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +1 -1
  73. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +5 -2
  74. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +1 -1
  75. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +4 -36
  76. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js.map +1 -1
  77. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +3 -2
  78. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
  79. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +4 -2
  80. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -1
  81. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +2 -1
  82. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js.map +1 -1
  83. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +4 -36
  84. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +1 -1
  85. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.d.ts +11 -0
  86. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +1 -1
  87. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +5 -2
  88. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
  89. package/dist/src/core/text-rendering/font-face-types/TrFontFace.d.ts +0 -1
  90. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +0 -1
  91. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +1 -1
  92. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +0 -1
  93. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +1 -1
  94. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +10 -26
  95. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +116 -365
  96. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  97. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +0 -1
  98. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +0 -2
  99. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
  100. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +2 -2
  101. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  102. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +2 -0
  103. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
  104. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +3 -2
  105. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  106. package/dist/src/core/textures/ColorTexture.d.ts +1 -1
  107. package/dist/src/core/textures/ColorTexture.js +1 -1
  108. package/dist/src/core/textures/ImageTexture.d.ts +1 -1
  109. package/dist/src/core/textures/NoiseTexture.d.ts +1 -1
  110. package/dist/src/core/textures/NoiseTexture.js +3 -0
  111. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  112. package/dist/src/core/textures/SubTexture.d.ts +2 -2
  113. package/dist/src/core/textures/SubTexture.js +5 -1
  114. package/dist/src/core/textures/SubTexture.js.map +1 -1
  115. package/dist/src/core/textures/Texture.d.ts +23 -2
  116. package/dist/src/core/textures/Texture.js +32 -3
  117. package/dist/src/core/textures/Texture.js.map +1 -1
  118. package/dist/src/core/utils.d.ts +7 -0
  119. package/dist/src/core/utils.js +12 -10
  120. package/dist/src/core/utils.js.map +1 -1
  121. package/dist/src/effectsMock.d.ts +13 -0
  122. package/dist/src/effectsMock.js +62 -0
  123. package/dist/src/effectsMock.js.map +1 -0
  124. package/dist/src/main-api/DynamicShaderController.d.ts +28 -0
  125. package/dist/src/main-api/DynamicShaderController.js +55 -0
  126. package/dist/src/main-api/DynamicShaderController.js.map +1 -0
  127. package/dist/src/main-api/INode.d.ts +43 -463
  128. package/dist/src/main-api/INode.js +1 -19
  129. package/dist/src/main-api/INode.js.map +1 -1
  130. package/dist/src/main-api/Inspector.d.ts +10 -10
  131. package/dist/src/main-api/Inspector.js +18 -15
  132. package/dist/src/main-api/Inspector.js.map +1 -1
  133. package/dist/src/main-api/Renderer.d.ts +28 -24
  134. package/dist/src/main-api/Renderer.js +22 -103
  135. package/dist/src/main-api/Renderer.js.map +1 -1
  136. package/dist/src/main-api/ShaderController.d.ts +31 -0
  137. package/dist/src/main-api/ShaderController.js +37 -0
  138. package/dist/src/main-api/ShaderController.js.map +1 -0
  139. package/dist/src/test.js +4 -0
  140. package/dist/src/test.js.map +1 -0
  141. package/dist/src/utils.d.ts +1 -0
  142. package/dist/src/utils.js +7 -0
  143. package/dist/src/utils.js.map +1 -1
  144. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  145. package/exports/index.ts +60 -3
  146. package/package.json +8 -7
  147. package/src/core/CoreNode.test.ts +93 -0
  148. package/src/core/CoreNode.ts +675 -187
  149. package/src/core/CoreShaderManager.ts +63 -31
  150. package/src/core/CoreTextNode.ts +41 -9
  151. package/src/core/CoreTextureManager.ts +55 -175
  152. package/src/core/Stage.ts +199 -43
  153. package/src/core/TextureMemoryManager.ts +231 -22
  154. package/src/core/animations/CoreAnimation.ts +193 -68
  155. package/src/core/lib/ImageWorker.ts +79 -52
  156. package/src/core/lib/utils.ts +5 -2
  157. package/src/core/platform.ts +8 -1
  158. package/src/core/renderers/CoreContextTexture.ts +9 -2
  159. package/src/core/renderers/CoreRenderer.ts +5 -2
  160. package/src/core/renderers/canvas/CanvasCoreRenderer.ts +20 -1
  161. package/src/core/renderers/canvas/CanvasCoreTexture.ts +2 -6
  162. package/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.ts +2 -2
  163. package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +7 -11
  164. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +51 -9
  165. package/src/core/renderers/webgl/shaders/DynamicShader.ts +114 -55
  166. package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +2 -2
  167. package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +2 -2
  168. package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +2 -2
  169. package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +2 -2
  170. package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +2 -2
  171. package/src/core/renderers/webgl/shaders/effects/EffectUtils.ts +129 -3
  172. package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +7 -15
  173. package/src/core/renderers/webgl/shaders/effects/GlitchEffect.ts +5 -2
  174. package/src/core/renderers/webgl/shaders/effects/HolePunchEffect.ts +6 -15
  175. package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +6 -2
  176. package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +10 -2
  177. package/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.ts +2 -1
  178. package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +6 -15
  179. package/src/core/renderers/webgl/shaders/effects/ShaderEffect.ts +20 -0
  180. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +14 -15
  181. package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -2
  182. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -1
  183. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +139 -447
  184. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -3
  185. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +2 -2
  186. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +4 -2
  187. package/src/core/text-rendering/renderers/TextRenderer.ts +3 -2
  188. package/src/core/textures/ColorTexture.ts +1 -1
  189. package/src/core/textures/ImageTexture.ts +1 -1
  190. package/src/core/textures/NoiseTexture.ts +4 -1
  191. package/src/core/textures/SubTexture.ts +7 -7
  192. package/src/core/textures/Texture.ts +46 -3
  193. package/src/core/utils.ts +12 -11
  194. package/src/main-api/DynamicShaderController.ts +97 -0
  195. package/src/main-api/INode.ts +56 -479
  196. package/src/main-api/Inspector.ts +37 -39
  197. package/src/main-api/Renderer.ts +543 -0
  198. package/src/main-api/ShaderController.ts +81 -0
  199. package/src/main-api/utils.ts +45 -0
  200. package/src/utils.ts +8 -0
  201. package/dist/exports/core-api.d.ts +0 -74
  202. package/dist/exports/core-api.js +0 -96
  203. package/dist/exports/core-api.js.map +0 -1
  204. package/dist/exports/main-api.d.ts +0 -30
  205. package/dist/exports/main-api.js +0 -45
  206. package/dist/exports/main-api.js.map +0 -1
  207. package/dist/src/core/CoreExtension.d.ts +0 -12
  208. package/dist/src/core/CoreExtension.js +0 -29
  209. package/dist/src/core/CoreExtension.js.map +0 -1
  210. package/dist/src/core/renderers/webgl/newShader/effectsMock.js +0 -36
  211. package/dist/src/core/renderers/webgl/newShader/effectsMock.js.map +0 -1
  212. package/dist/src/main-api/ICoreDriver.d.ts +0 -24
  213. package/dist/src/main-api/ICoreDriver.js +0 -20
  214. package/dist/src/main-api/ICoreDriver.js.map +0 -1
  215. package/dist/src/main-api/RendererMain.d.ts +0 -378
  216. package/dist/src/main-api/RendererMain.js +0 -367
  217. package/dist/src/main-api/RendererMain.js.map +0 -1
  218. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.d.ts +0 -9
  219. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js +0 -38
  220. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js.map +0 -1
  221. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.d.ts +0 -56
  222. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js +0 -101
  223. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js.map +0 -1
  224. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.d.ts +0 -32
  225. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js +0 -28
  226. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js.map +0 -1
  227. package/dist/src/render-drivers/main/MainCoreDriver.d.ts +0 -21
  228. package/dist/src/render-drivers/main/MainCoreDriver.js +0 -115
  229. package/dist/src/render-drivers/main/MainCoreDriver.js.map +0 -1
  230. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +0 -101
  231. package/dist/src/render-drivers/main/MainOnlyNode.js +0 -425
  232. package/dist/src/render-drivers/main/MainOnlyNode.js.map +0 -1
  233. package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +0 -47
  234. package/dist/src/render-drivers/main/MainOnlyTextNode.js +0 -204
  235. package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +0 -1
  236. package/dist/src/render-drivers/threadx/NodeStruct.d.ts +0 -93
  237. package/dist/src/render-drivers/threadx/NodeStruct.js +0 -290
  238. package/dist/src/render-drivers/threadx/NodeStruct.js.map +0 -1
  239. package/dist/src/render-drivers/threadx/SharedNode.d.ts +0 -40
  240. package/dist/src/render-drivers/threadx/SharedNode.js +0 -61
  241. package/dist/src/render-drivers/threadx/SharedNode.js.map +0 -1
  242. package/dist/src/render-drivers/threadx/TextNodeStruct.d.ts +0 -44
  243. package/dist/src/render-drivers/threadx/TextNodeStruct.js +0 -203
  244. package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +0 -1
  245. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +0 -25
  246. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +0 -232
  247. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +0 -1
  248. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.d.ts +0 -24
  249. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js +0 -113
  250. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js.map +0 -1
  251. package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +0 -46
  252. package/dist/src/render-drivers/threadx/ThreadXMainNode.js +0 -160
  253. package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +0 -1
  254. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.d.ts +0 -28
  255. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +0 -55
  256. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +0 -1
  257. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +0 -70
  258. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js +0 -32
  259. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +0 -1
  260. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.d.ts +0 -19
  261. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +0 -184
  262. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +0 -1
  263. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.d.ts +0 -27
  264. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +0 -109
  265. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +0 -1
  266. package/dist/src/render-drivers/threadx/worker/renderer.js +0 -147
  267. package/dist/src/render-drivers/threadx/worker/renderer.js.map +0 -1
  268. package/dist/src/render-drivers/utils.d.ts +0 -12
  269. package/dist/src/render-drivers/utils.js +0 -74
  270. package/dist/src/render-drivers/utils.js.map +0 -1
  271. package/exports/core-api.ts +0 -102
  272. package/exports/main-api.ts +0 -60
  273. package/src/core/CoreExtension.ts +0 -32
  274. package/src/main-api/ICoreDriver.ts +0 -68
  275. package/src/main-api/RendererMain.ts +0 -685
  276. package/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.ts +0 -45
  277. package/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.ts +0 -154
  278. package/src/main-api/texture-usage-trackers/TextureUsageTracker.ts +0 -54
  279. package/src/render-drivers/main/MainCoreDriver.ts +0 -159
  280. package/src/render-drivers/main/MainOnlyNode.ts +0 -553
  281. package/src/render-drivers/main/MainOnlyTextNode.ts +0 -261
  282. package/src/render-drivers/threadx/NodeStruct.ts +0 -320
  283. package/src/render-drivers/threadx/SharedNode.ts +0 -101
  284. package/src/render-drivers/threadx/TextNodeStruct.ts +0 -213
  285. package/src/render-drivers/threadx/ThreadXCoreDriver.ts +0 -291
  286. package/src/render-drivers/threadx/ThreadXMainAnimationController.ts +0 -135
  287. package/src/render-drivers/threadx/ThreadXMainNode.ts +0 -201
  288. package/src/render-drivers/threadx/ThreadXMainTextNode.ts +0 -85
  289. package/src/render-drivers/threadx/ThreadXRendererMessage.ts +0 -112
  290. package/src/render-drivers/threadx/worker/ThreadXRendererNode.ts +0 -253
  291. package/src/render-drivers/threadx/worker/ThreadXRendererTextNode.ts +0 -151
  292. package/src/render-drivers/threadx/worker/renderer.ts +0 -156
  293. package/src/render-drivers/utils.ts +0 -102
  294. /package/dist/src/core/renderers/webgl/newShader/{effectsMock.d.ts → abcMock.d.ts} +0 -0
  295. /package/dist/src/{render-drivers/threadx/worker/renderer.d.ts → test.d.ts} +0 -0
package/src/core/Stage.ts CHANGED
@@ -20,10 +20,10 @@ import { startLoop, getTimeStamp } from './platform.js';
20
20
  import { WebGlCoreRenderer } from './renderers/webgl/WebGlCoreRenderer.js';
21
21
  import { assertTruthy, setPremultiplyMode } from '../utils.js';
22
22
  import { AnimationManager } from './animations/AnimationManager.js';
23
- import { CoreNode } from './CoreNode.js';
23
+ import { CoreNode, type CoreNodeProps } from './CoreNode.js';
24
24
  import { CoreTextureManager } from './CoreTextureManager.js';
25
25
  import { TrFontManager } from './text-rendering/TrFontManager.js';
26
- import { CoreShaderManager } from './CoreShaderManager.js';
26
+ import { CoreShaderManager, type ShaderMap } from './CoreShaderManager.js';
27
27
  import type {
28
28
  TextRenderer,
29
29
  TextRendererMap,
@@ -37,18 +37,23 @@ import type {
37
37
  FpsUpdatePayload,
38
38
  FrameTickPayload,
39
39
  } from '../common/CommonTypes.js';
40
- import { TextureMemoryManager } from './TextureMemoryManager.js';
40
+ import {
41
+ TextureMemoryManager,
42
+ type TextureMemoryManagerSettings,
43
+ } from './TextureMemoryManager.js';
41
44
  import type {
42
45
  CoreRenderer,
43
46
  CoreRendererOptions,
44
47
  } from './renderers/CoreRenderer.js';
45
48
  import { CanvasCoreRenderer } from './renderers/canvas/CanvasCoreRenderer.js';
49
+ import type { BaseShaderController } from '../main-api/ShaderController.js';
50
+ import { CoreTextNode, type CoreTextNodeProps } from './CoreTextNode.js';
51
+ import { santizeCustomDataMap } from '../main-api/utils.js';
46
52
 
47
53
  export interface StageOptions {
48
- rootId: number;
49
54
  appWidth: number;
50
55
  appHeight: number;
51
- txMemByteThreshold: number;
56
+ textureMemory: TextureMemoryManagerSettings;
52
57
  boundsMargin: number | [number, number, number, number];
53
58
  deviceLogicalPixelRatio: number;
54
59
  devicePhysicalPixelRatio: number;
@@ -58,10 +63,7 @@ export interface StageOptions {
58
63
  enableContextSpy: boolean;
59
64
  numImageWorkers: number;
60
65
  renderMode: 'webgl' | 'canvas';
61
-
62
- debug?: {
63
- monitorTextureCache?: boolean;
64
- };
66
+ eventBus: EventEmitter;
65
67
  }
66
68
 
67
69
  export type StageFpsUpdateHandler = (
@@ -77,7 +79,7 @@ export type StageFrameTickHandler = (
77
79
  const bufferMemory = 2e6;
78
80
  const autoStart = true;
79
81
 
80
- export class Stage extends EventEmitter {
82
+ export class Stage {
81
83
  /// Module Instances
82
84
  public readonly animationManager: AnimationManager;
83
85
  public readonly txManager: CoreTextureManager;
@@ -88,6 +90,17 @@ export class Stage extends EventEmitter {
88
90
  public readonly renderer: CoreRenderer;
89
91
  public readonly root: CoreNode;
90
92
  public readonly boundsMargin: [number, number, number, number];
93
+ public readonly defShaderCtr: BaseShaderController;
94
+
95
+ /**
96
+ * Renderer Event Bus for the Stage to emit events onto
97
+ *
98
+ * @remarks
99
+ * In reality this is just the RendererMain instance, which is an EventEmitter.
100
+ * this allows us to directly emit events from the Stage to RendererMain
101
+ * without having to set up forwarding handlers.
102
+ */
103
+ public readonly eventBus: EventEmitter;
91
104
 
92
105
  /// State
93
106
  deltaTime = 0;
@@ -96,6 +109,7 @@ export class Stage extends EventEmitter {
96
109
  private fpsNumFrames = 0;
97
110
  private fpsElapsedTime = 0;
98
111
  private renderRequested = false;
112
+ private frameEventQueue: [name: string, payload: unknown][] = [];
99
113
 
100
114
  /// Debug data
101
115
  contextSpy: ContextSpy | null = null;
@@ -104,23 +118,21 @@ export class Stage extends EventEmitter {
104
118
  * Stage constructor
105
119
  */
106
120
  constructor(readonly options: StageOptions) {
107
- super();
108
121
  const {
109
122
  canvas,
110
123
  clearColor,
111
- rootId,
112
- debug,
113
124
  appWidth,
114
125
  appHeight,
115
126
  boundsMargin,
116
127
  enableContextSpy,
117
128
  numImageWorkers,
118
- txMemByteThreshold,
129
+ textureMemory,
119
130
  renderMode,
120
131
  } = options;
121
132
 
133
+ this.eventBus = options.eventBus;
122
134
  this.txManager = new CoreTextureManager(numImageWorkers);
123
- this.txMemManager = new TextureMemoryManager(txMemByteThreshold);
135
+ this.txMemManager = new TextureMemoryManager(this, textureMemory);
124
136
  this.shManager = new CoreShaderManager();
125
137
  this.animationManager = new AnimationManager();
126
138
  this.contextSpy = enableContextSpy ? new ContextSpy() : null;
@@ -133,15 +145,6 @@ export class Stage extends EventEmitter {
133
145
  }
134
146
  this.boundsMargin = bm;
135
147
 
136
- if (debug?.monitorTextureCache) {
137
- setInterval(() => {
138
- assertTruthy(this.txManager);
139
- const debugInfo = this.txManager.getDebugInfo();
140
- console.log('Texture ID Cache Size: ', debugInfo.idCacheSize);
141
- console.log('Texture Key Cache Size: ', debugInfo.keyCacheSize);
142
- }, 1000);
143
- }
144
-
145
148
  const rendererOptions: CoreRendererOptions = {
146
149
  stage: this,
147
150
  canvas,
@@ -160,6 +163,7 @@ export class Stage extends EventEmitter {
160
163
  } else {
161
164
  this.renderer = new WebGlCoreRenderer(rendererOptions);
162
165
  }
166
+ this.defShaderCtr = this.renderer.getDefShaderCtr();
163
167
  setPremultiplyMode(renderMode);
164
168
 
165
169
  // Must do this after renderer is created
@@ -178,7 +182,6 @@ export class Stage extends EventEmitter {
178
182
 
179
183
  // create root node
180
184
  const rootNode = new CoreNode(this, {
181
- id: rootId,
182
185
  x: 0,
183
186
  y: 0,
184
187
  width: appWidth,
@@ -208,10 +211,11 @@ export class Stage extends EventEmitter {
208
211
  rotation: 0,
209
212
  parent: null,
210
213
  texture: null,
211
- textureOptions: null,
212
- shader: null,
213
- shaderProps: null,
214
+ textureOptions: {},
215
+ shader: this.defShaderCtr,
214
216
  rtt: false,
217
+ src: null,
218
+ scale: 1,
215
219
  });
216
220
 
217
221
  this.root = rootNode;
@@ -222,6 +226,24 @@ export class Stage extends EventEmitter {
222
226
  }
223
227
  }
224
228
 
229
+ updateFrameTime() {
230
+ const newFrameTime = getTimeStamp();
231
+ this.lastFrameTime = this.currentFrameTime;
232
+ this.currentFrameTime = newFrameTime;
233
+ this.deltaTime = !this.lastFrameTime
234
+ ? 100 / 6
235
+ : newFrameTime - this.lastFrameTime;
236
+ this.txManager.frameTime = newFrameTime;
237
+ this.txMemManager.frameTime = newFrameTime;
238
+
239
+ // This event is emitted at the beginning of the frame (before any updates
240
+ // or rendering), so no need to to use `stage.queueFrameEvent` here.
241
+ this.eventBus.emit('frameTick', {
242
+ time: this.currentFrameTime,
243
+ delta: this.deltaTime,
244
+ });
245
+ }
246
+
225
247
  /**
226
248
  * Update animations
227
249
  */
@@ -230,17 +252,6 @@ export class Stage extends EventEmitter {
230
252
  if (!this.root) {
231
253
  return;
232
254
  }
233
- this.lastFrameTime = this.currentFrameTime;
234
- this.currentFrameTime = getTimeStamp();
235
-
236
- this.deltaTime = !this.lastFrameTime
237
- ? 100 / 6
238
- : this.currentFrameTime - this.lastFrameTime;
239
-
240
- this.emit('frameTick', {
241
- time: this.currentFrameTime,
242
- delta: this.deltaTime,
243
- });
244
255
  // step animation
245
256
  animationManager.update(this.deltaTime);
246
257
  }
@@ -267,9 +278,9 @@ export class Stage extends EventEmitter {
267
278
  // Reset render operations and clear the canvas
268
279
  renderer.reset();
269
280
 
270
- // Check if we need to garbage collect
271
- if (renderer.txMemManager.gcRequested) {
272
- renderer.txMemManager.gc();
281
+ // Check if we need to cleanup textures
282
+ if (this.txMemManager.criticalCleanupRequested) {
283
+ this.txMemManager.cleanup();
273
284
  }
274
285
 
275
286
  // If we have RTT nodes draw them first
@@ -292,6 +303,40 @@ export class Stage extends EventEmitter {
292
303
  }
293
304
  }
294
305
 
306
+ /**
307
+ * Queue an event to be emitted after the current/next frame is rendered
308
+ *
309
+ * @remarks
310
+ * When we are operating in the context of the render loop, we may want to
311
+ * emit events that are related to the current frame. However, we generally do
312
+ * NOT want to emit events directly in the middle of the render loop, since
313
+ * this could enable event handlers to modify the scene graph and cause
314
+ * unexpected behavior. Instead, we queue up events to be emitted and then
315
+ * flush the queue after the frame has been rendered.
316
+ *
317
+ * @param name
318
+ * @param data
319
+ */
320
+ queueFrameEvent(name: string, data: unknown) {
321
+ this.frameEventQueue.push([name, data]);
322
+ }
323
+
324
+ /**
325
+ * Emit all queued frame events
326
+ *
327
+ * @remarks
328
+ * This method should be called after the frame has been rendered to emit
329
+ * all events that were queued during the frame.
330
+ *
331
+ * See {@link queueFrameEvent} for more information.
332
+ */
333
+ flushFrameEvents() {
334
+ for (const [name, data] of this.frameEventQueue) {
335
+ this.eventBus.emit(name, data);
336
+ }
337
+ this.frameEventQueue = [];
338
+ }
339
+
295
340
  calculateFps() {
296
341
  // If there's an FPS update interval, emit the FPS update event
297
342
  // when the specified interval has elapsed.
@@ -305,7 +350,7 @@ export class Stage extends EventEmitter {
305
350
  );
306
351
  this.fpsNumFrames = 0;
307
352
  this.fpsElapsedTime = 0;
308
- this.emit('fpsUpdate', {
353
+ this.queueFrameEvent('fpsUpdate', {
309
354
  fps,
310
355
  contextSpyData: this.contextSpy?.getData() ?? null,
311
356
  } satisfies FpsUpdatePayload);
@@ -407,4 +452,115 @@ export class Stage extends EventEmitter {
407
452
  // the covariant state argument in the setter method map
408
453
  return resolvedTextRenderer as unknown as TextRenderer;
409
454
  }
455
+
456
+ /**
457
+ * Create a shader controller instance
458
+ *
459
+ * @param type
460
+ * @param props
461
+ * @returns
462
+ */
463
+ createShaderCtr(
464
+ type: keyof ShaderMap,
465
+ props: Record<string, unknown>,
466
+ ): BaseShaderController {
467
+ return this.shManager.loadShader(type, props);
468
+ }
469
+
470
+ createNode(props: Partial<CoreNodeProps>) {
471
+ const resolvedProps = this.resolveNodeDefaults(props);
472
+ return new CoreNode(this, resolvedProps);
473
+ }
474
+
475
+ createTextNode(props: Partial<CoreTextNodeProps>) {
476
+ const fontSize = props.fontSize ?? 16;
477
+ const resolvedProps = {
478
+ ...this.resolveNodeDefaults(props),
479
+ text: props.text ?? '',
480
+ textRendererOverride: props.textRendererOverride ?? null,
481
+ fontSize,
482
+ fontFamily: props.fontFamily ?? 'sans-serif',
483
+ fontStyle: props.fontStyle ?? 'normal',
484
+ fontWeight: props.fontWeight ?? 'normal',
485
+ fontStretch: props.fontStretch ?? 'normal',
486
+ textAlign: props.textAlign ?? 'left',
487
+ contain: props.contain ?? 'none',
488
+ scrollable: props.scrollable ?? false,
489
+ scrollY: props.scrollY ?? 0,
490
+ offsetY: props.offsetY ?? 0,
491
+ letterSpacing: props.letterSpacing ?? 0,
492
+ lineHeight: props.lineHeight, // `undefined` is a valid value
493
+ maxLines: props.maxLines ?? 0,
494
+ textBaseline: props.textBaseline ?? 'alphabetic',
495
+ verticalAlign: props.verticalAlign ?? 'middle',
496
+ overflowSuffix: props.overflowSuffix ?? '...',
497
+ debug: props.debug ?? {},
498
+ shaderProps: null,
499
+ };
500
+
501
+ return new CoreTextNode(this, resolvedProps);
502
+ }
503
+
504
+ /**
505
+ * Resolves the default property values for a Node
506
+ *
507
+ * @remarks
508
+ * This method is used internally by the RendererMain to resolve the default
509
+ * property values for a Node. It is exposed publicly so that it can be used
510
+ * by Core Driver implementations.
511
+ *
512
+ * @param props
513
+ * @returns
514
+ */
515
+ protected resolveNodeDefaults(props: Partial<CoreNodeProps>): CoreNodeProps {
516
+ const color = props.color ?? 0xffffffff;
517
+ const colorTl = props.colorTl ?? props.colorTop ?? props.colorLeft ?? color;
518
+ const colorTr =
519
+ props.colorTr ?? props.colorTop ?? props.colorRight ?? color;
520
+ const colorBl =
521
+ props.colorBl ?? props.colorBottom ?? props.colorLeft ?? color;
522
+ const colorBr =
523
+ props.colorBr ?? props.colorBottom ?? props.colorRight ?? color;
524
+ const data = santizeCustomDataMap(props.data ?? {});
525
+
526
+ return {
527
+ x: props.x ?? 0,
528
+ y: props.y ?? 0,
529
+ width: props.width ?? 0,
530
+ height: props.height ?? 0,
531
+ alpha: props.alpha ?? 1,
532
+ autosize: props.autosize ?? false,
533
+ clipping: props.clipping ?? false,
534
+ color,
535
+ colorTop: props.colorTop ?? color,
536
+ colorBottom: props.colorBottom ?? color,
537
+ colorLeft: props.colorLeft ?? color,
538
+ colorRight: props.colorRight ?? color,
539
+ colorBl,
540
+ colorBr,
541
+ colorTl,
542
+ colorTr,
543
+ zIndex: props.zIndex ?? 0,
544
+ zIndexLocked: props.zIndexLocked ?? 0,
545
+ parent: props.parent ?? null,
546
+ texture: props.texture ?? null,
547
+ textureOptions: props.textureOptions ?? {},
548
+ shader: props.shader ?? this.defShaderCtr,
549
+ // Since setting the `src` will trigger a texture load, we need to set it after
550
+ // we set the texture. Otherwise, problems happen.
551
+ src: props.src ?? '',
552
+ scale: props.scale ?? null,
553
+ scaleX: props.scaleX ?? props.scale ?? 1,
554
+ scaleY: props.scaleY ?? props.scale ?? 1,
555
+ mount: props.mount ?? 0,
556
+ mountX: props.mountX ?? props.mount ?? 0,
557
+ mountY: props.mountY ?? props.mount ?? 0,
558
+ pivot: props.pivot ?? 0.5,
559
+ pivotX: props.pivotX ?? props.pivot ?? 0.5,
560
+ pivotY: props.pivotY ?? props.pivot ?? 0.5,
561
+ rotation: props.rotation ?? 0,
562
+ rtt: props.rtt ?? false,
563
+ data: data,
564
+ };
565
+ }
410
566
  }
@@ -16,53 +16,262 @@
16
16
  * See the License for the specific language governing permissions and
17
17
  * limitations under the License.
18
18
  */
19
- import type { CoreContextTexture } from './renderers/CoreContextTexture.js';
19
+ import type { Stage } from './Stage.js';
20
+ import type { Texture } from './textures/Texture.js';
21
+ import { bytesToMb } from './utils.js';
20
22
 
23
+ export interface TextureMemoryManagerSettings {
24
+ /**
25
+ * Critical Threshold (in bytes)
26
+ *
27
+ * @remarks
28
+ * When the amount of memory used by textures exceeds this threshold,
29
+ * the Renderer will immediately trigger a Texture Cleanup towards the
30
+ * Target Threshold Level.
31
+ *
32
+ * When set to `0`, the Texture Memory Manager is disabled.
33
+ *
34
+ * @defaultValue `124e6` (118 MB)
35
+ */
36
+ criticalThreshold: number;
37
+
38
+ /**
39
+ * Target Threshold Level (as fraction of Critical Threshold)
40
+ *
41
+ * @remarks
42
+ * This value is the fractional level of the Critical Threshold that the
43
+ * Texture Memory Manager will attempt to maintain by cleaning up textures.
44
+ * The Texture Memory Manager will attempt to keep the memory usage below
45
+ * this level by freeing up non-renderable textures.
46
+ *
47
+ * Valid Range: 0.0 - 1.0
48
+ *
49
+ * @defaultValue `0.5`
50
+ */
51
+ targetThresholdLevel: number;
52
+
53
+ /**
54
+ * Interval between Texture Cleanups (in milliseconds)
55
+ *
56
+ * @remarks
57
+ * Texture Memory Manager will perform a Texture Cleanup no more
58
+ * frequently than this interval generally when the scene becomes idle.
59
+ *
60
+ * @defaultValue `30,000` (30 seconds)
61
+ */
62
+ cleanupInterval: number;
63
+
64
+ /**
65
+ * Whether or not to log debug information
66
+ *
67
+ * @defaultValue `false`
68
+ */
69
+ debugLogging: boolean;
70
+ }
71
+
72
+ export interface MemoryInfo {
73
+ criticalThreshold: number;
74
+ targetThreshold: number;
75
+ renderableMemUsed: number;
76
+ memUsed: number;
77
+ renderableTexturesLoaded: number;
78
+ loadedTextures: number;
79
+ }
80
+
81
+ /**
82
+ * LRU (Least Recently Used) style memory manager for textures
83
+ *
84
+ * @remarks
85
+ * This class is responsible for managing the memory usage of textures
86
+ * in the Renderer. It keeps track of the memory used by each texture
87
+ * and triggers a cleanup when the memory usage exceeds a critical
88
+ * threshold (`criticalThreshold`).
89
+ *
90
+ * The cleanup process will free up non-renderable textures until the
91
+ * memory usage is below a target threshold (`targetThresholdLevel`).
92
+ *
93
+ * The memory manager's clean up process will also be triggered when the
94
+ * scene is idle for a certain amount of time (`cleanupInterval`).
95
+ */
21
96
  export class TextureMemoryManager {
22
97
  private memUsed = 0;
23
- private textures: Map<CoreContextTexture, number> = new Map();
24
- private threshold: number;
25
- public gcRequested = false;
26
-
98
+ private loadedTextures: Map<Texture, number> = new Map();
99
+ private criticalThreshold: number;
100
+ private targetThreshold: number;
101
+ private cleanupInterval: number;
102
+ private debugLogging: boolean;
103
+ private lastCleanupTime = 0;
104
+ public criticalCleanupRequested = false;
27
105
  /**
28
- * @param byteThreshold Number of texture bytes to trigger garbage collection
106
+ * The current frame time in milliseconds
107
+ *
108
+ * @remarks
109
+ * This is used to determine when to perform Idle Texture Cleanups.
110
+ *
111
+ * Set by stage via `updateFrameTime` method.
29
112
  */
30
- constructor(byteThreshold: number) {
31
- this.threshold = byteThreshold;
113
+ public frameTime = 0;
114
+
115
+ constructor(private stage: Stage, settings: TextureMemoryManagerSettings) {
116
+ const { criticalThreshold } = settings;
117
+ this.criticalThreshold = Math.round(criticalThreshold);
118
+ const targetFraction = Math.max(
119
+ 0,
120
+ Math.min(1, settings.targetThresholdLevel),
121
+ );
122
+ this.targetThreshold = Math.round(criticalThreshold * targetFraction);
123
+ this.cleanupInterval = settings.cleanupInterval;
124
+ this.debugLogging = settings.debugLogging;
125
+
126
+ if (settings.debugLogging) {
127
+ let lastMemUse = 0;
128
+ setInterval(() => {
129
+ if (lastMemUse !== this.memUsed) {
130
+ lastMemUse = this.memUsed;
131
+ console.log(
132
+ `[TextureMemoryManager] Memory used: ${bytesToMb(
133
+ this.memUsed,
134
+ )} mb / ${bytesToMb(this.criticalThreshold)} mb (${(
135
+ (this.memUsed / this.criticalThreshold) *
136
+ 100
137
+ ).toFixed(1)}%)`,
138
+ );
139
+ }
140
+ }, 1000);
141
+ }
32
142
 
33
143
  // If the threshold is 0, we disable the memory manager by replacing the
34
144
  // setTextureMemUse method with a no-op function.
35
- if (byteThreshold === 0) {
145
+ if (criticalThreshold === 0) {
36
146
  // eslint-disable-next-line @typescript-eslint/no-empty-function
37
147
  this.setTextureMemUse = () => {};
38
148
  }
39
149
  }
40
150
 
41
- setTextureMemUse(ctxTexture: CoreContextTexture, byteSize: number) {
42
- if (this.textures.has(ctxTexture)) {
151
+ setTextureMemUse(texture: Texture, byteSize: number) {
152
+ if (this.loadedTextures.has(texture)) {
43
153
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
44
- this.memUsed -= this.textures.get(ctxTexture)!;
154
+ this.memUsed -= this.loadedTextures.get(texture)!;
45
155
  }
46
156
 
47
157
  if (byteSize === 0) {
48
- this.textures.delete(ctxTexture);
158
+ this.loadedTextures.delete(texture);
49
159
  return;
50
160
  } else {
51
161
  this.memUsed += byteSize;
52
- this.textures.set(ctxTexture, byteSize);
162
+ this.loadedTextures.set(texture, byteSize);
53
163
  }
54
164
 
55
- if (this.memUsed > this.threshold) {
56
- this.gcRequested = true;
165
+ if (this.memUsed > this.criticalThreshold) {
166
+ this.criticalCleanupRequested = true;
57
167
  }
58
168
  }
59
169
 
60
- gc() {
61
- this.gcRequested = false;
62
- this.textures.forEach((byteSize, ctxTexture) => {
63
- if (!ctxTexture.renderable) {
64
- ctxTexture.free();
170
+ checkCleanup() {
171
+ return (
172
+ this.criticalCleanupRequested ||
173
+ (this.memUsed > this.targetThreshold &&
174
+ this.frameTime - this.lastCleanupTime >= this.cleanupInterval)
175
+ );
176
+ }
177
+
178
+ cleanup() {
179
+ const critical = this.criticalCleanupRequested;
180
+ this.lastCleanupTime = this.frameTime;
181
+ this.criticalCleanupRequested = false;
182
+
183
+ if (critical) {
184
+ this.stage.queueFrameEvent('criticalCleanup', {
185
+ memUsed: this.memUsed,
186
+ criticalThreshold: this.criticalThreshold,
187
+ });
188
+ }
189
+
190
+ if (this.debugLogging) {
191
+ console.log(
192
+ `[TextureMemoryManager] Cleaning up textures. Critical: ${critical}`,
193
+ );
194
+ }
195
+
196
+ /**
197
+ * Sort the loaded textures by renderability, then by last touch time.
198
+ *
199
+ * This will ensure that the array is ordered by the following:
200
+ * - Non-renderable textures, starting at the least recently rendered
201
+ * - Renderable textures, starting at the least recently rendered
202
+ */
203
+ const textures = [...this.loadedTextures.keys()].sort(
204
+ (textureA, textureB) => {
205
+ const txARenderable = textureA.renderable;
206
+ const txBRenderable = textureB.renderable;
207
+ if (txARenderable === txBRenderable) {
208
+ return (
209
+ textureA.lastRenderableChangeTime -
210
+ textureB.lastRenderableChangeTime
211
+ );
212
+ } else if (txARenderable) {
213
+ return 1;
214
+ } else if (txBRenderable) {
215
+ return -1;
216
+ }
217
+ return 0;
218
+ },
219
+ );
220
+
221
+ // Free non-renderable textures until we reach the target threshold
222
+ const memTarget = this.targetThreshold;
223
+ const txManager = this.stage.txManager;
224
+ for (const texture of textures) {
225
+ if (texture.renderable) {
226
+ // Stop at the first renderable texture (The rest are renderable because of the sort above)
227
+ // We don't want to free renderable textures because they will just likely be reloaded in the next frame
228
+ break;
229
+ }
230
+ texture.ctxTexture.free();
231
+ txManager.removeTextureFromCache(texture);
232
+ if (this.memUsed <= memTarget) {
233
+ // Stop once we've freed enough textures to reach under the target threshold
234
+ break;
65
235
  }
66
- });
236
+ }
237
+
238
+ if (this.memUsed >= this.criticalThreshold) {
239
+ this.stage.queueFrameEvent('criticalCleanupFailed', {
240
+ memUsed: this.memUsed,
241
+ criticalThreshold: this.criticalThreshold,
242
+ });
243
+ console.warn(
244
+ `[TextureMemoryManager] Memory usage above critical threshold after cleanup: ${this.memUsed}`,
245
+ );
246
+ }
247
+ }
248
+
249
+ /**
250
+ * Get the current texture memory usage information
251
+ *
252
+ * @remarks
253
+ * This method is for debugging purposes and returns information about the
254
+ * current memory usage of the textures in the Renderer.
255
+ */
256
+ getMemoryInfo(): MemoryInfo {
257
+ let renderableTexturesLoaded = 0;
258
+ const renderableMemUsed = [...this.loadedTextures.keys()].reduce(
259
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
260
+ (acc, texture) => {
261
+ renderableTexturesLoaded += texture.renderable ? 1 : 0;
262
+ return (
263
+ acc + (texture.renderable ? this.loadedTextures.get(texture)! : 0)
264
+ );
265
+ },
266
+ 0,
267
+ );
268
+ return {
269
+ criticalThreshold: this.criticalThreshold,
270
+ targetThreshold: this.targetThreshold,
271
+ renderableMemUsed,
272
+ memUsed: this.memUsed,
273
+ renderableTexturesLoaded,
274
+ loadedTextures: this.loadedTextures.size,
275
+ };
67
276
  }
68
277
  }