@solidtv/renderer 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (424) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +7 -0
  3. package/README.md +137 -0
  4. package/dist/exports/canvas-shaders.d.ts +10 -0
  5. package/dist/exports/canvas-shaders.js +11 -0
  6. package/dist/exports/canvas-shaders.js.map +1 -0
  7. package/dist/exports/canvas.d.ts +26 -0
  8. package/dist/exports/canvas.js +27 -0
  9. package/dist/exports/canvas.js.map +1 -0
  10. package/dist/exports/index.d.ts +50 -0
  11. package/dist/exports/index.js +40 -0
  12. package/dist/exports/index.js.map +1 -0
  13. package/dist/exports/inspector.d.ts +4 -0
  14. package/dist/exports/inspector.js +5 -0
  15. package/dist/exports/inspector.js.map +1 -0
  16. package/dist/exports/utils.d.ts +27 -0
  17. package/dist/exports/utils.js +28 -0
  18. package/dist/exports/utils.js.map +1 -0
  19. package/dist/exports/webgl-shaders.d.ts +11 -0
  20. package/dist/exports/webgl-shaders.js +12 -0
  21. package/dist/exports/webgl-shaders.js.map +1 -0
  22. package/dist/exports/webgl.d.ts +28 -0
  23. package/dist/exports/webgl.js +29 -0
  24. package/dist/exports/webgl.js.map +1 -0
  25. package/dist/src/common/CommonTypes.d.ts +110 -0
  26. package/dist/src/common/CommonTypes.js +2 -0
  27. package/dist/src/common/CommonTypes.js.map +1 -0
  28. package/dist/src/common/EventEmitter.d.ts +12 -0
  29. package/dist/src/common/EventEmitter.js +48 -0
  30. package/dist/src/common/EventEmitter.js.map +1 -0
  31. package/dist/src/common/IAnimationController.d.ts +58 -0
  32. package/dist/src/common/IAnimationController.js +2 -0
  33. package/dist/src/common/IAnimationController.js.map +1 -0
  34. package/dist/src/common/IEventEmitter.d.ts +8 -0
  35. package/dist/src/common/IEventEmitter.js +2 -0
  36. package/dist/src/common/IEventEmitter.js.map +1 -0
  37. package/dist/src/core/Autosizer.d.ts +35 -0
  38. package/dist/src/core/Autosizer.js +178 -0
  39. package/dist/src/core/Autosizer.js.map +1 -0
  40. package/dist/src/core/CoreNode.d.ts +908 -0
  41. package/dist/src/core/CoreNode.js +1837 -0
  42. package/dist/src/core/CoreNode.js.map +1 -0
  43. package/dist/src/core/CoreShaderManager.d.ts +38 -0
  44. package/dist/src/core/CoreShaderManager.js +123 -0
  45. package/dist/src/core/CoreShaderManager.js.map +1 -0
  46. package/dist/src/core/CoreTextNode.d.ts +91 -0
  47. package/dist/src/core/CoreTextNode.js +440 -0
  48. package/dist/src/core/CoreTextNode.js.map +1 -0
  49. package/dist/src/core/CoreTextureManager.d.ts +264 -0
  50. package/dist/src/core/CoreTextureManager.js +318 -0
  51. package/dist/src/core/CoreTextureManager.js.map +1 -0
  52. package/dist/src/core/Stage.d.ts +238 -0
  53. package/dist/src/core/Stage.js +804 -0
  54. package/dist/src/core/Stage.js.map +1 -0
  55. package/dist/src/core/TextureError.d.ts +11 -0
  56. package/dist/src/core/TextureError.js +37 -0
  57. package/dist/src/core/TextureError.js.map +1 -0
  58. package/dist/src/core/TextureMemoryManager.d.ts +150 -0
  59. package/dist/src/core/TextureMemoryManager.js +239 -0
  60. package/dist/src/core/TextureMemoryManager.js.map +1 -0
  61. package/dist/src/core/animations/AnimationManager.d.ts +33 -0
  62. package/dist/src/core/animations/AnimationManager.js +137 -0
  63. package/dist/src/core/animations/AnimationManager.js.map +1 -0
  64. package/dist/src/core/animations/CoreAnimation.d.ts +12 -0
  65. package/dist/src/core/animations/CoreAnimation.js +107 -0
  66. package/dist/src/core/animations/CoreAnimation.js.map +1 -0
  67. package/dist/src/core/lib/ContextSpy.d.ts +12 -0
  68. package/dist/src/core/lib/ContextSpy.js +20 -0
  69. package/dist/src/core/lib/ContextSpy.js.map +1 -0
  70. package/dist/src/core/lib/ImageWorker.d.ts +16 -0
  71. package/dist/src/core/lib/ImageWorker.js +202 -0
  72. package/dist/src/core/lib/ImageWorker.js.map +1 -0
  73. package/dist/src/core/lib/Matrix3d.d.ts +74 -0
  74. package/dist/src/core/lib/Matrix3d.js +218 -0
  75. package/dist/src/core/lib/Matrix3d.js.map +1 -0
  76. package/dist/src/core/lib/RenderCoords.d.ts +12 -0
  77. package/dist/src/core/lib/RenderCoords.js +35 -0
  78. package/dist/src/core/lib/RenderCoords.js.map +1 -0
  79. package/dist/src/core/lib/WebGlContextWrapper.d.ts +782 -0
  80. package/dist/src/core/lib/WebGlContextWrapper.js +1143 -0
  81. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -0
  82. package/dist/src/core/lib/collectionUtils.d.ts +5 -0
  83. package/dist/src/core/lib/collectionUtils.js +82 -0
  84. package/dist/src/core/lib/collectionUtils.js.map +1 -0
  85. package/dist/src/core/lib/colorCache.d.ts +1 -0
  86. package/dist/src/core/lib/colorCache.js +19 -0
  87. package/dist/src/core/lib/colorCache.js.map +1 -0
  88. package/dist/src/core/lib/colorParser.d.ts +21 -0
  89. package/dist/src/core/lib/colorParser.js +54 -0
  90. package/dist/src/core/lib/colorParser.js.map +1 -0
  91. package/dist/src/core/lib/textureCompression.d.ts +28 -0
  92. package/dist/src/core/lib/textureCompression.js +363 -0
  93. package/dist/src/core/lib/textureCompression.js.map +1 -0
  94. package/dist/src/core/lib/textureSvg.d.ts +16 -0
  95. package/dist/src/core/lib/textureSvg.js +45 -0
  96. package/dist/src/core/lib/textureSvg.js.map +1 -0
  97. package/dist/src/core/lib/utils.d.ts +66 -0
  98. package/dist/src/core/lib/utils.js +268 -0
  99. package/dist/src/core/lib/utils.js.map +1 -0
  100. package/dist/src/core/lib/validateImageBitmap.d.ts +7 -0
  101. package/dist/src/core/lib/validateImageBitmap.js +68 -0
  102. package/dist/src/core/lib/validateImageBitmap.js.map +1 -0
  103. package/dist/src/core/platforms/Platform.d.ts +42 -0
  104. package/dist/src/core/platforms/Platform.js +4 -0
  105. package/dist/src/core/platforms/Platform.js.map +1 -0
  106. package/dist/src/core/platforms/web/WebPlatform.d.ts +10 -0
  107. package/dist/src/core/platforms/web/WebPlatform.js +90 -0
  108. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -0
  109. package/dist/src/core/renderers/CoreContextTexture.d.ts +13 -0
  110. package/dist/src/core/renderers/CoreContextTexture.js +16 -0
  111. package/dist/src/core/renderers/CoreContextTexture.js.map +1 -0
  112. package/dist/src/core/renderers/CoreRenderOp.d.ts +3 -0
  113. package/dist/src/core/renderers/CoreRenderOp.js +3 -0
  114. package/dist/src/core/renderers/CoreRenderOp.js.map +1 -0
  115. package/dist/src/core/renderers/CoreRenderer.d.ts +81 -0
  116. package/dist/src/core/renderers/CoreRenderer.js +14 -0
  117. package/dist/src/core/renderers/CoreRenderer.js.map +1 -0
  118. package/dist/src/core/renderers/CoreShaderNode.d.ts +69 -0
  119. package/dist/src/core/renderers/CoreShaderNode.js +130 -0
  120. package/dist/src/core/renderers/CoreShaderNode.js.map +1 -0
  121. package/dist/src/core/renderers/CoreShaderProgram.d.ts +4 -0
  122. package/dist/src/core/renderers/CoreShaderProgram.js +2 -0
  123. package/dist/src/core/renderers/CoreShaderProgram.js.map +1 -0
  124. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +36 -0
  125. package/dist/src/core/renderers/canvas/CanvasRenderer.js +221 -0
  126. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -0
  127. package/dist/src/core/renderers/canvas/CanvasShaderNode.d.ts +21 -0
  128. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +42 -0
  129. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -0
  130. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +17 -0
  131. package/dist/src/core/renderers/canvas/CanvasTexture.js +110 -0
  132. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -0
  133. package/dist/src/core/renderers/webgl/SdfRenderOp.d.ts +41 -0
  134. package/dist/src/core/renderers/webgl/SdfRenderOp.js +88 -0
  135. package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -0
  136. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +14 -0
  137. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +45 -0
  138. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -0
  139. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +22 -0
  140. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +49 -0
  141. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -0
  142. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +67 -0
  143. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +259 -0
  144. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -0
  145. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +221 -0
  146. package/dist/src/core/renderers/webgl/WebGlRenderer.js +1015 -0
  147. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -0
  148. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +213 -0
  149. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +331 -0
  150. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -0
  151. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +37 -0
  152. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +240 -0
  153. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -0
  154. package/dist/src/core/renderers/webgl/internal/BufferCollection.d.ts +28 -0
  155. package/dist/src/core/renderers/webgl/internal/BufferCollection.js +39 -0
  156. package/dist/src/core/renderers/webgl/internal/BufferCollection.js.map +1 -0
  157. package/dist/src/core/renderers/webgl/internal/RendererUtils.d.ts +55 -0
  158. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +88 -0
  159. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -0
  160. package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +74 -0
  161. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +83 -0
  162. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -0
  163. package/dist/src/core/renderers/webgl/internal/WebGlUtils.d.ts +10 -0
  164. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js +13 -0
  165. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js.map +1 -0
  166. package/dist/src/core/shaders/canvas/Border.d.ts +15 -0
  167. package/dist/src/core/shaders/canvas/Border.js +83 -0
  168. package/dist/src/core/shaders/canvas/Border.js.map +1 -0
  169. package/dist/src/core/shaders/canvas/HolePunch.d.ts +7 -0
  170. package/dist/src/core/shaders/canvas/HolePunch.js +22 -0
  171. package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -0
  172. package/dist/src/core/shaders/canvas/LinearGradient.d.ts +10 -0
  173. package/dist/src/core/shaders/canvas/LinearGradient.js +32 -0
  174. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -0
  175. package/dist/src/core/shaders/canvas/RadialGradient.d.ts +11 -0
  176. package/dist/src/core/shaders/canvas/RadialGradient.js +54 -0
  177. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -0
  178. package/dist/src/core/shaders/canvas/Rounded.d.ts +7 -0
  179. package/dist/src/core/shaders/canvas/Rounded.js +17 -0
  180. package/dist/src/core/shaders/canvas/Rounded.js.map +1 -0
  181. package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +10 -0
  182. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +57 -0
  183. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -0
  184. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +7 -0
  185. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +61 -0
  186. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -0
  187. package/dist/src/core/shaders/canvas/RoundedWithShadow.d.ts +7 -0
  188. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +26 -0
  189. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -0
  190. package/dist/src/core/shaders/canvas/Shadow.d.ts +8 -0
  191. package/dist/src/core/shaders/canvas/Shadow.js +15 -0
  192. package/dist/src/core/shaders/canvas/Shadow.js.map +1 -0
  193. package/dist/src/core/shaders/canvas/utils/render.d.ts +5 -0
  194. package/dist/src/core/shaders/canvas/utils/render.js +81 -0
  195. package/dist/src/core/shaders/canvas/utils/render.js.map +1 -0
  196. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +47 -0
  197. package/dist/src/core/shaders/templates/BorderTemplate.js +77 -0
  198. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -0
  199. package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +46 -0
  200. package/dist/src/core/shaders/templates/HolePunchTemplate.js +19 -0
  201. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -0
  202. package/dist/src/core/shaders/templates/LinearGradientTemplate.d.ts +23 -0
  203. package/dist/src/core/shaders/templates/LinearGradientTemplate.js +31 -0
  204. package/dist/src/core/shaders/templates/LinearGradientTemplate.js.map +1 -0
  205. package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +33 -0
  206. package/dist/src/core/shaders/templates/RadialGradientTemplate.js +33 -0
  207. package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +1 -0
  208. package/dist/src/core/shaders/templates/RoundedTemplate.d.ts +29 -0
  209. package/dist/src/core/shaders/templates/RoundedTemplate.js +51 -0
  210. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -0
  211. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +7 -0
  212. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js +8 -0
  213. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js.map +1 -0
  214. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +8 -0
  215. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js +9 -0
  216. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js.map +1 -0
  217. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +6 -0
  218. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js +7 -0
  219. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js.map +1 -0
  220. package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +34 -0
  221. package/dist/src/core/shaders/templates/ShadowTemplate.js +50 -0
  222. package/dist/src/core/shaders/templates/ShadowTemplate.js.map +1 -0
  223. package/dist/src/core/shaders/utils.d.ts +5 -0
  224. package/dist/src/core/shaders/utils.js +25 -0
  225. package/dist/src/core/shaders/utils.js.map +1 -0
  226. package/dist/src/core/shaders/webgl/Border.d.ts +3 -0
  227. package/dist/src/core/shaders/webgl/Border.js +153 -0
  228. package/dist/src/core/shaders/webgl/Border.js.map +1 -0
  229. package/dist/src/core/shaders/webgl/Default.d.ts +2 -0
  230. package/dist/src/core/shaders/webgl/Default.js +51 -0
  231. package/dist/src/core/shaders/webgl/Default.js.map +1 -0
  232. package/dist/src/core/shaders/webgl/HolePunch.d.ts +3 -0
  233. package/dist/src/core/shaders/webgl/HolePunch.js +49 -0
  234. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -0
  235. package/dist/src/core/shaders/webgl/LinearGradient.d.ts +3 -0
  236. package/dist/src/core/shaders/webgl/LinearGradient.js +114 -0
  237. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -0
  238. package/dist/src/core/shaders/webgl/RadialGradient.d.ts +3 -0
  239. package/dist/src/core/shaders/webgl/RadialGradient.js +81 -0
  240. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -0
  241. package/dist/src/core/shaders/webgl/Rounded.d.ts +7 -0
  242. package/dist/src/core/shaders/webgl/Rounded.js +88 -0
  243. package/dist/src/core/shaders/webgl/Rounded.js.map +1 -0
  244. package/dist/src/core/shaders/webgl/RoundedWithBorder.d.ts +3 -0
  245. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +202 -0
  246. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -0
  247. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.d.ts +3 -0
  248. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +223 -0
  249. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -0
  250. package/dist/src/core/shaders/webgl/RoundedWithShadow.d.ts +3 -0
  251. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +123 -0
  252. package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -0
  253. package/dist/src/core/shaders/webgl/SdfShader.d.ts +13 -0
  254. package/dist/src/core/shaders/webgl/SdfShader.js +72 -0
  255. package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -0
  256. package/dist/src/core/shaders/webgl/Shadow.d.ts +3 -0
  257. package/dist/src/core/shaders/webgl/Shadow.js +115 -0
  258. package/dist/src/core/shaders/webgl/Shadow.js.map +1 -0
  259. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +59 -0
  260. package/dist/src/core/text-rendering/CanvasFontHandler.js +206 -0
  261. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -0
  262. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +17 -0
  263. package/dist/src/core/text-rendering/CanvasTextRenderer.js +139 -0
  264. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -0
  265. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +167 -0
  266. package/dist/src/core/text-rendering/SdfFontHandler.js +371 -0
  267. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -0
  268. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +17 -0
  269. package/dist/src/core/text-rendering/SdfTextRenderer.js +249 -0
  270. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -0
  271. package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +18 -0
  272. package/dist/src/core/text-rendering/TextLayoutEngine.js +380 -0
  273. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -0
  274. package/dist/src/core/text-rendering/TextRenderer.d.ts +406 -0
  275. package/dist/src/core/text-rendering/TextRenderer.js +2 -0
  276. package/dist/src/core/text-rendering/TextRenderer.js.map +1 -0
  277. package/dist/src/core/text-rendering/Utils.d.ts +30 -0
  278. package/dist/src/core/text-rendering/Utils.js +66 -0
  279. package/dist/src/core/text-rendering/Utils.js.map +1 -0
  280. package/dist/src/core/textures/ColorTexture.d.ts +36 -0
  281. package/dist/src/core/textures/ColorTexture.js +57 -0
  282. package/dist/src/core/textures/ColorTexture.js.map +1 -0
  283. package/dist/src/core/textures/ImageTexture.d.ts +131 -0
  284. package/dist/src/core/textures/ImageTexture.js +211 -0
  285. package/dist/src/core/textures/ImageTexture.js.map +1 -0
  286. package/dist/src/core/textures/NoiseTexture.d.ts +43 -0
  287. package/dist/src/core/textures/NoiseTexture.js +50 -0
  288. package/dist/src/core/textures/NoiseTexture.js.map +1 -0
  289. package/dist/src/core/textures/RenderTexture.d.ts +29 -0
  290. package/dist/src/core/textures/RenderTexture.js +36 -0
  291. package/dist/src/core/textures/RenderTexture.js.map +1 -0
  292. package/dist/src/core/textures/SubTexture.d.ts +61 -0
  293. package/dist/src/core/textures/SubTexture.js +99 -0
  294. package/dist/src/core/textures/SubTexture.js.map +1 -0
  295. package/dist/src/core/textures/Texture.d.ts +275 -0
  296. package/dist/src/core/textures/Texture.js +326 -0
  297. package/dist/src/core/textures/Texture.js.map +1 -0
  298. package/dist/src/core/utils.d.ts +23 -0
  299. package/dist/src/core/utils.js +155 -0
  300. package/dist/src/core/utils.js.map +1 -0
  301. package/dist/src/main-api/INode.d.ts +65 -0
  302. package/dist/src/main-api/INode.js +2 -0
  303. package/dist/src/main-api/INode.js.map +1 -0
  304. package/dist/src/main-api/Inspector.d.ts +154 -0
  305. package/dist/src/main-api/Inspector.js +844 -0
  306. package/dist/src/main-api/Inspector.js.map +1 -0
  307. package/dist/src/main-api/Renderer.d.ts +629 -0
  308. package/dist/src/main-api/Renderer.js +471 -0
  309. package/dist/src/main-api/Renderer.js.map +1 -0
  310. package/dist/src/main-api/utils.d.ts +2 -0
  311. package/dist/src/main-api/utils.js +34 -0
  312. package/dist/src/main-api/utils.js.map +1 -0
  313. package/dist/src/utils.d.ts +123 -0
  314. package/dist/src/utils.js +234 -0
  315. package/dist/src/utils.js.map +1 -0
  316. package/dist/tsconfig.dist.tsbuildinfo +1 -0
  317. package/exports/canvas-shaders.ts +11 -0
  318. package/exports/canvas.ts +27 -0
  319. package/exports/index.ts +69 -0
  320. package/exports/inspector.ts +5 -0
  321. package/exports/utils.ts +32 -0
  322. package/exports/webgl-shaders.ts +12 -0
  323. package/exports/webgl.ts +33 -0
  324. package/package.json +99 -0
  325. package/src/common/CommonTypes.ts +145 -0
  326. package/src/common/EventEmitter.ts +58 -0
  327. package/src/common/IAnimationController.ts +65 -0
  328. package/src/common/IEventEmitter.ts +11 -0
  329. package/src/core/Autosizer.ts +205 -0
  330. package/src/core/CoreNode.test.ts +535 -0
  331. package/src/core/CoreNode.ts +2883 -0
  332. package/src/core/CoreShaderManager.ts +170 -0
  333. package/src/core/CoreTextNode.ts +573 -0
  334. package/src/core/CoreTextureManager.ts +552 -0
  335. package/src/core/Stage.ts +1037 -0
  336. package/src/core/TextureError.ts +46 -0
  337. package/src/core/TextureMemoryManager.ts +378 -0
  338. package/src/core/animations/AnimationManager.ts +178 -0
  339. package/src/core/animations/CoreAnimation.ts +138 -0
  340. package/src/core/lib/ContextSpy.ts +22 -0
  341. package/src/core/lib/ImageWorker.ts +292 -0
  342. package/src/core/lib/Matrix3d.ts +231 -0
  343. package/src/core/lib/RenderCoords.ts +55 -0
  344. package/src/core/lib/WebGlContextWrapper.ts +1448 -0
  345. package/src/core/lib/collectionUtils.ts +99 -0
  346. package/src/core/lib/colorCache.ts +20 -0
  347. package/src/core/lib/colorParser.ts +66 -0
  348. package/src/core/lib/textureCompression.ts +492 -0
  349. package/src/core/lib/textureSvg.ts +59 -0
  350. package/src/core/lib/utils.ts +400 -0
  351. package/src/core/lib/validateImageBitmap.ts +87 -0
  352. package/src/core/platforms/Platform.ts +64 -0
  353. package/src/core/platforms/web/WebPlatform.ts +132 -0
  354. package/src/core/renderers/CoreContextTexture.ts +25 -0
  355. package/src/core/renderers/CoreRenderOp.ts +3 -0
  356. package/src/core/renderers/CoreRenderer.ts +101 -0
  357. package/src/core/renderers/CoreShaderNode.ts +202 -0
  358. package/src/core/renderers/CoreShaderProgram.ts +4 -0
  359. package/src/core/renderers/canvas/CanvasRenderer.ts +274 -0
  360. package/src/core/renderers/canvas/CanvasShaderNode.ts +79 -0
  361. package/src/core/renderers/canvas/CanvasTexture.ts +141 -0
  362. package/src/core/renderers/webgl/SdfRenderOp.ts +103 -0
  363. package/src/core/renderers/webgl/WebGlCtxRenderTexture.ts +70 -0
  364. package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +76 -0
  365. package/src/core/renderers/webgl/WebGlCtxTexture.ts +332 -0
  366. package/src/core/renderers/webgl/WebGlRenderer.ts +1323 -0
  367. package/src/core/renderers/webgl/WebGlShaderNode.ts +423 -0
  368. package/src/core/renderers/webgl/WebGlShaderProgram.ts +346 -0
  369. package/src/core/renderers/webgl/internal/BufferCollection.ts +46 -0
  370. package/src/core/renderers/webgl/internal/RendererUtils.ts +136 -0
  371. package/src/core/renderers/webgl/internal/ShaderUtils.ts +262 -0
  372. package/src/core/renderers/webgl/internal/WebGlUtils.ts +16 -0
  373. package/src/core/shaders/canvas/Border.ts +119 -0
  374. package/src/core/shaders/canvas/HolePunch.ts +38 -0
  375. package/src/core/shaders/canvas/LinearGradient.ts +54 -0
  376. package/src/core/shaders/canvas/RadialGradient.ts +82 -0
  377. package/src/core/shaders/canvas/Rounded.ts +38 -0
  378. package/src/core/shaders/canvas/RoundedWithBorder.ts +105 -0
  379. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +118 -0
  380. package/src/core/shaders/canvas/RoundedWithShadow.ts +56 -0
  381. package/src/core/shaders/canvas/Shadow.ts +35 -0
  382. package/src/core/shaders/canvas/utils/render.ts +143 -0
  383. package/src/core/shaders/templates/BorderTemplate.ts +128 -0
  384. package/src/core/shaders/templates/HolePunchTemplate.ts +65 -0
  385. package/src/core/shaders/templates/LinearGradientTemplate.ts +54 -0
  386. package/src/core/shaders/templates/RadialGradientTemplate.ts +66 -0
  387. package/src/core/shaders/templates/RoundedTemplate.ts +81 -0
  388. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +21 -0
  389. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +23 -0
  390. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +18 -0
  391. package/src/core/shaders/templates/ShadowTemplate.ts +89 -0
  392. package/src/core/shaders/utils.ts +30 -0
  393. package/src/core/shaders/webgl/Border.ts +158 -0
  394. package/src/core/shaders/webgl/Default.ts +52 -0
  395. package/src/core/shaders/webgl/HolePunch.ts +58 -0
  396. package/src/core/shaders/webgl/LinearGradient.ts +119 -0
  397. package/src/core/shaders/webgl/RadialGradient.ts +91 -0
  398. package/src/core/shaders/webgl/Rounded.ts +97 -0
  399. package/src/core/shaders/webgl/RoundedWithBorder.ts +212 -0
  400. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +235 -0
  401. package/src/core/shaders/webgl/RoundedWithShadow.ts +132 -0
  402. package/src/core/shaders/webgl/SdfShader.ts +73 -0
  403. package/src/core/shaders/webgl/Shadow.ts +119 -0
  404. package/src/core/text-rendering/CanvasFontHandler.ts +285 -0
  405. package/src/core/text-rendering/CanvasTextRenderer.ts +236 -0
  406. package/src/core/text-rendering/SdfFontHandler.ts +566 -0
  407. package/src/core/text-rendering/SdfTextRenderer.ts +352 -0
  408. package/src/core/text-rendering/TextLayoutEngine.ts +672 -0
  409. package/src/core/text-rendering/TextRenderer.ts +449 -0
  410. package/src/core/text-rendering/Utils.ts +80 -0
  411. package/src/core/text-rendering/tests/TextLayoutEngine.test.ts +434 -0
  412. package/src/core/textures/ColorTexture.ts +85 -0
  413. package/src/core/textures/ImageTexture.ts +394 -0
  414. package/src/core/textures/NoiseTexture.ts +87 -0
  415. package/src/core/textures/RenderTexture.ts +68 -0
  416. package/src/core/textures/SubTexture.ts +165 -0
  417. package/src/core/textures/Texture.ts +505 -0
  418. package/src/core/utils.ts +210 -0
  419. package/src/env.d.ts +7 -0
  420. package/src/main-api/INode.ts +92 -0
  421. package/src/main-api/Inspector.ts +1267 -0
  422. package/src/main-api/Renderer.ts +1011 -0
  423. package/src/main-api/utils.ts +45 -0
  424. package/src/utils.ts +302 -0
@@ -0,0 +1,1011 @@
1
+ import type { ExtractProps, TextureMap } from '../core/CoreTextureManager.js';
2
+ import { EventEmitter } from '../common/EventEmitter.js';
3
+ import { isProductionEnvironment } from '../utils.js';
4
+ import { Stage, type StageOptions } from '../core/Stage.js';
5
+ import { CoreNode, type CoreNodeProps } from '../core/CoreNode.js';
6
+ import { type CoreTextNodeProps } from '../core/CoreTextNode.js';
7
+ import type { INode, INodeProps, ITextNode, ITextNodeProps } from './INode.js';
8
+ import type { TextureMemoryManagerSettings } from '../core/TextureMemoryManager.js';
9
+ import type { TextRenderer } from '../core/text-rendering/TextRenderer.js';
10
+ import type { CanvasRenderer } from '../core/renderers/canvas/CanvasRenderer.js';
11
+ import type { WebGlRenderer } from '../core/renderers/webgl/WebGlRenderer.js';
12
+ import type { Inspector, InspectorOptions } from './Inspector.js';
13
+ import type { CoreShaderNode } from '../core/renderers/CoreShaderNode.js';
14
+ import type {
15
+ ExtractShaderProps,
16
+ OptionalShaderProps,
17
+ ShaderMap,
18
+ } from '../core/CoreShaderManager.js';
19
+ import { WebPlatform } from '../core/platforms/web/WebPlatform.js';
20
+ import { Platform } from '../core/platforms/Platform.js';
21
+
22
+ /**
23
+ * FPS Update Event Data
24
+ *
25
+ * @category Events
26
+ * @example
27
+ * ```typescript
28
+ * renderer.on('fpsUpdate', (data) => {
29
+ * console.log(`Current FPS: ${data.fps}`);
30
+ * if (data.contextSpyData) {
31
+ * console.log('WebGL calls:', data.contextSpyData);
32
+ * }
33
+ * });
34
+ * ```
35
+ */
36
+ export interface RendererMainFpsUpdateEvent {
37
+ /** Current frames per second */
38
+ fps: number;
39
+ /** Context spy data (if enabled) - contains WebGL call statistics */
40
+ contextSpyData?: unknown;
41
+ }
42
+
43
+ /**
44
+ * Frame Tick Event Data
45
+ *
46
+ * @category Events
47
+ * @example
48
+ * ```typescript
49
+ * renderer.on('frameTick', (data) => {
50
+ * console.log(`Frame time: ${data.time}ms, delta: ${data.delta}ms`);
51
+ * });
52
+ * ```
53
+ */
54
+ export interface RendererMainFrameTickEvent {
55
+ /** Current timestamp */
56
+ time: number;
57
+ /** Time delta since last frame */
58
+ delta: number;
59
+ }
60
+
61
+ /**
62
+ * Render Update Event Data
63
+ *
64
+ * @category Events
65
+ * @example
66
+ * ```typescript
67
+ * renderer.on('renderUpdate', (data) => {
68
+ * console.log(`Rendered quads: ${data.quads}, renderOps: ${data.renderOps}`);
69
+ * });
70
+ * ```
71
+ */
72
+ export interface RendererMainRenderUpdateEvent {
73
+ /** Number of rendered quads */
74
+ quads: number;
75
+ /** Number of render operations */
76
+ renderOps: number;
77
+ }
78
+
79
+ /**
80
+ * Idle Event Data
81
+ *
82
+ * @category Events
83
+ * @remarks
84
+ * This event is emitted when the renderer has no scene updates to process.
85
+ * The event has no payload - use this for performance optimizations during idle periods.
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * renderer.on('idle', () => {
90
+ * // Renderer is idle - perfect time for cleanup, analytics, etc.
91
+ * console.log('Renderer is idle - no scene changes');
92
+ *
93
+ * // Example: Perform background tasks
94
+ * performBackgroundCleanup();
95
+ * sendAnalytics();
96
+ * });
97
+ * ```
98
+ */
99
+ export interface RendererMainIdleEvent {
100
+ /** This event has no payload - listen without parameters */
101
+ readonly __eventHasNoPayload?: never;
102
+ }
103
+
104
+ /**
105
+ * Critical Cleanup Event Data
106
+ *
107
+ * @category Events
108
+ * @example
109
+ * ```typescript
110
+ * renderer.on('criticalCleanup', (data) => {
111
+ * console.log(`Memory cleanup triggered!`);
112
+ * console.log(`Memory used: ${data.memUsed} bytes`);
113
+ * console.log(`Critical threshold: ${data.criticalThreshold} bytes`);
114
+ * });
115
+ * ```
116
+ */
117
+ export interface RendererMainCriticalCleanupEvent {
118
+ /** Memory used before cleanup (bytes) */
119
+ memUsed: number;
120
+ /** Critical threshold (bytes) */
121
+ criticalThreshold: number;
122
+ }
123
+
124
+ /**
125
+ * Critical Cleanup Failed Event Data
126
+ *
127
+ * @category Events
128
+ * @example
129
+ * ```typescript
130
+ * renderer.on('criticalCleanupFailed', (data) => {
131
+ * console.warn(`Memory cleanup failed!`);
132
+ * console.log(`Memory still used: ${data.memUsed} bytes`);
133
+ * console.log(`Critical threshold: ${data.criticalThreshold} bytes`);
134
+ * // Consider reducing texture usage or forcing cleanup
135
+ * });
136
+ * ```
137
+ */
138
+ export interface RendererMainCriticalCleanupFailedEvent {
139
+ /** Memory used after cleanup (bytes) */
140
+ memUsed: number;
141
+ /** Critical threshold (bytes) */
142
+ criticalThreshold: number;
143
+ }
144
+
145
+ /**
146
+ * Settings for the Renderer that can be updated during runtime.
147
+ */
148
+ export interface RendererRuntimeSettings {
149
+ /**
150
+ * Authored logical pixel width of the application
151
+ *
152
+ * @defaultValue `1920`
153
+ */
154
+ appWidth: number;
155
+
156
+ /**
157
+ * Authored logical pixel height of the application
158
+ *
159
+ * @defaultValue `1080`
160
+ */
161
+ appHeight: number;
162
+
163
+ /**
164
+ * Texture Memory Manager Settings
165
+ */
166
+ textureMemory: Partial<TextureMemoryManagerSettings>;
167
+
168
+ /**
169
+ * Bounds margin to extend the boundary in which a Node is added as Quad.
170
+ */
171
+ boundsMargin: number | [number, number, number, number];
172
+
173
+ /**
174
+ * Factor to convert app-authored logical coorindates to device logical coordinates
175
+ *
176
+ * @remarks
177
+ * This value allows auto-scaling to support larger/small resolutions than the
178
+ * app was authored for.
179
+ *
180
+ * If the app was authored for 1920x1080 and this value is 2, the app's canvas
181
+ * will be rendered at 3840x2160 logical pixels.
182
+ *
183
+ * Likewise, if the app was authored for 1920x1080 and this value is 0.66667,
184
+ * the app's canvas will be rendered at 1280x720 logical pixels.
185
+ *
186
+ * @defaultValue `1`
187
+ */
188
+ deviceLogicalPixelRatio: number;
189
+
190
+ /**
191
+ * Factor to convert device logical coordinates to device physical coordinates
192
+ *
193
+ * @remarks
194
+ * This value allows auto-scaling to support devices with different pixel densities.
195
+ *
196
+ * This controls the number of physical pixels that are used to render each logical
197
+ * pixel. For example, if the device has a pixel density of 2, each logical pixel
198
+ * will be rendered using 2x2 physical pixels.
199
+ *
200
+ * By default, it will be set to `window.devicePixelRatio` which is the pixel
201
+ * density of the device the app is running on reported by the browser.
202
+ *
203
+ * @defaultValue `window.devicePixelRatio`
204
+ */
205
+ devicePhysicalPixelRatio: number;
206
+
207
+ /**
208
+ * RGBA encoded number of the background to use
209
+ *
210
+ * @defaultValue `0x00000000`
211
+ */
212
+ clearColor: number;
213
+
214
+ /**
215
+ * Interval in milliseconds to receive FPS updates
216
+ *
217
+ * @remarks
218
+ * If set to `0`, FPS updates will be disabled.
219
+ *
220
+ * @defaultValue `0` (disabled)
221
+ */
222
+ fpsUpdateInterval: number;
223
+
224
+ /**
225
+ * Clears the render buffer on reset
226
+ *
227
+ * @remarks
228
+ * If false, the renderer will not clear the buffer before rendering a new frame.
229
+ * This is useful if you want to preserve the previous frame.
230
+ *
231
+ * @defaultValue `true`
232
+ */
233
+ enableClear: boolean;
234
+
235
+ /**
236
+ * DOM Inspector
237
+ *
238
+ * @remarks
239
+ * The inspector will replicate the state of the Nodes created
240
+ * in the renderer and allow inspection of the state of the nodes.
241
+ *
242
+ */
243
+ inspector: typeof Inspector | false;
244
+
245
+ /**
246
+ * Inspector Options
247
+ *
248
+ * @remarks
249
+ * Configuration options for the Inspector's performance monitoring features.
250
+ * Only used when inspector is enabled.
251
+ */
252
+ inspectorOptions?: Partial<InspectorOptions>;
253
+
254
+ /**
255
+ * Texture Processing Limit (in milliseconds)
256
+ *
257
+ * @remarks
258
+ * The maximum amount of time the renderer is allowed to process textures in a
259
+ * single frame. If the processing time exceeds this limit, the renderer will
260
+ * skip processing the remaining textures and continue rendering the frame.
261
+ *
262
+ * @defaultValue `10`
263
+ */
264
+ textureProcessingTimeLimit: number;
265
+
266
+ /**
267
+ * Target FPS for the global render loop
268
+ *
269
+ * @remarks
270
+ * Controls the maximum frame rate of the entire rendering system.
271
+ * When set to 0, no throttling is applied (use display refresh rate).
272
+ * When set to a positive number, the global requestAnimationFrame loop
273
+ * will be throttled to this target FPS, affecting all animations and rendering.
274
+ *
275
+ * This provides global performance control for the entire application,
276
+ * useful for managing performance on lower-end devices.
277
+ *
278
+ * @defaultValue `0` (no throttling, use display refresh rate)
279
+ */
280
+ targetFPS: number;
281
+ }
282
+
283
+ /**
284
+ * Configuration settings for {@link RendererMain}
285
+ */
286
+ export type RendererMainSettings = RendererRuntimeSettings & {
287
+ /**
288
+ * Include context call (i.e. WebGL) information in FPS updates
289
+ *
290
+ * @remarks
291
+ * When enabled the number of calls to each context method over the
292
+ * `fpsUpdateInterval` will be included in the FPS update payload's
293
+ * `contextSpyData` property.
294
+ *
295
+ * Enabling the context spy has a serious impact on performance so only use it
296
+ * when you need to extract context call information.
297
+ *
298
+ * @defaultValue `false` (disabled)
299
+ */
300
+ enableContextSpy: boolean;
301
+
302
+ /**
303
+ * Number or Image Workers to use
304
+ *
305
+ * @remarks
306
+ * On devices with multiple cores, this can be used to improve image loading
307
+ * as well as reduce the impact of image loading on the main thread.
308
+ * Set to 0 to disable image workers.
309
+ *
310
+ * @defaultValue `2`
311
+ */
312
+ numImageWorkers: number;
313
+
314
+ /**
315
+ * Renderer Engine
316
+ *
317
+ * @remarks
318
+ * The renderer engine to use. Spawns a WebGL or Canvas renderer.
319
+ * WebGL is more performant and supports more features. Canvas is
320
+ * supported on most platforms.
321
+ *
322
+ * Note: When using CanvasCoreRenderer you can only use
323
+ * CanvasTextRenderer. The WebGLCoreRenderer supports
324
+ * both CanvasTextRenderer and SdfTextRenderer for Text Rendering.
325
+ *
326
+ */
327
+ renderEngine: typeof CanvasRenderer | typeof WebGlRenderer;
328
+
329
+ /**
330
+ * Quad buffer size in bytes
331
+ *
332
+ * @defaultValue 4 * 1024 * 1024
333
+ */
334
+ quadBufferSize: number;
335
+
336
+ /**
337
+ * Font Engines
338
+ *
339
+ * @remarks
340
+ * The font engines to use for text rendering. CanvasTextRenderer is supported
341
+ * on all platforms. SdfTextRenderer is a more performant renderer.
342
+ * When using `renderEngine=CanvasCoreRenderer` you can only use `CanvasTextRenderer`.
343
+ * The `renderEngine=WebGLCoreRenderer` supports both `CanvasTextRenderer` and `SdfTextRenderer`.
344
+ *
345
+ * This setting is used to enable tree shaking of unused font engines. Please
346
+ * import your font engine(s) as follows:
347
+ * ```
348
+ * import { CanvasTextRenderer } from '@lightning/renderer/canvas';
349
+ * import { SdfTextRenderer } from '@lightning/renderer/webgl';
350
+ * ```
351
+ *
352
+ * If both CanvasTextRenderer and SdfTextRenderer are provided, the first renderer
353
+ * provided will be asked first if it can render the font. If it cannot render the
354
+ * font, the next renderer will be asked. If no renderer can render the font, the
355
+ * text will not be rendered.
356
+ *
357
+ * **Note** that if you have fonts available in both engines the second font engine
358
+ * will not be used. This is because the first font engine will always be asked first.
359
+ *
360
+ * @defaultValue '[]'
361
+ *
362
+ *
363
+ */
364
+ fontEngines: TextRenderer[];
365
+
366
+ /**
367
+ * Force WebGL2
368
+ *
369
+ * @remarks
370
+ * Force the renderer to use WebGL2. This can be used to force the renderer to
371
+ * use WebGL2 even if the browser supports WebGL1.
372
+ *
373
+ * @defaultValue `false`
374
+ */
375
+ forceWebGL2: boolean;
376
+
377
+ /**
378
+ * Canvas object to use for rendering
379
+ *
380
+ * @remarks
381
+ * This is used to render the scene graph. If not provided, a new canvas
382
+ * element will be created and appended to the target element.
383
+ */
384
+ canvas: HTMLCanvasElement;
385
+
386
+ /**
387
+ * createImageBitmap support for the runtime
388
+ *
389
+ * @remarks
390
+ * This is used to determine if and which version of the createImageBitmap API
391
+ * is supported by the runtime. This is used to determine if the renderer can
392
+ * use createImageBitmap to load images.
393
+ *
394
+ * Options supported
395
+ * - Auto - Automatically determine the supported version
396
+ * - Basic - Supports createImageBitmap(image)
397
+ * - Options - Supports createImageBitmap(image, options)
398
+ * - Full - Supports createImageBitmap(image, sx, sy, sw, sh, options)
399
+ *
400
+ * Note with auto detection, the renderer will attempt to use the most advanced
401
+ * version of the API available. If the API is not available, the renderer will
402
+ * fall back to the next available version.
403
+ *
404
+ * This will affect startup performance as the renderer will need to determine
405
+ * the supported version of the API.
406
+ *
407
+ * @defaultValue `full`
408
+ */
409
+ createImageBitmapSupport: 'auto' | 'basic' | 'options' | 'full';
410
+
411
+ /**
412
+ * Provide an alternative platform abstraction layer
413
+ *
414
+ * @remarks
415
+ * By default the Lightning 3 renderer will load a webplatform, assuming it runs
416
+ * inside a web browsr. However for special cases there might be a need to provide
417
+ * an abstracted platform layer to run on non-web or non-standard JS engines
418
+ *
419
+ * @defaultValue `null`
420
+ */
421
+ platform: typeof Platform | null;
422
+
423
+ /**
424
+ * Number of times to retry loading a failed texture
425
+ *
426
+ * @remarks
427
+ * When a texture fails to load, Lightning will retry up to this many times
428
+ * before permanently giving up. Each retry will clear the texture ownership
429
+ * and then re-establish it to trigger a new load attempt.
430
+ *
431
+ * Set to null to disable retries. Set to 0 to always try once and never retry.
432
+ * This is typically only used on ImageTexture instances.
433
+ *
434
+ */
435
+ maxRetryCount?: number;
436
+ };
437
+
438
+ /**
439
+ * The Renderer Main API
440
+ *
441
+ * @remarks
442
+ * This is the primary class used to configure and operate the Renderer.
443
+ *
444
+ * It is used to create and destroy Nodes, as well as Texture and Shader
445
+ * references.
446
+ *
447
+ * Example:
448
+ * ```ts
449
+ * import { RendererMain, MainCoreDriver } from '@lightningjs/renderer';
450
+ *
451
+ * // Initialize the Renderer
452
+ * const renderer = new RendererMain(
453
+ * {
454
+ * appWidth: 1920,
455
+ * appHeight: 1080
456
+ * },
457
+ * 'app',
458
+ * new MainCoreDriver(),
459
+ * );
460
+ * ```
461
+ *
462
+ * ## Event Handling
463
+ *
464
+ * Listen to events using the standard EventEmitter API:
465
+ * ```typescript
466
+ * renderer.on('fpsUpdate', (data: RendererMainFpsUpdateEvent) => {
467
+ * console.log(`FPS: ${data.fps}`);
468
+ * });
469
+ *
470
+ * renderer.on('idle', (data: RendererMainIdleEvent) => {
471
+ * // Renderer is idle - no scene changes
472
+ * });
473
+ * ```
474
+ *
475
+ * @see {@link RendererMainFpsUpdateEvent}
476
+ * @see {@link RendererMainFrameTickEvent}
477
+ * @see {@link RendererMainRenderUpdateEvent}
478
+ * @see {@link RendererMainIdleEvent}
479
+ * @see {@link RendererMainCriticalCleanupEvent}
480
+ * @see {@link RendererMainCriticalCleanupFailedEvent}
481
+ *
482
+ * @fires RendererMain#fpsUpdate
483
+ * @fires RendererMain#frameTick
484
+ * @fires RendererMain#renderUpdate
485
+ * @fires RendererMain#idle
486
+ * @fires RendererMain#criticalCleanup
487
+ * @fires RendererMain#criticalCleanupFailed
488
+ */
489
+ export class RendererMain extends EventEmitter {
490
+ readonly root: INode;
491
+ readonly canvas: HTMLCanvasElement;
492
+ readonly stage: Stage;
493
+ private inspector: Inspector | null = null;
494
+
495
+ /**
496
+ * Constructs a new Renderer instance
497
+ *
498
+ * @param settings Renderer settings
499
+ * @param target Element ID or HTMLElement to insert the canvas into
500
+ * @param driver Core Driver to use
501
+ */
502
+ constructor(
503
+ settings: Partial<RendererMainSettings>,
504
+ target?: string | HTMLElement,
505
+ ) {
506
+ super();
507
+
508
+ const resolvedTxSettings = this.resolveTxSettings(
509
+ settings.textureMemory || {},
510
+ );
511
+
512
+ settings = {
513
+ appWidth: settings.appWidth || 1920,
514
+ appHeight: settings.appHeight || 1080,
515
+ textureMemory: resolvedTxSettings,
516
+ boundsMargin: settings.boundsMargin || 0,
517
+ deviceLogicalPixelRatio: settings.deviceLogicalPixelRatio || 1,
518
+ devicePhysicalPixelRatio:
519
+ settings.devicePhysicalPixelRatio || window.devicePixelRatio || 1,
520
+ clearColor: settings.clearColor ?? 0x00000000,
521
+ fpsUpdateInterval: settings.fpsUpdateInterval || 0,
522
+ enableClear: settings.enableClear ?? true,
523
+ targetFPS: settings.targetFPS || 0,
524
+ numImageWorkers:
525
+ settings.numImageWorkers !== undefined ? settings.numImageWorkers : 2,
526
+ enableContextSpy: settings.enableContextSpy ?? false,
527
+ forceWebGL2: settings.forceWebGL2 ?? false,
528
+ inspector: settings.inspector ?? false,
529
+ inspectorOptions: settings.inspectorOptions ?? {},
530
+ renderEngine: settings.renderEngine,
531
+ quadBufferSize: settings.quadBufferSize ?? 4 * 1024 * 1024,
532
+ fontEngines: settings.fontEngines ?? [],
533
+ textureProcessingTimeLimit: settings.textureProcessingTimeLimit || 10,
534
+ canvas: settings.canvas,
535
+ createImageBitmapSupport: settings.createImageBitmapSupport || 'full',
536
+ platform: settings.platform || null,
537
+ maxRetryCount: settings.maxRetryCount ?? 5,
538
+ };
539
+
540
+ const {
541
+ appWidth,
542
+ appHeight,
543
+ deviceLogicalPixelRatio,
544
+ devicePhysicalPixelRatio,
545
+ inspector,
546
+ } = settings as RendererMainSettings;
547
+
548
+ let platform;
549
+ if (
550
+ settings.platform !== undefined &&
551
+ settings.platform !== null &&
552
+ settings.platform.prototype instanceof Platform === true
553
+ ) {
554
+ // @ts-ignore - if Platform is a valid class, it will be used
555
+ platform = new settings.platform();
556
+ } else {
557
+ platform = new WebPlatform();
558
+ }
559
+
560
+ const canvas = settings.canvas || platform.createCanvas();
561
+
562
+ const deviceLogicalWidth = appWidth * deviceLogicalPixelRatio;
563
+ const deviceLogicalHeight = appHeight * deviceLogicalPixelRatio;
564
+
565
+ this.canvas = canvas;
566
+ canvas.width = deviceLogicalWidth * devicePhysicalPixelRatio;
567
+ canvas.height = deviceLogicalHeight * devicePhysicalPixelRatio;
568
+
569
+ canvas.style.width = `${deviceLogicalWidth}px`;
570
+ canvas.style.height = `${deviceLogicalHeight}px`;
571
+
572
+ // Initialize the stage
573
+ this.stage = new Stage({
574
+ appWidth,
575
+ appHeight,
576
+ boundsMargin: settings.boundsMargin!,
577
+ clearColor: settings.clearColor!,
578
+ canvas: this.canvas,
579
+ deviceLogicalPixelRatio,
580
+ devicePhysicalPixelRatio,
581
+ enableContextSpy: settings.enableContextSpy!,
582
+ forceWebGL2: settings.forceWebGL2!,
583
+ fpsUpdateInterval: settings.fpsUpdateInterval!,
584
+ enableClear: settings.enableClear!,
585
+ numImageWorkers: settings.numImageWorkers!,
586
+ renderEngine: settings.renderEngine!,
587
+ textureMemory: resolvedTxSettings,
588
+ eventBus: this,
589
+ quadBufferSize: settings.quadBufferSize!,
590
+ fontEngines: settings.fontEngines!,
591
+ inspector: settings.inspector !== null,
592
+ targetFPS: settings.targetFPS!,
593
+ textureProcessingTimeLimit: settings.textureProcessingTimeLimit!,
594
+ createImageBitmapSupport: settings.createImageBitmapSupport!,
595
+ platform,
596
+ maxRetryCount: settings.maxRetryCount ?? 5,
597
+ });
598
+
599
+ // Extract the root node
600
+ this.root = this.stage.root as unknown as INode;
601
+
602
+ // Get the target element and attach the canvas to it
603
+ if (target) {
604
+ let targetEl: HTMLElement | null;
605
+ if (typeof target === 'string') {
606
+ targetEl = document.getElementById(target);
607
+ } else {
608
+ targetEl = target;
609
+ }
610
+
611
+ if (!targetEl) {
612
+ throw new Error('Could not find target element');
613
+ }
614
+
615
+ targetEl.appendChild(canvas);
616
+ } else if (settings.canvas !== canvas) {
617
+ throw new Error(
618
+ 'New canvas element could not be appended to undefined target',
619
+ );
620
+ }
621
+
622
+ // Initialize inspector (if enabled)
623
+ if (inspector && isProductionEnvironment === false) {
624
+ this.inspector = new inspector(canvas, settings as RendererMainSettings);
625
+ }
626
+ }
627
+
628
+ /**
629
+ * Resolves the Texture Memory Manager values
630
+ *
631
+ * @param props
632
+ * @returns
633
+ */
634
+ private resolveTxSettings(
635
+ textureMemory: Partial<TextureMemoryManagerSettings>,
636
+ ): TextureMemoryManagerSettings {
637
+ const currentTxSettings =
638
+ (this.stage && this.stage.options.textureMemory) || {};
639
+
640
+ return {
641
+ criticalThreshold:
642
+ textureMemory?.criticalThreshold ??
643
+ currentTxSettings?.criticalThreshold ??
644
+ 200e6,
645
+ targetThresholdLevel:
646
+ textureMemory?.targetThresholdLevel ??
647
+ currentTxSettings?.targetThresholdLevel ??
648
+ 0.8,
649
+ cleanupInterval:
650
+ textureMemory?.cleanupInterval ??
651
+ currentTxSettings?.cleanupInterval ??
652
+ 5000,
653
+ debugLogging:
654
+ textureMemory?.debugLogging ?? currentTxSettings?.debugLogging ?? false,
655
+ baselineMemoryAllocation:
656
+ textureMemory?.baselineMemoryAllocation ??
657
+ currentTxSettings?.baselineMemoryAllocation ??
658
+ 26e6,
659
+ doNotExceedCriticalThreshold:
660
+ textureMemory?.doNotExceedCriticalThreshold ??
661
+ currentTxSettings?.doNotExceedCriticalThreshold ??
662
+ false,
663
+ };
664
+ }
665
+
666
+ /**
667
+ * Create a new scene graph node
668
+ *
669
+ * @remarks
670
+ * A node is the main graphical building block of the Renderer scene graph. It
671
+ * can be a container for other nodes, or it can be a leaf node that renders a
672
+ * solid color, gradient, image, or specific texture, using a specific shader.
673
+ *
674
+ * To create a text node, see {@link createTextNode}.
675
+ *
676
+ * See {@link CoreNode} for more details.
677
+ *
678
+ * @param props
679
+ * @returns
680
+ */
681
+ createNode<ShNode extends CoreShaderNode<any>>(
682
+ props: Partial<INodeProps<ShNode>>,
683
+ ): INode<ShNode> {
684
+ const node = this.stage.createNode(props as Partial<CoreNodeProps>);
685
+
686
+ if (!isProductionEnvironment && this.inspector) {
687
+ return this.inspector.createNode(node) as unknown as INode<ShNode>;
688
+ }
689
+
690
+ return node as unknown as INode<ShNode>;
691
+ }
692
+
693
+ /**
694
+ * Create a new scene graph text node
695
+ *
696
+ * @remarks
697
+ * A text node is the second graphical building block of the Renderer scene
698
+ * graph. It renders text using a specific text renderer that is automatically
699
+ * chosen based on the font requested and what type of fonts are installed
700
+ * into an app.
701
+ *
702
+ * See {@link ITextNode} for more details.
703
+ *
704
+ * @param props
705
+ * @returns
706
+ */
707
+ createTextNode(props: Partial<ITextNodeProps>): ITextNode {
708
+ const textNode = this.stage.createTextNode(props as CoreTextNodeProps);
709
+
710
+ if (!isProductionEnvironment && this.inspector) {
711
+ return this.inspector.createTextNode(textNode) as unknown as ITextNode;
712
+ }
713
+
714
+ return textNode as unknown as ITextNode;
715
+ }
716
+
717
+ /**
718
+ * Destroy a node
719
+ *
720
+ * @remarks
721
+ * This method destroys a node
722
+ *
723
+ * @param node
724
+ * @returns
725
+ */
726
+ destroyNode(node: INode) {
727
+ if (!isProductionEnvironment && this.inspector) {
728
+ this.inspector.destroyNode(node.id);
729
+ }
730
+
731
+ return node.destroy();
732
+ }
733
+
734
+ /**
735
+ * Create a new texture reference
736
+ *
737
+ * @remarks
738
+ * This method creates a new reference to a texture. The texture is not
739
+ * loaded until it is used on a node.
740
+ *
741
+ * It can be assigned to a node's `texture` property, or it can be used
742
+ * when creating a SubTexture.
743
+ *
744
+ * @param textureType
745
+ * @param props
746
+ * @param options
747
+ * @returns
748
+ */
749
+ createTexture<TxType extends keyof TextureMap>(
750
+ textureType: TxType,
751
+ props: ExtractProps<TextureMap[TxType]>,
752
+ ): InstanceType<TextureMap[TxType]> {
753
+ return this.stage.txManager.createTexture(textureType, props);
754
+ }
755
+
756
+ /**
757
+ * Create a new shader controller for a shader type
758
+ *
759
+ * @remarks
760
+ * This method creates a new Shader Controller for a specific shader type.
761
+ *
762
+ * If the shader has not been loaded yet, it will be loaded. Otherwise, the
763
+ * existing shader will be reused.
764
+ *
765
+ * It can be assigned to a Node's `shader` property.
766
+ *
767
+ * @param shaderType
768
+ * @param props
769
+ * @returns
770
+ */
771
+ createShader<ShType extends keyof ShaderMap>(
772
+ shType: ShType,
773
+ props?: OptionalShaderProps<ShType>,
774
+ ) {
775
+ return this.stage.shManager.createShader(shType, props) as CoreShaderNode<
776
+ NonNullable<ExtractShaderProps<ShType>>
777
+ >;
778
+ }
779
+
780
+ /**
781
+ * Get a Node by its ID
782
+ *
783
+ * @param id
784
+ * @returns
785
+ */
786
+ getNodeById(id: number): CoreNode | null {
787
+ const root = this.stage?.root;
788
+ if (!root) {
789
+ return null;
790
+ }
791
+
792
+ const findNode = (node: CoreNode): CoreNode | null => {
793
+ if (node.id === id) {
794
+ return node;
795
+ }
796
+
797
+ for (const child of node.children) {
798
+ const found = findNode(child);
799
+ if (found) {
800
+ return found;
801
+ }
802
+ }
803
+
804
+ return null;
805
+ };
806
+
807
+ return findNode(root);
808
+ }
809
+
810
+ toggleFreeze() {
811
+ throw new Error('Not implemented');
812
+ }
813
+
814
+ advanceFrame() {
815
+ throw new Error('Not implemented');
816
+ }
817
+
818
+ getBufferInfo() {
819
+ return this.stage.renderer.getBufferInfo();
820
+ }
821
+
822
+ /**
823
+ * Re-render the current frame without advancing any running animations.
824
+ *
825
+ * @remarks
826
+ * Any state changes will be reflected in the re-rendered frame. Useful for
827
+ * debugging.
828
+ *
829
+ * May not do anything if the render loop is running on a separate worker.
830
+ */
831
+ rerender() {
832
+ this.stage.requestRender();
833
+ }
834
+
835
+ /**
836
+ * Cleanup textures that are not being used
837
+ *
838
+ * @param aggressive - If true, will cleanup all textures, regardless of render status
839
+ *
840
+ * @remarks
841
+ * This can be used to free up GFX memory used by textures that are no longer
842
+ * being displayed.
843
+ *
844
+ * This routine is also called automatically when the memory used by textures
845
+ * exceeds the critical threshold on frame generation **OR** when the renderer
846
+ * is idle and the memory used by textures exceeds the target threshold.
847
+ *
848
+ * **NOTE**: This is a heavy operation and should be used sparingly.
849
+ * **NOTE2**: This will not cleanup textures that are currently being displayed.
850
+ * **NOTE3**: This will not cleanup textures that are marked as `preventCleanup`.
851
+ * **NOTE4**: This has nothing to do with the garbage collection of JavaScript.
852
+ */
853
+ cleanup() {
854
+ this.stage.cleanup();
855
+ }
856
+
857
+ /**
858
+ * Sets the clear color for the stage.
859
+ *
860
+ * @param color - The color to set as the clear color.
861
+ */
862
+ setClearColor(color: number) {
863
+ this.stage.setClearColor(color);
864
+ }
865
+
866
+ /**
867
+ * Set options for the renderer
868
+ *
869
+ * @param options
870
+ */
871
+ setOptions(options: Partial<RendererRuntimeSettings>) {
872
+ const stage = this.stage;
873
+ if (options.textureMemory !== undefined) {
874
+ const textureMemory = (options.textureMemory = this.resolveTxSettings(
875
+ options.textureMemory,
876
+ ));
877
+ stage.txMemManager.updateSettings(textureMemory);
878
+ stage.txMemManager.cleanup();
879
+ }
880
+
881
+ if (options.boundsMargin !== undefined) {
882
+ let bm = options.boundsMargin!;
883
+ options.boundsMargin = Array.isArray(bm) ? bm : [bm, bm, bm, bm];
884
+ }
885
+
886
+ const stageOptions = stage.options;
887
+ for (let key in options) {
888
+ stageOptions[key] = options[key]!;
889
+ }
890
+
891
+ if (options.inspector !== undefined && !isProductionEnvironment) {
892
+ if (options.inspector === false) {
893
+ this.inspector?.destroy();
894
+ this.inspector = null;
895
+ } else if (
896
+ this.inspector === null ||
897
+ this.inspector.constructor !== options.inspector
898
+ ) {
899
+ this.inspector = new options.inspector(
900
+ this.canvas,
901
+ stage.options as unknown as RendererMainSettings,
902
+ );
903
+ this.inspector?.createNodes(this.root as unknown as CoreNode);
904
+ }
905
+ }
906
+
907
+ let needDimensionsUpdate = false;
908
+
909
+ if (
910
+ options.deviceLogicalPixelRatio ||
911
+ options.devicePhysicalPixelRatio !== undefined
912
+ ) {
913
+ this.stage.pixelRatio =
914
+ stageOptions.devicePhysicalPixelRatio *
915
+ stageOptions.deviceLogicalPixelRatio;
916
+ this.inspector?.updateViewport(
917
+ stageOptions.appWidth,
918
+ stageOptions.appHeight,
919
+ stageOptions.deviceLogicalPixelRatio,
920
+ );
921
+ needDimensionsUpdate = true;
922
+ }
923
+
924
+ if (options.appWidth !== undefined || options.appHeight !== undefined) {
925
+ this.inspector?.updateViewport(
926
+ stageOptions.appWidth,
927
+ stageOptions.appHeight,
928
+ stageOptions.deviceLogicalPixelRatio,
929
+ );
930
+ needDimensionsUpdate = true;
931
+ }
932
+
933
+ if (options.boundsMargin !== undefined) {
934
+ this.stage.setBoundsMargin(options.boundsMargin);
935
+ }
936
+
937
+ if (options.clearColor !== undefined) {
938
+ this.stage.setClearColor(options.clearColor);
939
+ }
940
+
941
+ if (needDimensionsUpdate) {
942
+ this.updateAppDimensions();
943
+ }
944
+ }
945
+
946
+ private updateAppDimensions() {
947
+ const {
948
+ appWidth,
949
+ appHeight,
950
+ deviceLogicalPixelRatio,
951
+ devicePhysicalPixelRatio,
952
+ } = this.stage.options;
953
+
954
+ const deviceLogicalWidth = appWidth * deviceLogicalPixelRatio;
955
+ const deviceLogicalHeight = appHeight * deviceLogicalPixelRatio;
956
+
957
+ this.canvas.width = deviceLogicalWidth * devicePhysicalPixelRatio;
958
+ this.canvas.height = deviceLogicalHeight * devicePhysicalPixelRatio;
959
+
960
+ this.canvas.style.width = `${deviceLogicalWidth}px`;
961
+ this.canvas.style.height = `${deviceLogicalHeight}px`;
962
+
963
+ this.stage.renderer.updateViewport();
964
+
965
+ this.root.w = appWidth;
966
+ this.root.h = appHeight;
967
+ this.stage.updateViewportBounds();
968
+ }
969
+
970
+ get settings(): Readonly<StageOptions> {
971
+ return this.stage.options;
972
+ }
973
+
974
+ /**
975
+ * Gets the target FPS for the global render loop
976
+ *
977
+ * @returns The current target FPS (0 means no throttling)
978
+ *
979
+ * @remarks
980
+ * This controls the maximum frame rate of the entire rendering system.
981
+ * When 0, the system runs at display refresh rate.
982
+ */
983
+ get targetFPS(): number {
984
+ return this.stage.options.targetFPS || 0;
985
+ }
986
+
987
+ /**
988
+ * Sets the target FPS for the global render loop
989
+ *
990
+ * @param fps - The target FPS to set for the global render loop.
991
+ * Set to 0 or a negative value to disable throttling.
992
+ *
993
+ * @remarks
994
+ * This setting affects the entire rendering system immediately.
995
+ * All animations, rendering, and frame updates will be throttled
996
+ * to this target FPS. Provides global performance control.
997
+ *
998
+ * @example
999
+ * ```typescript
1000
+ * // Set global target to 30fps for better performance
1001
+ * renderer.targetFPS = 30;
1002
+ *
1003
+ * // Disable global throttling (use display refresh rate)
1004
+ * renderer.targetFPS = 0;
1005
+ * ```
1006
+ */
1007
+ set targetFPS(fps: number) {
1008
+ this.stage.options.targetFPS = fps > 0 ? fps : 0;
1009
+ this.stage.updateTargetFrameTime();
1010
+ }
1011
+ }