@lightningjs/renderer 3.0.0-beta1 → 3.0.0-beta11

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 (490) hide show
  1. package/README.md +13 -27
  2. package/dist/exports/canvas.d.ts +1 -1
  3. package/dist/exports/canvas.js +1 -1
  4. package/dist/exports/canvas.js.map +1 -1
  5. package/dist/exports/index.d.ts +1 -5
  6. package/dist/exports/index.js +1 -5
  7. package/dist/exports/index.js.map +1 -1
  8. package/dist/exports/utils.d.ts +2 -1
  9. package/dist/exports/utils.js +2 -1
  10. package/dist/exports/utils.js.map +1 -1
  11. package/dist/exports/webgl.d.ts +2 -1
  12. package/dist/exports/webgl.js +2 -1
  13. package/dist/exports/webgl.js.map +1 -1
  14. package/dist/src/core/CoreNode.d.ts +45 -69
  15. package/dist/src/core/CoreNode.js +323 -305
  16. package/dist/src/core/CoreNode.js.map +1 -1
  17. package/dist/src/core/CoreShaderManager.d.ts +3 -5
  18. package/dist/src/core/CoreShaderManager.js.map +1 -1
  19. package/dist/src/core/CoreTextNode.d.ts +61 -87
  20. package/dist/src/core/CoreTextNode.js +276 -235
  21. package/dist/src/core/CoreTextNode.js.map +1 -1
  22. package/dist/src/core/CoreTextureManager.d.ts +9 -11
  23. package/dist/src/core/CoreTextureManager.js +80 -91
  24. package/dist/src/core/CoreTextureManager.js.map +1 -1
  25. package/dist/src/core/Stage.d.ts +75 -31
  26. package/dist/src/core/Stage.js +270 -136
  27. package/dist/src/core/Stage.js.map +1 -1
  28. package/dist/src/core/TextureMemoryManager.d.ts +10 -1
  29. package/dist/src/core/TextureMemoryManager.js +112 -78
  30. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  31. package/dist/src/core/animations/CoreAnimation.js +5 -0
  32. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  33. package/dist/src/core/animations/CoreAnimationController.d.ts +1 -0
  34. package/dist/src/core/animations/CoreAnimationController.js +11 -4
  35. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  36. package/dist/src/core/lib/ImageWorker.js +3 -2
  37. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  38. package/dist/src/core/lib/RenderCoords.d.ts +9 -10
  39. package/dist/src/core/lib/RenderCoords.js +43 -55
  40. package/dist/src/core/lib/RenderCoords.js.map +1 -1
  41. package/dist/src/core/lib/WebGlContextWrapper.d.ts +51 -2
  42. package/dist/src/core/lib/WebGlContextWrapper.js +92 -22
  43. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  44. package/dist/src/core/lib/colorCache.d.ts +1 -0
  45. package/dist/src/core/lib/colorCache.js +19 -0
  46. package/dist/src/core/lib/colorCache.js.map +1 -0
  47. package/dist/src/core/lib/colorParser.d.ts +21 -0
  48. package/dist/src/core/lib/colorParser.js +72 -0
  49. package/dist/src/core/lib/colorParser.js.map +1 -0
  50. package/dist/src/core/lib/utils.d.ts +3 -0
  51. package/dist/src/core/lib/utils.js +42 -0
  52. package/dist/src/core/lib/utils.js.map +1 -1
  53. package/dist/src/core/lib/validateImageBitmap.d.ts +2 -1
  54. package/dist/src/core/lib/validateImageBitmap.js +4 -4
  55. package/dist/src/core/lib/validateImageBitmap.js.map +1 -1
  56. package/dist/src/core/platform.js +29 -4
  57. package/dist/src/core/platform.js.map +1 -1
  58. package/dist/src/core/platforms/Platform.d.ts +37 -0
  59. package/dist/src/{main-api/IRenderDriver.js → core/platforms/Platform.js} +4 -2
  60. package/dist/src/core/platforms/Platform.js.map +1 -0
  61. package/dist/src/core/platforms/web/WebPlatform.d.ts +9 -0
  62. package/dist/src/core/platforms/web/WebPlatform.js +84 -0
  63. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -0
  64. package/dist/src/core/renderers/CoreContextTexture.d.ts +1 -1
  65. package/dist/src/core/renderers/CoreRenderer.d.ts +5 -2
  66. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  67. package/dist/src/core/renderers/CoreShaderNode.d.ts +3 -3
  68. package/dist/src/core/renderers/CoreShaderNode.js +8 -2
  69. package/dist/src/core/renderers/CoreShaderNode.js.map +1 -1
  70. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +1 -1
  71. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +7 -6
  72. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -1
  73. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +1 -2
  74. package/dist/src/core/renderers/canvas/CanvasRenderer.js +10 -21
  75. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  76. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +3 -5
  77. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
  78. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +2 -2
  79. package/dist/src/core/renderers/canvas/CanvasTexture.js +11 -9
  80. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -1
  81. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +13 -0
  82. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +113 -192
  83. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +1 -1
  84. package/dist/src/core/renderers/canvas/internal/ColorUtils.d.ts +0 -2
  85. package/dist/src/core/renderers/canvas/internal/ColorUtils.js +0 -14
  86. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +1 -1
  87. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +3 -0
  88. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +1 -1
  89. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +5 -6
  90. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +30 -18
  91. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  92. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +5 -2
  93. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  94. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +3 -1
  95. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -1
  96. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +3 -0
  97. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -1
  98. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +5 -6
  99. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +30 -21
  100. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  101. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +10 -2
  102. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +37 -19
  103. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +1 -1
  104. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +5 -3
  105. package/dist/src/core/renderers/webgl/WebGlRenderer.js +144 -117
  106. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  107. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +2 -1
  108. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +1 -4
  109. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  110. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +5 -3
  111. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +55 -31
  112. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  113. package/dist/src/core/shaders/canvas/Border.js +1 -1
  114. package/dist/src/core/shaders/canvas/Border.js.map +1 -1
  115. package/dist/src/core/shaders/canvas/LinearGradient.js +5 -3
  116. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -1
  117. package/dist/src/core/shaders/canvas/RadialGradient.js +13 -11
  118. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
  119. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +14 -6
  120. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  121. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +10 -8
  122. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
  123. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +7 -5
  124. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
  125. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +1 -1
  126. package/dist/src/core/shaders/templates/BorderTemplate.js +1 -1
  127. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -1
  128. package/dist/src/core/shaders/templates/HolePunchTemplate.js +1 -1
  129. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -1
  130. package/dist/src/core/shaders/templates/RoundedTemplate.js +1 -1
  131. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -1
  132. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +1 -1
  133. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +1 -1
  134. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +1 -1
  135. package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +1 -1
  136. package/dist/src/core/shaders/utils.d.ts +5 -0
  137. package/dist/src/core/shaders/utils.js +41 -0
  138. package/dist/src/core/shaders/utils.js.map +1 -0
  139. package/dist/src/core/shaders/webgl/Border.js +57 -34
  140. package/dist/src/core/shaders/webgl/Border.js.map +1 -1
  141. package/dist/src/core/shaders/webgl/HolePunch.js +4 -3
  142. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -1
  143. package/dist/src/core/shaders/webgl/LinearGradient.js +5 -4
  144. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  145. package/dist/src/core/shaders/webgl/RadialGradient.js +6 -5
  146. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  147. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +79 -36
  148. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  149. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +92 -42
  150. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  151. package/dist/src/core/shaders/webgl/SdfShader.js +1 -1
  152. package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -1
  153. package/dist/src/core/shaders/webgl/Spinner.js +2 -0
  154. package/dist/src/core/shaders/webgl/Spinner.js.map +1 -0
  155. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +41 -0
  156. package/dist/src/core/text-rendering/CanvasFontHandler.js +159 -0
  157. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -0
  158. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +22 -0
  159. package/dist/src/core/text-rendering/CanvasTextRenderer.js +366 -0
  160. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -0
  161. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +152 -0
  162. package/dist/src/core/text-rendering/SdfFontHandler.js +368 -0
  163. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -0
  164. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +17 -0
  165. package/dist/src/core/text-rendering/SdfTextRenderer.js +355 -0
  166. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -0
  167. package/dist/src/core/text-rendering/TextRenderer.d.ts +351 -0
  168. package/dist/src/{main-api/ICoreDriver.js → core/text-rendering/TextRenderer.js} +1 -1
  169. package/dist/src/core/text-rendering/TextRenderer.js.map +1 -0
  170. package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +1 -1
  171. package/dist/src/core/text-rendering/Utils.d.ts +71 -0
  172. package/dist/src/core/text-rendering/Utils.js +212 -0
  173. package/dist/src/core/text-rendering/Utils.js.map +1 -0
  174. package/dist/src/core/text-rendering/canvas/Settings.d.ts +64 -0
  175. package/dist/src/{main-api/texture-usage-trackers/TextureUsageTracker.js → core/text-rendering/canvas/Settings.js} +3 -11
  176. package/dist/src/core/text-rendering/canvas/Settings.js.map +1 -0
  177. package/dist/src/core/text-rendering/canvas/Utils.d.ts +20 -0
  178. package/dist/src/core/text-rendering/canvas/Utils.js +144 -0
  179. package/dist/src/core/text-rendering/canvas/Utils.js.map +1 -0
  180. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.d.ts +60 -0
  181. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js +183 -0
  182. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js.map +1 -0
  183. package/dist/src/core/text-rendering/canvas/draw.d.ts +5 -0
  184. package/dist/src/core/text-rendering/canvas/draw.js +132 -0
  185. package/dist/src/core/text-rendering/canvas/draw.js.map +1 -0
  186. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +2 -2
  187. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
  188. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +0 -6
  189. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
  190. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +3 -2
  191. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +30 -34
  192. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  193. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +4 -1
  194. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  195. package/dist/src/core/text-rendering/sdf/PeekableGenerator.d.ts +12 -0
  196. package/dist/src/core/text-rendering/sdf/PeekableGenerator.js +61 -0
  197. package/dist/src/core/text-rendering/sdf/PeekableGenerator.js.map +1 -0
  198. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.d.ts +45 -0
  199. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.js +69 -0
  200. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.js.map +1 -0
  201. package/dist/src/core/text-rendering/sdf/Utils.d.ts +26 -0
  202. package/dist/src/core/text-rendering/sdf/Utils.js +304 -0
  203. package/dist/src/core/text-rendering/sdf/Utils.js.map +1 -0
  204. package/dist/src/core/text-rendering/sdf/index.d.ts +1 -0
  205. package/dist/src/core/{CoreExtension.js → text-rendering/sdf/index.js} +3 -12
  206. package/dist/src/core/text-rendering/sdf/index.js.map +1 -0
  207. package/dist/src/core/textures/ImageTexture.d.ts +4 -3
  208. package/dist/src/core/textures/ImageTexture.js +36 -9
  209. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  210. package/dist/src/core/textures/Texture.d.ts +21 -2
  211. package/dist/src/core/textures/Texture.js +37 -6
  212. package/dist/src/core/textures/Texture.js.map +1 -1
  213. package/dist/src/core/utils.d.ts +1 -1
  214. package/dist/src/main-api/INode.d.ts +2 -2
  215. package/dist/src/main-api/Inspector.d.ts +6 -1
  216. package/dist/src/main-api/Inspector.js +43 -7
  217. package/dist/src/main-api/Inspector.js.map +1 -1
  218. package/dist/src/main-api/Renderer.d.ts +122 -46
  219. package/dist/src/main-api/Renderer.js +174 -37
  220. package/dist/src/main-api/Renderer.js.map +1 -1
  221. package/dist/src/utils.d.ts +1 -6
  222. package/dist/src/utils.js +2 -9
  223. package/dist/src/utils.js.map +1 -1
  224. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  225. package/exports/canvas.ts +1 -1
  226. package/exports/index.ts +1 -8
  227. package/exports/utils.ts +7 -1
  228. package/exports/webgl.ts +3 -1
  229. package/package.json +2 -3
  230. package/src/core/CoreNode.test.ts +0 -1
  231. package/src/core/CoreNode.ts +403 -388
  232. package/src/core/CoreShaderManager.ts +5 -10
  233. package/src/core/CoreTextNode.ts +337 -302
  234. package/src/core/CoreTextureManager.ts +78 -110
  235. package/src/core/Stage.ts +344 -178
  236. package/src/core/TextureMemoryManager.ts +150 -100
  237. package/src/core/animations/CoreAnimation.ts +7 -0
  238. package/src/core/animations/CoreAnimationController.ts +13 -4
  239. package/src/core/lib/ImageWorker.ts +9 -2
  240. package/src/core/lib/RenderCoords.ts +52 -67
  241. package/src/core/lib/WebGlContextWrapper.ts +125 -68
  242. package/src/core/lib/colorCache.ts +20 -0
  243. package/src/core/{renderers/canvas/internal/ColorUtils.ts → lib/colorParser.ts} +2 -2
  244. package/src/core/lib/utils.ts +51 -0
  245. package/src/core/lib/validateImageBitmap.ts +17 -6
  246. package/src/core/platforms/Platform.ts +77 -0
  247. package/src/core/platforms/web/WebPlatform.ts +121 -0
  248. package/src/core/renderers/CoreContextTexture.ts +1 -1
  249. package/src/core/renderers/CoreRenderer.ts +5 -2
  250. package/src/core/renderers/CoreShaderNode.ts +10 -6
  251. package/src/core/renderers/canvas/CanvasRenderer.ts +12 -28
  252. package/src/core/renderers/canvas/CanvasShaderNode.ts +3 -6
  253. package/src/core/renderers/canvas/CanvasTexture.ts +17 -14
  254. package/src/core/renderers/webgl/WebGlCtxRenderTexture.ts +5 -0
  255. package/src/core/renderers/webgl/WebGlCtxTexture.ts +52 -43
  256. package/src/core/renderers/webgl/WebGlRenderOp.ts +46 -24
  257. package/src/core/renderers/webgl/WebGlRenderer.ts +177 -145
  258. package/src/core/renderers/webgl/WebGlShaderNode.ts +7 -5
  259. package/src/core/renderers/webgl/WebGlShaderProgram.ts +68 -37
  260. package/src/core/shaders/canvas/Border.ts +1 -4
  261. package/src/core/shaders/canvas/LinearGradient.ts +8 -6
  262. package/src/core/shaders/canvas/RadialGradient.ts +22 -36
  263. package/src/core/shaders/canvas/RoundedWithBorder.ts +17 -11
  264. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +14 -12
  265. package/src/core/shaders/canvas/RoundedWithShadow.ts +8 -7
  266. package/src/core/shaders/templates/BorderTemplate.ts +1 -1
  267. package/src/core/shaders/templates/HolePunchTemplate.ts +1 -1
  268. package/src/core/shaders/templates/RoundedTemplate.ts +1 -1
  269. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +1 -1
  270. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +1 -1
  271. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +1 -1
  272. package/src/core/shaders/templates/ShadowTemplate.ts +1 -1
  273. package/src/core/shaders/{templates/shaderUtils.ts → utils.ts} +2 -3
  274. package/src/core/shaders/webgl/Border.ts +57 -37
  275. package/src/core/shaders/webgl/HolePunch.ts +4 -7
  276. package/src/core/shaders/webgl/LinearGradient.ts +5 -4
  277. package/src/core/shaders/webgl/RadialGradient.ts +7 -6
  278. package/src/core/shaders/webgl/RoundedWithBorder.ts +80 -39
  279. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +92 -50
  280. package/src/core/shaders/webgl/SdfShader.ts +1 -4
  281. package/src/core/text-rendering/CanvasFontHandler.ts +210 -0
  282. package/src/core/text-rendering/CanvasTextRenderer.ts +622 -0
  283. package/src/core/text-rendering/SdfFontHandler.ts +554 -0
  284. package/src/core/text-rendering/SdfTextRenderer.ts +466 -0
  285. package/src/core/text-rendering/TextRenderer.ts +406 -0
  286. package/src/core/text-rendering/{TextTextureRendererUtils.ts → Utils.ts} +5 -11
  287. package/src/core/text-rendering/canvas/Settings.ts +99 -0
  288. package/src/core/text-rendering/canvas/Utils.test.ts +206 -0
  289. package/src/core/text-rendering/canvas/Utils.ts +178 -0
  290. package/src/core/text-rendering/canvas/calculateRenderInfo.ts +299 -0
  291. package/src/core/text-rendering/canvas/draw.ts +165 -0
  292. package/src/core/text-rendering/sdf/Utils.test.ts +402 -0
  293. package/src/core/text-rendering/sdf/Utils.ts +436 -0
  294. package/src/core/text-rendering/sdf/index.ts +20 -0
  295. package/src/core/textures/ImageTexture.ts +69 -27
  296. package/src/core/textures/Texture.ts +50 -6
  297. package/src/main-api/INode.ts +4 -3
  298. package/src/main-api/Inspector.ts +53 -8
  299. package/src/main-api/Renderer.ts +311 -87
  300. package/src/utils.ts +10 -10
  301. package/dist/exports/core-api.d.ts +0 -74
  302. package/dist/exports/core-api.js +0 -96
  303. package/dist/exports/core-api.js.map +0 -1
  304. package/dist/exports/main-api.d.ts +0 -30
  305. package/dist/exports/main-api.js +0 -45
  306. package/dist/exports/main-api.js.map +0 -1
  307. package/dist/src/core/CoreExtension.d.ts +0 -12
  308. package/dist/src/core/CoreExtension.js.map +0 -1
  309. package/dist/src/core/CoreStuff.js +0 -138
  310. package/dist/src/core/CoreStuff.js.map +0 -1
  311. package/dist/src/core/CoreTexturizer.d.ts +0 -14
  312. package/dist/src/core/CoreTexturizer.js +0 -47
  313. package/dist/src/core/CoreTexturizer.js.map +0 -1
  314. package/dist/src/core/LngNode.d.ts +0 -736
  315. package/dist/src/core/LngNode.js +0 -1174
  316. package/dist/src/core/LngNode.js.map +0 -1
  317. package/dist/src/core/Matrix2DContext.d.ts +0 -15
  318. package/dist/src/core/Matrix2DContext.js +0 -45
  319. package/dist/src/core/Matrix2DContext.js.map +0 -1
  320. package/dist/src/core/ShaderNode.d.ts +0 -10
  321. package/dist/src/core/ShaderNode.js +0 -30
  322. package/dist/src/core/ShaderNode.js.map +0 -1
  323. package/dist/src/core/TextNode.d.ts +0 -103
  324. package/dist/src/core/TextNode.js +0 -331
  325. package/dist/src/core/TextNode.js.map +0 -1
  326. package/dist/src/core/lib/Coords.d.ts +0 -14
  327. package/dist/src/core/lib/Coords.js +0 -55
  328. package/dist/src/core/lib/Coords.js.map +0 -1
  329. package/dist/src/core/lib/glm/common.d.ts +0 -162
  330. package/dist/src/core/lib/glm/common.js +0 -81
  331. package/dist/src/core/lib/glm/common.js.map +0 -1
  332. package/dist/src/core/lib/glm/index.d.ts +0 -11
  333. package/dist/src/core/lib/glm/index.js +0 -30
  334. package/dist/src/core/lib/glm/index.js.map +0 -1
  335. package/dist/src/core/lib/glm/mat2.d.ts +0 -219
  336. package/dist/src/core/lib/glm/mat2.js +0 -396
  337. package/dist/src/core/lib/glm/mat2.js.map +0 -1
  338. package/dist/src/core/lib/glm/mat2d.d.ts +0 -237
  339. package/dist/src/core/lib/glm/mat2d.js +0 -442
  340. package/dist/src/core/lib/glm/mat2d.js.map +0 -1
  341. package/dist/src/core/lib/glm/mat3.d.ts +0 -283
  342. package/dist/src/core/lib/glm/mat3.js +0 -680
  343. package/dist/src/core/lib/glm/mat3.js.map +0 -1
  344. package/dist/src/core/lib/glm/mat4.d.ts +0 -550
  345. package/dist/src/core/lib/glm/mat4.js +0 -1802
  346. package/dist/src/core/lib/glm/mat4.js.map +0 -1
  347. package/dist/src/core/lib/glm/quat.d.ts +0 -363
  348. package/dist/src/core/lib/glm/quat.js +0 -693
  349. package/dist/src/core/lib/glm/quat.js.map +0 -1
  350. package/dist/src/core/lib/glm/quat2.d.ts +0 -356
  351. package/dist/src/core/lib/glm/quat2.js +0 -754
  352. package/dist/src/core/lib/glm/quat2.js.map +0 -1
  353. package/dist/src/core/lib/glm/vec2.d.ts +0 -365
  354. package/dist/src/core/lib/glm/vec2.js +0 -569
  355. package/dist/src/core/lib/glm/vec2.js.map +0 -1
  356. package/dist/src/core/lib/glm/vec3.d.ts +0 -406
  357. package/dist/src/core/lib/glm/vec3.js +0 -720
  358. package/dist/src/core/lib/glm/vec3.js.map +0 -1
  359. package/dist/src/core/lib/glm/vec4.d.ts +0 -330
  360. package/dist/src/core/lib/glm/vec4.js +0 -608
  361. package/dist/src/core/lib/glm/vec4.js.map +0 -1
  362. package/dist/src/core/renderers/CoreShaderManager.d.ts +0 -19
  363. package/dist/src/core/renderers/CoreShaderManager.js +0 -33
  364. package/dist/src/core/renderers/CoreShaderManager.js.map +0 -1
  365. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.d.ts +0 -27
  366. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.js +0 -82
  367. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.js.map +0 -1
  368. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.d.ts +0 -11
  369. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.js +0 -34
  370. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.js.map +0 -1
  371. package/dist/src/core/scene/Scene.d.ts +0 -59
  372. package/dist/src/core/scene/Scene.js +0 -106
  373. package/dist/src/core/scene/Scene.js.map +0 -1
  374. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.d.ts +0 -20
  375. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js +0 -55
  376. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js.map +0 -1
  377. package/dist/src/main-api/ICoreDriver.d.ts +0 -27
  378. package/dist/src/main-api/ICoreDriver.js.map +0 -1
  379. package/dist/src/main-api/IRenderDriver.d.ts +0 -20
  380. package/dist/src/main-api/IRenderDriver.js.map +0 -1
  381. package/dist/src/main-api/IShaderController.d.ts +0 -14
  382. package/dist/src/main-api/IShaderController.js +0 -30
  383. package/dist/src/main-api/IShaderController.js.map +0 -1
  384. package/dist/src/main-api/IShaderNode.d.ts +0 -17
  385. package/dist/src/main-api/IShaderNode.js +0 -19
  386. package/dist/src/main-api/IShaderNode.js.map +0 -1
  387. package/dist/src/main-api/RendererMain.d.ts +0 -375
  388. package/dist/src/main-api/RendererMain.js +0 -365
  389. package/dist/src/main-api/RendererMain.js.map +0 -1
  390. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.d.ts +0 -9
  391. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js +0 -38
  392. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js.map +0 -1
  393. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.d.ts +0 -56
  394. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js +0 -101
  395. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js.map +0 -1
  396. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.d.ts +0 -32
  397. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js.map +0 -1
  398. package/dist/src/render-drivers/main/MainCoreDriver.d.ts +0 -24
  399. package/dist/src/render-drivers/main/MainCoreDriver.js +0 -118
  400. package/dist/src/render-drivers/main/MainCoreDriver.js.map +0 -1
  401. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +0 -99
  402. package/dist/src/render-drivers/main/MainOnlyNode.js +0 -396
  403. package/dist/src/render-drivers/main/MainOnlyNode.js.map +0 -1
  404. package/dist/src/render-drivers/main/MainOnlyShaderController.d.ts +0 -6
  405. package/dist/src/render-drivers/main/MainOnlyShaderController.js +0 -15
  406. package/dist/src/render-drivers/main/MainOnlyShaderController.js.map +0 -1
  407. package/dist/src/render-drivers/main/MainOnlyShaderNode.d.ts +0 -7
  408. package/dist/src/render-drivers/main/MainOnlyShaderNode.js +0 -34
  409. package/dist/src/render-drivers/main/MainOnlyShaderNode.js.map +0 -1
  410. package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +0 -47
  411. package/dist/src/render-drivers/main/MainOnlyTextNode.js +0 -205
  412. package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +0 -1
  413. package/dist/src/render-drivers/main/MainRenderDriver.d.ts +0 -17
  414. package/dist/src/render-drivers/main/MainRenderDriver.js +0 -88
  415. package/dist/src/render-drivers/main/MainRenderDriver.js.map +0 -1
  416. package/dist/src/render-drivers/threadx/NodeStruct.d.ts +0 -90
  417. package/dist/src/render-drivers/threadx/NodeStruct.js +0 -281
  418. package/dist/src/render-drivers/threadx/NodeStruct.js.map +0 -1
  419. package/dist/src/render-drivers/threadx/SharedNode.d.ts +0 -39
  420. package/dist/src/render-drivers/threadx/SharedNode.js +0 -60
  421. package/dist/src/render-drivers/threadx/SharedNode.js.map +0 -1
  422. package/dist/src/render-drivers/threadx/TextNodeStruct.d.ts +0 -44
  423. package/dist/src/render-drivers/threadx/TextNodeStruct.js +0 -201
  424. package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +0 -1
  425. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +0 -28
  426. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +0 -234
  427. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +0 -1
  428. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.d.ts +0 -20
  429. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js +0 -84
  430. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js.map +0 -1
  431. package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +0 -44
  432. package/dist/src/render-drivers/threadx/ThreadXMainNode.js +0 -154
  433. package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +0 -1
  434. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.d.ts +0 -6
  435. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.js +0 -16
  436. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.js.map +0 -1
  437. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.d.ts +0 -7
  438. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.js +0 -15
  439. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.js.map +0 -1
  440. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.d.ts +0 -28
  441. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +0 -55
  442. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +0 -1
  443. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.d.ts +0 -21
  444. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js +0 -198
  445. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js.map +0 -1
  446. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +0 -70
  447. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js +0 -32
  448. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +0 -1
  449. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.d.ts +0 -19
  450. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +0 -177
  451. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +0 -1
  452. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.d.ts +0 -27
  453. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +0 -108
  454. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +0 -1
  455. package/dist/src/render-drivers/threadx/worker/renderer.d.ts +0 -1
  456. package/dist/src/render-drivers/threadx/worker/renderer.js +0 -145
  457. package/dist/src/render-drivers/threadx/worker/renderer.js.map +0 -1
  458. package/dist/src/render-drivers/utils.d.ts +0 -12
  459. package/dist/src/render-drivers/utils.js +0 -69
  460. package/dist/src/render-drivers/utils.js.map +0 -1
  461. package/scripts/please-use-pnpm.js +0 -13
  462. package/src/core/platform.ts +0 -64
  463. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +0 -220
  464. package/src/core/text-rendering/TextRenderingUtils.ts +0 -36
  465. package/src/core/text-rendering/TrFontManager.ts +0 -183
  466. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +0 -176
  467. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +0 -139
  468. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +0 -173
  469. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +0 -171
  470. package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -187
  471. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -94
  472. package/src/core/text-rendering/font-face-types/utils.ts +0 -39
  473. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +0 -509
  474. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -815
  475. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +0 -841
  476. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +0 -48
  477. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +0 -66
  478. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +0 -52
  479. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +0 -32
  480. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +0 -117
  481. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +0 -133
  482. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +0 -38
  483. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +0 -408
  484. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +0 -49
  485. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +0 -52
  486. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +0 -205
  487. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +0 -93
  488. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +0 -40
  489. package/src/core/text-rendering/renderers/TextRenderer.ts +0 -550
  490. /package/dist/src/core/{CoreStuff.d.ts → shaders/webgl/Spinner.d.ts} +0 -0
@@ -20,7 +20,6 @@
20
20
  import {
21
21
  assertTruthy,
22
22
  getNewId,
23
- isProductionEnvironment,
24
23
  mergeColorAlphaPremultiplied,
25
24
  } from '../utils.js';
26
25
  import type { TextureOptions } from './CoreTextureManager.js';
@@ -28,6 +27,7 @@ import type { CoreRenderer } from './renderers/CoreRenderer.js';
28
27
  import type { Stage } from './Stage.js';
29
28
  import {
30
29
  type Texture,
30
+ type TextureCoords,
31
31
  type TextureFailedEventHandler,
32
32
  type TextureFreedEventHandler,
33
33
  type TextureLoadedEventHandler,
@@ -77,33 +77,24 @@ export enum UpdateType {
77
77
  Children = 1,
78
78
 
79
79
  /**
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)
80
+ * localTransform
90
81
  *
91
82
  * @remarks
92
83
  * CoreNode Properties Updated:
93
84
  * - `localTransform`
94
85
  */
95
- Local = 4,
86
+ Local = 2,
96
87
 
97
88
  /**
98
- * Global Transform update
89
+ * globalTransform
99
90
  *
100
- * @remarks
91
+ * * @remarks
101
92
  * CoreNode Properties Updated:
102
93
  * - `globalTransform`
94
+ * - `renderBounds`
103
95
  * - `renderCoords`
104
- * - `renderBound`
105
96
  */
106
- Global = 8,
97
+ Global = 4,
107
98
 
108
99
  /**
109
100
  * Clipping rect update
@@ -112,7 +103,7 @@ export enum UpdateType {
112
103
  * CoreNode Properties Updated:
113
104
  * - `clippingRect`
114
105
  */
115
- Clipping = 16,
106
+ Clipping = 8,
116
107
 
117
108
  /**
118
109
  * Calculated ZIndex update
@@ -121,7 +112,7 @@ export enum UpdateType {
121
112
  * CoreNode Properties Updated:
122
113
  * - `calcZIndex`
123
114
  */
124
- CalculatedZIndex = 32,
115
+ CalculatedZIndex = 16,
125
116
 
126
117
  /**
127
118
  * Z-Index Sorted Children update
@@ -130,7 +121,7 @@ export enum UpdateType {
130
121
  * CoreNode Properties Updated:
131
122
  * - `children` (sorts children by their `calcZIndex`)
132
123
  */
133
- ZIndexSortedChildren = 64,
124
+ ZIndexSortedChildren = 32,
134
125
 
135
126
  /**
136
127
  * Premultiplied Colors update
@@ -142,7 +133,7 @@ export enum UpdateType {
142
133
  * - `premultipliedColorBl`
143
134
  * - `premultipliedColorBr`
144
135
  */
145
- PremultipliedColors = 128,
136
+ PremultipliedColors = 64,
146
137
 
147
138
  /**
148
139
  * World Alpha update
@@ -151,7 +142,7 @@ export enum UpdateType {
151
142
  * CoreNode Properties Updated:
152
143
  * - `worldAlpha` = `parent.worldAlpha` * `alpha`
153
144
  */
154
- WorldAlpha = 256,
145
+ WorldAlpha = 128,
155
146
 
156
147
  /**
157
148
  * Render State update
@@ -160,7 +151,7 @@ export enum UpdateType {
160
151
  * CoreNode Properties Updated:
161
152
  * - `renderState`
162
153
  */
163
- RenderState = 512,
154
+ RenderState = 256,
164
155
 
165
156
  /**
166
157
  * Is Renderable update
@@ -169,22 +160,27 @@ export enum UpdateType {
169
160
  * CoreNode Properties Updated:
170
161
  * - `isRenderable`
171
162
  */
172
- IsRenderable = 1024,
163
+ IsRenderable = 512,
173
164
 
174
165
  /**
175
166
  * Render Texture update
176
167
  */
177
- RenderTexture = 2048,
168
+ RenderTexture = 1024,
178
169
 
179
170
  /**
180
171
  * Track if parent has render texture
181
172
  */
182
- ParentRenderTexture = 4096,
173
+ ParentRenderTexture = 2048,
183
174
 
184
175
  /**
185
176
  * Render Bounds update
186
177
  */
187
- RenderBounds = 8192,
178
+ RenderBounds = 4096,
179
+
180
+ /**
181
+ * RecalcUniforms
182
+ */
183
+ RecalcUniforms = 8192,
188
184
 
189
185
  /**
190
186
  * None
@@ -195,11 +191,6 @@ export enum UpdateType {
195
191
  * All
196
192
  */
197
193
  All = 14335,
198
-
199
- /**
200
- * RecalcUniforms
201
- */
202
- RecalcUniforms = 16384,
203
194
  }
204
195
 
205
196
  /**
@@ -424,15 +415,6 @@ export interface CoreNodeProps {
424
415
  */
425
416
  texture: Texture | null;
426
417
 
427
- /**
428
- * [Deprecated]: Prevents the texture from being cleaned up when the Node is removed
429
- *
430
- * @remarks
431
- * Please use the `preventCleanup` property on {@link TextureOptions} instead.
432
- *
433
- * @default false
434
- */
435
- preventCleanup: boolean;
436
418
  /**
437
419
  * Options to associate with the Node's Texture
438
420
  */
@@ -682,6 +664,12 @@ export interface CoreNodeProps {
682
664
  * are provided. Only works when createImageBitmap is supported on the browser.
683
665
  */
684
666
  srcY?: number;
667
+ /**
668
+ * Mark the node as interactive so we can perform hit tests on it
669
+ * when pointer events are registered.
670
+ * @default false
671
+ */
672
+ interactive?: boolean;
685
673
  /**
686
674
  * By enabling Strict bounds the renderer will not process & render child nodes of a node that is out of the visible area
687
675
  *
@@ -694,7 +682,7 @@ export interface CoreNodeProps {
694
682
  * This is a big performance gain but may be disabled in cases where the width of the parent node is
695
683
  * unknown and the render must process the child nodes regardless of the viewport status of the parent node
696
684
  *
697
- * @default false
685
+ * @default true
698
686
  */
699
687
  strictBounds: boolean;
700
688
  }
@@ -730,11 +718,13 @@ export class CoreNode extends EventEmitter {
730
718
  protected _id: number = getNewId();
731
719
  readonly props: CoreNodeProps;
732
720
 
721
+ private hasShaderUpdater = false;
722
+ private hasColorProps = false;
723
+
733
724
  public updateType = UpdateType.All;
734
725
  public childUpdateType = UpdateType.None;
735
726
 
736
727
  public globalTransform?: Matrix3d;
737
- public scaleRotateTransform?: Matrix3d;
738
728
  public localTransform?: Matrix3d;
739
729
  public sceneGlobalTransform?: Matrix3d;
740
730
  public renderCoords?: RenderCoords;
@@ -749,6 +739,8 @@ export class CoreNode extends EventEmitter {
749
739
  height: 0,
750
740
  valid: false,
751
741
  };
742
+ public textureCoords?: TextureCoords;
743
+ public updateTextureCoords?: boolean = false;
752
744
  public isRenderable = false;
753
745
  public renderState: CoreNodeRenderState = CoreNodeRenderState.Init;
754
746
 
@@ -761,65 +753,93 @@ export class CoreNode extends EventEmitter {
761
753
  public hasRTTupdates = false;
762
754
  public parentHasRenderTexture = false;
763
755
  public rttParent: CoreNode | null = null;
756
+ /**
757
+ * only used when rtt = true
758
+ */
759
+ public framebufferDimensions: Dimensions | null = null;
760
+
761
+ public destroyed = false;
764
762
 
765
763
  constructor(readonly stage: Stage, props: CoreNodeProps) {
766
764
  super();
767
765
 
768
- this.props = Object.assign({}, props, {
769
- parent: null,
770
- texture: null,
771
- shader: null,
772
- src: null,
773
- rtt: false,
774
- });
775
-
776
- // Assign props to instance
766
+ const p = (this.props = {} as CoreNodeProps);
767
+
768
+ // Fast-path assign only known keys
769
+ p.x = props.x;
770
+ p.y = props.y;
771
+ p.width = props.width;
772
+ p.height = props.height;
773
+ p.alpha = props.alpha;
774
+ p.autosize = props.autosize;
775
+ p.clipping = props.clipping;
776
+ p.color = props.color;
777
+
778
+ p.colorTop = props.colorTop;
779
+ p.colorBottom = props.colorBottom;
780
+ p.colorLeft = props.colorLeft;
781
+ p.colorRight = props.colorRight;
782
+ p.colorTl = props.colorTl;
783
+ p.colorTr = props.colorTr;
784
+ p.colorBl = props.colorBl;
785
+ p.colorBr = props.colorBr;
786
+
787
+ p.scaleX = props.scaleX;
788
+ p.scaleY = props.scaleY;
789
+ p.rotation = props.rotation;
790
+ p.pivotX = props.pivotX;
791
+ p.pivotY = props.pivotY;
792
+ p.mountX = props.mountX;
793
+ p.mountY = props.mountY;
794
+ p.mount = props.mount;
795
+ p.pivot = props.pivot;
796
+ p.strictBounds = props.strictBounds;
797
+
798
+ p.zIndex = props.zIndex;
799
+ p.zIndexLocked = props.zIndexLocked;
800
+ p.textureOptions = props.textureOptions;
801
+
802
+ p.data = props.data;
803
+ p.imageType = props.imageType;
804
+ p.srcX = props.srcX;
805
+ p.srcY = props.srcY;
806
+ p.srcWidth = props.srcWidth;
807
+ p.srcHeight = props.srcHeight;
808
+
809
+ p.parent = null;
810
+ p.texture = null;
811
+ p.shader = null;
812
+ p.src = null;
813
+ p.rtt = false;
814
+ p.boundsMargin = null;
815
+
816
+ // Assign props to instances
777
817
  this.parent = props.parent;
778
818
  this.texture = props.texture;
779
819
  this.shader = props.shader;
780
820
  this.src = props.src;
781
821
  this.rtt = props.rtt;
782
-
783
- if (props.boundsMargin) {
784
- this.boundsMargin = Array.isArray(props.boundsMargin)
785
- ? props.boundsMargin
786
- : [
787
- props.boundsMargin,
788
- props.boundsMargin,
789
- props.boundsMargin,
790
- props.boundsMargin,
791
- ];
792
- }
822
+ this.boundsMargin = props.boundsMargin;
823
+ this.interactive = props.interactive;
793
824
 
794
825
  this.setUpdateType(
795
- UpdateType.ScaleRotate |
796
- UpdateType.Local |
797
- UpdateType.RenderBounds |
798
- UpdateType.RenderState,
826
+ UpdateType.Local | UpdateType.RenderBounds | UpdateType.RenderState,
799
827
  );
800
828
 
801
- if (isProductionEnvironment() === false && props.preventCleanup === true) {
802
- console.warn(
803
- 'CoreNode.preventCleanup: Is deprecated and will be removed in upcoming release, please use textureOptions.preventCleanup instead',
804
- );
805
- }
806
-
807
829
  // if the default texture isn't loaded yet, wait for it to load
808
830
  // this only happens when the node is created before the stage is ready
809
- if (
810
- this.stage.defaultTexture &&
811
- this.stage.defaultTexture.state !== 'loaded'
812
- ) {
813
- this.stage.defaultTexture.once('loaded', () => {
814
- this.setUpdateType(UpdateType.IsRenderable);
815
- });
831
+ const dt = this.stage.defaultTexture;
832
+ if (dt !== null && dt.state !== 'loaded') {
833
+ dt.once('loaded', () => this.setUpdateType(UpdateType.IsRenderable));
816
834
  }
817
835
  }
818
836
 
819
837
  //#region Textures
820
838
  loadTexture(): void {
821
839
  const { texture } = this.props;
822
- assertTruthy(texture);
840
+ if (!texture) {
841
+ return;
842
+ }
823
843
 
824
844
  // If texture is already loaded / failed, trigger loaded event manually
825
845
  // so that users get a consistent event experience.
@@ -847,11 +867,9 @@ export class CoreNode extends EventEmitter {
847
867
  }
848
868
 
849
869
  if (texture.state === 'loaded') {
850
- assertTruthy(texture.dimensions);
851
- this.onTextureLoaded(texture, texture.dimensions);
870
+ this.onTextureLoaded(texture, texture.dimensions!);
852
871
  } else if (texture.state === 'failed') {
853
- assertTruthy(texture.error);
854
- this.onTextureFailed(texture, texture.error);
872
+ this.onTextureFailed(texture, texture.error!);
855
873
  } else if (texture.state === 'freed') {
856
874
  this.onTextureFreed(texture);
857
875
  }
@@ -859,12 +877,15 @@ export class CoreNode extends EventEmitter {
859
877
  }
860
878
 
861
879
  unloadTexture(): void {
862
- if (this.texture !== null) {
863
- this.texture.off('loaded', this.onTextureLoaded);
864
- this.texture.off('failed', this.onTextureFailed);
865
- this.texture.off('freed', this.onTextureFreed);
866
- this.texture.setRenderableOwner(this, false);
880
+ if (this.texture === null) {
881
+ return;
867
882
  }
883
+
884
+ const texture = this.texture;
885
+ texture.off('loaded', this.onTextureLoaded);
886
+ texture.off('failed', this.onTextureFailed);
887
+ texture.off('freed', this.onTextureFreed);
888
+ texture.setRenderableOwner(this, false);
868
889
  }
869
890
 
870
891
  autosizeNode(dimensions: Dimensions) {
@@ -874,7 +895,7 @@ export class CoreNode extends EventEmitter {
874
895
  }
875
896
  }
876
897
 
877
- private onTextureLoaded: TextureLoadedEventHandler = (_, dimensions) => {
898
+ protected onTextureLoaded: TextureLoadedEventHandler = (_, dimensions) => {
878
899
  this.autosizeNode(dimensions);
879
900
  this.setUpdateType(UpdateType.IsRenderable);
880
901
 
@@ -902,6 +923,9 @@ export class CoreNode extends EventEmitter {
902
923
  };
903
924
 
904
925
  private onTextureFailed: TextureFailedEventHandler = (_, error) => {
926
+ // immediately set isRenderable to false, so that we handle the error
927
+ // without waiting for the next frame loop
928
+ this.isRenderable = false;
905
929
  this.setUpdateType(UpdateType.IsRenderable);
906
930
 
907
931
  // If parent has a render texture, flag that we need to update
@@ -916,6 +940,9 @@ export class CoreNode extends EventEmitter {
916
940
  };
917
941
 
918
942
  private onTextureFreed: TextureFreedEventHandler = () => {
943
+ // immediately set isRenderable to false, so that we handle the error
944
+ // without waiting for the next frame loop
945
+ this.isRenderable = false;
919
946
  this.setUpdateType(UpdateType.IsRenderable);
920
947
 
921
948
  // If parent has a render texture, flag that we need to update
@@ -943,46 +970,30 @@ export class CoreNode extends EventEmitter {
943
970
  const parent = this.props.parent;
944
971
  if (!parent) return;
945
972
 
946
- if ((parent.updateType & UpdateType.Children) === 0) {
947
- // Inform the parent if it doesn’t already have a child update
948
- parent.setUpdateType(UpdateType.Children);
949
- }
973
+ parent.setUpdateType(UpdateType.Children);
950
974
  }
951
975
 
952
976
  sortChildren() {
953
977
  this.children.sort((a, b) => a.calcZIndex - b.calcZIndex);
954
978
  }
955
979
 
956
- updateScaleRotateTransform() {
957
- const { rotation, scaleX, scaleY } = this.props;
958
-
959
- // optimize simple translation cases
960
- if (rotation === 0 && scaleX === 1 && scaleY === 1) {
961
- this.scaleRotateTransform = undefined;
962
- return;
963
- }
964
-
965
- this.scaleRotateTransform = Matrix3d.rotate(
966
- rotation,
967
- this.scaleRotateTransform,
968
- ).scale(scaleX, scaleY);
969
- }
970
-
971
980
  updateLocalTransform() {
972
- const { x, y, width, height } = this.props;
973
- const mountTranslateX = this.props.mountX * width;
974
- const mountTranslateY = this.props.mountY * height;
981
+ const p = this.props;
982
+ const { x, y, width, height } = p;
983
+ const mountTranslateX = p.mountX * width;
984
+ const mountTranslateY = p.mountY * height;
975
985
 
976
- if (this.scaleRotateTransform) {
977
- const pivotTranslateX = this.props.pivotX * width;
978
- const pivotTranslateY = this.props.pivotY * height;
986
+ if (p.rotation !== 0 || p.scaleX !== 1 || p.scaleY !== 1) {
987
+ const pivotTranslateX = p.pivotX * width;
988
+ const pivotTranslateY = p.pivotY * height;
979
989
 
980
990
  this.localTransform = Matrix3d.translate(
981
991
  x - mountTranslateX + pivotTranslateX,
982
992
  y - mountTranslateY + pivotTranslateY,
983
993
  this.localTransform,
984
994
  )
985
- .multiply(this.scaleRotateTransform)
995
+ .rotate(p.rotation)
996
+ .scale(p.scaleX, p.scaleY)
986
997
  .translate(-pivotTranslateX, -pivotTranslateY);
987
998
  } else {
988
999
  this.localTransform = Matrix3d.translate(
@@ -993,11 +1004,11 @@ export class CoreNode extends EventEmitter {
993
1004
  }
994
1005
 
995
1006
  // Handle 'contain' resize mode
996
- const texture = this.props.texture;
1007
+ const texture = p.texture;
997
1008
  if (
998
1009
  texture &&
999
1010
  texture.dimensions &&
1000
- this.props.textureOptions?.resizeMode?.type === 'contain'
1011
+ p.textureOptions.resizeMode?.type === 'contain'
1001
1012
  ) {
1002
1013
  let resizeModeScaleX = 1;
1003
1014
  let resizeModeScaleY = 1;
@@ -1029,8 +1040,6 @@ export class CoreNode extends EventEmitter {
1029
1040
  .translate(extraX, extraY)
1030
1041
  .scale(resizeModeScaleX, resizeModeScaleY);
1031
1042
  }
1032
-
1033
- this.setUpdateType(UpdateType.Global);
1034
1043
  }
1035
1044
 
1036
1045
  /**
@@ -1038,27 +1047,34 @@ export class CoreNode extends EventEmitter {
1038
1047
  * @param delta
1039
1048
  */
1040
1049
  update(delta: number, parentClippingRect: RectWithValid): void {
1041
- if (this.updateType & UpdateType.ScaleRotate) {
1042
- this.updateScaleRotateTransform();
1043
- this.setUpdateType(UpdateType.Local);
1050
+ if (this.updateType === UpdateType.None) {
1051
+ return;
1044
1052
  }
1045
1053
 
1046
- if (this.updateType & UpdateType.Local) {
1047
- this.updateLocalTransform();
1048
- this.setUpdateType(UpdateType.Global);
1049
- }
1054
+ const props = this.props;
1055
+ const parent = props.parent;
1056
+ const parentHasRenderTexture = this.parentHasRenderTexture;
1057
+ const hasParent = props.parent !== null;
1050
1058
 
1051
- const parent = this.props.parent;
1052
1059
  let renderState: CoreNodeRenderState | null = null;
1053
1060
 
1061
+ let updateType = this.updateType;
1062
+ let childUpdateType = this.childUpdateType;
1063
+ let updateParent = false;
1064
+
1065
+ if (updateType & UpdateType.Local) {
1066
+ this.updateLocalTransform();
1067
+
1068
+ updateType |= UpdateType.Global;
1069
+ updateParent = hasParent;
1070
+ }
1071
+
1054
1072
  // Handle specific RTT updates at this node level
1055
- if (this.updateType & UpdateType.RenderTexture && this.rtt) {
1073
+ if (updateType & UpdateType.RenderTexture && this.rtt === true) {
1056
1074
  this.hasRTTupdates = true;
1057
1075
  }
1058
1076
 
1059
- if (this.updateType & UpdateType.Global) {
1060
- assertTruthy(this.localTransform);
1061
-
1077
+ if (updateType & UpdateType.Global) {
1062
1078
  if (this.parentHasRenderTexture === true && parent?.rtt === true) {
1063
1079
  // we are at the start of the RTT chain, so we need to reset the globalTransform
1064
1080
  // for correct RTT rendering
@@ -1067,7 +1083,7 @@ export class CoreNode extends EventEmitter {
1067
1083
  // Maintain a full scene global transform for bounds detection
1068
1084
  this.sceneGlobalTransform = Matrix3d.copy(
1069
1085
  parent?.globalTransform || Matrix3d.identity(),
1070
- ).multiply(this.localTransform);
1086
+ ).multiply(this.localTransform!);
1071
1087
  } else if (
1072
1088
  this.parentHasRenderTexture === true &&
1073
1089
  parent?.rtt === false
@@ -1076,50 +1092,53 @@ export class CoreNode extends EventEmitter {
1076
1092
  // so we need to propogate the sceneGlobalTransform of the parent
1077
1093
  // to maintain a full scene global transform for bounds detection
1078
1094
  this.sceneGlobalTransform = Matrix3d.copy(
1079
- parent?.sceneGlobalTransform || this.localTransform,
1080
- ).multiply(this.localTransform);
1095
+ parent?.sceneGlobalTransform || this.localTransform!,
1096
+ ).multiply(this.localTransform!);
1081
1097
 
1082
1098
  this.globalTransform = Matrix3d.copy(
1083
- parent?.globalTransform || this.localTransform,
1099
+ parent?.globalTransform || this.localTransform!,
1084
1100
  this.globalTransform,
1085
1101
  );
1086
1102
  } else {
1087
1103
  this.globalTransform = Matrix3d.copy(
1088
- parent?.globalTransform || this.localTransform,
1104
+ parent?.globalTransform || this.localTransform!,
1089
1105
  this.globalTransform,
1090
1106
  );
1091
1107
  }
1092
1108
 
1093
1109
  if (parent !== null) {
1094
- this.globalTransform.multiply(this.localTransform);
1110
+ this.globalTransform.multiply(this.localTransform!);
1095
1111
  }
1096
1112
  this.calculateRenderCoords();
1097
1113
  this.updateBoundingRect();
1098
1114
 
1099
- this.setUpdateType(
1115
+ updateType |=
1100
1116
  UpdateType.RenderState |
1101
- UpdateType.Children |
1102
- UpdateType.RecalcUniforms,
1103
- );
1104
- this.childUpdateType |= UpdateType.Global;
1117
+ UpdateType.Children |
1118
+ UpdateType.RecalcUniforms;
1119
+ updateParent = hasParent;
1120
+ childUpdateType |= UpdateType.Global;
1105
1121
 
1106
1122
  if (this.clipping === true) {
1107
- this.setUpdateType(UpdateType.Clipping | UpdateType.RenderBounds);
1108
- this.childUpdateType |= UpdateType.RenderBounds;
1123
+ updateType |= UpdateType.Clipping | UpdateType.RenderBounds;
1124
+ updateParent = hasParent;
1125
+ childUpdateType |= UpdateType.RenderBounds;
1109
1126
  }
1110
1127
  }
1111
1128
 
1112
- if (this.updateType & UpdateType.RenderBounds) {
1129
+ if (updateType & UpdateType.RenderBounds) {
1113
1130
  this.createRenderBounds();
1114
- this.setUpdateType(UpdateType.RenderState);
1115
- this.setUpdateType(UpdateType.Children);
1116
1131
 
1117
- this.childUpdateType |= UpdateType.RenderBounds;
1132
+ updateType |= UpdateType.RenderState | UpdateType.Children;
1133
+ updateParent = hasParent;
1134
+ childUpdateType |= UpdateType.RenderBounds;
1118
1135
  }
1119
1136
 
1120
- if (this.updateType & UpdateType.RenderState) {
1137
+ if (updateType & UpdateType.RenderState) {
1121
1138
  renderState = this.checkRenderBounds();
1122
- this.setUpdateType(UpdateType.IsRenderable);
1139
+
1140
+ updateType |= UpdateType.IsRenderable;
1141
+ updateParent = hasParent;
1123
1142
 
1124
1143
  // if we're not going out of bounds, update the render state
1125
1144
  // this is done so the update loop can finish before we mark a node
@@ -1129,96 +1148,98 @@ export class CoreNode extends EventEmitter {
1129
1148
  }
1130
1149
  }
1131
1150
 
1132
- if (this.updateType & UpdateType.WorldAlpha) {
1133
- if (parent) {
1134
- this.worldAlpha = parent.worldAlpha * this.props.alpha;
1135
- } else {
1136
- this.worldAlpha = this.props.alpha;
1137
- }
1138
- this.setUpdateType(
1151
+ if (updateType & UpdateType.WorldAlpha) {
1152
+ this.worldAlpha = ((parent && parent.worldAlpha) || 1) * props.alpha;
1153
+ updateType |=
1154
+ UpdateType.PremultipliedColors |
1139
1155
  UpdateType.Children |
1140
- UpdateType.PremultipliedColors |
1141
- UpdateType.IsRenderable,
1142
- );
1143
- this.childUpdateType |= UpdateType.WorldAlpha;
1156
+ UpdateType.IsRenderable;
1157
+ updateParent = hasParent;
1158
+ childUpdateType |= UpdateType.WorldAlpha;
1144
1159
  }
1145
1160
 
1146
- if (this.updateType & UpdateType.IsRenderable) {
1161
+ if (updateType & UpdateType.IsRenderable) {
1147
1162
  this.updateIsRenderable();
1148
1163
  }
1149
1164
 
1150
- if (this.updateType & UpdateType.Clipping) {
1165
+ if (updateType & UpdateType.Clipping) {
1151
1166
  this.calculateClippingRect(parentClippingRect);
1152
- this.setUpdateType(UpdateType.Children);
1167
+ updateType |= UpdateType.Children;
1168
+ updateParent = hasParent;
1153
1169
 
1154
- this.childUpdateType |= UpdateType.Clipping;
1155
- this.childUpdateType |= UpdateType.RenderBounds;
1170
+ childUpdateType |= UpdateType.Clipping | UpdateType.RenderBounds;
1156
1171
  }
1157
1172
 
1158
- if (this.updateType & UpdateType.PremultipliedColors) {
1159
- this.premultipliedColorTl = mergeColorAlphaPremultiplied(
1160
- this.props.colorTl,
1161
- this.worldAlpha,
1162
- true,
1163
- );
1173
+ if (updateType & UpdateType.PremultipliedColors) {
1174
+ const alpha = this.worldAlpha;
1164
1175
 
1165
- // If all the colors are the same just sent them all to the same value
1166
- if (
1167
- this.props.colorTl === this.props.colorTr &&
1168
- this.props.colorBl === this.props.colorBr &&
1169
- this.props.colorTl === this.props.colorBl
1170
- ) {
1176
+ const tl = props.colorTl;
1177
+ const tr = props.colorTr;
1178
+ const bl = props.colorBl;
1179
+ const br = props.colorBr;
1180
+
1181
+ // Fast equality check (covers all 4 corners)
1182
+ const same = tl === tr && tl === bl && tl === br;
1183
+
1184
+ const merged = mergeColorAlphaPremultiplied(tl, alpha, true);
1185
+
1186
+ this.premultipliedColorTl = merged;
1187
+
1188
+ if (same) {
1171
1189
  this.premultipliedColorTr =
1172
1190
  this.premultipliedColorBl =
1173
1191
  this.premultipliedColorBr =
1174
- this.premultipliedColorTl;
1192
+ merged;
1175
1193
  } else {
1176
1194
  this.premultipliedColorTr = mergeColorAlphaPremultiplied(
1177
- this.props.colorTr,
1178
- this.worldAlpha,
1195
+ tr,
1196
+ alpha,
1179
1197
  true,
1180
1198
  );
1181
1199
  this.premultipliedColorBl = mergeColorAlphaPremultiplied(
1182
- this.props.colorBl,
1183
- this.worldAlpha,
1200
+ bl,
1201
+ alpha,
1184
1202
  true,
1185
1203
  );
1186
1204
  this.premultipliedColorBr = mergeColorAlphaPremultiplied(
1187
- this.props.colorBr,
1188
- this.worldAlpha,
1205
+ br,
1206
+ alpha,
1189
1207
  true,
1190
1208
  );
1191
1209
  }
1192
1210
  }
1193
1211
 
1212
+ if (updateParent === true) {
1213
+ parent!.setUpdateType(UpdateType.Children);
1214
+ }
1194
1215
  // No need to update zIndex if there is no parent
1195
- if (parent !== null && this.updateType & UpdateType.CalculatedZIndex) {
1216
+ if (updateType & UpdateType.CalculatedZIndex && parent !== null) {
1196
1217
  this.calculateZIndex();
1197
1218
  // Tell parent to re-sort children
1198
1219
  parent.setUpdateType(UpdateType.ZIndexSortedChildren);
1199
1220
  }
1200
1221
 
1201
1222
  if (
1202
- this.props.strictBounds === true &&
1223
+ props.strictBounds === true &&
1203
1224
  this.renderState === CoreNodeRenderState.OutOfBounds
1204
1225
  ) {
1205
- this.updateType &= ~UpdateType.RenderBounds; // remove render bounds update
1226
+ updateType &= ~UpdateType.RenderBounds; // remove render bounds update
1206
1227
  return;
1207
1228
  }
1208
1229
 
1209
1230
  if (
1210
- this.shader?.update !== undefined &&
1211
- (this.updateType & UpdateType.Local ||
1212
- this.updateType & UpdateType.RecalcUniforms)
1231
+ updateType & UpdateType.RecalcUniforms &&
1232
+ this.hasShaderUpdater === true
1213
1233
  ) {
1214
- this.shader.update();
1234
+ //this exists because the boolean hasShaderUpdater === true
1235
+ this.shader!.update!();
1215
1236
  }
1216
1237
 
1217
- if (this.updateType & UpdateType.Children && this.children.length > 0) {
1238
+ if (updateType & UpdateType.Children && this.children.length > 0) {
1218
1239
  for (let i = 0, length = this.children.length; i < length; i++) {
1219
1240
  const child = this.children[i] as CoreNode;
1220
1241
 
1221
- child.setUpdateType(this.childUpdateType);
1242
+ child.setUpdateType(childUpdateType);
1222
1243
 
1223
1244
  if (child.updateType === 0) {
1224
1245
  continue;
@@ -1240,19 +1261,24 @@ export class CoreNode extends EventEmitter {
1240
1261
  }
1241
1262
 
1242
1263
  // If the node has an RTT parent and requires a texture re-render, inform the RTT parent
1243
- // if (this.parentHasRenderTexture && this.updateType & UpdateType.RenderTexture) {
1264
+ // if (this.parentHasRenderTexture && updateType & UpdateType.RenderTexture) {
1244
1265
  // @TODO have a more scoped down updateType for RTT updates
1245
- if (this.parentHasRenderTexture && this.updateType > 0) {
1266
+ if (parentHasRenderTexture === true) {
1246
1267
  this.notifyParentRTTOfUpdate();
1247
1268
  }
1248
1269
 
1249
1270
  // Sorting children MUST happen after children have been updated so
1250
1271
  // that they have the oppotunity to update their calculated zIndex.
1251
- if (this.updateType & UpdateType.ZIndexSortedChildren) {
1272
+ if (updateType & UpdateType.ZIndexSortedChildren) {
1252
1273
  // reorder z-index
1253
1274
  this.sortChildren();
1254
1275
  }
1255
1276
 
1277
+ if (this.updateTextureCoords === true) {
1278
+ this.updateTextureCoords = false;
1279
+ this.textureCoords = this.stage.renderer.getTextureCoords!(this);
1280
+ }
1281
+
1256
1282
  // If we're out of bounds, apply the render state now
1257
1283
  // this is done so nodes can finish their entire update loop before
1258
1284
  // being marked as out of bounds
@@ -1267,7 +1293,6 @@ export class CoreNode extends EventEmitter {
1267
1293
  // notify children that we are going out of bounds
1268
1294
  // we have to do this now before we stop processing the render tree
1269
1295
  this.notifyChildrenRTTOfUpdate(renderState);
1270
- // this.childUpdateType |= UpdateType.RenderState;
1271
1296
  }
1272
1297
  }
1273
1298
 
@@ -1284,15 +1309,6 @@ export class CoreNode extends EventEmitter {
1284
1309
  return rttNode;
1285
1310
  }
1286
1311
 
1287
- private getRTTParentRenderState(): CoreNodeRenderState | null {
1288
- const rttNode = this.rttParent || this.findParentRTTNode();
1289
- if (!rttNode) {
1290
- return null;
1291
- }
1292
-
1293
- return rttNode.renderState;
1294
- }
1295
-
1296
1312
  private notifyChildrenRTTOfUpdate(renderState: CoreNodeRenderState) {
1297
1313
  for (const child of this.children) {
1298
1314
  // force child to update render state
@@ -1302,7 +1318,7 @@ export class CoreNode extends EventEmitter {
1302
1318
  }
1303
1319
  }
1304
1320
 
1305
- private notifyParentRTTOfUpdate() {
1321
+ protected notifyParentRTTOfUpdate() {
1306
1322
  if (this.parent === null) {
1307
1323
  return;
1308
1324
  }
@@ -1323,20 +1339,16 @@ export class CoreNode extends EventEmitter {
1323
1339
  }
1324
1340
 
1325
1341
  checkRenderBounds(): CoreNodeRenderState {
1326
- assertTruthy(this.renderBound);
1327
- assertTruthy(this.strictBound);
1328
- assertTruthy(this.preloadBound);
1329
-
1330
- if (boundInsideBound(this.renderBound, this.strictBound)) {
1342
+ if (boundInsideBound(this.renderBound!, this.strictBound!)) {
1331
1343
  return CoreNodeRenderState.InViewport;
1332
1344
  }
1333
1345
 
1334
- if (boundInsideBound(this.renderBound, this.preloadBound)) {
1346
+ if (boundInsideBound(this.renderBound!, this.preloadBound!)) {
1335
1347
  return CoreNodeRenderState.InBounds;
1336
1348
  }
1337
1349
 
1338
1350
  // check if we're larger then our parent, we're definitely in the viewport
1339
- if (boundLargeThanBound(this.renderBound, this.strictBound)) {
1351
+ if (boundLargeThanBound(this.renderBound!, this.strictBound!)) {
1340
1352
  return CoreNodeRenderState.InViewport;
1341
1353
  }
1342
1354
 
@@ -1352,18 +1364,21 @@ export class CoreNode extends EventEmitter {
1352
1364
  }
1353
1365
 
1354
1366
  updateBoundingRect() {
1355
- const transform = this.sceneGlobalTransform || this.globalTransform;
1356
- const renderCoords = this.sceneRenderCoords || this.renderCoords;
1367
+ const transform = (this.sceneGlobalTransform ||
1368
+ this.globalTransform) as Matrix3d;
1369
+ const renderCoords = (this.sceneRenderCoords ||
1370
+ this.renderCoords) as RenderCoords;
1357
1371
 
1358
- assertTruthy(transform);
1359
- assertTruthy(renderCoords);
1360
-
1361
- const { tb, tc } = transform;
1362
- const { x1, y1, x3, y3 } = renderCoords;
1363
- if (tb === 0 || tc === 0) {
1364
- this.renderBound = createBound(x1, y1, x3, y3, this.renderBound);
1372
+ if (transform.tb === 0 || transform.tc === 0) {
1373
+ this.renderBound = createBound(
1374
+ renderCoords.x1,
1375
+ renderCoords.y1,
1376
+ renderCoords.x3,
1377
+ renderCoords.y3,
1378
+ this.renderBound,
1379
+ );
1365
1380
  } else {
1366
- const { x2, x4, y2, y4 } = renderCoords;
1381
+ const { x1, y1, x2, y2, x3, y3, x4, y4 } = renderCoords;
1367
1382
  this.renderBound = createBound(
1368
1383
  Math.min(x1, x2, x3, x4),
1369
1384
  Math.min(y1, y2, y3, y4),
@@ -1375,8 +1390,6 @@ export class CoreNode extends EventEmitter {
1375
1390
  }
1376
1391
 
1377
1392
  createRenderBounds(): void {
1378
- assertTruthy(this.stage);
1379
-
1380
1393
  if (this.parent !== null && this.parent.strictBound !== undefined) {
1381
1394
  // we have a parent with a valid bound, copy it
1382
1395
  const parentBound = this.parent.strictBound;
@@ -1458,7 +1471,10 @@ export class CoreNode extends EventEmitter {
1458
1471
  let needsTextureOwnership = false;
1459
1472
 
1460
1473
  // If the node is out of bounds or has an alpha of 0, it is not renderable
1461
- if (this.checkBasicRenderability() === false) {
1474
+ if (
1475
+ this.worldAlpha === 0 ||
1476
+ this.renderState <= CoreNodeRenderState.OutOfBounds
1477
+ ) {
1462
1478
  this.updateTextureOwnership(false);
1463
1479
  this.setRenderable(false);
1464
1480
  return;
@@ -1470,8 +1486,10 @@ export class CoreNode extends EventEmitter {
1470
1486
  // we're only renderable if the texture state is loaded
1471
1487
  newIsRenderable = this.texture.state === 'loaded';
1472
1488
  } else if (
1473
- (this.hasShader() || this.hasColorProperties() === true) &&
1474
- this.hasDimensions() === true
1489
+ // check shader
1490
+ (this.props.shader !== null || this.hasColorProps === true) &&
1491
+ // check dimensions
1492
+ (this.props.width !== 0 && this.props.height !== 0) === true
1475
1493
  ) {
1476
1494
  // This mean we have dimensions and a color set, so we can render a ColorTexture
1477
1495
  if (
@@ -1486,23 +1504,19 @@ export class CoreNode extends EventEmitter {
1486
1504
  this.setRenderable(newIsRenderable);
1487
1505
  }
1488
1506
 
1489
- /**
1490
- * Checks if the node is renderable based on world alpha, dimensions and out of bounds status.
1491
- */
1492
- checkBasicRenderability(): boolean {
1493
- if (this.worldAlpha === 0 || this.isOutOfBounds() === true) {
1494
- return false;
1495
- } else {
1496
- return true;
1497
- }
1498
- }
1499
-
1500
1507
  /**
1501
1508
  * Sets the renderable state and triggers changes if necessary.
1502
1509
  * @param isRenderable - The new renderable state
1503
1510
  */
1504
1511
  setRenderable(isRenderable: boolean) {
1505
1512
  this.isRenderable = isRenderable;
1513
+ if (
1514
+ isRenderable === true &&
1515
+ this.stage.calculateTextureCoord === true &&
1516
+ this.textureCoords === undefined
1517
+ ) {
1518
+ this.updateTextureCoords = true;
1519
+ }
1506
1520
  }
1507
1521
 
1508
1522
  /**
@@ -1512,44 +1526,16 @@ export class CoreNode extends EventEmitter {
1512
1526
  this.texture?.setRenderableOwner(this, isRenderable);
1513
1527
  }
1514
1528
 
1515
- /**
1516
- * Checks if the node is out of the viewport bounds.
1517
- */
1518
- isOutOfBounds(): boolean {
1519
- return this.renderState <= CoreNodeRenderState.OutOfBounds;
1520
- }
1521
-
1522
- /**
1523
- * Checks if the node has dimensions (width/height)
1524
- */
1525
- hasDimensions(): boolean {
1526
- return this.props.width !== 0 && this.props.height !== 0;
1527
- }
1528
-
1529
- /**
1530
- * Checks if the node has any color properties set.
1531
- */
1532
- hasColorProperties(): boolean {
1533
- return (
1534
- this.props.color !== 0 ||
1535
- this.props.colorTop !== 0 ||
1536
- this.props.colorBottom !== 0 ||
1537
- this.props.colorLeft !== 0 ||
1538
- this.props.colorRight !== 0 ||
1539
- this.props.colorTl !== 0 ||
1540
- this.props.colorTr !== 0 ||
1541
- this.props.colorBl !== 0 ||
1542
- this.props.colorBr !== 0
1543
- );
1544
- }
1545
-
1546
- hasShader(): boolean {
1547
- return this.props.shader !== null;
1548
- }
1549
-
1550
1529
  calculateRenderCoords() {
1551
1530
  const { width, height } = this;
1552
- const { tx, ty, ta, tb, tc, td } = this.globalTransform!;
1531
+
1532
+ const g = this.globalTransform!;
1533
+ const tx = g.tx,
1534
+ ty = g.ty,
1535
+ ta = g.ta,
1536
+ tb = g.tb,
1537
+ tc = g.tc,
1538
+ td = g.td;
1553
1539
  if (tb === 0 && tc === 0) {
1554
1540
  const minX = tx;
1555
1541
  const maxX = tx + width * ta;
@@ -1647,16 +1633,15 @@ export class CoreNode extends EventEmitter {
1647
1633
  * Finally, the node's parentClippingRect and clippingRect properties are updated.
1648
1634
  */
1649
1635
  calculateClippingRect(parentClippingRect: RectWithValid) {
1650
- assertTruthy(this.globalTransform);
1651
1636
  const { clippingRect, props, globalTransform: gt } = this;
1652
1637
  const { clipping } = props;
1653
- const isRotated = gt.tb !== 0 || gt.tc !== 0;
1638
+ const isRotated = gt!.tb !== 0 || gt!.tc !== 0;
1654
1639
 
1655
1640
  if (clipping === true && isRotated === false) {
1656
- clippingRect.x = gt.tx;
1657
- clippingRect.y = gt.ty;
1658
- clippingRect.width = this.width * gt.ta;
1659
- clippingRect.height = this.height * gt.td;
1641
+ clippingRect.x = gt!.tx;
1642
+ clippingRect.y = gt!.ty;
1643
+ clippingRect.width = this.width * gt!.ta;
1644
+ clippingRect.height = this.height * gt!.td;
1660
1645
  clippingRect.valid = true;
1661
1646
  } else {
1662
1647
  clippingRect.valid = false;
@@ -1688,78 +1673,76 @@ export class CoreNode extends EventEmitter {
1688
1673
  * Destroy the node and cleanup all resources
1689
1674
  */
1690
1675
  destroy(): void {
1691
- this.unloadTexture();
1692
-
1693
- this.clippingRect.valid = false;
1694
- this.isRenderable = false;
1676
+ if (this.destroyed === true) {
1677
+ return;
1678
+ }
1695
1679
 
1696
- this.renderCoords = undefined;
1697
- this.renderBound = undefined;
1698
- this.strictBound = undefined;
1699
- this.preloadBound = undefined;
1700
- this.globalTransform = undefined;
1701
- this.scaleRotateTransform = undefined;
1702
- this.localTransform = undefined;
1680
+ this.removeAllListeners();
1703
1681
 
1704
- this.props.texture = null;
1705
- this.props.shader = this.stage.defShaderNode;
1682
+ this.destroyed = true;
1683
+ this.unloadTexture();
1684
+ this.isRenderable = false;
1706
1685
 
1686
+ // Kill children
1707
1687
  while (this.children.length > 0) {
1708
- this.children[0]?.destroy();
1688
+ this.children[0]!.destroy();
1709
1689
  }
1710
1690
 
1711
- // This very action will also remove the node from the parent's children array
1712
- this.parent = null;
1691
+ const parent = this.parent;
1692
+ if (parent !== null) {
1693
+ const index = parent.children.indexOf(this);
1694
+ parent.children.splice(index, 1);
1695
+ parent.setUpdateType(
1696
+ UpdateType.Children | UpdateType.ZIndexSortedChildren,
1697
+ );
1698
+ }
1713
1699
 
1714
- if (this.rtt) {
1700
+ this.props.parent = null;
1701
+ this.props.texture = null;
1702
+
1703
+ if (this.rtt === true) {
1715
1704
  this.stage.renderer.removeRTTNode(this);
1716
1705
  }
1717
-
1718
- this.removeAllListeners();
1719
1706
  }
1720
1707
 
1721
1708
  renderQuads(renderer: CoreRenderer): void {
1722
- // Prevent quad rendering if parent has a render texture
1723
- // and renderer is not currently rendering to a texture
1724
- if (this.parentHasRenderTexture) {
1725
- if (!renderer.renderToTextureActive) {
1726
- return;
1727
- }
1728
- // Prevent quad rendering if parent render texture is not the active render texture
1729
- if (this.parentRenderTexture !== renderer.activeRttNode) {
1709
+ if (this.parentHasRenderTexture === true) {
1710
+ const rtt = renderer.renderToTextureActive;
1711
+ if (rtt === false || this.parentRenderTexture !== renderer.activeRttNode)
1730
1712
  return;
1731
- }
1732
1713
  }
1733
1714
 
1734
- assertTruthy(this.globalTransform);
1735
- assertTruthy(this.renderCoords);
1715
+ const p = this.props;
1716
+ const t = this.globalTransform!;
1717
+ const coords = this.renderCoords;
1718
+ const texture = p.texture || this.stage.defaultTexture;
1736
1719
 
1737
- // add to list of renderables to be sorted before rendering
1738
1720
  renderer.addQuad({
1739
- width: this.props.width,
1740
- height: this.props.height,
1721
+ width: p.width,
1722
+ height: p.height,
1741
1723
  colorTl: this.premultipliedColorTl,
1742
1724
  colorTr: this.premultipliedColorTr,
1743
1725
  colorBl: this.premultipliedColorBl,
1744
1726
  colorBr: this.premultipliedColorBr,
1745
- // if we do not have a texture, use the default texture
1746
- // this assumes any renderable node is either a distinct texture or a ColorTexture
1747
- texture: this.texture || this.stage.defaultTexture,
1748
- textureOptions: this.textureOptions,
1749
- zIndex: this.zIndex,
1750
- shader: this.props.shader as CoreShaderNode<any>,
1727
+ texture,
1728
+ textureOptions: p.textureOptions,
1729
+ textureCoords: this.textureCoords,
1730
+ shader: p.shader as CoreShaderNode<any>,
1751
1731
  alpha: this.worldAlpha,
1752
1732
  clippingRect: this.clippingRect,
1753
- tx: this.globalTransform.tx,
1754
- ty: this.globalTransform.ty,
1755
- ta: this.globalTransform.ta,
1756
- tb: this.globalTransform.tb,
1757
- tc: this.globalTransform.tc,
1758
- td: this.globalTransform.td,
1759
- renderCoords: this.renderCoords,
1760
- rtt: this.rtt,
1733
+ tx: t.tx,
1734
+ ty: t.ty,
1735
+ ta: t.ta,
1736
+ tb: t.tb,
1737
+ tc: t.tc,
1738
+ td: t.td,
1739
+ renderCoords: coords,
1740
+ rtt: p.rtt,
1741
+ zIndex: this.calcZIndex,
1761
1742
  parentHasRenderTexture: this.parentHasRenderTexture,
1762
- framebufferDimensions: this.framebufferDimensions,
1743
+ framebufferDimensions: this.parentHasRenderTexture
1744
+ ? this.parentFramebufferDimensions
1745
+ : null,
1763
1746
  });
1764
1747
  }
1765
1748
 
@@ -1820,14 +1803,16 @@ export class CoreNode extends EventEmitter {
1820
1803
 
1821
1804
  set width(value: number) {
1822
1805
  if (this.props.width !== value) {
1806
+ this.textureCoords = undefined;
1823
1807
  this.props.width = value;
1824
1808
  this.setUpdateType(UpdateType.Local);
1825
1809
 
1826
- if (this.props.rtt) {
1827
- this.texture = this.stage.txManager.createTexture('RenderTexture', {
1828
- width: this.width,
1829
- height: this.height,
1830
- });
1810
+ if (this.props.rtt === true) {
1811
+ this.framebufferDimensions!.width = value;
1812
+ this.texture = this.stage.txManager.createTexture(
1813
+ 'RenderTexture',
1814
+ this.framebufferDimensions!,
1815
+ );
1831
1816
 
1832
1817
  this.setUpdateType(UpdateType.RenderTexture);
1833
1818
  }
@@ -1840,14 +1825,16 @@ export class CoreNode extends EventEmitter {
1840
1825
 
1841
1826
  set height(value: number) {
1842
1827
  if (this.props.height !== value) {
1828
+ this.textureCoords = undefined;
1843
1829
  this.props.height = value;
1844
1830
  this.setUpdateType(UpdateType.Local);
1845
1831
 
1846
- if (this.props.rtt) {
1847
- this.texture = this.stage.txManager.createTexture('RenderTexture', {
1848
- width: this.width,
1849
- height: this.height,
1850
- });
1832
+ if (this.props.rtt === true) {
1833
+ this.framebufferDimensions!.height = value;
1834
+ this.texture = this.stage.txManager.createTexture(
1835
+ 'RenderTexture',
1836
+ this.framebufferDimensions!,
1837
+ );
1851
1838
 
1852
1839
  this.setUpdateType(UpdateType.RenderTexture);
1853
1840
  }
@@ -1874,7 +1861,7 @@ export class CoreNode extends EventEmitter {
1874
1861
  set scaleX(value: number) {
1875
1862
  if (this.props.scaleX !== value) {
1876
1863
  this.props.scaleX = value;
1877
- this.setUpdateType(UpdateType.ScaleRotate);
1864
+ this.setUpdateType(UpdateType.Local);
1878
1865
  }
1879
1866
  }
1880
1867
 
@@ -1885,7 +1872,7 @@ export class CoreNode extends EventEmitter {
1885
1872
  set scaleY(value: number) {
1886
1873
  if (this.props.scaleY !== value) {
1887
1874
  this.props.scaleY = value;
1888
- this.setUpdateType(UpdateType.ScaleRotate);
1875
+ this.setUpdateType(UpdateType.Local);
1889
1876
  }
1890
1877
  }
1891
1878
 
@@ -1966,7 +1953,7 @@ export class CoreNode extends EventEmitter {
1966
1953
  set rotation(value: number) {
1967
1954
  if (this.props.rotation !== value) {
1968
1955
  this.props.rotation = value;
1969
- this.setUpdateType(UpdateType.ScaleRotate);
1956
+ this.setUpdateType(UpdateType.Local);
1970
1957
  }
1971
1958
  }
1972
1959
 
@@ -1994,11 +1981,20 @@ export class CoreNode extends EventEmitter {
1994
1981
  }
1995
1982
 
1996
1983
  get boundsMargin(): number | [number, number, number, number] | null {
1997
- return (
1998
- this.props.boundsMargin ??
1999
- this.parent?.boundsMargin ??
2000
- this.stage.boundsMargin
2001
- );
1984
+ const props = this.props;
1985
+ if (props.boundsMargin !== null) {
1986
+ return props.boundsMargin;
1987
+ }
1988
+
1989
+ const parent = this.parent;
1990
+ if (parent !== null) {
1991
+ const margin = parent.boundsMargin;
1992
+ if (margin !== undefined) {
1993
+ return margin;
1994
+ }
1995
+ }
1996
+
1997
+ return this.stage.boundsMargin;
2002
1998
  }
2003
1999
 
2004
2000
  set boundsMargin(value: number | [number, number, number, number] | null) {
@@ -2035,11 +2031,18 @@ export class CoreNode extends EventEmitter {
2035
2031
  }
2036
2032
 
2037
2033
  set color(value: number) {
2038
- this.colorTop = value;
2039
- this.colorBottom = value;
2040
- this.colorLeft = value;
2041
- this.colorRight = value;
2042
- this.props.color = value;
2034
+ const p = this.props;
2035
+ if (p.color === value) return;
2036
+
2037
+ p.color = value;
2038
+
2039
+ const has = value > 0;
2040
+ this.hasColorProps = has;
2041
+
2042
+ if (p.colorTop !== value) this.colorTop = value;
2043
+ if (p.colorBottom !== value) this.colorBottom = value;
2044
+ if (p.colorLeft !== value) this.colorLeft = value;
2045
+ if (p.colorRight !== value) this.colorRight = value;
2043
2046
 
2044
2047
  this.setUpdateType(UpdateType.PremultipliedColors);
2045
2048
  }
@@ -2054,6 +2057,7 @@ export class CoreNode extends EventEmitter {
2054
2057
  this.colorTr = value;
2055
2058
  }
2056
2059
  this.props.colorTop = value;
2060
+ this.hasColorProps = value > 0;
2057
2061
  this.setUpdateType(UpdateType.PremultipliedColors);
2058
2062
  }
2059
2063
 
@@ -2067,6 +2071,7 @@ export class CoreNode extends EventEmitter {
2067
2071
  this.colorBr = value;
2068
2072
  }
2069
2073
  this.props.colorBottom = value;
2074
+ this.hasColorProps = value > 0;
2070
2075
  this.setUpdateType(UpdateType.PremultipliedColors);
2071
2076
  }
2072
2077
 
@@ -2080,6 +2085,7 @@ export class CoreNode extends EventEmitter {
2080
2085
  this.colorBl = value;
2081
2086
  }
2082
2087
  this.props.colorLeft = value;
2088
+ this.hasColorProps = value > 0;
2083
2089
  this.setUpdateType(UpdateType.PremultipliedColors);
2084
2090
  }
2085
2091
 
@@ -2093,6 +2099,7 @@ export class CoreNode extends EventEmitter {
2093
2099
  this.colorBr = value;
2094
2100
  }
2095
2101
  this.props.colorRight = value;
2102
+ this.hasColorProps = value > 0;
2096
2103
  this.setUpdateType(UpdateType.PremultipliedColors);
2097
2104
  }
2098
2105
 
@@ -2102,6 +2109,7 @@ export class CoreNode extends EventEmitter {
2102
2109
 
2103
2110
  set colorTl(value: number) {
2104
2111
  this.props.colorTl = value;
2112
+ this.hasColorProps = value > 0;
2105
2113
  this.setUpdateType(UpdateType.PremultipliedColors);
2106
2114
  }
2107
2115
 
@@ -2111,6 +2119,7 @@ export class CoreNode extends EventEmitter {
2111
2119
 
2112
2120
  set colorTr(value: number) {
2113
2121
  this.props.colorTr = value;
2122
+ this.hasColorProps = value > 0;
2114
2123
  this.setUpdateType(UpdateType.PremultipliedColors);
2115
2124
  }
2116
2125
 
@@ -2120,6 +2129,7 @@ export class CoreNode extends EventEmitter {
2120
2129
 
2121
2130
  set colorBl(value: number) {
2122
2131
  this.props.colorBl = value;
2132
+ this.hasColorProps = value > 0;
2123
2133
  this.setUpdateType(UpdateType.PremultipliedColors);
2124
2134
  }
2125
2135
 
@@ -2129,6 +2139,7 @@ export class CoreNode extends EventEmitter {
2129
2139
 
2130
2140
  set colorBr(value: number) {
2131
2141
  this.props.colorBr = value;
2142
+ this.hasColorProps = value > 0;
2132
2143
  this.setUpdateType(UpdateType.PremultipliedColors);
2133
2144
  }
2134
2145
 
@@ -2170,10 +2181,6 @@ export class CoreNode extends EventEmitter {
2170
2181
  this.props.parent = newParent;
2171
2182
  if (oldParent) {
2172
2183
  const index = oldParent.children.indexOf(this);
2173
- assertTruthy(
2174
- index !== -1,
2175
- "CoreNode.parent: Node not found in old parent's children!",
2176
- );
2177
2184
  oldParent.children.splice(index, 1);
2178
2185
  oldParent.setUpdateType(
2179
2186
  UpdateType.Children | UpdateType.ZIndexSortedChildren,
@@ -2193,26 +2200,11 @@ export class CoreNode extends EventEmitter {
2193
2200
  this.applyRTTInheritance(newParent);
2194
2201
  }
2195
2202
  }
2196
- this.updateScaleRotateTransform();
2197
2203
 
2198
2204
  // fetch render bounds from parent
2199
2205
  this.setUpdateType(UpdateType.RenderBounds | UpdateType.Children);
2200
2206
  }
2201
2207
 
2202
- get preventCleanup(): boolean {
2203
- return this.props.textureOptions.preventCleanup || false;
2204
- }
2205
-
2206
- set preventCleanup(value: boolean) {
2207
- if (isProductionEnvironment() === false) {
2208
- console.warn(
2209
- 'CoreNode.preventCleanup: Is deprecated and will be removed in upcoming release, please use textureOptions.preventCleanup instead',
2210
- );
2211
- }
2212
-
2213
- this.props.textureOptions.preventCleanup = value;
2214
- }
2215
-
2216
2208
  get rtt(): boolean {
2217
2209
  return this.props.rtt;
2218
2210
  }
@@ -2237,11 +2229,14 @@ export class CoreNode extends EventEmitter {
2237
2229
  }
2238
2230
  }
2239
2231
  private initRenderTexture() {
2240
- this.texture = this.stage.txManager.createTexture('RenderTexture', {
2232
+ this.framebufferDimensions = {
2241
2233
  width: this.width,
2242
2234
  height: this.height,
2243
- });
2244
-
2235
+ };
2236
+ this.texture = this.stage.txManager.createTexture(
2237
+ 'RenderTexture',
2238
+ this.framebufferDimensions,
2239
+ );
2245
2240
  this.stage.renderer.renderToTexture(this);
2246
2241
  }
2247
2242
 
@@ -2251,6 +2246,7 @@ export class CoreNode extends EventEmitter {
2251
2246
 
2252
2247
  this.hasRTTupdates = false;
2253
2248
  this.texture = null;
2249
+ this.framebufferDimensions = null;
2254
2250
  }
2255
2251
 
2256
2252
  private markChildrenWithRTT(node: CoreNode | null = null) {
@@ -2300,13 +2296,17 @@ export class CoreNode extends EventEmitter {
2300
2296
  return;
2301
2297
  }
2302
2298
  if (shader === null) {
2299
+ this.hasShaderUpdater = false;
2303
2300
  this.props.shader = this.stage.defShaderNode;
2304
2301
  this.setUpdateType(UpdateType.IsRenderable);
2305
2302
  return;
2306
2303
  }
2307
- shader.attachNode(this);
2304
+ if (shader.shaderKey !== 'default') {
2305
+ this.hasShaderUpdater = shader.update !== undefined;
2306
+ shader.attachNode(this);
2307
+ }
2308
2308
  this.props.shader = shader;
2309
- this.setUpdateType(UpdateType.IsRenderable);
2309
+ this.setUpdateType(UpdateType.IsRenderable | UpdateType.RecalcUniforms);
2310
2310
  }
2311
2311
 
2312
2312
  get src(): string | null {
@@ -2382,16 +2382,14 @@ export class CoreNode extends EventEmitter {
2382
2382
  }
2383
2383
 
2384
2384
  /**
2385
- * Returns the framebuffer dimensions of the node.
2386
- * If the node has a render texture, the dimensions are the same as the node's dimensions.
2387
- * If the node does not have a render texture, the dimensions are inherited from the parent.
2388
- * If the node parent has a render texture and the node is a render texture, the nodes dimensions are used.
2385
+ * Returns the framebuffer dimensions of the RTT parent
2389
2386
  */
2390
- get framebufferDimensions(): Dimensions {
2391
- if (this.parentHasRenderTexture && !this.rtt && this.parent) {
2392
- return this.parent.framebufferDimensions;
2387
+ get parentFramebufferDimensions(): Dimensions {
2388
+ if (this.rttParent !== null) {
2389
+ return this.rttParent.framebufferDimensions as Dimensions;
2393
2390
  }
2394
- return { width: this.width, height: this.height };
2391
+ this.rttParent = this.findParentRTTNode() as CoreNode;
2392
+ return this.rttParent.framebufferDimensions as Dimensions;
2395
2393
  }
2396
2394
 
2397
2395
  /**
@@ -2419,10 +2417,10 @@ export class CoreNode extends EventEmitter {
2419
2417
 
2420
2418
  const oldTexture = this.props.texture;
2421
2419
  if (oldTexture) {
2422
- oldTexture.setRenderableOwner(this, false);
2423
2420
  this.unloadTexture();
2424
2421
  }
2425
2422
 
2423
+ this.textureCoords = undefined;
2426
2424
  this.props.texture = value;
2427
2425
  if (value !== null) {
2428
2426
  value.setRenderableOwner(this, this.isRenderable);
@@ -2440,6 +2438,23 @@ export class CoreNode extends EventEmitter {
2440
2438
  return this.props.textureOptions;
2441
2439
  }
2442
2440
 
2441
+ set interactive(value: boolean | undefined) {
2442
+ this.props.interactive = value;
2443
+ // Update Stage's interactive Set
2444
+ if (value === true) {
2445
+ this.stage.interactiveNodes.add(this);
2446
+ }
2447
+ }
2448
+
2449
+ get interactive(): boolean | undefined {
2450
+ return this.props.interactive;
2451
+ }
2452
+
2453
+ setRTTUpdates(type: number) {
2454
+ this.hasRTTupdates = true;
2455
+ this.parent?.setRTTUpdates(type);
2456
+ }
2457
+
2443
2458
  get strictBounds(): boolean {
2444
2459
  return this.props.strictBounds;
2445
2460
  }