@lightningjs/renderer 2.12.0 → 2.13.0

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