@lightningjs/renderer 2.13.0 → 3.0.0-beta1

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 (539) hide show
  1. package/LICENSE +202 -202
  2. package/NOTICE +3 -3
  3. package/README.md +147 -147
  4. package/dist/exports/canvas-shaders.d.ts +10 -0
  5. package/dist/exports/canvas-shaders.js +27 -0
  6. package/dist/exports/canvas-shaders.js.map +1 -0
  7. package/dist/exports/canvas.d.ts +7 -1
  8. package/dist/exports/canvas.js +7 -1
  9. package/dist/exports/canvas.js.map +1 -1
  10. package/dist/exports/core-api.d.ts +74 -0
  11. package/dist/exports/core-api.js +96 -0
  12. package/dist/exports/core-api.js.map +1 -0
  13. package/dist/exports/index.d.ts +15 -8
  14. package/dist/exports/index.js +7 -4
  15. package/dist/exports/index.js.map +1 -1
  16. package/dist/exports/main-api.d.ts +30 -0
  17. package/dist/exports/main-api.js +45 -0
  18. package/dist/exports/main-api.js.map +1 -0
  19. package/dist/exports/webgl-shaders.d.ts +11 -0
  20. package/dist/exports/webgl-shaders.js +28 -0
  21. package/dist/exports/webgl-shaders.js.map +1 -0
  22. package/dist/exports/webgl.d.ts +9 -1
  23. package/dist/exports/webgl.js +9 -1
  24. package/dist/exports/webgl.js.map +1 -1
  25. package/dist/src/core/CoreExtension.d.ts +12 -0
  26. package/{src/core/renderers/CoreShader.ts → dist/src/core/CoreExtension.js} +29 -41
  27. package/dist/src/core/CoreExtension.js.map +1 -0
  28. package/dist/src/core/CoreNode.d.ts +9 -5
  29. package/dist/src/core/CoreNode.js +27 -10
  30. package/dist/src/core/CoreNode.js.map +1 -1
  31. package/dist/src/core/CoreShaderManager.d.ts +29 -71
  32. package/dist/src/core/CoreShaderManager.js +110 -97
  33. package/dist/src/core/CoreShaderManager.js.map +1 -1
  34. package/dist/src/core/CoreStuff.d.ts +1 -0
  35. package/dist/src/core/CoreStuff.js +138 -0
  36. package/dist/src/core/CoreStuff.js.map +1 -0
  37. package/dist/src/core/CoreTextNode.js +1 -1
  38. package/dist/src/core/CoreTextNode.js.map +1 -1
  39. package/dist/src/core/CoreTexturizer.d.ts +14 -0
  40. package/dist/src/core/CoreTexturizer.js +47 -0
  41. package/dist/src/core/CoreTexturizer.js.map +1 -0
  42. package/dist/src/core/LngNode.d.ts +736 -0
  43. package/dist/src/core/LngNode.js +1174 -0
  44. package/dist/src/core/LngNode.js.map +1 -0
  45. package/dist/src/core/Matrix2DContext.d.ts +15 -0
  46. package/dist/src/core/Matrix2DContext.js +45 -0
  47. package/dist/src/core/Matrix2DContext.js.map +1 -0
  48. package/dist/src/core/ShaderNode.d.ts +10 -0
  49. package/dist/src/core/ShaderNode.js +30 -0
  50. package/dist/src/core/ShaderNode.js.map +1 -0
  51. package/dist/src/core/Stage.d.ts +11 -14
  52. package/dist/src/core/Stage.js +22 -25
  53. package/dist/src/core/Stage.js.map +1 -1
  54. package/dist/src/core/TextNode.d.ts +103 -0
  55. package/dist/src/core/TextNode.js +331 -0
  56. package/dist/src/core/TextNode.js.map +1 -0
  57. package/dist/src/core/animations/CoreAnimation.d.ts +0 -1
  58. package/dist/src/core/animations/CoreAnimation.js +6 -52
  59. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  60. package/dist/src/core/lib/Coords.d.ts +14 -0
  61. package/dist/src/core/lib/Coords.js +55 -0
  62. package/dist/src/core/lib/Coords.js.map +1 -0
  63. package/dist/src/core/lib/WebGlContextWrapper.d.ts +67 -54
  64. package/dist/src/core/lib/WebGlContextWrapper.js +126 -157
  65. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  66. package/dist/src/core/lib/glm/common.d.ts +162 -0
  67. package/dist/src/core/lib/glm/common.js +81 -0
  68. package/dist/src/core/lib/glm/common.js.map +1 -0
  69. package/dist/src/core/lib/glm/index.d.ts +11 -0
  70. package/dist/src/core/lib/glm/index.js +30 -0
  71. package/dist/src/core/lib/glm/index.js.map +1 -0
  72. package/dist/src/core/lib/glm/mat2.d.ts +219 -0
  73. package/dist/src/core/lib/glm/mat2.js +396 -0
  74. package/dist/src/core/lib/glm/mat2.js.map +1 -0
  75. package/dist/src/core/lib/glm/mat2d.d.ts +237 -0
  76. package/dist/src/core/lib/glm/mat2d.js +442 -0
  77. package/dist/src/core/lib/glm/mat2d.js.map +1 -0
  78. package/dist/src/core/lib/glm/mat3.d.ts +283 -0
  79. package/dist/src/core/lib/glm/mat3.js +680 -0
  80. package/dist/src/core/lib/glm/mat3.js.map +1 -0
  81. package/dist/src/core/lib/glm/mat4.d.ts +550 -0
  82. package/dist/src/core/lib/glm/mat4.js +1802 -0
  83. package/dist/src/core/lib/glm/mat4.js.map +1 -0
  84. package/dist/src/core/lib/glm/quat.d.ts +363 -0
  85. package/dist/src/core/lib/glm/quat.js +693 -0
  86. package/dist/src/core/lib/glm/quat.js.map +1 -0
  87. package/dist/src/core/lib/glm/quat2.d.ts +356 -0
  88. package/dist/src/core/lib/glm/quat2.js +754 -0
  89. package/dist/src/core/lib/glm/quat2.js.map +1 -0
  90. package/dist/src/core/lib/glm/vec2.d.ts +365 -0
  91. package/dist/src/core/lib/glm/vec2.js +569 -0
  92. package/dist/src/core/lib/glm/vec2.js.map +1 -0
  93. package/dist/src/core/lib/glm/vec3.d.ts +406 -0
  94. package/dist/src/core/lib/glm/vec3.js +720 -0
  95. package/dist/src/core/lib/glm/vec3.js.map +1 -0
  96. package/dist/src/core/lib/glm/vec4.d.ts +330 -0
  97. package/dist/src/core/lib/glm/vec4.js +608 -0
  98. package/dist/src/core/lib/glm/vec4.js.map +1 -0
  99. package/dist/src/core/lib/textureCompression.js +0 -1
  100. package/dist/src/core/lib/textureCompression.js.map +1 -1
  101. package/dist/src/core/lib/utils.d.ts +4 -0
  102. package/dist/src/core/lib/utils.js +26 -0
  103. package/dist/src/core/lib/utils.js.map +1 -1
  104. package/dist/src/core/platform.js +1 -0
  105. package/dist/src/core/platform.js.map +1 -1
  106. package/dist/src/core/renderers/CoreRenderer.d.ts +11 -21
  107. package/dist/src/core/renderers/CoreRenderer.js +0 -6
  108. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  109. package/dist/src/core/renderers/CoreShaderManager.d.ts +19 -0
  110. package/dist/src/core/renderers/CoreShaderManager.js +33 -0
  111. package/dist/src/core/renderers/CoreShaderManager.js.map +1 -0
  112. package/dist/src/core/renderers/CoreShaderNode.d.ts +59 -0
  113. package/dist/src/core/renderers/CoreShaderNode.js +107 -0
  114. package/dist/src/core/renderers/CoreShaderNode.js.map +1 -0
  115. package/dist/src/core/renderers/CoreShaderProgram.d.ts +4 -0
  116. package/dist/src/core/renderers/CoreShaderProgram.js +20 -0
  117. package/dist/src/core/renderers/CoreShaderProgram.js.map +1 -0
  118. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +36 -0
  119. package/dist/src/core/renderers/canvas/CanvasRenderer.js +212 -0
  120. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -0
  121. package/dist/src/core/renderers/canvas/CanvasShaderNode.d.ts +21 -0
  122. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +60 -0
  123. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -0
  124. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +16 -0
  125. package/dist/src/core/renderers/canvas/CanvasTexture.js +123 -0
  126. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -0
  127. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +0 -13
  128. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +192 -113
  129. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +1 -1
  130. package/dist/src/core/renderers/canvas/internal/ColorUtils.d.ts +2 -0
  131. package/dist/src/core/renderers/canvas/internal/ColorUtils.js +14 -0
  132. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +1 -1
  133. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.d.ts +27 -0
  134. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.js +82 -0
  135. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.js.map +1 -0
  136. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.d.ts +11 -0
  137. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.js +34 -0
  138. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.js.map +1 -0
  139. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +12 -0
  140. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +55 -0
  141. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -0
  142. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +9 -0
  143. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +38 -0
  144. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -0
  145. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +57 -0
  146. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +227 -0
  147. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -0
  148. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +36 -0
  149. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +107 -0
  150. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +1 -0
  151. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +134 -0
  152. package/dist/src/core/renderers/webgl/WebGlRenderer.js +546 -0
  153. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -0
  154. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +221 -0
  155. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +334 -0
  156. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -0
  157. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +35 -0
  158. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +195 -0
  159. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -0
  160. package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +32 -5
  161. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +50 -0
  162. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  163. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +45 -45
  164. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +61 -61
  165. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +93 -93
  166. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +63 -63
  167. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +62 -62
  168. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +15 -15
  169. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +6 -6
  170. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +15 -15
  171. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +15 -15
  172. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +15 -15
  173. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +42 -42
  174. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +44 -44
  175. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +3 -3
  176. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +22 -22
  177. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +28 -28
  178. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +10 -10
  179. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +37 -37
  180. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +19 -19
  181. package/dist/src/core/scene/Scene.d.ts +59 -0
  182. package/dist/src/core/scene/Scene.js +106 -0
  183. package/dist/src/core/scene/Scene.js.map +1 -0
  184. package/dist/src/core/shaders/canvas/Border.d.ts +9 -0
  185. package/dist/src/core/shaders/canvas/Border.js +57 -0
  186. package/dist/src/core/shaders/canvas/Border.js.map +1 -0
  187. package/dist/src/core/shaders/canvas/HolePunch.d.ts +7 -0
  188. package/dist/src/core/shaders/canvas/HolePunch.js +38 -0
  189. package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -0
  190. package/dist/src/core/shaders/canvas/LinearGradient.d.ts +10 -0
  191. package/dist/src/core/shaders/canvas/LinearGradient.js +46 -0
  192. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -0
  193. package/dist/src/core/shaders/canvas/RadialGradient.d.ts +11 -0
  194. package/dist/src/core/shaders/canvas/RadialGradient.js +68 -0
  195. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -0
  196. package/dist/src/core/shaders/canvas/Rounded.d.ts +7 -0
  197. package/dist/src/core/shaders/canvas/Rounded.js +33 -0
  198. package/dist/src/core/shaders/canvas/Rounded.js.map +1 -0
  199. package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +7 -0
  200. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +35 -0
  201. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -0
  202. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +8 -0
  203. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +39 -0
  204. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -0
  205. package/dist/src/core/shaders/canvas/RoundedWithShadow.d.ts +7 -0
  206. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +38 -0
  207. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -0
  208. package/dist/src/core/shaders/canvas/Shadow.d.ts +8 -0
  209. package/dist/src/core/shaders/canvas/Shadow.js +31 -0
  210. package/dist/src/core/shaders/canvas/Shadow.js.map +1 -0
  211. package/dist/src/core/shaders/canvas/utils/render.d.ts +5 -0
  212. package/dist/src/core/shaders/canvas/utils/render.js +84 -0
  213. package/dist/src/core/shaders/canvas/utils/render.js.map +1 -0
  214. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +37 -0
  215. package/dist/src/core/shaders/templates/BorderTemplate.js +73 -0
  216. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -0
  217. package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +46 -0
  218. package/dist/src/core/shaders/templates/HolePunchTemplate.js +35 -0
  219. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -0
  220. package/dist/src/core/shaders/templates/LinearGradientTemplate.d.ts +23 -0
  221. package/dist/src/core/shaders/templates/LinearGradientTemplate.js +47 -0
  222. package/dist/src/core/shaders/templates/LinearGradientTemplate.js.map +1 -0
  223. package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +31 -0
  224. package/dist/src/core/shaders/templates/RadialGradientTemplate.js +49 -0
  225. package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +1 -0
  226. package/dist/src/core/shaders/templates/RoundedTemplate.d.ts +29 -0
  227. package/dist/src/core/shaders/templates/RoundedTemplate.js +67 -0
  228. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -0
  229. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +7 -0
  230. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js +24 -0
  231. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js.map +1 -0
  232. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +6 -0
  233. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js +23 -0
  234. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js.map +1 -0
  235. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +6 -0
  236. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js +23 -0
  237. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js.map +1 -0
  238. package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +34 -0
  239. package/dist/src/core/shaders/templates/ShadowTemplate.js +66 -0
  240. package/dist/src/core/shaders/templates/ShadowTemplate.js.map +1 -0
  241. package/dist/src/core/shaders/templates/shaderUtils.d.ts +5 -0
  242. package/dist/src/core/shaders/templates/shaderUtils.js +41 -0
  243. package/dist/src/core/shaders/templates/shaderUtils.js.map +1 -0
  244. package/dist/src/core/shaders/webgl/Border.d.ts +3 -0
  245. package/dist/src/core/shaders/webgl/Border.js +87 -0
  246. package/dist/src/core/shaders/webgl/Border.js.map +1 -0
  247. package/dist/src/core/shaders/webgl/Default.d.ts +2 -0
  248. package/dist/src/core/shaders/webgl/Default.js +86 -0
  249. package/dist/src/core/shaders/webgl/Default.js.map +1 -0
  250. package/dist/src/core/shaders/webgl/DefaultBatched.d.ts +2 -0
  251. package/dist/src/core/shaders/webgl/DefaultBatched.js +104 -0
  252. package/dist/src/core/shaders/webgl/DefaultBatched.js.map +1 -0
  253. package/dist/src/core/shaders/webgl/HolePunch.d.ts +3 -0
  254. package/dist/src/core/shaders/webgl/HolePunch.js +64 -0
  255. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -0
  256. package/dist/src/core/shaders/webgl/LinearGradient.d.ts +3 -0
  257. package/dist/src/core/shaders/webgl/LinearGradient.js +75 -0
  258. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -0
  259. package/dist/src/core/shaders/webgl/RadialGradient.d.ts +3 -0
  260. package/dist/src/core/shaders/webgl/RadialGradient.js +73 -0
  261. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -0
  262. package/dist/src/core/shaders/webgl/Rounded.d.ts +7 -0
  263. package/dist/src/core/shaders/webgl/Rounded.js +86 -0
  264. package/dist/src/core/shaders/webgl/Rounded.js.map +1 -0
  265. package/dist/src/core/shaders/webgl/RoundedWithBorder.d.ts +3 -0
  266. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +97 -0
  267. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -0
  268. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.d.ts +3 -0
  269. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +112 -0
  270. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -0
  271. package/dist/src/core/shaders/webgl/RoundedWithShadow.d.ts +3 -0
  272. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +84 -0
  273. package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -0
  274. package/dist/src/core/shaders/webgl/SdfShader.d.ts +32 -0
  275. package/dist/src/core/shaders/webgl/SdfShader.js +116 -0
  276. package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -0
  277. package/dist/src/core/shaders/webgl/Shadow.d.ts +3 -0
  278. package/dist/src/core/shaders/webgl/Shadow.js +110 -0
  279. package/dist/src/core/shaders/webgl/Shadow.js.map +1 -0
  280. package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +1 -1
  281. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +2 -2
  282. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
  283. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +6 -0
  284. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
  285. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +2 -3
  286. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +34 -30
  287. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  288. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.d.ts +20 -0
  289. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js +55 -0
  290. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js.map +1 -0
  291. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +1 -4
  292. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  293. package/dist/src/core/textures/Texture.d.ts +1 -1
  294. package/dist/src/main-api/ICoreDriver.d.ts +27 -0
  295. package/dist/src/main-api/ICoreDriver.js +20 -0
  296. package/dist/src/main-api/ICoreDriver.js.map +1 -0
  297. package/dist/src/main-api/INode.d.ts +9 -9
  298. package/dist/src/main-api/IRenderDriver.d.ts +20 -0
  299. package/dist/src/main-api/IRenderDriver.js +20 -0
  300. package/dist/src/main-api/IRenderDriver.js.map +1 -0
  301. package/dist/src/main-api/IShaderController.d.ts +14 -0
  302. package/dist/src/main-api/IShaderController.js +30 -0
  303. package/dist/src/main-api/IShaderController.js.map +1 -0
  304. package/dist/src/main-api/IShaderNode.d.ts +17 -0
  305. package/dist/src/main-api/IShaderNode.js +19 -0
  306. package/dist/src/main-api/IShaderNode.js.map +1 -0
  307. package/dist/src/main-api/Renderer.d.ts +8 -91
  308. package/dist/src/main-api/Renderer.js +3 -54
  309. package/dist/src/main-api/Renderer.js.map +1 -1
  310. package/dist/src/main-api/RendererMain.d.ts +375 -0
  311. package/dist/src/main-api/RendererMain.js +365 -0
  312. package/dist/src/main-api/RendererMain.js.map +1 -0
  313. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.d.ts +9 -0
  314. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js +38 -0
  315. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js.map +1 -0
  316. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.d.ts +56 -0
  317. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js +101 -0
  318. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js.map +1 -0
  319. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.d.ts +32 -0
  320. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js +28 -0
  321. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js.map +1 -0
  322. package/dist/src/render-drivers/main/MainCoreDriver.d.ts +24 -0
  323. package/dist/src/render-drivers/main/MainCoreDriver.js +118 -0
  324. package/dist/src/render-drivers/main/MainCoreDriver.js.map +1 -0
  325. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +99 -0
  326. package/dist/src/render-drivers/main/MainOnlyNode.js +396 -0
  327. package/dist/src/render-drivers/main/MainOnlyNode.js.map +1 -0
  328. package/dist/src/render-drivers/main/MainOnlyShaderController.d.ts +6 -0
  329. package/dist/src/render-drivers/main/MainOnlyShaderController.js +15 -0
  330. package/dist/src/render-drivers/main/MainOnlyShaderController.js.map +1 -0
  331. package/dist/src/render-drivers/main/MainOnlyShaderNode.d.ts +7 -0
  332. package/dist/src/render-drivers/main/MainOnlyShaderNode.js +34 -0
  333. package/dist/src/render-drivers/main/MainOnlyShaderNode.js.map +1 -0
  334. package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +47 -0
  335. package/dist/src/render-drivers/main/MainOnlyTextNode.js +205 -0
  336. package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +1 -0
  337. package/dist/src/render-drivers/main/MainRenderDriver.d.ts +17 -0
  338. package/dist/src/render-drivers/main/MainRenderDriver.js +88 -0
  339. package/dist/src/render-drivers/main/MainRenderDriver.js.map +1 -0
  340. package/dist/src/render-drivers/threadx/NodeStruct.d.ts +90 -0
  341. package/dist/src/render-drivers/threadx/NodeStruct.js +281 -0
  342. package/dist/src/render-drivers/threadx/NodeStruct.js.map +1 -0
  343. package/dist/src/render-drivers/threadx/SharedNode.d.ts +39 -0
  344. package/dist/src/render-drivers/threadx/SharedNode.js +60 -0
  345. package/dist/src/render-drivers/threadx/SharedNode.js.map +1 -0
  346. package/dist/src/render-drivers/threadx/TextNodeStruct.d.ts +44 -0
  347. package/dist/src/render-drivers/threadx/TextNodeStruct.js +201 -0
  348. package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +1 -0
  349. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +28 -0
  350. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +234 -0
  351. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +1 -0
  352. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.d.ts +20 -0
  353. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js +84 -0
  354. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js.map +1 -0
  355. package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +44 -0
  356. package/dist/src/render-drivers/threadx/ThreadXMainNode.js +154 -0
  357. package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +1 -0
  358. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.d.ts +6 -0
  359. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.js +16 -0
  360. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.js.map +1 -0
  361. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.d.ts +7 -0
  362. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.js +15 -0
  363. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.js.map +1 -0
  364. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.d.ts +28 -0
  365. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +55 -0
  366. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +1 -0
  367. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.d.ts +21 -0
  368. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js +198 -0
  369. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js.map +1 -0
  370. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +70 -0
  371. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js +32 -0
  372. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +1 -0
  373. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.d.ts +19 -0
  374. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +177 -0
  375. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +1 -0
  376. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.d.ts +27 -0
  377. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +108 -0
  378. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +1 -0
  379. package/dist/src/render-drivers/threadx/worker/renderer.d.ts +1 -0
  380. package/dist/src/render-drivers/threadx/worker/renderer.js +145 -0
  381. package/dist/src/render-drivers/threadx/worker/renderer.js.map +1 -0
  382. package/dist/src/render-drivers/utils.d.ts +12 -0
  383. package/dist/src/render-drivers/utils.js +69 -0
  384. package/dist/src/render-drivers/utils.js.map +1 -0
  385. package/dist/src/utils.d.ts +6 -0
  386. package/dist/src/utils.js +18 -0
  387. package/dist/src/utils.js.map +1 -1
  388. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  389. package/exports/canvas-shaders.ts +28 -0
  390. package/exports/canvas.ts +45 -39
  391. package/exports/index.ts +89 -89
  392. package/exports/inspector.ts +24 -24
  393. package/exports/utils.ts +44 -44
  394. package/exports/webgl-shaders.ts +28 -0
  395. package/exports/webgl.ts +50 -38
  396. package/package.json +4 -1
  397. package/scripts/please-use-pnpm.js +13 -13
  398. package/src/common/CommonTypes.ts +146 -146
  399. package/src/common/EventEmitter.ts +77 -77
  400. package/src/common/IAnimationController.ts +92 -92
  401. package/src/common/IEventEmitter.ts +28 -28
  402. package/src/core/CoreNode.test.ts +203 -202
  403. package/src/core/CoreNode.ts +2476 -2455
  404. package/src/core/CoreShaderManager.ts +193 -292
  405. package/src/core/CoreTextNode.ts +448 -455
  406. package/src/core/CoreTextureManager.ts +597 -597
  407. package/src/core/Stage.ts +740 -743
  408. package/src/core/TextureMemoryManager.ts +395 -395
  409. package/src/core/animations/AnimationManager.ts +38 -38
  410. package/src/core/animations/CoreAnimation.ts +284 -340
  411. package/src/core/animations/CoreAnimationController.ts +157 -157
  412. package/src/core/lib/ContextSpy.ts +41 -41
  413. package/src/core/lib/ImageWorker.ts +279 -279
  414. package/src/core/lib/Matrix3d.ts +244 -244
  415. package/src/core/lib/RenderCoords.ts +86 -86
  416. package/src/core/lib/WebGlContextWrapper.ts +1324 -1332
  417. package/src/core/lib/textureCompression.ts +152 -152
  418. package/src/core/lib/textureSvg.ts +78 -78
  419. package/src/core/lib/utils.ts +361 -310
  420. package/src/core/lib/validateImageBitmap.ts +76 -76
  421. package/src/core/platform.ts +64 -63
  422. package/src/core/renderers/CoreContextTexture.ts +43 -43
  423. package/src/core/renderers/CoreRenderOp.ts +22 -22
  424. package/src/core/renderers/CoreRenderer.ts +107 -115
  425. package/src/core/renderers/CoreShaderNode.ts +171 -0
  426. package/src/core/renderers/{canvas/shaders/UnsupportedShader.ts → CoreShaderProgram.ts} +23 -48
  427. package/src/core/renderers/canvas/CanvasRenderer.ts +299 -0
  428. package/src/core/renderers/canvas/CanvasShaderNode.ts +99 -0
  429. package/src/core/renderers/canvas/{CanvasCoreTexture.ts → CanvasTexture.ts} +153 -153
  430. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +220 -231
  431. package/src/core/renderers/canvas/internal/ColorUtils.ts +85 -69
  432. package/src/core/renderers/webgl/{WebGlCoreCtxRenderTexture.ts → WebGlCtxRenderTexture.ts} +86 -86
  433. package/src/core/renderers/webgl/{WebGlCoreCtxSubTexture.ts → WebGlCtxSubTexture.ts} +50 -50
  434. package/src/core/renderers/webgl/{WebGlCoreCtxTexture.ts → WebGlCtxTexture.ts} +301 -301
  435. package/src/core/renderers/webgl/{WebGlCoreRenderOp.ts → WebGlRenderOp.ts} +145 -125
  436. package/src/core/renderers/webgl/{WebGlCoreRenderer.ts → WebGlRenderer.ts} +715 -815
  437. package/src/core/renderers/webgl/WebGlShaderNode.ts +433 -0
  438. package/src/core/renderers/webgl/WebGlShaderProgram.ts +310 -0
  439. package/src/core/renderers/webgl/internal/BufferCollection.ts +54 -54
  440. package/src/core/renderers/webgl/internal/RendererUtils.ts +155 -155
  441. package/src/core/renderers/webgl/internal/ShaderUtils.ts +281 -143
  442. package/src/core/renderers/webgl/internal/WebGlUtils.ts +35 -35
  443. package/src/core/shaders/canvas/Border.ts +78 -0
  444. package/src/core/shaders/canvas/HolePunch.ts +62 -0
  445. package/src/core/shaders/canvas/LinearGradient.ts +69 -0
  446. package/src/core/shaders/canvas/RadialGradient.ts +113 -0
  447. package/src/core/shaders/canvas/Rounded.ts +55 -0
  448. package/src/core/shaders/canvas/RoundedWithBorder.ts +68 -0
  449. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +88 -0
  450. package/src/core/shaders/canvas/RoundedWithShadow.ts +69 -0
  451. package/src/core/shaders/canvas/Shadow.ts +52 -0
  452. package/src/core/shaders/canvas/utils/render.ts +151 -0
  453. package/src/core/shaders/templates/BorderTemplate.ts +115 -0
  454. package/src/core/shaders/templates/HolePunchTemplate.ts +82 -0
  455. package/src/core/shaders/templates/LinearGradientTemplate.ts +71 -0
  456. package/src/core/shaders/templates/RadialGradientTemplate.ts +81 -0
  457. package/src/core/shaders/templates/RoundedTemplate.ts +98 -0
  458. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +38 -0
  459. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +35 -0
  460. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +35 -0
  461. package/src/core/shaders/templates/ShadowTemplate.ts +106 -0
  462. package/src/core/shaders/templates/shaderUtils.ts +47 -0
  463. package/src/core/shaders/webgl/Border.ts +96 -0
  464. package/src/core/shaders/webgl/Default.ts +89 -0
  465. package/src/core/shaders/webgl/DefaultBatched.ts +129 -0
  466. package/src/core/shaders/webgl/HolePunch.ts +78 -0
  467. package/src/core/shaders/webgl/LinearGradient.ts +81 -0
  468. package/src/core/shaders/webgl/RadialGradient.ts +84 -0
  469. package/src/core/shaders/webgl/Rounded.ts +117 -0
  470. package/src/core/shaders/webgl/RoundedWithBorder.ts +114 -0
  471. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +133 -0
  472. package/src/core/shaders/webgl/RoundedWithShadow.ts +98 -0
  473. package/src/core/shaders/webgl/SdfShader.ts +137 -0
  474. package/src/core/shaders/webgl/Shadow.ts +115 -0
  475. package/src/core/text-rendering/TextRenderingUtils.ts +36 -36
  476. package/src/core/text-rendering/TextTextureRendererUtils.ts +263 -263
  477. package/src/core/text-rendering/TrFontManager.ts +183 -183
  478. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +176 -176
  479. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +139 -139
  480. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +173 -173
  481. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +171 -171
  482. package/src/core/text-rendering/font-face-types/TrFontFace.ts +187 -187
  483. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +94 -94
  484. package/src/core/text-rendering/font-face-types/utils.ts +39 -39
  485. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +509 -509
  486. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +815 -808
  487. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +841 -853
  488. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +48 -48
  489. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +66 -66
  490. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +52 -52
  491. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +32 -32
  492. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +117 -117
  493. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +133 -133
  494. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +38 -38
  495. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +408 -408
  496. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +49 -49
  497. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +52 -52
  498. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +205 -205
  499. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +93 -93
  500. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +40 -40
  501. package/src/core/text-rendering/renderers/TextRenderer.ts +550 -557
  502. package/src/core/textures/ColorTexture.ts +102 -102
  503. package/src/core/textures/ImageTexture.ts +376 -376
  504. package/src/core/textures/NoiseTexture.ts +104 -104
  505. package/src/core/textures/RenderTexture.ts +85 -85
  506. package/src/core/textures/SubTexture.ts +205 -205
  507. package/src/core/textures/Texture.ts +337 -337
  508. package/src/core/utils.ts +227 -227
  509. package/src/env.d.ts +7 -7
  510. package/src/main-api/INode.ts +99 -101
  511. package/src/main-api/Inspector.ts +522 -522
  512. package/src/main-api/Renderer.ts +649 -751
  513. package/src/main-api/utils.ts +45 -45
  514. package/src/utils.ts +267 -248
  515. package/COPYING +0 -1
  516. package/src/core/renderers/canvas/CanvasCoreRenderer.ts +0 -375
  517. package/src/core/renderers/webgl/WebGlCoreShader.ts +0 -362
  518. package/src/core/renderers/webgl/shaders/DefaultShader.ts +0 -93
  519. package/src/core/renderers/webgl/shaders/DefaultShaderBatched.ts +0 -132
  520. package/src/core/renderers/webgl/shaders/DynamicShader.ts +0 -580
  521. package/src/core/renderers/webgl/shaders/RoundedRectangle.ts +0 -167
  522. package/src/core/renderers/webgl/shaders/SdfShader.ts +0 -204
  523. package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +0 -101
  524. package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +0 -87
  525. package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +0 -101
  526. package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +0 -101
  527. package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +0 -101
  528. package/src/core/renderers/webgl/shaders/effects/EffectUtils.ts +0 -159
  529. package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +0 -127
  530. package/src/core/renderers/webgl/shaders/effects/GlitchEffect.ts +0 -148
  531. package/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.ts +0 -67
  532. package/src/core/renderers/webgl/shaders/effects/HolePunchEffect.ts +0 -157
  533. package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +0 -171
  534. package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +0 -168
  535. package/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.ts +0 -187
  536. package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +0 -110
  537. package/src/core/renderers/webgl/shaders/effects/ShaderEffect.ts +0 -196
  538. package/src/main-api/DynamicShaderController.ts +0 -104
  539. package/src/main-api/ShaderController.ts +0 -80
package/src/core/Stage.ts CHANGED
@@ -1,743 +1,740 @@
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
- import { startLoop, getTimeStamp } from './platform.js';
20
- import { assertTruthy, setPremultiplyMode } from '../utils.js';
21
- import { AnimationManager } from './animations/AnimationManager.js';
22
- import {
23
- UpdateType,
24
- CoreNode,
25
- CoreNodeRenderState,
26
- type CoreNodeProps,
27
- } from './CoreNode.js';
28
- import { CoreTextureManager } from './CoreTextureManager.js';
29
- import { TrFontManager } from './text-rendering/TrFontManager.js';
30
- import { CoreShaderManager, type ShaderMap } from './CoreShaderManager.js';
31
- import {
32
- TextRenderer,
33
- type TextRendererMap,
34
- type TrProps,
35
- } from './text-rendering/renderers/TextRenderer.js';
36
-
37
- import { EventEmitter } from '../common/EventEmitter.js';
38
- import { ContextSpy } from './lib/ContextSpy.js';
39
- import type {
40
- FpsUpdatePayload,
41
- FrameTickPayload,
42
- QuadsUpdatePayload,
43
- } from '../common/CommonTypes.js';
44
- import {
45
- TextureMemoryManager,
46
- type TextureMemoryManagerSettings,
47
- } from './TextureMemoryManager.js';
48
- import type { CoreRendererOptions } from './renderers/CoreRenderer.js';
49
- import { CoreRenderer } from './renderers/CoreRenderer.js';
50
- import type { WebGlCoreRenderer } from './renderers/webgl/WebGlCoreRenderer.js';
51
- import type { CanvasCoreRenderer } from './renderers/canvas/CanvasCoreRenderer.js';
52
- import type { BaseShaderController } from '../main-api/ShaderController.js';
53
- import { CoreTextNode, type CoreTextNodeProps } from './CoreTextNode.js';
54
- import { santizeCustomDataMap } from '../main-api/utils.js';
55
- import type { SdfTextRenderer } from './text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js';
56
- import type { CanvasTextRenderer } from './text-rendering/renderers/CanvasTextRenderer.js';
57
- import { createBound, createPreloadBounds, type Bound } from './lib/utils.js';
58
- import type { Texture } from './textures/Texture.js';
59
- import { ColorTexture } from './textures/ColorTexture.js';
60
-
61
- export interface StageOptions {
62
- appWidth: number;
63
- appHeight: number;
64
- textureMemory: TextureMemoryManagerSettings;
65
- boundsMargin: number | [number, number, number, number];
66
- deviceLogicalPixelRatio: number;
67
- devicePhysicalPixelRatio: number;
68
- canvas: HTMLCanvasElement | OffscreenCanvas;
69
- clearColor: number;
70
- fpsUpdateInterval: number;
71
- enableContextSpy: boolean;
72
- forceWebGL2: boolean;
73
- numImageWorkers: number;
74
- renderEngine: typeof WebGlCoreRenderer | typeof CanvasCoreRenderer;
75
- eventBus: EventEmitter;
76
- quadBufferSize: number;
77
- fontEngines: (typeof CanvasTextRenderer | typeof SdfTextRenderer)[];
78
- inspector: boolean;
79
- strictBounds: boolean;
80
- textureProcessingTimeLimit: number;
81
- createImageBitmapSupport: 'auto' | 'basic' | 'options' | 'full';
82
- }
83
-
84
- export type StageFpsUpdateHandler = (
85
- stage: Stage,
86
- fpsData: FpsUpdatePayload,
87
- ) => void;
88
-
89
- export type StageFrameTickHandler = (
90
- stage: Stage,
91
- frameTickData: FrameTickPayload,
92
- ) => void;
93
-
94
- const bufferMemory = 2e6;
95
- const autoStart = true;
96
-
97
- export class Stage {
98
- /// Module Instances
99
- public readonly animationManager: AnimationManager;
100
- public readonly txManager: CoreTextureManager;
101
- public readonly txMemManager: TextureMemoryManager;
102
- public readonly fontManager: TrFontManager;
103
- public readonly textRenderers: Partial<TextRendererMap>;
104
- public readonly shManager: CoreShaderManager;
105
- public readonly renderer: CoreRenderer;
106
- public readonly root: CoreNode;
107
- public boundsMargin: [number, number, number, number];
108
- public readonly defShaderCtr: BaseShaderController;
109
- public readonly strictBound: Bound;
110
- public readonly preloadBound: Bound;
111
- public readonly strictBounds: boolean;
112
- public readonly defaultTexture: Texture | null = null;
113
-
114
- /**
115
- * Renderer Event Bus for the Stage to emit events onto
116
- *
117
- * @remarks
118
- * In reality this is just the RendererMain instance, which is an EventEmitter.
119
- * this allows us to directly emit events from the Stage to RendererMain
120
- * without having to set up forwarding handlers.
121
- */
122
- public readonly eventBus: EventEmitter;
123
-
124
- /// State
125
- deltaTime = 0;
126
- lastFrameTime = 0;
127
- currentFrameTime = 0;
128
- private fpsNumFrames = 0;
129
- private fpsElapsedTime = 0;
130
- private numQuadsRendered = 0;
131
- private renderRequested = false;
132
- private frameEventQueue: [name: string, payload: unknown][] = [];
133
- private fontResolveMap: Record<string, CanvasTextRenderer | SdfTextRenderer> =
134
- {};
135
-
136
- /// Debug data
137
- contextSpy: ContextSpy | null = null;
138
-
139
- /**
140
- * Stage constructor
141
- */
142
- constructor(readonly options: StageOptions) {
143
- const {
144
- canvas,
145
- clearColor,
146
- appWidth,
147
- appHeight,
148
- boundsMargin,
149
- enableContextSpy,
150
- forceWebGL2,
151
- numImageWorkers,
152
- textureMemory,
153
- renderEngine,
154
- fontEngines,
155
- createImageBitmapSupport,
156
- } = options;
157
-
158
- this.eventBus = options.eventBus;
159
- this.txManager = new CoreTextureManager(this, {
160
- numImageWorkers,
161
- createImageBitmapSupport,
162
- });
163
-
164
- // Wait for the Texture Manager to initialize
165
- // once it does, request a render
166
- this.txManager.on('initialized', () => {
167
- this.requestRender();
168
- });
169
-
170
- this.txMemManager = new TextureMemoryManager(this, textureMemory);
171
- this.shManager = new CoreShaderManager();
172
- this.animationManager = new AnimationManager();
173
- this.contextSpy = enableContextSpy ? new ContextSpy() : null;
174
- this.strictBounds = options.strictBounds;
175
-
176
- let bm = [0, 0, 0, 0] as [number, number, number, number];
177
- if (boundsMargin) {
178
- bm = Array.isArray(boundsMargin)
179
- ? boundsMargin
180
- : [boundsMargin, boundsMargin, boundsMargin, boundsMargin];
181
- }
182
- this.boundsMargin = bm;
183
-
184
- // precalculate our viewport bounds
185
- this.strictBound = createBound(0, 0, appWidth, appHeight);
186
- this.preloadBound = createPreloadBounds(this.strictBound, bm);
187
-
188
- const rendererOptions: CoreRendererOptions = {
189
- stage: this,
190
- canvas,
191
- pixelRatio:
192
- options.devicePhysicalPixelRatio * options.deviceLogicalPixelRatio,
193
- clearColor: clearColor ?? 0xff000000,
194
- bufferMemory,
195
- txManager: this.txManager,
196
- txMemManager: this.txMemManager,
197
- shManager: this.shManager,
198
- contextSpy: this.contextSpy,
199
- forceWebGL2,
200
- };
201
-
202
- this.renderer = new renderEngine(rendererOptions);
203
- const renderMode = this.renderer.mode || 'webgl';
204
-
205
- this.createDefaultTexture();
206
- this.defShaderCtr = this.renderer.getDefShaderCtr();
207
- setPremultiplyMode(renderMode);
208
-
209
- // Must do this after renderer is created
210
- this.txManager.renderer = this.renderer;
211
-
212
- // Create text renderers
213
- this.textRenderers = {};
214
- fontEngines.forEach((fontEngineConstructor) => {
215
- const fontEngineInstance = new fontEngineConstructor(this);
216
- const className = fontEngineInstance.type;
217
-
218
- if (className === 'sdf' && renderMode === 'canvas') {
219
- console.warn(
220
- 'SdfTextRenderer is not compatible with Canvas renderer. Skipping...',
221
- );
222
- return;
223
- }
224
-
225
- if (fontEngineInstance instanceof TextRenderer) {
226
- if (className === 'canvas') {
227
- this.textRenderers['canvas'] =
228
- fontEngineInstance as CanvasTextRenderer;
229
- } else if (className === 'sdf') {
230
- this.textRenderers['sdf'] = fontEngineInstance as SdfTextRenderer;
231
- }
232
- }
233
- });
234
-
235
- if (Object.keys(this.textRenderers).length === 0) {
236
- console.warn('No text renderers available. Your text will not render.');
237
- }
238
-
239
- this.fontManager = new TrFontManager(this.textRenderers);
240
-
241
- // create root node
242
- const rootNode = new CoreNode(this, {
243
- x: 0,
244
- y: 0,
245
- width: appWidth,
246
- height: appHeight,
247
- alpha: 1,
248
- autosize: false,
249
- boundsMargin: null,
250
- clipping: false,
251
- color: 0x00000000,
252
- colorTop: 0x00000000,
253
- colorBottom: 0x00000000,
254
- colorLeft: 0x00000000,
255
- colorRight: 0x00000000,
256
- colorTl: 0x00000000,
257
- colorTr: 0x00000000,
258
- colorBl: 0x00000000,
259
- colorBr: 0x00000000,
260
- zIndex: 0,
261
- zIndexLocked: 0,
262
- scaleX: 1,
263
- scaleY: 1,
264
- mountX: 0,
265
- mountY: 0,
266
- mount: 0,
267
- pivot: 0.5,
268
- pivotX: 0.5,
269
- pivotY: 0.5,
270
- rotation: 0,
271
- parent: null,
272
- texture: null,
273
- textureOptions: {},
274
- shader: this.defShaderCtr,
275
- rtt: false,
276
- src: null,
277
- scale: 1,
278
- preventCleanup: false,
279
- strictBounds: this.strictBounds,
280
- });
281
-
282
- this.root = rootNode;
283
-
284
- // execute platform start loop
285
- if (autoStart) {
286
- startLoop(this);
287
- }
288
- }
289
-
290
- setClearColor(color: number) {
291
- this.renderer.updateClearColor(color);
292
- this.renderRequested = true;
293
- }
294
-
295
- updateFrameTime() {
296
- const newFrameTime = getTimeStamp();
297
- this.lastFrameTime = this.currentFrameTime;
298
- this.currentFrameTime = newFrameTime;
299
- this.deltaTime = !this.lastFrameTime
300
- ? 100 / 6
301
- : newFrameTime - this.lastFrameTime;
302
- this.txManager.frameTime = newFrameTime;
303
- this.txMemManager.frameTime = newFrameTime;
304
-
305
- // This event is emitted at the beginning of the frame (before any updates
306
- // or rendering), so no need to to use `stage.queueFrameEvent` here.
307
- this.eventBus.emit('frameTick', {
308
- time: this.currentFrameTime,
309
- delta: this.deltaTime,
310
- });
311
- }
312
-
313
- /**
314
- * Create default PixelTexture
315
- */
316
- createDefaultTexture() {
317
- console.log('Creating default texture');
318
- (this.defaultTexture as ColorTexture) = this.txManager.createTexture(
319
- 'ColorTexture',
320
- {
321
- color: 0xffffffff,
322
- },
323
- );
324
-
325
- assertTruthy(this.defaultTexture instanceof ColorTexture);
326
- this.txManager.loadTexture(this.defaultTexture, true);
327
-
328
- // Mark the default texture as ALWAYS renderable
329
- // This prevents it from ever being cleaned up.
330
- // Fixes https://github.com/lightning-js/renderer/issues/262
331
- this.defaultTexture.setRenderableOwner(this, true);
332
-
333
- // When the default texture is loaded, request a render in case the
334
- // RAF is paused. Fixes: https://github.com/lightning-js/renderer/issues/123
335
- this.defaultTexture.once('loaded', () => {
336
- this.requestRender();
337
- });
338
- }
339
-
340
- /**
341
- * Update animations
342
- */
343
- updateAnimations() {
344
- const { animationManager } = this;
345
- if (!this.root) {
346
- return;
347
- }
348
- // step animation
349
- animationManager.update(this.deltaTime);
350
- }
351
-
352
- /**
353
- * Check if the scene has updates
354
- */
355
- hasSceneUpdates() {
356
- return (
357
- !!this.root.updateType ||
358
- this.renderRequested ||
359
- this.txManager.hasUpdates()
360
- );
361
- }
362
-
363
- /**
364
- * Start a new frame draw
365
- */
366
- drawFrame() {
367
- const { renderer, renderRequested } = this;
368
- assertTruthy(renderer);
369
-
370
- // Update tree if needed
371
- if (this.root.updateType !== 0) {
372
- this.root.update(this.deltaTime, this.root.clippingRect);
373
- }
374
-
375
- // Process some textures
376
- this.txManager.processSome(this.options.textureProcessingTimeLimit);
377
-
378
- // Reset render operations and clear the canvas
379
- renderer.reset();
380
-
381
- // Check if we need to cleanup textures
382
- if (this.txMemManager.criticalCleanupRequested === true) {
383
- this.txMemManager.cleanup(false);
384
-
385
- if (this.txMemManager.criticalCleanupRequested === true) {
386
- // If we still need to cleanup, request another but aggressive cleanup
387
- this.txMemManager.cleanup(true);
388
- }
389
- }
390
-
391
- // If we have RTT nodes draw them first
392
- // So we can use them as textures in the main scene
393
- if (renderer.rttNodes.length > 0) {
394
- renderer.renderRTTNodes();
395
- }
396
-
397
- // Fill quads buffer
398
- this.addQuads(this.root);
399
-
400
- // Perform render pass
401
- renderer?.render();
402
-
403
- this.calculateFps();
404
- this.calculateQuads();
405
-
406
- // Reset renderRequested flag if it was set
407
- if (renderRequested) {
408
- this.renderRequested = false;
409
- }
410
- }
411
-
412
- /**
413
- * Queue an event to be emitted after the current/next frame is rendered
414
- *
415
- * @remarks
416
- * When we are operating in the context of the render loop, we may want to
417
- * emit events that are related to the current frame. However, we generally do
418
- * NOT want to emit events directly in the middle of the render loop, since
419
- * this could enable event handlers to modify the scene graph and cause
420
- * unexpected behavior. Instead, we queue up events to be emitted and then
421
- * flush the queue after the frame has been rendered.
422
- *
423
- * @param name
424
- * @param data
425
- */
426
- queueFrameEvent(name: string, data: unknown) {
427
- this.frameEventQueue.push([name, data]);
428
- }
429
-
430
- /**
431
- * Emit all queued frame events
432
- *
433
- * @remarks
434
- * This method should be called after the frame has been rendered to emit
435
- * all events that were queued during the frame.
436
- *
437
- * See {@link queueFrameEvent} for more information.
438
- */
439
- flushFrameEvents() {
440
- for (const [name, data] of this.frameEventQueue) {
441
- this.eventBus.emit(name, data);
442
- }
443
- this.frameEventQueue = [];
444
- }
445
-
446
- calculateFps() {
447
- // If there's an FPS update interval, emit the FPS update event
448
- // when the specified interval has elapsed.
449
- const { fpsUpdateInterval } = this.options;
450
- if (fpsUpdateInterval) {
451
- this.fpsNumFrames++;
452
- this.fpsElapsedTime += this.deltaTime;
453
- if (this.fpsElapsedTime >= fpsUpdateInterval) {
454
- const fps = Math.round(
455
- (this.fpsNumFrames * 1000) / this.fpsElapsedTime,
456
- );
457
- this.fpsNumFrames = 0;
458
- this.fpsElapsedTime = 0;
459
- this.queueFrameEvent('fpsUpdate', {
460
- fps,
461
- contextSpyData: this.contextSpy?.getData() ?? null,
462
- } satisfies FpsUpdatePayload);
463
- this.contextSpy?.reset();
464
- }
465
- }
466
- }
467
-
468
- calculateQuads() {
469
- const quads = this.renderer.getQuadCount();
470
- if (quads && quads !== this.numQuadsRendered) {
471
- this.numQuadsRendered = quads;
472
- this.queueFrameEvent('quadsUpdate', {
473
- quads,
474
- } satisfies QuadsUpdatePayload);
475
- }
476
- }
477
-
478
- addQuads(node: CoreNode) {
479
- assertTruthy(this.renderer);
480
-
481
- // If the node is renderable and has a loaded texture, render it
482
- if (node.isRenderable === true) {
483
- node.renderQuads(this.renderer);
484
- }
485
-
486
- for (let i = 0; i < node.children.length; i++) {
487
- const child = node.children[i];
488
-
489
- if (child === undefined) {
490
- continue;
491
- }
492
-
493
- if (
494
- child.worldAlpha === 0 ||
495
- (child.strictBounds === true &&
496
- child.renderState === CoreNodeRenderState.OutOfBounds)
497
- ) {
498
- continue;
499
- }
500
-
501
- this.addQuads(child);
502
- }
503
- }
504
-
505
- /**
506
- * Request a render pass without forcing an update
507
- */
508
- requestRender() {
509
- this.renderRequested = true;
510
- }
511
-
512
- /**
513
- * Given a font name, and possible renderer override, return the best compatible text renderer.
514
- *
515
- * @remarks
516
- * Will try to return a canvas renderer if no other suitable renderer can be resolved.
517
- *
518
- * @param fontFamily
519
- * @param textRendererOverride
520
- * @returns
521
- */
522
- resolveTextRenderer(
523
- trProps: TrProps,
524
- textRendererOverride: keyof TextRendererMap | null = null,
525
- ): TextRenderer | null {
526
- const fontCacheString = `${trProps.fontFamily}${trProps.fontStyle}${
527
- trProps.fontWeight
528
- }${trProps.fontStretch}${textRendererOverride ? textRendererOverride : ''}`;
529
-
530
- // check our resolve cache first
531
- if (this.fontResolveMap[fontCacheString] !== undefined) {
532
- return this.fontResolveMap[fontCacheString] as unknown as TextRenderer;
533
- }
534
-
535
- // Resolve the text renderer
536
- let rendererId = textRendererOverride;
537
- let overrideFallback = false;
538
-
539
- // Check if the override is valid (if one is provided)
540
- if (rendererId) {
541
- const possibleRenderer = this.textRenderers[rendererId];
542
- if (!possibleRenderer) {
543
- console.warn(`Text renderer override '${rendererId}' not found.`);
544
- rendererId = null;
545
- overrideFallback = true;
546
- } else if (!possibleRenderer.canRenderFont(trProps)) {
547
- console.warn(
548
- `Cannot use override text renderer '${rendererId}' for font`,
549
- trProps,
550
- );
551
- rendererId = null;
552
- overrideFallback = true;
553
- }
554
- }
555
-
556
- if (!rendererId) {
557
- // Iterate through the text renderers and find the first one that can render the font
558
- for (const [trId, tr] of Object.entries(this.textRenderers)) {
559
- if (tr.canRenderFont(trProps)) {
560
- rendererId = trId as keyof TextRendererMap;
561
- break;
562
- }
563
- }
564
- if (!rendererId && this.textRenderers.canvas !== undefined) {
565
- // If no renderer can be found, use the canvas renderer
566
- rendererId = 'canvas';
567
- }
568
- }
569
-
570
- if (overrideFallback) {
571
- console.warn(`Falling back to text renderer ${String(rendererId)}`);
572
- }
573
-
574
- if (!rendererId) {
575
- // silently fail if no renderer can be found, the error is already created
576
- // at the constructor level
577
- return null;
578
- }
579
-
580
- // By now we are guaranteed to have a valid rendererId (at least Canvas);
581
- const resolvedTextRenderer = this.textRenderers[rendererId];
582
- assertTruthy(resolvedTextRenderer, 'resolvedTextRenderer undefined');
583
-
584
- // cache the resolved renderer for future use with these trProps
585
- this.fontResolveMap[fontCacheString] = resolvedTextRenderer;
586
-
587
- // Need to explicitly cast to TextRenderer because TS doesn't like
588
- // the covariant state argument in the setter method map
589
- return resolvedTextRenderer as unknown as TextRenderer;
590
- }
591
-
592
- /**
593
- * Create a shader controller instance
594
- *
595
- * @param type
596
- * @param props
597
- * @returns
598
- */
599
- createShaderCtr(
600
- type: keyof ShaderMap,
601
- props: Record<string, unknown>,
602
- ): BaseShaderController {
603
- return this.shManager.loadShader(type, props);
604
- }
605
-
606
- createNode(props: Partial<CoreNodeProps>) {
607
- const resolvedProps = this.resolveNodeDefaults(props);
608
- return new CoreNode(this, resolvedProps);
609
- }
610
-
611
- createTextNode(props: Partial<CoreTextNodeProps>) {
612
- const fontSize = props.fontSize ?? 16;
613
- const resolvedProps = {
614
- ...this.resolveNodeDefaults(props),
615
- text: props.text ?? '',
616
- textRendererOverride: props.textRendererOverride ?? null,
617
- fontSize,
618
- fontFamily: props.fontFamily ?? 'sans-serif',
619
- fontStyle: props.fontStyle ?? 'normal',
620
- fontWeight: props.fontWeight ?? 'normal',
621
- fontStretch: props.fontStretch ?? 'normal',
622
- textAlign: props.textAlign ?? 'left',
623
- contain: props.contain ?? 'none',
624
- scrollable: props.scrollable ?? false,
625
- scrollY: props.scrollY ?? 0,
626
- offsetY: props.offsetY ?? 0,
627
- letterSpacing: props.letterSpacing ?? 0,
628
- lineHeight: props.lineHeight, // `undefined` is a valid value
629
- maxLines: props.maxLines ?? 0,
630
- textBaseline: props.textBaseline ?? 'alphabetic',
631
- verticalAlign: props.verticalAlign ?? 'middle',
632
- overflowSuffix: props.overflowSuffix ?? '...',
633
- debug: props.debug ?? {},
634
- shaderProps: null,
635
- };
636
-
637
- const resolvedTextRenderer = this.resolveTextRenderer(
638
- resolvedProps,
639
- props.textRendererOverride,
640
- );
641
-
642
- if (!resolvedTextRenderer) {
643
- throw new Error(
644
- `No compatible text renderer found for ${resolvedProps.fontFamily}`,
645
- );
646
- }
647
-
648
- return new CoreTextNode(this, resolvedProps, resolvedTextRenderer);
649
- }
650
-
651
- setBoundsMargin(value: number | [number, number, number, number]) {
652
- this.boundsMargin = Array.isArray(value)
653
- ? value
654
- : [value, value, value, value];
655
-
656
- this.root.setUpdateType(UpdateType.RenderBounds);
657
- }
658
-
659
- /**
660
- * Resolves the default property values for a Node
661
- *
662
- * @remarks
663
- * This method is used internally by the RendererMain to resolve the default
664
- * property values for a Node. It is exposed publicly so that it can be used
665
- * by Core Driver implementations.
666
- *
667
- * @param props
668
- * @returns
669
- */
670
- protected resolveNodeDefaults(props: Partial<CoreNodeProps>): CoreNodeProps {
671
- const color = props.color ?? 0xffffffff;
672
- const colorTl = props.colorTl ?? props.colorTop ?? props.colorLeft ?? color;
673
- const colorTr =
674
- props.colorTr ?? props.colorTop ?? props.colorRight ?? color;
675
- const colorBl =
676
- props.colorBl ?? props.colorBottom ?? props.colorLeft ?? color;
677
- const colorBr =
678
- props.colorBr ?? props.colorBottom ?? props.colorRight ?? color;
679
-
680
- let data = {};
681
- if (this.options.inspector === true) {
682
- data = santizeCustomDataMap(props.data ?? {});
683
- }
684
-
685
- return {
686
- x: props.x ?? 0,
687
- y: props.y ?? 0,
688
- width: props.width ?? 0,
689
- height: props.height ?? 0,
690
- alpha: props.alpha ?? 1,
691
- autosize: props.autosize ?? false,
692
- boundsMargin: props.boundsMargin ?? null,
693
- clipping: props.clipping ?? false,
694
- color,
695
- colorTop: props.colorTop ?? color,
696
- colorBottom: props.colorBottom ?? color,
697
- colorLeft: props.colorLeft ?? color,
698
- colorRight: props.colorRight ?? color,
699
- colorBl,
700
- colorBr,
701
- colorTl,
702
- colorTr,
703
- zIndex: props.zIndex ?? 0,
704
- zIndexLocked: props.zIndexLocked ?? 0,
705
- parent: props.parent ?? null,
706
- texture: props.texture ?? null,
707
- textureOptions: props.textureOptions ?? {},
708
- shader: props.shader ?? this.defShaderCtr,
709
- // Since setting the `src` will trigger a texture load, we need to set it after
710
- // we set the texture. Otherwise, problems happen.
711
- src: props.src ?? null,
712
- srcHeight: props.srcHeight,
713
- srcWidth: props.srcWidth,
714
- srcX: props.srcX,
715
- srcY: props.srcY,
716
- scale: props.scale ?? null,
717
- scaleX: props.scaleX ?? props.scale ?? 1,
718
- scaleY: props.scaleY ?? props.scale ?? 1,
719
- mount: props.mount ?? 0,
720
- mountX: props.mountX ?? props.mount ?? 0,
721
- mountY: props.mountY ?? props.mount ?? 0,
722
- pivot: props.pivot ?? 0.5,
723
- pivotX: props.pivotX ?? props.pivot ?? 0.5,
724
- pivotY: props.pivotY ?? props.pivot ?? 0.5,
725
- rotation: props.rotation ?? 0,
726
- rtt: props.rtt ?? false,
727
- data: data,
728
- preventCleanup: props.preventCleanup ?? false,
729
- imageType: props.imageType,
730
- strictBounds: props.strictBounds ?? this.strictBounds,
731
- };
732
- }
733
-
734
- /**
735
- * Cleanup Orphaned Textures
736
- *
737
- * @remarks
738
- * This method is used to cleanup orphaned textures that are no longer in use.
739
- */
740
- cleanup(aggressive: boolean) {
741
- this.txMemManager.cleanup(aggressive);
742
- }
743
- }
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
+ import { startLoop, getTimeStamp } from './platform.js';
20
+ import { assertTruthy, setPremultiplyMode } from '../utils.js';
21
+ import { AnimationManager } from './animations/AnimationManager.js';
22
+ import {
23
+ UpdateType,
24
+ CoreNode,
25
+ CoreNodeRenderState,
26
+ type CoreNodeProps,
27
+ } from './CoreNode.js';
28
+ import { CoreTextureManager } from './CoreTextureManager.js';
29
+ import { TrFontManager } from './text-rendering/TrFontManager.js';
30
+ import { CoreShaderManager } from './CoreShaderManager.js';
31
+ import {
32
+ TextRenderer,
33
+ type TextRendererMap,
34
+ type TrProps,
35
+ } from './text-rendering/renderers/TextRenderer.js';
36
+
37
+ import { EventEmitter } from '../common/EventEmitter.js';
38
+ import { ContextSpy } from './lib/ContextSpy.js';
39
+ import type {
40
+ FpsUpdatePayload,
41
+ FrameTickPayload,
42
+ QuadsUpdatePayload,
43
+ } from '../common/CommonTypes.js';
44
+ import {
45
+ TextureMemoryManager,
46
+ type TextureMemoryManagerSettings,
47
+ } from './TextureMemoryManager.js';
48
+ import { CoreRenderer } from './renderers/CoreRenderer.js';
49
+ import type { WebGlRenderer } from './renderers/webgl/WebGlRenderer.js';
50
+ import type { CanvasRenderer } from './renderers/canvas/CanvasRenderer.js';
51
+ import { CoreTextNode, type CoreTextNodeProps } from './CoreTextNode.js';
52
+ import { santizeCustomDataMap } from '../main-api/utils.js';
53
+ import type { SdfTextRenderer } from './text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js';
54
+ import type { CanvasTextRenderer } from './text-rendering/renderers/CanvasTextRenderer.js';
55
+ import type { CoreShaderNode } from './renderers/CoreShaderNode.js';
56
+ import { createBound, createPreloadBounds, type Bound } from './lib/utils.js';
57
+ import type { Texture } from './textures/Texture.js';
58
+ import { ColorTexture } from './textures/ColorTexture.js';
59
+
60
+ export interface StageOptions {
61
+ appWidth: number;
62
+ appHeight: number;
63
+ textureMemory: TextureMemoryManagerSettings;
64
+ boundsMargin: number | [number, number, number, number];
65
+ deviceLogicalPixelRatio: number;
66
+ devicePhysicalPixelRatio: number;
67
+ canvas: HTMLCanvasElement | OffscreenCanvas;
68
+ clearColor: number;
69
+ fpsUpdateInterval: number;
70
+ enableContextSpy: boolean;
71
+ forceWebGL2: boolean;
72
+ numImageWorkers: number;
73
+ renderEngine: typeof WebGlRenderer | typeof CanvasRenderer;
74
+ eventBus: EventEmitter;
75
+ quadBufferSize: number;
76
+ fontEngines: (typeof CanvasTextRenderer | typeof SdfTextRenderer)[];
77
+ inspector: boolean;
78
+ strictBounds: boolean;
79
+ textureProcessingTimeLimit: number;
80
+ createImageBitmapSupport: 'auto' | 'basic' | 'options' | 'full';
81
+ }
82
+
83
+ export type StageFpsUpdateHandler = (
84
+ stage: Stage,
85
+ fpsData: FpsUpdatePayload,
86
+ ) => void;
87
+
88
+ export type StageFrameTickHandler = (
89
+ stage: Stage,
90
+ frameTickData: FrameTickPayload,
91
+ ) => void;
92
+
93
+ const autoStart = true;
94
+
95
+ export class Stage {
96
+ /// Module Instances
97
+ public readonly animationManager: AnimationManager;
98
+ public readonly txManager: CoreTextureManager;
99
+ public readonly txMemManager: TextureMemoryManager;
100
+ public readonly fontManager: TrFontManager;
101
+ public readonly textRenderers: Partial<TextRendererMap>;
102
+ public readonly shManager: CoreShaderManager;
103
+ public readonly renderer: CoreRenderer;
104
+ public readonly root: CoreNode;
105
+ public boundsMargin: [number, number, number, number];
106
+ public readonly defShaderNode: CoreShaderNode | null = null;
107
+ public readonly strictBound: Bound;
108
+ public readonly preloadBound: Bound;
109
+ public readonly strictBounds: boolean;
110
+ public readonly defaultTexture: Texture | null = null;
111
+ public readonly pixelRatio: number;
112
+ public readonly bufferMemory: number = 2e6;
113
+ /**
114
+ * Renderer Event Bus for the Stage to emit events onto
115
+ *
116
+ * @remarks
117
+ * In reality this is just the RendererMain instance, which is an EventEmitter.
118
+ * this allows us to directly emit events from the Stage to RendererMain
119
+ * without having to set up forwarding handlers.
120
+ */
121
+ public readonly eventBus: EventEmitter;
122
+
123
+ /// State
124
+ deltaTime = 0;
125
+ lastFrameTime = 0;
126
+ currentFrameTime = 0;
127
+ private clrColor = 0x00000000;
128
+ private fpsNumFrames = 0;
129
+ private fpsElapsedTime = 0;
130
+ private numQuadsRendered = 0;
131
+ private renderRequested = false;
132
+ private frameEventQueue: [name: string, payload: unknown][] = [];
133
+ private fontResolveMap: Record<string, CanvasTextRenderer | SdfTextRenderer> =
134
+ {};
135
+
136
+ /// Debug data
137
+ contextSpy: ContextSpy | null = null;
138
+
139
+ /**
140
+ * Stage constructor
141
+ */
142
+ constructor(readonly options: StageOptions) {
143
+ const {
144
+ canvas,
145
+ clearColor,
146
+ appWidth,
147
+ appHeight,
148
+ boundsMargin,
149
+ enableContextSpy,
150
+ forceWebGL2,
151
+ numImageWorkers,
152
+ textureMemory,
153
+ renderEngine,
154
+ fontEngines,
155
+ createImageBitmapSupport,
156
+ } = options;
157
+
158
+ this.eventBus = options.eventBus;
159
+ this.txManager = new CoreTextureManager(this, {
160
+ numImageWorkers,
161
+ createImageBitmapSupport,
162
+ });
163
+
164
+ // Wait for the Texture Manager to initialize
165
+ // once it does, request a render
166
+ this.txManager.on('initialized', () => {
167
+ this.requestRender();
168
+ });
169
+
170
+ this.txMemManager = new TextureMemoryManager(this, textureMemory);
171
+
172
+ this.animationManager = new AnimationManager();
173
+ this.contextSpy = enableContextSpy ? new ContextSpy() : null;
174
+ this.strictBounds = options.strictBounds;
175
+
176
+ let bm = [0, 0, 0, 0] as [number, number, number, number];
177
+ if (boundsMargin) {
178
+ bm = Array.isArray(boundsMargin)
179
+ ? boundsMargin
180
+ : [boundsMargin, boundsMargin, boundsMargin, boundsMargin];
181
+ }
182
+ this.boundsMargin = bm;
183
+
184
+ // precalculate our viewport bounds
185
+ this.strictBound = createBound(0, 0, appWidth, appHeight);
186
+ this.preloadBound = createPreloadBounds(this.strictBound, bm);
187
+
188
+ this.clrColor = clearColor;
189
+
190
+ this.pixelRatio =
191
+ options.devicePhysicalPixelRatio * options.deviceLogicalPixelRatio;
192
+
193
+ this.renderer = new renderEngine({
194
+ stage: this,
195
+ canvas,
196
+ contextSpy: this.contextSpy,
197
+ forceWebGL2,
198
+ });
199
+
200
+ this.shManager = new CoreShaderManager(this);
201
+
202
+ this.defShaderNode = this.renderer.getDefaultShaderNode();
203
+
204
+ const renderMode = this.renderer.mode || 'webgl';
205
+
206
+ this.createDefaultTexture();
207
+ setPremultiplyMode(renderMode);
208
+
209
+ // Must do this after renderer is created
210
+ this.txManager.renderer = this.renderer;
211
+
212
+ // Create text renderers
213
+ this.textRenderers = {};
214
+ fontEngines.forEach((fontEngineConstructor) => {
215
+ const fontEngineInstance = new fontEngineConstructor(this);
216
+ const className = fontEngineInstance.type;
217
+
218
+ if (className === 'sdf' && renderMode === 'canvas') {
219
+ console.warn(
220
+ 'SdfTextRenderer is not compatible with Canvas renderer. Skipping...',
221
+ );
222
+ return;
223
+ }
224
+
225
+ if (fontEngineInstance instanceof TextRenderer) {
226
+ if (className === 'canvas') {
227
+ this.textRenderers['canvas'] =
228
+ fontEngineInstance as CanvasTextRenderer;
229
+ } else if (className === 'sdf') {
230
+ this.textRenderers['sdf'] = fontEngineInstance as SdfTextRenderer;
231
+ }
232
+ }
233
+ });
234
+
235
+ if (Object.keys(this.textRenderers).length === 0) {
236
+ console.warn('No text renderers available. Your text will not render.');
237
+ }
238
+
239
+ this.fontManager = new TrFontManager(this.textRenderers);
240
+
241
+ // create root node
242
+ const rootNode = new CoreNode(this, {
243
+ x: 0,
244
+ y: 0,
245
+ width: appWidth,
246
+ height: appHeight,
247
+ alpha: 1,
248
+ autosize: false,
249
+ boundsMargin: null,
250
+ clipping: false,
251
+ color: 0x00000000,
252
+ colorTop: 0x00000000,
253
+ colorBottom: 0x00000000,
254
+ colorLeft: 0x00000000,
255
+ colorRight: 0x00000000,
256
+ colorTl: 0x00000000,
257
+ colorTr: 0x00000000,
258
+ colorBl: 0x00000000,
259
+ colorBr: 0x00000000,
260
+ zIndex: 0,
261
+ zIndexLocked: 0,
262
+ scaleX: 1,
263
+ scaleY: 1,
264
+ mountX: 0,
265
+ mountY: 0,
266
+ mount: 0,
267
+ pivot: 0.5,
268
+ pivotX: 0.5,
269
+ pivotY: 0.5,
270
+ rotation: 0,
271
+ parent: null,
272
+ texture: null,
273
+ textureOptions: {},
274
+ shader: this.defShaderNode,
275
+ rtt: false,
276
+ src: null,
277
+ scale: 1,
278
+ preventCleanup: false,
279
+ strictBounds: this.strictBounds,
280
+ });
281
+
282
+ this.root = rootNode;
283
+
284
+ // execute platform start loop
285
+ if (autoStart) {
286
+ startLoop(this);
287
+ }
288
+ }
289
+
290
+ setClearColor(color: number) {
291
+ this.clearColor = color;
292
+ this.renderer.updateClearColor(color);
293
+ this.renderRequested = true;
294
+ }
295
+
296
+ updateFrameTime() {
297
+ const newFrameTime = getTimeStamp();
298
+ this.lastFrameTime = this.currentFrameTime;
299
+ this.currentFrameTime = newFrameTime;
300
+ this.deltaTime = !this.lastFrameTime
301
+ ? 100 / 6
302
+ : newFrameTime - this.lastFrameTime;
303
+ this.txManager.frameTime = newFrameTime;
304
+ this.txMemManager.frameTime = newFrameTime;
305
+
306
+ // This event is emitted at the beginning of the frame (before any updates
307
+ // or rendering), so no need to to use `stage.queueFrameEvent` here.
308
+ this.eventBus.emit('frameTick', {
309
+ time: this.currentFrameTime,
310
+ delta: this.deltaTime,
311
+ });
312
+ }
313
+
314
+ /**
315
+ * Create default PixelTexture
316
+ */
317
+ createDefaultTexture() {
318
+ console.log('Creating default texture');
319
+ (this.defaultTexture as ColorTexture) = this.txManager.createTexture(
320
+ 'ColorTexture',
321
+ {
322
+ color: 0xffffffff,
323
+ },
324
+ );
325
+
326
+ assertTruthy(this.defaultTexture instanceof ColorTexture);
327
+ this.txManager.loadTexture(this.defaultTexture, true);
328
+
329
+ // Mark the default texture as ALWAYS renderable
330
+ // This prevents it from ever being cleaned up.
331
+ // Fixes https://github.com/lightning-js/renderer/issues/262
332
+ this.defaultTexture.setRenderableOwner(this, true);
333
+
334
+ // When the default texture is loaded, request a render in case the
335
+ // RAF is paused. Fixes: https://github.com/lightning-js/renderer/issues/123
336
+ this.defaultTexture.once('loaded', () => {
337
+ this.requestRender();
338
+ });
339
+ }
340
+
341
+ /**
342
+ * Update animations
343
+ */
344
+ updateAnimations() {
345
+ const { animationManager } = this;
346
+ if (!this.root) {
347
+ return;
348
+ }
349
+ // step animation
350
+ animationManager.update(this.deltaTime);
351
+ }
352
+
353
+ /**
354
+ * Check if the scene has updates
355
+ */
356
+ hasSceneUpdates() {
357
+ return (
358
+ !!this.root.updateType ||
359
+ this.renderRequested ||
360
+ this.txManager.hasUpdates()
361
+ );
362
+ }
363
+
364
+ /**
365
+ * Start a new frame draw
366
+ */
367
+ drawFrame() {
368
+ const { renderer, renderRequested } = this;
369
+ assertTruthy(renderer);
370
+
371
+ // Update tree if needed
372
+ if (this.root.updateType !== 0) {
373
+ this.root.update(this.deltaTime, this.root.clippingRect);
374
+ }
375
+
376
+ // Process some textures
377
+ this.txManager.processSome(this.options.textureProcessingTimeLimit);
378
+
379
+ // Reset render operations and clear the canvas
380
+ renderer.reset();
381
+
382
+ // Check if we need to cleanup textures
383
+ if (this.txMemManager.criticalCleanupRequested === true) {
384
+ this.txMemManager.cleanup(false);
385
+
386
+ if (this.txMemManager.criticalCleanupRequested === true) {
387
+ // If we still need to cleanup, request another but aggressive cleanup
388
+ this.txMemManager.cleanup(true);
389
+ }
390
+ }
391
+
392
+ // If we have RTT nodes draw them first
393
+ // So we can use them as textures in the main scene
394
+ if (renderer.rttNodes.length > 0) {
395
+ renderer.renderRTTNodes();
396
+ }
397
+
398
+ // Fill quads buffer
399
+ this.addQuads(this.root);
400
+
401
+ // Perform render pass
402
+ renderer?.render();
403
+
404
+ this.calculateFps();
405
+ this.calculateQuads();
406
+
407
+ // Reset renderRequested flag if it was set
408
+ if (renderRequested) {
409
+ this.renderRequested = false;
410
+ }
411
+ }
412
+
413
+ /**
414
+ * Queue an event to be emitted after the current/next frame is rendered
415
+ *
416
+ * @remarks
417
+ * When we are operating in the context of the render loop, we may want to
418
+ * emit events that are related to the current frame. However, we generally do
419
+ * NOT want to emit events directly in the middle of the render loop, since
420
+ * this could enable event handlers to modify the scene graph and cause
421
+ * unexpected behavior. Instead, we queue up events to be emitted and then
422
+ * flush the queue after the frame has been rendered.
423
+ *
424
+ * @param name
425
+ * @param data
426
+ */
427
+ queueFrameEvent(name: string, data: unknown) {
428
+ this.frameEventQueue.push([name, data]);
429
+ }
430
+
431
+ /**
432
+ * Emit all queued frame events
433
+ *
434
+ * @remarks
435
+ * This method should be called after the frame has been rendered to emit
436
+ * all events that were queued during the frame.
437
+ *
438
+ * See {@link queueFrameEvent} for more information.
439
+ */
440
+ flushFrameEvents() {
441
+ for (const [name, data] of this.frameEventQueue) {
442
+ this.eventBus.emit(name, data);
443
+ }
444
+ this.frameEventQueue = [];
445
+ }
446
+
447
+ calculateFps() {
448
+ // If there's an FPS update interval, emit the FPS update event
449
+ // when the specified interval has elapsed.
450
+ const { fpsUpdateInterval } = this.options;
451
+ if (fpsUpdateInterval) {
452
+ this.fpsNumFrames++;
453
+ this.fpsElapsedTime += this.deltaTime;
454
+ if (this.fpsElapsedTime >= fpsUpdateInterval) {
455
+ const fps = Math.round(
456
+ (this.fpsNumFrames * 1000) / this.fpsElapsedTime,
457
+ );
458
+ this.fpsNumFrames = 0;
459
+ this.fpsElapsedTime = 0;
460
+ this.queueFrameEvent('fpsUpdate', {
461
+ fps,
462
+ contextSpyData: this.contextSpy?.getData() ?? null,
463
+ } satisfies FpsUpdatePayload);
464
+ this.contextSpy?.reset();
465
+ }
466
+ }
467
+ }
468
+
469
+ calculateQuads() {
470
+ const quads = this.renderer.getQuadCount();
471
+ if (quads && quads !== this.numQuadsRendered) {
472
+ this.numQuadsRendered = quads;
473
+ this.queueFrameEvent('quadsUpdate', {
474
+ quads,
475
+ } satisfies QuadsUpdatePayload);
476
+ }
477
+ }
478
+
479
+ addQuads(node: CoreNode) {
480
+ assertTruthy(this.renderer);
481
+
482
+ // If the node is renderable and has a loaded texture, render it
483
+ if (node.isRenderable === true) {
484
+ node.renderQuads(this.renderer);
485
+ }
486
+
487
+ for (let i = 0; i < node.children.length; i++) {
488
+ const child = node.children[i];
489
+
490
+ if (child === undefined) {
491
+ continue;
492
+ }
493
+
494
+ if (
495
+ child.worldAlpha === 0 ||
496
+ (child.strictBounds === true &&
497
+ child.renderState === CoreNodeRenderState.OutOfBounds)
498
+ ) {
499
+ continue;
500
+ }
501
+
502
+ this.addQuads(child);
503
+ }
504
+ }
505
+
506
+ /**
507
+ * Request a render pass without forcing an update
508
+ */
509
+ requestRender() {
510
+ this.renderRequested = true;
511
+ }
512
+
513
+ /**
514
+ * Given a font name, and possible renderer override, return the best compatible text renderer.
515
+ *
516
+ * @remarks
517
+ * Will try to return a canvas renderer if no other suitable renderer can be resolved.
518
+ *
519
+ * @param fontFamily
520
+ * @param textRendererOverride
521
+ * @returns
522
+ */
523
+ resolveTextRenderer(
524
+ trProps: TrProps,
525
+ textRendererOverride: keyof TextRendererMap | null = null,
526
+ ): TextRenderer | null {
527
+ const fontCacheString = `${trProps.fontFamily}${trProps.fontStyle}${
528
+ trProps.fontWeight
529
+ }${trProps.fontStretch}${textRendererOverride ? textRendererOverride : ''}`;
530
+
531
+ // check our resolve cache first
532
+ if (this.fontResolveMap[fontCacheString] !== undefined) {
533
+ return this.fontResolveMap[fontCacheString] as unknown as TextRenderer;
534
+ }
535
+
536
+ // Resolve the text renderer
537
+ let rendererId = textRendererOverride;
538
+ let overrideFallback = false;
539
+
540
+ // Check if the override is valid (if one is provided)
541
+ if (rendererId) {
542
+ const possibleRenderer = this.textRenderers[rendererId];
543
+ if (!possibleRenderer) {
544
+ console.warn(`Text renderer override '${rendererId}' not found.`);
545
+ rendererId = null;
546
+ overrideFallback = true;
547
+ } else if (!possibleRenderer.canRenderFont(trProps)) {
548
+ console.warn(
549
+ `Cannot use override text renderer '${rendererId}' for font`,
550
+ trProps,
551
+ );
552
+ rendererId = null;
553
+ overrideFallback = true;
554
+ }
555
+ }
556
+
557
+ if (!rendererId) {
558
+ // Iterate through the text renderers and find the first one that can render the font
559
+ for (const [trId, tr] of Object.entries(this.textRenderers)) {
560
+ if (tr.canRenderFont(trProps)) {
561
+ rendererId = trId as keyof TextRendererMap;
562
+ break;
563
+ }
564
+ }
565
+ if (!rendererId && this.textRenderers.canvas !== undefined) {
566
+ // If no renderer can be found, use the canvas renderer
567
+ rendererId = 'canvas';
568
+ }
569
+ }
570
+
571
+ if (overrideFallback) {
572
+ console.warn(`Falling back to text renderer ${String(rendererId)}`);
573
+ }
574
+
575
+ if (!rendererId) {
576
+ // silently fail if no renderer can be found, the error is already created
577
+ // at the constructor level
578
+ return null;
579
+ }
580
+
581
+ // By now we are guaranteed to have a valid rendererId (at least Canvas);
582
+ const resolvedTextRenderer = this.textRenderers[rendererId];
583
+ assertTruthy(resolvedTextRenderer, 'resolvedTextRenderer undefined');
584
+
585
+ // cache the resolved renderer for future use with these trProps
586
+ this.fontResolveMap[fontCacheString] = resolvedTextRenderer;
587
+
588
+ // Need to explicitly cast to TextRenderer because TS doesn't like
589
+ // the covariant state argument in the setter method map
590
+ return resolvedTextRenderer as unknown as TextRenderer;
591
+ }
592
+
593
+ createNode(props: Partial<CoreNodeProps>) {
594
+ const resolvedProps = this.resolveNodeDefaults(props);
595
+ return new CoreNode(this, resolvedProps);
596
+ }
597
+
598
+ createTextNode(props: Partial<CoreTextNodeProps>) {
599
+ const fontSize = props.fontSize ?? 16;
600
+ const resolvedProps = {
601
+ ...this.resolveNodeDefaults(props),
602
+ text: props.text ?? '',
603
+ textRendererOverride: props.textRendererOverride ?? null,
604
+ fontSize,
605
+ fontFamily: props.fontFamily ?? 'sans-serif',
606
+ fontStyle: props.fontStyle ?? 'normal',
607
+ fontWeight: props.fontWeight ?? 'normal',
608
+ fontStretch: props.fontStretch ?? 'normal',
609
+ textAlign: props.textAlign ?? 'left',
610
+ contain: props.contain ?? 'none',
611
+ scrollable: props.scrollable ?? false,
612
+ scrollY: props.scrollY ?? 0,
613
+ offsetY: props.offsetY ?? 0,
614
+ letterSpacing: props.letterSpacing ?? 0,
615
+ lineHeight: props.lineHeight, // `undefined` is a valid value
616
+ maxLines: props.maxLines ?? 0,
617
+ textBaseline: props.textBaseline ?? 'alphabetic',
618
+ verticalAlign: props.verticalAlign ?? 'middle',
619
+ overflowSuffix: props.overflowSuffix ?? '...',
620
+ debug: props.debug ?? {},
621
+ shaderProps: null,
622
+ };
623
+
624
+ const resolvedTextRenderer = this.resolveTextRenderer(
625
+ resolvedProps,
626
+ props.textRendererOverride,
627
+ );
628
+
629
+ if (!resolvedTextRenderer) {
630
+ throw new Error(
631
+ `No compatible text renderer found for ${resolvedProps.fontFamily}`,
632
+ );
633
+ }
634
+
635
+ return new CoreTextNode(this, resolvedProps, resolvedTextRenderer);
636
+ }
637
+
638
+ setBoundsMargin(value: number | [number, number, number, number]) {
639
+ this.boundsMargin = Array.isArray(value)
640
+ ? value
641
+ : [value, value, value, value];
642
+
643
+ this.root.setUpdateType(UpdateType.RenderBounds);
644
+ }
645
+
646
+ /**
647
+ * Resolves the default property values for a Node
648
+ *
649
+ * @remarks
650
+ * This method is used internally by the RendererMain to resolve the default
651
+ * property values for a Node. It is exposed publicly so that it can be used
652
+ * by Core Driver implementations.
653
+ *
654
+ * @param props
655
+ * @returns
656
+ */
657
+ protected resolveNodeDefaults(props: Partial<CoreNodeProps>): CoreNodeProps {
658
+ const color = props.color ?? 0xffffffff;
659
+ const colorTl = props.colorTl ?? props.colorTop ?? props.colorLeft ?? color;
660
+ const colorTr =
661
+ props.colorTr ?? props.colorTop ?? props.colorRight ?? color;
662
+ const colorBl =
663
+ props.colorBl ?? props.colorBottom ?? props.colorLeft ?? color;
664
+ const colorBr =
665
+ props.colorBr ?? props.colorBottom ?? props.colorRight ?? color;
666
+
667
+ let data = {};
668
+ if (this.options.inspector === true) {
669
+ data = santizeCustomDataMap(props.data ?? {});
670
+ }
671
+
672
+ return {
673
+ x: props.x ?? 0,
674
+ y: props.y ?? 0,
675
+ width: props.width ?? 0,
676
+ height: props.height ?? 0,
677
+ alpha: props.alpha ?? 1,
678
+ autosize: props.autosize ?? false,
679
+ boundsMargin: props.boundsMargin ?? null,
680
+ clipping: props.clipping ?? false,
681
+ color,
682
+ colorTop: props.colorTop ?? color,
683
+ colorBottom: props.colorBottom ?? color,
684
+ colorLeft: props.colorLeft ?? color,
685
+ colorRight: props.colorRight ?? color,
686
+ colorBl,
687
+ colorBr,
688
+ colorTl,
689
+ colorTr,
690
+ zIndex: props.zIndex ?? 0,
691
+ zIndexLocked: props.zIndexLocked ?? 0,
692
+ parent: props.parent ?? null,
693
+ texture: props.texture ?? null,
694
+ textureOptions: props.textureOptions ?? {},
695
+ shader: props.shader ?? this.defShaderNode,
696
+ // Since setting the `src` will trigger a texture load, we need to set it after
697
+ // we set the texture. Otherwise, problems happen.
698
+ src: props.src ?? null,
699
+ srcHeight: props.srcHeight,
700
+ srcWidth: props.srcWidth,
701
+ srcX: props.srcX,
702
+ srcY: props.srcY,
703
+ scale: props.scale ?? null,
704
+ scaleX: props.scaleX ?? props.scale ?? 1,
705
+ scaleY: props.scaleY ?? props.scale ?? 1,
706
+ mount: props.mount ?? 0,
707
+ mountX: props.mountX ?? props.mount ?? 0,
708
+ mountY: props.mountY ?? props.mount ?? 0,
709
+ pivot: props.pivot ?? 0.5,
710
+ pivotX: props.pivotX ?? props.pivot ?? 0.5,
711
+ pivotY: props.pivotY ?? props.pivot ?? 0.5,
712
+ rotation: props.rotation ?? 0,
713
+ rtt: props.rtt ?? false,
714
+ data: data,
715
+ preventCleanup: props.preventCleanup ?? false,
716
+ imageType: props.imageType,
717
+ strictBounds: props.strictBounds ?? this.strictBounds,
718
+ };
719
+ }
720
+
721
+ /**
722
+ * Cleanup Orphaned Textures
723
+ *
724
+ * @remarks
725
+ * This method is used to cleanup orphaned textures that are no longer in use.
726
+ */
727
+ cleanup(aggressive: boolean) {
728
+ this.txMemManager.cleanup(aggressive);
729
+ }
730
+
731
+ set clearColor(value: number) {
732
+ this.renderer.updateClearColor(value);
733
+ this.renderRequested = true;
734
+ this.clrColor = value;
735
+ }
736
+
737
+ get clearColor() {
738
+ return this.clrColor;
739
+ }
740
+ }