@lightningjs/renderer 0.9.4 → 1.0.0-rc.1

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 (289) hide show
  1. package/README.md +0 -82
  2. package/dist/exports/index.d.ts +42 -3
  3. package/dist/exports/index.js +37 -3
  4. package/dist/exports/index.js.map +1 -1
  5. package/dist/src/core/CoreNode.d.ts +461 -46
  6. package/dist/src/core/CoreNode.js +170 -104
  7. package/dist/src/core/CoreNode.js.map +1 -1
  8. package/dist/src/core/CoreShaderManager.d.ts +16 -6
  9. package/dist/src/core/CoreShaderManager.js +20 -20
  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 +137 -43
  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.js.map +1 -1
  29. package/dist/src/core/platform.js +7 -1
  30. package/dist/src/core/platform.js.map +1 -1
  31. package/dist/src/core/renderers/CoreContextTexture.d.ts +3 -2
  32. package/dist/src/core/renderers/CoreContextTexture.js +7 -1
  33. package/dist/src/core/renderers/CoreContextTexture.js.map +1 -1
  34. package/dist/src/core/renderers/CoreRenderer.d.ts +5 -1
  35. package/dist/src/core/renderers/CoreRenderer.js +0 -1
  36. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  37. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +3 -0
  38. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +16 -1
  39. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -1
  40. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +0 -1
  41. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +2 -5
  42. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -1
  43. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +2 -2
  44. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +1 -1
  45. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +0 -1
  46. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +7 -10
  47. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  48. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +3 -0
  49. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +47 -9
  50. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  51. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +2 -43
  52. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +70 -37
  53. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
  54. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +2 -2
  55. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +1 -1
  56. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +2 -2
  57. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +1 -1
  58. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +2 -2
  59. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +1 -1
  60. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +2 -2
  61. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +1 -1
  62. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +2 -2
  63. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +1 -1
  64. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.d.ts +8 -0
  65. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +103 -0
  66. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +1 -1
  67. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +3 -18
  68. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +1 -1
  69. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +5 -2
  70. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +1 -1
  71. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +4 -36
  72. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js.map +1 -1
  73. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +3 -2
  74. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
  75. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +4 -2
  76. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -1
  77. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +2 -1
  78. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js.map +1 -1
  79. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +4 -36
  80. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +1 -1
  81. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.d.ts +69 -0
  82. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +1 -1
  83. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +5 -2
  84. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
  85. package/dist/src/core/text-rendering/font-face-types/TrFontFace.d.ts +0 -1
  86. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +0 -1
  87. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +1 -1
  88. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +0 -1
  89. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +1 -1
  90. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +10 -26
  91. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +116 -365
  92. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  93. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +0 -1
  94. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +0 -2
  95. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
  96. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +2 -2
  97. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  98. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +2 -0
  99. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
  100. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +3 -2
  101. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  102. package/dist/src/core/textures/ColorTexture.d.ts +1 -1
  103. package/dist/src/core/textures/ColorTexture.js +1 -1
  104. package/dist/src/core/textures/ImageTexture.d.ts +1 -1
  105. package/dist/src/core/textures/NoiseTexture.d.ts +1 -1
  106. package/dist/src/core/textures/NoiseTexture.js +3 -0
  107. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  108. package/dist/src/core/textures/SubTexture.d.ts +2 -2
  109. package/dist/src/core/textures/SubTexture.js +5 -1
  110. package/dist/src/core/textures/SubTexture.js.map +1 -1
  111. package/dist/src/core/textures/Texture.d.ts +23 -2
  112. package/dist/src/core/textures/Texture.js +32 -3
  113. package/dist/src/core/textures/Texture.js.map +1 -1
  114. package/dist/src/core/utils.d.ts +7 -0
  115. package/dist/src/core/utils.js +12 -10
  116. package/dist/src/core/utils.js.map +1 -1
  117. package/dist/src/main-api/DynamicShaderController.d.ts +9 -14
  118. package/dist/src/main-api/DynamicShaderController.js +21 -17
  119. package/dist/src/main-api/DynamicShaderController.js.map +1 -1
  120. package/dist/src/main-api/INode.d.ts +43 -463
  121. package/dist/src/main-api/INode.js +1 -19
  122. package/dist/src/main-api/INode.js.map +1 -1
  123. package/dist/src/main-api/Inspector.d.ts +10 -10
  124. package/dist/src/main-api/Inspector.js +18 -15
  125. package/dist/src/main-api/Inspector.js.map +1 -1
  126. package/dist/src/main-api/Renderer.d.ts +71 -25
  127. package/dist/src/main-api/Renderer.js +80 -109
  128. package/dist/src/main-api/Renderer.js.map +1 -1
  129. package/dist/src/main-api/ShaderController.d.ts +3 -8
  130. package/dist/src/main-api/ShaderController.js +8 -3
  131. package/dist/src/main-api/ShaderController.js.map +1 -1
  132. package/dist/src/utils.d.ts +1 -0
  133. package/dist/src/utils.js +7 -0
  134. package/dist/src/utils.js.map +1 -1
  135. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  136. package/exports/index.ts +62 -3
  137. package/package.json +8 -7
  138. package/src/core/CoreNode.test.ts +93 -0
  139. package/src/core/CoreNode.ts +675 -188
  140. package/src/core/CoreShaderManager.ts +56 -29
  141. package/src/core/CoreTextNode.ts +41 -9
  142. package/src/core/CoreTextureManager.ts +55 -175
  143. package/src/core/Stage.ts +199 -43
  144. package/src/core/TextureMemoryManager.ts +231 -22
  145. package/src/core/animations/CoreAnimation.ts +194 -67
  146. package/src/core/lib/ImageWorker.ts +79 -52
  147. package/src/core/lib/utils.ts +1 -0
  148. package/src/core/platform.ts +8 -1
  149. package/src/core/renderers/CoreContextTexture.ts +9 -2
  150. package/src/core/renderers/CoreRenderer.ts +5 -2
  151. package/src/core/renderers/canvas/CanvasCoreRenderer.ts +20 -1
  152. package/src/core/renderers/canvas/CanvasCoreTexture.ts +2 -6
  153. package/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.ts +2 -2
  154. package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +7 -11
  155. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +51 -9
  156. package/src/core/renderers/webgl/shaders/DynamicShader.ts +94 -92
  157. package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +2 -2
  158. package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +2 -2
  159. package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +2 -2
  160. package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +2 -2
  161. package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +2 -2
  162. package/src/core/renderers/webgl/shaders/effects/EffectUtils.ts +129 -3
  163. package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +7 -15
  164. package/src/core/renderers/webgl/shaders/effects/GlitchEffect.ts +5 -2
  165. package/src/core/renderers/webgl/shaders/effects/HolePunchEffect.ts +6 -15
  166. package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +6 -2
  167. package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +10 -2
  168. package/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.ts +2 -1
  169. package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +6 -15
  170. package/src/core/renderers/webgl/shaders/effects/ShaderEffect.ts +80 -0
  171. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +14 -15
  172. package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -2
  173. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -1
  174. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +139 -447
  175. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -3
  176. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +2 -2
  177. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +4 -2
  178. package/src/core/text-rendering/renderers/TextRenderer.ts +3 -2
  179. package/src/core/textures/ColorTexture.ts +1 -1
  180. package/src/core/textures/ImageTexture.ts +1 -1
  181. package/src/core/textures/NoiseTexture.ts +4 -1
  182. package/src/core/textures/SubTexture.ts +7 -7
  183. package/src/core/textures/Texture.ts +46 -3
  184. package/src/core/utils.ts +12 -11
  185. package/src/main-api/DynamicShaderController.ts +104 -0
  186. package/src/main-api/INode.ts +57 -479
  187. package/src/main-api/Inspector.ts +37 -39
  188. package/src/main-api/Renderer.ts +586 -0
  189. package/src/main-api/ShaderController.ts +81 -0
  190. package/src/main-api/utils.ts +45 -0
  191. package/src/utils.ts +8 -0
  192. package/dist/exports/core-api.d.ts +0 -74
  193. package/dist/exports/core-api.js +0 -96
  194. package/dist/exports/core-api.js.map +0 -1
  195. package/dist/exports/main-api.d.ts +0 -30
  196. package/dist/exports/main-api.js +0 -45
  197. package/dist/exports/main-api.js.map +0 -1
  198. package/dist/src/core/CoreExtension.d.ts +0 -12
  199. package/dist/src/core/CoreExtension.js +0 -29
  200. package/dist/src/core/CoreExtension.js.map +0 -1
  201. package/dist/src/core/renderers/SpecificNode.d.ts +0 -1
  202. package/dist/src/core/renderers/SpecificNode.js +0 -19
  203. package/dist/src/core/renderers/SpecificNode.js.map +0 -1
  204. package/dist/src/core/renderers/webgl/newShader/effectsMock.d.ts +0 -13
  205. package/dist/src/core/renderers/webgl/newShader/effectsMock.js +0 -62
  206. package/dist/src/core/renderers/webgl/newShader/effectsMock.js.map +0 -1
  207. package/dist/src/main-api/ICoreDriver.d.ts +0 -24
  208. package/dist/src/main-api/ICoreDriver.js +0 -20
  209. package/dist/src/main-api/ICoreDriver.js.map +0 -1
  210. package/dist/src/main-api/RendererMain.d.ts +0 -378
  211. package/dist/src/main-api/RendererMain.js +0 -367
  212. package/dist/src/main-api/RendererMain.js.map +0 -1
  213. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.d.ts +0 -9
  214. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js +0 -38
  215. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js.map +0 -1
  216. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.d.ts +0 -56
  217. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js +0 -101
  218. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js.map +0 -1
  219. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.d.ts +0 -32
  220. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js +0 -28
  221. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js.map +0 -1
  222. package/dist/src/render-drivers/main/MainCoreDriver.d.ts +0 -21
  223. package/dist/src/render-drivers/main/MainCoreDriver.js +0 -115
  224. package/dist/src/render-drivers/main/MainCoreDriver.js.map +0 -1
  225. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +0 -101
  226. package/dist/src/render-drivers/main/MainOnlyNode.js +0 -425
  227. package/dist/src/render-drivers/main/MainOnlyNode.js.map +0 -1
  228. package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +0 -47
  229. package/dist/src/render-drivers/main/MainOnlyTextNode.js +0 -204
  230. package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +0 -1
  231. package/dist/src/render-drivers/threadx/NodeStruct.d.ts +0 -93
  232. package/dist/src/render-drivers/threadx/NodeStruct.js +0 -290
  233. package/dist/src/render-drivers/threadx/NodeStruct.js.map +0 -1
  234. package/dist/src/render-drivers/threadx/SharedNode.d.ts +0 -40
  235. package/dist/src/render-drivers/threadx/SharedNode.js +0 -61
  236. package/dist/src/render-drivers/threadx/SharedNode.js.map +0 -1
  237. package/dist/src/render-drivers/threadx/TextNodeStruct.d.ts +0 -44
  238. package/dist/src/render-drivers/threadx/TextNodeStruct.js +0 -203
  239. package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +0 -1
  240. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +0 -25
  241. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +0 -232
  242. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +0 -1
  243. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.d.ts +0 -24
  244. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js +0 -113
  245. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js.map +0 -1
  246. package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +0 -46
  247. package/dist/src/render-drivers/threadx/ThreadXMainNode.js +0 -160
  248. package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +0 -1
  249. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.d.ts +0 -28
  250. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +0 -55
  251. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +0 -1
  252. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +0 -70
  253. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js +0 -32
  254. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +0 -1
  255. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.d.ts +0 -19
  256. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +0 -184
  257. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +0 -1
  258. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.d.ts +0 -27
  259. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +0 -109
  260. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +0 -1
  261. package/dist/src/render-drivers/threadx/worker/renderer.d.ts +0 -1
  262. package/dist/src/render-drivers/threadx/worker/renderer.js +0 -147
  263. package/dist/src/render-drivers/threadx/worker/renderer.js.map +0 -1
  264. package/dist/src/render-drivers/utils.d.ts +0 -12
  265. package/dist/src/render-drivers/utils.js +0 -74
  266. package/dist/src/render-drivers/utils.js.map +0 -1
  267. package/exports/core-api.ts +0 -102
  268. package/exports/main-api.ts +0 -62
  269. package/src/core/CoreExtension.ts +0 -32
  270. package/src/main-api/ICoreDriver.ts +0 -68
  271. package/src/main-api/RendererMain.ts +0 -685
  272. package/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.ts +0 -45
  273. package/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.ts +0 -154
  274. package/src/main-api/texture-usage-trackers/TextureUsageTracker.ts +0 -54
  275. package/src/render-drivers/main/MainCoreDriver.ts +0 -159
  276. package/src/render-drivers/main/MainOnlyNode.ts +0 -553
  277. package/src/render-drivers/main/MainOnlyTextNode.ts +0 -261
  278. package/src/render-drivers/threadx/NodeStruct.ts +0 -320
  279. package/src/render-drivers/threadx/SharedNode.ts +0 -101
  280. package/src/render-drivers/threadx/TextNodeStruct.ts +0 -213
  281. package/src/render-drivers/threadx/ThreadXCoreDriver.ts +0 -291
  282. package/src/render-drivers/threadx/ThreadXMainAnimationController.ts +0 -135
  283. package/src/render-drivers/threadx/ThreadXMainNode.ts +0 -201
  284. package/src/render-drivers/threadx/ThreadXMainTextNode.ts +0 -85
  285. package/src/render-drivers/threadx/ThreadXRendererMessage.ts +0 -112
  286. package/src/render-drivers/threadx/worker/ThreadXRendererNode.ts +0 -253
  287. package/src/render-drivers/threadx/worker/ThreadXRendererTextNode.ts +0 -151
  288. package/src/render-drivers/threadx/worker/renderer.ts +0 -156
  289. package/src/render-drivers/utils.ts +0 -102
@@ -1,685 +0,0 @@
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 { ShaderMap } from '../core/CoreShaderManager.js';
22
- import type {
23
- ExtractProps,
24
- TextureMap,
25
- TextureOptions,
26
- } from '../core/CoreTextureManager.js';
27
- import type {
28
- INode,
29
- INodeWritableProps,
30
- ITextNode,
31
- ITextNodeWritableProps,
32
- } from './INode.js';
33
- import type { ICoreDriver } from './ICoreDriver.js';
34
- import {
35
- ManualCountTextureUsageTracker,
36
- type ManualCountTextureUsageTrackerOptions,
37
- } from './texture-usage-trackers/ManualCountTextureUsageTracker.js';
38
- import { FinalizationRegistryTextureUsageTracker } from './texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js';
39
- import type { TextureUsageTracker } from './texture-usage-trackers/TextureUsageTracker.js';
40
- import { EventEmitter } from '../common/EventEmitter.js';
41
- import { Inspector } from './Inspector.js';
42
- import { santizeCustomDataMap } from '../render-drivers/utils.js';
43
- import { isProductionEnvironment } from '../utils.js';
44
- import type { StageOptions } from '../core/Stage.js';
45
-
46
- /**
47
- * An immutable reference to a specific Texture type
48
- *
49
- * @remarks
50
- * See {@link TextureRef} for more details.
51
- */
52
- export interface SpecificTextureRef<TxType extends keyof TextureMap> {
53
- readonly descType: 'texture';
54
- readonly txType: TxType;
55
- readonly props: ExtractProps<TextureMap[TxType]>;
56
- readonly options?: Readonly<TextureOptions>;
57
- }
58
-
59
- type MapTextureRefs<TxType extends keyof TextureMap> =
60
- TxType extends keyof TextureMap ? SpecificTextureRef<TxType> : never;
61
-
62
- /**
63
- * An immutable reference to a Texture
64
- *
65
- * @remarks
66
- * This structure should only be created by the RendererMain's `createTexture`
67
- * method. The structure is immutable and should not be modified once created.
68
- *
69
- * A `TextureRef` exists in the Main API Space and is used to point to an actual
70
- * `Texture` instance in the Core API Space. The `TextureRef` is used to
71
- * communicate with the Core API Space to create, load, and destroy the
72
- * `Texture` instance.
73
- *
74
- * This type is technically a discriminated union of all possible texture types.
75
- * If you'd like to represent a specific texture type, you can use the
76
- * `SpecificTextureRef` generic type.
77
- */
78
- export type TextureRef = MapTextureRefs<keyof TextureMap>;
79
-
80
- /**
81
- * An immutable reference to a specific Shader type
82
- *
83
- * @remarks
84
- * See {@link ShaderRef} for more details.
85
- */
86
- export interface SpecificShaderRef<ShType extends keyof ShaderMap> {
87
- readonly descType: 'shader';
88
- readonly shType: ShType;
89
- readonly props: ExtractProps<ShaderMap[ShType]>;
90
- }
91
-
92
- type MapShaderRefs<ShType extends keyof ShaderMap> =
93
- ShType extends keyof ShaderMap ? SpecificShaderRef<ShType> : never;
94
-
95
- /**
96
- * An immutable reference to a Shader
97
- *
98
- * @remarks
99
- * This structure should only be created by the RendererMain's `createShader`
100
- * method. The structure is immutable and should not be modified once created.
101
- *
102
- * A `ShaderRef` exists in the Main API Space and is used to point to an actual
103
- * `Shader` instance in the Core API Space. The `ShaderRef` is used to
104
- * communicate with the Core API Space to create, load, and destroy the
105
- * `Shader` instance.
106
- *
107
- * This type is technically a discriminated union of all possible shader types.
108
- * If you'd like to represent a specific shader type, you can use the
109
- * `SpecificShaderRef` generic type.
110
- */
111
- export type ShaderRef = MapShaderRefs<keyof ShaderMap>;
112
-
113
- /**
114
- * Configuration settings for {@link RendererMain}
115
- */
116
- export interface RendererMainSettings {
117
- /**
118
- * Authored logical pixel width of the application
119
- *
120
- * @defaultValue `1920`
121
- */
122
- appWidth?: number;
123
-
124
- /**
125
- * Authored logical pixel height of the application
126
- *
127
- * @defaultValue `1080`
128
- */
129
- appHeight?: number;
130
-
131
- /**
132
- * Texture Memory Byte Threshold
133
- *
134
- * @remarks
135
- * When the amount of GPU VRAM used by textures exceeds this threshold,
136
- * the Renderer will free up all the textures that are current not visible
137
- * within the configured `boundsMargin`.
138
- *
139
- * When set to `0`, the threshold-based texture memory manager is disabled.
140
- */
141
- txMemByteThreshold?: number;
142
-
143
- /**
144
- * Bounds margin to extend the boundary in which a CoreNode is added as Quad.
145
- */
146
- boundsMargin?: number | [number, number, number, number];
147
-
148
- /**
149
- * Factor to convert app-authored logical coorindates to device logical coordinates
150
- *
151
- * @remarks
152
- * This value allows auto-scaling to support larger/small resolutions than the
153
- * app was authored for.
154
- *
155
- * If the app was authored for 1920x1080 and this value is 2, the app's canvas
156
- * will be rendered at 3840x2160 logical pixels.
157
- *
158
- * Likewise, if the app was authored for 1920x1080 and this value is 0.66667,
159
- * the app's canvas will be rendered at 1280x720 logical pixels.
160
- *
161
- * @defaultValue `1`
162
- */
163
- deviceLogicalPixelRatio?: number;
164
-
165
- /**
166
- * Factor to convert device logical coordinates to device physical coordinates
167
- *
168
- * @remarks
169
- * This value allows auto-scaling to support devices with different pixel densities.
170
- *
171
- * This controls the number of physical pixels that are used to render each logical
172
- * pixel. For example, if the device has a pixel density of 2, each logical pixel
173
- * will be rendered using 2x2 physical pixels.
174
- *
175
- * By default, it will be set to `window.devicePixelRatio` which is the pixel
176
- * density of the device the app is running on reported by the browser.
177
- *
178
- * @defaultValue `window.devicePixelRatio`
179
- */
180
- devicePhysicalPixelRatio?: number;
181
-
182
- /**
183
- * RGBA encoded number of the background to use
184
- *
185
- * @defaultValue `0x00000000`
186
- */
187
- clearColor?: number;
188
-
189
- /**
190
- * Path to a custom core module to use
191
- *
192
- * @defaultValue `null`
193
- */
194
- coreExtensionModule?: string | null;
195
-
196
- /**
197
- * Enable experimental FinalizationRegistry-based texture usage tracking
198
- * for texture garbage collection
199
- *
200
- * @remarks
201
- * By default, the Renderer uses a manual reference counting system to track
202
- * texture usage. Textures are eventually released from the Core Texture
203
- * Manager's Usage Cache when they are no longer referenced by any Nodes (or
204
- * SubTextures that are referenced by nodes). This works well enough, but has
205
- * the consequence of textures being removed from Usage Cache even if their
206
- * references are still alive in memory. This can require a texture to be
207
- * reloaded from the source when it is used again after being removed from
208
- * cache.
209
- *
210
- * This is an experimental feature that uses a FinalizationRegistry to track
211
- * texture usage. This causes textures to be removed from the Usage Cache only
212
- * when their references are no longer alive in memory. Meaning a loaded texture
213
- * will remain in the Usage Cache until it's reference is garbage collected.
214
- *
215
- * This feature is not enabled by default because browser support for the
216
- * FinalizationRegistry is limited. It should NOT be enabled in production apps
217
- * as this behavior is not guaranteed to be supported in the future. Developer
218
- * feedback on this feature, however, is welcome.
219
- *
220
- * @defaultValue `false`
221
- */
222
- experimental_FinalizationRegistryTextureUsageTracker?: boolean;
223
-
224
- textureCleanupOptions?: ManualCountTextureUsageTrackerOptions;
225
-
226
- /**
227
- * Interval in milliseconds to receive FPS updates
228
- *
229
- * @remarks
230
- * If set to `0`, FPS updates will be disabled.
231
- *
232
- * @defaultValue `0` (disabled)
233
- */
234
- fpsUpdateInterval?: number;
235
-
236
- /**
237
- * Include context call (i.e. WebGL) information in FPS updates
238
- *
239
- * @remarks
240
- * When enabled the number of calls to each context method over the
241
- * `fpsUpdateInterval` will be included in the FPS update payload's
242
- * `contextSpyData` property.
243
- *
244
- * Enabling the context spy has a serious impact on performance so only use it
245
- * when you need to extract context call information.
246
- *
247
- * @defaultValue `false` (disabled)
248
- */
249
- enableContextSpy?: boolean;
250
-
251
- /**
252
- * Number or Image Workers to use
253
- *
254
- * @remarks
255
- * On devices with multiple cores, this can be used to improve image loading
256
- * as well as reduce the impact of image loading on the main thread.
257
- * Set to 0 to disable image workers.
258
- *
259
- * @defaultValue `2`
260
- */
261
- numImageWorkers?: number;
262
-
263
- /**
264
- * Enable inspector
265
- *
266
- * @remarks
267
- * When enabled the renderer will spawn a inspector. The inspector will
268
- * replicate the state of the Nodes created in the renderer and allow
269
- * inspection of the state of the nodes.
270
- *
271
- * @defaultValue `false` (disabled)
272
- */
273
- enableInspector?: boolean;
274
-
275
- /**
276
- * Renderer mode
277
- */
278
- renderMode?: 'webgl' | 'canvas';
279
- }
280
-
281
- /**
282
- * The Renderer Main API
283
- *
284
- * @remarks
285
- * This is the primary class used to configure and operate the Renderer.
286
- *
287
- * It is used to create and destroy Nodes, as well as Texture and Shader
288
- * references.
289
- *
290
- * Example:
291
- * ```ts
292
- * import { RendererMain, MainCoreDriver } from '@lightningjs/renderer';
293
- *
294
- * // Initialize the Renderer
295
- * const renderer = new RendererMain(
296
- * {
297
- * appWidth: 1920,
298
- * appHeight: 1080
299
- * },
300
- * 'app',
301
- * new MainCoreDriver(),
302
- * );
303
- * ```
304
- */
305
- export class RendererMain extends EventEmitter {
306
- readonly root: INode | null = null;
307
- readonly driver: ICoreDriver;
308
- readonly canvas: HTMLCanvasElement;
309
- readonly settings: Readonly<Required<RendererMainSettings>>;
310
- private inspector: Inspector | null = null;
311
- private nodes: Map<number, INode> = new Map();
312
- private nextTextureId = 1;
313
-
314
- /**
315
- * Texture Usage Tracker for Usage Based Texture Garbage Collection
316
- *
317
- * @remarks
318
- * For internal use only. DO NOT ACCESS.
319
- */
320
- public textureTracker: TextureUsageTracker;
321
-
322
- /**
323
- * Constructs a new Renderer instance
324
- *
325
- * @param settings Renderer settings
326
- * @param target Element ID or HTMLElement to insert the canvas into
327
- * @param driver Core Driver to use
328
- */
329
- constructor(
330
- settings: RendererMainSettings,
331
- target: string | HTMLElement,
332
- driver: ICoreDriver,
333
- ) {
334
- super();
335
- const resolvedSettings: Required<RendererMainSettings> = {
336
- appWidth: settings.appWidth || 1920,
337
- appHeight: settings.appHeight || 1080,
338
- txMemByteThreshold: settings.txMemByteThreshold || 124e6,
339
- boundsMargin: settings.boundsMargin || 0,
340
- deviceLogicalPixelRatio: settings.deviceLogicalPixelRatio || 1,
341
- devicePhysicalPixelRatio:
342
- settings.devicePhysicalPixelRatio || window.devicePixelRatio,
343
- clearColor: settings.clearColor ?? 0x00000000,
344
- coreExtensionModule: settings.coreExtensionModule || null,
345
- experimental_FinalizationRegistryTextureUsageTracker:
346
- settings.experimental_FinalizationRegistryTextureUsageTracker ?? false,
347
- textureCleanupOptions: settings.textureCleanupOptions || {},
348
- fpsUpdateInterval: settings.fpsUpdateInterval || 0,
349
- numImageWorkers:
350
- settings.numImageWorkers !== undefined ? settings.numImageWorkers : 2,
351
- enableContextSpy: settings.enableContextSpy ?? false,
352
- enableInspector: settings.enableInspector ?? false,
353
- renderMode: settings.renderMode ?? 'webgl',
354
- };
355
- this.settings = resolvedSettings;
356
-
357
- const {
358
- appWidth,
359
- appHeight,
360
- deviceLogicalPixelRatio,
361
- devicePhysicalPixelRatio,
362
- enableInspector,
363
- } = resolvedSettings;
364
-
365
- const releaseCallback = (textureId: number) => {
366
- this.driver.releaseTexture(textureId);
367
- };
368
-
369
- const useFinalizationRegistryTracker =
370
- resolvedSettings.experimental_FinalizationRegistryTextureUsageTracker &&
371
- typeof FinalizationRegistry === 'function';
372
- this.textureTracker = useFinalizationRegistryTracker
373
- ? new FinalizationRegistryTextureUsageTracker(releaseCallback)
374
- : new ManualCountTextureUsageTracker(
375
- releaseCallback,
376
- this.settings.textureCleanupOptions,
377
- );
378
-
379
- const deviceLogicalWidth = appWidth * deviceLogicalPixelRatio;
380
- const deviceLogicalHeight = appHeight * deviceLogicalPixelRatio;
381
-
382
- this.driver = driver;
383
-
384
- const canvas = document.createElement('canvas');
385
- this.canvas = canvas;
386
- canvas.width = deviceLogicalWidth * devicePhysicalPixelRatio;
387
- canvas.height = deviceLogicalHeight * devicePhysicalPixelRatio;
388
-
389
- canvas.style.width = `${deviceLogicalWidth}px`;
390
- canvas.style.height = `${deviceLogicalHeight}px`;
391
-
392
- let targetEl: HTMLElement | null;
393
- if (typeof target === 'string') {
394
- targetEl = document.getElementById(target);
395
- } else {
396
- targetEl = target;
397
- }
398
-
399
- if (!targetEl) {
400
- throw new Error('Could not find target element');
401
- }
402
-
403
- // Hook up the driver's callbacks
404
- driver.onCreateNode = (node) => {
405
- this.nodes.set(node.id, node);
406
- };
407
-
408
- driver.onBeforeDestroyNode = (node) => {
409
- this.nodes.delete(node.id);
410
- };
411
-
412
- driver.onFpsUpdate = (fpsData) => {
413
- this.emit('fpsUpdate', fpsData);
414
- };
415
-
416
- driver.onFrameTick = (frameTickData) => {
417
- this.emit('frameTick', frameTickData);
418
- };
419
-
420
- driver.onIdle = () => {
421
- this.emit('idle');
422
- };
423
-
424
- targetEl.appendChild(canvas);
425
-
426
- if (enableInspector && !isProductionEnvironment()) {
427
- this.inspector = new Inspector(canvas, resolvedSettings);
428
- }
429
- }
430
-
431
- /**
432
- * Initialize the renderer
433
- *
434
- * @remarks
435
- * This method must be called and resolved asyncronously before any other
436
- * methods are called.
437
- */
438
- async init(): Promise<void> {
439
- await this.driver.init(this, this.settings, this.canvas);
440
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
441
- (this.root as INode) = this.driver.getRootNode();
442
- }
443
-
444
- /**
445
- * Create a new scene graph node
446
- *
447
- * @remarks
448
- * A node is the main graphical building block of the Renderer scene graph. It
449
- * can be a container for other nodes, or it can be a leaf node that renders a
450
- * solid color, gradient, image, or specific texture, using a specific shader.
451
- *
452
- * To create a text node, see {@link createTextNode}.
453
- *
454
- * See {@link INode} for more details.
455
- *
456
- * @param props
457
- * @returns
458
- */
459
- createNode(props: Partial<INodeWritableProps>): INode {
460
- if (this.inspector) {
461
- return this.inspector.createNode(
462
- this.driver,
463
- this.resolveNodeDefaults(props),
464
- );
465
- }
466
-
467
- return this.driver.createNode(this.resolveNodeDefaults(props));
468
- }
469
-
470
- /**
471
- * Create a new scene graph text node
472
- *
473
- * @remarks
474
- * A text node is the second graphical building block of the Renderer scene
475
- * graph. It renders text using a specific text renderer that is automatically
476
- * chosen based on the font requested and what type of fonts are installed
477
- * into an app via a CoreExtension.
478
- *
479
- * See {@link ITextNode} for more details.
480
- *
481
- * @param props
482
- * @returns
483
- */
484
- createTextNode(props: Partial<ITextNodeWritableProps>): ITextNode {
485
- const fontSize = props.fontSize ?? 16;
486
- const data = {
487
- ...this.resolveNodeDefaults(props),
488
- text: props.text ?? '',
489
- textRendererOverride: props.textRendererOverride ?? null,
490
- fontSize,
491
- fontFamily: props.fontFamily ?? 'sans-serif',
492
- fontStyle: props.fontStyle ?? 'normal',
493
- fontWeight: props.fontWeight ?? 'normal',
494
- fontStretch: props.fontStretch ?? 'normal',
495
- textAlign: props.textAlign ?? 'left',
496
- contain: props.contain ?? 'none',
497
- scrollable: props.scrollable ?? false,
498
- scrollY: props.scrollY ?? 0,
499
- offsetY: props.offsetY ?? 0,
500
- letterSpacing: props.letterSpacing ?? 0,
501
- lineHeight: props.lineHeight, // `undefined` is a valid value
502
- maxLines: props.maxLines ?? 0,
503
- textBaseline: props.textBaseline ?? 'alphabetic',
504
- verticalAlign: props.verticalAlign ?? 'middle',
505
- overflowSuffix: props.overflowSuffix ?? '...',
506
- debug: props.debug ?? {},
507
- };
508
-
509
- if (this.inspector) {
510
- return this.inspector.createTextNode(this.driver, data);
511
- }
512
-
513
- return this.driver.createTextNode(data);
514
- }
515
-
516
- /**
517
- * Resolves the default property values for a Node
518
- *
519
- * @remarks
520
- * This method is used internally by the RendererMain to resolve the default
521
- * property values for a Node. It is exposed publicly so that it can be used
522
- * by Core Driver implementations.
523
- *
524
- * @param props
525
- * @returns
526
- */
527
- resolveNodeDefaults(props: Partial<INodeWritableProps>): INodeWritableProps {
528
- const color = props.color ?? 0xffffffff;
529
- const colorTl = props.colorTl ?? props.colorTop ?? props.colorLeft ?? color;
530
- const colorTr =
531
- props.colorTr ?? props.colorTop ?? props.colorRight ?? color;
532
- const colorBl =
533
- props.colorBl ?? props.colorBottom ?? props.colorLeft ?? color;
534
- const colorBr =
535
- props.colorBr ?? props.colorBottom ?? props.colorRight ?? color;
536
- const data = santizeCustomDataMap(props.data ?? {});
537
-
538
- return {
539
- x: props.x ?? 0,
540
- y: props.y ?? 0,
541
- width: props.width ?? 0,
542
- height: props.height ?? 0,
543
- alpha: props.alpha ?? 1,
544
- autosize: props.autosize ?? false,
545
- clipping: props.clipping ?? false,
546
- color,
547
- colorTop: props.colorTop ?? color,
548
- colorBottom: props.colorBottom ?? color,
549
- colorLeft: props.colorLeft ?? color,
550
- colorRight: props.colorRight ?? color,
551
- colorBl,
552
- colorBr,
553
- colorTl,
554
- colorTr,
555
- zIndex: props.zIndex ?? 0,
556
- zIndexLocked: props.zIndexLocked ?? 0,
557
- parent: props.parent ?? null,
558
- texture: props.texture ?? null,
559
- shader: props.shader ?? null,
560
- // Since setting the `src` will trigger a texture load, we need to set it after
561
- // we set the texture. Otherwise, problems happen.
562
- src: props.src ?? '',
563
- scale: props.scale ?? null,
564
- scaleX: props.scaleX ?? props.scale ?? 1,
565
- scaleY: props.scaleY ?? props.scale ?? 1,
566
- mount: props.mount ?? 0,
567
- mountX: props.mountX ?? props.mount ?? 0,
568
- mountY: props.mountY ?? props.mount ?? 0,
569
- pivot: props.pivot ?? 0.5,
570
- pivotX: props.pivotX ?? props.pivot ?? 0.5,
571
- pivotY: props.pivotY ?? props.pivot ?? 0.5,
572
- rotation: props.rotation ?? 0,
573
- rtt: props.rtt ?? false,
574
- data: data,
575
- };
576
- }
577
-
578
- /**
579
- * Destroy a node
580
- *
581
- * @remarks
582
- * This method destroys a node but does not destroy its children.
583
- *
584
- * @param node
585
- * @returns
586
- */
587
- destroyNode(node: INode) {
588
- if (this.inspector) {
589
- this.inspector.destroyNode(node);
590
- }
591
-
592
- return this.driver.destroyNode(node);
593
- }
594
-
595
- /**
596
- * Create a new texture reference
597
- *
598
- * @remarks
599
- * This method creates a new reference to a texture. The texture is not
600
- * loaded until it is used on a node.
601
- *
602
- * It can be assigned to a node's `texture` property, or it can be used
603
- * when creating a SubTexture.
604
- *
605
- * @param textureType
606
- * @param props
607
- * @param options
608
- * @returns
609
- */
610
- createTexture<TxType extends keyof TextureMap>(
611
- textureType: TxType,
612
- props: SpecificTextureRef<TxType>['props'],
613
- options?: TextureOptions,
614
- ): SpecificTextureRef<TxType> {
615
- const id = this.nextTextureId++;
616
- const desc = {
617
- descType: 'texture',
618
- txType: textureType,
619
- props,
620
- options: {
621
- ...options,
622
- // This ID is used to identify the texture in the CoreTextureManager's
623
- // ID Texture Map cache.
624
- id,
625
- },
626
- } satisfies SpecificTextureRef<TxType>;
627
- this.textureTracker.registerTexture(desc as TextureRef);
628
- return desc;
629
- }
630
-
631
- /**
632
- * Create a new shader reference
633
- *
634
- * @remarks
635
- * This method creates a new reference to a shader. The shader is not
636
- * loaded until it is used on a Node.
637
- *
638
- * It can be assigned to a Node's `shader` property.
639
- *
640
- * @param shaderType
641
- * @param props
642
- * @returns
643
- */
644
- createShader<ShType extends keyof ShaderMap>(
645
- shaderType: ShType,
646
- props?: SpecificShaderRef<ShType>['props'],
647
- ): SpecificShaderRef<ShType> {
648
- return {
649
- descType: 'shader',
650
- shType: shaderType,
651
- props: props as SpecificShaderRef<ShType>['props'],
652
- };
653
- }
654
-
655
- /**
656
- * Get a Node by its ID
657
- *
658
- * @param id
659
- * @returns
660
- */
661
- getNodeById(id: number): INode | null {
662
- return this.nodes.get(id) || null;
663
- }
664
-
665
- toggleFreeze() {
666
- throw new Error('Not implemented');
667
- }
668
-
669
- advanceFrame() {
670
- throw new Error('Not implemented');
671
- }
672
-
673
- /**
674
- * Re-render the current frame without advancing any running animations.
675
- *
676
- * @remarks
677
- * Any state changes will be reflected in the re-rendered frame. Useful for
678
- * debugging.
679
- *
680
- * May not do anything if the render loop is running on a separate worker.
681
- */
682
- rerender() {
683
- throw new Error('Not implemented');
684
- }
685
- }