@lightningjs/renderer 3.0.0-beta8 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (566) hide show
  1. package/LICENSE +202 -202
  2. package/NOTICE +3 -3
  3. package/README.md +230 -147
  4. package/dist/exports/canvas.d.ts +1 -1
  5. package/dist/exports/canvas.js +1 -1
  6. package/dist/exports/canvas.js.map +1 -1
  7. package/dist/exports/index.d.ts +5 -6
  8. package/dist/exports/index.js +3 -5
  9. package/dist/exports/index.js.map +1 -1
  10. package/dist/exports/platform.d.ts +7 -0
  11. package/dist/exports/platform.js +27 -0
  12. package/dist/exports/platform.js.map +1 -0
  13. package/dist/exports/webgl.d.ts +2 -1
  14. package/dist/exports/webgl.js +2 -1
  15. package/dist/exports/webgl.js.map +1 -1
  16. package/dist/src/common/CommonTypes.d.ts +15 -3
  17. package/dist/src/core/AutosizeManager.d.ts +29 -0
  18. package/dist/src/core/AutosizeManager.js +169 -0
  19. package/dist/src/core/AutosizeManager.js.map +1 -0
  20. package/dist/src/core/Autosizer.d.ts +35 -0
  21. package/dist/src/core/Autosizer.js +196 -0
  22. package/dist/src/core/Autosizer.js.map +1 -0
  23. package/dist/src/core/CoreNode.d.ts +106 -58
  24. package/dist/src/core/CoreNode.js +530 -282
  25. package/dist/src/core/CoreNode.js.map +1 -1
  26. package/dist/src/core/CoreTextNode.d.ts +73 -88
  27. package/dist/src/core/CoreTextNode.js +375 -236
  28. package/dist/src/core/CoreTextNode.js.map +1 -1
  29. package/dist/src/core/CoreTextureManager.d.ts +23 -26
  30. package/dist/src/core/CoreTextureManager.js +60 -166
  31. package/dist/src/core/CoreTextureManager.js.map +1 -1
  32. package/dist/src/core/Stage.d.ts +63 -9
  33. package/dist/src/core/Stage.js +233 -133
  34. package/dist/src/core/Stage.js.map +1 -1
  35. package/dist/src/core/TextureError.d.ts +11 -0
  36. package/dist/src/core/TextureError.js +37 -0
  37. package/dist/src/core/TextureError.js.map +1 -0
  38. package/dist/src/core/TextureMemoryManager.d.ts +3 -5
  39. package/dist/src/core/TextureMemoryManager.js +84 -94
  40. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  41. package/dist/src/core/animations/Animation.d.ts +21 -0
  42. package/dist/src/core/animations/Animation.js +194 -0
  43. package/dist/src/core/animations/Animation.js.map +1 -0
  44. package/dist/src/core/animations/CoreAnimation.d.ts +3 -3
  45. package/dist/src/core/animations/CoreAnimation.js +3 -3
  46. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  47. package/dist/src/core/animations/CoreAnimationController.d.ts +1 -1
  48. package/dist/src/core/animations/CoreAnimationController.js +8 -5
  49. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  50. package/dist/src/core/animations/Playback.d.ts +64 -0
  51. package/dist/src/core/animations/Playback.js +169 -0
  52. package/dist/src/core/animations/Playback.js.map +1 -0
  53. package/dist/src/core/animations/Transition.d.ts +27 -0
  54. package/dist/src/core/animations/Transition.js +52 -0
  55. package/dist/src/core/animations/Transition.js.map +1 -0
  56. package/dist/src/core/animations/utils.d.ts +2 -0
  57. package/dist/src/core/animations/utils.js +136 -0
  58. package/dist/src/core/animations/utils.js.map +1 -0
  59. package/dist/src/core/lib/ImageWorker.d.ts +2 -2
  60. package/dist/src/core/lib/ImageWorker.js +30 -11
  61. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  62. package/dist/src/core/lib/WebGlContextWrapper.d.ts +41 -3
  63. package/dist/src/core/lib/WebGlContextWrapper.js +105 -28
  64. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  65. package/dist/src/core/lib/collectionUtils.d.ts +4 -0
  66. package/dist/src/core/lib/collectionUtils.js +72 -0
  67. package/dist/src/core/lib/collectionUtils.js.map +1 -0
  68. package/dist/src/core/lib/colorCache.d.ts +1 -0
  69. package/dist/src/core/lib/colorCache.js +19 -0
  70. package/dist/src/core/lib/colorCache.js.map +1 -0
  71. package/dist/src/core/lib/colorParser.d.ts +21 -0
  72. package/dist/src/core/lib/colorParser.js +72 -0
  73. package/dist/src/core/lib/colorParser.js.map +1 -0
  74. package/dist/src/core/lib/textureCompression.d.ts +14 -2
  75. package/dist/src/core/lib/textureCompression.js +320 -67
  76. package/dist/src/core/lib/textureCompression.js.map +1 -1
  77. package/dist/src/core/lib/utils.d.ts +6 -6
  78. package/dist/src/core/lib/utils.js +21 -65
  79. package/dist/src/core/lib/utils.js.map +1 -1
  80. package/dist/src/core/platform.d.ts +10 -0
  81. package/dist/src/core/platform.js +81 -0
  82. package/dist/src/core/platform.js.map +1 -0
  83. package/dist/src/core/platforms/GlContextWrapper.d.ts +136 -0
  84. package/{src/core/text-rendering/TextRenderingUtils.ts → dist/src/core/platforms/GlContextWrapper.js} +32 -36
  85. package/dist/src/core/platforms/GlContextWrapper.js.map +1 -0
  86. package/dist/src/core/platforms/Platform.d.ts +78 -12
  87. package/dist/src/core/platforms/Platform.js +18 -0
  88. package/dist/src/core/platforms/Platform.js.map +1 -1
  89. package/dist/src/core/platforms/web/WebGlContextWrapper.d.ts +776 -0
  90. package/dist/src/core/platforms/web/WebGlContextWrapper.js +1208 -0
  91. package/dist/src/core/platforms/web/WebGlContextWrapper.js.map +1 -0
  92. package/dist/src/core/platforms/web/WebPlatform.d.ts +17 -2
  93. package/dist/src/core/platforms/web/WebPlatform.js +158 -13
  94. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -1
  95. package/dist/src/core/platforms/web/WebPlatformChrome50.d.ts +19 -0
  96. package/dist/src/core/platforms/web/WebPlatformChrome50.js +54 -0
  97. package/dist/src/core/platforms/web/WebPlatformChrome50.js.map +1 -0
  98. package/dist/src/core/platforms/web/WebPlatformLegacy.d.ts +20 -0
  99. package/dist/src/core/platforms/web/WebPlatformLegacy.js +105 -0
  100. package/dist/src/core/platforms/web/WebPlatformLegacy.js.map +1 -0
  101. package/dist/src/core/platforms/web/WebPlatformNext.d.ts +21 -0
  102. package/dist/src/core/platforms/web/WebPlatformNext.js +52 -0
  103. package/dist/src/core/platforms/web/WebPlatformNext.js.map +1 -0
  104. package/dist/src/core/platforms/web/lib/ImageWorker.d.ts +21 -0
  105. package/dist/src/core/platforms/web/lib/ImageWorker.js +136 -0
  106. package/dist/src/core/platforms/web/lib/ImageWorker.js.map +1 -0
  107. package/dist/src/core/platforms/web/lib/ImageWorkerDefault.d.ts +6 -0
  108. package/dist/src/core/platforms/web/lib/ImageWorkerDefault.js +92 -0
  109. package/dist/src/core/platforms/web/lib/ImageWorkerDefault.js.map +1 -0
  110. package/dist/src/core/platforms/web/lib/ImageWorkerLegacy.d.ts +1 -0
  111. package/dist/src/core/platforms/web/lib/ImageWorkerLegacy.js +63 -0
  112. package/dist/src/core/platforms/web/lib/ImageWorkerLegacy.js.map +1 -0
  113. package/dist/src/core/platforms/web/lib/ImageWorkerNoOptions.d.ts +7 -0
  114. package/dist/src/core/platforms/web/lib/ImageWorkerNoOptions.js +75 -0
  115. package/dist/src/core/platforms/web/lib/ImageWorkerNoOptions.js.map +1 -0
  116. package/dist/src/core/platforms/web/lib/createImageBitmap.d.ts +1 -0
  117. package/dist/src/core/platforms/web/lib/createImageBitmap.js +27 -0
  118. package/dist/src/core/platforms/web/lib/createImageBitmap.js.map +1 -0
  119. package/dist/src/core/platforms/web/lib/textureCompression.d.ts +26 -0
  120. package/dist/src/core/platforms/web/lib/textureCompression.js +301 -0
  121. package/dist/src/core/platforms/web/lib/textureCompression.js.map +1 -0
  122. package/dist/src/core/platforms/web/lib/textureSvg.d.ts +7 -0
  123. package/dist/src/core/platforms/web/lib/textureSvg.js +51 -0
  124. package/dist/src/core/platforms/web/lib/textureSvg.js.map +1 -0
  125. package/dist/src/core/platforms/web/lib/utils.d.ts +5 -0
  126. package/dist/src/core/platforms/web/lib/utils.js +86 -0
  127. package/dist/src/core/platforms/web/lib/utils.js.map +1 -0
  128. package/dist/src/core/renderers/CoreContextTexture.d.ts +2 -1
  129. package/dist/src/core/renderers/CoreContextTexture.js.map +1 -1
  130. package/dist/src/core/renderers/CoreRenderer.d.ts +4 -40
  131. package/dist/src/core/renderers/CoreRenderer.js +3 -4
  132. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  133. package/dist/src/core/renderers/CoreShader.d.ts +9 -0
  134. package/{src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts → dist/src/core/renderers/CoreShader.js} +28 -32
  135. package/dist/src/core/renderers/CoreShader.js.map +1 -0
  136. package/dist/src/core/renderers/CoreShaderNode.d.ts +10 -0
  137. package/dist/src/core/renderers/CoreShaderNode.js +19 -2
  138. package/dist/src/core/renderers/CoreShaderNode.js.map +1 -1
  139. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +33 -0
  140. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +250 -0
  141. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -0
  142. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +17 -0
  143. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +125 -0
  144. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -0
  145. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +5 -6
  146. package/dist/src/core/renderers/canvas/CanvasRenderer.js +67 -91
  147. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  148. package/dist/src/core/renderers/canvas/CanvasShaderNode.d.ts +1 -2
  149. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +5 -4
  150. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
  151. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +3 -2
  152. package/dist/src/core/renderers/canvas/CanvasTexture.js +17 -13
  153. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -1
  154. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +13 -0
  155. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +113 -192
  156. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +1 -1
  157. package/dist/src/core/renderers/canvas/internal/ColorUtils.d.ts +0 -2
  158. package/dist/src/core/renderers/canvas/internal/ColorUtils.js +0 -14
  159. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +1 -1
  160. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.d.ts +10 -0
  161. package/{src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts → dist/src/core/renderers/canvas/shaders/UnsupportedShader.js} +43 -40
  162. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js.map +1 -0
  163. package/dist/src/core/renderers/webgl/SdfRenderOp.d.ts +33 -0
  164. package/dist/src/core/renderers/webgl/SdfRenderOp.js +98 -0
  165. package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -0
  166. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.d.ts +12 -0
  167. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +58 -0
  168. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +1 -0
  169. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.d.ts +9 -0
  170. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +38 -0
  171. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +1 -0
  172. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +69 -0
  173. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +272 -0
  174. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -0
  175. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +34 -0
  176. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +114 -0
  177. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +1 -0
  178. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +133 -0
  179. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +649 -0
  180. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -0
  181. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +78 -0
  182. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +202 -0
  183. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -0
  184. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +4 -2
  185. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +14 -6
  186. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -1
  187. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +15 -2
  188. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +34 -5
  189. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -1
  190. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +19 -9
  191. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +101 -49
  192. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  193. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +3 -2
  194. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +14 -5
  195. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +1 -1
  196. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +11 -23
  197. package/dist/src/core/renderers/webgl/WebGlRenderer.js +122 -133
  198. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  199. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +4 -6
  200. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +3 -3
  201. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  202. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +11 -9
  203. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +83 -46
  204. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  205. package/dist/src/core/renderers/webgl/internal/RendererUtils.d.ts +4 -4
  206. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
  207. package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +3 -3
  208. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +38 -37
  209. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  210. package/dist/src/core/renderers/webgl/shaders/DefaultShader.d.ts +9 -0
  211. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +84 -0
  212. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +1 -0
  213. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.d.ts +10 -0
  214. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +108 -0
  215. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +1 -0
  216. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +29 -0
  217. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +408 -0
  218. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -0
  219. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.d.ts +28 -0
  220. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +126 -0
  221. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -0
  222. package/dist/src/core/renderers/webgl/shaders/SdfShader.d.ts +47 -0
  223. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +148 -0
  224. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -0
  225. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.d.ts +31 -0
  226. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +71 -0
  227. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +1 -0
  228. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.d.ts +30 -0
  229. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +58 -0
  230. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +1 -0
  231. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.d.ts +31 -0
  232. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +71 -0
  233. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +1 -0
  234. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.d.ts +31 -0
  235. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +71 -0
  236. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +1 -0
  237. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.d.ts +31 -0
  238. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +71 -0
  239. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +1 -0
  240. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.d.ts +9 -0
  241. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +136 -0
  242. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +1 -0
  243. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.d.ts +36 -0
  244. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +85 -0
  245. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +1 -0
  246. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.d.ts +45 -0
  247. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +104 -0
  248. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +1 -0
  249. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +22 -0
  250. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +45 -0
  251. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +1 -0
  252. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.d.ts +58 -0
  253. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +80 -0
  254. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js.map +1 -0
  255. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +35 -0
  256. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +134 -0
  257. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -0
  258. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +40 -0
  259. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +143 -0
  260. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -0
  261. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.d.ts +61 -0
  262. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +127 -0
  263. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js.map +1 -0
  264. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.d.ts +40 -0
  265. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +71 -0
  266. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +1 -0
  267. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.d.ts +115 -0
  268. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js +61 -0
  269. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +1 -0
  270. package/dist/src/core/shaders/canvas/Border.d.ts +8 -2
  271. package/dist/src/core/shaders/canvas/Border.js +64 -25
  272. package/dist/src/core/shaders/canvas/Border.js.map +1 -1
  273. package/dist/src/core/shaders/canvas/HolePunch.js +4 -3
  274. package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -1
  275. package/dist/src/core/shaders/canvas/LinearGradient.js +7 -5
  276. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -1
  277. package/dist/src/core/shaders/canvas/RadialGradient.js +12 -10
  278. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
  279. package/dist/src/core/shaders/canvas/Rounded.js +3 -3
  280. package/dist/src/core/shaders/canvas/Rounded.js.map +1 -1
  281. package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +6 -3
  282. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +41 -11
  283. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  284. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +2 -3
  285. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +46 -9
  286. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
  287. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +6 -5
  288. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
  289. package/dist/src/core/shaders/canvas/Shadow.js +4 -2
  290. package/dist/src/core/shaders/canvas/Shadow.js.map +1 -1
  291. package/dist/src/core/shaders/canvas/utils/render.d.ts +1 -1
  292. package/dist/src/core/shaders/canvas/utils/render.js +31 -18
  293. package/dist/src/core/shaders/canvas/utils/render.js.map +1 -1
  294. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +11 -1
  295. package/dist/src/core/shaders/templates/BorderTemplate.js +30 -10
  296. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -1
  297. package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +2 -2
  298. package/dist/src/core/shaders/templates/HolePunchTemplate.js +2 -2
  299. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -1
  300. package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +8 -6
  301. package/dist/src/core/shaders/templates/RadialGradientTemplate.js +2 -2
  302. package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +1 -1
  303. package/dist/src/core/shaders/webgl/Border.js +138 -84
  304. package/dist/src/core/shaders/webgl/Border.js.map +1 -1
  305. package/dist/src/core/shaders/webgl/Default.js +46 -47
  306. package/dist/src/core/shaders/webgl/Default.js.map +1 -1
  307. package/dist/src/core/shaders/webgl/DefaultBatched.js +61 -61
  308. package/dist/src/core/shaders/webgl/HolePunch.js +34 -34
  309. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -1
  310. package/dist/src/core/shaders/webgl/LinearGradient.js +60 -36
  311. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  312. package/dist/src/core/shaders/webgl/RadialGradient.js +60 -37
  313. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  314. package/dist/src/core/shaders/webgl/Rounded.js +74 -72
  315. package/dist/src/core/shaders/webgl/Rounded.js.map +1 -1
  316. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +172 -113
  317. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  318. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +191 -132
  319. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  320. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +57 -55
  321. package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -1
  322. package/dist/src/core/shaders/webgl/SdfShader.d.ts +0 -2
  323. package/dist/src/core/shaders/webgl/SdfShader.js +56 -66
  324. package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -1
  325. package/dist/src/core/shaders/webgl/SdfShadowShader.d.ts +9 -0
  326. package/dist/src/core/shaders/webgl/SdfShadowShader.js +100 -0
  327. package/dist/src/core/shaders/webgl/SdfShadowShader.js.map +1 -0
  328. package/dist/src/core/shaders/webgl/Shadow.js +89 -83
  329. package/dist/src/core/shaders/webgl/Shadow.js.map +1 -1
  330. package/dist/src/core/text-rendering/CanvasFont.d.ts +14 -0
  331. package/dist/src/core/text-rendering/CanvasFont.js +111 -0
  332. package/dist/src/core/text-rendering/CanvasFont.js.map +1 -0
  333. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +59 -0
  334. package/dist/src/core/text-rendering/CanvasFontHandler.js +224 -0
  335. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -0
  336. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +17 -0
  337. package/dist/src/core/text-rendering/CanvasTextRenderer.js +157 -0
  338. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -0
  339. package/dist/src/core/text-rendering/CoreFont.d.ts +33 -0
  340. package/dist/src/core/text-rendering/CoreFont.js +48 -0
  341. package/dist/src/core/text-rendering/CoreFont.js.map +1 -0
  342. package/dist/src/core/text-rendering/FontManager.d.ts +11 -0
  343. package/dist/src/core/text-rendering/FontManager.js +42 -0
  344. package/dist/src/core/text-rendering/FontManager.js.map +1 -0
  345. package/dist/src/core/text-rendering/SdfFont.d.ts +29 -0
  346. package/dist/src/core/text-rendering/SdfFont.js +142 -0
  347. package/dist/src/core/text-rendering/SdfFont.js.map +1 -0
  348. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +182 -0
  349. package/dist/src/core/text-rendering/SdfFontHandler.js +381 -0
  350. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -0
  351. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +17 -0
  352. package/dist/src/core/text-rendering/SdfTextRenderer.js +301 -0
  353. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -0
  354. package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +18 -0
  355. package/dist/src/core/text-rendering/TextLayoutEngine.js +380 -0
  356. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -0
  357. package/dist/src/core/text-rendering/TextRenderer.d.ts +383 -0
  358. package/{src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts → dist/src/core/text-rendering/TextRenderer.js} +20 -38
  359. package/dist/src/core/text-rendering/TextRenderer.js.map +1 -0
  360. package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +1 -1
  361. package/dist/src/core/text-rendering/Utils.d.ts +30 -0
  362. package/dist/src/core/text-rendering/Utils.js +84 -0
  363. package/dist/src/core/text-rendering/Utils.js.map +1 -0
  364. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +2 -2
  365. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
  366. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +0 -5
  367. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  368. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +1 -7
  369. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +2 -50
  370. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
  371. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +3 -2
  372. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +87 -46
  373. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  374. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +1 -1
  375. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +8 -66
  376. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
  377. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +4 -14
  378. package/dist/src/core/text-rendering/renderers/TextRenderer.js +0 -3
  379. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  380. package/dist/src/core/textures/ColorTexture.d.ts +1 -1
  381. package/dist/src/core/textures/ColorTexture.js +3 -4
  382. package/dist/src/core/textures/ColorTexture.js.map +1 -1
  383. package/dist/src/core/textures/ImageTexture.d.ts +33 -14
  384. package/dist/src/core/textures/ImageTexture.js +46 -125
  385. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  386. package/dist/src/core/textures/NoiseTexture.d.ts +3 -3
  387. package/dist/src/core/textures/NoiseTexture.js +8 -8
  388. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  389. package/dist/src/core/textures/RenderTexture.d.ts +7 -7
  390. package/dist/src/core/textures/RenderTexture.js +12 -12
  391. package/dist/src/core/textures/RenderTexture.js.map +1 -1
  392. package/dist/src/core/textures/SubTexture.d.ts +6 -8
  393. package/dist/src/core/textures/SubTexture.js +22 -40
  394. package/dist/src/core/textures/SubTexture.js.map +1 -1
  395. package/dist/src/core/textures/Texture.d.ts +74 -11
  396. package/dist/src/core/textures/Texture.js +136 -18
  397. package/dist/src/core/textures/Texture.js.map +1 -1
  398. package/dist/src/core/utils.d.ts +2 -1
  399. package/dist/src/core/utils.js +1 -1
  400. package/dist/src/core/utils.js.map +1 -1
  401. package/dist/src/main-api/DynamicShaderController.d.ts +29 -0
  402. package/dist/src/main-api/DynamicShaderController.js +58 -0
  403. package/dist/src/main-api/DynamicShaderController.js.map +1 -0
  404. package/dist/src/main-api/Inspector.d.ts +129 -1
  405. package/dist/src/main-api/Inspector.js +462 -23
  406. package/dist/src/main-api/Inspector.js.map +1 -1
  407. package/dist/src/main-api/Renderer.d.ts +223 -41
  408. package/dist/src/main-api/Renderer.js +107 -62
  409. package/dist/src/main-api/Renderer.js.map +1 -1
  410. package/dist/src/main-api/ShaderController.d.ts +31 -0
  411. package/dist/src/main-api/ShaderController.js +37 -0
  412. package/dist/src/main-api/ShaderController.js.map +1 -0
  413. package/dist/src/utils.d.ts +0 -2
  414. package/dist/src/utils.js +0 -36
  415. package/dist/src/utils.js.map +1 -1
  416. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  417. package/dist/tsconfig.tsbuildinfo +1 -0
  418. package/exports/canvas-shaders.ts +28 -28
  419. package/exports/canvas.ts +45 -45
  420. package/exports/index.ts +90 -90
  421. package/exports/inspector.ts +24 -24
  422. package/exports/platform.ts +31 -0
  423. package/exports/utils.ts +50 -50
  424. package/exports/webgl-shaders.ts +28 -28
  425. package/exports/webgl.ts +52 -50
  426. package/package.json +16 -15
  427. package/src/common/CommonTypes.ts +163 -146
  428. package/src/common/EventEmitter.ts +77 -77
  429. package/src/common/IAnimationController.ts +92 -92
  430. package/src/common/IEventEmitter.ts +28 -28
  431. package/src/core/Autosizer.ts +224 -0
  432. package/src/core/CoreNode.test.ts +365 -202
  433. package/src/core/CoreNode.ts +2785 -2483
  434. package/src/core/CoreShaderManager.ts +188 -188
  435. package/src/core/CoreTextNode.test.ts +311 -0
  436. package/src/core/CoreTextNode.ts +598 -451
  437. package/src/core/CoreTextureManager.ts +484 -608
  438. package/src/core/Stage.ts +927 -800
  439. package/src/core/TextureError.ts +46 -0
  440. package/src/core/TextureMemoryManager.ts +418 -435
  441. package/src/core/animations/AnimationManager.ts +38 -38
  442. package/src/core/animations/CoreAnimation.ts +290 -291
  443. package/src/core/animations/CoreAnimationController.ts +169 -164
  444. package/src/core/lib/ContextSpy.ts +41 -41
  445. package/src/core/lib/Matrix3d.ts +244 -244
  446. package/src/core/lib/RenderCoords.ts +71 -71
  447. package/src/core/lib/collectionUtils.ts +83 -0
  448. package/src/core/lib/colorCache.ts +20 -0
  449. package/src/core/{renderers/canvas/internal/ColorUtils.ts → lib/colorParser.ts} +85 -85
  450. package/src/core/lib/utils.ts +337 -390
  451. package/src/core/platforms/GlContextWrapper.ts +291 -0
  452. package/src/core/platforms/Platform.ts +176 -77
  453. package/src/core/{lib → platforms/web}/WebGlContextWrapper.ts +1547 -1374
  454. package/src/core/platforms/web/WebPlatform.ts +306 -84
  455. package/src/core/platforms/web/WebPlatformChrome50.ts +63 -0
  456. package/src/core/platforms/web/WebPlatformLegacy.ts +150 -0
  457. package/src/core/platforms/web/WebPlatformNext.ts +57 -0
  458. package/src/core/platforms/web/lib/ImageWorker.ts +192 -0
  459. package/src/core/platforms/web/lib/ImageWorkerDefault.ts +117 -0
  460. package/src/core/platforms/web/lib/ImageWorkerLegacy.ts +87 -0
  461. package/src/core/platforms/web/lib/ImageWorkerNoOptions.ts +99 -0
  462. package/src/core/platforms/web/lib/createImageBitmap.ts +40 -0
  463. package/src/core/platforms/web/lib/textureCompression.ts +391 -0
  464. package/src/core/{lib → platforms/web/lib}/textureSvg.ts +66 -78
  465. package/src/core/platforms/web/lib/utils.ts +105 -0
  466. package/src/core/renderers/CoreContextTexture.ts +44 -43
  467. package/src/core/renderers/CoreRenderOp.ts +22 -22
  468. package/src/core/renderers/CoreRenderer.ts +71 -110
  469. package/src/core/renderers/CoreShaderNode.ts +202 -175
  470. package/src/core/renderers/CoreShaderProgram.ts +23 -23
  471. package/src/core/renderers/canvas/CanvasRenderer.ts +258 -302
  472. package/src/core/renderers/canvas/CanvasShaderNode.ts +95 -96
  473. package/src/core/renderers/canvas/CanvasTexture.ts +160 -156
  474. package/src/core/renderers/webgl/SdfRenderOp.ts +106 -0
  475. package/src/core/renderers/webgl/WebGlCtxRenderTexture.ts +89 -86
  476. package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +95 -50
  477. package/src/core/renderers/webgl/WebGlCtxTexture.ts +350 -298
  478. package/src/core/renderers/webgl/WebGlRenderer.ts +726 -747
  479. package/src/core/renderers/webgl/WebGlShaderNode.ts +430 -435
  480. package/src/core/renderers/webgl/WebGlShaderProgram.ts +362 -318
  481. package/src/core/renderers/webgl/internal/BufferCollection.ts +54 -54
  482. package/src/core/renderers/webgl/internal/RendererUtils.ts +151 -155
  483. package/src/core/renderers/webgl/internal/ShaderUtils.ts +283 -281
  484. package/src/core/renderers/webgl/internal/WebGlUtils.ts +35 -35
  485. package/src/core/shaders/canvas/Border.ts +132 -78
  486. package/src/core/shaders/canvas/HolePunch.ts +56 -62
  487. package/src/core/shaders/canvas/LinearGradient.ts +73 -71
  488. package/src/core/shaders/canvas/RadialGradient.ts +96 -99
  489. package/src/core/shaders/canvas/Rounded.ts +55 -55
  490. package/src/core/shaders/canvas/RoundedWithBorder.ts +122 -74
  491. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +136 -90
  492. package/src/core/shaders/canvas/RoundedWithShadow.ts +71 -70
  493. package/src/core/shaders/canvas/Shadow.ts +54 -52
  494. package/src/core/shaders/canvas/utils/render.ts +160 -151
  495. package/src/core/shaders/templates/BorderTemplate.ts +145 -115
  496. package/src/core/shaders/templates/HolePunchTemplate.ts +82 -82
  497. package/src/core/shaders/templates/LinearGradientTemplate.ts +71 -71
  498. package/src/core/shaders/templates/RadialGradientTemplate.ts +83 -81
  499. package/src/core/shaders/templates/RoundedTemplate.ts +98 -98
  500. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +38 -38
  501. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +35 -35
  502. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +35 -35
  503. package/src/core/shaders/templates/ShadowTemplate.ts +106 -106
  504. package/src/core/shaders/utils.ts +46 -46
  505. package/src/core/shaders/webgl/Border.ts +169 -116
  506. package/src/core/shaders/webgl/Default.ts +88 -89
  507. package/src/core/shaders/webgl/DefaultBatched.ts +129 -129
  508. package/src/core/shaders/webgl/HolePunch.ts +75 -75
  509. package/src/core/shaders/webgl/LinearGradient.ts +106 -82
  510. package/src/core/shaders/webgl/RadialGradient.ts +108 -85
  511. package/src/core/shaders/webgl/Rounded.ts +115 -117
  512. package/src/core/shaders/webgl/RoundedWithBorder.ts +210 -155
  513. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +234 -175
  514. package/src/core/shaders/webgl/RoundedWithShadow.ts +96 -98
  515. package/src/core/shaders/webgl/SdfShader.ts +122 -134
  516. package/src/core/shaders/webgl/Shadow.ts +121 -115
  517. package/src/core/text-rendering/CanvasFontHandler.ts +304 -0
  518. package/src/core/text-rendering/CanvasTextRenderer.ts +255 -0
  519. package/src/core/text-rendering/SdfFontHandler.ts +584 -0
  520. package/src/core/text-rendering/SdfTextRenderer.ts +403 -0
  521. package/src/core/text-rendering/TextLayoutEngine.ts +672 -0
  522. package/src/core/text-rendering/TextRenderer.ts +444 -0
  523. package/src/core/text-rendering/Utils.ts +99 -0
  524. package/src/core/text-rendering/tests/TextLayoutEngine.test.ts +453 -0
  525. package/src/core/textures/ColorTexture.ts +104 -102
  526. package/src/core/textures/ImageTexture.ts +292 -418
  527. package/src/core/textures/NoiseTexture.ts +106 -104
  528. package/src/core/textures/RenderTexture.ts +87 -85
  529. package/src/core/textures/SubTexture.ts +184 -205
  530. package/src/core/textures/Texture.ts +524 -372
  531. package/src/core/utils.ts +229 -227
  532. package/src/env.d.ts +7 -7
  533. package/src/main-api/INode.ts +100 -100
  534. package/src/main-api/Inspector.ts +1278 -569
  535. package/src/main-api/Renderer.ts +1030 -818
  536. package/src/main-api/utils.ts +45 -45
  537. package/src/utils.ts +220 -267
  538. package/COPYING +0 -1
  539. package/src/core/lib/ImageWorker.ts +0 -286
  540. package/src/core/lib/textureCompression.ts +0 -152
  541. package/src/core/lib/validateImageBitmap.ts +0 -87
  542. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +0 -220
  543. package/src/core/renderers/webgl/WebGlRenderOp.ts +0 -161
  544. package/src/core/text-rendering/TextTextureRendererUtils.ts +0 -263
  545. package/src/core/text-rendering/TrFontManager.ts +0 -183
  546. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +0 -176
  547. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +0 -139
  548. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +0 -173
  549. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +0 -171
  550. package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -187
  551. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -94
  552. package/src/core/text-rendering/font-face-types/utils.ts +0 -39
  553. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +0 -514
  554. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -863
  555. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +0 -793
  556. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +0 -48
  557. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +0 -66
  558. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +0 -52
  559. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +0 -117
  560. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +0 -133
  561. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +0 -497
  562. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +0 -49
  563. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +0 -52
  564. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +0 -205
  565. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +0 -93
  566. package/src/core/text-rendering/renderers/TextRenderer.ts +0 -567
@@ -24,6 +24,8 @@ import { Matrix3d } from './lib/Matrix3d.js';
24
24
  import { RenderCoords } from './lib/RenderCoords.js';
25
25
  import { CoreAnimation } from './animations/CoreAnimation.js';
26
26
  import { CoreAnimationController } from './animations/CoreAnimationController.js';
27
+ import { AutosizeMode, Autosizer } from './Autosizer.js';
28
+ import { bucketSortByZIndex, removeChild } from './lib/collectionUtils.js';
27
29
  export var CoreNodeRenderState;
28
30
  (function (CoreNodeRenderState) {
29
31
  CoreNodeRenderState[CoreNodeRenderState["Init"] = 0] = "Init";
@@ -31,6 +33,13 @@ export var CoreNodeRenderState;
31
33
  CoreNodeRenderState[CoreNodeRenderState["InBounds"] = 4] = "InBounds";
32
34
  CoreNodeRenderState[CoreNodeRenderState["InViewport"] = 8] = "InViewport";
33
35
  })(CoreNodeRenderState || (CoreNodeRenderState = {}));
36
+ const NO_CLIPPING_RECT = {
37
+ x: 0,
38
+ y: 0,
39
+ w: 0,
40
+ h: 0,
41
+ valid: false,
42
+ };
34
43
  const CoreNodeRenderStateMap = new Map();
35
44
  CoreNodeRenderStateMap.set(CoreNodeRenderState.Init, 'init');
36
45
  CoreNodeRenderStateMap.set(CoreNodeRenderState.OutOfBounds, 'outOfBounds');
@@ -69,21 +78,13 @@ export var UpdateType;
69
78
  */
70
79
  UpdateType[UpdateType["Clipping"] = 8] = "Clipping";
71
80
  /**
72
- * Calculated ZIndex update
73
- *
74
- * @remarks
75
- * CoreNode Properties Updated:
76
- * - `calcZIndex`
77
- */
78
- UpdateType[UpdateType["CalculatedZIndex"] = 16] = "CalculatedZIndex";
79
- /**
80
- * Z-Index Sorted Children update
81
+ * Sort Z-Index Children update
81
82
  *
82
83
  * @remarks
83
84
  * CoreNode Properties Updated:
84
85
  * - `children` (sorts children by their `calcZIndex`)
85
86
  */
86
- UpdateType[UpdateType["ZIndexSortedChildren"] = 32] = "ZIndexSortedChildren";
87
+ UpdateType[UpdateType["SortZIndexChildren"] = 16] = "SortZIndexChildren";
87
88
  /**
88
89
  * Premultiplied Colors update
89
90
  *
@@ -94,7 +95,7 @@ export var UpdateType;
94
95
  * - `premultipliedColorBl`
95
96
  * - `premultipliedColorBr`
96
97
  */
97
- UpdateType[UpdateType["PremultipliedColors"] = 64] = "PremultipliedColors";
98
+ UpdateType[UpdateType["PremultipliedColors"] = 32] = "PremultipliedColors";
98
99
  /**
99
100
  * World Alpha update
100
101
  *
@@ -102,7 +103,7 @@ export var UpdateType;
102
103
  * CoreNode Properties Updated:
103
104
  * - `worldAlpha` = `parent.worldAlpha` * `alpha`
104
105
  */
105
- UpdateType[UpdateType["WorldAlpha"] = 128] = "WorldAlpha";
106
+ UpdateType[UpdateType["WorldAlpha"] = 64] = "WorldAlpha";
106
107
  /**
107
108
  * Render State update
108
109
  *
@@ -110,7 +111,7 @@ export var UpdateType;
110
111
  * CoreNode Properties Updated:
111
112
  * - `renderState`
112
113
  */
113
- UpdateType[UpdateType["RenderState"] = 256] = "RenderState";
114
+ UpdateType[UpdateType["RenderState"] = 128] = "RenderState";
114
115
  /**
115
116
  * Is Renderable update
116
117
  *
@@ -118,23 +119,27 @@ export var UpdateType;
118
119
  * CoreNode Properties Updated:
119
120
  * - `isRenderable`
120
121
  */
121
- UpdateType[UpdateType["IsRenderable"] = 512] = "IsRenderable";
122
+ UpdateType[UpdateType["IsRenderable"] = 256] = "IsRenderable";
122
123
  /**
123
124
  * Render Texture update
124
125
  */
125
- UpdateType[UpdateType["RenderTexture"] = 1024] = "RenderTexture";
126
+ UpdateType[UpdateType["RenderTexture"] = 512] = "RenderTexture";
126
127
  /**
127
128
  * Track if parent has render texture
128
129
  */
129
- UpdateType[UpdateType["ParentRenderTexture"] = 2048] = "ParentRenderTexture";
130
+ UpdateType[UpdateType["ParentRenderTexture"] = 1024] = "ParentRenderTexture";
130
131
  /**
131
132
  * Render Bounds update
132
133
  */
133
- UpdateType[UpdateType["RenderBounds"] = 4096] = "RenderBounds";
134
+ UpdateType[UpdateType["RenderBounds"] = 2048] = "RenderBounds";
134
135
  /**
135
136
  * RecalcUniforms
136
137
  */
137
- UpdateType[UpdateType["RecalcUniforms"] = 8192] = "RecalcUniforms";
138
+ UpdateType[UpdateType["RecalcUniforms"] = 4096] = "RecalcUniforms";
139
+ /**
140
+ * Autosize update
141
+ */
142
+ UpdateType[UpdateType["Autosize"] = 8192] = "Autosize";
138
143
  /**
139
144
  * None
140
145
  */
@@ -157,8 +162,17 @@ export class CoreNode extends EventEmitter {
157
162
  children = [];
158
163
  _id = getNewId();
159
164
  props;
165
+ isCoreNode = true;
166
+ // WebGL Render Op State
167
+ renderOpBufferIdx = 0;
168
+ numQuads = 0;
169
+ renderOpTextures = [];
160
170
  hasShaderUpdater = false;
171
+ hasShaderTimeFn = false;
161
172
  hasColorProps = false;
173
+ zIndexMin = 0;
174
+ zIndexMax = 0;
175
+ previousZIndex = -1;
162
176
  updateType = UpdateType.All;
163
177
  childUpdateType = UpdateType.None;
164
178
  globalTransform;
@@ -172,12 +186,12 @@ export class CoreNode extends EventEmitter {
172
186
  clippingRect = {
173
187
  x: 0,
174
188
  y: 0,
175
- width: 0,
176
- height: 0,
189
+ w: 0,
190
+ h: 0,
177
191
  valid: false,
178
192
  };
179
193
  textureCoords;
180
- updateTextureCoords = false;
194
+ updateShaderUniforms = false;
181
195
  isRenderable = false;
182
196
  renderState = CoreNodeRenderState.Init;
183
197
  worldAlpha = 1;
@@ -193,16 +207,23 @@ export class CoreNode extends EventEmitter {
193
207
  * only used when rtt = true
194
208
  */
195
209
  framebufferDimensions = null;
210
+ /**Autosize properties */
211
+ autosizer = null;
212
+ parentAutosizer = null;
196
213
  destroyed = false;
197
214
  constructor(stage, props) {
198
215
  super();
199
216
  this.stage = stage;
200
217
  const p = (this.props = {});
218
+ // Initialize the renderOpTextures array with a capacity of 16 (typical max textures)
219
+ this.renderOpTextures = [];
220
+ //inital update type
221
+ let initialUpdateType = UpdateType.Local | UpdateType.RenderBounds | UpdateType.RenderState;
201
222
  // Fast-path assign only known keys
202
223
  p.x = props.x;
203
224
  p.y = props.y;
204
- p.width = props.width;
205
- p.height = props.height;
225
+ p.w = props.w;
226
+ p.h = props.h;
206
227
  p.alpha = props.alpha;
207
228
  p.autosize = props.autosize;
208
229
  p.clipping = props.clipping;
@@ -215,6 +236,19 @@ export class CoreNode extends EventEmitter {
215
236
  p.colorTr = props.colorTr;
216
237
  p.colorBl = props.colorBl;
217
238
  p.colorBr = props.colorBr;
239
+ //check if any color props are set for premultiplied color updates
240
+ if (props.color > 0 ||
241
+ props.colorTop > 0 ||
242
+ props.colorBottom > 0 ||
243
+ props.colorLeft > 0 ||
244
+ props.colorRight > 0 ||
245
+ props.colorTl > 0 ||
246
+ props.colorTr > 0 ||
247
+ props.colorBl > 0 ||
248
+ props.colorBr > 0) {
249
+ this.hasColorProps = true;
250
+ initialUpdateType |= UpdateType.PremultipliedColors;
251
+ }
218
252
  p.scaleX = props.scaleX;
219
253
  p.scaleY = props.scaleY;
220
254
  p.rotation = props.rotation;
@@ -224,9 +258,7 @@ export class CoreNode extends EventEmitter {
224
258
  p.mountY = props.mountY;
225
259
  p.mount = props.mount;
226
260
  p.pivot = props.pivot;
227
- p.strictBounds = props.strictBounds;
228
261
  p.zIndex = props.zIndex;
229
- p.zIndexLocked = props.zIndexLocked;
230
262
  p.textureOptions = props.textureOptions;
231
263
  p.data = props.data;
232
264
  p.imageType = props.imageType;
@@ -234,67 +266,79 @@ export class CoreNode extends EventEmitter {
234
266
  p.srcY = props.srcY;
235
267
  p.srcWidth = props.srcWidth;
236
268
  p.srcHeight = props.srcHeight;
237
- p.parent = null;
269
+ p.autosize = props.autosize;
270
+ p.parent = props.parent;
238
271
  p.texture = null;
239
272
  p.shader = null;
240
273
  p.src = null;
241
274
  p.rtt = false;
242
275
  p.boundsMargin = null;
276
+ // Only set non-default values
277
+ if (props.zIndex !== 0) {
278
+ this.zIndex = props.zIndex;
279
+ }
280
+ if (props.parent !== null) {
281
+ props.parent.addChild(this);
282
+ }
243
283
  // Assign props to instances
244
- this.parent = props.parent;
245
284
  this.texture = props.texture;
246
285
  this.shader = props.shader;
247
286
  this.src = props.src;
248
287
  this.rtt = props.rtt;
249
288
  this.boundsMargin = props.boundsMargin;
250
289
  this.interactive = props.interactive;
251
- this.setUpdateType(UpdateType.Local | UpdateType.RenderBounds | UpdateType.RenderState);
290
+ // Initialize autosize if enabled
291
+ if (p.autosize === true) {
292
+ this.autosizer = new Autosizer(this);
293
+ }
294
+ this.setUpdateType(initialUpdateType);
252
295
  // if the default texture isn't loaded yet, wait for it to load
253
296
  // this only happens when the node is created before the stage is ready
254
- const dt = this.stage.defaultTexture;
297
+ const dt = stage.defaultTexture;
255
298
  if (dt !== null && dt.state !== 'loaded') {
256
299
  dt.once('loaded', () => this.setUpdateType(UpdateType.IsRenderable));
257
300
  }
258
301
  }
259
302
  //#region Textures
260
303
  loadTexture() {
261
- const { texture } = this.props;
262
- if (!texture) {
304
+ if (this.props.texture === null) {
263
305
  return;
264
306
  }
265
307
  // If texture is already loaded / failed, trigger loaded event manually
266
308
  // so that users get a consistent event experience.
267
309
  // We do this in a microtask to allow listeners to be attached in the same
268
310
  // synchronous task after calling loadTexture()
269
- queueMicrotask(() => {
270
- if (this.textureOptions.preload === true) {
271
- this.stage.txManager.loadTexture(texture);
272
- }
273
- texture.preventCleanup =
274
- this.props.textureOptions?.preventCleanup ?? false;
275
- texture.on('loaded', this.onTextureLoaded);
276
- texture.on('failed', this.onTextureFailed);
277
- texture.on('freed', this.onTextureFreed);
278
- // If the parent is a render texture, the initial texture status
279
- // will be set to freed until the texture is processed by the
280
- // Render RTT nodes. So we only need to listen fo changes and
281
- // no need to check the texture.state until we restructure how
282
- // textures are being processed.
283
- if (this.parentHasRenderTexture) {
284
- this.notifyParentRTTOfUpdate();
285
- return;
286
- }
287
- if (texture.state === 'loaded') {
288
- this.onTextureLoaded(texture, texture.dimensions);
289
- }
290
- else if (texture.state === 'failed') {
291
- this.onTextureFailed(texture, texture.error);
292
- }
293
- else if (texture.state === 'freed') {
294
- this.onTextureFreed(texture);
295
- }
296
- });
311
+ queueMicrotask(this.loadTextureTask);
297
312
  }
313
+ /**
314
+ * Task for queueMicrotask to loadTexture
315
+ *
316
+ * @remarks
317
+ * This method is called in a microtask to release the texture.
318
+ */
319
+ loadTextureTask = () => {
320
+ const texture = this.props.texture;
321
+ //it is possible that texture is null here if user sets the texture to null right after loadTexture call
322
+ if (texture === null) {
323
+ return;
324
+ }
325
+ if (this.textureOptions.preload === true) {
326
+ this.stage.txManager.loadTexture(texture);
327
+ }
328
+ texture.preventCleanup = this.props.textureOptions?.preventCleanup ?? false;
329
+ texture.on('loaded', this.onTextureLoaded);
330
+ texture.on('failed', this.onTextureFailed);
331
+ texture.on('freed', this.onTextureFreed);
332
+ if (texture.state === 'loaded') {
333
+ this.onTextureLoaded(texture, texture.dimensions);
334
+ }
335
+ else if (texture.state === 'failed') {
336
+ this.onTextureFailed(texture, texture.error);
337
+ }
338
+ else if (texture.state === 'freed') {
339
+ this.onTextureFreed(texture);
340
+ }
341
+ };
298
342
  unloadTexture() {
299
343
  if (this.texture === null) {
300
344
  return;
@@ -303,16 +347,12 @@ export class CoreNode extends EventEmitter {
303
347
  texture.off('loaded', this.onTextureLoaded);
304
348
  texture.off('failed', this.onTextureFailed);
305
349
  texture.off('freed', this.onTextureFreed);
306
- texture.setRenderableOwner(this, false);
307
- }
308
- autosizeNode(dimensions) {
309
- if (this.autosize) {
310
- this.width = dimensions.width;
311
- this.height = dimensions.height;
312
- }
350
+ texture.setRenderableOwner(this._id, false);
313
351
  }
314
352
  onTextureLoaded = (_, dimensions) => {
315
- this.autosizeNode(dimensions);
353
+ if (this.autosizer !== null) {
354
+ this.autosizer.update();
355
+ }
316
356
  this.setUpdateType(UpdateType.IsRenderable);
317
357
  // Texture was loaded. In case the RAF loop has already stopped, we request
318
358
  // a render to ensure the texture is rendered.
@@ -322,29 +362,44 @@ export class CoreNode extends EventEmitter {
322
362
  this.notifyParentRTTOfUpdate();
323
363
  }
324
364
  // ignore 1x1 pixel textures
325
- if (dimensions.width > 1 && dimensions.height > 1) {
365
+ if (dimensions.w > 1 && dimensions.h > 1) {
326
366
  this.emit('loaded', {
327
367
  type: 'texture',
328
368
  dimensions,
329
369
  });
330
370
  }
371
+ if (this.stage.calculateTextureCoord === true &&
372
+ this.props.textureOptions !== null) {
373
+ this.textureCoords = this.stage.renderer.getTextureCoords(this);
374
+ }
331
375
  // Trigger a local update if the texture is loaded and the resizeMode is 'contain'
332
376
  if (this.props.textureOptions?.resizeMode?.type === 'contain') {
333
377
  this.setUpdateType(UpdateType.Local);
334
378
  }
335
379
  };
336
380
  onTextureFailed = (_, error) => {
381
+ // immediately set isRenderable to false, so that we handle the error
382
+ // without waiting for the next frame loop
383
+ this.isRenderable = false;
384
+ this.updateTextureOwnership(false);
337
385
  this.setUpdateType(UpdateType.IsRenderable);
338
386
  // If parent has a render texture, flag that we need to update
339
387
  if (this.parentHasRenderTexture) {
340
388
  this.notifyParentRTTOfUpdate();
341
389
  }
342
- this.emit('failed', {
343
- type: 'texture',
344
- error,
345
- });
390
+ if (this.texture !== null &&
391
+ this.texture.retryCount > this.texture.maxRetryCount) {
392
+ this.emit('failed', {
393
+ type: 'texture',
394
+ error,
395
+ });
396
+ }
346
397
  };
347
398
  onTextureFreed = () => {
399
+ // immediately set isRenderable to false, so that we handle the error
400
+ // without waiting for the next frame loop
401
+ this.isRenderable = false;
402
+ this.updateTextureOwnership(false);
348
403
  this.setUpdateType(UpdateType.IsRenderable);
349
404
  // If parent has a render texture, flag that we need to update
350
405
  if (this.parentHasRenderTexture) {
@@ -370,20 +425,17 @@ export class CoreNode extends EventEmitter {
370
425
  return;
371
426
  parent.setUpdateType(UpdateType.Children);
372
427
  }
373
- sortChildren() {
374
- this.children.sort((a, b) => a.calcZIndex - b.calcZIndex);
375
- }
376
428
  updateLocalTransform() {
377
429
  const p = this.props;
378
- const { x, y, width, height } = p;
379
- const mountTranslateX = p.mountX * width;
380
- const mountTranslateY = p.mountY * height;
430
+ const { x, y, w, h } = p;
431
+ const mountTranslateX = p.mountX * w;
432
+ const mountTranslateY = p.mountY * h;
381
433
  if (p.rotation !== 0 || p.scaleX !== 1 || p.scaleY !== 1) {
382
- const pivotTranslateX = p.pivotX * width;
383
- const pivotTranslateY = p.pivotY * height;
434
+ const scaleRotate = Matrix3d.rotate(p.rotation).scale(p.scaleX, p.scaleY);
435
+ const pivotTranslateX = p.pivotX * w;
436
+ const pivotTranslateY = p.pivotY * h;
384
437
  this.localTransform = Matrix3d.translate(x - mountTranslateX + pivotTranslateX, y - mountTranslateY + pivotTranslateY, this.localTransform)
385
- .rotate(p.rotation)
386
- .scale(p.scaleX, p.scaleY)
438
+ .multiply(scaleRotate)
387
439
  .translate(-pivotTranslateX, -pivotTranslateY);
388
440
  }
389
441
  else {
@@ -398,26 +450,26 @@ export class CoreNode extends EventEmitter {
398
450
  let resizeModeScaleY = 1;
399
451
  let extraX = 0;
400
452
  let extraY = 0;
401
- const { width: tw, height: th } = texture.dimensions;
453
+ const { w: tw, h: th } = texture.dimensions;
402
454
  const txAspectRatio = tw / th;
403
- const nodeAspectRatio = width / height;
455
+ const nodeAspectRatio = w / h;
404
456
  if (txAspectRatio > nodeAspectRatio) {
405
457
  // Texture is wider than node
406
458
  // Center the node vertically (shift down by extraY)
407
459
  // Scale the node vertically to maintain original aspect ratio
408
- const scaleX = width / tw;
460
+ const scaleX = w / tw;
409
461
  const scaledTxHeight = th * scaleX;
410
- extraY = (height - scaledTxHeight) / 2;
411
- resizeModeScaleY = scaledTxHeight / height;
462
+ extraY = (h - scaledTxHeight) / 2;
463
+ resizeModeScaleY = scaledTxHeight / h;
412
464
  }
413
465
  else {
414
466
  // Texture is taller than node (or equal)
415
467
  // Center the node horizontally (shift right by extraX)
416
468
  // Scale the node horizontally to maintain original aspect ratio
417
- const scaleY = height / th;
469
+ const scaleY = h / th;
418
470
  const scaledTxWidth = tw * scaleY;
419
- extraX = (width - scaledTxWidth) / 2;
420
- resizeModeScaleX = scaledTxWidth / width;
471
+ extraX = (w - scaledTxWidth) / 2;
472
+ resizeModeScaleX = scaledTxWidth / w;
421
473
  }
422
474
  // Apply the extra translation and scale to the local transform
423
475
  this.localTransform
@@ -430,17 +482,21 @@ export class CoreNode extends EventEmitter {
430
482
  * @param delta
431
483
  */
432
484
  update(delta, parentClippingRect) {
433
- if (this.updateType === UpdateType.None) {
434
- return;
435
- }
436
485
  const props = this.props;
437
486
  const parent = props.parent;
438
487
  const parentHasRenderTexture = this.parentHasRenderTexture;
439
488
  const hasParent = props.parent !== null;
440
- let renderState = null;
489
+ let newRenderState = null;
441
490
  let updateType = this.updateType;
442
491
  let childUpdateType = this.childUpdateType;
443
492
  let updateParent = false;
493
+ //this needs to be handled before setting updateTypes are reset
494
+ if (updateType & UpdateType.Autosize && this.autosizer !== null) {
495
+ this.autosizer.update();
496
+ }
497
+ // reset update type
498
+ this.updateType = 0;
499
+ this.childUpdateType = 0;
444
500
  if (updateType & UpdateType.Local) {
445
501
  this.updateLocalTransform();
446
502
  updateType |= UpdateType.Global;
@@ -474,12 +530,13 @@ export class CoreNode extends EventEmitter {
474
530
  }
475
531
  this.calculateRenderCoords();
476
532
  this.updateBoundingRect();
477
- updateType |=
478
- UpdateType.RenderState |
479
- UpdateType.Children |
480
- UpdateType.RecalcUniforms;
533
+ updateType |= UpdateType.RenderState | UpdateType.RecalcUniforms;
481
534
  updateParent = hasParent;
482
- childUpdateType |= UpdateType.Global;
535
+ //only propagate children updates if not autosizing
536
+ if ((updateType & UpdateType.Autosize) === 0) {
537
+ updateType |= UpdateType.Children;
538
+ childUpdateType |= UpdateType.Global;
539
+ }
483
540
  if (this.clipping === true) {
484
541
  updateType |= UpdateType.Clipping | UpdateType.RenderBounds;
485
542
  updateParent = hasParent;
@@ -493,18 +550,18 @@ export class CoreNode extends EventEmitter {
493
550
  childUpdateType |= UpdateType.RenderBounds;
494
551
  }
495
552
  if (updateType & UpdateType.RenderState) {
496
- renderState = this.checkRenderBounds();
553
+ newRenderState = this.checkRenderBounds();
497
554
  updateType |= UpdateType.IsRenderable;
498
555
  updateParent = hasParent;
499
556
  // if we're not going out of bounds, update the render state
500
557
  // this is done so the update loop can finish before we mark a node
501
558
  // as out of bounds
502
- if (renderState !== CoreNodeRenderState.OutOfBounds) {
503
- this.updateRenderState(renderState);
559
+ if (newRenderState !== CoreNodeRenderState.OutOfBounds) {
560
+ this.updateRenderState(newRenderState);
504
561
  }
505
562
  }
506
563
  if (updateType & UpdateType.WorldAlpha) {
507
- this.worldAlpha = ((parent && parent.worldAlpha) || 1) * props.alpha;
564
+ this.worldAlpha = (parent?.worldAlpha ?? 1) * this.props.alpha;
508
565
  updateType |=
509
566
  UpdateType.PremultipliedColors |
510
567
  UpdateType.Children |
@@ -515,6 +572,12 @@ export class CoreNode extends EventEmitter {
515
572
  if (updateType & UpdateType.IsRenderable) {
516
573
  this.updateIsRenderable();
517
574
  }
575
+ // Handle autosize updates when children transforms change
576
+ if (updateType & UpdateType.Global &&
577
+ this.isRenderable === true &&
578
+ this.parentAutosizer !== null) {
579
+ this.parentAutosizer.patch(this.id);
580
+ }
518
581
  if (updateType & UpdateType.Clipping) {
519
582
  this.calculateClippingRect(parentClippingRect);
520
583
  updateType |= UpdateType.Children;
@@ -531,7 +594,7 @@ export class CoreNode extends EventEmitter {
531
594
  const same = tl === tr && tl === bl && tl === br;
532
595
  const merged = mergeColorAlphaPremultiplied(tl, alpha, true);
533
596
  this.premultipliedColorTl = merged;
534
- if (same) {
597
+ if (same === true) {
535
598
  this.premultipliedColorTr =
536
599
  this.premultipliedColorBl =
537
600
  this.premultipliedColorBr =
@@ -543,42 +606,37 @@ export class CoreNode extends EventEmitter {
543
606
  this.premultipliedColorBr = mergeColorAlphaPremultiplied(br, alpha, true);
544
607
  }
545
608
  }
609
+ if (this.renderState === CoreNodeRenderState.OutOfBounds) {
610
+ // Delay updating children until the node is in bounds
611
+ this.updateType = updateType;
612
+ this.childUpdateType = childUpdateType;
613
+ return;
614
+ }
546
615
  if (updateParent === true) {
547
616
  parent.setUpdateType(UpdateType.Children);
548
617
  }
549
- // No need to update zIndex if there is no parent
550
- if (updateType & UpdateType.CalculatedZIndex && parent !== null) {
551
- this.calculateZIndex();
552
- // Tell parent to re-sort children
553
- parent.setUpdateType(UpdateType.ZIndexSortedChildren);
554
- }
555
- if (props.strictBounds === true &&
556
- this.renderState === CoreNodeRenderState.OutOfBounds) {
557
- updateType &= ~UpdateType.RenderBounds; // remove render bounds update
558
- return;
559
- }
560
618
  if (updateType & UpdateType.RecalcUniforms &&
561
619
  this.hasShaderUpdater === true) {
620
+ this.updateShaderUniforms = true;
621
+ }
622
+ if (this.isRenderable === true && this.updateShaderUniforms === true) {
623
+ this.updateShaderUniforms = false;
562
624
  //this exists because the boolean hasShaderUpdater === true
563
625
  this.shader.update();
564
626
  }
565
627
  if (updateType & UpdateType.Children && this.children.length > 0) {
628
+ let childClippingRect = this.clippingRect;
629
+ if (this.rtt === true) {
630
+ childClippingRect = NO_CLIPPING_RECT;
631
+ }
566
632
  for (let i = 0, length = this.children.length; i < length; i++) {
567
633
  const child = this.children[i];
568
- child.setUpdateType(childUpdateType);
634
+ if (childUpdateType !== 0) {
635
+ child.setUpdateType(childUpdateType);
636
+ }
569
637
  if (child.updateType === 0) {
570
638
  continue;
571
639
  }
572
- let childClippingRect = this.clippingRect;
573
- if (this.rtt === true) {
574
- childClippingRect = {
575
- x: 0,
576
- y: 0,
577
- width: 0,
578
- height: 0,
579
- valid: false,
580
- };
581
- }
582
640
  child.update(delta, childClippingRect);
583
641
  }
584
642
  }
@@ -588,32 +646,24 @@ export class CoreNode extends EventEmitter {
588
646
  if (parentHasRenderTexture === true) {
589
647
  this.notifyParentRTTOfUpdate();
590
648
  }
591
- // Sorting children MUST happen after children have been updated so
592
- // that they have the oppotunity to update their calculated zIndex.
593
- if (updateType & UpdateType.ZIndexSortedChildren) {
649
+ //Resort children if needed
650
+ if (updateType & UpdateType.SortZIndexChildren) {
594
651
  // reorder z-index
595
652
  this.sortChildren();
596
653
  }
597
- if (this.updateTextureCoords === true) {
598
- this.updateTextureCoords = false;
599
- this.textureCoords = this.stage.renderer.getTextureCoords(this);
600
- }
601
654
  // If we're out of bounds, apply the render state now
602
655
  // this is done so nodes can finish their entire update loop before
603
656
  // being marked as out of bounds
604
- if (renderState === CoreNodeRenderState.OutOfBounds) {
605
- this.updateRenderState(renderState);
657
+ if (newRenderState === CoreNodeRenderState.OutOfBounds) {
658
+ this.updateRenderState(newRenderState);
606
659
  this.updateIsRenderable();
607
660
  if (this.rtt === true &&
608
- renderState === CoreNodeRenderState.OutOfBounds) {
661
+ newRenderState === CoreNodeRenderState.OutOfBounds) {
609
662
  // notify children that we are going out of bounds
610
663
  // we have to do this now before we stop processing the render tree
611
- this.notifyChildrenRTTOfUpdate(renderState);
664
+ this.notifyChildrenRTTOfUpdate(newRenderState);
612
665
  }
613
666
  }
614
- // reset update type
615
- this.updateType = 0;
616
- this.childUpdateType = 0;
617
667
  }
618
668
  findParentRTTNode() {
619
669
  let rttNode = this.parent;
@@ -658,15 +708,16 @@ export class CoreNode extends EventEmitter {
658
708
  return CoreNodeRenderState.InViewport;
659
709
  }
660
710
  // check if we dont have dimensions, take our parent's render state
661
- if (this.parent !== null &&
662
- (this.props.width === 0 || this.props.height === 0)) {
711
+ if (this.parent !== null && (this.props.w === 0 || this.props.h === 0)) {
663
712
  return this.parent.renderState;
664
713
  }
665
714
  return CoreNodeRenderState.OutOfBounds;
666
715
  }
667
716
  updateBoundingRect() {
668
- const transform = (this.sceneGlobalTransform || this.globalTransform);
669
- const renderCoords = (this.sceneRenderCoords || this.renderCoords);
717
+ const transform = (this.sceneGlobalTransform ||
718
+ this.globalTransform);
719
+ const renderCoords = (this.sceneRenderCoords ||
720
+ this.renderCoords);
670
721
  if (transform.tb === 0 || transform.tc === 0) {
671
722
  this.renderBound = createBound(renderCoords.x1, renderCoords.y1, renderCoords.x3, renderCoords.y3, this.renderBound);
672
723
  }
@@ -701,13 +752,13 @@ export class CoreNode extends EventEmitter {
701
752
  return;
702
753
  }
703
754
  // clipping is enabled and we are in bounds create our own bounds
704
- const { x, y, width, height } = this.props;
755
+ const { x, y, w, h } = this.props;
705
756
  // Pick the global transform if available, otherwise use the local transform
706
757
  // global transform is only available if the node in an RTT chain
707
758
  const { tx, ty } = this.sceneGlobalTransform || this.globalTransform || {};
708
759
  const _x = tx ?? x;
709
760
  const _y = ty ?? y;
710
- this.strictBound = createBound(_x, _y, _x + width, _y + height, this.strictBound);
761
+ this.strictBound = createBound(_x, _y, _x + w, _y + h, this.strictBound);
711
762
  this.preloadBound = createPreloadBounds(this.strictBound, this.boundsMargin);
712
763
  }
713
764
  updateRenderState(renderState) {
@@ -723,6 +774,17 @@ export class CoreNode extends EventEmitter {
723
774
  current: renderState,
724
775
  });
725
776
  }
777
+ /**
778
+ * Checks if the node is renderable based on world alpha, dimensions and out of bounds status.
779
+ */
780
+ checkBasicRenderability() {
781
+ if (this.worldAlpha === 0 || this.isOutOfBounds() === true) {
782
+ return false;
783
+ }
784
+ else {
785
+ return true;
786
+ }
787
+ }
726
788
  /**
727
789
  * Updates the `isRenderable` property based on various conditions.
728
790
  */
@@ -730,13 +792,20 @@ export class CoreNode extends EventEmitter {
730
792
  let newIsRenderable = false;
731
793
  let needsTextureOwnership = false;
732
794
  // If the node is out of bounds or has an alpha of 0, it is not renderable
733
- if (this.worldAlpha === 0 ||
734
- this.renderState <= CoreNodeRenderState.OutOfBounds) {
795
+ if (this.checkBasicRenderability() === false) {
735
796
  this.updateTextureOwnership(false);
736
797
  this.setRenderable(false);
737
798
  return;
738
799
  }
739
800
  if (this.texture !== null) {
801
+ // preemptive check for failed textures this will mark the current node as non-renderable
802
+ // and will prevent further checks until the texture is reloaded or retry is reset on the texture
803
+ if (this.texture.retryCount > this.texture.maxRetryCount) {
804
+ // texture has failed to load, we cannot render
805
+ this.updateTextureOwnership(false);
806
+ this.setRenderable(false);
807
+ return;
808
+ }
740
809
  needsTextureOwnership = true;
741
810
  // we're only renderable if the texture state is loaded
742
811
  newIsRenderable = this.texture.state === 'loaded';
@@ -745,7 +814,7 @@ export class CoreNode extends EventEmitter {
745
814
  // check shader
746
815
  (this.props.shader !== null || this.hasColorProps === true) &&
747
816
  // check dimensions
748
- (this.props.width !== 0 && this.props.height !== 0) === true) {
817
+ this.hasDimensions() === true) {
749
818
  // This mean we have dimensions and a color set, so we can render a ColorTexture
750
819
  if (this.stage.defaultTexture &&
751
820
  this.stage.defaultTexture.state === 'loaded') {
@@ -760,28 +829,43 @@ export class CoreNode extends EventEmitter {
760
829
  * @param isRenderable - The new renderable state
761
830
  */
762
831
  setRenderable(isRenderable) {
832
+ const previousIsRenderable = this.isRenderable;
763
833
  this.isRenderable = isRenderable;
764
- if (isRenderable === true &&
765
- this.stage.calculateTextureCoord === true &&
766
- this.textureCoords === undefined) {
767
- this.updateTextureCoords = true;
834
+ // Emit event if renderable status has changed
835
+ if (previousIsRenderable !== isRenderable) {
836
+ this.emit('renderable', {
837
+ type: 'renderable',
838
+ isRenderable,
839
+ });
768
840
  }
769
841
  }
770
842
  /**
771
843
  * Changes the renderable state of the node.
772
844
  */
773
845
  updateTextureOwnership(isRenderable) {
774
- this.texture?.setRenderableOwner(this, isRenderable);
846
+ this.texture?.setRenderableOwner(this._id, isRenderable);
847
+ }
848
+ /**
849
+ * Checks if the node is out of the viewport bounds.
850
+ */
851
+ isOutOfBounds() {
852
+ return this.renderState <= CoreNodeRenderState.OutOfBounds;
853
+ }
854
+ /**
855
+ * Checks if the node has dimensions (width/height)
856
+ */
857
+ hasDimensions() {
858
+ return this.props.w !== 0 && this.props.h !== 0;
775
859
  }
776
860
  calculateRenderCoords() {
777
- const { width, height } = this;
861
+ const { w, h } = this.props;
778
862
  const g = this.globalTransform;
779
863
  const tx = g.tx, ty = g.ty, ta = g.ta, tb = g.tb, tc = g.tc, td = g.td;
780
864
  if (tb === 0 && tc === 0) {
781
865
  const minX = tx;
782
- const maxX = tx + width * ta;
866
+ const maxX = tx + w * ta;
783
867
  const minY = ty;
784
- const maxY = ty + height * td;
868
+ const maxY = ty + h * td;
785
869
  this.renderCoords = RenderCoords.translate(
786
870
  //top-left
787
871
  minX, minY,
@@ -797,11 +881,11 @@ export class CoreNode extends EventEmitter {
797
881
  //top-left
798
882
  tx, ty,
799
883
  //top-right
800
- tx + width * ta, ty + width * tc,
884
+ tx + w * ta, ty + w * tc,
801
885
  //bottom-right
802
- tx + width * ta + height * tb, ty + width * tc + height * td,
886
+ tx + w * ta + h * tb, ty + w * tc + h * td,
803
887
  //bottom-left
804
- tx + height * tb, ty + height * td, this.renderCoords);
888
+ tx + h * tb, ty + h * td, this.renderCoords);
805
889
  }
806
890
  if (this.sceneGlobalTransform === undefined) {
807
891
  return;
@@ -809,9 +893,9 @@ export class CoreNode extends EventEmitter {
809
893
  const { tx: stx, ty: sty, ta: sta, tb: stb, tc: stc, td: std, } = this.sceneGlobalTransform;
810
894
  if (stb === 0 && stc === 0) {
811
895
  const minX = stx;
812
- const maxX = stx + width * sta;
896
+ const maxX = stx + w * sta;
813
897
  const minY = sty;
814
- const maxY = sty + height * std;
898
+ const maxY = sty + h * std;
815
899
  this.sceneRenderCoords = RenderCoords.translate(
816
900
  //top-left
817
901
  minX, minY,
@@ -827,11 +911,11 @@ export class CoreNode extends EventEmitter {
827
911
  //top-left
828
912
  stx, sty,
829
913
  //top-right
830
- stx + width * sta, sty + width * stc,
914
+ stx + w * sta, sty + w * stc,
831
915
  //bottom-right
832
- stx + width * sta + height * stb, sty + width * stc + height * std,
916
+ stx + w * sta + h * stb, sty + w * stc + h * std,
833
917
  //bottom-left
834
- stx + height * stb, sty + height * std, this.sceneRenderCoords);
918
+ stx + h * stb, sty + h * std, this.sceneRenderCoords);
835
919
  }
836
920
  }
837
921
  /**
@@ -849,8 +933,8 @@ export class CoreNode extends EventEmitter {
849
933
  if (clipping === true && isRotated === false) {
850
934
  clippingRect.x = gt.tx;
851
935
  clippingRect.y = gt.ty;
852
- clippingRect.width = this.width * gt.ta;
853
- clippingRect.height = this.height * gt.td;
936
+ clippingRect.w = this.props.w * gt.ta;
937
+ clippingRect.h = this.props.h * gt.td;
854
938
  clippingRect.valid = true;
855
939
  }
856
940
  else {
@@ -866,16 +950,6 @@ export class CoreNode extends EventEmitter {
866
950
  clippingRect.valid = true;
867
951
  }
868
952
  }
869
- calculateZIndex() {
870
- const props = this.props;
871
- const z = props.zIndex || 0;
872
- const p = props.parent?.zIndex || 0;
873
- let zIndex = z;
874
- if (props.parent?.zIndexLocked) {
875
- zIndex = z < p ? z : p;
876
- }
877
- this.calcZIndex = zIndex;
878
- }
879
953
  /**
880
954
  * Destroy the node and cleanup all resources
881
955
  */
@@ -887,21 +961,23 @@ export class CoreNode extends EventEmitter {
887
961
  this.destroyed = true;
888
962
  this.unloadTexture();
889
963
  this.isRenderable = false;
964
+ if (this.hasShaderTimeFn === true) {
965
+ this.stage.untrackTimedNode(this);
966
+ }
890
967
  // Kill children
891
968
  while (this.children.length > 0) {
892
969
  this.children[0].destroy();
893
970
  }
894
971
  const parent = this.parent;
895
972
  if (parent !== null) {
896
- const index = parent.children.indexOf(this);
897
- parent.children.splice(index, 1);
898
- parent.setUpdateType(UpdateType.Children | UpdateType.ZIndexSortedChildren);
973
+ parent.removeChild(this);
899
974
  }
900
975
  this.props.parent = null;
901
976
  this.props.texture = null;
902
977
  if (this.rtt === true) {
903
978
  this.stage.renderer.removeRTTNode(this);
904
979
  }
980
+ this.stage.requestRender();
905
981
  }
906
982
  renderQuads(renderer) {
907
983
  if (this.parentHasRenderTexture === true) {
@@ -909,37 +985,134 @@ export class CoreNode extends EventEmitter {
909
985
  if (rtt === false || this.parentRenderTexture !== renderer.activeRttNode)
910
986
  return;
911
987
  }
912
- const p = this.props;
913
- const t = this.globalTransform;
914
- const coords = this.renderCoords;
915
- const texture = p.texture || this.stage.defaultTexture;
916
- renderer.addQuad({
917
- width: p.width,
918
- height: p.height,
919
- colorTl: this.premultipliedColorTl,
920
- colorTr: this.premultipliedColorTr,
921
- colorBl: this.premultipliedColorBl,
922
- colorBr: this.premultipliedColorBr,
923
- texture,
924
- textureOptions: p.textureOptions,
925
- textureCoords: this.textureCoords,
926
- shader: p.shader,
927
- alpha: this.worldAlpha,
928
- clippingRect: this.clippingRect,
929
- tx: t.tx,
930
- ty: t.ty,
931
- ta: t.ta,
932
- tb: t.tb,
933
- tc: t.tc,
934
- td: t.td,
935
- renderCoords: coords,
936
- rtt: p.rtt,
937
- zIndex: this.calcZIndex,
938
- parentHasRenderTexture: this.parentHasRenderTexture,
939
- framebufferDimensions: this.parentHasRenderTexture
940
- ? this.parentFramebufferDimensions
941
- : null,
942
- });
988
+ const texture = this.props.texture || this.stage.defaultTexture;
989
+ // There is a race condition where the texture can be null
990
+ // with RTT nodes. Adding this defensively to avoid errors.
991
+ // Also check if we have a valid texture or default texture to render
992
+ if (!texture || texture.state !== 'loaded') {
993
+ return;
994
+ }
995
+ renderer.addQuad(this);
996
+ }
997
+ get quadBufferCollection() {
998
+ return this.stage.renderer.quadBufferCollection;
999
+ }
1000
+ get time() {
1001
+ if (this.hasShaderTimeFn === true) {
1002
+ return this.getTimerValue();
1003
+ }
1004
+ return 0;
1005
+ }
1006
+ getTimerValue() {
1007
+ if (typeof this.shader.time === 'function') {
1008
+ return this.shader.time(this.stage);
1009
+ }
1010
+ return this.stage.elapsedTime;
1011
+ }
1012
+ sortChildren() {
1013
+ const children = this.children;
1014
+ const n = children.length;
1015
+ if (n === 0) {
1016
+ this.zIndexMin = 0;
1017
+ this.zIndexMax = 0;
1018
+ return;
1019
+ }
1020
+ let firstZIndex = children[0].props.zIndex;
1021
+ let min = firstZIndex;
1022
+ let max = firstZIndex;
1023
+ let prevZIndex = firstZIndex;
1024
+ let isSorted = true;
1025
+ for (let i = 1; i < n; i++) {
1026
+ const zIndex = children[i].props.zIndex;
1027
+ if (zIndex < min) {
1028
+ min = zIndex;
1029
+ }
1030
+ else if (zIndex > max) {
1031
+ max = zIndex;
1032
+ }
1033
+ if (prevZIndex > zIndex) {
1034
+ isSorted = false;
1035
+ }
1036
+ prevZIndex = zIndex;
1037
+ }
1038
+ // update min and max zIndex
1039
+ this.zIndexMin = min;
1040
+ this.zIndexMax = max;
1041
+ // if min and max are the same, no need to sort
1042
+ if (min === max || isSorted === true) {
1043
+ return;
1044
+ }
1045
+ bucketSortByZIndex(children, min);
1046
+ }
1047
+ removeChild(node, targetParent = null) {
1048
+ if (targetParent === null) {
1049
+ if (this.props.rtt === true && this.parentHasRenderTexture === true) {
1050
+ node.clearRTTInheritance();
1051
+ }
1052
+ const autosizeTarget = this.autosizer || this.parentAutosizer;
1053
+ if (autosizeTarget !== null) {
1054
+ autosizeTarget.detach(node);
1055
+ }
1056
+ }
1057
+ const children = this.children;
1058
+ removeChild(node, children);
1059
+ if (children.length === 0) {
1060
+ this.zIndexMin = 0;
1061
+ this.zIndexMax = 0;
1062
+ return;
1063
+ }
1064
+ const removedZIndex = node.zIndex;
1065
+ if (removedZIndex === this.zIndexMin || removedZIndex === this.zIndexMax) {
1066
+ this.setUpdateType(UpdateType.SortZIndexChildren);
1067
+ }
1068
+ }
1069
+ addChild(node, previousParent = null) {
1070
+ const inRttCluster = this.props.rtt === true || this.parentHasRenderTexture === true;
1071
+ const children = this.children;
1072
+ const zIndex = node.zIndex;
1073
+ const autosizeTarget = this.autosizer || this.parentAutosizer;
1074
+ let attachToAutosizer = autosizeTarget !== null;
1075
+ node.parentHasRenderTexture = inRttCluster;
1076
+ if (previousParent !== null) {
1077
+ const previousParentInRttCluster = previousParent.props.rtt === true ||
1078
+ previousParent.parentHasRenderTexture === true;
1079
+ if (inRttCluster === false && previousParentInRttCluster === true) {
1080
+ // update child RTT status
1081
+ node.clearRTTInheritance();
1082
+ }
1083
+ const previousAutosizer = node.autosizer || node.parentAutosizer;
1084
+ if (previousAutosizer !== null) {
1085
+ if (autosizeTarget === null ||
1086
+ previousAutosizer.id !== autosizeTarget.id) {
1087
+ previousAutosizer.detach(node);
1088
+ }
1089
+ attachToAutosizer = false;
1090
+ }
1091
+ }
1092
+ if (attachToAutosizer === true) {
1093
+ //if this is true, then the autosizer really exists
1094
+ autosizeTarget.attach(node);
1095
+ }
1096
+ if (inRttCluster === true) {
1097
+ node.markChildrenWithRTT(this);
1098
+ }
1099
+ children.push(node);
1100
+ if (children.length === 1) {
1101
+ this.zIndexMin = zIndex;
1102
+ this.zIndexMax = zIndex;
1103
+ }
1104
+ else {
1105
+ if (zIndex < this.zIndexMin) {
1106
+ this.zIndexMin = zIndex;
1107
+ }
1108
+ if (zIndex > this.zIndexMax) {
1109
+ this.zIndexMax = zIndex;
1110
+ }
1111
+ }
1112
+ if (this.zIndexMax !== this.zIndexMin) {
1113
+ this.setUpdateType(UpdateType.SortZIndexChildren);
1114
+ }
1115
+ this.setUpdateType(UpdateType.Children);
943
1116
  }
944
1117
  //#region Properties
945
1118
  get id() {
@@ -962,12 +1135,12 @@ export class CoreNode extends EventEmitter {
962
1135
  }
963
1136
  get absX() {
964
1137
  return (this.props.x +
965
- -this.props.width * this.props.mountX +
1138
+ -this.props.w * this.props.mountX +
966
1139
  (this.props.parent?.absX || this.props.parent?.globalTransform?.tx || 0));
967
1140
  }
968
1141
  get absY() {
969
1142
  return (this.props.y +
970
- -this.props.height * this.props.mountY +
1143
+ -this.props.h * this.props.mountY +
971
1144
  (this.props.parent?.absY ?? 0));
972
1145
  }
973
1146
  get y() {
@@ -979,34 +1152,46 @@ export class CoreNode extends EventEmitter {
979
1152
  this.setUpdateType(UpdateType.Local);
980
1153
  }
981
1154
  }
982
- get width() {
983
- return this.props.width;
1155
+ get w() {
1156
+ return this.props.w;
984
1157
  }
985
- set width(value) {
986
- if (this.props.width !== value) {
987
- this.textureCoords = undefined;
988
- this.props.width = value;
989
- this.setUpdateType(UpdateType.Local);
990
- if (this.props.rtt === true) {
991
- this.framebufferDimensions.width = value;
1158
+ set w(value) {
1159
+ const props = this.props;
1160
+ if (props.w !== value) {
1161
+ props.w = value;
1162
+ let updateType = UpdateType.Local;
1163
+ if (props.texture !== null &&
1164
+ this.stage.calculateTextureCoord === true &&
1165
+ props.textureOptions !== null) {
1166
+ this.textureCoords = this.stage.renderer.getTextureCoords(this);
1167
+ }
1168
+ if (props.rtt === true) {
1169
+ this.framebufferDimensions.w = value;
992
1170
  this.texture = this.stage.txManager.createTexture('RenderTexture', this.framebufferDimensions);
993
- this.setUpdateType(UpdateType.RenderTexture);
1171
+ updateType |= UpdateType.RenderTexture;
994
1172
  }
1173
+ this.setUpdateType(updateType);
995
1174
  }
996
1175
  }
997
- get height() {
998
- return this.props.height;
1176
+ get h() {
1177
+ return this.props.h;
999
1178
  }
1000
- set height(value) {
1001
- if (this.props.height !== value) {
1002
- this.textureCoords = undefined;
1003
- this.props.height = value;
1004
- this.setUpdateType(UpdateType.Local);
1005
- if (this.props.rtt === true) {
1006
- this.framebufferDimensions.height = value;
1179
+ set h(value) {
1180
+ const props = this.props;
1181
+ if (props.h !== value) {
1182
+ props.h = value;
1183
+ let updateType = UpdateType.Local;
1184
+ if (props.texture !== null &&
1185
+ this.stage.calculateTextureCoord === true &&
1186
+ props.textureOptions !== null) {
1187
+ this.textureCoords = this.stage.renderer.getTextureCoords(this);
1188
+ }
1189
+ if (props.rtt === true) {
1190
+ this.framebufferDimensions.h = value;
1007
1191
  this.texture = this.stage.txManager.createTexture('RenderTexture', this.framebufferDimensions);
1008
- this.setUpdateType(UpdateType.RenderTexture);
1192
+ updateType |= UpdateType.RenderTexture;
1009
1193
  }
1194
+ this.setUpdateType(updateType);
1010
1195
  }
1011
1196
  }
1012
1197
  get scale() {
@@ -1120,7 +1305,16 @@ export class CoreNode extends EventEmitter {
1120
1305
  return this.props.autosize;
1121
1306
  }
1122
1307
  set autosize(value) {
1308
+ if (this.props.autosize === value) {
1309
+ return;
1310
+ }
1123
1311
  this.props.autosize = value;
1312
+ if (value === true && this.autosizer === null) {
1313
+ this.autosizer = new Autosizer(this);
1314
+ }
1315
+ else {
1316
+ this.autosizer = null;
1317
+ }
1124
1318
  }
1125
1319
  get boundsMargin() {
1126
1320
  const props = this.props;
@@ -1259,26 +1453,34 @@ export class CoreNode extends EventEmitter {
1259
1453
  this.hasColorProps = value > 0;
1260
1454
  this.setUpdateType(UpdateType.PremultipliedColors);
1261
1455
  }
1262
- // we're only interested in parent zIndex to test
1263
- // if we should use node zIndex is higher then parent zIndex
1264
- get zIndexLocked() {
1265
- return this.props.zIndexLocked || 0;
1266
- }
1267
- set zIndexLocked(value) {
1268
- this.props.zIndexLocked = value;
1269
- this.setUpdateType(UpdateType.CalculatedZIndex | UpdateType.Children);
1270
- for (let i = 0, length = this.children.length; i < length; i++) {
1271
- this.children[i].setUpdateType(UpdateType.CalculatedZIndex);
1272
- }
1273
- }
1274
1456
  get zIndex() {
1275
1457
  return this.props.zIndex;
1276
1458
  }
1277
1459
  set zIndex(value) {
1278
- this.props.zIndex = value;
1279
- this.setUpdateType(UpdateType.CalculatedZIndex | UpdateType.Children);
1280
- for (let i = 0, length = this.children.length; i < length; i++) {
1281
- this.children[i].setUpdateType(UpdateType.CalculatedZIndex);
1460
+ let sanitizedValue = value;
1461
+ if (isNaN(sanitizedValue) || Number.isFinite(sanitizedValue) === false) {
1462
+ console.warn(`zIndex was set to an invalid value: ${value}, defaulting to 0`);
1463
+ sanitizedValue = 0;
1464
+ }
1465
+ //Clamp to safe integer range
1466
+ if (sanitizedValue > Number.MAX_SAFE_INTEGER) {
1467
+ sanitizedValue = 1000;
1468
+ }
1469
+ else if (sanitizedValue < Number.MIN_SAFE_INTEGER) {
1470
+ sanitizedValue = -1000;
1471
+ }
1472
+ if (this.props.zIndex === sanitizedValue) {
1473
+ return;
1474
+ }
1475
+ this.previousZIndex = this.props.zIndex;
1476
+ this.props.zIndex = sanitizedValue;
1477
+ const parent = this.parent;
1478
+ if (parent !== null) {
1479
+ const min = parent.zIndexMin;
1480
+ const max = parent.zIndexMax;
1481
+ if (min !== max || sanitizedValue < min || sanitizedValue > max) {
1482
+ parent.setUpdateType(UpdateType.SortZIndexChildren);
1483
+ }
1282
1484
  }
1283
1485
  }
1284
1486
  get parent() {
@@ -1291,23 +1493,13 @@ export class CoreNode extends EventEmitter {
1291
1493
  }
1292
1494
  this.props.parent = newParent;
1293
1495
  if (oldParent) {
1294
- const index = oldParent.children.indexOf(this);
1295
- oldParent.children.splice(index, 1);
1296
- oldParent.setUpdateType(UpdateType.Children | UpdateType.ZIndexSortedChildren);
1297
- }
1298
- if (newParent) {
1299
- newParent.children.push(this);
1300
- // Since this node has a new parent, to be safe, have it do a full update.
1301
- this.setUpdateType(UpdateType.All);
1302
- // Tell parent that it's children need to be updated and sorted.
1303
- newParent.setUpdateType(UpdateType.Children | UpdateType.ZIndexSortedChildren);
1304
- // If the new parent has an RTT enabled, apply RTT inheritance
1305
- if (newParent.rtt || newParent.parentHasRenderTexture) {
1306
- this.applyRTTInheritance(newParent);
1307
- }
1496
+ oldParent.removeChild(this, newParent);
1308
1497
  }
1309
- // fetch render bounds from parent
1310
- this.setUpdateType(UpdateType.RenderBounds | UpdateType.Children);
1498
+ if (newParent !== null) {
1499
+ newParent.addChild(this, oldParent);
1500
+ }
1501
+ //since this node has a new parent, recalc global and render bounds
1502
+ this.setUpdateType(UpdateType.Global | UpdateType.RenderBounds);
1311
1503
  }
1312
1504
  get rtt() {
1313
1505
  return this.props.rtt;
@@ -1331,8 +1523,8 @@ export class CoreNode extends EventEmitter {
1331
1523
  }
1332
1524
  initRenderTexture() {
1333
1525
  this.framebufferDimensions = {
1334
- width: this.width,
1335
- height: this.height,
1526
+ w: this.props.w,
1527
+ h: this.props.h,
1336
1528
  };
1337
1529
  this.texture = this.stage.txManager.createTexture('RenderTexture', this.framebufferDimensions);
1338
1530
  this.stage.renderer.renderToTexture(this);
@@ -1391,8 +1583,15 @@ export class CoreNode extends EventEmitter {
1391
1583
  }
1392
1584
  if (shader.shaderKey !== 'default') {
1393
1585
  this.hasShaderUpdater = shader.update !== undefined;
1586
+ this.hasShaderTimeFn = shader.time !== undefined;
1394
1587
  shader.attachNode(this);
1395
1588
  }
1589
+ if (this.hasShaderTimeFn === true) {
1590
+ this.stage.trackTimedNode(this);
1591
+ }
1592
+ else {
1593
+ this.stage.untrackTimedNode(this);
1594
+ }
1396
1595
  this.props.shader = shader;
1397
1596
  this.setUpdateType(UpdateType.IsRenderable | UpdateType.RecalcUniforms);
1398
1597
  }
@@ -1410,8 +1609,8 @@ export class CoreNode extends EventEmitter {
1410
1609
  }
1411
1610
  this.texture = this.stage.txManager.createTexture('ImageTexture', {
1412
1611
  src: imageUrl,
1413
- width: this.props.width,
1414
- height: this.props.height,
1612
+ w: this.props.w,
1613
+ h: this.props.h,
1415
1614
  type: this.props.imageType,
1416
1615
  sx: this.props.srcX,
1417
1616
  sy: this.props.srcY,
@@ -1460,7 +1659,7 @@ export class CoreNode extends EventEmitter {
1460
1659
  return this.rttParent.framebufferDimensions;
1461
1660
  }
1462
1661
  this.rttParent = this.findParentRTTNode();
1463
- return this.rttParent.framebufferDimensions;
1662
+ return this.rttParent ? this.rttParent.framebufferDimensions : null;
1464
1663
  }
1465
1664
  /**
1466
1665
  * Returns the parent render texture node if it exists.
@@ -1485,17 +1684,26 @@ export class CoreNode extends EventEmitter {
1485
1684
  const oldTexture = this.props.texture;
1486
1685
  if (oldTexture) {
1487
1686
  this.unloadTexture();
1687
+ if (this.autosizer !== null && value === null) {
1688
+ this.autosizer.setMode(AutosizeMode.Children); // Set to children size mode
1689
+ }
1488
1690
  }
1489
1691
  this.textureCoords = undefined;
1490
1692
  this.props.texture = value;
1491
1693
  if (value !== null) {
1492
- value.setRenderableOwner(this, this.isRenderable);
1694
+ if (this.autosizer !== null) {
1695
+ this.autosizer.setMode(AutosizeMode.Texture); // Set to texture size mode
1696
+ }
1697
+ value.setRenderableOwner(this._id, this.isRenderable);
1493
1698
  this.loadTexture();
1494
1699
  }
1495
1700
  this.setUpdateType(UpdateType.IsRenderable);
1496
1701
  }
1497
1702
  set textureOptions(value) {
1498
1703
  this.props.textureOptions = value;
1704
+ if (this.stage.calculateTextureCoord === true && value !== null) {
1705
+ this.textureCoords = this.stage.renderer.getTextureCoords(this);
1706
+ }
1499
1707
  }
1500
1708
  get textureOptions() {
1501
1709
  return this.props.textureOptions;
@@ -1514,17 +1722,6 @@ export class CoreNode extends EventEmitter {
1514
1722
  this.hasRTTupdates = true;
1515
1723
  this.parent?.setRTTUpdates(type);
1516
1724
  }
1517
- get strictBounds() {
1518
- return this.props.strictBounds;
1519
- }
1520
- set strictBounds(v) {
1521
- if (v === this.props.strictBounds) {
1522
- return;
1523
- }
1524
- this.props.strictBounds = v;
1525
- this.setUpdateType(UpdateType.RenderBounds | UpdateType.Children);
1526
- this.childUpdateType |= UpdateType.RenderBounds | UpdateType.Children;
1527
- }
1528
1725
  animate(props, settings) {
1529
1726
  const animation = new CoreAnimation(this, props, settings);
1530
1727
  const controller = new CoreAnimationController(this.stage.animationManager, animation);
@@ -1533,5 +1730,56 @@ export class CoreNode extends EventEmitter {
1533
1730
  flush() {
1534
1731
  // no-op
1535
1732
  }
1733
+ /**
1734
+ * Add a texture to the current RenderOp.
1735
+ *
1736
+ * @param texture
1737
+ * @returns Assigned Texture Index of the texture in the render op
1738
+ */
1739
+ addTexture(texture) {
1740
+ const textures = this.renderOpTextures;
1741
+ const length = textures.length;
1742
+ for (let i = 0; i < length; i++) {
1743
+ if (textures[i] === texture) {
1744
+ return i;
1745
+ }
1746
+ }
1747
+ if (length >= 1) {
1748
+ return 0xffffffff;
1749
+ }
1750
+ textures.push(texture);
1751
+ return length;
1752
+ }
1753
+ draw(renderer) {
1754
+ const { glw, stage } = renderer;
1755
+ const canvas = stage.platform.canvas;
1756
+ const shader = this.props.shader;
1757
+ stage.shManager.useShader(shader.program);
1758
+ shader.program.bindRenderOp(this);
1759
+ // Clipping
1760
+ if (this.clippingRect.valid === true) {
1761
+ const pixelRatio = this.parentHasRenderTexture ? 1 : stage.pixelRatio;
1762
+ const clipX = Math.round(this.clippingRect.x * pixelRatio);
1763
+ const clipWidth = Math.round(this.clippingRect.w * pixelRatio);
1764
+ const clipHeight = Math.round(this.clippingRect.h * pixelRatio);
1765
+ let clipY = Math.round(canvas.height - clipHeight - this.clippingRect.y * pixelRatio);
1766
+ // if parent has render texture, we need to adjust the scissor rect
1767
+ // to be relative to the parent's framebuffer
1768
+ if (this.parentHasRenderTexture) {
1769
+ const parentFramebufferDimensions = this.parentFramebufferDimensions;
1770
+ clipY =
1771
+ parentFramebufferDimensions !== null
1772
+ ? parentFramebufferDimensions.h - this.props.h
1773
+ : 0;
1774
+ }
1775
+ glw.setScissorTest(true);
1776
+ glw.scissor(clipX, clipY, clipWidth, clipHeight);
1777
+ }
1778
+ else {
1779
+ glw.setScissorTest(false);
1780
+ }
1781
+ const quadIdx = (this.renderOpBufferIdx / 32) * 6 * 2;
1782
+ glw.drawElements(glw.TRIANGLES, 6 * this.numQuads, glw.UNSIGNED_SHORT, quadIdx);
1783
+ }
1536
1784
  }
1537
1785
  //# sourceMappingURL=CoreNode.js.map