@lightningjs/renderer 0.9.3 → 1.0.0-rc.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 (295) hide show
  1. package/README.md +0 -82
  2. package/dist/exports/index.d.ts +40 -3
  3. package/dist/exports/index.js +35 -3
  4. package/dist/exports/index.js.map +1 -1
  5. package/dist/src/core/CoreNode.d.ts +462 -46
  6. package/dist/src/core/CoreNode.js +171 -103
  7. package/dist/src/core/CoreNode.js.map +1 -1
  8. package/dist/src/core/CoreShaderManager.d.ts +19 -8
  9. package/dist/src/core/CoreShaderManager.js +21 -21
  10. package/dist/src/core/CoreShaderManager.js.map +1 -1
  11. package/dist/src/core/CoreTextNode.d.ts +30 -4
  12. package/dist/src/core/CoreTextNode.js +24 -1
  13. package/dist/src/core/CoreTextNode.js.map +1 -1
  14. package/dist/src/core/CoreTextureManager.d.ts +31 -82
  15. package/dist/src/core/CoreTextureManager.js +39 -126
  16. package/dist/src/core/CoreTextureManager.js.map +1 -1
  17. package/dist/src/core/Stage.d.ts +67 -9
  18. package/dist/src/core/Stage.js +174 -30
  19. package/dist/src/core/Stage.js.map +1 -1
  20. package/dist/src/core/TextureMemoryManager.d.ts +97 -8
  21. package/dist/src/core/TextureMemoryManager.js +142 -19
  22. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  23. package/dist/src/core/animations/CoreAnimation.d.ts +14 -6
  24. package/dist/src/core/animations/CoreAnimation.js +136 -44
  25. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  26. package/dist/src/core/lib/ImageWorker.js +59 -52
  27. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  28. package/dist/src/core/lib/utils.d.ts +1 -0
  29. package/dist/src/core/lib/utils.js +3 -2
  30. package/dist/src/core/lib/utils.js.map +1 -1
  31. package/dist/src/core/platform.js +7 -1
  32. package/dist/src/core/platform.js.map +1 -1
  33. package/dist/src/core/renderers/CoreContextTexture.d.ts +3 -2
  34. package/dist/src/core/renderers/CoreContextTexture.js +7 -1
  35. package/dist/src/core/renderers/CoreContextTexture.js.map +1 -1
  36. package/dist/src/core/renderers/CoreRenderer.d.ts +5 -1
  37. package/dist/src/core/renderers/CoreRenderer.js +0 -1
  38. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  39. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +3 -0
  40. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +16 -1
  41. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -1
  42. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +0 -1
  43. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +2 -5
  44. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -1
  45. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +2 -2
  46. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +1 -1
  47. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +0 -1
  48. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +7 -10
  49. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  50. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +3 -0
  51. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +47 -9
  52. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  53. package/dist/src/core/renderers/webgl/newShader/abcMock.js +2 -0
  54. package/dist/src/core/renderers/webgl/newShader/abcMock.js.map +1 -0
  55. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +24 -8
  56. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +70 -37
  57. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
  58. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +2 -2
  59. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +1 -1
  60. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +2 -2
  61. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +1 -1
  62. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +2 -2
  63. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +1 -1
  64. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +2 -2
  65. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +1 -1
  66. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +2 -2
  67. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +1 -1
  68. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.d.ts +8 -0
  69. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +103 -0
  70. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +1 -1
  71. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +3 -18
  72. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +1 -1
  73. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +5 -2
  74. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +1 -1
  75. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +4 -36
  76. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js.map +1 -1
  77. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +3 -2
  78. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
  79. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +4 -2
  80. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -1
  81. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +2 -1
  82. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js.map +1 -1
  83. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +4 -36
  84. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +1 -1
  85. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.d.ts +11 -0
  86. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +1 -1
  87. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +5 -2
  88. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
  89. package/dist/src/core/text-rendering/font-face-types/TrFontFace.d.ts +0 -1
  90. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +0 -1
  91. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +1 -1
  92. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +0 -1
  93. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +1 -1
  94. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +10 -26
  95. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +116 -365
  96. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  97. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +0 -1
  98. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +0 -2
  99. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
  100. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +2 -2
  101. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  102. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +2 -0
  103. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
  104. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +3 -2
  105. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  106. package/dist/src/core/textures/ColorTexture.d.ts +1 -1
  107. package/dist/src/core/textures/ColorTexture.js +1 -1
  108. package/dist/src/core/textures/ImageTexture.d.ts +1 -1
  109. package/dist/src/core/textures/NoiseTexture.d.ts +1 -1
  110. package/dist/src/core/textures/NoiseTexture.js +3 -0
  111. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  112. package/dist/src/core/textures/SubTexture.d.ts +2 -2
  113. package/dist/src/core/textures/SubTexture.js +5 -1
  114. package/dist/src/core/textures/SubTexture.js.map +1 -1
  115. package/dist/src/core/textures/Texture.d.ts +23 -2
  116. package/dist/src/core/textures/Texture.js +32 -3
  117. package/dist/src/core/textures/Texture.js.map +1 -1
  118. package/dist/src/core/utils.d.ts +7 -0
  119. package/dist/src/core/utils.js +12 -10
  120. package/dist/src/core/utils.js.map +1 -1
  121. package/dist/src/effectsMock.d.ts +13 -0
  122. package/dist/src/effectsMock.js +62 -0
  123. package/dist/src/effectsMock.js.map +1 -0
  124. package/dist/src/main-api/DynamicShaderController.d.ts +28 -0
  125. package/dist/src/main-api/DynamicShaderController.js +55 -0
  126. package/dist/src/main-api/DynamicShaderController.js.map +1 -0
  127. package/dist/src/main-api/INode.d.ts +43 -463
  128. package/dist/src/main-api/INode.js +1 -19
  129. package/dist/src/main-api/INode.js.map +1 -1
  130. package/dist/src/main-api/Inspector.d.ts +10 -10
  131. package/dist/src/main-api/Inspector.js +18 -15
  132. package/dist/src/main-api/Inspector.js.map +1 -1
  133. package/dist/src/main-api/Renderer.d.ts +28 -24
  134. package/dist/src/main-api/Renderer.js +22 -103
  135. package/dist/src/main-api/Renderer.js.map +1 -1
  136. package/dist/src/main-api/ShaderController.d.ts +31 -0
  137. package/dist/src/main-api/ShaderController.js +37 -0
  138. package/dist/src/main-api/ShaderController.js.map +1 -0
  139. package/dist/src/test.js +4 -0
  140. package/dist/src/test.js.map +1 -0
  141. package/dist/src/utils.d.ts +1 -0
  142. package/dist/src/utils.js +7 -0
  143. package/dist/src/utils.js.map +1 -1
  144. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  145. package/exports/index.ts +60 -3
  146. package/package.json +8 -7
  147. package/src/core/CoreNode.test.ts +93 -0
  148. package/src/core/CoreNode.ts +675 -187
  149. package/src/core/CoreShaderManager.ts +63 -31
  150. package/src/core/CoreTextNode.ts +41 -9
  151. package/src/core/CoreTextureManager.ts +55 -175
  152. package/src/core/Stage.ts +199 -43
  153. package/src/core/TextureMemoryManager.ts +231 -22
  154. package/src/core/animations/CoreAnimation.ts +193 -68
  155. package/src/core/lib/ImageWorker.ts +79 -52
  156. package/src/core/lib/utils.ts +5 -2
  157. package/src/core/platform.ts +8 -1
  158. package/src/core/renderers/CoreContextTexture.ts +9 -2
  159. package/src/core/renderers/CoreRenderer.ts +5 -2
  160. package/src/core/renderers/canvas/CanvasCoreRenderer.ts +20 -1
  161. package/src/core/renderers/canvas/CanvasCoreTexture.ts +2 -6
  162. package/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.ts +2 -2
  163. package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +7 -11
  164. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +51 -9
  165. package/src/core/renderers/webgl/shaders/DynamicShader.ts +114 -55
  166. package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +2 -2
  167. package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +2 -2
  168. package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +2 -2
  169. package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +2 -2
  170. package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +2 -2
  171. package/src/core/renderers/webgl/shaders/effects/EffectUtils.ts +129 -3
  172. package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +7 -15
  173. package/src/core/renderers/webgl/shaders/effects/GlitchEffect.ts +5 -2
  174. package/src/core/renderers/webgl/shaders/effects/HolePunchEffect.ts +6 -15
  175. package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +6 -2
  176. package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +10 -2
  177. package/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.ts +2 -1
  178. package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +6 -15
  179. package/src/core/renderers/webgl/shaders/effects/ShaderEffect.ts +20 -0
  180. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +14 -15
  181. package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -2
  182. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -1
  183. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +139 -447
  184. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -3
  185. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +2 -2
  186. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +4 -2
  187. package/src/core/text-rendering/renderers/TextRenderer.ts +3 -2
  188. package/src/core/textures/ColorTexture.ts +1 -1
  189. package/src/core/textures/ImageTexture.ts +1 -1
  190. package/src/core/textures/NoiseTexture.ts +4 -1
  191. package/src/core/textures/SubTexture.ts +7 -7
  192. package/src/core/textures/Texture.ts +46 -3
  193. package/src/core/utils.ts +12 -11
  194. package/src/main-api/DynamicShaderController.ts +97 -0
  195. package/src/main-api/INode.ts +56 -479
  196. package/src/main-api/Inspector.ts +37 -39
  197. package/src/main-api/Renderer.ts +543 -0
  198. package/src/main-api/ShaderController.ts +81 -0
  199. package/src/main-api/utils.ts +45 -0
  200. package/src/utils.ts +8 -0
  201. package/dist/exports/core-api.d.ts +0 -74
  202. package/dist/exports/core-api.js +0 -96
  203. package/dist/exports/core-api.js.map +0 -1
  204. package/dist/exports/main-api.d.ts +0 -30
  205. package/dist/exports/main-api.js +0 -45
  206. package/dist/exports/main-api.js.map +0 -1
  207. package/dist/src/core/CoreExtension.d.ts +0 -12
  208. package/dist/src/core/CoreExtension.js +0 -29
  209. package/dist/src/core/CoreExtension.js.map +0 -1
  210. package/dist/src/core/renderers/webgl/newShader/effectsMock.js +0 -36
  211. package/dist/src/core/renderers/webgl/newShader/effectsMock.js.map +0 -1
  212. package/dist/src/main-api/ICoreDriver.d.ts +0 -24
  213. package/dist/src/main-api/ICoreDriver.js +0 -20
  214. package/dist/src/main-api/ICoreDriver.js.map +0 -1
  215. package/dist/src/main-api/RendererMain.d.ts +0 -378
  216. package/dist/src/main-api/RendererMain.js +0 -367
  217. package/dist/src/main-api/RendererMain.js.map +0 -1
  218. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.d.ts +0 -9
  219. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js +0 -38
  220. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js.map +0 -1
  221. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.d.ts +0 -56
  222. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js +0 -101
  223. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js.map +0 -1
  224. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.d.ts +0 -32
  225. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js +0 -28
  226. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js.map +0 -1
  227. package/dist/src/render-drivers/main/MainCoreDriver.d.ts +0 -21
  228. package/dist/src/render-drivers/main/MainCoreDriver.js +0 -115
  229. package/dist/src/render-drivers/main/MainCoreDriver.js.map +0 -1
  230. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +0 -101
  231. package/dist/src/render-drivers/main/MainOnlyNode.js +0 -425
  232. package/dist/src/render-drivers/main/MainOnlyNode.js.map +0 -1
  233. package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +0 -47
  234. package/dist/src/render-drivers/main/MainOnlyTextNode.js +0 -204
  235. package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +0 -1
  236. package/dist/src/render-drivers/threadx/NodeStruct.d.ts +0 -93
  237. package/dist/src/render-drivers/threadx/NodeStruct.js +0 -290
  238. package/dist/src/render-drivers/threadx/NodeStruct.js.map +0 -1
  239. package/dist/src/render-drivers/threadx/SharedNode.d.ts +0 -40
  240. package/dist/src/render-drivers/threadx/SharedNode.js +0 -61
  241. package/dist/src/render-drivers/threadx/SharedNode.js.map +0 -1
  242. package/dist/src/render-drivers/threadx/TextNodeStruct.d.ts +0 -44
  243. package/dist/src/render-drivers/threadx/TextNodeStruct.js +0 -203
  244. package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +0 -1
  245. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +0 -25
  246. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +0 -232
  247. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +0 -1
  248. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.d.ts +0 -24
  249. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js +0 -113
  250. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js.map +0 -1
  251. package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +0 -46
  252. package/dist/src/render-drivers/threadx/ThreadXMainNode.js +0 -160
  253. package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +0 -1
  254. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.d.ts +0 -28
  255. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +0 -55
  256. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +0 -1
  257. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +0 -70
  258. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js +0 -32
  259. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +0 -1
  260. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.d.ts +0 -19
  261. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +0 -184
  262. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +0 -1
  263. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.d.ts +0 -27
  264. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +0 -109
  265. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +0 -1
  266. package/dist/src/render-drivers/threadx/worker/renderer.js +0 -147
  267. package/dist/src/render-drivers/threadx/worker/renderer.js.map +0 -1
  268. package/dist/src/render-drivers/utils.d.ts +0 -12
  269. package/dist/src/render-drivers/utils.js +0 -74
  270. package/dist/src/render-drivers/utils.js.map +0 -1
  271. package/exports/core-api.ts +0 -102
  272. package/exports/main-api.ts +0 -60
  273. package/src/core/CoreExtension.ts +0 -32
  274. package/src/main-api/ICoreDriver.ts +0 -68
  275. package/src/main-api/RendererMain.ts +0 -685
  276. package/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.ts +0 -45
  277. package/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.ts +0 -154
  278. package/src/main-api/texture-usage-trackers/TextureUsageTracker.ts +0 -54
  279. package/src/render-drivers/main/MainCoreDriver.ts +0 -159
  280. package/src/render-drivers/main/MainOnlyNode.ts +0 -553
  281. package/src/render-drivers/main/MainOnlyTextNode.ts +0 -261
  282. package/src/render-drivers/threadx/NodeStruct.ts +0 -320
  283. package/src/render-drivers/threadx/SharedNode.ts +0 -101
  284. package/src/render-drivers/threadx/TextNodeStruct.ts +0 -213
  285. package/src/render-drivers/threadx/ThreadXCoreDriver.ts +0 -291
  286. package/src/render-drivers/threadx/ThreadXMainAnimationController.ts +0 -135
  287. package/src/render-drivers/threadx/ThreadXMainNode.ts +0 -201
  288. package/src/render-drivers/threadx/ThreadXMainTextNode.ts +0 -85
  289. package/src/render-drivers/threadx/ThreadXRendererMessage.ts +0 -112
  290. package/src/render-drivers/threadx/worker/ThreadXRendererNode.ts +0 -253
  291. package/src/render-drivers/threadx/worker/ThreadXRendererTextNode.ts +0 -151
  292. package/src/render-drivers/threadx/worker/renderer.ts +0 -156
  293. package/src/render-drivers/utils.ts +0 -102
  294. /package/dist/src/core/renderers/webgl/newShader/{effectsMock.d.ts → abcMock.d.ts} +0 -0
  295. /package/dist/src/{render-drivers/threadx/worker/renderer.d.ts → test.d.ts} +0 -0
@@ -1,15 +1,13 @@
1
- import type {
2
- INode,
3
- INodeAnimatableProps,
4
- INodeWritableProps,
5
- ITextNode,
6
- ITextNodeWritableProps,
7
- } from './INode.js';
8
- import type { ICoreDriver } from './ICoreDriver.js';
9
- import { type RendererMainSettings } from './RendererMain.js';
1
+ import {
2
+ CoreNode,
3
+ type CoreNodeAnimateProps,
4
+ type CoreNodeProps,
5
+ } from '../core/CoreNode.js';
6
+ import { type RendererMainSettings } from './Renderer.js';
10
7
  import type { AnimationSettings } from '../core/animations/CoreAnimation.js';
11
8
  import type { IAnimationController } from '../common/IAnimationController.js';
12
9
  import { isProductionEnvironment } from '../utils.js';
10
+ import type { CoreTextNode, CoreTextNodeProps } from '../core/CoreTextNode.js';
13
11
 
14
12
  /**
15
13
  * Inspector
@@ -219,31 +217,28 @@ export class Inspector {
219
217
  }
220
218
 
221
219
  createDiv(
222
- node: INode | ITextNode,
223
- properties: INodeWritableProps | ITextNodeWritableProps,
220
+ id: number,
221
+ properties: CoreNodeProps | CoreTextNodeProps,
224
222
  ): HTMLElement {
225
223
  const div = document.createElement('div');
226
224
  div.style.position = 'absolute';
227
- div.id = node.id.toString();
225
+ div.id = id.toString();
228
226
 
229
227
  // set initial properties
230
228
  for (const key in properties) {
231
229
  this.updateNodeProperty(
232
230
  div,
233
231
  // really typescript? really?
234
- key as keyof (INodeWritableProps & ITextNodeWritableProps),
235
- (properties as INodeWritableProps & ITextNodeWritableProps)[
236
- key as keyof (INodeWritableProps & ITextNodeWritableProps)
237
- ],
232
+ key as keyof CoreNodeProps,
233
+ properties[key as keyof CoreNodeProps],
238
234
  );
239
235
  }
240
236
 
241
237
  return div;
242
238
  }
243
239
 
244
- createNode(driver: ICoreDriver, properties: INodeWritableProps): INode {
245
- const node = driver.createNode(properties);
246
- const div = this.createDiv(node, properties);
240
+ createNode(node: CoreNode): CoreNode {
241
+ const div = this.createDiv(node.id, node.props);
247
242
 
248
243
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
249
244
  (div as any).node = node;
@@ -254,40 +249,39 @@ export class Inspector {
254
249
  return this.createProxy(node, div);
255
250
  }
256
251
 
257
- createTextNode(
258
- driver: ICoreDriver,
259
- properties: ITextNodeWritableProps,
260
- ): ITextNode {
261
- const node = driver.createTextNode(properties);
262
- const div = this.createDiv(node, properties);
252
+ createTextNode(node: CoreNode): CoreTextNode {
253
+ const div = this.createDiv(node.id, node.props);
263
254
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
264
255
  (div as any).node = node;
265
256
 
266
257
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
267
258
  (node as any).div = div;
268
- return this.createProxy(node, div) as ITextNode;
259
+ return this.createProxy(node, div) as CoreTextNode;
269
260
  }
270
261
 
271
- createProxy(node: INode | ITextNode, div: HTMLElement): INode | ITextNode {
262
+ createProxy(
263
+ node: CoreNode | CoreTextNode,
264
+ div: HTMLElement,
265
+ ): CoreNode | CoreTextNode {
272
266
  return new Proxy(node, {
273
- set: (target, property: keyof INodeWritableProps, value) => {
267
+ set: (target, property: keyof CoreNodeProps, value) => {
274
268
  this.updateNodeProperty(div, property, value);
275
269
  return Reflect.set(target, property, value);
276
270
  },
277
- get: (target, property: keyof INode, receiver: any): any => {
271
+ get: (target, property: keyof CoreNode, receiver: any): any => {
278
272
  if (property === 'destroy') {
279
- this.destroyNode(target);
273
+ this.destroyNode(target.id);
280
274
  }
281
275
 
282
276
  if (property === 'animate') {
283
- return (props: INodeAnimatableProps, settings: AnimationSettings) => {
277
+ return (props: CoreNodeAnimateProps, settings: AnimationSettings) => {
284
278
  const anim = target.animate(props, settings);
285
279
 
286
280
  // Trap the animate start function so we can update the inspector accordingly
287
281
  return new Proxy(anim, {
288
282
  get: (target, property: keyof IAnimationController, receiver) => {
289
283
  if (property === 'start') {
290
- this.animateNode(div, node, props, settings);
284
+ this.animateNode(div, props, settings);
291
285
  }
292
286
 
293
287
  return Reflect.get(target, property, receiver);
@@ -301,14 +295,14 @@ export class Inspector {
301
295
  });
302
296
  }
303
297
 
304
- destroyNode(node: INode | ITextNode) {
305
- const div = document.getElementById(node.id.toString());
298
+ destroyNode(id: number) {
299
+ const div = document.getElementById(id.toString());
306
300
  div?.remove();
307
301
  }
308
302
 
309
303
  updateNodeProperty(
310
304
  div: HTMLElement,
311
- property: keyof INodeWritableProps | keyof ITextNodeWritableProps,
305
+ property: keyof CoreNodeProps | keyof CoreTextNodeProps,
312
306
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
313
307
  value: any,
314
308
  ) {
@@ -320,7 +314,7 @@ export class Inspector {
320
314
  * Special case for parent property
321
315
  */
322
316
  if (property === 'parent') {
323
- const parentId: number = (value as INode).id;
317
+ const parentId: number = value.id;
324
318
 
325
319
  // only way to detect if the parent is the root node
326
320
  // if you are reading this and have a better way, please let me know
@@ -385,7 +379,12 @@ export class Inspector {
385
379
 
386
380
  // DOM properties
387
381
  if (domPropertyMap[property]) {
388
- div.setAttribute(String(stylePropertyMap[property]), String(value));
382
+ const domProperty = domPropertyMap[property];
383
+ if (!domProperty) {
384
+ return;
385
+ }
386
+
387
+ div.setAttribute(String(domProperty), String(value));
389
388
  return;
390
389
  }
391
390
 
@@ -407,8 +406,7 @@ export class Inspector {
407
406
  // simple animation handler
408
407
  animateNode(
409
408
  div: HTMLElement,
410
- node: INode,
411
- props: INodeAnimatableProps,
409
+ props: CoreNodeAnimateProps,
412
410
  settings: AnimationSettings,
413
411
  ) {
414
412
  const {
@@ -0,0 +1,543 @@
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 {
23
+ ExtractProps,
24
+ TextureTypeMap,
25
+ TextureMap,
26
+ } from '../core/CoreTextureManager.js';
27
+ import { EventEmitter } from '../common/EventEmitter.js';
28
+ import { Inspector } from './Inspector.js';
29
+ import { assertTruthy, isProductionEnvironment } from '../utils.js';
30
+ import { Stage } from '../core/Stage.js';
31
+ import { CoreNode, type CoreNodeProps } from '../core/CoreNode.js';
32
+ import { CoreTextNode, type CoreTextNodeProps } from '../core/CoreTextNode.js';
33
+ import type {
34
+ BaseShaderController,
35
+ ShaderController,
36
+ } from './ShaderController.js';
37
+ import type { INode, INodeProps, ITextNode, ITextNodeProps } from './INode.js';
38
+ import type {
39
+ DynamicEffects,
40
+ DynamicShaderController,
41
+ } from './DynamicShaderController.js';
42
+ import type {
43
+ EffectDesc,
44
+ EffectDescUnion,
45
+ } from '../core/renderers/webgl/shaders/DynamicShader.js';
46
+ import type { TextureMemoryManagerSettings } from '../core/TextureMemoryManager.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
+ * Enable inspector
189
+ *
190
+ * @remarks
191
+ * When enabled the renderer will spawn a inspector. The inspector will
192
+ * replicate the state of the Nodes created in the renderer and allow
193
+ * inspection of the state of the nodes.
194
+ *
195
+ * @defaultValue `false` (disabled)
196
+ */
197
+ enableInspector?: boolean;
198
+
199
+ /**
200
+ * Renderer mode
201
+ */
202
+ renderMode?: 'webgl' | 'canvas';
203
+ }
204
+
205
+ /**
206
+ * The Renderer Main API
207
+ *
208
+ * @remarks
209
+ * This is the primary class used to configure and operate the Renderer.
210
+ *
211
+ * It is used to create and destroy Nodes, as well as Texture and Shader
212
+ * references.
213
+ *
214
+ * Example:
215
+ * ```ts
216
+ * import { RendererMain, MainCoreDriver } from '@lightningjs/renderer';
217
+ *
218
+ * // Initialize the Renderer
219
+ * const renderer = new RendererMain(
220
+ * {
221
+ * appWidth: 1920,
222
+ * appHeight: 1080
223
+ * },
224
+ * 'app',
225
+ * new MainCoreDriver(),
226
+ * );
227
+ * ```
228
+ *
229
+ * ## Events
230
+ * - `fpsUpdate`
231
+ * - Emitted every `fpsUpdateInterval` milliseconds with the current FPS
232
+ * - `frameTick`
233
+ * - Emitted every frame tick
234
+ * - `idle`
235
+ * - Emitted when the renderer is idle (no changes to the scene
236
+ * graph/animations running)
237
+ * - `criticalCleanup`
238
+ * - Emitted when the Texture Memory Manager Cleanup process is triggered
239
+ * - Payload: { memUsed: number, criticalThreshold: number }
240
+ * - `memUsed` - The amount of memory (in bytes) used by textures before the
241
+ * cleanup process
242
+ * - `criticalThreshold` - The critical threshold (in bytes)
243
+ * - `criticalCleanupFailed`
244
+ * - Emitted when the Texture Memory Manager Cleanup process is unable to free
245
+ * up enough texture memory to reach below the critical threshold.
246
+ * This can happen when there is not enough non-renderable textures to
247
+ * free up.
248
+ * - Payload (object with keys):
249
+ * - `memUsed` - The amount of memory (in bytes) used by textures after
250
+ * the cleanup process
251
+ * - `criticalThreshold` - The critical threshold (in bytes)
252
+ */
253
+ export class RendererMain extends EventEmitter {
254
+ readonly root: INode<ShaderController<'DefaultShader'>>;
255
+ readonly canvas: HTMLCanvasElement;
256
+ readonly settings: Readonly<Required<RendererMainSettings>>;
257
+ readonly stage: Stage;
258
+ private inspector: Inspector | null = null;
259
+
260
+ /**
261
+ * Constructs a new Renderer instance
262
+ *
263
+ * @param settings Renderer settings
264
+ * @param target Element ID or HTMLElement to insert the canvas into
265
+ * @param driver Core Driver to use
266
+ */
267
+ constructor(settings: RendererMainSettings, target: string | HTMLElement) {
268
+ super();
269
+ const resolvedTxSettings: TextureMemoryManagerSettings = {
270
+ criticalThreshold: settings.textureMemory?.criticalThreshold || 124e6,
271
+ targetThresholdLevel: settings.textureMemory?.targetThresholdLevel || 0.5,
272
+ cleanupInterval: settings.textureMemory?.cleanupInterval || 30000,
273
+ debugLogging: settings.textureMemory?.debugLogging || false,
274
+ };
275
+ const resolvedSettings: Required<RendererMainSettings> = {
276
+ appWidth: settings.appWidth || 1920,
277
+ appHeight: settings.appHeight || 1080,
278
+ textureMemory: resolvedTxSettings,
279
+ boundsMargin: settings.boundsMargin || 0,
280
+ deviceLogicalPixelRatio: settings.deviceLogicalPixelRatio || 1,
281
+ devicePhysicalPixelRatio:
282
+ settings.devicePhysicalPixelRatio || window.devicePixelRatio,
283
+ clearColor: settings.clearColor ?? 0x00000000,
284
+ fpsUpdateInterval: settings.fpsUpdateInterval || 0,
285
+ numImageWorkers:
286
+ settings.numImageWorkers !== undefined ? settings.numImageWorkers : 2,
287
+ enableContextSpy: settings.enableContextSpy ?? false,
288
+ enableInspector: settings.enableInspector ?? false,
289
+ renderMode: settings.renderMode ?? 'webgl',
290
+ };
291
+ this.settings = resolvedSettings;
292
+
293
+ const {
294
+ appWidth,
295
+ appHeight,
296
+ deviceLogicalPixelRatio,
297
+ devicePhysicalPixelRatio,
298
+ enableInspector,
299
+ } = resolvedSettings;
300
+
301
+ const deviceLogicalWidth = appWidth * deviceLogicalPixelRatio;
302
+ const deviceLogicalHeight = appHeight * deviceLogicalPixelRatio;
303
+
304
+ const canvas = document.createElement('canvas');
305
+ this.canvas = canvas;
306
+ canvas.width = deviceLogicalWidth * devicePhysicalPixelRatio;
307
+ canvas.height = deviceLogicalHeight * devicePhysicalPixelRatio;
308
+
309
+ canvas.style.width = `${deviceLogicalWidth}px`;
310
+ canvas.style.height = `${deviceLogicalHeight}px`;
311
+
312
+ // Initialize the stage
313
+ this.stage = new Stage({
314
+ appWidth: this.settings.appWidth,
315
+ appHeight: this.settings.appHeight,
316
+ boundsMargin: this.settings.boundsMargin,
317
+ clearColor: this.settings.clearColor,
318
+ canvas: this.canvas,
319
+ deviceLogicalPixelRatio: this.settings.deviceLogicalPixelRatio,
320
+ devicePhysicalPixelRatio: this.settings.devicePhysicalPixelRatio,
321
+ enableContextSpy: this.settings.enableContextSpy,
322
+ fpsUpdateInterval: this.settings.fpsUpdateInterval,
323
+ numImageWorkers: this.settings.numImageWorkers,
324
+ renderMode: this.settings.renderMode,
325
+ textureMemory: resolvedTxSettings,
326
+ eventBus: this,
327
+ });
328
+
329
+ // Extract the root node
330
+ this.root = this.stage.root as unknown as INode<
331
+ ShaderController<'DefaultShader'>
332
+ >;
333
+
334
+ // Get the target element and attach the canvas to it
335
+ let targetEl: HTMLElement | null;
336
+ if (typeof target === 'string') {
337
+ targetEl = document.getElementById(target);
338
+ } else {
339
+ targetEl = target;
340
+ }
341
+
342
+ if (!targetEl) {
343
+ throw new Error('Could not find target element');
344
+ }
345
+
346
+ targetEl.appendChild(canvas);
347
+
348
+ // Initialize inspector (if enabled)
349
+ if (enableInspector && !isProductionEnvironment()) {
350
+ this.inspector = new Inspector(canvas, resolvedSettings);
351
+ }
352
+ }
353
+
354
+ /**
355
+ * Create a new scene graph node
356
+ *
357
+ * @remarks
358
+ * A node is the main graphical building block of the Renderer scene graph. It
359
+ * can be a container for other nodes, or it can be a leaf node that renders a
360
+ * solid color, gradient, image, or specific texture, using a specific shader.
361
+ *
362
+ * To create a text node, see {@link createTextNode}.
363
+ *
364
+ * See {@link CoreNode} for more details.
365
+ *
366
+ * @param props
367
+ * @returns
368
+ */
369
+ createNode<
370
+ ShCtr extends BaseShaderController = ShaderController<'DefaultShader'>,
371
+ >(props: Partial<INodeProps<ShCtr>>): INode<ShCtr> {
372
+ assertTruthy(this.stage, 'Stage is not initialized');
373
+
374
+ const node = this.stage.createNode(props as Partial<CoreNodeProps>);
375
+
376
+ if (this.inspector) {
377
+ return this.inspector.createNode(node) as unknown as INode<ShCtr>;
378
+ }
379
+
380
+ // FIXME onDestroy event? node.once('beforeDestroy'
381
+ // FIXME onCreate event?
382
+ return node as unknown as INode<ShCtr>;
383
+ }
384
+
385
+ /**
386
+ * Create a new scene graph text node
387
+ *
388
+ * @remarks
389
+ * A text node is the second graphical building block of the Renderer scene
390
+ * graph. It renders text using a specific text renderer that is automatically
391
+ * chosen based on the font requested and what type of fonts are installed
392
+ * into an app.
393
+ *
394
+ * See {@link ITextNode} for more details.
395
+ *
396
+ * @param props
397
+ * @returns
398
+ */
399
+ createTextNode(props: Partial<ITextNodeProps>): ITextNode {
400
+ const textNode = this.stage.createTextNode(props as CoreTextNodeProps);
401
+
402
+ if (this.inspector) {
403
+ return this.inspector.createTextNode(textNode);
404
+ }
405
+
406
+ return textNode as unknown as ITextNode;
407
+ }
408
+
409
+ /**
410
+ * Destroy a node
411
+ *
412
+ * @remarks
413
+ * This method destroys a node
414
+ *
415
+ * @param node
416
+ * @returns
417
+ */
418
+ destroyNode(node: INode) {
419
+ if (this.inspector) {
420
+ this.inspector.destroyNode(node.id);
421
+ }
422
+
423
+ return node.destroy();
424
+ }
425
+
426
+ /**
427
+ * Create a new texture reference
428
+ *
429
+ * @remarks
430
+ * This method creates a new reference to a texture. The texture is not
431
+ * loaded until it is used on a node.
432
+ *
433
+ * It can be assigned to a node's `texture` property, or it can be used
434
+ * when creating a SubTexture.
435
+ *
436
+ * @param textureType
437
+ * @param props
438
+ * @param options
439
+ * @returns
440
+ */
441
+ createTexture<TxType extends keyof TextureTypeMap>(
442
+ textureType: TxType,
443
+ props: ExtractProps<TextureTypeMap[TxType]>,
444
+ ): TextureMap[TxType] {
445
+ return this.stage.txManager.loadTexture(
446
+ textureType,
447
+ props,
448
+ ) as TextureMap[TxType];
449
+ }
450
+
451
+ /**
452
+ * Create a new shader controller for a shader type
453
+ *
454
+ * @remarks
455
+ * This method creates a new Shader Controller for a specific shader type.
456
+ *
457
+ * If the shader has not been loaded yet, it will be loaded. Otherwise, the
458
+ * existing shader will be reused.
459
+ *
460
+ * It can be assigned to a Node's `shader` property.
461
+ *
462
+ * @param shaderType
463
+ * @param props
464
+ * @returns
465
+ */
466
+ createShader<ShType extends keyof ShaderMap>(
467
+ shaderType: ShType,
468
+ props?: ExtractProps<ShaderMap[ShType]>,
469
+ ): ShaderController<ShType> {
470
+ return this.stage.shManager.loadShader(shaderType, props);
471
+ }
472
+
473
+ createDynamicShader<
474
+ T extends DynamicEffects<[...{ name: string; type: keyof EffectMap }[]]>,
475
+ >(effects: [...T]): DynamicShaderController<T> {
476
+ return this.stage.shManager.loadDynamicShader({
477
+ effects: effects as EffectDescUnion[],
478
+ });
479
+ }
480
+
481
+ createEffect<Name extends string, Type extends keyof EffectMap>(
482
+ name: Name,
483
+ type: Type,
484
+ props: EffectDesc<{ name: Name; type: Type }>['props'],
485
+ ): EffectDesc<{ name: Name; type: Type }> {
486
+ return {
487
+ name,
488
+ type,
489
+ props,
490
+ };
491
+ }
492
+
493
+ /**
494
+ * Get a Node by its ID
495
+ *
496
+ * @param id
497
+ * @returns
498
+ */
499
+ getNodeById(id: number): CoreNode | null {
500
+ const root = this.stage?.root;
501
+ if (!root) {
502
+ return null;
503
+ }
504
+
505
+ const findNode = (node: CoreNode): CoreNode | null => {
506
+ if (node.id === id) {
507
+ return node;
508
+ }
509
+
510
+ for (const child of node.children) {
511
+ const found = findNode(child);
512
+ if (found) {
513
+ return found;
514
+ }
515
+ }
516
+
517
+ return null;
518
+ };
519
+
520
+ return findNode(root);
521
+ }
522
+
523
+ toggleFreeze() {
524
+ throw new Error('Not implemented');
525
+ }
526
+
527
+ advanceFrame() {
528
+ throw new Error('Not implemented');
529
+ }
530
+
531
+ /**
532
+ * Re-render the current frame without advancing any running animations.
533
+ *
534
+ * @remarks
535
+ * Any state changes will be reflected in the re-rendered frame. Useful for
536
+ * debugging.
537
+ *
538
+ * May not do anything if the render loop is running on a separate worker.
539
+ */
540
+ rerender() {
541
+ throw new Error('Not implemented');
542
+ }
543
+ }