@lightningtv/renderer 2.16.1 → 3.2.3

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 (625) hide show
  1. package/NOTICE +4 -0
  2. package/README.md +22 -28
  3. package/dist/exports/canvas-shaders.js +0 -16
  4. package/dist/exports/canvas-shaders.js.map +1 -1
  5. package/dist/exports/canvas.d.ts +8 -2
  6. package/dist/exports/canvas.js +8 -20
  7. package/dist/exports/canvas.js.map +1 -1
  8. package/dist/exports/index.d.ts +18 -13
  9. package/dist/exports/index.js +9 -27
  10. package/dist/exports/index.js.map +1 -1
  11. package/dist/exports/inspector.js +0 -18
  12. package/dist/exports/inspector.js.map +1 -1
  13. package/dist/exports/utils.d.ts +2 -1
  14. package/dist/exports/utils.js +2 -19
  15. package/dist/exports/utils.js.map +1 -1
  16. package/dist/exports/webgl-shaders.js +0 -16
  17. package/dist/exports/webgl-shaders.js.map +1 -1
  18. package/dist/exports/webgl.d.ts +11 -2
  19. package/dist/exports/webgl.js +11 -20
  20. package/dist/exports/webgl.js.map +1 -1
  21. package/dist/src/common/CommonTypes.d.ts +15 -3
  22. package/dist/src/common/CommonTypes.js +0 -18
  23. package/dist/src/common/CommonTypes.js.map +1 -1
  24. package/dist/src/common/EventEmitter.js +0 -18
  25. package/dist/src/common/EventEmitter.js.map +1 -1
  26. package/dist/src/common/IEventEmitter.js +0 -16
  27. package/dist/src/common/IEventEmitter.js.map +1 -1
  28. package/dist/src/core/Autosizer.d.ts +35 -0
  29. package/dist/src/core/Autosizer.js +178 -0
  30. package/dist/src/core/Autosizer.js.map +1 -0
  31. package/dist/src/core/CoreNode.d.ts +138 -105
  32. package/dist/src/core/CoreNode.js +805 -526
  33. package/dist/src/core/CoreNode.js.map +1 -1
  34. package/dist/src/core/CoreShaderManager.d.ts +29 -73
  35. package/dist/src/core/CoreShaderManager.js +92 -97
  36. package/dist/src/core/CoreShaderManager.js.map +1 -1
  37. package/dist/src/core/CoreTextNode.d.ts +75 -87
  38. package/dist/src/core/CoreTextNode.js +380 -258
  39. package/dist/src/core/CoreTextNode.js.map +1 -1
  40. package/dist/src/core/CoreTextureManager.d.ts +18 -3
  41. package/dist/src/core/CoreTextureManager.js +63 -107
  42. package/dist/src/core/CoreTextureManager.js.map +1 -1
  43. package/dist/src/core/Stage.d.ts +82 -55
  44. package/dist/src/core/Stage.js +410 -247
  45. package/dist/src/core/Stage.js.map +1 -1
  46. package/dist/src/core/TextureError.d.ts +11 -0
  47. package/dist/src/core/TextureError.js +37 -0
  48. package/dist/src/core/TextureError.js.map +1 -0
  49. package/dist/src/core/TextureMemoryManager.d.ts +4 -3
  50. package/dist/src/core/TextureMemoryManager.js +103 -135
  51. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  52. package/dist/src/core/animations/AnimationManager.js +0 -18
  53. package/dist/src/core/animations/AnimationManager.js.map +1 -1
  54. package/dist/src/core/animations/CoreAnimation.d.ts +3 -4
  55. package/dist/src/core/animations/CoreAnimation.js +9 -76
  56. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  57. package/dist/src/core/animations/CoreAnimationController.js +0 -18
  58. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  59. package/dist/src/core/lib/ContextSpy.js +0 -18
  60. package/dist/src/core/lib/ContextSpy.js.map +1 -1
  61. package/dist/src/core/lib/ImageWorker.d.ts +2 -2
  62. package/dist/src/core/lib/ImageWorker.js +31 -30
  63. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  64. package/dist/src/core/lib/Matrix3d.d.ts +1 -0
  65. package/dist/src/core/lib/Matrix3d.js +7 -19
  66. package/dist/src/core/lib/Matrix3d.js.map +1 -1
  67. package/dist/src/core/lib/RenderCoords.d.ts +9 -10
  68. package/dist/src/core/lib/RenderCoords.js +27 -55
  69. package/dist/src/core/lib/RenderCoords.js.map +1 -1
  70. package/dist/src/core/lib/WebGlContextWrapper.d.ts +147 -59
  71. package/dist/src/core/lib/WebGlContextWrapper.js +252 -158
  72. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  73. package/dist/src/core/lib/collectionUtils.d.ts +5 -0
  74. package/dist/src/core/lib/collectionUtils.js +82 -0
  75. package/dist/src/core/lib/collectionUtils.js.map +1 -0
  76. package/dist/src/core/lib/colorCache.d.ts +1 -0
  77. package/dist/src/core/lib/colorCache.js +19 -0
  78. package/dist/src/core/lib/colorCache.js.map +1 -0
  79. package/dist/src/core/{renderers/canvas/internal/ColorUtils.d.ts → lib/colorParser.d.ts} +2 -0
  80. package/dist/src/core/{renderers/canvas/internal/ColorUtils.js → lib/colorParser.js} +15 -19
  81. package/dist/src/core/lib/colorParser.js.map +1 -0
  82. package/dist/src/core/lib/textureCompression.d.ts +14 -2
  83. package/dist/src/core/lib/textureCompression.js +320 -86
  84. package/dist/src/core/lib/textureCompression.js.map +1 -1
  85. package/dist/src/core/lib/textureSvg.js +0 -18
  86. package/dist/src/core/lib/textureSvg.js.map +1 -1
  87. package/dist/src/core/lib/utils.d.ts +8 -2
  88. package/dist/src/core/lib/utils.js +21 -20
  89. package/dist/src/core/lib/utils.js.map +1 -1
  90. package/dist/src/core/lib/validateImageBitmap.d.ts +2 -1
  91. package/dist/src/core/lib/validateImageBitmap.js +4 -4
  92. package/dist/src/core/lib/validateImageBitmap.js.map +1 -1
  93. package/dist/src/core/platforms/Platform.d.ts +5 -0
  94. package/dist/src/core/platforms/Platform.js +0 -18
  95. package/dist/src/core/platforms/Platform.js.map +1 -1
  96. package/dist/src/core/platforms/web/WebPlatform.d.ts +1 -0
  97. package/dist/src/core/platforms/web/WebPlatform.js +39 -7
  98. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -1
  99. package/dist/src/core/renderers/CoreContextTexture.d.ts +1 -0
  100. package/dist/src/core/renderers/CoreContextTexture.js +0 -18
  101. package/dist/src/core/renderers/CoreContextTexture.js.map +1 -1
  102. package/dist/src/core/renderers/CoreRenderOp.js +0 -18
  103. package/dist/src/core/renderers/CoreRenderOp.js.map +1 -1
  104. package/dist/src/core/renderers/CoreRenderer.d.ts +25 -23
  105. package/dist/src/core/renderers/CoreRenderer.js +1 -24
  106. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  107. package/dist/src/core/renderers/CoreShaderNode.d.ts +10 -0
  108. package/dist/src/core/renderers/CoreShaderNode.js +19 -2
  109. package/dist/src/core/renderers/CoreShaderNode.js.map +1 -1
  110. package/dist/src/core/renderers/CoreShaderProgram.js +0 -18
  111. package/dist/src/core/renderers/CoreShaderProgram.js.map +1 -1
  112. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +3 -5
  113. package/dist/src/core/renderers/canvas/CanvasRenderer.js +86 -83
  114. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  115. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +2 -17
  116. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
  117. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +3 -2
  118. package/dist/src/core/renderers/canvas/CanvasTexture.js +17 -31
  119. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -1
  120. package/dist/src/core/renderers/webgl/SdfRenderOp.d.ts +33 -0
  121. package/dist/src/core/renderers/webgl/SdfRenderOp.js +80 -0
  122. package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -0
  123. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +2 -0
  124. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +14 -24
  125. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -1
  126. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +13 -0
  127. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +34 -23
  128. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -1
  129. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +16 -6
  130. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +102 -67
  131. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  132. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +31 -19
  133. package/dist/src/core/renderers/webgl/WebGlRenderer.js +297 -200
  134. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  135. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +2 -4
  136. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  137. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +5 -5
  138. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +61 -34
  139. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  140. package/dist/src/core/renderers/webgl/internal/BufferCollection.d.ts +1 -0
  141. package/dist/src/core/renderers/webgl/internal/BufferCollection.js +12 -21
  142. package/dist/src/core/renderers/webgl/internal/BufferCollection.js.map +1 -1
  143. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +0 -18
  144. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
  145. package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +32 -5
  146. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +50 -18
  147. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  148. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js +0 -18
  149. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js.map +1 -1
  150. package/dist/src/core/shaders/canvas/Border.d.ts +8 -2
  151. package/dist/src/core/shaders/canvas/Border.js +67 -41
  152. package/dist/src/core/shaders/canvas/Border.js.map +1 -1
  153. package/dist/src/core/shaders/canvas/HolePunch.js +3 -19
  154. package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -1
  155. package/dist/src/core/shaders/canvas/LinearGradient.js +2 -18
  156. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -1
  157. package/dist/src/core/shaders/canvas/RadialGradient.js +5 -21
  158. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
  159. package/dist/src/core/shaders/canvas/Rounded.js +1 -17
  160. package/dist/src/core/shaders/canvas/Rounded.js.map +1 -1
  161. package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +6 -3
  162. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +40 -26
  163. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  164. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +2 -3
  165. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +43 -23
  166. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
  167. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +4 -18
  168. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
  169. package/dist/src/core/shaders/canvas/Shadow.js +0 -16
  170. package/dist/src/core/shaders/canvas/Shadow.js.map +1 -1
  171. package/dist/src/core/shaders/canvas/utils/render.d.ts +1 -1
  172. package/dist/src/core/shaders/canvas/utils/render.js +31 -34
  173. package/dist/src/core/shaders/canvas/utils/render.js.map +1 -1
  174. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +11 -2
  175. package/dist/src/core/shaders/templates/BorderTemplate.js +30 -26
  176. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -1
  177. package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +2 -2
  178. package/dist/src/core/shaders/templates/HolePunchTemplate.js +2 -18
  179. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -1
  180. package/dist/src/core/shaders/templates/LinearGradientTemplate.js +0 -16
  181. package/dist/src/core/shaders/templates/LinearGradientTemplate.js.map +1 -1
  182. package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +8 -6
  183. package/dist/src/core/shaders/templates/RadialGradientTemplate.js +2 -18
  184. package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +1 -1
  185. package/dist/src/core/shaders/templates/RoundedTemplate.js +0 -16
  186. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -1
  187. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js +0 -16
  188. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js.map +1 -1
  189. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +1 -2
  190. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js +3 -17
  191. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js.map +1 -1
  192. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js +0 -16
  193. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js.map +1 -1
  194. package/dist/src/core/shaders/templates/ShadowTemplate.js +0 -16
  195. package/dist/src/core/shaders/templates/ShadowTemplate.js.map +1 -1
  196. package/dist/src/core/shaders/utils.js +0 -16
  197. package/dist/src/core/shaders/utils.js.map +1 -1
  198. package/dist/src/core/shaders/webgl/Border.js +75 -31
  199. package/dist/src/core/shaders/webgl/Border.js.map +1 -1
  200. package/dist/src/core/shaders/webgl/Default.js +6 -41
  201. package/dist/src/core/shaders/webgl/Default.js.map +1 -1
  202. package/dist/src/core/shaders/webgl/HolePunch.js +2 -18
  203. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -1
  204. package/dist/src/core/shaders/webgl/LinearGradient.js +68 -30
  205. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  206. package/dist/src/core/shaders/webgl/RadialGradient.js +52 -45
  207. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  208. package/dist/src/core/shaders/webgl/Rounded.js +25 -23
  209. package/dist/src/core/shaders/webgl/Rounded.js.map +1 -1
  210. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +110 -48
  211. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  212. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +114 -54
  213. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  214. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +73 -34
  215. package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -1
  216. package/dist/src/core/shaders/webgl/SdfShader.d.ts +0 -2
  217. package/dist/src/core/shaders/webgl/SdfShader.js +7 -35
  218. package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -1
  219. package/dist/src/core/shaders/webgl/Shadow.js +39 -34
  220. package/dist/src/core/shaders/webgl/Shadow.js.map +1 -1
  221. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +59 -0
  222. package/dist/src/core/text-rendering/CanvasFontHandler.js +206 -0
  223. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -0
  224. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +17 -0
  225. package/dist/src/core/text-rendering/CanvasTextRenderer.js +139 -0
  226. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -0
  227. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +167 -0
  228. package/dist/src/core/text-rendering/SdfFontHandler.js +371 -0
  229. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -0
  230. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +18 -0
  231. package/dist/src/core/text-rendering/SdfTextRenderer.js +301 -0
  232. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -0
  233. package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +18 -0
  234. package/dist/src/core/text-rendering/TextLayoutEngine.js +380 -0
  235. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -0
  236. package/dist/src/core/text-rendering/TextRenderer.d.ts +384 -0
  237. package/dist/src/core/text-rendering/TextRenderer.js +2 -0
  238. package/dist/src/core/text-rendering/TextRenderer.js.map +1 -0
  239. package/dist/src/core/text-rendering/Utils.d.ts +30 -0
  240. package/dist/src/core/text-rendering/Utils.js +66 -0
  241. package/dist/src/core/text-rendering/Utils.js.map +1 -0
  242. package/dist/src/core/textures/ColorTexture.d.ts +1 -1
  243. package/dist/src/core/textures/ColorTexture.js +3 -22
  244. package/dist/src/core/textures/ColorTexture.js.map +1 -1
  245. package/dist/src/core/textures/ImageTexture.d.ts +10 -3
  246. package/dist/src/core/textures/ImageTexture.js +33 -62
  247. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  248. package/dist/src/core/textures/NoiseTexture.d.ts +3 -3
  249. package/dist/src/core/textures/NoiseTexture.js +8 -26
  250. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  251. package/dist/src/core/textures/RenderTexture.d.ts +7 -7
  252. package/dist/src/core/textures/RenderTexture.js +12 -30
  253. package/dist/src/core/textures/RenderTexture.js.map +1 -1
  254. package/dist/src/core/textures/SubTexture.d.ts +6 -8
  255. package/dist/src/core/textures/SubTexture.js +19 -55
  256. package/dist/src/core/textures/SubTexture.js.map +1 -1
  257. package/dist/src/core/textures/Texture.d.ts +80 -16
  258. package/dist/src/core/textures/Texture.js +131 -37
  259. package/dist/src/core/textures/Texture.js.map +1 -1
  260. package/dist/src/core/utils.d.ts +2 -1
  261. package/dist/src/core/utils.js +1 -19
  262. package/dist/src/core/utils.js.map +1 -1
  263. package/dist/src/main-api/INode.d.ts +9 -9
  264. package/dist/src/main-api/INode.js.map +1 -1
  265. package/dist/src/main-api/Inspector.d.ts +135 -2
  266. package/dist/src/main-api/Inspector.js +507 -30
  267. package/dist/src/main-api/Inspector.js.map +1 -1
  268. package/dist/src/main-api/Renderer.d.ts +246 -162
  269. package/dist/src/main-api/Renderer.js +192 -152
  270. package/dist/src/main-api/Renderer.js.map +1 -1
  271. package/dist/src/utils.d.ts +23 -4
  272. package/dist/src/utils.js +50 -27
  273. package/dist/src/utils.js.map +1 -1
  274. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  275. package/dist/tsconfig.tsbuildinfo +1 -1
  276. package/exports/canvas-shaders.ts +11 -0
  277. package/exports/canvas.ts +8 -20
  278. package/exports/index.ts +24 -44
  279. package/exports/inspector.ts +0 -19
  280. package/exports/utils.ts +7 -19
  281. package/exports/webgl-shaders.ts +12 -0
  282. package/exports/webgl.ts +15 -20
  283. package/package.json +23 -20
  284. package/src/common/CommonTypes.ts +20 -22
  285. package/src/common/EventEmitter.ts +0 -19
  286. package/src/common/IAnimationController.ts +0 -18
  287. package/src/common/IEventEmitter.ts +0 -17
  288. package/src/core/Autosizer.ts +205 -0
  289. package/src/core/CoreNode.test.ts +378 -46
  290. package/src/core/CoreNode.ts +1007 -659
  291. package/src/core/CoreShaderManager.ts +128 -250
  292. package/src/core/CoreTextNode.ts +457 -321
  293. package/src/core/CoreTextureManager.ts +94 -115
  294. package/src/core/Stage.ts +516 -312
  295. package/src/core/TextureError.ts +46 -0
  296. package/src/core/TextureMemoryManager.ts +139 -175
  297. package/src/core/animations/AnimationManager.ts +0 -19
  298. package/src/core/animations/CoreAnimation.ts +16 -96
  299. package/src/core/animations/CoreAnimationController.ts +0 -19
  300. package/src/core/lib/ContextSpy.ts +0 -19
  301. package/src/core/lib/ImageWorker.ts +43 -31
  302. package/src/core/lib/Matrix3d.ts +7 -20
  303. package/src/core/lib/RenderCoords.ts +36 -67
  304. package/src/core/lib/WebGlContextWrapper.ts +353 -237
  305. package/src/core/lib/collectionUtils.ts +99 -0
  306. package/src/core/lib/colorCache.ts +20 -0
  307. package/src/core/{renderers/canvas/internal/ColorUtils.ts → lib/colorParser.ts} +16 -19
  308. package/src/core/lib/textureCompression.ts +434 -94
  309. package/src/core/lib/textureSvg.ts +0 -19
  310. package/src/core/lib/utils.ts +31 -19
  311. package/src/core/lib/validateImageBitmap.ts +17 -6
  312. package/src/core/platforms/Platform.ts +64 -0
  313. package/src/core/platforms/web/WebPlatform.ts +132 -0
  314. package/src/core/renderers/CoreContextTexture.ts +1 -19
  315. package/src/core/renderers/CoreRenderOp.ts +0 -19
  316. package/src/core/renderers/CoreRenderer.ts +34 -49
  317. package/src/core/renderers/CoreShaderNode.ts +202 -0
  318. package/src/core/renderers/CoreShaderProgram.ts +4 -0
  319. package/src/core/renderers/canvas/CanvasRenderer.ts +270 -0
  320. package/src/core/renderers/canvas/CanvasShaderNode.ts +79 -0
  321. package/src/core/renderers/canvas/{CanvasCoreTexture.ts → CanvasTexture.ts} +15 -27
  322. package/src/core/renderers/webgl/SdfRenderOp.ts +88 -0
  323. package/src/core/renderers/webgl/{WebGlCoreCtxRenderTexture.ts → WebGlCtxRenderTexture.ts} +15 -36
  324. package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +76 -0
  325. package/src/core/renderers/webgl/{WebGlCoreCtxTexture.ts → WebGlCtxTexture.ts} +89 -70
  326. package/src/core/renderers/webgl/WebGlRenderer.ts +850 -0
  327. package/src/core/renderers/webgl/WebGlShaderNode.ts +430 -0
  328. package/src/core/renderers/webgl/WebGlShaderProgram.ts +356 -0
  329. package/src/core/renderers/webgl/internal/BufferCollection.ts +15 -23
  330. package/src/core/renderers/webgl/internal/RendererUtils.ts +0 -19
  331. package/src/core/renderers/webgl/internal/ShaderUtils.ts +143 -24
  332. package/src/core/renderers/webgl/internal/WebGlUtils.ts +0 -19
  333. package/src/core/shaders/canvas/Border.ts +119 -0
  334. package/src/core/shaders/canvas/HolePunch.ts +38 -0
  335. package/src/core/shaders/canvas/LinearGradient.ts +54 -0
  336. package/src/core/shaders/canvas/RadialGradient.ts +82 -0
  337. package/src/core/shaders/canvas/Rounded.ts +38 -0
  338. package/src/core/shaders/canvas/RoundedWithBorder.ts +105 -0
  339. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +118 -0
  340. package/src/core/shaders/canvas/RoundedWithShadow.ts +56 -0
  341. package/src/core/shaders/canvas/Shadow.ts +35 -0
  342. package/src/core/shaders/canvas/utils/render.ts +143 -0
  343. package/src/core/shaders/templates/BorderTemplate.ts +128 -0
  344. package/src/core/shaders/templates/HolePunchTemplate.ts +65 -0
  345. package/src/core/shaders/templates/LinearGradientTemplate.ts +54 -0
  346. package/src/core/shaders/templates/RadialGradientTemplate.ts +66 -0
  347. package/src/core/shaders/templates/RoundedTemplate.ts +81 -0
  348. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +21 -0
  349. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +23 -0
  350. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +18 -0
  351. package/src/core/shaders/templates/ShadowTemplate.ts +89 -0
  352. package/src/core/shaders/utils.ts +30 -0
  353. package/src/core/shaders/webgl/Border.ts +159 -0
  354. package/src/core/shaders/webgl/Default.ts +52 -0
  355. package/src/core/shaders/webgl/HolePunch.ts +58 -0
  356. package/src/core/shaders/webgl/LinearGradient.ts +119 -0
  357. package/src/core/shaders/webgl/RadialGradient.ts +91 -0
  358. package/src/core/shaders/webgl/Rounded.ts +97 -0
  359. package/src/core/shaders/webgl/RoundedWithBorder.ts +212 -0
  360. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +234 -0
  361. package/src/core/shaders/webgl/RoundedWithShadow.ts +132 -0
  362. package/src/core/shaders/webgl/SdfShader.ts +104 -0
  363. package/src/core/shaders/webgl/Shadow.ts +119 -0
  364. package/src/core/text-rendering/CanvasFontHandler.ts +285 -0
  365. package/src/core/text-rendering/CanvasTextRenderer.ts +236 -0
  366. package/src/core/text-rendering/SdfFontHandler.ts +566 -0
  367. package/src/core/text-rendering/SdfTextRenderer.ts +406 -0
  368. package/src/core/text-rendering/TextLayoutEngine.ts +672 -0
  369. package/src/core/text-rendering/TextRenderer.ts +426 -0
  370. package/src/core/text-rendering/Utils.ts +80 -0
  371. package/src/core/text-rendering/tests/TextLayoutEngine.test.ts +434 -0
  372. package/src/core/textures/ColorTexture.ts +7 -24
  373. package/src/core/textures/ImageTexture.ts +72 -78
  374. package/src/core/textures/NoiseTexture.ts +14 -31
  375. package/src/core/textures/RenderTexture.ts +18 -35
  376. package/src/core/textures/SubTexture.ts +25 -65
  377. package/src/core/textures/Texture.ts +182 -53
  378. package/src/core/utils.ts +9 -26
  379. package/src/main-api/INode.ts +10 -29
  380. package/src/main-api/Inspector.ts +794 -38
  381. package/src/main-api/Renderer.ts +476 -274
  382. package/src/utils.ts +83 -29
  383. package/dist/src/core/animations/SimpleAnimation.d.ts +0 -28
  384. package/dist/src/core/animations/SimpleAnimation.js +0 -96
  385. package/dist/src/core/animations/SimpleAnimation.js.map +0 -1
  386. package/dist/src/core/platform.d.ts +0 -10
  387. package/dist/src/core/platform.js +0 -81
  388. package/dist/src/core/platform.js.map +0 -1
  389. package/dist/src/core/renderers/CoreShader.d.ts +0 -9
  390. package/dist/src/core/renderers/CoreShader.js +0 -28
  391. package/dist/src/core/renderers/CoreShader.js.map +0 -1
  392. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +0 -33
  393. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +0 -250
  394. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +0 -1
  395. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +0 -16
  396. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +0 -124
  397. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +0 -1
  398. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +0 -14
  399. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +0 -138
  400. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +0 -1
  401. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +0 -1
  402. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.d.ts +0 -10
  403. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js +0 -43
  404. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js.map +0 -1
  405. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.d.ts +0 -12
  406. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +0 -58
  407. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +0 -1
  408. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.d.ts +0 -9
  409. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +0 -38
  410. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +0 -1
  411. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +0 -56
  412. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +0 -239
  413. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +0 -1
  414. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +0 -34
  415. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +0 -114
  416. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +0 -1
  417. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +0 -133
  418. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +0 -616
  419. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +0 -1
  420. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +0 -83
  421. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +0 -233
  422. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +0 -1
  423. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +0 -44
  424. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +0 -118
  425. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +0 -1
  426. package/dist/src/core/renderers/webgl/shaders/DefaultShader.d.ts +0 -9
  427. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +0 -87
  428. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +0 -1
  429. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.d.ts +0 -10
  430. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +0 -119
  431. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +0 -1
  432. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +0 -29
  433. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +0 -413
  434. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +0 -1
  435. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.d.ts +0 -28
  436. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +0 -131
  437. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +0 -1
  438. package/dist/src/core/renderers/webgl/shaders/SdfShader.d.ts +0 -47
  439. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +0 -160
  440. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +0 -1
  441. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.d.ts +0 -31
  442. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +0 -71
  443. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +0 -1
  444. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.d.ts +0 -30
  445. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +0 -58
  446. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +0 -1
  447. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.d.ts +0 -31
  448. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +0 -71
  449. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +0 -1
  450. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.d.ts +0 -31
  451. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +0 -71
  452. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +0 -1
  453. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.d.ts +0 -31
  454. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +0 -71
  455. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +0 -1
  456. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.d.ts +0 -9
  457. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +0 -136
  458. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +0 -1
  459. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.d.ts +0 -36
  460. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +0 -85
  461. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +0 -1
  462. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.d.ts +0 -45
  463. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +0 -104
  464. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +0 -1
  465. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +0 -22
  466. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +0 -45
  467. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +0 -1
  468. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.d.ts +0 -58
  469. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +0 -80
  470. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js.map +0 -1
  471. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +0 -35
  472. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +0 -129
  473. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +0 -1
  474. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +0 -39
  475. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +0 -116
  476. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +0 -1
  477. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.d.ts +0 -61
  478. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +0 -127
  479. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js.map +0 -1
  480. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.d.ts +0 -40
  481. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +0 -71
  482. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +0 -1
  483. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.d.ts +0 -115
  484. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js +0 -61
  485. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +0 -1
  486. package/dist/src/core/shaders/templates/shaderUtils.d.ts +0 -5
  487. package/dist/src/core/shaders/templates/shaderUtils.js +0 -41
  488. package/dist/src/core/shaders/templates/shaderUtils.js.map +0 -1
  489. package/dist/src/core/shaders/webgl/Magnifier.d.ts +0 -46
  490. package/dist/src/core/shaders/webgl/Magnifier.js +0 -107
  491. package/dist/src/core/shaders/webgl/Magnifier.js.map +0 -1
  492. package/dist/src/core/shaders/webgl/RoundedWithBorder copy.d.ts +0 -3
  493. package/dist/src/core/shaders/webgl/RoundedWithBorder copy.js +0 -218
  494. package/dist/src/core/shaders/webgl/RoundedWithBorder copy.js.map +0 -1
  495. package/dist/src/core/text-rendering/TextRenderingUtils.d.ts +0 -12
  496. package/dist/src/core/text-rendering/TextRenderingUtils.js +0 -14
  497. package/dist/src/core/text-rendering/TextRenderingUtils.js.map +0 -1
  498. package/dist/src/core/text-rendering/TextTextureRendererUtils.d.ts +0 -72
  499. package/dist/src/core/text-rendering/TextTextureRendererUtils.js +0 -217
  500. package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +0 -1
  501. package/dist/src/core/text-rendering/TrFontManager.d.ts +0 -26
  502. package/dist/src/core/text-rendering/TrFontManager.js +0 -131
  503. package/dist/src/core/text-rendering/TrFontManager.js.map +0 -1
  504. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.d.ts +0 -39
  505. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +0 -125
  506. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +0 -1
  507. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.d.ts +0 -103
  508. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js +0 -21
  509. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js.map +0 -1
  510. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.d.ts +0 -62
  511. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +0 -88
  512. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +0 -1
  513. package/dist/src/core/text-rendering/font-face-types/TrFontFace.d.ts +0 -118
  514. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +0 -63
  515. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +0 -1
  516. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.d.ts +0 -14
  517. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +0 -66
  518. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +0 -1
  519. package/dist/src/core/text-rendering/font-face-types/utils.d.ts +0 -1
  520. package/dist/src/core/text-rendering/font-face-types/utils.js +0 -38
  521. package/dist/src/core/text-rendering/font-face-types/utils.js.map +0 -1
  522. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +0 -59
  523. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +0 -397
  524. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +0 -1
  525. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +0 -120
  526. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +0 -551
  527. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +0 -1
  528. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +0 -92
  529. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +0 -607
  530. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +0 -1
  531. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.d.ts +0 -12
  532. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js +0 -61
  533. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js.map +0 -1
  534. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.d.ts +0 -33
  535. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js +0 -52
  536. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js.map +0 -1
  537. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.d.ts +0 -13
  538. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js +0 -32
  539. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js.map +0 -1
  540. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +0 -23
  541. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +0 -84
  542. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js.map +0 -1
  543. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.d.ts +0 -4
  544. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js +0 -34
  545. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js.map +0 -1
  546. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +0 -20
  547. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +0 -308
  548. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +0 -1
  549. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.d.ts +0 -10
  550. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js +0 -40
  551. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js.map +0 -1
  552. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +0 -26
  553. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js +0 -70
  554. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js.map +0 -1
  555. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.d.ts +0 -16
  556. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js +0 -39
  557. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js.map +0 -1
  558. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +0 -373
  559. package/dist/src/core/text-rendering/renderers/TextRenderer.js +0 -178
  560. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +0 -1
  561. package/dist/src/main-api/DynamicShaderController.d.ts +0 -29
  562. package/dist/src/main-api/DynamicShaderController.js +0 -58
  563. package/dist/src/main-api/DynamicShaderController.js.map +0 -1
  564. package/dist/src/main-api/ShaderController.d.ts +0 -31
  565. package/dist/src/main-api/ShaderController.js +0 -37
  566. package/dist/src/main-api/ShaderController.js.map +0 -1
  567. package/scripts/please-use-pnpm.js +0 -13
  568. package/src/core/platform.ts +0 -100
  569. package/src/core/renderers/CoreShader.ts +0 -41
  570. package/src/core/renderers/canvas/CanvasCoreRenderer.ts +0 -375
  571. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +0 -231
  572. package/src/core/renderers/canvas/shaders/UnsupportedShader.ts +0 -48
  573. package/src/core/renderers/webgl/WebGlCoreCtxSubTexture.ts +0 -50
  574. package/src/core/renderers/webgl/WebGlCoreRenderOp.ts +0 -125
  575. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +0 -821
  576. package/src/core/renderers/webgl/WebGlCoreShader.ts +0 -365
  577. package/src/core/renderers/webgl/shaders/DefaultShader.ts +0 -93
  578. package/src/core/renderers/webgl/shaders/DefaultShaderBatched.ts +0 -132
  579. package/src/core/renderers/webgl/shaders/DynamicShader.ts +0 -580
  580. package/src/core/renderers/webgl/shaders/RoundedRectangle.ts +0 -167
  581. package/src/core/renderers/webgl/shaders/SdfShader.ts +0 -204
  582. package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +0 -101
  583. package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +0 -87
  584. package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +0 -101
  585. package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +0 -101
  586. package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +0 -101
  587. package/src/core/renderers/webgl/shaders/effects/EffectUtils.ts +0 -159
  588. package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +0 -127
  589. package/src/core/renderers/webgl/shaders/effects/GlitchEffect.ts +0 -148
  590. package/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.ts +0 -67
  591. package/src/core/renderers/webgl/shaders/effects/HolePunchEffect.ts +0 -157
  592. package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +0 -171
  593. package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +0 -168
  594. package/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.ts +0 -187
  595. package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +0 -110
  596. package/src/core/renderers/webgl/shaders/effects/ShaderEffect.ts +0 -196
  597. package/src/core/text-rendering/TextRenderingUtils.ts +0 -36
  598. package/src/core/text-rendering/TextTextureRendererUtils.ts +0 -263
  599. package/src/core/text-rendering/TrFontManager.ts +0 -183
  600. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +0 -176
  601. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +0 -139
  602. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +0 -173
  603. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +0 -171
  604. package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -187
  605. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -94
  606. package/src/core/text-rendering/font-face-types/utils.ts +0 -39
  607. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +0 -509
  608. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -808
  609. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +0 -853
  610. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +0 -48
  611. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +0 -66
  612. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +0 -52
  613. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +0 -32
  614. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +0 -117
  615. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +0 -133
  616. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +0 -38
  617. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +0 -408
  618. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +0 -49
  619. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +0 -52
  620. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +0 -205
  621. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +0 -93
  622. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +0 -40
  623. package/src/core/text-rendering/renderers/TextRenderer.ts +0 -557
  624. package/src/main-api/DynamicShaderController.ts +0 -104
  625. package/src/main-api/ShaderController.ts +0 -80
@@ -1,33 +1,20 @@
1
- /*
2
- * If not stated otherwise in this file or this component's LICENSE file the
3
- * following copyright and licenses apply:
4
- *
5
- * Copyright 2023 Comcast Cable Communications Management, LLC.
6
- *
7
- * Licensed under the Apache License, Version 2.0 (the License);
8
- * you may not use this file except in compliance with the License.
9
- * You may obtain a copy of the License at
10
- *
11
- * http://www.apache.org/licenses/LICENSE-2.0
12
- *
13
- * Unless required by applicable law or agreed to in writing, software
14
- * distributed under the License is distributed on an "AS IS" BASIS,
15
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- * See the License for the specific language governing permissions and
17
- * limitations under the License.
18
- */
19
-
20
1
  import {
21
2
  assertTruthy,
22
3
  getNewId,
23
- isProductionEnvironment,
24
- mergeColorAlphaPremultiplied,
4
+ premultiplyColorABGR,
5
+ USE_RTT,
6
+ ENABLE_AUTOSIZE,
7
+ EMIT_BOUNDS_EVENTS,
25
8
  } from '../utils.js';
26
9
  import type { TextureOptions } from './CoreTextureManager.js';
10
+ import type { WebGlRenderer } from './renderers/webgl/WebGlRenderer.js';
11
+ import type { WebGlCtxTexture } from './renderers/webgl/WebGlCtxTexture.js';
12
+ import type { BufferCollection } from './renderers/webgl/internal/BufferCollection.js';
27
13
  import type { CoreRenderer } from './renderers/CoreRenderer.js';
28
14
  import type { Stage } from './Stage.js';
29
15
  import {
30
16
  type Texture,
17
+ type TextureCoords,
31
18
  type TextureFailedEventHandler,
32
19
  type TextureFreedEventHandler,
33
20
  type TextureLoadedEventHandler,
@@ -37,6 +24,7 @@ import type {
37
24
  NodeTextureFailedPayload,
38
25
  NodeTextureFreedPayload,
39
26
  NodeTextureLoadedPayload,
27
+ NodeRenderablePayload,
40
28
  } from '../common/CommonTypes.js';
41
29
  import { EventEmitter } from '../common/EventEmitter.js';
42
30
  import {
@@ -55,7 +43,9 @@ import type { AnimationSettings } from './animations/CoreAnimation.js';
55
43
  import type { IAnimationController } from '../common/IAnimationController.js';
56
44
  import { CoreAnimation } from './animations/CoreAnimation.js';
57
45
  import { CoreAnimationController } from './animations/CoreAnimationController.js';
58
- import type { BaseShaderController } from '../main-api/ShaderController.js';
46
+ import type { CoreShaderNode } from './renderers/CoreShaderNode.js';
47
+ import { AutosizeMode, Autosizer } from './Autosizer.js';
48
+ import { removeChild } from './lib/collectionUtils.js';
59
49
 
60
50
  export enum CoreNodeRenderState {
61
51
  Init = 0,
@@ -64,6 +54,14 @@ export enum CoreNodeRenderState {
64
54
  InViewport = 8,
65
55
  }
66
56
 
57
+ const NO_CLIPPING_RECT: RectWithValid = {
58
+ x: 0,
59
+ y: 0,
60
+ width: 0,
61
+ height: 0,
62
+ valid: false,
63
+ };
64
+
67
65
  const CoreNodeRenderStateMap: Map<CoreNodeRenderState, string> = new Map();
68
66
  CoreNodeRenderStateMap.set(CoreNodeRenderState.Init, 'init');
69
67
  CoreNodeRenderStateMap.set(CoreNodeRenderState.OutOfBounds, 'outOfBounds');
@@ -77,33 +75,24 @@ export enum UpdateType {
77
75
  Children = 1,
78
76
 
79
77
  /**
80
- * Scale/Rotate transform update
81
- *
82
- * @remarks
83
- * CoreNode Properties Updated:
84
- * - `scaleRotateTransform`
85
- */
86
- ScaleRotate = 2,
87
-
88
- /**
89
- * Translate transform update (x/y/width/height/pivot/mount)
78
+ * localTransform
90
79
  *
91
80
  * @remarks
92
81
  * CoreNode Properties Updated:
93
82
  * - `localTransform`
94
83
  */
95
- Local = 4,
84
+ Local = 2,
96
85
 
97
86
  /**
98
- * Global Transform update
87
+ * globalTransform
99
88
  *
100
- * @remarks
89
+ * * @remarks
101
90
  * CoreNode Properties Updated:
102
91
  * - `globalTransform`
92
+ * - `renderBounds`
103
93
  * - `renderCoords`
104
- * - `renderBound`
105
94
  */
106
- Global = 8,
95
+ Global = 4,
107
96
 
108
97
  /**
109
98
  * Clipping rect update
@@ -112,25 +101,16 @@ export enum UpdateType {
112
101
  * CoreNode Properties Updated:
113
102
  * - `clippingRect`
114
103
  */
115
- Clipping = 16,
116
-
117
- /**
118
- * Calculated ZIndex update
119
- *
120
- * @remarks
121
- * CoreNode Properties Updated:
122
- * - `calcZIndex`
123
- */
124
- CalculatedZIndex = 32,
104
+ Clipping = 8,
125
105
 
126
106
  /**
127
- * Z-Index Sorted Children update
107
+ * Sort Z-Index Children update
128
108
  *
129
109
  * @remarks
130
110
  * CoreNode Properties Updated:
131
111
  * - `children` (sorts children by their `calcZIndex`)
132
112
  */
133
- ZIndexSortedChildren = 64,
113
+ SortZIndexChildren = 16,
134
114
 
135
115
  /**
136
116
  * Premultiplied Colors update
@@ -142,7 +122,7 @@ export enum UpdateType {
142
122
  * - `premultipliedColorBl`
143
123
  * - `premultipliedColorBr`
144
124
  */
145
- PremultipliedColors = 128,
125
+ PremultipliedColors = 32,
146
126
 
147
127
  /**
148
128
  * World Alpha update
@@ -151,7 +131,7 @@ export enum UpdateType {
151
131
  * CoreNode Properties Updated:
152
132
  * - `worldAlpha` = `parent.worldAlpha` * `alpha`
153
133
  */
154
- WorldAlpha = 256,
134
+ WorldAlpha = 64,
155
135
 
156
136
  /**
157
137
  * Render State update
@@ -160,7 +140,7 @@ export enum UpdateType {
160
140
  * CoreNode Properties Updated:
161
141
  * - `renderState`
162
142
  */
163
- RenderState = 512,
143
+ RenderState = 128,
164
144
 
165
145
  /**
166
146
  * Is Renderable update
@@ -169,23 +149,32 @@ export enum UpdateType {
169
149
  * CoreNode Properties Updated:
170
150
  * - `isRenderable`
171
151
  */
172
- IsRenderable = 1024,
152
+ IsRenderable = 256,
173
153
 
174
154
  /**
175
155
  * Render Texture update
176
156
  */
177
- RenderTexture = 2048,
157
+ RenderTexture = 512,
178
158
 
179
159
  /**
180
160
  * Track if parent has render texture
181
161
  */
182
- ParentRenderTexture = 4096,
162
+ ParentRenderTexture = 1024,
183
163
 
184
164
  /**
185
165
  * Render Bounds update
186
166
  */
187
- RenderBounds = 8192,
167
+ RenderBounds = 2048,
188
168
 
169
+ /**
170
+ * RecalcUniforms
171
+ */
172
+ RecalcUniforms = 4096,
173
+
174
+ /**
175
+ * Autosize update
176
+ */
177
+ Autosize = 8192,
189
178
  /**
190
179
  * None
191
180
  */
@@ -194,7 +183,7 @@ export enum UpdateType {
194
183
  /**
195
184
  * All
196
185
  */
197
- All = 14335,
186
+ All = 16383,
198
187
  }
199
188
 
200
189
  /**
@@ -235,16 +224,18 @@ export interface CoreNodeProps {
235
224
  y: number;
236
225
  /**
237
226
  * The width of the Node.
227
+ * @warning This will be deprecated in favor of `w` and `h` properties in the future.
238
228
  *
239
229
  * @default `0`
240
230
  */
241
- width: number;
231
+ w: number;
242
232
  /**
243
233
  * The height of the Node.
234
+ * @warning This will be deprecated in favor of `w` and `h` properties in the future.
244
235
  *
245
236
  * @default `0`
246
237
  */
247
- height: number;
238
+ h: number;
248
239
  /**
249
240
  * The alpha opacity of the Node.
250
241
  *
@@ -256,14 +247,35 @@ export interface CoreNodeProps {
256
247
  */
257
248
  alpha: number;
258
249
  /**
259
- * Autosize mode
250
+ * Autosize
260
251
  *
261
252
  * @remarks
262
- * When enabled, when a texture is loaded into the Node, the Node will
263
- * automatically resize to the dimensions of the texture.
253
+ * When enabled, the Node automatically resizes based on its content
254
+ *
255
+ * **Texture Autosize Mode:**
256
+ * - When the Node has a texture, it automatically resizes to match the
257
+ * texture's dimensions when the texture loads
258
+ * - This ensures images display at their natural size without manual sizing
259
+ * - Text Nodes always use this mode regardless of this setting
260
+ *
261
+ * **Children Autosize Mode:**
262
+ * - When the Node has no texture but contains children, it automatically
263
+ * resizes to encompass all children's bounds
264
+ * - Calculates the bounding box that contains all child positions, dimensions,
265
+ * and transforms (scale, rotation, mount/pivot points)
266
+ * - Creates container behavior where the parent grows to fit its content
267
+ * - Updates dynamically as children are added, removed, or transformed
268
+ *
269
+ * **Mode Selection Logic:**
270
+ * - Texture mode takes precedence over children mode
271
+ * - Mode switches automatically when texture is added/removed
272
+ * - If no texture and no children, autosize has no effect
273
+ *
274
+ * **Performance:**
275
+ * - Children mode uses efficient transform caching and differential updates
276
+ * - Only recalculates when child transforms actually change
277
+ * - Minimal memory allocation with factory function patterns
264
278
  *
265
- * Text Nodes are always autosized based on their text content regardless
266
- * of this mode setting.
267
279
  *
268
280
  * @default `false`
269
281
  */
@@ -391,7 +403,11 @@ export interface CoreNodeProps {
391
403
  * The Node's z-index.
392
404
  *
393
405
  * @remarks
394
- * TBD
406
+ * Max z-index of children under the same parent determines which child
407
+ * is rendered on top. Higher z-index means the Node is rendered on top of
408
+ * children with lower z-index.
409
+ *
410
+ * Max value is 1000 and min value is -1000. Values outside of this range will be clamped.
395
411
  */
396
412
  zIndex: number;
397
413
  /**
@@ -419,15 +435,6 @@ export interface CoreNodeProps {
419
435
  */
420
436
  texture: Texture | null;
421
437
 
422
- /**
423
- * [Deprecated]: Prevents the texture from being cleaned up when the Node is removed
424
- *
425
- * @remarks
426
- * Please use the `preventCleanup` property on {@link TextureOptions} instead.
427
- *
428
- * @default false
429
- */
430
- preventCleanup: boolean;
431
438
  /**
432
439
  * Options to associate with the Node's Texture
433
440
  */
@@ -447,7 +454,7 @@ export interface CoreNodeProps {
447
454
  * Note: If this is a Text Node, the Shader will be managed by the Node's
448
455
  * {@link TextRenderer} and should not be set explicitly.
449
456
  */
450
- shader: BaseShaderController;
457
+ shader: CoreShaderNode<any> | null;
451
458
  /**
452
459
  * Image URL
453
460
  *
@@ -457,7 +464,6 @@ export interface CoreNodeProps {
457
464
  * settings being defaults)
458
465
  */
459
466
  src: string | null;
460
- zIndexLocked: number;
461
467
  /**
462
468
  * Scale to render the Node at
463
469
  *
@@ -677,21 +683,6 @@ export interface CoreNodeProps {
677
683
  * are provided. Only works when createImageBitmap is supported on the browser.
678
684
  */
679
685
  srcY?: number;
680
- /**
681
- * By enabling Strict bounds the renderer will not process & render child nodes of a node that is out of the visible area
682
- *
683
- * @remarks
684
- * When enabled out of bound nodes, i.e. nodes that are out of the visible area, will
685
- * **NOT** have their children processed and renderer anymore. This means the children of a out of bound
686
- * node will not receive update processing such as positioning updates and will not be drawn on screen.
687
- * As such the rest of the branch of the update tree that sits below this node will not be processed anymore
688
- *
689
- * This is a big performance gain but may be disabled in cases where the width of the parent node is
690
- * unknown and the render must process the child nodes regardless of the viewport status of the parent node
691
- *
692
- * @default false
693
- */
694
- strictBounds: boolean;
695
686
  /**
696
687
  * Mark the node as interactive so we can perform hit tests on it
697
688
  * when pointer events are registered.
@@ -730,12 +721,34 @@ export class CoreNode extends EventEmitter {
730
721
  readonly children: CoreNode[] = [];
731
722
  protected _id: number = getNewId();
732
723
  readonly props: CoreNodeProps;
724
+ public readonly isCoreNode = true as const;
725
+
726
+ // WebGL Render Op State
727
+ public renderOpBufferIdx: number = 0;
728
+ public numQuads: number = 0;
729
+ public renderOpTextures: WebGlCtxTexture[] = [];
730
+
731
+ /**
732
+ * Permanent index (in float32 units) into the renderer's quad buffer.
733
+ * -1 means this node has not yet been assigned a slot.
734
+ */
735
+ public quadBufferIndex: number = -1;
736
+
737
+ /**
738
+ * True when renderCoords, premultiplied colors, or textureCoords changed
739
+ * since the node's quad was last written to the GPU.
740
+ */
741
+ public isQuadDirty: boolean = true;
742
+
743
+ private hasShaderUpdater = false;
744
+ public hasShaderTimeFn = false;
745
+ private hasColorProps = false;
746
+ public textureLoaded = false;
733
747
 
734
748
  public updateType = UpdateType.All;
735
749
  public childUpdateType = UpdateType.None;
736
750
 
737
751
  public globalTransform?: Matrix3d;
738
- public scaleRotateTransform?: Matrix3d;
739
752
  public localTransform?: Matrix3d;
740
753
  public sceneGlobalTransform?: Matrix3d;
741
754
  public renderCoords?: RenderCoords;
@@ -750,8 +763,11 @@ export class CoreNode extends EventEmitter {
750
763
  height: 0,
751
764
  valid: false,
752
765
  };
766
+ public textureCoords?: TextureCoords;
767
+ public updateShaderUniforms: boolean = false;
753
768
  public isRenderable = false;
754
769
  public renderState: CoreNodeRenderState = CoreNodeRenderState.Init;
770
+ public isSimple = true;
755
771
 
756
772
  public worldAlpha = 1;
757
773
  public premultipliedColorTl = 0;
@@ -762,123 +778,189 @@ export class CoreNode extends EventEmitter {
762
778
  public hasRTTupdates = false;
763
779
  public parentHasRenderTexture = false;
764
780
  public rttParent: CoreNode | null = null;
781
+ /**
782
+ * only used when rtt = true
783
+ */
784
+ public framebufferDimensions: Dimensions | null = null;
785
+
786
+ /**Autosize properties */
787
+ autosizer: Autosizer | null = null;
788
+ parentAutosizer: Autosizer | null = null;
765
789
 
766
790
  public destroyed = false;
767
791
 
768
792
  constructor(readonly stage: Stage, props: CoreNodeProps) {
769
793
  super();
770
794
 
771
- this.props = {
772
- ...props,
773
- parent: null,
795
+ //inital update type
796
+ let initialUpdateType =
797
+ UpdateType.Local | UpdateType.RenderBounds | UpdateType.RenderState;
798
+
799
+ // Fast-path assign only known keys
800
+ const p = (this.props = {
801
+ x: props.x,
802
+ y: props.y,
803
+ w: props.w,
804
+ h: props.h,
805
+ alpha: props.alpha,
806
+ autosize: props.autosize,
807
+ clipping: props.clipping,
808
+ color: props.color,
809
+ colorTop: props.colorTop,
810
+ colorBottom: props.colorBottom,
811
+ colorLeft: props.colorLeft,
812
+ colorRight: props.colorRight,
813
+ colorTl: props.colorTl,
814
+ colorTr: props.colorTr,
815
+ colorBl: props.colorBl,
816
+ colorBr: props.colorBr,
817
+ scaleX: props.scaleX,
818
+ scaleY: props.scaleY,
819
+ rotation: props.rotation,
820
+ pivotX: props.pivotX,
821
+ pivotY: props.pivotY,
822
+ mountX: props.mountX,
823
+ mountY: props.mountY,
824
+ mount: props.mount,
825
+ pivot: props.pivot,
826
+ zIndex: props.zIndex,
827
+ textureOptions: props.textureOptions,
828
+ data: props.data,
829
+ imageType: props.imageType,
830
+ srcX: props.srcX,
831
+ srcY: props.srcY,
832
+ srcWidth: props.srcWidth,
833
+ srcHeight: props.srcHeight,
834
+ parent: props.parent,
774
835
  texture: null,
836
+ shader: null,
775
837
  src: null,
776
838
  rtt: false,
777
- };
839
+ boundsMargin: null,
840
+ scale: null,
841
+ interactive: props.interactive,
842
+ });
843
+
844
+ //check if any color props are set for premultiplied color updates
845
+ if (
846
+ p.color > 0 ||
847
+ p.colorTop > 0 ||
848
+ p.colorBottom > 0 ||
849
+ p.colorLeft > 0 ||
850
+ p.colorRight > 0 ||
851
+ p.colorTl > 0 ||
852
+ p.colorTr > 0 ||
853
+ p.colorBl > 0 ||
854
+ p.colorBr > 0
855
+ ) {
856
+ this.hasColorProps = true;
857
+ initialUpdateType |= UpdateType.PremultipliedColors;
858
+ }
859
+
860
+ // Only set non-default values
861
+ if (p.zIndex !== 0) {
862
+ this.zIndex = p.zIndex;
863
+ }
864
+
865
+ if (props.parent !== null) {
866
+ props.parent.addChild(this);
867
+ }
778
868
 
779
- // Assign props to instance
780
- this.parent = props.parent;
869
+ // Assign props to instances
781
870
  this.texture = props.texture;
871
+ this.shader = props.shader;
782
872
  this.src = props.src;
783
873
  this.rtt = props.rtt;
874
+ this.boundsMargin = props.boundsMargin;
784
875
  this.interactive = props.interactive;
785
876
 
786
- if (props.boundsMargin) {
787
- this.boundsMargin = Array.isArray(props.boundsMargin)
788
- ? props.boundsMargin
789
- : [
790
- props.boundsMargin,
791
- props.boundsMargin,
792
- props.boundsMargin,
793
- props.boundsMargin,
794
- ];
877
+ // Initialize autosize if enabled
878
+ if (p.autosize === true) {
879
+ this.autosizer = new Autosizer(this);
795
880
  }
796
881
 
797
- this.setUpdateType(
798
- UpdateType.ScaleRotate |
799
- UpdateType.Local |
800
- UpdateType.RenderBounds |
801
- UpdateType.RenderState,
802
- );
803
-
804
- if (isProductionEnvironment() === false && props.preventCleanup === true) {
805
- console.warn(
806
- 'CoreNode.preventCleanup: Is deprecated and will be removed in upcoming release, please use textureOptions.preventCleanup instead',
807
- );
808
- }
882
+ this.setUpdateType(initialUpdateType);
809
883
 
810
884
  // if the default texture isn't loaded yet, wait for it to load
811
885
  // this only happens when the node is created before the stage is ready
812
- if (
813
- this.stage.defaultTexture &&
814
- this.stage.defaultTexture.state !== 'loaded'
815
- ) {
816
- this.stage.defaultTexture.once('loaded', () => {
817
- this.setUpdateType(UpdateType.IsRenderable);
818
- });
886
+ const dt = this.stage.defaultTexture;
887
+ if (dt !== null && dt.state !== 'loaded') {
888
+ dt.once('loaded', () => this.setUpdateType(UpdateType.IsRenderable));
819
889
  }
890
+ this.updateIsSimple();
820
891
  }
821
892
 
822
893
  //#region Textures
823
894
  loadTexture(): void {
824
- const { texture } = this.props;
825
- assertTruthy(texture);
895
+ if (this.props.texture === null) {
896
+ return;
897
+ }
826
898
 
827
899
  // If texture is already loaded / failed, trigger loaded event manually
828
900
  // so that users get a consistent event experience.
829
901
  // We do this in a microtask to allow listeners to be attached in the same
830
902
  // synchronous task after calling loadTexture()
831
- queueMicrotask(() => {
832
- if (this.textureOptions.preload === true) {
833
- this.stage.txManager.loadTexture(texture);
834
- }
903
+ queueMicrotask(this.loadTextureTask);
904
+ }
835
905
 
836
- texture.preventCleanup =
837
- this.props.textureOptions?.preventCleanup ?? false;
838
- texture.on('loaded', this.onTextureLoaded);
839
- texture.on('failed', this.onTextureFailed);
840
- texture.on('freed', this.onTextureFreed);
841
-
842
- // If the parent is a render texture, the initial texture status
843
- // will be set to freed until the texture is processed by the
844
- // Render RTT nodes. So we only need to listen fo changes and
845
- // no need to check the texture.state until we restructure how
846
- // textures are being processed.
847
- if (this.parentHasRenderTexture) {
848
- this.notifyParentRTTOfUpdate();
849
- return;
850
- }
906
+ /**
907
+ * Task for queueMicrotask to loadTexture
908
+ *
909
+ * @remarks
910
+ * This method is called in a microtask to release the texture.
911
+ */
912
+ private loadTextureTask = (): void => {
913
+ const texture = this.props.texture as Texture;
914
+ //it is possible that texture is null here if user sets the texture to null right after loadTexture call
915
+ if (texture === null) {
916
+ return;
917
+ }
918
+ if (this.textureOptions.preload === true) {
919
+ this.stage.txManager.loadTexture(texture);
920
+ }
851
921
 
852
- if (texture.state === 'loaded') {
853
- assertTruthy(texture.dimensions);
854
- this.onTextureLoaded(texture, texture.dimensions);
855
- } else if (texture.state === 'failed') {
856
- assertTruthy(texture.error);
857
- this.onTextureFailed(texture, texture.error);
858
- } else if (texture.state === 'freed') {
859
- this.onTextureFreed(texture);
860
- }
861
- });
862
- }
922
+ texture.preventCleanup = this.props.textureOptions?.preventCleanup ?? false;
923
+ texture.on('loaded', this.onTextureLoaded);
924
+ texture.on('failed', this.onTextureFailed);
925
+ texture.on('freed', this.onTextureFreed);
926
+
927
+ // If the parent is a render texture, the initial texture status
928
+ // will be set to freed until the texture is processed by the
929
+ // Render RTT nodes. So we only need to listen fo changes and
930
+ // no need to check the texture.state until we restructure how
931
+ // textures are being processed.
932
+ if (this.parentHasRenderTexture) {
933
+ this.notifyParentRTTOfUpdate();
934
+ return;
935
+ }
936
+
937
+ if (texture.state === 'loaded') {
938
+ this.onTextureLoaded(texture, texture.dimensions!);
939
+ } else if (texture.state === 'failed') {
940
+ this.onTextureFailed(texture, texture.error!);
941
+ } else if (texture.state === 'freed') {
942
+ this.onTextureFreed(texture);
943
+ }
944
+ };
863
945
 
864
946
  unloadTexture(): void {
865
- if (this.texture !== null) {
866
- this.texture.off('loaded', this.onTextureLoaded);
867
- this.texture.off('failed', this.onTextureFailed);
868
- this.texture.off('freed', this.onTextureFreed);
869
- this.texture.setRenderableOwner(this, false);
947
+ if (this.texture === null) {
948
+ return;
870
949
  }
950
+
951
+ const texture = this.texture;
952
+ texture.off('loaded', this.onTextureLoaded);
953
+ texture.off('failed', this.onTextureFailed);
954
+ texture.off('freed', this.onTextureFreed);
955
+ texture.setRenderableOwner(this._id, false);
871
956
  }
872
957
 
873
- autosizeNode(dimensions: Dimensions) {
874
- if (this.autosize) {
875
- this.width = dimensions.width;
876
- this.height = dimensions.height;
958
+ protected onTextureLoaded: TextureLoadedEventHandler = (_, dimensions) => {
959
+ if (this.autosizer !== null) {
960
+ this.autosizer.update();
877
961
  }
878
- }
879
962
 
880
- private onTextureLoaded: TextureLoadedEventHandler = (_, dimensions) => {
881
- this.autosizeNode(dimensions);
963
+ this.textureLoaded = true;
882
964
  this.setUpdateType(UpdateType.IsRenderable);
883
965
 
884
966
  // Texture was loaded. In case the RAF loop has already stopped, we request
@@ -891,13 +973,20 @@ export class CoreNode extends EventEmitter {
891
973
  }
892
974
 
893
975
  // ignore 1x1 pixel textures
894
- if (dimensions.width > 1 && dimensions.height > 1) {
976
+ if (dimensions.w > 1 && dimensions.h > 1) {
895
977
  this.emit('loaded', {
896
978
  type: 'texture',
897
979
  dimensions,
898
980
  } satisfies NodeTextureLoadedPayload);
899
981
  }
900
982
 
983
+ if (
984
+ this.stage.calculateTextureCoord === true &&
985
+ this.props.textureOptions !== null
986
+ ) {
987
+ this.textureCoords = this.stage.renderer.getTextureCoords!(this);
988
+ }
989
+
901
990
  // Trigger a local update if the texture is loaded and the resizeMode is 'contain'
902
991
  if (this.props.textureOptions?.resizeMode?.type === 'contain') {
903
992
  this.setUpdateType(UpdateType.Local);
@@ -907,7 +996,9 @@ export class CoreNode extends EventEmitter {
907
996
  private onTextureFailed: TextureFailedEventHandler = (_, error) => {
908
997
  // immediately set isRenderable to false, so that we handle the error
909
998
  // without waiting for the next frame loop
999
+ this.textureLoaded = false;
910
1000
  this.isRenderable = false;
1001
+ this.updateTextureOwnership(false);
911
1002
  this.setUpdateType(UpdateType.IsRenderable);
912
1003
 
913
1004
  // If parent has a render texture, flag that we need to update
@@ -915,16 +1006,23 @@ export class CoreNode extends EventEmitter {
915
1006
  this.notifyParentRTTOfUpdate();
916
1007
  }
917
1008
 
918
- this.emit('failed', {
919
- type: 'texture',
920
- error,
921
- } satisfies NodeTextureFailedPayload);
1009
+ if (
1010
+ this.texture !== null &&
1011
+ this.texture.retryCount > this.texture.maxRetryCount
1012
+ ) {
1013
+ this.emit('failed', {
1014
+ type: 'texture',
1015
+ error,
1016
+ } satisfies NodeTextureFailedPayload);
1017
+ }
922
1018
  };
923
1019
 
924
1020
  private onTextureFreed: TextureFreedEventHandler = () => {
925
1021
  // immediately set isRenderable to false, so that we handle the error
926
1022
  // without waiting for the next frame loop
1023
+ this.textureLoaded = false;
927
1024
  this.isRenderable = false;
1025
+ this.updateTextureOwnership(false);
928
1026
  this.setUpdateType(UpdateType.IsRenderable);
929
1027
 
930
1028
  // If parent has a render texture, flag that we need to update
@@ -950,48 +1048,38 @@ export class CoreNode extends EventEmitter {
950
1048
  this.updateType |= type;
951
1049
 
952
1050
  const parent = this.props.parent;
953
- if (!parent) return;
1051
+ if (!parent || parent.updateType & UpdateType.Children) return;
954
1052
 
955
- if ((parent.updateType & UpdateType.Children) === 0) {
956
- // Inform the parent if it doesn’t already have a child update
957
- parent.setUpdateType(UpdateType.Children);
958
- }
959
- }
960
-
961
- sortChildren() {
962
- this.children.sort((a, b) => a.calcZIndex - b.calcZIndex);
1053
+ parent.setUpdateType(UpdateType.Children);
963
1054
  }
964
1055
 
965
- updateScaleRotateTransform() {
966
- const { rotation, scaleX, scaleY } = this.props;
1056
+ updateLocalTransform() {
1057
+ const p = this.props;
1058
+ const { x, y } = p;
967
1059
 
968
- // optimize simple translation cases
969
- if (rotation === 0 && scaleX === 1 && scaleY === 1) {
970
- this.scaleRotateTransform = undefined;
1060
+ if (this.isSimple) {
1061
+ this.localTransform = Matrix3d.translate(x, y, this.localTransform);
971
1062
  return;
972
1063
  }
973
1064
 
974
- this.scaleRotateTransform = Matrix3d.rotate(
975
- rotation,
976
- this.scaleRotateTransform,
977
- ).scale(scaleX, scaleY);
978
- }
979
-
980
- updateLocalTransform() {
981
- const { x, y, width, height } = this.props;
982
- const mountTranslateX = this.props.mountX * width;
983
- const mountTranslateY = this.props.mountY * height;
1065
+ const { w, h } = p;
1066
+ const mountTranslateX = p.mountX * w;
1067
+ const mountTranslateY = p.mountY * h;
984
1068
 
985
- if (this.scaleRotateTransform) {
986
- const pivotTranslateX = this.props.pivotX * width;
987
- const pivotTranslateY = this.props.pivotY * height;
1069
+ if (p.rotation !== 0 || p.scaleX !== 1 || p.scaleY !== 1) {
1070
+ const scaleRotate = Matrix3d.rotate(p.rotation, Matrix3d.temp).scale(
1071
+ p.scaleX,
1072
+ p.scaleY,
1073
+ );
1074
+ const pivotTranslateX = p.pivotX * w;
1075
+ const pivotTranslateY = p.pivotY * h;
988
1076
 
989
1077
  this.localTransform = Matrix3d.translate(
990
1078
  x - mountTranslateX + pivotTranslateX,
991
1079
  y - mountTranslateY + pivotTranslateY,
992
1080
  this.localTransform,
993
1081
  )
994
- .multiply(this.scaleRotateTransform)
1082
+ .multiply(scaleRotate)
995
1083
  .translate(-pivotTranslateX, -pivotTranslateY);
996
1084
  } else {
997
1085
  this.localTransform = Matrix3d.translate(
@@ -1002,35 +1090,35 @@ export class CoreNode extends EventEmitter {
1002
1090
  }
1003
1091
 
1004
1092
  // Handle 'contain' resize mode
1005
- const texture = this.props.texture;
1093
+ const texture = p.texture;
1006
1094
  if (
1007
1095
  texture &&
1008
1096
  texture.dimensions &&
1009
- this.props.textureOptions?.resizeMode?.type === 'contain'
1097
+ p.textureOptions.resizeMode?.type === 'contain'
1010
1098
  ) {
1011
1099
  let resizeModeScaleX = 1;
1012
1100
  let resizeModeScaleY = 1;
1013
1101
  let extraX = 0;
1014
1102
  let extraY = 0;
1015
- const { width: tw, height: th } = texture.dimensions;
1103
+ const { w: tw, h: th } = texture.dimensions;
1016
1104
  const txAspectRatio = tw / th;
1017
- const nodeAspectRatio = width / height;
1105
+ const nodeAspectRatio = w / h;
1018
1106
  if (txAspectRatio > nodeAspectRatio) {
1019
1107
  // Texture is wider than node
1020
1108
  // Center the node vertically (shift down by extraY)
1021
1109
  // Scale the node vertically to maintain original aspect ratio
1022
- const scaleX = width / tw;
1110
+ const scaleX = w / tw;
1023
1111
  const scaledTxHeight = th * scaleX;
1024
- extraY = (height - scaledTxHeight) / 2;
1025
- resizeModeScaleY = scaledTxHeight / height;
1112
+ extraY = (h - scaledTxHeight) / 2;
1113
+ resizeModeScaleY = scaledTxHeight / h;
1026
1114
  } else {
1027
1115
  // Texture is taller than node (or equal)
1028
1116
  // Center the node horizontally (shift right by extraX)
1029
1117
  // Scale the node horizontally to maintain original aspect ratio
1030
- const scaleY = height / th;
1118
+ const scaleY = h / th;
1031
1119
  const scaledTxWidth = tw * scaleY;
1032
- extraX = (width - scaledTxWidth) / 2;
1033
- resizeModeScaleX = scaledTxWidth / width;
1120
+ extraX = (w - scaledTxWidth) / 2;
1121
+ resizeModeScaleX = scaledTxWidth / w;
1034
1122
  }
1035
1123
 
1036
1124
  // Apply the extra translation and scale to the local transform
@@ -1038,8 +1126,17 @@ export class CoreNode extends EventEmitter {
1038
1126
  .translate(extraX, extraY)
1039
1127
  .scale(resizeModeScaleX, resizeModeScaleY);
1040
1128
  }
1129
+ }
1041
1130
 
1042
- this.setUpdateType(UpdateType.Global);
1131
+ updateIsSimple() {
1132
+ const p = this.props;
1133
+ this.isSimple =
1134
+ p.rotation === 0 &&
1135
+ p.scaleX === 1 &&
1136
+ p.scaleY === 1 &&
1137
+ p.mountX === 0 &&
1138
+ p.mountY === 0 &&
1139
+ !(p.texture && p.textureOptions.resizeMode?.type === 'contain');
1043
1140
  }
1044
1141
 
1045
1142
  /**
@@ -1047,205 +1144,235 @@ export class CoreNode extends EventEmitter {
1047
1144
  * @param delta
1048
1145
  */
1049
1146
  update(delta: number, parentClippingRect: RectWithValid): void {
1050
- if (this.updateType & UpdateType.ScaleRotate) {
1051
- this.updateScaleRotateTransform();
1052
- this.setUpdateType(UpdateType.Local);
1147
+ const props = this.props;
1148
+ //parent can be forced to ! because the root node update loop uses updateRoot which implies that
1149
+ //all other loops using this update method have a parent
1150
+ const parent = props.parent!;
1151
+ const parentHasRenderTexture = this.parentHasRenderTexture;
1152
+ let newRenderState: CoreNodeRenderState | null = null;
1153
+ let updateType = this.updateType;
1154
+ let childUpdateType = this.childUpdateType;
1155
+
1156
+ //this needs to be handled before setting updateTypes are reset
1157
+ if (
1158
+ ENABLE_AUTOSIZE &&
1159
+ updateType & UpdateType.Autosize &&
1160
+ this.autosizer !== null
1161
+ ) {
1162
+ this.autosizer.update();
1053
1163
  }
1054
1164
 
1055
- if (this.updateType & UpdateType.Local) {
1165
+ // reset update type
1166
+ this.updateType = 0;
1167
+ this.childUpdateType = 0;
1168
+
1169
+ if (updateType & UpdateType.Local) {
1056
1170
  this.updateLocalTransform();
1057
- this.setUpdateType(UpdateType.Global);
1058
- }
1059
1171
 
1060
- const parent = this.props.parent;
1061
- let renderState = null;
1172
+ updateType |= UpdateType.Global;
1173
+ }
1062
1174
 
1063
1175
  // Handle specific RTT updates at this node level
1064
- if (this.updateType & UpdateType.RenderTexture && this.rtt) {
1176
+ if (USE_RTT && updateType & UpdateType.RenderTexture && this.rtt === true) {
1065
1177
  this.hasRTTupdates = true;
1066
1178
  }
1067
1179
 
1068
- if (this.updateType & UpdateType.Global) {
1069
- assertTruthy(this.localTransform);
1070
-
1071
- if (this.parentHasRenderTexture === true && parent?.rtt === true) {
1180
+ if (updateType & UpdateType.Global) {
1181
+ if (
1182
+ USE_RTT &&
1183
+ this.parentHasRenderTexture === true &&
1184
+ parent.rtt === true
1185
+ ) {
1072
1186
  // we are at the start of the RTT chain, so we need to reset the globalTransform
1073
1187
  // for correct RTT rendering
1074
- this.globalTransform = Matrix3d.identity();
1188
+ this.globalTransform = Matrix3d.identity(this.globalTransform);
1075
1189
 
1076
1190
  // Maintain a full scene global transform for bounds detection
1191
+ const parentTransform =
1192
+ parent.globalTransform || Matrix3d.identity(Matrix3d.temp);
1193
+
1077
1194
  this.sceneGlobalTransform = Matrix3d.copy(
1078
- parent?.globalTransform || Matrix3d.identity(),
1079
- ).multiply(this.localTransform);
1195
+ parentTransform,
1196
+ this.sceneGlobalTransform,
1197
+ ).translateOrMultiply(this.localTransform!);
1080
1198
  } else if (
1199
+ USE_RTT &&
1081
1200
  this.parentHasRenderTexture === true &&
1082
- parent?.rtt === false
1201
+ parent.rtt === false
1083
1202
  ) {
1084
1203
  // we're part of an RTT chain but our parent is not the main RTT node
1085
1204
  // so we need to propogate the sceneGlobalTransform of the parent
1086
1205
  // to maintain a full scene global transform for bounds detection
1206
+ const parentSceneTransform =
1207
+ parent.sceneGlobalTransform || this.localTransform!;
1208
+
1087
1209
  this.sceneGlobalTransform = Matrix3d.copy(
1088
- parent?.sceneGlobalTransform || this.localTransform,
1089
- ).multiply(this.localTransform);
1210
+ parentSceneTransform,
1211
+ this.sceneGlobalTransform,
1212
+ ).translateOrMultiply(this.localTransform!);
1090
1213
 
1091
1214
  this.globalTransform = Matrix3d.copy(
1092
- parent?.globalTransform || this.localTransform,
1215
+ parent.globalTransform || this.localTransform!,
1093
1216
  this.globalTransform,
1094
1217
  );
1095
1218
  } else {
1096
1219
  this.globalTransform = Matrix3d.copy(
1097
- parent?.globalTransform || this.localTransform,
1220
+ parent.globalTransform || this.localTransform!,
1098
1221
  this.globalTransform,
1099
1222
  );
1100
1223
  }
1101
1224
 
1102
- if (parent !== null) {
1103
- this.globalTransform.multiply(this.localTransform);
1225
+ if (this.isSimple) {
1226
+ this.globalTransform.translate(
1227
+ this.localTransform!.tx,
1228
+ this.localTransform!.ty,
1229
+ );
1230
+ } else {
1231
+ this.globalTransform.translateOrMultiply(this.localTransform!);
1104
1232
  }
1105
1233
  this.calculateRenderCoords();
1106
1234
  this.updateBoundingRect();
1107
1235
 
1108
- this.setUpdateType(UpdateType.RenderState | UpdateType.Children);
1109
- this.childUpdateType |= UpdateType.Global;
1236
+ updateType |= UpdateType.RenderState | UpdateType.RecalcUniforms;
1237
+
1238
+ //only propagate children updates if not autosizing
1239
+ if ((updateType & UpdateType.Autosize) === 0) {
1240
+ updateType |= UpdateType.Children;
1241
+ childUpdateType |= UpdateType.Global;
1242
+ }
1110
1243
 
1111
1244
  if (this.clipping === true) {
1112
- this.setUpdateType(UpdateType.Clipping | UpdateType.RenderBounds);
1113
- this.childUpdateType |= UpdateType.RenderBounds;
1245
+ updateType |= UpdateType.Clipping | UpdateType.RenderBounds;
1246
+ childUpdateType |= UpdateType.RenderBounds;
1114
1247
  }
1115
1248
  }
1116
1249
 
1117
- if (this.updateType & UpdateType.RenderBounds) {
1250
+ if (updateType & UpdateType.RenderBounds) {
1118
1251
  this.createRenderBounds();
1119
- this.setUpdateType(UpdateType.RenderState);
1120
- this.setUpdateType(UpdateType.Children);
1121
1252
 
1122
- this.childUpdateType |= UpdateType.RenderBounds;
1253
+ updateType |= UpdateType.RenderState | UpdateType.Children;
1254
+ childUpdateType |= UpdateType.RenderBounds;
1123
1255
  }
1124
1256
 
1125
- if (this.updateType & UpdateType.RenderState) {
1126
- renderState = this.checkRenderBounds();
1127
- this.setUpdateType(UpdateType.IsRenderable);
1257
+ if (updateType & UpdateType.RenderState) {
1258
+ newRenderState = this.checkRenderBounds();
1259
+ updateType |= UpdateType.IsRenderable;
1128
1260
 
1129
1261
  // if we're not going out of bounds, update the render state
1130
1262
  // this is done so the update loop can finish before we mark a node
1131
1263
  // as out of bounds
1132
- if (renderState !== CoreNodeRenderState.OutOfBounds) {
1133
- this.updateRenderState(renderState);
1264
+ if (newRenderState !== CoreNodeRenderState.OutOfBounds) {
1265
+ this.updateRenderState(newRenderState);
1134
1266
  }
1135
1267
  }
1136
1268
 
1137
- if (this.updateType & UpdateType.WorldAlpha) {
1138
- if (parent) {
1139
- this.worldAlpha = parent.worldAlpha * this.props.alpha;
1140
- } else {
1141
- this.worldAlpha = this.props.alpha;
1142
- }
1143
- this.setUpdateType(
1269
+ if (updateType & UpdateType.WorldAlpha) {
1270
+ this.worldAlpha = parent.worldAlpha * this.props.alpha;
1271
+ updateType |=
1272
+ UpdateType.PremultipliedColors |
1144
1273
  UpdateType.Children |
1145
- UpdateType.PremultipliedColors |
1146
- UpdateType.IsRenderable,
1147
- );
1148
- this.childUpdateType |= UpdateType.WorldAlpha;
1274
+ UpdateType.IsRenderable;
1275
+ childUpdateType |= UpdateType.WorldAlpha;
1149
1276
  }
1150
1277
 
1151
- if (this.updateType & UpdateType.IsRenderable) {
1278
+ if (updateType & UpdateType.IsRenderable) {
1152
1279
  this.updateIsRenderable();
1153
1280
  }
1154
1281
 
1155
- if (this.updateType & UpdateType.Clipping) {
1156
- this.calculateClippingRect(parentClippingRect);
1157
- this.setUpdateType(UpdateType.Children);
1282
+ // Handle autosize updates when children transforms change
1283
+ if (
1284
+ ENABLE_AUTOSIZE &&
1285
+ updateType & UpdateType.Global &&
1286
+ this.isRenderable === true &&
1287
+ this.parentAutosizer !== null
1288
+ ) {
1289
+ this.parentAutosizer.patch(this.id);
1290
+ }
1158
1291
 
1159
- this.childUpdateType |= UpdateType.Clipping;
1160
- this.childUpdateType |= UpdateType.RenderBounds;
1292
+ if (updateType & UpdateType.Clipping) {
1293
+ this.calculateClippingRect(parentClippingRect);
1294
+ updateType |= UpdateType.Children;
1295
+ childUpdateType |= UpdateType.Clipping | UpdateType.RenderBounds;
1161
1296
  }
1162
1297
 
1163
- if (this.updateType & UpdateType.PremultipliedColors) {
1164
- this.premultipliedColorTl = mergeColorAlphaPremultiplied(
1165
- this.props.colorTl,
1166
- this.worldAlpha,
1167
- true,
1168
- );
1298
+ if (updateType & UpdateType.PremultipliedColors) {
1299
+ const alpha = this.worldAlpha;
1169
1300
 
1170
- // If all the colors are the same just sent them all to the same value
1171
- if (
1172
- this.props.colorTl === this.props.colorTr &&
1173
- this.props.colorBl === this.props.colorBr &&
1174
- this.props.colorTl === this.props.colorBl
1175
- ) {
1301
+ const tl = props.colorTl;
1302
+ const tr = props.colorTr;
1303
+ const bl = props.colorBl;
1304
+ const br = props.colorBr;
1305
+
1306
+ // Fast equality check (covers all 4 corners)
1307
+ const same = tl === tr && tl === bl && tl === br;
1308
+
1309
+ const merged = premultiplyColorABGR(tl, alpha);
1310
+
1311
+ this.premultipliedColorTl = merged;
1312
+
1313
+ if (same === true) {
1176
1314
  this.premultipliedColorTr =
1177
1315
  this.premultipliedColorBl =
1178
1316
  this.premultipliedColorBr =
1179
- this.premultipliedColorTl;
1317
+ merged;
1180
1318
  } else {
1181
- this.premultipliedColorTr = mergeColorAlphaPremultiplied(
1182
- this.props.colorTr,
1183
- this.worldAlpha,
1184
- true,
1185
- );
1186
- this.premultipliedColorBl = mergeColorAlphaPremultiplied(
1187
- this.props.colorBl,
1188
- this.worldAlpha,
1189
- true,
1190
- );
1191
- this.premultipliedColorBr = mergeColorAlphaPremultiplied(
1192
- this.props.colorBr,
1193
- this.worldAlpha,
1194
- true,
1195
- );
1319
+ this.premultipliedColorTr = premultiplyColorABGR(tr, alpha);
1320
+ this.premultipliedColorBl = premultiplyColorABGR(bl, alpha);
1321
+ this.premultipliedColorBr = premultiplyColorABGR(br, alpha);
1196
1322
  }
1197
1323
  }
1198
1324
 
1199
- // No need to update zIndex if there is no parent
1200
- if (parent !== null && this.updateType & UpdateType.CalculatedZIndex) {
1201
- this.calculateZIndex();
1202
- // Tell parent to re-sort children
1203
- parent.setUpdateType(UpdateType.ZIndexSortedChildren);
1325
+ if (this.renderState === CoreNodeRenderState.OutOfBounds) {
1326
+ // Delay updating children until the node is in bounds
1327
+ this.updateType = updateType;
1328
+ this.childUpdateType = childUpdateType;
1329
+ return;
1204
1330
  }
1205
1331
 
1206
1332
  if (
1207
- this.props.strictBounds === true &&
1208
- this.renderState === CoreNodeRenderState.OutOfBounds
1333
+ updateType & UpdateType.RecalcUniforms &&
1334
+ this.hasShaderUpdater === true
1209
1335
  ) {
1210
- this.updateType &= ~UpdateType.RenderBounds; // remove render bounds update
1211
- return;
1336
+ this.updateShaderUniforms = true;
1212
1337
  }
1213
1338
 
1214
- if (this.updateType & UpdateType.Children && this.children.length > 0) {
1339
+ if (this.isRenderable === true && this.updateShaderUniforms === true) {
1340
+ this.updateShaderUniforms = false;
1341
+ //this exists because the boolean hasShaderUpdater === true
1342
+ this.shader!.update!();
1343
+ }
1344
+
1345
+ if (updateType & UpdateType.Children && this.children.length > 0) {
1346
+ let childClippingRect = this.clippingRect;
1347
+
1348
+ if (USE_RTT && this.rtt === true) {
1349
+ childClippingRect = NO_CLIPPING_RECT;
1350
+ }
1351
+
1215
1352
  for (let i = 0, length = this.children.length; i < length; i++) {
1216
1353
  const child = this.children[i] as CoreNode;
1217
1354
 
1218
- child.setUpdateType(this.childUpdateType);
1355
+ if (childUpdateType !== 0) {
1356
+ child.setUpdateType(childUpdateType);
1357
+ }
1219
1358
 
1220
1359
  if (child.updateType === 0) {
1221
1360
  continue;
1222
1361
  }
1223
1362
 
1224
- let childClippingRect = this.clippingRect;
1225
- if (this.rtt === true) {
1226
- childClippingRect = {
1227
- x: 0,
1228
- y: 0,
1229
- width: 0,
1230
- height: 0,
1231
- valid: false,
1232
- };
1233
- }
1234
-
1235
1363
  child.update(delta, childClippingRect);
1236
1364
  }
1237
1365
  }
1238
1366
 
1239
1367
  // If the node has an RTT parent and requires a texture re-render, inform the RTT parent
1240
- // if (this.parentHasRenderTexture && this.updateType & UpdateType.RenderTexture) {
1368
+ // if (this.parentHasRenderTexture && updateType & UpdateType.RenderTexture) {
1241
1369
  // @TODO have a more scoped down updateType for RTT updates
1242
- if (this.parentHasRenderTexture && this.updateType > 0) {
1370
+ if (USE_RTT === true && parentHasRenderTexture === true) {
1243
1371
  this.notifyParentRTTOfUpdate();
1244
1372
  }
1245
1373
 
1246
- // Sorting children MUST happen after children have been updated so
1247
- // that they have the oppotunity to update their calculated zIndex.
1248
- if (this.updateType & UpdateType.ZIndexSortedChildren) {
1374
+ //Resort children if needed
1375
+ if (updateType & UpdateType.SortZIndexChildren) {
1249
1376
  // reorder z-index
1250
1377
  this.sortChildren();
1251
1378
  }
@@ -1253,24 +1380,31 @@ export class CoreNode extends EventEmitter {
1253
1380
  // If we're out of bounds, apply the render state now
1254
1381
  // this is done so nodes can finish their entire update loop before
1255
1382
  // being marked as out of bounds
1256
- if (renderState === CoreNodeRenderState.OutOfBounds) {
1257
- this.updateRenderState(renderState);
1383
+ if (newRenderState === CoreNodeRenderState.OutOfBounds) {
1384
+ this.updateRenderState(newRenderState);
1258
1385
  this.updateIsRenderable();
1259
1386
 
1260
1387
  if (
1388
+ USE_RTT === true &&
1261
1389
  this.rtt === true &&
1262
- renderState === CoreNodeRenderState.OutOfBounds
1390
+ newRenderState === CoreNodeRenderState.OutOfBounds
1263
1391
  ) {
1264
1392
  // notify children that we are going out of bounds
1265
1393
  // we have to do this now before we stop processing the render tree
1266
- this.notifyChildrenRTTOfUpdate(renderState);
1267
- // this.childUpdateType |= UpdateType.RenderState;
1394
+ this.notifyChildrenRTTOfUpdate(newRenderState);
1268
1395
  }
1269
1396
  }
1270
1397
 
1271
- // reset update type
1272
- this.updateType = 0;
1273
- this.childUpdateType = 0;
1398
+ // Mark quad dirty only when visual data (transforms, colors) actually
1399
+ // changed, so the WebGL renderer only re-uploads modified slots.
1400
+ if (
1401
+ updateType &
1402
+ (UpdateType.Global |
1403
+ UpdateType.PremultipliedColors |
1404
+ UpdateType.WorldAlpha)
1405
+ ) {
1406
+ this.isQuadDirty = true;
1407
+ }
1274
1408
  }
1275
1409
 
1276
1410
  private findParentRTTNode(): CoreNode | null {
@@ -1281,15 +1415,6 @@ export class CoreNode extends EventEmitter {
1281
1415
  return rttNode;
1282
1416
  }
1283
1417
 
1284
- private getRTTParentRenderState(): CoreNodeRenderState | null {
1285
- const rttNode = this.rttParent || this.findParentRTTNode();
1286
- if (!rttNode) {
1287
- return null;
1288
- }
1289
-
1290
- return rttNode.renderState;
1291
- }
1292
-
1293
1418
  private notifyChildrenRTTOfUpdate(renderState: CoreNodeRenderState) {
1294
1419
  for (const child of this.children) {
1295
1420
  // force child to update render state
@@ -1299,7 +1424,7 @@ export class CoreNode extends EventEmitter {
1299
1424
  }
1300
1425
  }
1301
1426
 
1302
- private notifyParentRTTOfUpdate() {
1427
+ protected notifyParentRTTOfUpdate() {
1303
1428
  if (this.parent === null) {
1304
1429
  return;
1305
1430
  }
@@ -1320,28 +1445,21 @@ export class CoreNode extends EventEmitter {
1320
1445
  }
1321
1446
 
1322
1447
  checkRenderBounds(): CoreNodeRenderState {
1323
- assertTruthy(this.renderBound);
1324
- assertTruthy(this.strictBound);
1325
- assertTruthy(this.preloadBound);
1326
-
1327
- if (boundInsideBound(this.renderBound, this.strictBound)) {
1448
+ if (boundInsideBound(this.renderBound!, this.strictBound!)) {
1328
1449
  return CoreNodeRenderState.InViewport;
1329
1450
  }
1330
1451
 
1331
- if (boundInsideBound(this.renderBound, this.preloadBound)) {
1452
+ if (boundInsideBound(this.renderBound!, this.preloadBound!)) {
1332
1453
  return CoreNodeRenderState.InBounds;
1333
1454
  }
1334
1455
 
1335
1456
  // check if we're larger then our parent, we're definitely in the viewport
1336
- if (boundLargeThanBound(this.renderBound, this.strictBound)) {
1457
+ if (boundLargeThanBound(this.renderBound!, this.strictBound!)) {
1337
1458
  return CoreNodeRenderState.InViewport;
1338
1459
  }
1339
1460
 
1340
1461
  // check if we dont have dimensions, take our parent's render state
1341
- if (
1342
- this.parent !== null &&
1343
- (this.props.width === 0 || this.props.height === 0)
1344
- ) {
1462
+ if (this.parent !== null && (this.props.w === 0 || this.props.h === 0)) {
1345
1463
  return this.parent.renderState;
1346
1464
  }
1347
1465
 
@@ -1349,18 +1467,21 @@ export class CoreNode extends EventEmitter {
1349
1467
  }
1350
1468
 
1351
1469
  updateBoundingRect() {
1352
- const transform = this.sceneGlobalTransform || this.globalTransform;
1353
- const renderCoords = this.sceneRenderCoords || this.renderCoords;
1354
-
1355
- assertTruthy(transform);
1356
- assertTruthy(renderCoords);
1470
+ const transform = (this.sceneGlobalTransform ||
1471
+ this.globalTransform) as Matrix3d;
1472
+ const renderCoords = (this.sceneRenderCoords ||
1473
+ this.renderCoords) as RenderCoords;
1357
1474
 
1358
- const { tb, tc } = transform;
1359
- const { x1, y1, x3, y3 } = renderCoords;
1360
- if (tb === 0 || tc === 0) {
1361
- this.renderBound = createBound(x1, y1, x3, y3, this.renderBound);
1475
+ if (transform.tb === 0 || transform.tc === 0) {
1476
+ this.renderBound = createBound(
1477
+ renderCoords.x1,
1478
+ renderCoords.y1,
1479
+ renderCoords.x3,
1480
+ renderCoords.y3,
1481
+ this.renderBound,
1482
+ );
1362
1483
  } else {
1363
- const { x2, x4, y2, y4 } = renderCoords;
1484
+ const { x1, y1, x2, y2, x3, y3, x4, y4 } = renderCoords;
1364
1485
  this.renderBound = createBound(
1365
1486
  Math.min(x1, x2, x3, x4),
1366
1487
  Math.min(y1, y2, y3, y4),
@@ -1372,8 +1493,6 @@ export class CoreNode extends EventEmitter {
1372
1493
  }
1373
1494
 
1374
1495
  createRenderBounds(): void {
1375
- assertTruthy(this.stage);
1376
-
1377
1496
  if (this.parent !== null && this.parent.strictBound !== undefined) {
1378
1497
  // we have a parent with a valid bound, copy it
1379
1498
  const parentBound = this.parent.strictBound;
@@ -1382,11 +1501,13 @@ export class CoreNode extends EventEmitter {
1382
1501
  parentBound.y1,
1383
1502
  parentBound.x2,
1384
1503
  parentBound.y2,
1504
+ this.strictBound,
1385
1505
  );
1386
1506
 
1387
1507
  this.preloadBound = createPreloadBounds(
1388
1508
  this.strictBound,
1389
1509
  this.boundsMargin as [number, number, number, number],
1510
+ this.preloadBound,
1390
1511
  );
1391
1512
  } else {
1392
1513
  // no parent or parent does not have a bound, take the stage boundaries
@@ -1411,24 +1532,19 @@ export class CoreNode extends EventEmitter {
1411
1532
  }
1412
1533
 
1413
1534
  // clipping is enabled and we are in bounds create our own bounds
1414
- const { x, y, width, height } = this.props;
1535
+ const { x, y, w, h } = this.props;
1415
1536
 
1416
1537
  // Pick the global transform if available, otherwise use the local transform
1417
1538
  // global transform is only available if the node in an RTT chain
1418
1539
  const { tx, ty } = this.sceneGlobalTransform || this.globalTransform || {};
1419
1540
  const _x = tx ?? x;
1420
1541
  const _y = ty ?? y;
1421
- this.strictBound = createBound(
1422
- _x,
1423
- _y,
1424
- _x + width,
1425
- _y + height,
1426
- this.strictBound,
1427
- );
1542
+ this.strictBound = createBound(_x, _y, _x + w, _y + h, this.strictBound);
1428
1543
 
1429
1544
  this.preloadBound = createPreloadBounds(
1430
1545
  this.strictBound,
1431
1546
  this.boundsMargin as [number, number, number, number],
1547
+ this.preloadBound,
1432
1548
  );
1433
1549
  }
1434
1550
 
@@ -1439,12 +1555,34 @@ export class CoreNode extends EventEmitter {
1439
1555
 
1440
1556
  const previous = this.renderState;
1441
1557
  this.renderState = renderState;
1442
- const event = CoreNodeRenderStateMap.get(renderState);
1443
- assertTruthy(event);
1444
- this.emit(event, {
1445
- previous,
1446
- current: renderState,
1447
- });
1558
+
1559
+ // If node visibility changes, dirty the render list cache
1560
+ if (
1561
+ renderState === CoreNodeRenderState.OutOfBounds ||
1562
+ previous === CoreNodeRenderState.OutOfBounds
1563
+ ) {
1564
+ this.stage.requestRenderListUpdate();
1565
+ }
1566
+
1567
+ if (EMIT_BOUNDS_EVENTS) {
1568
+ const event = CoreNodeRenderStateMap.get(renderState);
1569
+ assertTruthy(event);
1570
+ this.emit(event, {
1571
+ previous,
1572
+ current: renderState,
1573
+ });
1574
+ }
1575
+ }
1576
+
1577
+ /**
1578
+ * Checks if the node is renderable based on world alpha, dimensions and out of bounds status.
1579
+ */
1580
+ checkBasicRenderability(): boolean {
1581
+ if (this.worldAlpha === 0 || this.isOutOfBounds() === true) {
1582
+ return false;
1583
+ } else {
1584
+ return true;
1585
+ }
1448
1586
  }
1449
1587
 
1450
1588
  /**
@@ -1462,51 +1600,58 @@ export class CoreNode extends EventEmitter {
1462
1600
  }
1463
1601
 
1464
1602
  if (this.texture !== null) {
1465
- needsTextureOwnership = true;
1603
+ // preemptive check for failed textures this will mark the current node as non-renderable
1604
+ // and will prevent further checks until the texture is reloaded or retry is reset on the texture
1605
+ if (this.texture.retryCount > this.texture.maxRetryCount) {
1606
+ // texture has failed to load, we cannot render
1607
+ this.updateTextureOwnership(false);
1608
+ this.setRenderable(false);
1609
+ return;
1610
+ }
1466
1611
 
1467
- // we're only renderable if the texture state is loaded
1468
- newIsRenderable = this.texture.state === 'loaded';
1612
+ needsTextureOwnership = true;
1613
+ // Use cached boolean instead of string comparison
1614
+ newIsRenderable = this.textureLoaded;
1469
1615
  } else if (
1470
- (this.hasShader() || this.hasColorProperties() === true) &&
1616
+ // check shader
1617
+ (this.props.shader !== this.stage.renderer.getDefaultShaderNode() ||
1618
+ this.hasColorProps === true) &&
1619
+ // check dimensions
1471
1620
  this.hasDimensions() === true
1472
1621
  ) {
1473
1622
  // This mean we have dimensions and a color set, so we can render a ColorTexture
1474
- if (
1475
- this.stage.defaultTexture &&
1476
- this.stage.defaultTexture.state === 'loaded'
1477
- ) {
1478
- newIsRenderable = true;
1479
- }
1623
+ newIsRenderable = true;
1480
1624
  }
1481
1625
 
1482
1626
  this.updateTextureOwnership(needsTextureOwnership);
1483
1627
  this.setRenderable(newIsRenderable);
1484
1628
  }
1485
1629
 
1486
- /**
1487
- * Checks if the node is renderable based on world alpha, dimensions and out of bounds status.
1488
- */
1489
- checkBasicRenderability(): boolean {
1490
- if (this.worldAlpha === 0 || this.isOutOfBounds() === true) {
1491
- return false;
1492
- } else {
1493
- return true;
1494
- }
1495
- }
1496
-
1497
1630
  /**
1498
1631
  * Sets the renderable state and triggers changes if necessary.
1499
1632
  * @param isRenderable - The new renderable state
1500
1633
  */
1501
1634
  setRenderable(isRenderable: boolean) {
1635
+ const previousIsRenderable = this.isRenderable;
1502
1636
  this.isRenderable = isRenderable;
1637
+
1638
+ // Emit event if renderable status has changed
1639
+ if (previousIsRenderable !== isRenderable) {
1640
+ this.stage.requestRenderListUpdate();
1641
+ if (EMIT_BOUNDS_EVENTS) {
1642
+ this.emit('renderable', {
1643
+ type: 'renderable',
1644
+ isRenderable,
1645
+ } satisfies NodeRenderablePayload);
1646
+ }
1647
+ }
1503
1648
  }
1504
1649
 
1505
1650
  /**
1506
1651
  * Changes the renderable state of the node.
1507
1652
  */
1508
1653
  updateTextureOwnership(isRenderable: boolean) {
1509
- this.texture?.setRenderableOwner(this, isRenderable);
1654
+ this.texture?.setRenderableOwner(this._id, isRenderable);
1510
1655
  }
1511
1656
 
1512
1657
  /**
@@ -1520,38 +1665,24 @@ export class CoreNode extends EventEmitter {
1520
1665
  * Checks if the node has dimensions (width/height)
1521
1666
  */
1522
1667
  hasDimensions(): boolean {
1523
- return this.props.width !== 0 && this.props.height !== 0;
1524
- }
1525
-
1526
- /**
1527
- * Checks if the node has any color properties set.
1528
- */
1529
- hasColorProperties(): boolean {
1530
- return (
1531
- this.props.color !== 0 ||
1532
- this.props.colorTop !== 0 ||
1533
- this.props.colorBottom !== 0 ||
1534
- this.props.colorLeft !== 0 ||
1535
- this.props.colorRight !== 0 ||
1536
- this.props.colorTl !== 0 ||
1537
- this.props.colorTr !== 0 ||
1538
- this.props.colorBl !== 0 ||
1539
- this.props.colorBr !== 0
1540
- );
1541
- }
1542
-
1543
- hasShader(): boolean {
1544
- return this.props.shader !== null;
1668
+ return this.props.w !== 0 && this.props.h !== 0;
1545
1669
  }
1546
1670
 
1547
1671
  calculateRenderCoords() {
1548
- const { width, height } = this;
1549
- const { tx, ty, ta, tb, tc, td } = this.globalTransform!;
1672
+ const { w, h } = this.props;
1673
+
1674
+ const g = this.globalTransform!;
1675
+ const tx = g.tx,
1676
+ ty = g.ty,
1677
+ ta = g.ta,
1678
+ tb = g.tb,
1679
+ tc = g.tc,
1680
+ td = g.td;
1550
1681
  if (tb === 0 && tc === 0) {
1551
1682
  const minX = tx;
1552
- const maxX = tx + width * ta;
1683
+ const maxX = tx + w * ta;
1553
1684
  const minY = ty;
1554
- const maxY = ty + height * td;
1685
+ const maxY = ty + h * td;
1555
1686
  this.renderCoords = RenderCoords.translate(
1556
1687
  //top-left
1557
1688
  minX,
@@ -1573,18 +1704,18 @@ export class CoreNode extends EventEmitter {
1573
1704
  tx,
1574
1705
  ty,
1575
1706
  //top-right
1576
- tx + width * ta,
1577
- ty + width * tc,
1707
+ tx + w * ta,
1708
+ ty + w * tc,
1578
1709
  //bottom-right
1579
- tx + width * ta + height * tb,
1580
- ty + width * tc + height * td,
1710
+ tx + w * ta + h * tb,
1711
+ ty + w * tc + h * td,
1581
1712
  //bottom-left
1582
- tx + height * tb,
1583
- ty + height * td,
1713
+ tx + h * tb,
1714
+ ty + h * td,
1584
1715
  this.renderCoords,
1585
1716
  );
1586
1717
  }
1587
- if (this.sceneGlobalTransform === undefined) {
1718
+ if (!USE_RTT || this.sceneGlobalTransform === undefined) {
1588
1719
  return;
1589
1720
  }
1590
1721
 
@@ -1598,9 +1729,9 @@ export class CoreNode extends EventEmitter {
1598
1729
  } = this.sceneGlobalTransform;
1599
1730
  if (stb === 0 && stc === 0) {
1600
1731
  const minX = stx;
1601
- const maxX = stx + width * sta;
1732
+ const maxX = stx + w * sta;
1602
1733
  const minY = sty;
1603
- const maxY = sty + height * std;
1734
+ const maxY = sty + h * std;
1604
1735
  this.sceneRenderCoords = RenderCoords.translate(
1605
1736
  //top-left
1606
1737
  minX,
@@ -1622,14 +1753,14 @@ export class CoreNode extends EventEmitter {
1622
1753
  stx,
1623
1754
  sty,
1624
1755
  //top-right
1625
- stx + width * sta,
1626
- sty + width * stc,
1756
+ stx + w * sta,
1757
+ sty + w * stc,
1627
1758
  //bottom-right
1628
- stx + width * sta + height * stb,
1629
- sty + width * stc + height * std,
1759
+ stx + w * sta + h * stb,
1760
+ sty + w * stc + h * std,
1630
1761
  //bottom-left
1631
- stx + height * stb,
1632
- sty + height * std,
1762
+ stx + h * stb,
1763
+ sty + h * std,
1633
1764
  this.sceneRenderCoords,
1634
1765
  );
1635
1766
  }
@@ -1644,16 +1775,15 @@ export class CoreNode extends EventEmitter {
1644
1775
  * Finally, the node's parentClippingRect and clippingRect properties are updated.
1645
1776
  */
1646
1777
  calculateClippingRect(parentClippingRect: RectWithValid) {
1647
- assertTruthy(this.globalTransform);
1648
1778
  const { clippingRect, props, globalTransform: gt } = this;
1649
1779
  const { clipping } = props;
1650
- const isRotated = gt.tb !== 0 || gt.tc !== 0;
1780
+ const isRotated = gt!.tb !== 0 || gt!.tc !== 0;
1651
1781
 
1652
1782
  if (clipping === true && isRotated === false) {
1653
- clippingRect.x = gt.tx;
1654
- clippingRect.y = gt.ty;
1655
- clippingRect.width = this.width * gt.ta;
1656
- clippingRect.height = this.height * gt.td;
1783
+ clippingRect.x = gt!.tx;
1784
+ clippingRect.y = gt!.ty;
1785
+ clippingRect.width = this.props.w * gt!.ta;
1786
+ clippingRect.height = this.props.h * gt!.td;
1657
1787
  clippingRect.valid = true;
1658
1788
  } else {
1659
1789
  clippingRect.valid = false;
@@ -1669,101 +1799,185 @@ export class CoreNode extends EventEmitter {
1669
1799
  }
1670
1800
  }
1671
1801
 
1672
- calculateZIndex(): void {
1673
- const props = this.props;
1674
- const z = props.zIndex || 0;
1675
- const p = props.parent?.zIndex || 0;
1676
-
1677
- let zIndex = z;
1678
- if (props.parent?.zIndexLocked) {
1679
- zIndex = z < p ? z : p;
1680
- }
1681
- this.calcZIndex = zIndex;
1682
- }
1683
-
1684
1802
  /**
1685
1803
  * Destroy the node and cleanup all resources
1686
1804
  */
1687
- destroy(): void {
1805
+ destroy(isChild: boolean = false): void {
1688
1806
  if (this.destroyed === true) {
1689
1807
  return;
1690
1808
  }
1691
-
1692
1809
  this.destroyed = true;
1693
- this.unloadTexture();
1694
1810
 
1695
- this.clippingRect.valid = false;
1811
+ // Detach from parent first to stop propagation of updates
1812
+ if (isChild === false) {
1813
+ const parent = this.parent;
1814
+ if (parent !== null) {
1815
+ parent.removeChild(this);
1816
+ }
1817
+ this.props.parent = null;
1818
+ this.stage.requestRender();
1819
+ }
1820
+
1821
+ this.removeAllListeners();
1822
+ this.unloadTexture();
1696
1823
  this.isRenderable = false;
1697
1824
 
1698
- this.renderCoords = undefined;
1699
- this.renderBound = undefined;
1700
- this.strictBound = undefined;
1701
- this.preloadBound = undefined;
1702
- this.globalTransform = undefined;
1703
- this.scaleRotateTransform = undefined;
1704
- this.localTransform = undefined;
1825
+ if (this.hasShaderTimeFn === true) {
1826
+ this.stage.untrackTimedNode(this);
1827
+ }
1828
+
1829
+ if (USE_RTT && this.rtt === true) {
1830
+ this.stage.renderer.removeRTTNode(this);
1831
+ }
1832
+
1833
+ // Kill children
1834
+ for (let i = 0, n = this.children.length; i < n; i++) {
1835
+ this.children[i]!.destroy(true);
1836
+ }
1837
+ this.children.length = 0;
1705
1838
 
1706
1839
  this.props.texture = null;
1707
- this.props.shader = this.stage.defShaderCtr;
1840
+ }
1708
1841
 
1709
- while (this.children.length > 0) {
1710
- this.children[0]?.destroy();
1842
+ renderQuads(renderer: CoreRenderer): void {
1843
+ if (USE_RTT && this.parentHasRenderTexture === true) {
1844
+ const rtt = renderer.renderToTextureActive;
1845
+ if (rtt === false || this.parentRenderTexture !== renderer.activeRttNode)
1846
+ return;
1847
+ }
1848
+ // There is a race condition where the texture can be null
1849
+ // with RTT nodes. Adding this defensively to avoid errors.
1850
+ // Also check if we have a valid texture or default texture to render
1851
+ if (USE_RTT && this.renderTexture!.state !== 'loaded') {
1852
+ return;
1711
1853
  }
1712
1854
 
1713
- // This very action will also remove the node from the parent's children array
1714
- this.parent = null;
1855
+ renderer.addQuad(this);
1856
+ }
1715
1857
 
1716
- if (this.rtt) {
1717
- this.stage.renderer.removeRTTNode(this);
1858
+ get renderTexture(): Texture | null {
1859
+ return this.props.texture || this.stage.defaultTexture;
1860
+ }
1861
+
1862
+ get renderTextureCoords(): TextureCoords | undefined {
1863
+ return this.textureCoords || this.stage.renderer.defaultTextureCoords;
1864
+ }
1865
+
1866
+ get quadBufferCollection(): BufferCollection {
1867
+ return (this.stage.renderer as WebGlRenderer).quadBufferCollection;
1868
+ }
1869
+
1870
+ get width(): number {
1871
+ return this.props.w;
1872
+ }
1873
+
1874
+ get height(): number {
1875
+ return this.props.h;
1876
+ }
1877
+
1878
+ get time(): number {
1879
+ if (this.hasShaderTimeFn === true) {
1880
+ return this.getTimerValue();
1718
1881
  }
1882
+ return 0;
1883
+ }
1719
1884
 
1720
- this.removeAllListeners();
1885
+ getTimerValue(): number {
1886
+ if (typeof this.shader!.time === 'function') {
1887
+ return this.shader!.time(this.stage);
1888
+ }
1889
+ return this.stage.elapsedTime;
1721
1890
  }
1722
1891
 
1723
- renderQuads(renderer: CoreRenderer): void {
1724
- // Prevent quad rendering if parent has a render texture
1725
- // and renderer is not currently rendering to a texture
1726
- if (this.parentHasRenderTexture) {
1727
- if (!renderer.renderToTextureActive) {
1728
- return;
1892
+ sortChildren() {
1893
+ this.children.sort((a, b) => a.props.zIndex - b.props.zIndex);
1894
+ this.stage.requestRenderListUpdate();
1895
+ }
1896
+
1897
+ removeChild(node: CoreNode, targetParent: CoreNode | null = null) {
1898
+ if (targetParent === null) {
1899
+ if (
1900
+ USE_RTT &&
1901
+ this.props.rtt === true &&
1902
+ this.parentHasRenderTexture === true
1903
+ ) {
1904
+ node.clearRTTInheritance();
1729
1905
  }
1730
- // Prevent quad rendering if parent render texture is not the active render texture
1731
- if (this.parentRenderTexture !== renderer.activeRttNode) {
1732
- return;
1906
+
1907
+ if (ENABLE_AUTOSIZE) {
1908
+ const autosizeTarget = this.autosizer || this.parentAutosizer;
1909
+ if (autosizeTarget !== null) {
1910
+ autosizeTarget.detach(node);
1911
+ }
1733
1912
  }
1734
1913
  }
1914
+ removeChild(node, this.children);
1915
+ this.stage.requestRenderListUpdate();
1916
+ }
1917
+
1918
+ addChild(node: CoreNode, previousParent: CoreNode | null = null) {
1919
+ const inRttCluster =
1920
+ USE_RTT &&
1921
+ (this.props.rtt === true || this.parentHasRenderTexture === true);
1922
+ const children = this.children;
1923
+ let attachToAutosizer = false;
1924
+ let autosizeTarget: Autosizer | null = null;
1925
+ if (ENABLE_AUTOSIZE) {
1926
+ autosizeTarget = this.autosizer || this.parentAutosizer;
1927
+ attachToAutosizer = autosizeTarget !== null;
1928
+ }
1929
+
1930
+ node.parentHasRenderTexture = inRttCluster;
1931
+ if (previousParent !== null) {
1932
+ const previousParentInRttCluster =
1933
+ USE_RTT &&
1934
+ (previousParent.props.rtt === true ||
1935
+ previousParent.parentHasRenderTexture === true);
1936
+ if (inRttCluster === false && previousParentInRttCluster === true) {
1937
+ // update child RTT status
1938
+ node.clearRTTInheritance();
1939
+ }
1735
1940
 
1736
- assertTruthy(this.globalTransform);
1737
- assertTruthy(this.renderCoords);
1738
-
1739
- // add to list of renderables to be sorted before rendering
1740
- renderer.addQuad({
1741
- width: this.props.width,
1742
- height: this.props.height,
1743
- colorTl: this.premultipliedColorTl,
1744
- colorTr: this.premultipliedColorTr,
1745
- colorBl: this.premultipliedColorBl,
1746
- colorBr: this.premultipliedColorBr,
1747
- // if we do not have a texture, use the default texture
1748
- // this assumes any renderable node is either a distinct texture or a ColorTexture
1749
- texture: this.texture || this.stage.defaultTexture,
1750
- textureOptions: this.textureOptions,
1751
- zIndex: this.zIndex,
1752
- shader: this.shader.shader,
1753
- shaderProps: this.shader.getResolvedProps(),
1754
- alpha: this.worldAlpha,
1755
- clippingRect: this.clippingRect,
1756
- tx: this.globalTransform.tx,
1757
- ty: this.globalTransform.ty,
1758
- ta: this.globalTransform.ta,
1759
- tb: this.globalTransform.tb,
1760
- tc: this.globalTransform.tc,
1761
- td: this.globalTransform.td,
1762
- renderCoords: this.renderCoords,
1763
- rtt: this.rtt,
1764
- parentHasRenderTexture: this.parentHasRenderTexture,
1765
- framebufferDimensions: this.framebufferDimensions,
1766
- });
1941
+ if (ENABLE_AUTOSIZE) {
1942
+ const previousAutosizer = node.autosizer || node.parentAutosizer;
1943
+ if (previousAutosizer !== null) {
1944
+ if (!autosizeTarget || previousAutosizer.id !== autosizeTarget.id) {
1945
+ previousAutosizer.detach(node);
1946
+ }
1947
+ attachToAutosizer = false;
1948
+ }
1949
+ }
1950
+ }
1951
+
1952
+ if (ENABLE_AUTOSIZE && attachToAutosizer === true && autosizeTarget) {
1953
+ //if this is true, then the autosizer really exists
1954
+ autosizeTarget.attach(node);
1955
+ }
1956
+
1957
+ if (inRttCluster === true) {
1958
+ node.markChildrenWithRTT(this);
1959
+ }
1960
+
1961
+ children.push(node);
1962
+
1963
+ // check if we need to sort
1964
+ const lastIndex = children.length - 1;
1965
+ let shouldSort = node.zIndex !== 0;
1966
+
1967
+ if (shouldSort === false && lastIndex > 0) {
1968
+ // If the new node has zIndex 0, we check if any existing children have (had) non-zero zIndex.
1969
+ // Since children are sorted, we only need to check the first and the last (before the new one).
1970
+ // The new node is at `lastIndex`. The previous last node is at `lastIndex - 1`.
1971
+ const first = children[0]!;
1972
+ const last = children[lastIndex - 1]!;
1973
+ shouldSort = first.zIndex !== 0 || last.zIndex !== 0;
1974
+ }
1975
+
1976
+ if (shouldSort) {
1977
+ this.setUpdateType(UpdateType.SortZIndexChildren);
1978
+ }
1979
+ this.setUpdateType(UpdateType.Children);
1980
+ this.stage.requestRenderListUpdate();
1767
1981
  }
1768
1982
 
1769
1983
  //#region Properties
@@ -1793,7 +2007,7 @@ export class CoreNode extends EventEmitter {
1793
2007
  get absX(): number {
1794
2008
  return (
1795
2009
  this.props.x +
1796
- -this.props.width * this.props.mountX +
2010
+ -this.props.w * this.props.mountX +
1797
2011
  (this.props.parent?.absX || this.props.parent?.globalTransform?.tx || 0)
1798
2012
  );
1799
2013
  }
@@ -1801,7 +2015,7 @@ export class CoreNode extends EventEmitter {
1801
2015
  get absY(): number {
1802
2016
  return (
1803
2017
  this.props.y +
1804
- -this.props.height * this.props.mountY +
2018
+ -this.props.h * this.props.mountY +
1805
2019
  (this.props.parent?.absY ?? 0)
1806
2020
  );
1807
2021
  }
@@ -1817,43 +2031,63 @@ export class CoreNode extends EventEmitter {
1817
2031
  }
1818
2032
  }
1819
2033
 
1820
- get width(): number {
1821
- return this.props.width;
2034
+ get w(): number {
2035
+ return this.props.w;
1822
2036
  }
1823
2037
 
1824
- set width(value: number) {
1825
- if (this.props.width !== value) {
1826
- this.props.width = value;
1827
- this.setUpdateType(UpdateType.Local);
2038
+ set w(value: number) {
2039
+ const props = this.props;
2040
+ if (props.w !== value) {
2041
+ props.w = value;
2042
+ let updateType = UpdateType.Local;
1828
2043
 
1829
- if (this.props.rtt) {
1830
- this.texture = this.stage.txManager.createTexture('RenderTexture', {
1831
- width: this.width,
1832
- height: this.height,
1833
- });
2044
+ if (
2045
+ props.texture !== null &&
2046
+ this.stage.calculateTextureCoord === true &&
2047
+ props.textureOptions !== null
2048
+ ) {
2049
+ this.textureCoords = this.stage.renderer.getTextureCoords!(this);
2050
+ }
1834
2051
 
1835
- this.setUpdateType(UpdateType.RenderTexture);
2052
+ if (props.rtt === true) {
2053
+ this.framebufferDimensions!.w = value;
2054
+ this.texture = this.stage.txManager.createTexture(
2055
+ 'RenderTexture',
2056
+ this.framebufferDimensions!,
2057
+ );
2058
+ updateType |= UpdateType.RenderTexture;
1836
2059
  }
2060
+ this.setUpdateType(updateType);
1837
2061
  }
1838
2062
  }
1839
2063
 
1840
- get height(): number {
1841
- return this.props.height;
2064
+ get h(): number {
2065
+ return this.props.h;
1842
2066
  }
1843
2067
 
1844
- set height(value: number) {
1845
- if (this.props.height !== value) {
1846
- this.props.height = value;
1847
- this.setUpdateType(UpdateType.Local);
2068
+ set h(value: number) {
2069
+ const props = this.props;
2070
+ if (props.h !== value) {
2071
+ props.h = value;
2072
+ let updateType = UpdateType.Local;
1848
2073
 
1849
- if (this.props.rtt) {
1850
- this.texture = this.stage.txManager.createTexture('RenderTexture', {
1851
- width: this.width,
1852
- height: this.height,
1853
- });
2074
+ if (
2075
+ props.texture !== null &&
2076
+ this.stage.calculateTextureCoord === true &&
2077
+ props.textureOptions !== null
2078
+ ) {
2079
+ this.textureCoords = this.stage.renderer.getTextureCoords!(this);
2080
+ }
1854
2081
 
1855
- this.setUpdateType(UpdateType.RenderTexture);
2082
+ if (props.rtt === true) {
2083
+ this.framebufferDimensions!.h = value;
2084
+ this.texture = this.stage.txManager.createTexture(
2085
+ 'RenderTexture',
2086
+ this.framebufferDimensions!,
2087
+ );
2088
+ updateType |= UpdateType.RenderTexture;
1856
2089
  }
2090
+ this.setUpdateType(updateType);
1857
2091
  }
1858
2092
  }
1859
2093
 
@@ -1868,6 +2102,7 @@ export class CoreNode extends EventEmitter {
1868
2102
  // Unlike INode, `null` should never be possibility for Animations.
1869
2103
  this.scaleX = value;
1870
2104
  this.scaleY = value;
2105
+ this.updateIsSimple();
1871
2106
  }
1872
2107
 
1873
2108
  get scaleX(): number {
@@ -1877,7 +2112,8 @@ export class CoreNode extends EventEmitter {
1877
2112
  set scaleX(value: number) {
1878
2113
  if (this.props.scaleX !== value) {
1879
2114
  this.props.scaleX = value;
1880
- this.setUpdateType(UpdateType.ScaleRotate);
2115
+ this.setUpdateType(UpdateType.Local);
2116
+ this.updateIsSimple();
1881
2117
  }
1882
2118
  }
1883
2119
 
@@ -1888,7 +2124,8 @@ export class CoreNode extends EventEmitter {
1888
2124
  set scaleY(value: number) {
1889
2125
  if (this.props.scaleY !== value) {
1890
2126
  this.props.scaleY = value;
1891
- this.setUpdateType(UpdateType.ScaleRotate);
2127
+ this.setUpdateType(UpdateType.Local);
2128
+ this.updateIsSimple();
1892
2129
  }
1893
2130
  }
1894
2131
 
@@ -1902,6 +2139,7 @@ export class CoreNode extends EventEmitter {
1902
2139
  this.props.mountY = value;
1903
2140
  this.props.mount = value;
1904
2141
  this.setUpdateType(UpdateType.Local);
2142
+ this.updateIsSimple();
1905
2143
  }
1906
2144
  }
1907
2145
 
@@ -1913,6 +2151,7 @@ export class CoreNode extends EventEmitter {
1913
2151
  if (this.props.mountX !== value) {
1914
2152
  this.props.mountX = value;
1915
2153
  this.setUpdateType(UpdateType.Local);
2154
+ this.updateIsSimple();
1916
2155
  }
1917
2156
  }
1918
2157
 
@@ -1924,6 +2163,7 @@ export class CoreNode extends EventEmitter {
1924
2163
  if (this.props.mountY !== value) {
1925
2164
  this.props.mountY = value;
1926
2165
  this.setUpdateType(UpdateType.Local);
2166
+ this.updateIsSimple();
1927
2167
  }
1928
2168
  }
1929
2169
 
@@ -1969,7 +2209,8 @@ export class CoreNode extends EventEmitter {
1969
2209
  set rotation(value: number) {
1970
2210
  if (this.props.rotation !== value) {
1971
2211
  this.props.rotation = value;
1972
- this.setUpdateType(UpdateType.ScaleRotate);
2212
+ this.setUpdateType(UpdateType.Local);
2213
+ this.updateIsSimple();
1973
2214
  }
1974
2215
  }
1975
2216
 
@@ -1993,15 +2234,34 @@ export class CoreNode extends EventEmitter {
1993
2234
  }
1994
2235
 
1995
2236
  set autosize(value: boolean) {
2237
+ if (this.props.autosize === value) {
2238
+ return;
2239
+ }
2240
+
1996
2241
  this.props.autosize = value;
2242
+
2243
+ if (value === true && this.autosizer === null) {
2244
+ this.autosizer = new Autosizer(this);
2245
+ } else {
2246
+ this.autosizer = null;
2247
+ }
1997
2248
  }
1998
2249
 
1999
2250
  get boundsMargin(): number | [number, number, number, number] | null {
2000
- return (
2001
- this.props.boundsMargin ??
2002
- this.parent?.boundsMargin ??
2003
- this.stage.boundsMargin
2004
- );
2251
+ const props = this.props;
2252
+ if (props.boundsMargin !== null) {
2253
+ return props.boundsMargin;
2254
+ }
2255
+
2256
+ const parent = this.parent;
2257
+ if (parent !== null) {
2258
+ const margin = parent.boundsMargin;
2259
+ if (margin !== undefined) {
2260
+ return margin;
2261
+ }
2262
+ }
2263
+
2264
+ return this.stage.boundsMargin;
2005
2265
  }
2006
2266
 
2007
2267
  set boundsMargin(value: number | [number, number, number, number] | null) {
@@ -2038,11 +2298,22 @@ export class CoreNode extends EventEmitter {
2038
2298
  }
2039
2299
 
2040
2300
  set color(value: number) {
2041
- this.colorTop = value;
2042
- this.colorBottom = value;
2043
- this.colorLeft = value;
2044
- this.colorRight = value;
2045
- this.props.color = value;
2301
+ const p = this.props;
2302
+ if (p.color === value) return;
2303
+
2304
+ p.color = value;
2305
+
2306
+ const has = value > 0;
2307
+
2308
+ if (has !== this.hasColorProps) {
2309
+ this.setUpdateType(UpdateType.IsRenderable);
2310
+ }
2311
+ this.hasColorProps = has;
2312
+
2313
+ if (p.colorTop !== value) this.colorTop = value;
2314
+ if (p.colorBottom !== value) this.colorBottom = value;
2315
+ if (p.colorLeft !== value) this.colorLeft = value;
2316
+ if (p.colorRight !== value) this.colorRight = value;
2046
2317
 
2047
2318
  this.setUpdateType(UpdateType.PremultipliedColors);
2048
2319
  }
@@ -2057,7 +2328,10 @@ export class CoreNode extends EventEmitter {
2057
2328
  this.colorTr = value;
2058
2329
  }
2059
2330
  this.props.colorTop = value;
2060
- this.setUpdateType(UpdateType.PremultipliedColors);
2331
+ this.hasColorProps = value > 0;
2332
+ this.setUpdateType(
2333
+ UpdateType.PremultipliedColors | UpdateType.IsRenderable,
2334
+ );
2061
2335
  }
2062
2336
 
2063
2337
  get colorBottom(): number {
@@ -2070,7 +2344,10 @@ export class CoreNode extends EventEmitter {
2070
2344
  this.colorBr = value;
2071
2345
  }
2072
2346
  this.props.colorBottom = value;
2073
- this.setUpdateType(UpdateType.PremultipliedColors);
2347
+ this.hasColorProps = value > 0;
2348
+ this.setUpdateType(
2349
+ UpdateType.PremultipliedColors | UpdateType.IsRenderable,
2350
+ );
2074
2351
  }
2075
2352
 
2076
2353
  get colorLeft(): number {
@@ -2083,7 +2360,10 @@ export class CoreNode extends EventEmitter {
2083
2360
  this.colorBl = value;
2084
2361
  }
2085
2362
  this.props.colorLeft = value;
2086
- this.setUpdateType(UpdateType.PremultipliedColors);
2363
+ this.hasColorProps = value > 0;
2364
+ this.setUpdateType(
2365
+ UpdateType.PremultipliedColors | UpdateType.IsRenderable,
2366
+ );
2087
2367
  }
2088
2368
 
2089
2369
  get colorRight(): number {
@@ -2096,7 +2376,10 @@ export class CoreNode extends EventEmitter {
2096
2376
  this.colorBr = value;
2097
2377
  }
2098
2378
  this.props.colorRight = value;
2099
- this.setUpdateType(UpdateType.PremultipliedColors);
2379
+ this.hasColorProps = value > 0;
2380
+ this.setUpdateType(
2381
+ UpdateType.PremultipliedColors | UpdateType.IsRenderable,
2382
+ );
2100
2383
  }
2101
2384
 
2102
2385
  get colorTl(): number {
@@ -2105,7 +2388,10 @@ export class CoreNode extends EventEmitter {
2105
2388
 
2106
2389
  set colorTl(value: number) {
2107
2390
  this.props.colorTl = value;
2108
- this.setUpdateType(UpdateType.PremultipliedColors);
2391
+ this.hasColorProps = value > 0;
2392
+ this.setUpdateType(
2393
+ UpdateType.PremultipliedColors | UpdateType.IsRenderable,
2394
+ );
2109
2395
  }
2110
2396
 
2111
2397
  get colorTr(): number {
@@ -2114,7 +2400,10 @@ export class CoreNode extends EventEmitter {
2114
2400
 
2115
2401
  set colorTr(value: number) {
2116
2402
  this.props.colorTr = value;
2117
- this.setUpdateType(UpdateType.PremultipliedColors);
2403
+ this.hasColorProps = value > 0;
2404
+ this.setUpdateType(
2405
+ UpdateType.PremultipliedColors | UpdateType.IsRenderable,
2406
+ );
2118
2407
  }
2119
2408
 
2120
2409
  get colorBl(): number {
@@ -2123,7 +2412,10 @@ export class CoreNode extends EventEmitter {
2123
2412
 
2124
2413
  set colorBl(value: number) {
2125
2414
  this.props.colorBl = value;
2126
- this.setUpdateType(UpdateType.PremultipliedColors);
2415
+ this.hasColorProps = value > 0;
2416
+ this.setUpdateType(
2417
+ UpdateType.PremultipliedColors | UpdateType.IsRenderable,
2418
+ );
2127
2419
  }
2128
2420
 
2129
2421
  get colorBr(): number {
@@ -2132,21 +2424,10 @@ export class CoreNode extends EventEmitter {
2132
2424
 
2133
2425
  set colorBr(value: number) {
2134
2426
  this.props.colorBr = value;
2135
- this.setUpdateType(UpdateType.PremultipliedColors);
2136
- }
2137
-
2138
- // we're only interested in parent zIndex to test
2139
- // if we should use node zIndex is higher then parent zIndex
2140
- get zIndexLocked(): number {
2141
- return this.props.zIndexLocked || 0;
2142
- }
2143
-
2144
- set zIndexLocked(value: number) {
2145
- this.props.zIndexLocked = value;
2146
- this.setUpdateType(UpdateType.CalculatedZIndex | UpdateType.Children);
2147
- for (let i = 0, length = this.children.length; i < length; i++) {
2148
- this.children[i]!.setUpdateType(UpdateType.CalculatedZIndex);
2149
- }
2427
+ this.hasColorProps = value > 0;
2428
+ this.setUpdateType(
2429
+ UpdateType.PremultipliedColors | UpdateType.IsRenderable,
2430
+ );
2150
2431
  }
2151
2432
 
2152
2433
  get zIndex(): number {
@@ -2154,10 +2435,28 @@ export class CoreNode extends EventEmitter {
2154
2435
  }
2155
2436
 
2156
2437
  set zIndex(value: number) {
2157
- this.props.zIndex = value;
2158
- this.setUpdateType(UpdateType.CalculatedZIndex | UpdateType.Children);
2159
- for (let i = 0, length = this.children.length; i < length; i++) {
2160
- this.children[i]!.setUpdateType(UpdateType.CalculatedZIndex);
2438
+ let sanitizedValue = value;
2439
+ if (isNaN(sanitizedValue) || Number.isFinite(sanitizedValue) === false) {
2440
+ console.warn(
2441
+ `zIndex was set to an invalid value: ${value}, defaulting to 0`,
2442
+ );
2443
+ sanitizedValue = 0;
2444
+ }
2445
+
2446
+ //Clamp to safe integer range
2447
+ if (sanitizedValue > Number.MAX_SAFE_INTEGER) {
2448
+ sanitizedValue = 1000;
2449
+ } else if (sanitizedValue < Number.MIN_SAFE_INTEGER) {
2450
+ sanitizedValue = -1000;
2451
+ }
2452
+
2453
+ if (this.props.zIndex === sanitizedValue) {
2454
+ return;
2455
+ }
2456
+ this.props.zIndex = sanitizedValue;
2457
+ const parent = this.parent;
2458
+ if (parent !== null) {
2459
+ parent.setUpdateType(UpdateType.SortZIndexChildren);
2161
2460
  }
2162
2461
  }
2163
2462
 
@@ -2172,48 +2471,13 @@ export class CoreNode extends EventEmitter {
2172
2471
  }
2173
2472
  this.props.parent = newParent;
2174
2473
  if (oldParent) {
2175
- const index = oldParent.children.indexOf(this);
2176
- assertTruthy(
2177
- index !== -1,
2178
- "CoreNode.parent: Node not found in old parent's children!",
2179
- );
2180
- oldParent.children.splice(index, 1);
2181
- oldParent.setUpdateType(
2182
- UpdateType.Children | UpdateType.ZIndexSortedChildren,
2183
- );
2474
+ oldParent.removeChild(this, newParent);
2184
2475
  }
2185
- if (newParent) {
2186
- newParent.children.push(this);
2187
- // Since this node has a new parent, to be safe, have it do a full update.
2188
- this.setUpdateType(UpdateType.All);
2189
- // Tell parent that it's children need to be updated and sorted.
2190
- newParent.setUpdateType(
2191
- UpdateType.Children | UpdateType.ZIndexSortedChildren,
2192
- );
2193
-
2194
- // If the new parent has an RTT enabled, apply RTT inheritance
2195
- if (newParent.rtt || newParent.parentHasRenderTexture) {
2196
- this.applyRTTInheritance(newParent);
2197
- }
2476
+ if (newParent !== null) {
2477
+ newParent.addChild(this, oldParent);
2198
2478
  }
2199
- this.updateScaleRotateTransform();
2200
-
2201
- // fetch render bounds from parent
2202
- this.setUpdateType(UpdateType.RenderBounds | UpdateType.Children);
2203
- }
2204
-
2205
- get preventCleanup(): boolean {
2206
- return this.props.textureOptions.preventCleanup || false;
2207
- }
2208
-
2209
- set preventCleanup(value: boolean) {
2210
- if (isProductionEnvironment() === false) {
2211
- console.warn(
2212
- 'CoreNode.preventCleanup: Is deprecated and will be removed in upcoming release, please use textureOptions.preventCleanup instead',
2213
- );
2214
- }
2215
-
2216
- this.props.textureOptions.preventCleanup = value;
2479
+ //since this node has a new parent, recalc global and render bounds
2480
+ this.setUpdateType(UpdateType.Global | UpdateType.RenderBounds);
2217
2481
  }
2218
2482
 
2219
2483
  get rtt(): boolean {
@@ -2240,11 +2504,14 @@ export class CoreNode extends EventEmitter {
2240
2504
  }
2241
2505
  }
2242
2506
  private initRenderTexture() {
2243
- this.texture = this.stage.txManager.createTexture('RenderTexture', {
2244
- width: this.width,
2245
- height: this.height,
2246
- });
2247
-
2507
+ this.framebufferDimensions = {
2508
+ w: this.props.w,
2509
+ h: this.props.h,
2510
+ };
2511
+ this.texture = this.stage.txManager.createTexture(
2512
+ 'RenderTexture',
2513
+ this.framebufferDimensions,
2514
+ );
2248
2515
  this.stage.renderer.renderToTexture(this);
2249
2516
  }
2250
2517
 
@@ -2254,6 +2521,7 @@ export class CoreNode extends EventEmitter {
2254
2521
 
2255
2522
  this.hasRTTupdates = false;
2256
2523
  this.texture = null;
2524
+ this.framebufferDimensions = null;
2257
2525
  }
2258
2526
 
2259
2527
  private markChildrenWithRTT(node: CoreNode | null = null) {
@@ -2294,18 +2562,33 @@ export class CoreNode extends EventEmitter {
2294
2562
  }
2295
2563
  }
2296
2564
 
2297
- get shader(): BaseShaderController {
2565
+ get shader(): CoreShaderNode<any> | null {
2298
2566
  return this.props.shader;
2299
2567
  }
2300
2568
 
2301
- set shader(value: BaseShaderController) {
2302
- if (this.props.shader === value) {
2569
+ set shader(shader: CoreShaderNode<any> | null) {
2570
+ if (this.props.shader === shader) {
2303
2571
  return;
2304
2572
  }
2573
+ if (shader === null) {
2574
+ this.hasShaderUpdater = false;
2575
+ this.props.shader = this.stage.defShaderNode;
2576
+ this.setUpdateType(UpdateType.IsRenderable);
2577
+ return;
2578
+ }
2579
+ if (shader.shaderKey !== 'default') {
2580
+ this.hasShaderUpdater = shader.update !== undefined;
2581
+ this.hasShaderTimeFn = shader.time !== undefined;
2582
+ shader.attachNode(this);
2583
+ }
2305
2584
 
2306
- this.props.shader = value;
2307
-
2308
- this.setUpdateType(UpdateType.IsRenderable);
2585
+ if (this.hasShaderTimeFn === true) {
2586
+ this.stage.trackTimedNode(this);
2587
+ } else {
2588
+ this.stage.untrackTimedNode(this);
2589
+ }
2590
+ this.props.shader = shader;
2591
+ this.setUpdateType(UpdateType.IsRenderable | UpdateType.RecalcUniforms);
2309
2592
  }
2310
2593
 
2311
2594
  get src(): string | null {
@@ -2326,8 +2609,8 @@ export class CoreNode extends EventEmitter {
2326
2609
 
2327
2610
  this.texture = this.stage.txManager.createTexture('ImageTexture', {
2328
2611
  src: imageUrl,
2329
- width: this.props.width,
2330
- height: this.props.height,
2612
+ w: this.props.w,
2613
+ h: this.props.h,
2331
2614
  type: this.props.imageType,
2332
2615
  sx: this.props.srcX,
2333
2616
  sy: this.props.srcY,
@@ -2381,16 +2664,14 @@ export class CoreNode extends EventEmitter {
2381
2664
  }
2382
2665
 
2383
2666
  /**
2384
- * Returns the framebuffer dimensions of the node.
2385
- * If the node has a render texture, the dimensions are the same as the node's dimensions.
2386
- * If the node does not have a render texture, the dimensions are inherited from the parent.
2387
- * If the node parent has a render texture and the node is a render texture, the nodes dimensions are used.
2667
+ * Returns the framebuffer dimensions of the RTT parent
2388
2668
  */
2389
- get framebufferDimensions(): Dimensions {
2390
- if (this.parentHasRenderTexture && !this.rtt && this.parent) {
2391
- return this.parent.framebufferDimensions;
2669
+ get parentFramebufferDimensions(): Dimensions | null {
2670
+ if (this.rttParent !== null) {
2671
+ return this.rttParent.framebufferDimensions;
2392
2672
  }
2393
- return { width: this.width, height: this.height };
2673
+ this.rttParent = this.findParentRTTNode();
2674
+ return this.rttParent ? this.rttParent.framebufferDimensions : null;
2394
2675
  }
2395
2676
 
2396
2677
  /**
@@ -2418,41 +2699,38 @@ export class CoreNode extends EventEmitter {
2418
2699
 
2419
2700
  const oldTexture = this.props.texture;
2420
2701
  if (oldTexture) {
2421
- oldTexture.setRenderableOwner(this, false);
2422
2702
  this.unloadTexture();
2703
+ if (this.autosizer !== null && value === null) {
2704
+ this.autosizer.setMode(AutosizeMode.Children); // Set to children size mode
2705
+ }
2423
2706
  }
2424
2707
 
2708
+ this.textureCoords = undefined;
2425
2709
  this.props.texture = value;
2426
2710
  if (value !== null) {
2427
- value.setRenderableOwner(this, this.isRenderable);
2711
+ if (this.autosizer !== null) {
2712
+ this.autosizer.setMode(AutosizeMode.Texture); // Set to texture size mode
2713
+ }
2714
+ value.setRenderableOwner(this._id, this.isRenderable);
2428
2715
  this.loadTexture();
2429
2716
  }
2430
2717
 
2431
2718
  this.setUpdateType(UpdateType.IsRenderable);
2719
+ this.updateIsSimple();
2432
2720
  }
2433
2721
 
2434
2722
  set textureOptions(value: TextureOptions) {
2435
2723
  this.props.textureOptions = value;
2724
+ if (this.stage.calculateTextureCoord === true && value !== null) {
2725
+ this.textureCoords = this.stage.renderer.getTextureCoords!(this);
2726
+ }
2727
+ this.updateIsSimple();
2436
2728
  }
2437
2729
 
2438
2730
  get textureOptions(): TextureOptions {
2439
2731
  return this.props.textureOptions;
2440
2732
  }
2441
2733
 
2442
- get strictBounds(): boolean {
2443
- return this.props.strictBounds;
2444
- }
2445
-
2446
- set strictBounds(v) {
2447
- if (v === this.props.strictBounds) {
2448
- return;
2449
- }
2450
-
2451
- this.props.strictBounds = v;
2452
- this.setUpdateType(UpdateType.RenderBounds | UpdateType.Children);
2453
- this.childUpdateType |= UpdateType.RenderBounds | UpdateType.Children;
2454
- }
2455
-
2456
2734
  set interactive(value: boolean | undefined) {
2457
2735
  this.props.interactive = value;
2458
2736
  // Update Stage's interactive Set
@@ -2465,6 +2743,11 @@ export class CoreNode extends EventEmitter {
2465
2743
  return this.props.interactive;
2466
2744
  }
2467
2745
 
2746
+ setRTTUpdates(type: number) {
2747
+ this.hasRTTupdates = true;
2748
+ this.parent?.setRTTUpdates(type);
2749
+ }
2750
+
2468
2751
  animate(
2469
2752
  props: Partial<CoreNodeAnimateProps>,
2470
2753
  settings: Partial<AnimationSettings>,
@@ -2483,5 +2766,70 @@ export class CoreNode extends EventEmitter {
2483
2766
  // no-op
2484
2767
  }
2485
2768
 
2769
+ /**
2770
+ * Add a texture to the current RenderOp.
2771
+ *
2772
+ * @param texture
2773
+ * @returns Assigned Texture Index of the texture in the render op
2774
+ */
2775
+ addTexture(texture: WebGlCtxTexture): number {
2776
+ const textures = this.renderOpTextures;
2777
+ const length = textures.length;
2778
+
2779
+ for (let i = 0; i < length; i++) {
2780
+ if (textures[i] === texture) {
2781
+ return i;
2782
+ }
2783
+ }
2784
+
2785
+ if (length >= 1) {
2786
+ return 0xffffffff;
2787
+ }
2788
+
2789
+ textures.push(texture);
2790
+ return length;
2791
+ }
2792
+
2793
+ draw(renderer: WebGlRenderer) {
2794
+ const { glw, options, stage } = renderer;
2795
+ const shader = this.props.shader as any;
2796
+
2797
+ stage.shManager.useShader(shader.program);
2798
+ shader.program.bindRenderOp(this);
2799
+
2800
+ // Clipping
2801
+ if (this.clippingRect.valid === true) {
2802
+ const pixelRatio =
2803
+ USE_RTT && this.parentHasRenderTexture ? 1 : stage.pixelRatio;
2804
+
2805
+ const clipX = Math.round(this.clippingRect.x * pixelRatio);
2806
+ const clipWidth = Math.round(this.clippingRect.width * pixelRatio);
2807
+ const clipHeight = Math.round(this.clippingRect.height * pixelRatio);
2808
+ let clipY = Math.round(
2809
+ options.canvas.height - clipHeight - this.clippingRect.y * pixelRatio,
2810
+ );
2811
+ // if parent has render texture, we need to adjust the scissor rect
2812
+ // to be relative to the parent's framebuffer
2813
+ if (USE_RTT && this.parentHasRenderTexture) {
2814
+ clipY = this.parentFramebufferDimensions
2815
+ ? this.parentFramebufferDimensions.h - this.props.h
2816
+ : 0;
2817
+ }
2818
+
2819
+ glw.setScissorTest(true);
2820
+ glw.scissor(clipX, clipY, clipWidth, clipHeight);
2821
+ } else {
2822
+ glw.setScissorTest(false);
2823
+ }
2824
+
2825
+ const quadIdx = (this.renderOpBufferIdx / 20) * 6 * 2;
2826
+ glw.drawElements(
2827
+ glw.TRIANGLES,
2828
+ 6 * this.numQuads,
2829
+ glw.UNSIGNED_SHORT,
2830
+ quadIdx,
2831
+ );
2832
+ }
2833
+
2486
2834
  //#endregion Properties
2487
2835
  }