@lightningjs/renderer 3.0.0-beta2 → 3.0.0-beta4

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