@lightningjs/renderer 3.0.0-beta1 → 3.0.0-beta10

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 (611) hide show
  1. package/COPYING +1 -0
  2. package/LICENSE +202 -202
  3. package/NOTICE +3 -3
  4. package/README.md +133 -147
  5. package/dist/exports/canvas.d.ts +1 -1
  6. package/dist/exports/canvas.js +1 -1
  7. package/dist/exports/canvas.js.map +1 -1
  8. package/dist/exports/index.d.ts +1 -5
  9. package/dist/exports/index.js +1 -5
  10. package/dist/exports/index.js.map +1 -1
  11. package/dist/exports/utils.d.ts +2 -1
  12. package/dist/exports/utils.js +2 -1
  13. package/dist/exports/utils.js.map +1 -1
  14. package/dist/exports/webgl.d.ts +2 -1
  15. package/dist/exports/webgl.js +2 -1
  16. package/dist/exports/webgl.js.map +1 -1
  17. package/dist/src/core/CoreNode.d.ts +45 -69
  18. package/dist/src/core/CoreNode.js +323 -305
  19. package/dist/src/core/CoreNode.js.map +1 -1
  20. package/dist/src/core/CoreShaderManager.d.ts +3 -5
  21. package/dist/src/core/CoreShaderManager.js.map +1 -1
  22. package/dist/src/core/CoreTextNode.d.ts +58 -87
  23. package/dist/src/core/CoreTextNode.js +243 -237
  24. package/dist/src/core/CoreTextNode.js.map +1 -1
  25. package/dist/src/core/CoreTextureManager.d.ts +9 -11
  26. package/dist/src/core/CoreTextureManager.js +80 -91
  27. package/dist/src/core/CoreTextureManager.js.map +1 -1
  28. package/dist/src/core/Stage.d.ts +75 -31
  29. package/dist/src/core/Stage.js +270 -136
  30. package/dist/src/core/Stage.js.map +1 -1
  31. package/dist/src/core/TextureMemoryManager.d.ts +10 -1
  32. package/dist/src/core/TextureMemoryManager.js +112 -78
  33. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  34. package/dist/src/core/animations/CoreAnimation.js +5 -0
  35. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  36. package/dist/src/core/animations/CoreAnimationController.d.ts +1 -0
  37. package/dist/src/core/animations/CoreAnimationController.js +11 -4
  38. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  39. package/dist/src/core/lib/ImageWorker.js +3 -2
  40. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  41. package/dist/src/core/lib/RenderCoords.d.ts +9 -10
  42. package/dist/src/core/lib/RenderCoords.js +43 -55
  43. package/dist/src/core/lib/RenderCoords.js.map +1 -1
  44. package/dist/src/core/lib/WebGlContextWrapper.d.ts +51 -2
  45. package/dist/src/core/lib/WebGlContextWrapper.js +92 -22
  46. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  47. package/dist/src/core/lib/colorCache.d.ts +1 -0
  48. package/dist/src/core/lib/colorCache.js +19 -0
  49. package/dist/src/core/lib/colorCache.js.map +1 -0
  50. package/dist/src/core/lib/colorParser.d.ts +21 -0
  51. package/dist/src/core/lib/colorParser.js +72 -0
  52. package/dist/src/core/lib/colorParser.js.map +1 -0
  53. package/dist/src/core/lib/utils.d.ts +3 -0
  54. package/dist/src/core/lib/utils.js +42 -0
  55. package/dist/src/core/lib/utils.js.map +1 -1
  56. package/dist/src/core/lib/validateImageBitmap.d.ts +2 -1
  57. package/dist/src/core/lib/validateImageBitmap.js +4 -4
  58. package/dist/src/core/lib/validateImageBitmap.js.map +1 -1
  59. package/dist/src/core/platforms/Platform.d.ts +37 -0
  60. package/dist/src/{main-api/IRenderDriver.js → core/platforms/Platform.js} +4 -2
  61. package/dist/src/core/platforms/Platform.js.map +1 -0
  62. package/dist/src/core/platforms/web/WebPlatform.d.ts +9 -0
  63. package/dist/src/core/platforms/web/WebPlatform.js +84 -0
  64. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -0
  65. package/dist/src/core/renderers/CoreContextTexture.d.ts +1 -1
  66. package/dist/src/core/renderers/CoreRenderer.d.ts +5 -2
  67. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  68. package/dist/src/core/renderers/CoreShaderNode.d.ts +3 -3
  69. package/dist/src/core/renderers/CoreShaderNode.js +8 -2
  70. package/dist/src/core/renderers/CoreShaderNode.js.map +1 -1
  71. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +1 -2
  72. package/dist/src/core/renderers/canvas/CanvasRenderer.js +10 -21
  73. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  74. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +3 -5
  75. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
  76. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +2 -2
  77. package/dist/src/core/renderers/canvas/CanvasTexture.js +11 -9
  78. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -1
  79. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +3 -0
  80. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -1
  81. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +5 -6
  82. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +30 -21
  83. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  84. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +10 -2
  85. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +37 -19
  86. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +1 -1
  87. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +5 -3
  88. package/dist/src/core/renderers/webgl/WebGlRenderer.js +144 -117
  89. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  90. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +2 -1
  91. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +1 -4
  92. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  93. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +5 -3
  94. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +55 -31
  95. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  96. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +35 -35
  97. package/dist/src/core/shaders/canvas/Border.js +1 -1
  98. package/dist/src/core/shaders/canvas/Border.js.map +1 -1
  99. package/dist/src/core/shaders/canvas/LinearGradient.js +5 -3
  100. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -1
  101. package/dist/src/core/shaders/canvas/RadialGradient.js +13 -11
  102. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
  103. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +14 -6
  104. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  105. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +10 -8
  106. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
  107. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +7 -5
  108. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
  109. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +1 -1
  110. package/dist/src/core/shaders/templates/BorderTemplate.js +1 -1
  111. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -1
  112. package/dist/src/core/shaders/templates/HolePunchTemplate.js +1 -1
  113. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -1
  114. package/dist/src/core/shaders/templates/RoundedTemplate.js +1 -1
  115. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -1
  116. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +1 -1
  117. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +1 -1
  118. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +1 -1
  119. package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +1 -1
  120. package/dist/src/core/shaders/{templates/shaderUtils.d.ts → utils.d.ts} +1 -1
  121. package/dist/src/core/shaders/{templates/shaderUtils.js → utils.js} +2 -2
  122. package/dist/src/core/shaders/utils.js.map +1 -0
  123. package/dist/src/core/shaders/webgl/Border.js +86 -63
  124. package/dist/src/core/shaders/webgl/Border.js.map +1 -1
  125. package/dist/src/core/shaders/webgl/Default.js +47 -47
  126. package/dist/src/core/shaders/webgl/DefaultBatched.js +61 -61
  127. package/dist/src/core/shaders/webgl/HolePunch.js +36 -35
  128. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -1
  129. package/dist/src/core/shaders/webgl/LinearGradient.js +41 -40
  130. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  131. package/dist/src/core/shaders/webgl/RadialGradient.js +39 -38
  132. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  133. package/dist/src/core/shaders/webgl/Rounded.js +71 -71
  134. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +115 -72
  135. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  136. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +138 -88
  137. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  138. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +54 -54
  139. package/dist/src/core/shaders/webgl/SdfShader.js +63 -63
  140. package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -1
  141. package/dist/src/core/shaders/webgl/Shadow.js +83 -83
  142. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +25 -0
  143. package/dist/src/core/text-rendering/CanvasFontHandler.js +130 -0
  144. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -0
  145. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +22 -0
  146. package/dist/src/core/text-rendering/CanvasTextRenderer.js +366 -0
  147. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -0
  148. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +137 -0
  149. package/dist/src/core/text-rendering/SdfFontHandler.js +336 -0
  150. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -0
  151. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +17 -0
  152. package/dist/src/core/text-rendering/SdfTextRenderer.js +355 -0
  153. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -0
  154. package/dist/src/core/text-rendering/TextRenderer.d.ts +349 -0
  155. package/dist/src/{main-api/ICoreDriver.js → core/text-rendering/TextRenderer.js} +1 -1
  156. package/dist/src/core/text-rendering/TextRenderer.js.map +1 -0
  157. package/dist/src/core/text-rendering/Utils.d.ts +71 -0
  158. package/dist/src/core/text-rendering/Utils.js +212 -0
  159. package/dist/src/core/text-rendering/Utils.js.map +1 -0
  160. package/dist/src/core/text-rendering/canvas/Settings.d.ts +64 -0
  161. package/dist/src/core/{renderers/CoreShader.js → text-rendering/canvas/Settings.js} +3 -11
  162. package/dist/src/core/text-rendering/canvas/Settings.js.map +1 -0
  163. package/dist/src/core/text-rendering/canvas/Utils.d.ts +20 -0
  164. package/dist/src/core/text-rendering/canvas/Utils.js +144 -0
  165. package/dist/src/core/text-rendering/canvas/Utils.js.map +1 -0
  166. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.d.ts +60 -0
  167. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js +183 -0
  168. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js.map +1 -0
  169. package/dist/src/core/text-rendering/canvas/draw.d.ts +5 -0
  170. package/dist/src/core/text-rendering/canvas/draw.js +132 -0
  171. package/dist/src/core/text-rendering/canvas/draw.js.map +1 -0
  172. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +5 -0
  173. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  174. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +1 -1
  175. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +50 -2
  176. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
  177. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +9 -54
  178. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  179. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +1 -1
  180. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +66 -8
  181. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
  182. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +13 -0
  183. package/dist/src/core/text-rendering/renderers/TextRenderer.js +3 -0
  184. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  185. package/dist/src/core/text-rendering/sdf/Utils.d.ts +26 -0
  186. package/dist/src/core/text-rendering/sdf/Utils.js +304 -0
  187. package/dist/src/core/text-rendering/sdf/Utils.js.map +1 -0
  188. package/dist/src/core/text-rendering/sdf/index.d.ts +1 -0
  189. package/dist/src/{main-api/texture-usage-trackers/TextureUsageTracker.js → core/text-rendering/sdf/index.js} +3 -11
  190. package/dist/src/core/text-rendering/sdf/index.js.map +1 -0
  191. package/dist/src/core/textures/ImageTexture.d.ts +4 -3
  192. package/dist/src/core/textures/ImageTexture.js +36 -9
  193. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  194. package/dist/src/core/textures/Texture.d.ts +21 -2
  195. package/dist/src/core/textures/Texture.js +37 -6
  196. package/dist/src/core/textures/Texture.js.map +1 -1
  197. package/dist/src/core/utils.d.ts +1 -1
  198. package/dist/src/main-api/INode.d.ts +2 -2
  199. package/dist/src/main-api/Inspector.d.ts +6 -1
  200. package/dist/src/main-api/Inspector.js +43 -7
  201. package/dist/src/main-api/Inspector.js.map +1 -1
  202. package/dist/src/main-api/Renderer.d.ts +122 -46
  203. package/dist/src/main-api/Renderer.js +174 -37
  204. package/dist/src/main-api/Renderer.js.map +1 -1
  205. package/dist/src/utils.d.ts +1 -6
  206. package/dist/src/utils.js +2 -9
  207. package/dist/src/utils.js.map +1 -1
  208. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  209. package/exports/canvas-shaders.ts +28 -28
  210. package/exports/canvas.ts +45 -45
  211. package/exports/index.ts +82 -89
  212. package/exports/inspector.ts +24 -24
  213. package/exports/utils.ts +50 -44
  214. package/exports/webgl-shaders.ts +28 -28
  215. package/exports/webgl.ts +52 -50
  216. package/package.json +2 -4
  217. package/src/common/CommonTypes.ts +146 -146
  218. package/src/common/EventEmitter.ts +77 -77
  219. package/src/common/IAnimationController.ts +92 -92
  220. package/src/common/IEventEmitter.ts +28 -28
  221. package/src/core/CoreNode.test.ts +202 -203
  222. package/src/core/CoreNode.ts +2491 -2476
  223. package/src/core/CoreShaderManager.ts +188 -193
  224. package/src/core/CoreTextNode.ts +443 -448
  225. package/src/core/CoreTextureManager.ts +565 -597
  226. package/src/core/Stage.ts +906 -740
  227. package/src/core/TextureMemoryManager.ts +445 -395
  228. package/src/core/animations/AnimationManager.ts +38 -38
  229. package/src/core/animations/CoreAnimation.ts +291 -284
  230. package/src/core/animations/CoreAnimationController.ts +166 -157
  231. package/src/core/lib/ContextSpy.ts +41 -41
  232. package/src/core/lib/ImageWorker.ts +286 -279
  233. package/src/core/lib/Matrix3d.ts +244 -244
  234. package/src/core/lib/RenderCoords.ts +71 -86
  235. package/src/core/lib/WebGlContextWrapper.ts +1381 -1324
  236. package/src/core/lib/colorCache.ts +20 -0
  237. package/src/core/{renderers/canvas/internal/ColorUtils.ts → lib/colorParser.ts} +85 -85
  238. package/src/core/lib/textureCompression.ts +152 -152
  239. package/src/core/lib/textureSvg.ts +78 -78
  240. package/src/core/lib/utils.ts +412 -361
  241. package/src/core/lib/validateImageBitmap.ts +87 -76
  242. package/src/core/platforms/Platform.ts +77 -0
  243. package/src/core/platforms/web/WebPlatform.ts +121 -0
  244. package/src/core/renderers/CoreContextTexture.ts +43 -43
  245. package/src/core/renderers/CoreRenderOp.ts +22 -22
  246. package/src/core/renderers/CoreRenderer.ts +110 -107
  247. package/src/core/renderers/CoreShaderNode.ts +175 -171
  248. package/src/core/renderers/CoreShaderProgram.ts +23 -23
  249. package/src/core/renderers/canvas/CanvasRenderer.ts +283 -299
  250. package/src/core/renderers/canvas/CanvasShaderNode.ts +96 -99
  251. package/src/core/renderers/canvas/CanvasTexture.ts +156 -153
  252. package/src/core/renderers/webgl/WebGlCtxRenderTexture.ts +91 -86
  253. package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +50 -50
  254. package/src/core/renderers/webgl/WebGlCtxTexture.ts +310 -301
  255. package/src/core/renderers/webgl/WebGlRenderOp.ts +167 -145
  256. package/src/core/renderers/webgl/WebGlRenderer.ts +747 -715
  257. package/src/core/renderers/webgl/WebGlShaderNode.ts +435 -433
  258. package/src/core/renderers/webgl/WebGlShaderProgram.ts +341 -310
  259. package/src/core/renderers/webgl/internal/BufferCollection.ts +54 -54
  260. package/src/core/renderers/webgl/internal/RendererUtils.ts +155 -155
  261. package/src/core/renderers/webgl/internal/ShaderUtils.ts +281 -281
  262. package/src/core/renderers/webgl/internal/WebGlUtils.ts +35 -35
  263. package/src/core/shaders/canvas/Border.ts +75 -78
  264. package/src/core/shaders/canvas/HolePunch.ts +62 -62
  265. package/src/core/shaders/canvas/LinearGradient.ts +71 -69
  266. package/src/core/shaders/canvas/RadialGradient.ts +99 -113
  267. package/src/core/shaders/canvas/Rounded.ts +55 -55
  268. package/src/core/shaders/canvas/RoundedWithBorder.ts +74 -68
  269. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +90 -88
  270. package/src/core/shaders/canvas/RoundedWithShadow.ts +70 -69
  271. package/src/core/shaders/canvas/Shadow.ts +52 -52
  272. package/src/core/shaders/canvas/utils/render.ts +151 -151
  273. package/src/core/shaders/templates/BorderTemplate.ts +115 -115
  274. package/src/core/shaders/templates/HolePunchTemplate.ts +82 -82
  275. package/src/core/shaders/templates/LinearGradientTemplate.ts +71 -71
  276. package/src/core/shaders/templates/RadialGradientTemplate.ts +81 -81
  277. package/src/core/shaders/templates/RoundedTemplate.ts +98 -98
  278. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +38 -38
  279. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +35 -35
  280. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +35 -35
  281. package/src/core/shaders/templates/ShadowTemplate.ts +106 -106
  282. package/src/core/shaders/{templates/shaderUtils.ts → utils.ts} +46 -47
  283. package/src/core/shaders/webgl/Border.ts +116 -96
  284. package/src/core/shaders/webgl/Default.ts +89 -89
  285. package/src/core/shaders/webgl/DefaultBatched.ts +129 -129
  286. package/src/core/shaders/webgl/HolePunch.ts +75 -78
  287. package/src/core/shaders/webgl/LinearGradient.ts +82 -81
  288. package/src/core/shaders/webgl/RadialGradient.ts +85 -84
  289. package/src/core/shaders/webgl/Rounded.ts +117 -117
  290. package/src/core/shaders/webgl/RoundedWithBorder.ts +155 -114
  291. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +175 -133
  292. package/src/core/shaders/webgl/RoundedWithShadow.ts +98 -98
  293. package/src/core/shaders/webgl/SdfShader.ts +134 -137
  294. package/src/core/shaders/webgl/Shadow.ts +115 -115
  295. package/src/core/text-rendering/CanvasFontHandler.ts +176 -0
  296. package/src/core/text-rendering/CanvasTextRenderer.ts +622 -0
  297. package/src/core/text-rendering/SdfFontHandler.ts +517 -0
  298. package/src/core/text-rendering/SdfTextRenderer.ts +466 -0
  299. package/src/core/text-rendering/TextRenderer.ts +404 -0
  300. package/src/core/text-rendering/{TextTextureRendererUtils.ts → Utils.ts} +257 -263
  301. package/src/core/text-rendering/canvas/Settings.ts +99 -0
  302. package/src/core/text-rendering/canvas/Utils.test.ts +206 -0
  303. package/src/core/text-rendering/canvas/Utils.ts +178 -0
  304. package/src/core/text-rendering/canvas/calculateRenderInfo.ts +299 -0
  305. package/src/core/text-rendering/canvas/draw.ts +165 -0
  306. package/src/core/text-rendering/sdf/Utils.test.ts +402 -0
  307. package/src/core/text-rendering/sdf/Utils.ts +436 -0
  308. package/src/core/text-rendering/sdf/index.ts +20 -0
  309. package/src/core/textures/ColorTexture.ts +102 -102
  310. package/src/core/textures/ImageTexture.ts +418 -376
  311. package/src/core/textures/NoiseTexture.ts +104 -104
  312. package/src/core/textures/RenderTexture.ts +85 -85
  313. package/src/core/textures/SubTexture.ts +205 -205
  314. package/src/core/textures/Texture.ts +381 -337
  315. package/src/core/utils.ts +227 -227
  316. package/src/env.d.ts +7 -7
  317. package/src/main-api/INode.ts +100 -99
  318. package/src/main-api/Inspector.ts +567 -522
  319. package/src/main-api/Renderer.ts +873 -649
  320. package/src/main-api/utils.ts +45 -45
  321. package/src/utils.ts +267 -267
  322. package/dist/exports/core-api.d.ts +0 -74
  323. package/dist/exports/core-api.js +0 -96
  324. package/dist/exports/core-api.js.map +0 -1
  325. package/dist/exports/main-api.d.ts +0 -30
  326. package/dist/exports/main-api.js +0 -45
  327. package/dist/exports/main-api.js.map +0 -1
  328. package/dist/src/core/CoreExtension.d.ts +0 -12
  329. package/dist/src/core/CoreExtension.js +0 -29
  330. package/dist/src/core/CoreExtension.js.map +0 -1
  331. package/dist/src/core/CoreStuff.d.ts +0 -1
  332. package/dist/src/core/CoreStuff.js +0 -138
  333. package/dist/src/core/CoreStuff.js.map +0 -1
  334. package/dist/src/core/CoreTexturizer.d.ts +0 -14
  335. package/dist/src/core/CoreTexturizer.js +0 -47
  336. package/dist/src/core/CoreTexturizer.js.map +0 -1
  337. package/dist/src/core/LngNode.d.ts +0 -736
  338. package/dist/src/core/LngNode.js +0 -1174
  339. package/dist/src/core/LngNode.js.map +0 -1
  340. package/dist/src/core/Matrix2DContext.d.ts +0 -15
  341. package/dist/src/core/Matrix2DContext.js +0 -45
  342. package/dist/src/core/Matrix2DContext.js.map +0 -1
  343. package/dist/src/core/ShaderNode.d.ts +0 -10
  344. package/dist/src/core/ShaderNode.js +0 -30
  345. package/dist/src/core/ShaderNode.js.map +0 -1
  346. package/dist/src/core/TextNode.d.ts +0 -103
  347. package/dist/src/core/TextNode.js +0 -331
  348. package/dist/src/core/TextNode.js.map +0 -1
  349. package/dist/src/core/lib/Coords.d.ts +0 -14
  350. package/dist/src/core/lib/Coords.js +0 -55
  351. package/dist/src/core/lib/Coords.js.map +0 -1
  352. package/dist/src/core/lib/glm/common.d.ts +0 -162
  353. package/dist/src/core/lib/glm/common.js +0 -81
  354. package/dist/src/core/lib/glm/common.js.map +0 -1
  355. package/dist/src/core/lib/glm/index.d.ts +0 -11
  356. package/dist/src/core/lib/glm/index.js +0 -30
  357. package/dist/src/core/lib/glm/index.js.map +0 -1
  358. package/dist/src/core/lib/glm/mat2.d.ts +0 -219
  359. package/dist/src/core/lib/glm/mat2.js +0 -396
  360. package/dist/src/core/lib/glm/mat2.js.map +0 -1
  361. package/dist/src/core/lib/glm/mat2d.d.ts +0 -237
  362. package/dist/src/core/lib/glm/mat2d.js +0 -442
  363. package/dist/src/core/lib/glm/mat2d.js.map +0 -1
  364. package/dist/src/core/lib/glm/mat3.d.ts +0 -283
  365. package/dist/src/core/lib/glm/mat3.js +0 -680
  366. package/dist/src/core/lib/glm/mat3.js.map +0 -1
  367. package/dist/src/core/lib/glm/mat4.d.ts +0 -550
  368. package/dist/src/core/lib/glm/mat4.js +0 -1802
  369. package/dist/src/core/lib/glm/mat4.js.map +0 -1
  370. package/dist/src/core/lib/glm/quat.d.ts +0 -363
  371. package/dist/src/core/lib/glm/quat.js +0 -693
  372. package/dist/src/core/lib/glm/quat.js.map +0 -1
  373. package/dist/src/core/lib/glm/quat2.d.ts +0 -356
  374. package/dist/src/core/lib/glm/quat2.js +0 -754
  375. package/dist/src/core/lib/glm/quat2.js.map +0 -1
  376. package/dist/src/core/lib/glm/vec2.d.ts +0 -365
  377. package/dist/src/core/lib/glm/vec2.js +0 -569
  378. package/dist/src/core/lib/glm/vec2.js.map +0 -1
  379. package/dist/src/core/lib/glm/vec3.d.ts +0 -406
  380. package/dist/src/core/lib/glm/vec3.js +0 -720
  381. package/dist/src/core/lib/glm/vec3.js.map +0 -1
  382. package/dist/src/core/lib/glm/vec4.d.ts +0 -330
  383. package/dist/src/core/lib/glm/vec4.js +0 -608
  384. package/dist/src/core/lib/glm/vec4.js.map +0 -1
  385. package/dist/src/core/platform.d.ts +0 -10
  386. package/dist/src/core/platform.js +0 -56
  387. package/dist/src/core/platform.js.map +0 -1
  388. package/dist/src/core/renderers/CoreShader.d.ts +0 -9
  389. package/dist/src/core/renderers/CoreShader.js.map +0 -1
  390. package/dist/src/core/renderers/CoreShaderManager.d.ts +0 -19
  391. package/dist/src/core/renderers/CoreShaderManager.js +0 -33
  392. package/dist/src/core/renderers/CoreShaderManager.js.map +0 -1
  393. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +0 -33
  394. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +0 -250
  395. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +0 -1
  396. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +0 -16
  397. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +0 -123
  398. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +0 -1
  399. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.d.ts +0 -10
  400. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js +0 -43
  401. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js.map +0 -1
  402. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.d.ts +0 -12
  403. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +0 -55
  404. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +0 -1
  405. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.d.ts +0 -9
  406. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +0 -38
  407. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +0 -1
  408. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +0 -57
  409. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +0 -227
  410. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +0 -1
  411. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +0 -34
  412. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +0 -114
  413. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +0 -1
  414. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +0 -133
  415. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +0 -613
  416. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +0 -1
  417. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +0 -83
  418. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +0 -231
  419. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +0 -1
  420. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.d.ts +0 -27
  421. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.js +0 -82
  422. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.js.map +0 -1
  423. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.d.ts +0 -11
  424. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.js +0 -34
  425. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.js.map +0 -1
  426. package/dist/src/core/renderers/webgl/shaders/DefaultShader.d.ts +0 -9
  427. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +0 -87
  428. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +0 -1
  429. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.d.ts +0 -10
  430. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +0 -119
  431. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +0 -1
  432. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +0 -29
  433. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +0 -413
  434. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +0 -1
  435. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.d.ts +0 -28
  436. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +0 -131
  437. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +0 -1
  438. package/dist/src/core/renderers/webgl/shaders/SdfShader.d.ts +0 -47
  439. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +0 -160
  440. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +0 -1
  441. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.d.ts +0 -31
  442. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +0 -71
  443. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +0 -1
  444. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.d.ts +0 -30
  445. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +0 -58
  446. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +0 -1
  447. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.d.ts +0 -31
  448. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +0 -71
  449. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +0 -1
  450. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.d.ts +0 -31
  451. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +0 -71
  452. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +0 -1
  453. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.d.ts +0 -31
  454. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +0 -71
  455. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +0 -1
  456. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.d.ts +0 -9
  457. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +0 -136
  458. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +0 -1
  459. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.d.ts +0 -36
  460. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +0 -85
  461. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +0 -1
  462. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.d.ts +0 -45
  463. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +0 -104
  464. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +0 -1
  465. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +0 -22
  466. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +0 -45
  467. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +0 -1
  468. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.d.ts +0 -58
  469. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +0 -80
  470. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js.map +0 -1
  471. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +0 -35
  472. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +0 -129
  473. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +0 -1
  474. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +0 -39
  475. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +0 -116
  476. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +0 -1
  477. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.d.ts +0 -61
  478. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +0 -127
  479. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js.map +0 -1
  480. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.d.ts +0 -40
  481. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +0 -71
  482. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +0 -1
  483. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.d.ts +0 -115
  484. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js +0 -61
  485. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +0 -1
  486. package/dist/src/core/scene/Scene.d.ts +0 -59
  487. package/dist/src/core/scene/Scene.js +0 -106
  488. package/dist/src/core/scene/Scene.js.map +0 -1
  489. package/dist/src/core/shaders/templates/shaderUtils.js.map +0 -1
  490. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.d.ts +0 -20
  491. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js +0 -55
  492. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js.map +0 -1
  493. package/dist/src/main-api/DynamicShaderController.d.ts +0 -29
  494. package/dist/src/main-api/DynamicShaderController.js +0 -58
  495. package/dist/src/main-api/DynamicShaderController.js.map +0 -1
  496. package/dist/src/main-api/ICoreDriver.d.ts +0 -27
  497. package/dist/src/main-api/ICoreDriver.js.map +0 -1
  498. package/dist/src/main-api/IRenderDriver.d.ts +0 -20
  499. package/dist/src/main-api/IRenderDriver.js.map +0 -1
  500. package/dist/src/main-api/IShaderController.d.ts +0 -14
  501. package/dist/src/main-api/IShaderController.js +0 -30
  502. package/dist/src/main-api/IShaderController.js.map +0 -1
  503. package/dist/src/main-api/IShaderNode.d.ts +0 -17
  504. package/dist/src/main-api/IShaderNode.js +0 -19
  505. package/dist/src/main-api/IShaderNode.js.map +0 -1
  506. package/dist/src/main-api/RendererMain.d.ts +0 -375
  507. package/dist/src/main-api/RendererMain.js +0 -365
  508. package/dist/src/main-api/RendererMain.js.map +0 -1
  509. package/dist/src/main-api/ShaderController.d.ts +0 -31
  510. package/dist/src/main-api/ShaderController.js +0 -37
  511. package/dist/src/main-api/ShaderController.js.map +0 -1
  512. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.d.ts +0 -9
  513. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js +0 -38
  514. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js.map +0 -1
  515. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.d.ts +0 -56
  516. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js +0 -101
  517. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js.map +0 -1
  518. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.d.ts +0 -32
  519. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js.map +0 -1
  520. package/dist/src/render-drivers/main/MainCoreDriver.d.ts +0 -24
  521. package/dist/src/render-drivers/main/MainCoreDriver.js +0 -118
  522. package/dist/src/render-drivers/main/MainCoreDriver.js.map +0 -1
  523. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +0 -99
  524. package/dist/src/render-drivers/main/MainOnlyNode.js +0 -396
  525. package/dist/src/render-drivers/main/MainOnlyNode.js.map +0 -1
  526. package/dist/src/render-drivers/main/MainOnlyShaderController.d.ts +0 -6
  527. package/dist/src/render-drivers/main/MainOnlyShaderController.js +0 -15
  528. package/dist/src/render-drivers/main/MainOnlyShaderController.js.map +0 -1
  529. package/dist/src/render-drivers/main/MainOnlyShaderNode.d.ts +0 -7
  530. package/dist/src/render-drivers/main/MainOnlyShaderNode.js +0 -34
  531. package/dist/src/render-drivers/main/MainOnlyShaderNode.js.map +0 -1
  532. package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +0 -47
  533. package/dist/src/render-drivers/main/MainOnlyTextNode.js +0 -205
  534. package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +0 -1
  535. package/dist/src/render-drivers/main/MainRenderDriver.d.ts +0 -17
  536. package/dist/src/render-drivers/main/MainRenderDriver.js +0 -88
  537. package/dist/src/render-drivers/main/MainRenderDriver.js.map +0 -1
  538. package/dist/src/render-drivers/threadx/NodeStruct.d.ts +0 -90
  539. package/dist/src/render-drivers/threadx/NodeStruct.js +0 -281
  540. package/dist/src/render-drivers/threadx/NodeStruct.js.map +0 -1
  541. package/dist/src/render-drivers/threadx/SharedNode.d.ts +0 -39
  542. package/dist/src/render-drivers/threadx/SharedNode.js +0 -60
  543. package/dist/src/render-drivers/threadx/SharedNode.js.map +0 -1
  544. package/dist/src/render-drivers/threadx/TextNodeStruct.d.ts +0 -44
  545. package/dist/src/render-drivers/threadx/TextNodeStruct.js +0 -201
  546. package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +0 -1
  547. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +0 -28
  548. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +0 -234
  549. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +0 -1
  550. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.d.ts +0 -20
  551. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js +0 -84
  552. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js.map +0 -1
  553. package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +0 -44
  554. package/dist/src/render-drivers/threadx/ThreadXMainNode.js +0 -154
  555. package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +0 -1
  556. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.d.ts +0 -6
  557. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.js +0 -16
  558. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.js.map +0 -1
  559. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.d.ts +0 -7
  560. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.js +0 -15
  561. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.js.map +0 -1
  562. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.d.ts +0 -28
  563. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +0 -55
  564. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +0 -1
  565. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.d.ts +0 -21
  566. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js +0 -198
  567. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js.map +0 -1
  568. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +0 -70
  569. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js +0 -32
  570. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +0 -1
  571. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.d.ts +0 -19
  572. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +0 -177
  573. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +0 -1
  574. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.d.ts +0 -27
  575. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +0 -108
  576. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +0 -1
  577. package/dist/src/render-drivers/threadx/worker/renderer.d.ts +0 -1
  578. package/dist/src/render-drivers/threadx/worker/renderer.js +0 -145
  579. package/dist/src/render-drivers/threadx/worker/renderer.js.map +0 -1
  580. package/dist/src/render-drivers/utils.d.ts +0 -12
  581. package/dist/src/render-drivers/utils.js +0 -69
  582. package/dist/src/render-drivers/utils.js.map +0 -1
  583. package/scripts/please-use-pnpm.js +0 -13
  584. package/src/core/platform.ts +0 -64
  585. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +0 -220
  586. package/src/core/text-rendering/TextRenderingUtils.ts +0 -36
  587. package/src/core/text-rendering/TrFontManager.ts +0 -183
  588. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +0 -176
  589. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +0 -139
  590. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +0 -173
  591. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +0 -171
  592. package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -187
  593. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -94
  594. package/src/core/text-rendering/font-face-types/utils.ts +0 -39
  595. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +0 -509
  596. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -815
  597. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +0 -841
  598. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +0 -48
  599. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +0 -66
  600. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +0 -52
  601. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +0 -32
  602. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +0 -117
  603. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +0 -133
  604. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +0 -38
  605. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +0 -408
  606. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +0 -49
  607. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +0 -52
  608. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +0 -205
  609. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +0 -93
  610. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +0 -40
  611. package/src/core/text-rendering/renderers/TextRenderer.ts +0 -550
@@ -1,649 +1,873 @@
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
- import type { ExtractProps, TextureMap } from '../core/CoreTextureManager.js';
21
- import { EventEmitter } from '../common/EventEmitter.js';
22
- import { assertTruthy, isProductionEnvironment } from '../utils.js';
23
- import { Stage } from '../core/Stage.js';
24
- import { CoreNode, type CoreNodeProps } from '../core/CoreNode.js';
25
- import { type CoreTextNodeProps } from '../core/CoreTextNode.js';
26
- import type { INode, INodeProps, ITextNode, ITextNodeProps } from './INode.js';
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';
31
- import type { CanvasRenderer } from '../core/renderers/canvas/CanvasRenderer.js';
32
- import type { Inspector } from './Inspector.js';
33
- import type { CoreShaderNode } from '../core/renderers/CoreShaderNode.js';
34
- import type {
35
- ExtractShaderProps,
36
- OptionalShaderProps,
37
- ShaderMap,
38
- } from '../core/CoreShaderManager.js';
39
-
40
- /**
41
- * Configuration settings for {@link RendererMain}
42
- */
43
- export interface RendererMainSettings {
44
- /**
45
- * Authored logical pixel width of the application
46
- *
47
- * @defaultValue `1920`
48
- */
49
- appWidth?: number;
50
-
51
- /**
52
- * Authored logical pixel height of the application
53
- *
54
- * @defaultValue `1080`
55
- */
56
- appHeight?: number;
57
-
58
- /**
59
- * Texture Memory Manager Settings
60
- */
61
- textureMemory?: Partial<TextureMemoryManagerSettings>;
62
-
63
- /**
64
- * Bounds margin to extend the boundary in which a Node is added as Quad.
65
- */
66
- boundsMargin?: number | [number, number, number, number];
67
-
68
- /**
69
- * Factor to convert app-authored logical coorindates to device logical coordinates
70
- *
71
- * @remarks
72
- * This value allows auto-scaling to support larger/small resolutions than the
73
- * app was authored for.
74
- *
75
- * If the app was authored for 1920x1080 and this value is 2, the app's canvas
76
- * will be rendered at 3840x2160 logical pixels.
77
- *
78
- * Likewise, if the app was authored for 1920x1080 and this value is 0.66667,
79
- * the app's canvas will be rendered at 1280x720 logical pixels.
80
- *
81
- * @defaultValue `1`
82
- */
83
- deviceLogicalPixelRatio?: number;
84
-
85
- /**
86
- * Factor to convert device logical coordinates to device physical coordinates
87
- *
88
- * @remarks
89
- * This value allows auto-scaling to support devices with different pixel densities.
90
- *
91
- * This controls the number of physical pixels that are used to render each logical
92
- * pixel. For example, if the device has a pixel density of 2, each logical pixel
93
- * will be rendered using 2x2 physical pixels.
94
- *
95
- * By default, it will be set to `window.devicePixelRatio` which is the pixel
96
- * density of the device the app is running on reported by the browser.
97
- *
98
- * @defaultValue `window.devicePixelRatio`
99
- */
100
- devicePhysicalPixelRatio?: number;
101
-
102
- /**
103
- * RGBA encoded number of the background to use
104
- *
105
- * @defaultValue `0x00000000`
106
- */
107
- clearColor?: number;
108
-
109
- /**
110
- * Interval in milliseconds to receive FPS updates
111
- *
112
- * @remarks
113
- * If set to `0`, FPS updates will be disabled.
114
- *
115
- * @defaultValue `0` (disabled)
116
- */
117
- fpsUpdateInterval?: number;
118
-
119
- /**
120
- * Include context call (i.e. WebGL) information in FPS updates
121
- *
122
- * @remarks
123
- * When enabled the number of calls to each context method over the
124
- * `fpsUpdateInterval` will be included in the FPS update payload's
125
- * `contextSpyData` property.
126
- *
127
- * Enabling the context spy has a serious impact on performance so only use it
128
- * when you need to extract context call information.
129
- *
130
- * @defaultValue `false` (disabled)
131
- */
132
- enableContextSpy?: boolean;
133
-
134
- /**
135
- * Number or Image Workers to use
136
- *
137
- * @remarks
138
- * On devices with multiple cores, this can be used to improve image loading
139
- * as well as reduce the impact of image loading on the main thread.
140
- * Set to 0 to disable image workers.
141
- *
142
- * @defaultValue `2`
143
- */
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;
155
-
156
- /**
157
- * Renderer Engine
158
- *
159
- * @remarks
160
- * The renderer engine to use. Spawns a WebGL or Canvas renderer.
161
- * WebGL is more performant and supports more features. Canvas is
162
- * supported on most platforms.
163
- *
164
- * Note: When using CanvasCoreRenderer you can only use
165
- * CanvasTextRenderer. The WebGLCoreRenderer supports
166
- * both CanvasTextRenderer and SdfTextRenderer for Text Rendering.
167
- *
168
- */
169
- renderEngine: typeof CanvasRenderer | typeof WebGlRenderer;
170
-
171
- /**
172
- * Quad buffer size in bytes
173
- *
174
- * @defaultValue 4 * 1024 * 1024
175
- */
176
- quadBufferSize?: number;
177
-
178
- /**
179
- * Font Engines
180
- *
181
- * @remarks
182
- * The font engines to use for text rendering. CanvasTextRenderer is supported
183
- * on all platforms. SdfTextRenderer is a more performant renderer.
184
- * When using `renderEngine=CanvasCoreRenderer` you can only use `CanvasTextRenderer`.
185
- * The `renderEngine=WebGLCoreRenderer` supports both `CanvasTextRenderer` and `SdfTextRenderer`.
186
- *
187
- * This setting is used to enable tree shaking of unused font engines. Please
188
- * import your font engine(s) as follows:
189
- * ```
190
- * import { CanvasTextRenderer } from '@lightning/renderer/canvas';
191
- * import { SdfTextRenderer } from '@lightning/renderer/webgl';
192
- * ```
193
- *
194
- * If both CanvasTextRenderer and SdfTextRenderer are provided, the first renderer
195
- * provided will be asked first if it can render the font. If it cannot render the
196
- * font, the next renderer will be asked. If no renderer can render the font, the
197
- * text will not be rendered.
198
- *
199
- * **Note** that if you have fonts available in both engines the second font engine
200
- * will not be used. This is because the first font engine will always be asked first.
201
- *
202
- * @defaultValue '[]'
203
- *
204
- *
205
- */
206
- fontEngines: (typeof SdfTextRenderer | typeof CanvasTextRenderer)[];
207
-
208
- /**
209
- * Force WebGL2
210
- *
211
- * @remarks
212
- * Force the renderer to use WebGL2. This can be used to force the renderer to
213
- * use WebGL2 even if the browser supports WebGL1.
214
- *
215
- * @defaultValue `false`
216
- */
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;
241
-
242
- /**
243
- * Canvas object to use for rendering
244
- *
245
- * @remarks
246
- * This is used to render the scene graph. If not provided, a new canvas
247
- * element will be created and appended to the target element.
248
- */
249
- canvas?: HTMLCanvasElement;
250
-
251
- /**
252
- * createImageBitmap support for the runtime
253
- *
254
- * @remarks
255
- * This is used to determine if and which version of the createImageBitmap API
256
- * is supported by the runtime. This is used to determine if the renderer can
257
- * use createImageBitmap to load images.
258
- *
259
- * Options supported
260
- * - Auto - Automatically determine the supported version
261
- * - Basic - Supports createImageBitmap(image)
262
- * - Options - Supports createImageBitmap(image, options)
263
- * - Full - Supports createImageBitmap(image, sx, sy, sw, sh, options)
264
- *
265
- * Note with auto detection, the renderer will attempt to use the most advanced
266
- * version of the API available. If the API is not available, the renderer will
267
- * fall back to the next available version.
268
- *
269
- * This will affect startup performance as the renderer will need to determine
270
- * the supported version of the API.
271
- *
272
- * @defaultValue `full`
273
- */
274
- createImageBitmapSupport?: 'auto' | 'basic' | 'options' | 'full';
275
- }
276
-
277
- /**
278
- * The Renderer Main API
279
- *
280
- * @remarks
281
- * This is the primary class used to configure and operate the Renderer.
282
- *
283
- * It is used to create and destroy Nodes, as well as Texture and Shader
284
- * references.
285
- *
286
- * Example:
287
- * ```ts
288
- * import { RendererMain, MainCoreDriver } from '@lightningjs/renderer';
289
- *
290
- * // Initialize the Renderer
291
- * const renderer = new RendererMain(
292
- * {
293
- * appWidth: 1920,
294
- * appHeight: 1080
295
- * },
296
- * 'app',
297
- * new MainCoreDriver(),
298
- * );
299
- * ```
300
- *
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)
326
- */
327
- export class RendererMain extends EventEmitter {
328
- readonly root: INode;
329
- readonly canvas: HTMLCanvasElement;
330
- readonly settings: Readonly<Required<RendererMainSettings>>;
331
- readonly stage: Stage;
332
- private inspector: Inspector | null = null;
333
-
334
- /**
335
- * Constructs a new Renderer instance
336
- *
337
- * @param settings Renderer settings
338
- * @param target Element ID or HTMLElement to insert the canvas into
339
- * @param driver Core Driver to use
340
- */
341
- constructor(settings: RendererMainSettings, target: string | HTMLElement) {
342
- super();
343
-
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
- };
354
-
355
- const resolvedSettings: Required<RendererMainSettings> = {
356
- appWidth: settings.appWidth || 1920,
357
- appHeight: settings.appHeight || 1080,
358
- textureMemory: resolvedTxSettings,
359
- boundsMargin: settings.boundsMargin || 0,
360
- deviceLogicalPixelRatio: settings.deviceLogicalPixelRatio || 1,
361
- devicePhysicalPixelRatio:
362
- settings.devicePhysicalPixelRatio || window.devicePixelRatio,
363
- clearColor: settings.clearColor ?? 0x00000000,
364
- fpsUpdateInterval: settings.fpsUpdateInterval || 0,
365
- numImageWorkers:
366
- settings.numImageWorkers !== undefined ? settings.numImageWorkers : 2,
367
- enableContextSpy: settings.enableContextSpy ?? false,
368
- forceWebGL2: settings.forceWebGL2 ?? false,
369
- inspector: settings.inspector ?? false,
370
- renderEngine: settings.renderEngine,
371
- 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'),
376
- createImageBitmapSupport: settings.createImageBitmapSupport || 'full',
377
- };
378
- this.settings = resolvedSettings;
379
-
380
- const {
381
- appWidth,
382
- appHeight,
383
- deviceLogicalPixelRatio,
384
- devicePhysicalPixelRatio,
385
- inspector,
386
- canvas,
387
- } = resolvedSettings;
388
-
389
- const deviceLogicalWidth = appWidth * deviceLogicalPixelRatio;
390
- const deviceLogicalHeight = appHeight * deviceLogicalPixelRatio;
391
-
392
- this.canvas = canvas;
393
- canvas.width = deviceLogicalWidth * devicePhysicalPixelRatio;
394
- canvas.height = deviceLogicalHeight * devicePhysicalPixelRatio;
395
-
396
- canvas.style.width = `${deviceLogicalWidth}px`;
397
- canvas.style.height = `${deviceLogicalHeight}px`;
398
-
399
- // Initialize the stage
400
- this.stage = new Stage({
401
- appWidth: this.settings.appWidth,
402
- appHeight: this.settings.appHeight,
403
- boundsMargin: this.settings.boundsMargin,
404
- clearColor: this.settings.clearColor,
405
- 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,
413
- textureMemory: resolvedTxSettings,
414
- 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,
421
- });
422
-
423
- // Extract the root node
424
- this.root = this.stage.root as unknown as INode;
425
-
426
- // 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
- }
433
-
434
- if (!targetEl) {
435
- throw new Error('Could not find target element');
436
- }
437
-
438
- targetEl.appendChild(canvas);
439
-
440
- // Initialize inspector (if enabled)
441
- if (inspector && !isProductionEnvironment()) {
442
- this.inspector = new inspector(canvas, resolvedSettings);
443
- }
444
- }
445
-
446
- /**
447
- * Create a new scene graph node
448
- *
449
- * @remarks
450
- * A node is the main graphical building block of the Renderer scene graph. It
451
- * can be a container for other nodes, or it can be a leaf node that renders a
452
- * solid color, gradient, image, or specific texture, using a specific shader.
453
- *
454
- * To create a text node, see {@link createTextNode}.
455
- *
456
- * See {@link CoreNode} for more details.
457
- *
458
- * @param props
459
- * @returns
460
- */
461
- createNode<ShNode extends CoreShaderNode<any>>(
462
- props: Partial<INodeProps<ShNode>>,
463
- ): INode<ShNode> {
464
- assertTruthy(this.stage, 'Stage is not initialized');
465
-
466
- const node = this.stage.createNode(props as Partial<CoreNodeProps>);
467
-
468
- if (this.inspector) {
469
- return this.inspector.createNode(node) as unknown as INode<ShNode>;
470
- }
471
-
472
- // FIXME onDestroy event? node.once('beforeDestroy'
473
- // FIXME onCreate event?
474
- return node as unknown as INode<ShNode>;
475
- }
476
-
477
- /**
478
- * Create a new scene graph text node
479
- *
480
- * @remarks
481
- * A text node is the second graphical building block of the Renderer scene
482
- * graph. It renders text using a specific text renderer that is automatically
483
- * chosen based on the font requested and what type of fonts are installed
484
- * into an app.
485
- *
486
- * See {@link ITextNode} for more details.
487
- *
488
- * @param props
489
- * @returns
490
- */
491
- createTextNode(props: Partial<ITextNodeProps>): ITextNode {
492
- const textNode = this.stage.createTextNode(props as CoreTextNodeProps);
493
-
494
- if (this.inspector) {
495
- return this.inspector.createTextNode(textNode) as unknown as ITextNode;
496
- }
497
-
498
- return textNode as unknown as ITextNode;
499
- }
500
-
501
- /**
502
- * Destroy a node
503
- *
504
- * @remarks
505
- * This method destroys a node
506
- *
507
- * @param node
508
- * @returns
509
- */
510
- destroyNode(node: INode) {
511
- if (this.inspector) {
512
- this.inspector.destroyNode(node.id);
513
- }
514
-
515
- return node.destroy();
516
- }
517
-
518
- /**
519
- * Create a new texture reference
520
- *
521
- * @remarks
522
- * This method creates a new reference to a texture. The texture is not
523
- * loaded until it is used on a node.
524
- *
525
- * It can be assigned to a node's `texture` property, or it can be used
526
- * when creating a SubTexture.
527
- *
528
- * @param textureType
529
- * @param props
530
- * @param options
531
- * @returns
532
- */
533
- createTexture<TxType extends keyof TextureMap>(
534
- textureType: TxType,
535
- props: ExtractProps<TextureMap[TxType]>,
536
- ): InstanceType<TextureMap[TxType]> {
537
- return this.stage.txManager.createTexture(textureType, props);
538
- }
539
-
540
- /**
541
- * Create a new shader controller for a shader type
542
- *
543
- * @remarks
544
- * This method creates a new Shader Controller for a specific shader type.
545
- *
546
- * If the shader has not been loaded yet, it will be loaded. Otherwise, the
547
- * existing shader will be reused.
548
- *
549
- * It can be assigned to a Node's `shader` property.
550
- *
551
- * @param shaderType
552
- * @param props
553
- * @returns
554
- */
555
- createShader<ShType extends keyof ShaderMap>(
556
- shType: ShType,
557
- props?: OptionalShaderProps<ShType>,
558
- ) {
559
- return this.stage.shManager.createShader(shType, props) as CoreShaderNode<
560
- ExtractShaderProps<ShType>
561
- >;
562
- }
563
-
564
- /**
565
- * Get a Node by its ID
566
- *
567
- * @param id
568
- * @returns
569
- */
570
- getNodeById(id: number): CoreNode | null {
571
- const root = this.stage?.root;
572
- if (!root) {
573
- return null;
574
- }
575
-
576
- const findNode = (node: CoreNode): CoreNode | null => {
577
- if (node.id === id) {
578
- return node;
579
- }
580
-
581
- for (const child of node.children) {
582
- const found = findNode(child);
583
- if (found) {
584
- return found;
585
- }
586
- }
587
-
588
- return null;
589
- };
590
-
591
- return findNode(root);
592
- }
593
-
594
- toggleFreeze() {
595
- throw new Error('Not implemented');
596
- }
597
-
598
- advanceFrame() {
599
- throw new Error('Not implemented');
600
- }
601
-
602
- getBufferInfo() {
603
- return this.stage.renderer.getBufferInfo();
604
- }
605
-
606
- /**
607
- * Re-render the current frame without advancing any running animations.
608
- *
609
- * @remarks
610
- * Any state changes will be reflected in the re-rendered frame. Useful for
611
- * debugging.
612
- *
613
- * May not do anything if the render loop is running on a separate worker.
614
- */
615
- rerender() {
616
- this.stage.requestRender();
617
- }
618
-
619
- /**
620
- * Cleanup textures that are not being used
621
- *
622
- * @param aggressive - If true, will cleanup all textures, regardless of render status
623
- *
624
- * @remarks
625
- * This can be used to free up GFX memory used by textures that are no longer
626
- * being displayed.
627
- *
628
- * This routine is also called automatically when the memory used by textures
629
- * exceeds the critical threshold on frame generation **OR** when the renderer
630
- * is idle and the memory used by textures exceeds the target threshold.
631
- *
632
- * **NOTE**: This is a heavy operation and should be used sparingly.
633
- * **NOTE2**: This will not cleanup textures that are currently being displayed.
634
- * **NOTE3**: This will not cleanup textures that are marked as `preventCleanup`.
635
- * **NOTE4**: This has nothing to do with the garbage collection of JavaScript.
636
- */
637
- cleanup(aggressive: boolean = false) {
638
- this.stage.cleanup(aggressive);
639
- }
640
-
641
- /**
642
- * Sets the clear color for the stage.
643
- *
644
- * @param color - The color to set as the clear color.
645
- */
646
- setClearColor(color: number) {
647
- this.stage.setClearColor(color);
648
- }
649
- }
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
+ import type { ExtractProps, TextureMap } from '../core/CoreTextureManager.js';
21
+ import { EventEmitter } from '../common/EventEmitter.js';
22
+ import { isProductionEnvironment } from '../utils.js';
23
+ import { Stage, type StageOptions } from '../core/Stage.js';
24
+ import { CoreNode, type CoreNodeProps } from '../core/CoreNode.js';
25
+ import { type CoreTextNodeProps } from '../core/CoreTextNode.js';
26
+ import type { INode, INodeProps, ITextNode, ITextNodeProps } from './INode.js';
27
+ import type { TextureMemoryManagerSettings } from '../core/TextureMemoryManager.js';
28
+ import type { TextRenderer } from '../core/text-rendering/TextRenderer.js';
29
+ import type { CanvasRenderer } from '../core/renderers/canvas/CanvasRenderer.js';
30
+ import type { WebGlRenderer } from '../core/renderers/webgl/WebGlRenderer.js';
31
+ import type { Inspector } from './Inspector.js';
32
+ import type { CoreShaderNode } from '../core/renderers/CoreShaderNode.js';
33
+ import type {
34
+ ExtractShaderProps,
35
+ OptionalShaderProps,
36
+ ShaderMap,
37
+ } from '../core/CoreShaderManager.js';
38
+ import { WebPlatform } from '../core/platforms/web/WebPlatform.js';
39
+ import { Platform } from '../core/platforms/Platform.js';
40
+
41
+ /**
42
+ * Settings for the Renderer that can be updated during runtime.
43
+ */
44
+ export interface RendererRuntimeSettings {
45
+ /**
46
+ * Authored logical pixel width of the application
47
+ *
48
+ * @defaultValue `1920`
49
+ */
50
+ appWidth: number;
51
+
52
+ /**
53
+ * Authored logical pixel height of the application
54
+ *
55
+ * @defaultValue `1080`
56
+ */
57
+ appHeight: number;
58
+
59
+ /**
60
+ * Texture Memory Manager Settings
61
+ */
62
+ textureMemory: Partial<TextureMemoryManagerSettings>;
63
+
64
+ /**
65
+ * Bounds margin to extend the boundary in which a Node is added as Quad.
66
+ */
67
+ boundsMargin: number | [number, number, number, number];
68
+
69
+ /**
70
+ * Factor to convert app-authored logical coorindates to device logical coordinates
71
+ *
72
+ * @remarks
73
+ * This value allows auto-scaling to support larger/small resolutions than the
74
+ * app was authored for.
75
+ *
76
+ * If the app was authored for 1920x1080 and this value is 2, the app's canvas
77
+ * will be rendered at 3840x2160 logical pixels.
78
+ *
79
+ * Likewise, if the app was authored for 1920x1080 and this value is 0.66667,
80
+ * the app's canvas will be rendered at 1280x720 logical pixels.
81
+ *
82
+ * @defaultValue `1`
83
+ */
84
+ deviceLogicalPixelRatio: number;
85
+
86
+ /**
87
+ * Factor to convert device logical coordinates to device physical coordinates
88
+ *
89
+ * @remarks
90
+ * This value allows auto-scaling to support devices with different pixel densities.
91
+ *
92
+ * This controls the number of physical pixels that are used to render each logical
93
+ * pixel. For example, if the device has a pixel density of 2, each logical pixel
94
+ * will be rendered using 2x2 physical pixels.
95
+ *
96
+ * By default, it will be set to `window.devicePixelRatio` which is the pixel
97
+ * density of the device the app is running on reported by the browser.
98
+ *
99
+ * @defaultValue `window.devicePixelRatio`
100
+ */
101
+ devicePhysicalPixelRatio: number;
102
+
103
+ /**
104
+ * RGBA encoded number of the background to use
105
+ *
106
+ * @defaultValue `0x00000000`
107
+ */
108
+ clearColor: number;
109
+
110
+ /**
111
+ * Interval in milliseconds to receive FPS updates
112
+ *
113
+ * @remarks
114
+ * If set to `0`, FPS updates will be disabled.
115
+ *
116
+ * @defaultValue `0` (disabled)
117
+ */
118
+ fpsUpdateInterval: number;
119
+
120
+ /**
121
+ * DOM Inspector
122
+ *
123
+ * @remarks
124
+ * The inspector will replicate the state of the Nodes created
125
+ * in the renderer and allow inspection of the state of the nodes.
126
+ *
127
+ */
128
+ inspector: typeof Inspector | false;
129
+
130
+ /**
131
+ * Texture Processing Limit (in milliseconds)
132
+ *
133
+ * @remarks
134
+ * The maximum amount of time the renderer is allowed to process textures in a
135
+ * single frame. If the processing time exceeds this limit, the renderer will
136
+ * skip processing the remaining textures and continue rendering the frame.
137
+ *
138
+ * @defaultValue `10`
139
+ */
140
+ textureProcessingTimeLimit: number;
141
+
142
+ /**
143
+ * Target FPS for the global render loop
144
+ *
145
+ * @remarks
146
+ * Controls the maximum frame rate of the entire rendering system.
147
+ * When set to 0, no throttling is applied (use display refresh rate).
148
+ * When set to a positive number, the global requestAnimationFrame loop
149
+ * will be throttled to this target FPS, affecting all animations and rendering.
150
+ *
151
+ * This provides global performance control for the entire application,
152
+ * useful for managing performance on lower-end devices.
153
+ *
154
+ * @defaultValue `0` (no throttling, use display refresh rate)
155
+ */
156
+ targetFPS: number;
157
+ }
158
+
159
+ /**
160
+ * Configuration settings for {@link RendererMain}
161
+ */
162
+ export type RendererMainSettings = RendererRuntimeSettings & {
163
+ /**
164
+ * Include context call (i.e. WebGL) information in FPS updates
165
+ *
166
+ * @remarks
167
+ * When enabled the number of calls to each context method over the
168
+ * `fpsUpdateInterval` will be included in the FPS update payload's
169
+ * `contextSpyData` property.
170
+ *
171
+ * Enabling the context spy has a serious impact on performance so only use it
172
+ * when you need to extract context call information.
173
+ *
174
+ * @defaultValue `false` (disabled)
175
+ */
176
+ enableContextSpy: boolean;
177
+
178
+ /**
179
+ * Number or Image Workers to use
180
+ *
181
+ * @remarks
182
+ * On devices with multiple cores, this can be used to improve image loading
183
+ * as well as reduce the impact of image loading on the main thread.
184
+ * Set to 0 to disable image workers.
185
+ *
186
+ * @defaultValue `2`
187
+ */
188
+ numImageWorkers: number;
189
+
190
+ /**
191
+ * Renderer Engine
192
+ *
193
+ * @remarks
194
+ * The renderer engine to use. Spawns a WebGL or Canvas renderer.
195
+ * WebGL is more performant and supports more features. Canvas is
196
+ * supported on most platforms.
197
+ *
198
+ * Note: When using CanvasCoreRenderer you can only use
199
+ * CanvasTextRenderer. The WebGLCoreRenderer supports
200
+ * both CanvasTextRenderer and SdfTextRenderer for Text Rendering.
201
+ *
202
+ */
203
+ renderEngine: typeof CanvasRenderer | typeof WebGlRenderer;
204
+
205
+ /**
206
+ * Quad buffer size in bytes
207
+ *
208
+ * @defaultValue 4 * 1024 * 1024
209
+ */
210
+ quadBufferSize: number;
211
+
212
+ /**
213
+ * Font Engines
214
+ *
215
+ * @remarks
216
+ * The font engines to use for text rendering. CanvasTextRenderer is supported
217
+ * on all platforms. SdfTextRenderer is a more performant renderer.
218
+ * When using `renderEngine=CanvasCoreRenderer` you can only use `CanvasTextRenderer`.
219
+ * The `renderEngine=WebGLCoreRenderer` supports both `CanvasTextRenderer` and `SdfTextRenderer`.
220
+ *
221
+ * This setting is used to enable tree shaking of unused font engines. Please
222
+ * import your font engine(s) as follows:
223
+ * ```
224
+ * import { CanvasTextRenderer } from '@lightning/renderer/canvas';
225
+ * import { SdfTextRenderer } from '@lightning/renderer/webgl';
226
+ * ```
227
+ *
228
+ * If both CanvasTextRenderer and SdfTextRenderer are provided, the first renderer
229
+ * provided will be asked first if it can render the font. If it cannot render the
230
+ * font, the next renderer will be asked. If no renderer can render the font, the
231
+ * text will not be rendered.
232
+ *
233
+ * **Note** that if you have fonts available in both engines the second font engine
234
+ * will not be used. This is because the first font engine will always be asked first.
235
+ *
236
+ * @defaultValue '[]'
237
+ *
238
+ *
239
+ */
240
+ fontEngines: TextRenderer[];
241
+
242
+ /**
243
+ * Force WebGL2
244
+ *
245
+ * @remarks
246
+ * Force the renderer to use WebGL2. This can be used to force the renderer to
247
+ * use WebGL2 even if the browser supports WebGL1.
248
+ *
249
+ * @defaultValue `false`
250
+ */
251
+ forceWebGL2: boolean;
252
+
253
+ /**
254
+ * Enable strictBounds
255
+ *
256
+ * @remarks
257
+ * Enable strict bounds for the renderer. This will ensure that the renderer
258
+ * will not render outside the bounds of the canvas.
259
+ *
260
+ * @defaultValue `true`
261
+ */
262
+ strictBounds: boolean;
263
+
264
+ /**
265
+ * Canvas object to use for rendering
266
+ *
267
+ * @remarks
268
+ * This is used to render the scene graph. If not provided, a new canvas
269
+ * element will be created and appended to the target element.
270
+ */
271
+ canvas: HTMLCanvasElement;
272
+
273
+ /**
274
+ * createImageBitmap support for the runtime
275
+ *
276
+ * @remarks
277
+ * This is used to determine if and which version of the createImageBitmap API
278
+ * is supported by the runtime. This is used to determine if the renderer can
279
+ * use createImageBitmap to load images.
280
+ *
281
+ * Options supported
282
+ * - Auto - Automatically determine the supported version
283
+ * - Basic - Supports createImageBitmap(image)
284
+ * - Options - Supports createImageBitmap(image, options)
285
+ * - Full - Supports createImageBitmap(image, sx, sy, sw, sh, options)
286
+ *
287
+ * Note with auto detection, the renderer will attempt to use the most advanced
288
+ * version of the API available. If the API is not available, the renderer will
289
+ * fall back to the next available version.
290
+ *
291
+ * This will affect startup performance as the renderer will need to determine
292
+ * the supported version of the API.
293
+ *
294
+ * @defaultValue `full`
295
+ */
296
+ createImageBitmapSupport: 'auto' | 'basic' | 'options' | 'full';
297
+
298
+ /**
299
+ * Provide an alternative platform abstraction layer
300
+ *
301
+ * @remarks
302
+ * By default the Lightning 3 renderer will load a webplatform, assuming it runs
303
+ * inside a web browsr. However for special cases there might be a need to provide
304
+ * an abstracted platform layer to run on non-web or non-standard JS engines
305
+ *
306
+ * @defaultValue `null`
307
+ */
308
+ platform: typeof Platform | null;
309
+ };
310
+
311
+ /**
312
+ * The Renderer Main API
313
+ *
314
+ * @remarks
315
+ * This is the primary class used to configure and operate the Renderer.
316
+ *
317
+ * It is used to create and destroy Nodes, as well as Texture and Shader
318
+ * references.
319
+ *
320
+ * Example:
321
+ * ```ts
322
+ * import { RendererMain, MainCoreDriver } from '@lightningjs/renderer';
323
+ *
324
+ * // Initialize the Renderer
325
+ * const renderer = new RendererMain(
326
+ * {
327
+ * appWidth: 1920,
328
+ * appHeight: 1080
329
+ * },
330
+ * 'app',
331
+ * new MainCoreDriver(),
332
+ * );
333
+ * ```
334
+ *
335
+ * ## Events
336
+ * - `fpsUpdate`
337
+ * - Emitted every `fpsUpdateInterval` milliseconds with the current FPS
338
+ * - `frameTick`
339
+ * - Emitted every frame tick
340
+ * - `quadsUpdate`
341
+ * - Emitted when number of quads rendered is updated
342
+ * - `idle`
343
+ * - Emitted when the renderer is idle (no changes to the scene
344
+ * graph/animations running)
345
+ * - `criticalCleanup`
346
+ * - Emitted when the Texture Memory Manager Cleanup process is triggered
347
+ * - Payload: { memUsed: number, criticalThreshold: number }
348
+ * - `memUsed` - The amount of memory (in bytes) used by textures before the
349
+ * cleanup process
350
+ * - `criticalThreshold` - The critical threshold (in bytes)
351
+ * - `criticalCleanupFailed`
352
+ * - Emitted when the Texture Memory Manager Cleanup process is unable to free
353
+ * up enough texture memory to reach below the critical threshold.
354
+ * This can happen when there is not enough non-renderable textures to
355
+ * free up.
356
+ * - Payload (object with keys):
357
+ * - `memUsed` - The amount of memory (in bytes) used by textures after
358
+ * the cleanup process
359
+ * - `criticalThreshold` - The critical threshold (in bytes)
360
+ */
361
+ export class RendererMain extends EventEmitter {
362
+ readonly root: INode;
363
+ readonly canvas: HTMLCanvasElement;
364
+ readonly stage: Stage;
365
+ private inspector: Inspector | null = null;
366
+
367
+ /**
368
+ * Constructs a new Renderer instance
369
+ *
370
+ * @param settings Renderer settings
371
+ * @param target Element ID or HTMLElement to insert the canvas into
372
+ * @param driver Core Driver to use
373
+ */
374
+ constructor(
375
+ settings: Partial<RendererMainSettings>,
376
+ target: string | HTMLElement,
377
+ ) {
378
+ super();
379
+
380
+ const resolvedTxSettings = this.resolveTxSettings(
381
+ settings.textureMemory || {},
382
+ );
383
+
384
+ settings = {
385
+ appWidth: settings.appWidth || 1920,
386
+ appHeight: settings.appHeight || 1080,
387
+ textureMemory: resolvedTxSettings,
388
+ boundsMargin: settings.boundsMargin || 0,
389
+ deviceLogicalPixelRatio: settings.deviceLogicalPixelRatio || 1,
390
+ devicePhysicalPixelRatio:
391
+ settings.devicePhysicalPixelRatio || window.devicePixelRatio,
392
+ clearColor: settings.clearColor ?? 0x00000000,
393
+ fpsUpdateInterval: settings.fpsUpdateInterval || 0,
394
+ targetFPS: settings.targetFPS || 0,
395
+ numImageWorkers:
396
+ settings.numImageWorkers !== undefined ? settings.numImageWorkers : 2,
397
+ enableContextSpy: settings.enableContextSpy ?? false,
398
+ forceWebGL2: settings.forceWebGL2 ?? false,
399
+ inspector: settings.inspector ?? false,
400
+ renderEngine: settings.renderEngine,
401
+ quadBufferSize: settings.quadBufferSize ?? 4 * 1024 * 1024,
402
+ fontEngines: settings.fontEngines ?? [],
403
+ strictBounds: settings.strictBounds ?? true,
404
+ textureProcessingTimeLimit: settings.textureProcessingTimeLimit || 42,
405
+ canvas: settings.canvas || document.createElement('canvas'),
406
+ createImageBitmapSupport: settings.createImageBitmapSupport || 'full',
407
+ platform: settings.platform || null,
408
+ };
409
+
410
+ const {
411
+ appWidth,
412
+ appHeight,
413
+ deviceLogicalPixelRatio,
414
+ devicePhysicalPixelRatio,
415
+ inspector,
416
+ canvas,
417
+ } = settings as RendererMainSettings;
418
+
419
+ let platform;
420
+ if (
421
+ settings.platform !== undefined &&
422
+ settings.platform !== null &&
423
+ settings.platform.prototype instanceof Platform === true
424
+ ) {
425
+ // @ts-ignore - if Platform is a valid class, it will be used
426
+ platform = new settings.platform();
427
+ } else {
428
+ platform = new WebPlatform();
429
+ }
430
+
431
+ const deviceLogicalWidth = appWidth * deviceLogicalPixelRatio;
432
+ const deviceLogicalHeight = appHeight * deviceLogicalPixelRatio;
433
+
434
+ this.canvas = canvas;
435
+ canvas.width = deviceLogicalWidth * devicePhysicalPixelRatio;
436
+ canvas.height = deviceLogicalHeight * devicePhysicalPixelRatio;
437
+
438
+ canvas.style.width = `${deviceLogicalWidth}px`;
439
+ canvas.style.height = `${deviceLogicalHeight}px`;
440
+
441
+ // Initialize the stage
442
+ this.stage = new Stage({
443
+ appWidth,
444
+ appHeight,
445
+ boundsMargin: settings.boundsMargin!,
446
+ clearColor: settings.clearColor!,
447
+ canvas: this.canvas,
448
+ deviceLogicalPixelRatio,
449
+ devicePhysicalPixelRatio,
450
+ enableContextSpy: settings.enableContextSpy!,
451
+ forceWebGL2: settings.forceWebGL2!,
452
+ fpsUpdateInterval: settings.fpsUpdateInterval!,
453
+ numImageWorkers: settings.numImageWorkers!,
454
+ renderEngine: settings.renderEngine!,
455
+ textureMemory: resolvedTxSettings,
456
+ eventBus: this,
457
+ quadBufferSize: settings.quadBufferSize!,
458
+ fontEngines: settings.fontEngines!,
459
+ inspector: settings.inspector !== null,
460
+ strictBounds: settings.strictBounds!,
461
+ targetFPS: settings.targetFPS!,
462
+ textureProcessingTimeLimit: settings.textureProcessingTimeLimit!,
463
+ createImageBitmapSupport: settings.createImageBitmapSupport!,
464
+ platform,
465
+ });
466
+
467
+ // Extract the root node
468
+ this.root = this.stage.root as unknown as INode;
469
+
470
+ // Get the target element and attach the canvas to it
471
+ let targetEl: HTMLElement | null;
472
+ if (typeof target === 'string') {
473
+ targetEl = document.getElementById(target);
474
+ } else {
475
+ targetEl = target;
476
+ }
477
+
478
+ if (!targetEl) {
479
+ throw new Error('Could not find target element');
480
+ }
481
+
482
+ targetEl.appendChild(canvas);
483
+
484
+ // Initialize inspector (if enabled)
485
+ if (inspector && isProductionEnvironment === false) {
486
+ this.inspector = new inspector(canvas, settings as RendererMainSettings);
487
+ }
488
+ }
489
+
490
+ /**
491
+ * Resolves the Texture Memory Manager values
492
+ *
493
+ * @param props
494
+ * @returns
495
+ */
496
+ private resolveTxSettings(
497
+ textureMemory: Partial<TextureMemoryManagerSettings>,
498
+ ): TextureMemoryManagerSettings {
499
+ const currentTxSettings =
500
+ (this.stage && this.stage.options.textureMemory) || {};
501
+
502
+ return {
503
+ criticalThreshold:
504
+ textureMemory?.criticalThreshold ??
505
+ currentTxSettings?.criticalThreshold ??
506
+ 124e6,
507
+ targetThresholdLevel:
508
+ textureMemory?.targetThresholdLevel ??
509
+ currentTxSettings?.targetThresholdLevel ??
510
+ 0.5,
511
+ cleanupInterval:
512
+ textureMemory?.cleanupInterval ??
513
+ currentTxSettings?.cleanupInterval ??
514
+ 5000,
515
+ debugLogging:
516
+ textureMemory?.debugLogging ?? currentTxSettings?.debugLogging ?? false,
517
+ baselineMemoryAllocation:
518
+ textureMemory?.baselineMemoryAllocation ??
519
+ currentTxSettings?.baselineMemoryAllocation ??
520
+ 26e6,
521
+ doNotExceedCriticalThreshold:
522
+ textureMemory?.doNotExceedCriticalThreshold ??
523
+ currentTxSettings?.doNotExceedCriticalThreshold ??
524
+ false,
525
+ };
526
+ }
527
+
528
+ /**
529
+ * Create a new scene graph node
530
+ *
531
+ * @remarks
532
+ * A node is the main graphical building block of the Renderer scene graph. It
533
+ * can be a container for other nodes, or it can be a leaf node that renders a
534
+ * solid color, gradient, image, or specific texture, using a specific shader.
535
+ *
536
+ * To create a text node, see {@link createTextNode}.
537
+ *
538
+ * See {@link CoreNode} for more details.
539
+ *
540
+ * @param props
541
+ * @returns
542
+ */
543
+ createNode<ShNode extends CoreShaderNode<any>>(
544
+ props: Partial<INodeProps<ShNode>>,
545
+ ): INode<ShNode> {
546
+ const node = this.stage.createNode(props as Partial<CoreNodeProps>);
547
+
548
+ if (this.inspector) {
549
+ return this.inspector.createNode(node) as unknown as INode<ShNode>;
550
+ }
551
+
552
+ return node as unknown as INode<ShNode>;
553
+ }
554
+
555
+ /**
556
+ * Create a new scene graph text node
557
+ *
558
+ * @remarks
559
+ * A text node is the second graphical building block of the Renderer scene
560
+ * graph. It renders text using a specific text renderer that is automatically
561
+ * chosen based on the font requested and what type of fonts are installed
562
+ * into an app.
563
+ *
564
+ * See {@link ITextNode} for more details.
565
+ *
566
+ * @param props
567
+ * @returns
568
+ */
569
+ createTextNode(props: Partial<ITextNodeProps>): ITextNode {
570
+ const textNode = this.stage.createTextNode(props as CoreTextNodeProps);
571
+
572
+ if (this.inspector) {
573
+ return this.inspector.createTextNode(textNode) as unknown as ITextNode;
574
+ }
575
+
576
+ return textNode as unknown as ITextNode;
577
+ }
578
+
579
+ /**
580
+ * Destroy a node
581
+ *
582
+ * @remarks
583
+ * This method destroys a node
584
+ *
585
+ * @param node
586
+ * @returns
587
+ */
588
+ destroyNode(node: INode) {
589
+ if (this.inspector) {
590
+ this.inspector.destroyNode(node.id);
591
+ }
592
+
593
+ return node.destroy();
594
+ }
595
+
596
+ /**
597
+ * Create a new texture reference
598
+ *
599
+ * @remarks
600
+ * This method creates a new reference to a texture. The texture is not
601
+ * loaded until it is used on a node.
602
+ *
603
+ * It can be assigned to a node's `texture` property, or it can be used
604
+ * when creating a SubTexture.
605
+ *
606
+ * @param textureType
607
+ * @param props
608
+ * @param options
609
+ * @returns
610
+ */
611
+ createTexture<TxType extends keyof TextureMap>(
612
+ textureType: TxType,
613
+ props: ExtractProps<TextureMap[TxType]>,
614
+ ): InstanceType<TextureMap[TxType]> {
615
+ return this.stage.txManager.createTexture(textureType, props);
616
+ }
617
+
618
+ /**
619
+ * Create a new shader controller for a shader type
620
+ *
621
+ * @remarks
622
+ * This method creates a new Shader Controller for a specific shader type.
623
+ *
624
+ * If the shader has not been loaded yet, it will be loaded. Otherwise, the
625
+ * existing shader will be reused.
626
+ *
627
+ * It can be assigned to a Node's `shader` property.
628
+ *
629
+ * @param shaderType
630
+ * @param props
631
+ * @returns
632
+ */
633
+ createShader<ShType extends keyof ShaderMap>(
634
+ shType: ShType,
635
+ props?: OptionalShaderProps<ShType>,
636
+ ) {
637
+ return this.stage.shManager.createShader(shType, props) as CoreShaderNode<
638
+ NonNullable<ExtractShaderProps<ShType>>
639
+ >;
640
+ }
641
+
642
+ /**
643
+ * Get a Node by its ID
644
+ *
645
+ * @param id
646
+ * @returns
647
+ */
648
+ getNodeById(id: number): CoreNode | null {
649
+ const root = this.stage?.root;
650
+ if (!root) {
651
+ return null;
652
+ }
653
+
654
+ const findNode = (node: CoreNode): CoreNode | null => {
655
+ if (node.id === id) {
656
+ return node;
657
+ }
658
+
659
+ for (const child of node.children) {
660
+ const found = findNode(child);
661
+ if (found) {
662
+ return found;
663
+ }
664
+ }
665
+
666
+ return null;
667
+ };
668
+
669
+ return findNode(root);
670
+ }
671
+
672
+ toggleFreeze() {
673
+ throw new Error('Not implemented');
674
+ }
675
+
676
+ advanceFrame() {
677
+ throw new Error('Not implemented');
678
+ }
679
+
680
+ getBufferInfo() {
681
+ return this.stage.renderer.getBufferInfo();
682
+ }
683
+
684
+ /**
685
+ * Re-render the current frame without advancing any running animations.
686
+ *
687
+ * @remarks
688
+ * Any state changes will be reflected in the re-rendered frame. Useful for
689
+ * debugging.
690
+ *
691
+ * May not do anything if the render loop is running on a separate worker.
692
+ */
693
+ rerender() {
694
+ this.stage.requestRender();
695
+ }
696
+
697
+ /**
698
+ * Cleanup textures that are not being used
699
+ *
700
+ * @param aggressive - If true, will cleanup all textures, regardless of render status
701
+ *
702
+ * @remarks
703
+ * This can be used to free up GFX memory used by textures that are no longer
704
+ * being displayed.
705
+ *
706
+ * This routine is also called automatically when the memory used by textures
707
+ * exceeds the critical threshold on frame generation **OR** when the renderer
708
+ * is idle and the memory used by textures exceeds the target threshold.
709
+ *
710
+ * **NOTE**: This is a heavy operation and should be used sparingly.
711
+ * **NOTE2**: This will not cleanup textures that are currently being displayed.
712
+ * **NOTE3**: This will not cleanup textures that are marked as `preventCleanup`.
713
+ * **NOTE4**: This has nothing to do with the garbage collection of JavaScript.
714
+ */
715
+ cleanup(aggressive: boolean = false) {
716
+ this.stage.cleanup(aggressive);
717
+ }
718
+
719
+ /**
720
+ * Sets the clear color for the stage.
721
+ *
722
+ * @param color - The color to set as the clear color.
723
+ */
724
+ setClearColor(color: number) {
725
+ this.stage.setClearColor(color);
726
+ }
727
+
728
+ /**
729
+ * Set options for the renderer
730
+ *
731
+ * @param options
732
+ */
733
+ setOptions(options: Partial<RendererRuntimeSettings>) {
734
+ const stage = this.stage;
735
+ if (options.textureMemory !== undefined) {
736
+ const textureMemory = (options.textureMemory = this.resolveTxSettings(
737
+ options.textureMemory,
738
+ ));
739
+ stage.txMemManager.updateSettings(textureMemory);
740
+ stage.txMemManager.cleanup();
741
+ }
742
+
743
+ if (options.boundsMargin !== undefined) {
744
+ let bm = options.boundsMargin!;
745
+ options.boundsMargin = Array.isArray(bm) ? bm : [bm, bm, bm, bm];
746
+ }
747
+
748
+ const stageOptions = stage.options;
749
+ for (let key in options) {
750
+ stageOptions[key] = options[key]!;
751
+ }
752
+
753
+ if (options.inspector !== undefined && !isProductionEnvironment) {
754
+ if (options.inspector === false) {
755
+ this.inspector?.destroy();
756
+ this.inspector = null;
757
+ } else if (
758
+ this.inspector === null ||
759
+ this.inspector.constructor !== options.inspector
760
+ ) {
761
+ this.inspector = new options.inspector(
762
+ this.canvas,
763
+ stage.options as unknown as RendererMainSettings,
764
+ );
765
+ this.inspector?.createNodes(this.root as unknown as CoreNode);
766
+ }
767
+ }
768
+
769
+ let needDimensionsUpdate = false;
770
+
771
+ if (
772
+ options.deviceLogicalPixelRatio ||
773
+ options.devicePhysicalPixelRatio !== undefined
774
+ ) {
775
+ this.stage.pixelRatio =
776
+ stageOptions.devicePhysicalPixelRatio *
777
+ stageOptions.deviceLogicalPixelRatio;
778
+ this.inspector?.updateViewport(
779
+ stageOptions.appWidth,
780
+ stageOptions.appHeight,
781
+ stageOptions.deviceLogicalPixelRatio,
782
+ );
783
+ needDimensionsUpdate = true;
784
+ }
785
+
786
+ if (options.appWidth !== undefined || options.appHeight !== undefined) {
787
+ this.inspector?.updateViewport(
788
+ stageOptions.appWidth,
789
+ stageOptions.appHeight,
790
+ stageOptions.deviceLogicalPixelRatio,
791
+ );
792
+ needDimensionsUpdate = true;
793
+ }
794
+
795
+ if (options.boundsMargin !== undefined) {
796
+ this.stage.setBoundsMargin(options.boundsMargin);
797
+ }
798
+
799
+ if (options.clearColor !== undefined) {
800
+ this.stage.setClearColor(options.clearColor);
801
+ }
802
+
803
+ if (needDimensionsUpdate) {
804
+ this.updateAppDimensions();
805
+ }
806
+ }
807
+
808
+ private updateAppDimensions() {
809
+ const {
810
+ appWidth,
811
+ appHeight,
812
+ deviceLogicalPixelRatio,
813
+ devicePhysicalPixelRatio,
814
+ } = this.stage.options;
815
+
816
+ const deviceLogicalWidth = appWidth * deviceLogicalPixelRatio;
817
+ const deviceLogicalHeight = appHeight * deviceLogicalPixelRatio;
818
+
819
+ this.canvas.width = deviceLogicalWidth * devicePhysicalPixelRatio;
820
+ this.canvas.height = deviceLogicalHeight * devicePhysicalPixelRatio;
821
+
822
+ this.canvas.style.width = `${deviceLogicalWidth}px`;
823
+ this.canvas.style.height = `${deviceLogicalHeight}px`;
824
+
825
+ this.stage.renderer.updateViewport();
826
+
827
+ this.root.width = appWidth;
828
+ this.root.height = appHeight;
829
+ this.stage.updateViewportBounds();
830
+ }
831
+
832
+ get settings(): Readonly<StageOptions> {
833
+ return this.stage.options;
834
+ }
835
+
836
+ /**
837
+ * Gets the target FPS for the global render loop
838
+ *
839
+ * @returns The current target FPS (0 means no throttling)
840
+ *
841
+ * @remarks
842
+ * This controls the maximum frame rate of the entire rendering system.
843
+ * When 0, the system runs at display refresh rate.
844
+ */
845
+ get targetFPS(): number {
846
+ return this.stage.options.targetFPS || 0;
847
+ }
848
+
849
+ /**
850
+ * Sets the target FPS for the global render loop
851
+ *
852
+ * @param fps - The target FPS to set for the global render loop.
853
+ * Set to 0 or a negative value to disable throttling.
854
+ *
855
+ * @remarks
856
+ * This setting affects the entire rendering system immediately.
857
+ * All animations, rendering, and frame updates will be throttled
858
+ * to this target FPS. Provides global performance control.
859
+ *
860
+ * @example
861
+ * ```typescript
862
+ * // Set global target to 30fps for better performance
863
+ * renderer.targetFPS = 30;
864
+ *
865
+ * // Disable global throttling (use display refresh rate)
866
+ * renderer.targetFPS = 0;
867
+ * ```
868
+ */
869
+ set targetFPS(fps: number) {
870
+ this.stage.options.targetFPS = fps > 0 ? fps : 0;
871
+ this.stage.updateTargetFrameTime();
872
+ }
873
+ }