@lightningjs/renderer 3.0.0-beta6 → 3.0.0-beta8

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