@lightningjs/renderer 3.0.0-beta2 → 3.0.0-beta21

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 (587) hide show
  1. package/README.md +16 -26
  2. package/dist/exports/canvas.d.ts +1 -1
  3. package/dist/exports/canvas.js +1 -1
  4. package/dist/exports/canvas.js.map +1 -1
  5. package/dist/exports/index.d.ts +2 -5
  6. package/dist/exports/index.js +1 -5
  7. package/dist/exports/index.js.map +1 -1
  8. package/dist/exports/utils.d.ts +2 -1
  9. package/dist/exports/utils.js +2 -1
  10. package/dist/exports/utils.js.map +1 -1
  11. package/dist/exports/webgl.d.ts +2 -1
  12. package/dist/exports/webgl.js +2 -1
  13. package/dist/exports/webgl.js.map +1 -1
  14. package/dist/src/common/CommonTypes.d.ts +13 -2
  15. package/dist/src/core/Autosizer.d.ts +35 -0
  16. package/dist/src/core/Autosizer.js +196 -0
  17. package/dist/src/core/Autosizer.js.map +1 -0
  18. package/dist/src/core/CoreNode.d.ts +124 -100
  19. package/dist/src/core/CoreNode.js +720 -472
  20. package/dist/src/core/CoreNode.js.map +1 -1
  21. package/dist/src/core/CoreShaderManager.d.ts +3 -5
  22. package/dist/src/core/CoreShaderManager.js.map +1 -1
  23. package/dist/src/core/CoreTextNode.d.ts +74 -87
  24. package/dist/src/core/CoreTextNode.js +355 -232
  25. package/dist/src/core/CoreTextNode.js.map +1 -1
  26. package/dist/src/core/CoreTextureManager.d.ts +25 -13
  27. package/dist/src/core/CoreTextureManager.js +80 -104
  28. package/dist/src/core/CoreTextureManager.js.map +1 -1
  29. package/dist/src/core/Stage.d.ts +93 -33
  30. package/dist/src/core/Stage.js +315 -151
  31. package/dist/src/core/Stage.js.map +1 -1
  32. package/dist/src/core/TextureError.d.ts +11 -0
  33. package/dist/src/core/TextureError.js +37 -0
  34. package/dist/src/core/TextureError.js.map +1 -0
  35. package/dist/src/core/TextureMemoryManager.d.ts +11 -4
  36. package/dist/src/core/TextureMemoryManager.js +128 -109
  37. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  38. package/dist/src/core/animations/Animation.d.ts +21 -0
  39. package/dist/src/core/animations/Animation.js +194 -0
  40. package/dist/src/core/animations/Animation.js.map +1 -0
  41. package/dist/src/core/animations/CoreAnimation.d.ts +3 -3
  42. package/dist/src/core/animations/CoreAnimation.js +8 -3
  43. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  44. package/dist/src/core/animations/CoreAnimationController.d.ts +1 -0
  45. package/dist/src/core/animations/CoreAnimationController.js +11 -4
  46. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  47. package/dist/src/core/animations/Playback.d.ts +64 -0
  48. package/dist/src/core/animations/Playback.js +169 -0
  49. package/dist/src/core/animations/Playback.js.map +1 -0
  50. package/dist/src/core/animations/Transition.d.ts +27 -0
  51. package/dist/src/core/animations/Transition.js +52 -0
  52. package/dist/src/core/animations/Transition.js.map +1 -0
  53. package/dist/src/core/animations/utils.d.ts +2 -0
  54. package/dist/src/core/animations/utils.js +136 -0
  55. package/dist/src/core/animations/utils.js.map +1 -0
  56. package/dist/src/core/lib/ImageWorker.d.ts +2 -2
  57. package/dist/src/core/lib/ImageWorker.js +31 -12
  58. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  59. package/dist/src/core/lib/WebGlContextWrapper.d.ts +41 -3
  60. package/dist/src/core/lib/WebGlContextWrapper.js +105 -28
  61. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  62. package/dist/src/core/lib/collectionUtils.d.ts +5 -0
  63. package/dist/src/core/lib/collectionUtils.js +100 -0
  64. package/dist/src/core/lib/collectionUtils.js.map +1 -0
  65. package/dist/src/core/lib/colorCache.d.ts +1 -0
  66. package/dist/src/core/lib/colorCache.js +19 -0
  67. package/dist/src/core/lib/colorCache.js.map +1 -0
  68. package/dist/src/core/lib/colorParser.d.ts +21 -0
  69. package/dist/src/core/lib/colorParser.js +72 -0
  70. package/dist/src/core/lib/colorParser.js.map +1 -0
  71. package/dist/src/core/lib/textureCompression.d.ts +14 -2
  72. package/dist/src/core/lib/textureCompression.js +320 -67
  73. package/dist/src/core/lib/textureCompression.js.map +1 -1
  74. package/dist/src/core/lib/utils.d.ts +8 -2
  75. package/dist/src/core/lib/utils.js +43 -21
  76. package/dist/src/core/lib/utils.js.map +1 -1
  77. package/dist/src/core/lib/validateImageBitmap.d.ts +2 -1
  78. package/dist/src/core/lib/validateImageBitmap.js +4 -4
  79. package/dist/src/core/lib/validateImageBitmap.js.map +1 -1
  80. package/dist/src/core/platform.js +30 -5
  81. package/dist/src/core/platform.js.map +1 -1
  82. package/dist/src/core/platforms/Platform.d.ts +42 -0
  83. package/dist/src/{main-api/IRenderDriver.js → core/platforms/Platform.js} +4 -2
  84. package/dist/src/core/platforms/Platform.js.map +1 -0
  85. package/dist/src/core/platforms/web/WebPlatform.d.ts +10 -0
  86. package/dist/src/core/platforms/web/WebPlatform.js +87 -0
  87. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -0
  88. package/dist/src/core/renderers/CoreContextTexture.d.ts +2 -1
  89. package/dist/src/core/renderers/CoreContextTexture.js.map +1 -1
  90. package/dist/src/core/renderers/CoreRenderer.d.ts +5 -30
  91. package/dist/src/core/renderers/CoreRenderer.js +1 -0
  92. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  93. package/dist/src/core/renderers/CoreShaderNode.d.ts +12 -1
  94. package/dist/src/core/renderers/CoreShaderNode.js +26 -0
  95. package/dist/src/core/renderers/CoreShaderNode.js.map +1 -1
  96. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +2 -1
  97. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +11 -9
  98. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -1
  99. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +4 -5
  100. package/dist/src/core/renderers/canvas/CanvasRenderer.js +65 -87
  101. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  102. package/dist/src/core/renderers/canvas/CanvasShaderNode.d.ts +1 -2
  103. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +3 -5
  104. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
  105. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +3 -2
  106. package/dist/src/core/renderers/canvas/CanvasTexture.js +17 -13
  107. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -1
  108. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +13 -0
  109. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +113 -192
  110. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +1 -1
  111. package/dist/src/core/renderers/canvas/internal/ColorUtils.d.ts +0 -2
  112. package/dist/src/core/renderers/canvas/internal/ColorUtils.js +0 -14
  113. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +1 -1
  114. package/dist/src/core/renderers/webgl/SdfRenderOp.d.ts +33 -0
  115. package/dist/src/core/renderers/webgl/SdfRenderOp.js +97 -0
  116. package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -0
  117. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +3 -0
  118. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +1 -1
  119. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +18 -6
  120. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +87 -42
  121. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  122. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +1 -1
  123. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +53 -17
  124. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  125. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +2 -7
  126. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +21 -50
  127. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -1
  128. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +2 -0
  129. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +14 -6
  130. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -1
  131. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +13 -0
  132. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +34 -5
  133. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -1
  134. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +16 -6
  135. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +102 -52
  136. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  137. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +1 -1
  138. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +11 -4
  139. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +1 -1
  140. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +11 -21
  141. package/dist/src/core/renderers/webgl/WebGlRenderer.js +168 -152
  142. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  143. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +2 -4
  144. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +1 -4
  145. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  146. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +9 -7
  147. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +83 -43
  148. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  149. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +3 -6
  150. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +1 -1
  151. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +0 -11
  152. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +1 -1
  153. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +5 -10
  154. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
  155. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +5 -10
  156. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -1
  157. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +0 -12
  158. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -1
  159. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +1 -1
  160. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +1 -1
  161. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +1 -1
  162. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +1 -1
  163. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +5 -5
  164. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +1 -1
  165. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +24 -19
  166. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
  167. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +1 -0
  168. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +32 -5
  169. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -1
  170. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +1 -1
  171. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +5 -5
  172. package/dist/src/core/shaders/canvas/Border.d.ts +8 -2
  173. package/dist/src/core/shaders/canvas/Border.js +64 -25
  174. package/dist/src/core/shaders/canvas/Border.js.map +1 -1
  175. package/dist/src/core/shaders/canvas/HolePunch.js +4 -3
  176. package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -1
  177. package/dist/src/core/shaders/canvas/LinearGradient.js +11 -7
  178. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -1
  179. package/dist/src/core/shaders/canvas/RadialGradient.js +21 -17
  180. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
  181. package/dist/src/core/shaders/canvas/Rounded.js +3 -3
  182. package/dist/src/core/shaders/canvas/Rounded.js.map +1 -1
  183. package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +6 -3
  184. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +45 -7
  185. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  186. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +2 -3
  187. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +50 -11
  188. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
  189. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +10 -7
  190. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
  191. package/dist/src/core/shaders/canvas/Shadow.js +4 -2
  192. package/dist/src/core/shaders/canvas/Shadow.js.map +1 -1
  193. package/dist/src/core/shaders/canvas/utils/render.d.ts +1 -1
  194. package/dist/src/core/shaders/canvas/utils/render.js +31 -18
  195. package/dist/src/core/shaders/canvas/utils/render.js.map +1 -1
  196. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +12 -2
  197. package/dist/src/core/shaders/templates/BorderTemplate.js +31 -11
  198. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -1
  199. package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +2 -2
  200. package/dist/src/core/shaders/templates/HolePunchTemplate.js +3 -3
  201. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -1
  202. package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +8 -6
  203. package/dist/src/core/shaders/templates/RadialGradientTemplate.js +2 -2
  204. package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +1 -1
  205. package/dist/src/core/shaders/templates/RoundedTemplate.js +1 -1
  206. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -1
  207. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +1 -1
  208. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +1 -1
  209. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +1 -1
  210. package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +1 -1
  211. package/dist/src/core/shaders/{templates/shaderUtils.d.ts → utils.d.ts} +1 -1
  212. package/dist/src/core/shaders/{templates/shaderUtils.js → utils.js} +2 -2
  213. package/dist/src/core/shaders/utils.js.map +1 -0
  214. package/dist/src/core/shaders/webgl/Border.js +116 -35
  215. package/dist/src/core/shaders/webgl/Border.js.map +1 -1
  216. package/dist/src/core/shaders/webgl/Default.js +6 -7
  217. package/dist/src/core/shaders/webgl/Default.js.map +1 -1
  218. package/dist/src/core/shaders/webgl/HolePunch.js +4 -3
  219. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -1
  220. package/dist/src/core/shaders/webgl/LinearGradient.js +33 -8
  221. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  222. package/dist/src/core/shaders/webgl/RadialGradient.js +56 -32
  223. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  224. package/dist/src/core/shaders/webgl/Rounded.js +4 -2
  225. package/dist/src/core/shaders/webgl/Rounded.js.map +1 -1
  226. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +153 -39
  227. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  228. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +158 -43
  229. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  230. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +6 -4
  231. package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -1
  232. package/dist/src/core/shaders/webgl/SdfShader.d.ts +0 -2
  233. package/dist/src/core/shaders/webgl/SdfShader.js +7 -17
  234. package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -1
  235. package/dist/src/core/shaders/webgl/SdfShadowShader.d.ts +9 -0
  236. package/dist/src/core/shaders/webgl/SdfShadowShader.js +100 -0
  237. package/dist/src/core/shaders/webgl/SdfShadowShader.js.map +1 -0
  238. package/dist/src/core/shaders/webgl/Shadow.js +12 -6
  239. package/dist/src/core/shaders/webgl/Shadow.js.map +1 -1
  240. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +59 -0
  241. package/dist/src/core/text-rendering/CanvasFontHandler.js +224 -0
  242. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -0
  243. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +17 -0
  244. package/dist/src/core/text-rendering/CanvasTextRenderer.js +157 -0
  245. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -0
  246. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +182 -0
  247. package/dist/src/core/text-rendering/SdfFontHandler.js +391 -0
  248. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -0
  249. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +17 -0
  250. package/dist/src/core/text-rendering/SdfTextRenderer.js +303 -0
  251. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -0
  252. package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +18 -0
  253. package/dist/src/core/text-rendering/TextLayoutEngine.js +380 -0
  254. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -0
  255. package/dist/src/core/text-rendering/TextRenderer.d.ts +383 -0
  256. package/dist/src/{main-api/ICoreDriver.js → core/text-rendering/TextRenderer.js} +1 -1
  257. package/dist/src/core/text-rendering/TextRenderer.js.map +1 -0
  258. package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +1 -1
  259. package/dist/src/core/text-rendering/Utils.d.ts +30 -0
  260. package/dist/src/core/text-rendering/Utils.js +84 -0
  261. package/dist/src/core/text-rendering/Utils.js.map +1 -0
  262. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +2 -2
  263. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
  264. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +0 -6
  265. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
  266. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +3 -2
  267. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +35 -38
  268. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  269. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +4 -1
  270. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  271. package/dist/src/core/textures/ColorTexture.d.ts +1 -1
  272. package/dist/src/core/textures/ColorTexture.js +3 -4
  273. package/dist/src/core/textures/ColorTexture.js.map +1 -1
  274. package/dist/src/core/textures/ImageTexture.d.ts +11 -4
  275. package/dist/src/core/textures/ImageTexture.js +31 -40
  276. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  277. package/dist/src/core/textures/NoiseTexture.d.ts +3 -3
  278. package/dist/src/core/textures/NoiseTexture.js +8 -8
  279. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  280. package/dist/src/core/textures/RenderTexture.d.ts +7 -7
  281. package/dist/src/core/textures/RenderTexture.js +12 -12
  282. package/dist/src/core/textures/RenderTexture.js.map +1 -1
  283. package/dist/src/core/textures/SubTexture.d.ts +6 -8
  284. package/dist/src/core/textures/SubTexture.js +19 -37
  285. package/dist/src/core/textures/SubTexture.js.map +1 -1
  286. package/dist/src/core/textures/Texture.d.ts +87 -10
  287. package/dist/src/core/textures/Texture.js +160 -17
  288. package/dist/src/core/textures/Texture.js.map +1 -1
  289. package/dist/src/core/utils.d.ts +2 -1
  290. package/dist/src/core/utils.js +1 -1
  291. package/dist/src/core/utils.js.map +1 -1
  292. package/dist/src/main-api/INode.d.ts +2 -2
  293. package/dist/src/main-api/Inspector.d.ts +131 -2
  294. package/dist/src/main-api/Inspector.js +345 -28
  295. package/dist/src/main-api/Inspector.js.map +1 -1
  296. package/dist/src/main-api/Renderer.d.ts +295 -82
  297. package/dist/src/main-api/Renderer.js +223 -76
  298. package/dist/src/main-api/Renderer.js.map +1 -1
  299. package/dist/src/utils.d.ts +1 -6
  300. package/dist/src/utils.js +2 -9
  301. package/dist/src/utils.js.map +1 -1
  302. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  303. package/dist/tsconfig.tsbuildinfo +1 -0
  304. package/exports/canvas.ts +1 -1
  305. package/exports/index.ts +2 -8
  306. package/exports/utils.ts +7 -1
  307. package/exports/webgl.ts +3 -1
  308. package/package.json +15 -17
  309. package/src/common/CommonTypes.ts +18 -2
  310. package/src/core/Autosizer.ts +224 -0
  311. package/src/core/CoreNode.test.ts +179 -17
  312. package/src/core/CoreNode.ts +895 -599
  313. package/src/core/CoreShaderManager.ts +5 -10
  314. package/src/core/CoreTextNode.ts +422 -286
  315. package/src/core/CoreTextureManager.ts +110 -130
  316. package/src/core/Stage.ts +397 -195
  317. package/src/core/TextureError.ts +46 -0
  318. package/src/core/TextureMemoryManager.ts +164 -141
  319. package/src/core/animations/CoreAnimation.ts +15 -9
  320. package/src/core/animations/CoreAnimationController.ts +13 -4
  321. package/src/core/lib/ImageWorker.ts +43 -12
  322. package/src/core/lib/WebGlContextWrapper.ts +127 -79
  323. package/src/core/lib/collectionUtils.ts +118 -0
  324. package/src/core/lib/colorCache.ts +20 -0
  325. package/src/core/{renderers/canvas/internal/ColorUtils.ts → lib/colorParser.ts} +2 -2
  326. package/src/core/lib/textureCompression.ts +433 -75
  327. package/src/core/lib/utils.ts +54 -25
  328. package/src/core/lib/validateImageBitmap.ts +17 -6
  329. package/src/core/platforms/Platform.ts +83 -0
  330. package/src/core/platforms/web/WebPlatform.ts +132 -0
  331. package/src/core/renderers/CoreContextTexture.ts +2 -1
  332. package/src/core/renderers/CoreRenderer.ts +5 -32
  333. package/src/core/renderers/CoreShaderNode.ts +38 -3
  334. package/src/core/renderers/canvas/CanvasRenderer.ts +84 -126
  335. package/src/core/renderers/canvas/CanvasShaderNode.ts +4 -8
  336. package/src/core/renderers/canvas/CanvasTexture.ts +22 -18
  337. package/src/core/renderers/webgl/SdfRenderOp.ts +105 -0
  338. package/src/core/renderers/webgl/WebGlCtxRenderTexture.ts +18 -15
  339. package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +50 -5
  340. package/src/core/renderers/webgl/WebGlCtxTexture.ts +134 -84
  341. package/src/core/renderers/webgl/WebGlRenderer.ts +203 -190
  342. package/src/core/renderers/webgl/WebGlShaderNode.ts +4 -11
  343. package/src/core/renderers/webgl/WebGlShaderProgram.ts +101 -53
  344. package/src/core/shaders/canvas/Border.ts +88 -34
  345. package/src/core/shaders/canvas/HolePunch.ts +5 -11
  346. package/src/core/shaders/canvas/LinearGradient.ts +14 -10
  347. package/src/core/shaders/canvas/RadialGradient.ts +24 -41
  348. package/src/core/shaders/canvas/Rounded.ts +7 -7
  349. package/src/core/shaders/canvas/RoundedWithBorder.ts +77 -23
  350. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +84 -36
  351. package/src/core/shaders/canvas/RoundedWithShadow.ts +15 -13
  352. package/src/core/shaders/canvas/Shadow.ts +7 -5
  353. package/src/core/shaders/canvas/utils/render.ts +45 -36
  354. package/src/core/shaders/templates/BorderTemplate.ts +42 -12
  355. package/src/core/shaders/templates/HolePunchTemplate.ts +5 -5
  356. package/src/core/shaders/templates/RadialGradientTemplate.ts +10 -8
  357. package/src/core/shaders/templates/RoundedTemplate.ts +1 -1
  358. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +1 -1
  359. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +1 -1
  360. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +1 -1
  361. package/src/core/shaders/templates/ShadowTemplate.ts +1 -1
  362. package/src/core/shaders/{templates/shaderUtils.ts → utils.ts} +2 -3
  363. package/src/core/shaders/webgl/Border.ts +116 -39
  364. package/src/core/shaders/webgl/Default.ts +6 -7
  365. package/src/core/shaders/webgl/HolePunch.ts +4 -7
  366. package/src/core/shaders/webgl/LinearGradient.ts +33 -8
  367. package/src/core/shaders/webgl/RadialGradient.ts +58 -34
  368. package/src/core/shaders/webgl/Rounded.ts +4 -6
  369. package/src/core/shaders/webgl/RoundedWithBorder.ts +154 -46
  370. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +159 -52
  371. package/src/core/shaders/webgl/RoundedWithShadow.ts +6 -8
  372. package/src/core/shaders/webgl/SdfShader.ts +7 -19
  373. package/src/core/shaders/webgl/Shadow.ts +12 -6
  374. package/src/core/text-rendering/CanvasFontHandler.ts +304 -0
  375. package/src/core/text-rendering/CanvasTextRenderer.ts +255 -0
  376. package/src/core/text-rendering/SdfFontHandler.ts +591 -0
  377. package/src/core/text-rendering/SdfTextRenderer.ts +408 -0
  378. package/src/core/text-rendering/TextLayoutEngine.ts +672 -0
  379. package/src/core/text-rendering/TextRenderer.ts +444 -0
  380. package/src/core/text-rendering/Utils.ts +99 -0
  381. package/src/core/text-rendering/tests/TextLayoutEngine.test.ts +453 -0
  382. package/src/core/textures/ColorTexture.ts +7 -5
  383. package/src/core/textures/ImageTexture.ts +78 -66
  384. package/src/core/textures/NoiseTexture.ts +14 -12
  385. package/src/core/textures/RenderTexture.ts +18 -16
  386. package/src/core/textures/SubTexture.ts +25 -46
  387. package/src/core/textures/Texture.ts +207 -24
  388. package/src/core/utils.ts +9 -7
  389. package/src/main-api/INode.ts +4 -3
  390. package/src/main-api/Inspector.ts +577 -36
  391. package/src/main-api/Renderer.ts +518 -139
  392. package/src/utils.ts +10 -10
  393. package/dist/exports/core-api.d.ts +0 -74
  394. package/dist/exports/core-api.js +0 -96
  395. package/dist/exports/core-api.js.map +0 -1
  396. package/dist/exports/main-api.d.ts +0 -30
  397. package/dist/exports/main-api.js +0 -45
  398. package/dist/exports/main-api.js.map +0 -1
  399. package/dist/src/core/CoreExtension.d.ts +0 -12
  400. package/dist/src/core/CoreExtension.js +0 -29
  401. package/dist/src/core/CoreExtension.js.map +0 -1
  402. package/dist/src/core/CoreStuff.d.ts +0 -1
  403. package/dist/src/core/CoreStuff.js +0 -138
  404. package/dist/src/core/CoreStuff.js.map +0 -1
  405. package/dist/src/core/CoreTexturizer.d.ts +0 -14
  406. package/dist/src/core/CoreTexturizer.js +0 -47
  407. package/dist/src/core/CoreTexturizer.js.map +0 -1
  408. package/dist/src/core/LngNode.d.ts +0 -736
  409. package/dist/src/core/LngNode.js +0 -1174
  410. package/dist/src/core/LngNode.js.map +0 -1
  411. package/dist/src/core/Matrix2DContext.d.ts +0 -15
  412. package/dist/src/core/Matrix2DContext.js +0 -45
  413. package/dist/src/core/Matrix2DContext.js.map +0 -1
  414. package/dist/src/core/ShaderNode.d.ts +0 -10
  415. package/dist/src/core/ShaderNode.js +0 -30
  416. package/dist/src/core/ShaderNode.js.map +0 -1
  417. package/dist/src/core/TextNode.d.ts +0 -103
  418. package/dist/src/core/TextNode.js +0 -331
  419. package/dist/src/core/TextNode.js.map +0 -1
  420. package/dist/src/core/lib/Coords.d.ts +0 -14
  421. package/dist/src/core/lib/Coords.js +0 -55
  422. package/dist/src/core/lib/Coords.js.map +0 -1
  423. package/dist/src/core/lib/glm/common.d.ts +0 -162
  424. package/dist/src/core/lib/glm/common.js +0 -81
  425. package/dist/src/core/lib/glm/common.js.map +0 -1
  426. package/dist/src/core/lib/glm/index.d.ts +0 -11
  427. package/dist/src/core/lib/glm/index.js +0 -30
  428. package/dist/src/core/lib/glm/index.js.map +0 -1
  429. package/dist/src/core/lib/glm/mat2.d.ts +0 -219
  430. package/dist/src/core/lib/glm/mat2.js +0 -396
  431. package/dist/src/core/lib/glm/mat2.js.map +0 -1
  432. package/dist/src/core/lib/glm/mat2d.d.ts +0 -237
  433. package/dist/src/core/lib/glm/mat2d.js +0 -442
  434. package/dist/src/core/lib/glm/mat2d.js.map +0 -1
  435. package/dist/src/core/lib/glm/mat3.d.ts +0 -283
  436. package/dist/src/core/lib/glm/mat3.js +0 -680
  437. package/dist/src/core/lib/glm/mat3.js.map +0 -1
  438. package/dist/src/core/lib/glm/mat4.d.ts +0 -550
  439. package/dist/src/core/lib/glm/mat4.js +0 -1802
  440. package/dist/src/core/lib/glm/mat4.js.map +0 -1
  441. package/dist/src/core/lib/glm/quat.d.ts +0 -363
  442. package/dist/src/core/lib/glm/quat.js +0 -693
  443. package/dist/src/core/lib/glm/quat.js.map +0 -1
  444. package/dist/src/core/lib/glm/quat2.d.ts +0 -356
  445. package/dist/src/core/lib/glm/quat2.js +0 -754
  446. package/dist/src/core/lib/glm/quat2.js.map +0 -1
  447. package/dist/src/core/lib/glm/vec2.d.ts +0 -365
  448. package/dist/src/core/lib/glm/vec2.js +0 -569
  449. package/dist/src/core/lib/glm/vec2.js.map +0 -1
  450. package/dist/src/core/lib/glm/vec3.d.ts +0 -406
  451. package/dist/src/core/lib/glm/vec3.js +0 -720
  452. package/dist/src/core/lib/glm/vec3.js.map +0 -1
  453. package/dist/src/core/lib/glm/vec4.d.ts +0 -330
  454. package/dist/src/core/lib/glm/vec4.js +0 -608
  455. package/dist/src/core/lib/glm/vec4.js.map +0 -1
  456. package/dist/src/core/renderers/CoreShaderManager.d.ts +0 -19
  457. package/dist/src/core/renderers/CoreShaderManager.js +0 -33
  458. package/dist/src/core/renderers/CoreShaderManager.js.map +0 -1
  459. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.d.ts +0 -27
  460. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.js +0 -82
  461. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.js.map +0 -1
  462. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.d.ts +0 -11
  463. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.js +0 -34
  464. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.js.map +0 -1
  465. package/dist/src/core/scene/Scene.d.ts +0 -59
  466. package/dist/src/core/scene/Scene.js +0 -106
  467. package/dist/src/core/scene/Scene.js.map +0 -1
  468. package/dist/src/core/shaders/templates/shaderUtils.js.map +0 -1
  469. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.d.ts +0 -20
  470. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js +0 -55
  471. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js.map +0 -1
  472. package/dist/src/main-api/ICoreDriver.d.ts +0 -27
  473. package/dist/src/main-api/ICoreDriver.js.map +0 -1
  474. package/dist/src/main-api/IRenderDriver.d.ts +0 -20
  475. package/dist/src/main-api/IRenderDriver.js.map +0 -1
  476. package/dist/src/main-api/IShaderController.d.ts +0 -14
  477. package/dist/src/main-api/IShaderController.js +0 -30
  478. package/dist/src/main-api/IShaderController.js.map +0 -1
  479. package/dist/src/main-api/IShaderNode.d.ts +0 -17
  480. package/dist/src/main-api/IShaderNode.js +0 -19
  481. package/dist/src/main-api/IShaderNode.js.map +0 -1
  482. package/dist/src/main-api/RendererMain.d.ts +0 -375
  483. package/dist/src/main-api/RendererMain.js +0 -365
  484. package/dist/src/main-api/RendererMain.js.map +0 -1
  485. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.d.ts +0 -9
  486. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js +0 -38
  487. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js.map +0 -1
  488. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.d.ts +0 -56
  489. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js +0 -101
  490. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js.map +0 -1
  491. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.d.ts +0 -32
  492. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js +0 -28
  493. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js.map +0 -1
  494. package/dist/src/render-drivers/main/MainCoreDriver.d.ts +0 -24
  495. package/dist/src/render-drivers/main/MainCoreDriver.js +0 -118
  496. package/dist/src/render-drivers/main/MainCoreDriver.js.map +0 -1
  497. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +0 -99
  498. package/dist/src/render-drivers/main/MainOnlyNode.js +0 -396
  499. package/dist/src/render-drivers/main/MainOnlyNode.js.map +0 -1
  500. package/dist/src/render-drivers/main/MainOnlyShaderController.d.ts +0 -6
  501. package/dist/src/render-drivers/main/MainOnlyShaderController.js +0 -15
  502. package/dist/src/render-drivers/main/MainOnlyShaderController.js.map +0 -1
  503. package/dist/src/render-drivers/main/MainOnlyShaderNode.d.ts +0 -7
  504. package/dist/src/render-drivers/main/MainOnlyShaderNode.js +0 -34
  505. package/dist/src/render-drivers/main/MainOnlyShaderNode.js.map +0 -1
  506. package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +0 -47
  507. package/dist/src/render-drivers/main/MainOnlyTextNode.js +0 -205
  508. package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +0 -1
  509. package/dist/src/render-drivers/main/MainRenderDriver.d.ts +0 -17
  510. package/dist/src/render-drivers/main/MainRenderDriver.js +0 -88
  511. package/dist/src/render-drivers/main/MainRenderDriver.js.map +0 -1
  512. package/dist/src/render-drivers/threadx/NodeStruct.d.ts +0 -90
  513. package/dist/src/render-drivers/threadx/NodeStruct.js +0 -281
  514. package/dist/src/render-drivers/threadx/NodeStruct.js.map +0 -1
  515. package/dist/src/render-drivers/threadx/SharedNode.d.ts +0 -39
  516. package/dist/src/render-drivers/threadx/SharedNode.js +0 -60
  517. package/dist/src/render-drivers/threadx/SharedNode.js.map +0 -1
  518. package/dist/src/render-drivers/threadx/TextNodeStruct.d.ts +0 -44
  519. package/dist/src/render-drivers/threadx/TextNodeStruct.js +0 -201
  520. package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +0 -1
  521. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +0 -28
  522. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +0 -234
  523. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +0 -1
  524. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.d.ts +0 -20
  525. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js +0 -84
  526. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js.map +0 -1
  527. package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +0 -44
  528. package/dist/src/render-drivers/threadx/ThreadXMainNode.js +0 -154
  529. package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +0 -1
  530. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.d.ts +0 -6
  531. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.js +0 -16
  532. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.js.map +0 -1
  533. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.d.ts +0 -7
  534. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.js +0 -15
  535. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.js.map +0 -1
  536. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.d.ts +0 -28
  537. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +0 -55
  538. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +0 -1
  539. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.d.ts +0 -21
  540. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js +0 -198
  541. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js.map +0 -1
  542. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +0 -70
  543. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js +0 -32
  544. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +0 -1
  545. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.d.ts +0 -19
  546. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +0 -177
  547. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +0 -1
  548. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.d.ts +0 -27
  549. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +0 -108
  550. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +0 -1
  551. package/dist/src/render-drivers/threadx/worker/renderer.d.ts +0 -1
  552. package/dist/src/render-drivers/threadx/worker/renderer.js +0 -145
  553. package/dist/src/render-drivers/threadx/worker/renderer.js.map +0 -1
  554. package/dist/src/render-drivers/utils.d.ts +0 -12
  555. package/dist/src/render-drivers/utils.js +0 -69
  556. package/dist/src/render-drivers/utils.js.map +0 -1
  557. package/scripts/please-use-pnpm.js +0 -13
  558. package/src/core/platform.ts +0 -64
  559. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +0 -220
  560. package/src/core/renderers/webgl/WebGlRenderOp.ts +0 -161
  561. package/src/core/text-rendering/TextRenderingUtils.ts +0 -36
  562. package/src/core/text-rendering/TextTextureRendererUtils.ts +0 -263
  563. package/src/core/text-rendering/TrFontManager.ts +0 -183
  564. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +0 -176
  565. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +0 -139
  566. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +0 -173
  567. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +0 -171
  568. package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -187
  569. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -94
  570. package/src/core/text-rendering/font-face-types/utils.ts +0 -39
  571. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +0 -509
  572. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -815
  573. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +0 -840
  574. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +0 -48
  575. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +0 -66
  576. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +0 -52
  577. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +0 -32
  578. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +0 -117
  579. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +0 -133
  580. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +0 -38
  581. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +0 -408
  582. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +0 -49
  583. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +0 -52
  584. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +0 -205
  585. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +0 -93
  586. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +0 -40
  587. package/src/core/text-rendering/renderers/TextRenderer.ts +0 -550
@@ -19,51 +19,173 @@
19
19
 
20
20
  import type { ExtractProps, TextureMap } from '../core/CoreTextureManager.js';
21
21
  import { EventEmitter } from '../common/EventEmitter.js';
22
- import { assertTruthy, isProductionEnvironment } from '../utils.js';
23
- import { Stage } from '../core/Stage.js';
22
+ import { isProductionEnvironment } from '../utils.js';
23
+ import { Stage, type StageOptions } from '../core/Stage.js';
24
24
  import { CoreNode, type CoreNodeProps } from '../core/CoreNode.js';
25
25
  import { type CoreTextNodeProps } from '../core/CoreTextNode.js';
26
26
  import type { INode, INodeProps, ITextNode, ITextNodeProps } from './INode.js';
27
27
  import type { TextureMemoryManagerSettings } from '../core/TextureMemoryManager.js';
28
- import type { CanvasTextRenderer } from '../core/text-rendering/renderers/CanvasTextRenderer.js';
29
- import type { SdfTextRenderer } from '../core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js';
30
- import type { WebGlRenderer } from '../core/renderers/webgl/WebGlRenderer.js';
28
+ import type { TextRenderer } from '../core/text-rendering/TextRenderer.js';
31
29
  import type { CanvasRenderer } from '../core/renderers/canvas/CanvasRenderer.js';
32
- import type { Inspector } from './Inspector.js';
30
+ import type { WebGlRenderer } from '../core/renderers/webgl/WebGlRenderer.js';
31
+ import type { Inspector, InspectorOptions } from './Inspector.js';
33
32
  import type { CoreShaderNode } from '../core/renderers/CoreShaderNode.js';
34
33
  import type {
35
34
  ExtractShaderProps,
36
35
  OptionalShaderProps,
37
36
  ShaderMap,
38
37
  } from '../core/CoreShaderManager.js';
38
+ import { WebPlatform } from '../core/platforms/web/WebPlatform.js';
39
+ import { Platform } from '../core/platforms/Platform.js';
39
40
 
40
41
  /**
41
- * Configuration settings for {@link RendererMain}
42
+ * FPS Update Event Data
43
+ *
44
+ * @category Events
45
+ * @example
46
+ * ```typescript
47
+ * renderer.on('fpsUpdate', (data) => {
48
+ * console.log(`Current FPS: ${data.fps}`);
49
+ * if (data.contextSpyData) {
50
+ * console.log('WebGL calls:', data.contextSpyData);
51
+ * }
52
+ * });
53
+ * ```
54
+ */
55
+ export interface RendererMainFpsUpdateEvent {
56
+ /** Current frames per second */
57
+ fps: number;
58
+ /** Context spy data (if enabled) - contains WebGL call statistics */
59
+ contextSpyData?: unknown;
60
+ }
61
+
62
+ /**
63
+ * Frame Tick Event Data
64
+ *
65
+ * @category Events
66
+ * @example
67
+ * ```typescript
68
+ * renderer.on('frameTick', (data) => {
69
+ * console.log(`Frame time: ${data.time}ms, delta: ${data.delta}ms`);
70
+ * });
71
+ * ```
72
+ */
73
+ export interface RendererMainFrameTickEvent {
74
+ /** Current timestamp */
75
+ time: number;
76
+ /** Time delta since last frame */
77
+ delta: number;
78
+ }
79
+
80
+ /**
81
+ * Quads Update Event Data
82
+ *
83
+ * @category Events
84
+ * @example
85
+ * ```typescript
86
+ * renderer.on('quadsUpdate', (data) => {
87
+ * console.log(`Rendered quads: ${data.quads}`);
88
+ * });
89
+ * ```
90
+ */
91
+ export interface RendererMainQuadsUpdateEvent {
92
+ /** Number of rendered quads */
93
+ quads: number;
94
+ }
95
+
96
+ /**
97
+ * Idle Event Data
98
+ *
99
+ * @category Events
100
+ * @remarks
101
+ * This event is emitted when the renderer has no scene updates to process.
102
+ * The event has no payload - use this for performance optimizations during idle periods.
103
+ *
104
+ * @example
105
+ * ```typescript
106
+ * renderer.on('idle', () => {
107
+ * // Renderer is idle - perfect time for cleanup, analytics, etc.
108
+ * console.log('Renderer is idle - no scene changes');
109
+ *
110
+ * // Example: Perform background tasks
111
+ * performBackgroundCleanup();
112
+ * sendAnalytics();
113
+ * });
114
+ * ```
42
115
  */
43
- export interface RendererMainSettings {
116
+ export interface RendererMainIdleEvent {
117
+ /** This event has no payload - listen without parameters */
118
+ readonly __eventHasNoPayload?: never;
119
+ }
120
+
121
+ /**
122
+ * Critical Cleanup Event Data
123
+ *
124
+ * @category Events
125
+ * @example
126
+ * ```typescript
127
+ * renderer.on('criticalCleanup', (data) => {
128
+ * console.log(`Memory cleanup triggered!`);
129
+ * console.log(`Memory used: ${data.memUsed} bytes`);
130
+ * console.log(`Critical threshold: ${data.criticalThreshold} bytes`);
131
+ * });
132
+ * ```
133
+ */
134
+ export interface RendererMainCriticalCleanupEvent {
135
+ /** Memory used before cleanup (bytes) */
136
+ memUsed: number;
137
+ /** Critical threshold (bytes) */
138
+ criticalThreshold: number;
139
+ }
140
+
141
+ /**
142
+ * Critical Cleanup Failed Event Data
143
+ *
144
+ * @category Events
145
+ * @example
146
+ * ```typescript
147
+ * renderer.on('criticalCleanupFailed', (data) => {
148
+ * console.warn(`Memory cleanup failed!`);
149
+ * console.log(`Memory still used: ${data.memUsed} bytes`);
150
+ * console.log(`Critical threshold: ${data.criticalThreshold} bytes`);
151
+ * // Consider reducing texture usage or forcing cleanup
152
+ * });
153
+ * ```
154
+ */
155
+ export interface RendererMainCriticalCleanupFailedEvent {
156
+ /** Memory used after cleanup (bytes) */
157
+ memUsed: number;
158
+ /** Critical threshold (bytes) */
159
+ criticalThreshold: number;
160
+ }
161
+
162
+ /**
163
+ * Settings for the Renderer that can be updated during runtime.
164
+ */
165
+ export interface RendererRuntimeSettings {
44
166
  /**
45
167
  * Authored logical pixel width of the application
46
168
  *
47
169
  * @defaultValue `1920`
48
170
  */
49
- appWidth?: number;
171
+ appWidth: number;
50
172
 
51
173
  /**
52
174
  * Authored logical pixel height of the application
53
175
  *
54
176
  * @defaultValue `1080`
55
177
  */
56
- appHeight?: number;
178
+ appHeight: number;
57
179
 
58
180
  /**
59
181
  * Texture Memory Manager Settings
60
182
  */
61
- textureMemory?: Partial<TextureMemoryManagerSettings>;
183
+ textureMemory: Partial<TextureMemoryManagerSettings>;
62
184
 
63
185
  /**
64
186
  * Bounds margin to extend the boundary in which a Node is added as Quad.
65
187
  */
66
- boundsMargin?: number | [number, number, number, number];
188
+ boundsMargin: number | [number, number, number, number];
67
189
 
68
190
  /**
69
191
  * Factor to convert app-authored logical coorindates to device logical coordinates
@@ -80,7 +202,7 @@ export interface RendererMainSettings {
80
202
  *
81
203
  * @defaultValue `1`
82
204
  */
83
- deviceLogicalPixelRatio?: number;
205
+ deviceLogicalPixelRatio: number;
84
206
 
85
207
  /**
86
208
  * Factor to convert device logical coordinates to device physical coordinates
@@ -97,14 +219,14 @@ export interface RendererMainSettings {
97
219
  *
98
220
  * @defaultValue `window.devicePixelRatio`
99
221
  */
100
- devicePhysicalPixelRatio?: number;
222
+ devicePhysicalPixelRatio: number;
101
223
 
102
224
  /**
103
225
  * RGBA encoded number of the background to use
104
226
  *
105
227
  * @defaultValue `0x00000000`
106
228
  */
107
- clearColor?: number;
229
+ clearColor: number;
108
230
 
109
231
  /**
110
232
  * Interval in milliseconds to receive FPS updates
@@ -114,8 +236,71 @@ export interface RendererMainSettings {
114
236
  *
115
237
  * @defaultValue `0` (disabled)
116
238
  */
117
- fpsUpdateInterval?: number;
239
+ fpsUpdateInterval: number;
240
+
241
+ /**
242
+ * Clears the render buffer on reset
243
+ *
244
+ * @remarks
245
+ * If false, the renderer will not clear the buffer before rendering a new frame.
246
+ * This is useful if you want to preserve the previous frame.
247
+ *
248
+ * @defaultValue `true`
249
+ */
250
+ enableClear: boolean;
251
+
252
+ /**
253
+ * DOM Inspector
254
+ *
255
+ * @remarks
256
+ * The inspector will replicate the state of the Nodes created
257
+ * in the renderer and allow inspection of the state of the nodes.
258
+ *
259
+ */
260
+ inspector: typeof Inspector | false;
261
+
262
+ /**
263
+ * Inspector Options
264
+ *
265
+ * @remarks
266
+ * Configuration options for the Inspector's performance monitoring features.
267
+ * Only used when inspector is enabled.
268
+ */
269
+ inspectorOptions?: Partial<InspectorOptions>;
270
+
271
+ /**
272
+ * Texture Processing Limit (in milliseconds)
273
+ *
274
+ * @remarks
275
+ * The maximum amount of time the renderer is allowed to process textures in a
276
+ * single frame. If the processing time exceeds this limit, the renderer will
277
+ * skip processing the remaining textures and continue rendering the frame.
278
+ *
279
+ * @defaultValue `10`
280
+ */
281
+ textureProcessingTimeLimit: number;
118
282
 
283
+ /**
284
+ * Target FPS for the global render loop
285
+ *
286
+ * @remarks
287
+ * Controls the maximum frame rate of the entire rendering system.
288
+ * When set to 0, no throttling is applied (use display refresh rate).
289
+ * When set to a positive number, the global requestAnimationFrame loop
290
+ * will be throttled to this target FPS, affecting all animations and rendering.
291
+ *
292
+ * This provides global performance control for the entire application,
293
+ * useful for managing performance on lower-end devices.
294
+ *
295
+ * @defaultValue `0` (no throttling, use display refresh rate)
296
+ */
297
+ targetFPS: number;
298
+ }
299
+
300
+ /**
301
+ * Configuration settings for {@link RendererMain}
302
+ */
303
+ export type RendererMainSettings = RendererRuntimeSettings & {
119
304
  /**
120
305
  * Include context call (i.e. WebGL) information in FPS updates
121
306
  *
@@ -129,7 +314,7 @@ export interface RendererMainSettings {
129
314
  *
130
315
  * @defaultValue `false` (disabled)
131
316
  */
132
- enableContextSpy?: boolean;
317
+ enableContextSpy: boolean;
133
318
 
134
319
  /**
135
320
  * Number or Image Workers to use
@@ -141,17 +326,7 @@ export interface RendererMainSettings {
141
326
  *
142
327
  * @defaultValue `2`
143
328
  */
144
- numImageWorkers?: number;
145
-
146
- /**
147
- * DOM Inspector
148
- *
149
- * @remarks
150
- * The inspector will replicate the state of the Nodes created
151
- * in the renderer and allow inspection of the state of the nodes.
152
- *
153
- */
154
- inspector?: typeof Inspector | false;
329
+ numImageWorkers: number;
155
330
 
156
331
  /**
157
332
  * Renderer Engine
@@ -173,7 +348,7 @@ export interface RendererMainSettings {
173
348
  *
174
349
  * @defaultValue 4 * 1024 * 1024
175
350
  */
176
- quadBufferSize?: number;
351
+ quadBufferSize: number;
177
352
 
178
353
  /**
179
354
  * Font Engines
@@ -203,7 +378,7 @@ export interface RendererMainSettings {
203
378
  *
204
379
  *
205
380
  */
206
- fontEngines: (typeof SdfTextRenderer | typeof CanvasTextRenderer)[];
381
+ fontEngines: TextRenderer[];
207
382
 
208
383
  /**
209
384
  * Force WebGL2
@@ -214,30 +389,7 @@ export interface RendererMainSettings {
214
389
  *
215
390
  * @defaultValue `false`
216
391
  */
217
- forceWebGL2?: boolean;
218
-
219
- /**
220
- * Enable strictBounds
221
- *
222
- * @remarks
223
- * Enable strict bounds for the renderer. This will ensure that the renderer
224
- * will not render outside the bounds of the canvas.
225
- *
226
- * @defaultValue `true`
227
- */
228
- strictBounds?: boolean;
229
-
230
- /**
231
- * Texture Processing Limit (in milliseconds)
232
- *
233
- * @remarks
234
- * The maximum amount of time the renderer is allowed to process textures in a
235
- * single frame. If the processing time exceeds this limit, the renderer will
236
- * skip processing the remaining textures and continue rendering the frame.
237
- *
238
- * @defaultValue `10`
239
- */
240
- textureProcessingTimeLimit?: number;
392
+ forceWebGL2: boolean;
241
393
 
242
394
  /**
243
395
  * Canvas object to use for rendering
@@ -246,7 +398,7 @@ export interface RendererMainSettings {
246
398
  * This is used to render the scene graph. If not provided, a new canvas
247
399
  * element will be created and appended to the target element.
248
400
  */
249
- canvas?: HTMLCanvasElement;
401
+ canvas: HTMLCanvasElement;
250
402
 
251
403
  /**
252
404
  * createImageBitmap support for the runtime
@@ -271,8 +423,34 @@ export interface RendererMainSettings {
271
423
  *
272
424
  * @defaultValue `full`
273
425
  */
274
- createImageBitmapSupport?: 'auto' | 'basic' | 'options' | 'full';
275
- }
426
+ createImageBitmapSupport: 'auto' | 'basic' | 'options' | 'full';
427
+
428
+ /**
429
+ * Provide an alternative platform abstraction layer
430
+ *
431
+ * @remarks
432
+ * By default the Lightning 3 renderer will load a webplatform, assuming it runs
433
+ * inside a web browsr. However for special cases there might be a need to provide
434
+ * an abstracted platform layer to run on non-web or non-standard JS engines
435
+ *
436
+ * @defaultValue `null`
437
+ */
438
+ platform: typeof Platform | null;
439
+
440
+ /**
441
+ * Number of times to retry loading a failed texture
442
+ *
443
+ * @remarks
444
+ * When a texture fails to load, Lightning will retry up to this many times
445
+ * before permanently giving up. Each retry will clear the texture ownership
446
+ * and then re-establish it to trigger a new load attempt.
447
+ *
448
+ * Set to null to disable retries. Set to 0 to always try once and never retry.
449
+ * This is typically only used on ImageTexture instances.
450
+ *
451
+ */
452
+ maxRetryCount?: number;
453
+ };
276
454
 
277
455
  /**
278
456
  * The Renderer Main API
@@ -298,36 +476,36 @@ export interface RendererMainSettings {
298
476
  * );
299
477
  * ```
300
478
  *
301
- * ## Events
302
- * - `fpsUpdate`
303
- * - Emitted every `fpsUpdateInterval` milliseconds with the current FPS
304
- * - `frameTick`
305
- * - Emitted every frame tick
306
- * - `quadsUpdate`
307
- * - Emitted when number of quads rendered is updated
308
- * - `idle`
309
- * - Emitted when the renderer is idle (no changes to the scene
310
- * graph/animations running)
311
- * - `criticalCleanup`
312
- * - Emitted when the Texture Memory Manager Cleanup process is triggered
313
- * - Payload: { memUsed: number, criticalThreshold: number }
314
- * - `memUsed` - The amount of memory (in bytes) used by textures before the
315
- * cleanup process
316
- * - `criticalThreshold` - The critical threshold (in bytes)
317
- * - `criticalCleanupFailed`
318
- * - Emitted when the Texture Memory Manager Cleanup process is unable to free
319
- * up enough texture memory to reach below the critical threshold.
320
- * This can happen when there is not enough non-renderable textures to
321
- * free up.
322
- * - Payload (object with keys):
323
- * - `memUsed` - The amount of memory (in bytes) used by textures after
324
- * the cleanup process
325
- * - `criticalThreshold` - The critical threshold (in bytes)
479
+ * ## Event Handling
480
+ *
481
+ * Listen to events using the standard EventEmitter API:
482
+ * ```typescript
483
+ * renderer.on('fpsUpdate', (data: RendererMainFpsUpdateEvent) => {
484
+ * console.log(`FPS: ${data.fps}`);
485
+ * });
486
+ *
487
+ * renderer.on('idle', (data: RendererMainIdleEvent) => {
488
+ * // Renderer is idle - no scene changes
489
+ * });
490
+ * ```
491
+ *
492
+ * @see {@link RendererMainFpsUpdateEvent}
493
+ * @see {@link RendererMainFrameTickEvent}
494
+ * @see {@link RendererMainQuadsUpdateEvent}
495
+ * @see {@link RendererMainIdleEvent}
496
+ * @see {@link RendererMainCriticalCleanupEvent}
497
+ * @see {@link RendererMainCriticalCleanupFailedEvent}
498
+ *
499
+ * @fires RendererMain#fpsUpdate
500
+ * @fires RendererMain#frameTick
501
+ * @fires RendererMain#quadsUpdate
502
+ * @fires RendererMain#idle
503
+ * @fires RendererMain#criticalCleanup
504
+ * @fires RendererMain#criticalCleanupFailed
326
505
  */
327
506
  export class RendererMain extends EventEmitter {
328
507
  readonly root: INode;
329
508
  readonly canvas: HTMLCanvasElement;
330
- readonly settings: Readonly<Required<RendererMainSettings>>;
331
509
  readonly stage: Stage;
332
510
  private inspector: Inspector | null = null;
333
511
 
@@ -338,44 +516,43 @@ export class RendererMain extends EventEmitter {
338
516
  * @param target Element ID or HTMLElement to insert the canvas into
339
517
  * @param driver Core Driver to use
340
518
  */
341
- constructor(settings: RendererMainSettings, target: string | HTMLElement) {
519
+ constructor(
520
+ settings: Partial<RendererMainSettings>,
521
+ target?: string | HTMLElement,
522
+ ) {
342
523
  super();
343
524
 
344
- const resolvedTxSettings: TextureMemoryManagerSettings = {
345
- criticalThreshold: settings.textureMemory?.criticalThreshold || 124e6,
346
- targetThresholdLevel: settings.textureMemory?.targetThresholdLevel || 0.5,
347
- cleanupInterval: settings.textureMemory?.cleanupInterval || 5000,
348
- debugLogging: settings.textureMemory?.debugLogging || false,
349
- baselineMemoryAllocation:
350
- settings.textureMemory?.baselineMemoryAllocation || 26e6,
351
- doNotExceedCriticalThreshold:
352
- settings.textureMemory?.doNotExceedCriticalThreshold || false,
353
- };
525
+ const resolvedTxSettings = this.resolveTxSettings(
526
+ settings.textureMemory || {},
527
+ );
354
528
 
355
- const resolvedSettings: Required<RendererMainSettings> = {
529
+ settings = {
356
530
  appWidth: settings.appWidth || 1920,
357
531
  appHeight: settings.appHeight || 1080,
358
532
  textureMemory: resolvedTxSettings,
359
533
  boundsMargin: settings.boundsMargin || 0,
360
534
  deviceLogicalPixelRatio: settings.deviceLogicalPixelRatio || 1,
361
535
  devicePhysicalPixelRatio:
362
- settings.devicePhysicalPixelRatio || window.devicePixelRatio,
536
+ settings.devicePhysicalPixelRatio || window.devicePixelRatio || 1,
363
537
  clearColor: settings.clearColor ?? 0x00000000,
364
538
  fpsUpdateInterval: settings.fpsUpdateInterval || 0,
539
+ enableClear: settings.enableClear ?? true,
540
+ targetFPS: settings.targetFPS || 0,
365
541
  numImageWorkers:
366
542
  settings.numImageWorkers !== undefined ? settings.numImageWorkers : 2,
367
543
  enableContextSpy: settings.enableContextSpy ?? false,
368
544
  forceWebGL2: settings.forceWebGL2 ?? false,
369
545
  inspector: settings.inspector ?? false,
546
+ inspectorOptions: settings.inspectorOptions ?? {},
370
547
  renderEngine: settings.renderEngine,
371
548
  quadBufferSize: settings.quadBufferSize ?? 4 * 1024 * 1024,
372
- fontEngines: settings.fontEngines,
373
- strictBounds: settings.strictBounds ?? true,
374
- textureProcessingTimeLimit: settings.textureProcessingTimeLimit || 10,
375
- canvas: settings.canvas || document.createElement('canvas'),
549
+ fontEngines: settings.fontEngines ?? [],
550
+ textureProcessingTimeLimit: settings.textureProcessingTimeLimit || 42,
551
+ canvas: settings.canvas,
376
552
  createImageBitmapSupport: settings.createImageBitmapSupport || 'full',
553
+ platform: settings.platform || null,
554
+ maxRetryCount: settings.maxRetryCount ?? 5,
377
555
  };
378
- this.settings = resolvedSettings;
379
556
 
380
557
  const {
381
558
  appWidth,
@@ -383,8 +560,21 @@ export class RendererMain extends EventEmitter {
383
560
  deviceLogicalPixelRatio,
384
561
  devicePhysicalPixelRatio,
385
562
  inspector,
386
- canvas,
387
- } = resolvedSettings;
563
+ } = settings as RendererMainSettings;
564
+
565
+ let platform;
566
+ if (
567
+ settings.platform !== undefined &&
568
+ settings.platform !== null &&
569
+ settings.platform.prototype instanceof Platform === true
570
+ ) {
571
+ // @ts-ignore - if Platform is a valid class, it will be used
572
+ platform = new settings.platform();
573
+ } else {
574
+ platform = new WebPlatform();
575
+ }
576
+
577
+ const canvas = settings.canvas || platform.createCanvas();
388
578
 
389
579
  const deviceLogicalWidth = appWidth * deviceLogicalPixelRatio;
390
580
  const deviceLogicalHeight = appHeight * deviceLogicalPixelRatio;
@@ -398,51 +588,98 @@ export class RendererMain extends EventEmitter {
398
588
 
399
589
  // Initialize the stage
400
590
  this.stage = new Stage({
401
- appWidth: this.settings.appWidth,
402
- appHeight: this.settings.appHeight,
403
- boundsMargin: this.settings.boundsMargin,
404
- clearColor: this.settings.clearColor,
591
+ appWidth,
592
+ appHeight,
593
+ boundsMargin: settings.boundsMargin!,
594
+ clearColor: settings.clearColor!,
405
595
  canvas: this.canvas,
406
- deviceLogicalPixelRatio: this.settings.deviceLogicalPixelRatio,
407
- devicePhysicalPixelRatio: this.settings.devicePhysicalPixelRatio,
408
- enableContextSpy: this.settings.enableContextSpy,
409
- forceWebGL2: this.settings.forceWebGL2,
410
- fpsUpdateInterval: this.settings.fpsUpdateInterval,
411
- numImageWorkers: this.settings.numImageWorkers,
412
- renderEngine: this.settings.renderEngine,
596
+ deviceLogicalPixelRatio,
597
+ devicePhysicalPixelRatio,
598
+ enableContextSpy: settings.enableContextSpy!,
599
+ forceWebGL2: settings.forceWebGL2!,
600
+ fpsUpdateInterval: settings.fpsUpdateInterval!,
601
+ enableClear: settings.enableClear!,
602
+ numImageWorkers: settings.numImageWorkers!,
603
+ renderEngine: settings.renderEngine!,
413
604
  textureMemory: resolvedTxSettings,
414
605
  eventBus: this,
415
- quadBufferSize: this.settings.quadBufferSize,
416
- fontEngines: this.settings.fontEngines,
417
- inspector: this.settings.inspector !== null,
418
- strictBounds: this.settings.strictBounds,
419
- textureProcessingTimeLimit: this.settings.textureProcessingTimeLimit,
420
- createImageBitmapSupport: this.settings.createImageBitmapSupport,
606
+ quadBufferSize: settings.quadBufferSize!,
607
+ fontEngines: settings.fontEngines!,
608
+ inspector: settings.inspector !== null,
609
+ targetFPS: settings.targetFPS!,
610
+ textureProcessingTimeLimit: settings.textureProcessingTimeLimit!,
611
+ createImageBitmapSupport: settings.createImageBitmapSupport!,
612
+ platform,
613
+ maxRetryCount: settings.maxRetryCount ?? 5,
421
614
  });
422
615
 
423
616
  // Extract the root node
424
617
  this.root = this.stage.root as unknown as INode;
425
618
 
426
619
  // Get the target element and attach the canvas to it
427
- let targetEl: HTMLElement | null;
428
- if (typeof target === 'string') {
429
- targetEl = document.getElementById(target);
430
- } else {
431
- targetEl = target;
432
- }
620
+ if (target) {
621
+ let targetEl: HTMLElement | null;
622
+ if (typeof target === 'string') {
623
+ targetEl = document.getElementById(target);
624
+ } else {
625
+ targetEl = target;
626
+ }
433
627
 
434
- if (!targetEl) {
435
- throw new Error('Could not find target element');
436
- }
628
+ if (!targetEl) {
629
+ throw new Error('Could not find target element');
630
+ }
437
631
 
438
- targetEl.appendChild(canvas);
632
+ targetEl.appendChild(canvas);
633
+ } else if (settings.canvas !== canvas) {
634
+ throw new Error(
635
+ 'New canvas element could not be appended to undefined target',
636
+ );
637
+ }
439
638
 
440
639
  // Initialize inspector (if enabled)
441
- if (inspector && !isProductionEnvironment()) {
442
- this.inspector = new inspector(canvas, resolvedSettings);
640
+ if (inspector && isProductionEnvironment === false) {
641
+ this.inspector = new inspector(canvas, settings as RendererMainSettings);
443
642
  }
444
643
  }
445
644
 
645
+ /**
646
+ * Resolves the Texture Memory Manager values
647
+ *
648
+ * @param props
649
+ * @returns
650
+ */
651
+ private resolveTxSettings(
652
+ textureMemory: Partial<TextureMemoryManagerSettings>,
653
+ ): TextureMemoryManagerSettings {
654
+ const currentTxSettings =
655
+ (this.stage && this.stage.options.textureMemory) || {};
656
+
657
+ return {
658
+ criticalThreshold:
659
+ textureMemory?.criticalThreshold ??
660
+ currentTxSettings?.criticalThreshold ??
661
+ 124e6,
662
+ targetThresholdLevel:
663
+ textureMemory?.targetThresholdLevel ??
664
+ currentTxSettings?.targetThresholdLevel ??
665
+ 0.5,
666
+ cleanupInterval:
667
+ textureMemory?.cleanupInterval ??
668
+ currentTxSettings?.cleanupInterval ??
669
+ 5000,
670
+ debugLogging:
671
+ textureMemory?.debugLogging ?? currentTxSettings?.debugLogging ?? false,
672
+ baselineMemoryAllocation:
673
+ textureMemory?.baselineMemoryAllocation ??
674
+ currentTxSettings?.baselineMemoryAllocation ??
675
+ 26e6,
676
+ doNotExceedCriticalThreshold:
677
+ textureMemory?.doNotExceedCriticalThreshold ??
678
+ currentTxSettings?.doNotExceedCriticalThreshold ??
679
+ false,
680
+ };
681
+ }
682
+
446
683
  /**
447
684
  * Create a new scene graph node
448
685
  *
@@ -461,16 +698,12 @@ export class RendererMain extends EventEmitter {
461
698
  createNode<ShNode extends CoreShaderNode<any>>(
462
699
  props: Partial<INodeProps<ShNode>>,
463
700
  ): INode<ShNode> {
464
- assertTruthy(this.stage, 'Stage is not initialized');
465
-
466
701
  const node = this.stage.createNode(props as Partial<CoreNodeProps>);
467
702
 
468
703
  if (this.inspector) {
469
704
  return this.inspector.createNode(node) as unknown as INode<ShNode>;
470
705
  }
471
706
 
472
- // FIXME onDestroy event? node.once('beforeDestroy'
473
- // FIXME onCreate event?
474
707
  return node as unknown as INode<ShNode>;
475
708
  }
476
709
 
@@ -557,7 +790,7 @@ export class RendererMain extends EventEmitter {
557
790
  props?: OptionalShaderProps<ShType>,
558
791
  ) {
559
792
  return this.stage.shManager.createShader(shType, props) as CoreShaderNode<
560
- ExtractShaderProps<ShType>
793
+ NonNullable<ExtractShaderProps<ShType>>
561
794
  >;
562
795
  }
563
796
 
@@ -634,8 +867,8 @@ export class RendererMain extends EventEmitter {
634
867
  * **NOTE3**: This will not cleanup textures that are marked as `preventCleanup`.
635
868
  * **NOTE4**: This has nothing to do with the garbage collection of JavaScript.
636
869
  */
637
- cleanup(aggressive: boolean = false) {
638
- this.stage.cleanup(aggressive);
870
+ cleanup() {
871
+ this.stage.cleanup();
639
872
  }
640
873
 
641
874
  /**
@@ -646,4 +879,150 @@ export class RendererMain extends EventEmitter {
646
879
  setClearColor(color: number) {
647
880
  this.stage.setClearColor(color);
648
881
  }
882
+
883
+ /**
884
+ * Set options for the renderer
885
+ *
886
+ * @param options
887
+ */
888
+ setOptions(options: Partial<RendererRuntimeSettings>) {
889
+ const stage = this.stage;
890
+ if (options.textureMemory !== undefined) {
891
+ const textureMemory = (options.textureMemory = this.resolveTxSettings(
892
+ options.textureMemory,
893
+ ));
894
+ stage.txMemManager.updateSettings(textureMemory);
895
+ stage.txMemManager.cleanup();
896
+ }
897
+
898
+ if (options.boundsMargin !== undefined) {
899
+ let bm = options.boundsMargin!;
900
+ options.boundsMargin = Array.isArray(bm) ? bm : [bm, bm, bm, bm];
901
+ }
902
+
903
+ const stageOptions = stage.options;
904
+ for (let key in options) {
905
+ stageOptions[key] = options[key]!;
906
+ }
907
+
908
+ if (options.inspector !== undefined && !isProductionEnvironment) {
909
+ if (options.inspector === false) {
910
+ this.inspector?.destroy();
911
+ this.inspector = null;
912
+ } else if (
913
+ this.inspector === null ||
914
+ this.inspector.constructor !== options.inspector
915
+ ) {
916
+ this.inspector = new options.inspector(
917
+ this.canvas,
918
+ stage.options as unknown as RendererMainSettings,
919
+ );
920
+ this.inspector?.createNodes(this.root as unknown as CoreNode);
921
+ }
922
+ }
923
+
924
+ let needDimensionsUpdate = false;
925
+
926
+ if (
927
+ options.deviceLogicalPixelRatio ||
928
+ options.devicePhysicalPixelRatio !== undefined
929
+ ) {
930
+ this.stage.pixelRatio =
931
+ stageOptions.devicePhysicalPixelRatio *
932
+ stageOptions.deviceLogicalPixelRatio;
933
+ this.inspector?.updateViewport(
934
+ stageOptions.appWidth,
935
+ stageOptions.appHeight,
936
+ stageOptions.deviceLogicalPixelRatio,
937
+ );
938
+ needDimensionsUpdate = true;
939
+ }
940
+
941
+ if (options.appWidth !== undefined || options.appHeight !== undefined) {
942
+ this.inspector?.updateViewport(
943
+ stageOptions.appWidth,
944
+ stageOptions.appHeight,
945
+ stageOptions.deviceLogicalPixelRatio,
946
+ );
947
+ needDimensionsUpdate = true;
948
+ }
949
+
950
+ if (options.boundsMargin !== undefined) {
951
+ this.stage.setBoundsMargin(options.boundsMargin);
952
+ }
953
+
954
+ if (options.clearColor !== undefined) {
955
+ this.stage.setClearColor(options.clearColor);
956
+ }
957
+
958
+ if (needDimensionsUpdate) {
959
+ this.updateAppDimensions();
960
+ }
961
+ }
962
+
963
+ private updateAppDimensions() {
964
+ const {
965
+ appWidth,
966
+ appHeight,
967
+ deviceLogicalPixelRatio,
968
+ devicePhysicalPixelRatio,
969
+ } = this.stage.options;
970
+
971
+ const deviceLogicalWidth = appWidth * deviceLogicalPixelRatio;
972
+ const deviceLogicalHeight = appHeight * deviceLogicalPixelRatio;
973
+
974
+ this.canvas.width = deviceLogicalWidth * devicePhysicalPixelRatio;
975
+ this.canvas.height = deviceLogicalHeight * devicePhysicalPixelRatio;
976
+
977
+ this.canvas.style.width = `${deviceLogicalWidth}px`;
978
+ this.canvas.style.height = `${deviceLogicalHeight}px`;
979
+
980
+ this.stage.renderer.updateViewport();
981
+
982
+ this.root.w = appWidth;
983
+ this.root.h = appHeight;
984
+ this.stage.updateViewportBounds();
985
+ }
986
+
987
+ get settings(): Readonly<StageOptions> {
988
+ return this.stage.options;
989
+ }
990
+
991
+ /**
992
+ * Gets the target FPS for the global render loop
993
+ *
994
+ * @returns The current target FPS (0 means no throttling)
995
+ *
996
+ * @remarks
997
+ * This controls the maximum frame rate of the entire rendering system.
998
+ * When 0, the system runs at display refresh rate.
999
+ */
1000
+ get targetFPS(): number {
1001
+ return this.stage.options.targetFPS || 0;
1002
+ }
1003
+
1004
+ /**
1005
+ * Sets the target FPS for the global render loop
1006
+ *
1007
+ * @param fps - The target FPS to set for the global render loop.
1008
+ * Set to 0 or a negative value to disable throttling.
1009
+ *
1010
+ * @remarks
1011
+ * This setting affects the entire rendering system immediately.
1012
+ * All animations, rendering, and frame updates will be throttled
1013
+ * to this target FPS. Provides global performance control.
1014
+ *
1015
+ * @example
1016
+ * ```typescript
1017
+ * // Set global target to 30fps for better performance
1018
+ * renderer.targetFPS = 30;
1019
+ *
1020
+ * // Disable global throttling (use display refresh rate)
1021
+ * renderer.targetFPS = 0;
1022
+ * ```
1023
+ */
1024
+ set targetFPS(fps: number) {
1025
+ this.stage.options.targetFPS = fps > 0 ? fps : 0;
1026
+ this.stage.updateTargetFrameTime();
1027
+ }
649
1028
  }