@lightningtv/renderer 3.0.0-beta1 → 3.2.3

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