@lightningtv/renderer 2.16.1 → 3.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. package/NOTICE +4 -0
  2. package/README.md +22 -28
  3. package/dist/exports/canvas-shaders.js +0 -16
  4. package/dist/exports/canvas-shaders.js.map +1 -1
  5. package/dist/exports/canvas.d.ts +8 -2
  6. package/dist/exports/canvas.js +8 -20
  7. package/dist/exports/canvas.js.map +1 -1
  8. package/dist/exports/index.d.ts +18 -13
  9. package/dist/exports/index.js +9 -27
  10. package/dist/exports/index.js.map +1 -1
  11. package/dist/exports/inspector.js +0 -18
  12. package/dist/exports/inspector.js.map +1 -1
  13. package/dist/exports/utils.d.ts +2 -1
  14. package/dist/exports/utils.js +2 -19
  15. package/dist/exports/utils.js.map +1 -1
  16. package/dist/exports/webgl-shaders.js +0 -16
  17. package/dist/exports/webgl-shaders.js.map +1 -1
  18. package/dist/exports/webgl.d.ts +11 -2
  19. package/dist/exports/webgl.js +11 -20
  20. package/dist/exports/webgl.js.map +1 -1
  21. package/dist/src/common/CommonTypes.d.ts +15 -3
  22. package/dist/src/common/CommonTypes.js +0 -18
  23. package/dist/src/common/CommonTypes.js.map +1 -1
  24. package/dist/src/common/EventEmitter.js +0 -18
  25. package/dist/src/common/EventEmitter.js.map +1 -1
  26. package/dist/src/common/IEventEmitter.js +0 -16
  27. package/dist/src/common/IEventEmitter.js.map +1 -1
  28. package/dist/src/core/Autosizer.d.ts +35 -0
  29. package/dist/src/core/Autosizer.js +178 -0
  30. package/dist/src/core/Autosizer.js.map +1 -0
  31. package/dist/src/core/CoreNode.d.ts +138 -105
  32. package/dist/src/core/CoreNode.js +805 -526
  33. package/dist/src/core/CoreNode.js.map +1 -1
  34. package/dist/src/core/CoreShaderManager.d.ts +29 -73
  35. package/dist/src/core/CoreShaderManager.js +92 -97
  36. package/dist/src/core/CoreShaderManager.js.map +1 -1
  37. package/dist/src/core/CoreTextNode.d.ts +75 -87
  38. package/dist/src/core/CoreTextNode.js +380 -258
  39. package/dist/src/core/CoreTextNode.js.map +1 -1
  40. package/dist/src/core/CoreTextureManager.d.ts +18 -3
  41. package/dist/src/core/CoreTextureManager.js +63 -107
  42. package/dist/src/core/CoreTextureManager.js.map +1 -1
  43. package/dist/src/core/Stage.d.ts +82 -55
  44. package/dist/src/core/Stage.js +410 -247
  45. package/dist/src/core/Stage.js.map +1 -1
  46. package/dist/src/core/TextureError.d.ts +11 -0
  47. package/dist/src/core/TextureError.js +37 -0
  48. package/dist/src/core/TextureError.js.map +1 -0
  49. package/dist/src/core/TextureMemoryManager.d.ts +4 -3
  50. package/dist/src/core/TextureMemoryManager.js +103 -135
  51. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  52. package/dist/src/core/animations/AnimationManager.js +0 -18
  53. package/dist/src/core/animations/AnimationManager.js.map +1 -1
  54. package/dist/src/core/animations/CoreAnimation.d.ts +3 -4
  55. package/dist/src/core/animations/CoreAnimation.js +9 -76
  56. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  57. package/dist/src/core/animations/CoreAnimationController.js +0 -18
  58. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  59. package/dist/src/core/lib/ContextSpy.js +0 -18
  60. package/dist/src/core/lib/ContextSpy.js.map +1 -1
  61. package/dist/src/core/lib/ImageWorker.d.ts +2 -2
  62. package/dist/src/core/lib/ImageWorker.js +31 -30
  63. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  64. package/dist/src/core/lib/Matrix3d.d.ts +1 -0
  65. package/dist/src/core/lib/Matrix3d.js +7 -19
  66. package/dist/src/core/lib/Matrix3d.js.map +1 -1
  67. package/dist/src/core/lib/RenderCoords.d.ts +9 -10
  68. package/dist/src/core/lib/RenderCoords.js +27 -55
  69. package/dist/src/core/lib/RenderCoords.js.map +1 -1
  70. package/dist/src/core/lib/WebGlContextWrapper.d.ts +147 -59
  71. package/dist/src/core/lib/WebGlContextWrapper.js +252 -158
  72. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  73. package/dist/src/core/lib/collectionUtils.d.ts +5 -0
  74. package/dist/src/core/lib/collectionUtils.js +82 -0
  75. package/dist/src/core/lib/collectionUtils.js.map +1 -0
  76. package/dist/src/core/lib/colorCache.d.ts +1 -0
  77. package/dist/src/core/lib/colorCache.js +19 -0
  78. package/dist/src/core/lib/colorCache.js.map +1 -0
  79. package/dist/src/core/{renderers/canvas/internal/ColorUtils.d.ts → lib/colorParser.d.ts} +2 -0
  80. package/dist/src/core/{renderers/canvas/internal/ColorUtils.js → lib/colorParser.js} +15 -19
  81. package/dist/src/core/lib/colorParser.js.map +1 -0
  82. package/dist/src/core/lib/textureCompression.d.ts +14 -2
  83. package/dist/src/core/lib/textureCompression.js +320 -86
  84. package/dist/src/core/lib/textureCompression.js.map +1 -1
  85. package/dist/src/core/lib/textureSvg.js +0 -18
  86. package/dist/src/core/lib/textureSvg.js.map +1 -1
  87. package/dist/src/core/lib/utils.d.ts +8 -2
  88. package/dist/src/core/lib/utils.js +21 -20
  89. package/dist/src/core/lib/utils.js.map +1 -1
  90. package/dist/src/core/lib/validateImageBitmap.d.ts +2 -1
  91. package/dist/src/core/lib/validateImageBitmap.js +4 -4
  92. package/dist/src/core/lib/validateImageBitmap.js.map +1 -1
  93. package/dist/src/core/platforms/Platform.d.ts +5 -0
  94. package/dist/src/core/platforms/Platform.js +0 -18
  95. package/dist/src/core/platforms/Platform.js.map +1 -1
  96. package/dist/src/core/platforms/web/WebPlatform.d.ts +1 -0
  97. package/dist/src/core/platforms/web/WebPlatform.js +39 -7
  98. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -1
  99. package/dist/src/core/renderers/CoreContextTexture.d.ts +1 -0
  100. package/dist/src/core/renderers/CoreContextTexture.js +0 -18
  101. package/dist/src/core/renderers/CoreContextTexture.js.map +1 -1
  102. package/dist/src/core/renderers/CoreRenderOp.js +0 -18
  103. package/dist/src/core/renderers/CoreRenderOp.js.map +1 -1
  104. package/dist/src/core/renderers/CoreRenderer.d.ts +25 -23
  105. package/dist/src/core/renderers/CoreRenderer.js +1 -24
  106. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  107. package/dist/src/core/renderers/CoreShaderNode.d.ts +10 -0
  108. package/dist/src/core/renderers/CoreShaderNode.js +19 -2
  109. package/dist/src/core/renderers/CoreShaderNode.js.map +1 -1
  110. package/dist/src/core/renderers/CoreShaderProgram.js +0 -18
  111. package/dist/src/core/renderers/CoreShaderProgram.js.map +1 -1
  112. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +3 -5
  113. package/dist/src/core/renderers/canvas/CanvasRenderer.js +86 -83
  114. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  115. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +2 -17
  116. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
  117. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +3 -2
  118. package/dist/src/core/renderers/canvas/CanvasTexture.js +17 -31
  119. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -1
  120. package/dist/src/core/renderers/webgl/SdfRenderOp.d.ts +33 -0
  121. package/dist/src/core/renderers/webgl/SdfRenderOp.js +80 -0
  122. package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -0
  123. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +2 -0
  124. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +14 -24
  125. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -1
  126. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +13 -0
  127. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +34 -23
  128. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -1
  129. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +16 -6
  130. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +102 -67
  131. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  132. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +31 -19
  133. package/dist/src/core/renderers/webgl/WebGlRenderer.js +297 -200
  134. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  135. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +2 -4
  136. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  137. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +5 -5
  138. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +61 -34
  139. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  140. package/dist/src/core/renderers/webgl/internal/BufferCollection.d.ts +1 -0
  141. package/dist/src/core/renderers/webgl/internal/BufferCollection.js +12 -21
  142. package/dist/src/core/renderers/webgl/internal/BufferCollection.js.map +1 -1
  143. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +0 -18
  144. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
  145. package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +32 -5
  146. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +50 -18
  147. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  148. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js +0 -18
  149. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js.map +1 -1
  150. package/dist/src/core/shaders/canvas/Border.d.ts +8 -2
  151. package/dist/src/core/shaders/canvas/Border.js +67 -41
  152. package/dist/src/core/shaders/canvas/Border.js.map +1 -1
  153. package/dist/src/core/shaders/canvas/HolePunch.js +3 -19
  154. package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -1
  155. package/dist/src/core/shaders/canvas/LinearGradient.js +2 -18
  156. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -1
  157. package/dist/src/core/shaders/canvas/RadialGradient.js +5 -21
  158. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
  159. package/dist/src/core/shaders/canvas/Rounded.js +1 -17
  160. package/dist/src/core/shaders/canvas/Rounded.js.map +1 -1
  161. package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +6 -3
  162. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +40 -26
  163. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  164. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +2 -3
  165. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +43 -23
  166. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
  167. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +4 -18
  168. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
  169. package/dist/src/core/shaders/canvas/Shadow.js +0 -16
  170. package/dist/src/core/shaders/canvas/Shadow.js.map +1 -1
  171. package/dist/src/core/shaders/canvas/utils/render.d.ts +1 -1
  172. package/dist/src/core/shaders/canvas/utils/render.js +31 -34
  173. package/dist/src/core/shaders/canvas/utils/render.js.map +1 -1
  174. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +11 -2
  175. package/dist/src/core/shaders/templates/BorderTemplate.js +30 -26
  176. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -1
  177. package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +2 -2
  178. package/dist/src/core/shaders/templates/HolePunchTemplate.js +2 -18
  179. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -1
  180. package/dist/src/core/shaders/templates/LinearGradientTemplate.js +0 -16
  181. package/dist/src/core/shaders/templates/LinearGradientTemplate.js.map +1 -1
  182. package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +8 -6
  183. package/dist/src/core/shaders/templates/RadialGradientTemplate.js +2 -18
  184. package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +1 -1
  185. package/dist/src/core/shaders/templates/RoundedTemplate.js +0 -16
  186. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -1
  187. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js +0 -16
  188. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js.map +1 -1
  189. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +1 -2
  190. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js +3 -17
  191. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js.map +1 -1
  192. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js +0 -16
  193. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js.map +1 -1
  194. package/dist/src/core/shaders/templates/ShadowTemplate.js +0 -16
  195. package/dist/src/core/shaders/templates/ShadowTemplate.js.map +1 -1
  196. package/dist/src/core/shaders/utils.js +0 -16
  197. package/dist/src/core/shaders/utils.js.map +1 -1
  198. package/dist/src/core/shaders/webgl/Border.js +75 -31
  199. package/dist/src/core/shaders/webgl/Border.js.map +1 -1
  200. package/dist/src/core/shaders/webgl/Default.js +6 -41
  201. package/dist/src/core/shaders/webgl/Default.js.map +1 -1
  202. package/dist/src/core/shaders/webgl/HolePunch.js +2 -18
  203. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -1
  204. package/dist/src/core/shaders/webgl/LinearGradient.js +68 -30
  205. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  206. package/dist/src/core/shaders/webgl/RadialGradient.js +52 -45
  207. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  208. package/dist/src/core/shaders/webgl/Rounded.js +25 -23
  209. package/dist/src/core/shaders/webgl/Rounded.js.map +1 -1
  210. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +110 -48
  211. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  212. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +114 -54
  213. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  214. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +73 -34
  215. package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -1
  216. package/dist/src/core/shaders/webgl/SdfShader.d.ts +0 -2
  217. package/dist/src/core/shaders/webgl/SdfShader.js +7 -35
  218. package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -1
  219. package/dist/src/core/shaders/webgl/Shadow.js +39 -34
  220. package/dist/src/core/shaders/webgl/Shadow.js.map +1 -1
  221. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +59 -0
  222. package/dist/src/core/text-rendering/CanvasFontHandler.js +206 -0
  223. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -0
  224. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +17 -0
  225. package/dist/src/core/text-rendering/CanvasTextRenderer.js +139 -0
  226. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -0
  227. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +167 -0
  228. package/dist/src/core/text-rendering/SdfFontHandler.js +371 -0
  229. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -0
  230. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +18 -0
  231. package/dist/src/core/text-rendering/SdfTextRenderer.js +301 -0
  232. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -0
  233. package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +18 -0
  234. package/dist/src/core/text-rendering/TextLayoutEngine.js +380 -0
  235. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -0
  236. package/dist/src/core/text-rendering/TextRenderer.d.ts +384 -0
  237. package/dist/src/core/text-rendering/TextRenderer.js +2 -0
  238. package/dist/src/core/text-rendering/TextRenderer.js.map +1 -0
  239. package/dist/src/core/text-rendering/Utils.d.ts +30 -0
  240. package/dist/src/core/text-rendering/Utils.js +66 -0
  241. package/dist/src/core/text-rendering/Utils.js.map +1 -0
  242. package/dist/src/core/textures/ColorTexture.d.ts +1 -1
  243. package/dist/src/core/textures/ColorTexture.js +3 -22
  244. package/dist/src/core/textures/ColorTexture.js.map +1 -1
  245. package/dist/src/core/textures/ImageTexture.d.ts +10 -3
  246. package/dist/src/core/textures/ImageTexture.js +33 -62
  247. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  248. package/dist/src/core/textures/NoiseTexture.d.ts +3 -3
  249. package/dist/src/core/textures/NoiseTexture.js +8 -26
  250. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  251. package/dist/src/core/textures/RenderTexture.d.ts +7 -7
  252. package/dist/src/core/textures/RenderTexture.js +12 -30
  253. package/dist/src/core/textures/RenderTexture.js.map +1 -1
  254. package/dist/src/core/textures/SubTexture.d.ts +6 -8
  255. package/dist/src/core/textures/SubTexture.js +19 -55
  256. package/dist/src/core/textures/SubTexture.js.map +1 -1
  257. package/dist/src/core/textures/Texture.d.ts +80 -16
  258. package/dist/src/core/textures/Texture.js +131 -37
  259. package/dist/src/core/textures/Texture.js.map +1 -1
  260. package/dist/src/core/utils.d.ts +2 -1
  261. package/dist/src/core/utils.js +1 -19
  262. package/dist/src/core/utils.js.map +1 -1
  263. package/dist/src/main-api/INode.d.ts +9 -9
  264. package/dist/src/main-api/INode.js.map +1 -1
  265. package/dist/src/main-api/Inspector.d.ts +135 -2
  266. package/dist/src/main-api/Inspector.js +507 -30
  267. package/dist/src/main-api/Inspector.js.map +1 -1
  268. package/dist/src/main-api/Renderer.d.ts +246 -162
  269. package/dist/src/main-api/Renderer.js +192 -152
  270. package/dist/src/main-api/Renderer.js.map +1 -1
  271. package/dist/src/utils.d.ts +23 -4
  272. package/dist/src/utils.js +50 -27
  273. package/dist/src/utils.js.map +1 -1
  274. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  275. package/dist/tsconfig.tsbuildinfo +1 -1
  276. package/exports/canvas-shaders.ts +11 -0
  277. package/exports/canvas.ts +8 -20
  278. package/exports/index.ts +24 -44
  279. package/exports/inspector.ts +0 -19
  280. package/exports/utils.ts +7 -19
  281. package/exports/webgl-shaders.ts +12 -0
  282. package/exports/webgl.ts +15 -20
  283. package/package.json +23 -20
  284. package/src/common/CommonTypes.ts +20 -22
  285. package/src/common/EventEmitter.ts +0 -19
  286. package/src/common/IAnimationController.ts +0 -18
  287. package/src/common/IEventEmitter.ts +0 -17
  288. package/src/core/Autosizer.ts +205 -0
  289. package/src/core/CoreNode.test.ts +378 -46
  290. package/src/core/CoreNode.ts +1007 -659
  291. package/src/core/CoreShaderManager.ts +128 -250
  292. package/src/core/CoreTextNode.ts +457 -321
  293. package/src/core/CoreTextureManager.ts +94 -115
  294. package/src/core/Stage.ts +516 -312
  295. package/src/core/TextureError.ts +46 -0
  296. package/src/core/TextureMemoryManager.ts +139 -175
  297. package/src/core/animations/AnimationManager.ts +0 -19
  298. package/src/core/animations/CoreAnimation.ts +16 -96
  299. package/src/core/animations/CoreAnimationController.ts +0 -19
  300. package/src/core/lib/ContextSpy.ts +0 -19
  301. package/src/core/lib/ImageWorker.ts +43 -31
  302. package/src/core/lib/Matrix3d.ts +7 -20
  303. package/src/core/lib/RenderCoords.ts +36 -67
  304. package/src/core/lib/WebGlContextWrapper.ts +353 -237
  305. package/src/core/lib/collectionUtils.ts +99 -0
  306. package/src/core/lib/colorCache.ts +20 -0
  307. package/src/core/{renderers/canvas/internal/ColorUtils.ts → lib/colorParser.ts} +16 -19
  308. package/src/core/lib/textureCompression.ts +434 -94
  309. package/src/core/lib/textureSvg.ts +0 -19
  310. package/src/core/lib/utils.ts +31 -19
  311. package/src/core/lib/validateImageBitmap.ts +17 -6
  312. package/src/core/platforms/Platform.ts +64 -0
  313. package/src/core/platforms/web/WebPlatform.ts +132 -0
  314. package/src/core/renderers/CoreContextTexture.ts +1 -19
  315. package/src/core/renderers/CoreRenderOp.ts +0 -19
  316. package/src/core/renderers/CoreRenderer.ts +34 -49
  317. package/src/core/renderers/CoreShaderNode.ts +202 -0
  318. package/src/core/renderers/CoreShaderProgram.ts +4 -0
  319. package/src/core/renderers/canvas/CanvasRenderer.ts +270 -0
  320. package/src/core/renderers/canvas/CanvasShaderNode.ts +79 -0
  321. package/src/core/renderers/canvas/{CanvasCoreTexture.ts → CanvasTexture.ts} +15 -27
  322. package/src/core/renderers/webgl/SdfRenderOp.ts +88 -0
  323. package/src/core/renderers/webgl/{WebGlCoreCtxRenderTexture.ts → WebGlCtxRenderTexture.ts} +15 -36
  324. package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +76 -0
  325. package/src/core/renderers/webgl/{WebGlCoreCtxTexture.ts → WebGlCtxTexture.ts} +89 -70
  326. package/src/core/renderers/webgl/WebGlRenderer.ts +850 -0
  327. package/src/core/renderers/webgl/WebGlShaderNode.ts +430 -0
  328. package/src/core/renderers/webgl/WebGlShaderProgram.ts +356 -0
  329. package/src/core/renderers/webgl/internal/BufferCollection.ts +15 -23
  330. package/src/core/renderers/webgl/internal/RendererUtils.ts +0 -19
  331. package/src/core/renderers/webgl/internal/ShaderUtils.ts +143 -24
  332. package/src/core/renderers/webgl/internal/WebGlUtils.ts +0 -19
  333. package/src/core/shaders/canvas/Border.ts +119 -0
  334. package/src/core/shaders/canvas/HolePunch.ts +38 -0
  335. package/src/core/shaders/canvas/LinearGradient.ts +54 -0
  336. package/src/core/shaders/canvas/RadialGradient.ts +82 -0
  337. package/src/core/shaders/canvas/Rounded.ts +38 -0
  338. package/src/core/shaders/canvas/RoundedWithBorder.ts +105 -0
  339. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +118 -0
  340. package/src/core/shaders/canvas/RoundedWithShadow.ts +56 -0
  341. package/src/core/shaders/canvas/Shadow.ts +35 -0
  342. package/src/core/shaders/canvas/utils/render.ts +143 -0
  343. package/src/core/shaders/templates/BorderTemplate.ts +128 -0
  344. package/src/core/shaders/templates/HolePunchTemplate.ts +65 -0
  345. package/src/core/shaders/templates/LinearGradientTemplate.ts +54 -0
  346. package/src/core/shaders/templates/RadialGradientTemplate.ts +66 -0
  347. package/src/core/shaders/templates/RoundedTemplate.ts +81 -0
  348. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +21 -0
  349. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +23 -0
  350. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +18 -0
  351. package/src/core/shaders/templates/ShadowTemplate.ts +89 -0
  352. package/src/core/shaders/utils.ts +30 -0
  353. package/src/core/shaders/webgl/Border.ts +159 -0
  354. package/src/core/shaders/webgl/Default.ts +52 -0
  355. package/src/core/shaders/webgl/HolePunch.ts +58 -0
  356. package/src/core/shaders/webgl/LinearGradient.ts +119 -0
  357. package/src/core/shaders/webgl/RadialGradient.ts +91 -0
  358. package/src/core/shaders/webgl/Rounded.ts +97 -0
  359. package/src/core/shaders/webgl/RoundedWithBorder.ts +212 -0
  360. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +234 -0
  361. package/src/core/shaders/webgl/RoundedWithShadow.ts +132 -0
  362. package/src/core/shaders/webgl/SdfShader.ts +104 -0
  363. package/src/core/shaders/webgl/Shadow.ts +119 -0
  364. package/src/core/text-rendering/CanvasFontHandler.ts +285 -0
  365. package/src/core/text-rendering/CanvasTextRenderer.ts +236 -0
  366. package/src/core/text-rendering/SdfFontHandler.ts +566 -0
  367. package/src/core/text-rendering/SdfTextRenderer.ts +406 -0
  368. package/src/core/text-rendering/TextLayoutEngine.ts +672 -0
  369. package/src/core/text-rendering/TextRenderer.ts +426 -0
  370. package/src/core/text-rendering/Utils.ts +80 -0
  371. package/src/core/text-rendering/tests/TextLayoutEngine.test.ts +434 -0
  372. package/src/core/textures/ColorTexture.ts +7 -24
  373. package/src/core/textures/ImageTexture.ts +72 -78
  374. package/src/core/textures/NoiseTexture.ts +14 -31
  375. package/src/core/textures/RenderTexture.ts +18 -35
  376. package/src/core/textures/SubTexture.ts +25 -65
  377. package/src/core/textures/Texture.ts +182 -53
  378. package/src/core/utils.ts +9 -26
  379. package/src/main-api/INode.ts +10 -29
  380. package/src/main-api/Inspector.ts +794 -38
  381. package/src/main-api/Renderer.ts +476 -274
  382. package/src/utils.ts +83 -29
  383. package/dist/src/core/animations/SimpleAnimation.d.ts +0 -28
  384. package/dist/src/core/animations/SimpleAnimation.js +0 -96
  385. package/dist/src/core/animations/SimpleAnimation.js.map +0 -1
  386. package/dist/src/core/platform.d.ts +0 -10
  387. package/dist/src/core/platform.js +0 -81
  388. package/dist/src/core/platform.js.map +0 -1
  389. package/dist/src/core/renderers/CoreShader.d.ts +0 -9
  390. package/dist/src/core/renderers/CoreShader.js +0 -28
  391. package/dist/src/core/renderers/CoreShader.js.map +0 -1
  392. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +0 -33
  393. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +0 -250
  394. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +0 -1
  395. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +0 -16
  396. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +0 -124
  397. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +0 -1
  398. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +0 -14
  399. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +0 -138
  400. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +0 -1
  401. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +0 -1
  402. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.d.ts +0 -10
  403. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js +0 -43
  404. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js.map +0 -1
  405. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.d.ts +0 -12
  406. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +0 -58
  407. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +0 -1
  408. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.d.ts +0 -9
  409. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +0 -38
  410. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +0 -1
  411. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +0 -56
  412. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +0 -239
  413. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +0 -1
  414. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +0 -34
  415. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +0 -114
  416. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +0 -1
  417. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +0 -133
  418. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +0 -616
  419. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +0 -1
  420. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +0 -83
  421. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +0 -233
  422. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +0 -1
  423. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +0 -44
  424. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +0 -118
  425. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +0 -1
  426. package/dist/src/core/renderers/webgl/shaders/DefaultShader.d.ts +0 -9
  427. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +0 -87
  428. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +0 -1
  429. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.d.ts +0 -10
  430. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +0 -119
  431. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +0 -1
  432. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +0 -29
  433. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +0 -413
  434. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +0 -1
  435. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.d.ts +0 -28
  436. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +0 -131
  437. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +0 -1
  438. package/dist/src/core/renderers/webgl/shaders/SdfShader.d.ts +0 -47
  439. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +0 -160
  440. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +0 -1
  441. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.d.ts +0 -31
  442. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +0 -71
  443. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +0 -1
  444. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.d.ts +0 -30
  445. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +0 -58
  446. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +0 -1
  447. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.d.ts +0 -31
  448. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +0 -71
  449. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +0 -1
  450. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.d.ts +0 -31
  451. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +0 -71
  452. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +0 -1
  453. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.d.ts +0 -31
  454. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +0 -71
  455. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +0 -1
  456. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.d.ts +0 -9
  457. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +0 -136
  458. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +0 -1
  459. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.d.ts +0 -36
  460. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +0 -85
  461. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +0 -1
  462. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.d.ts +0 -45
  463. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +0 -104
  464. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +0 -1
  465. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +0 -22
  466. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +0 -45
  467. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +0 -1
  468. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.d.ts +0 -58
  469. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +0 -80
  470. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js.map +0 -1
  471. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +0 -35
  472. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +0 -129
  473. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +0 -1
  474. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +0 -39
  475. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +0 -116
  476. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +0 -1
  477. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.d.ts +0 -61
  478. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +0 -127
  479. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js.map +0 -1
  480. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.d.ts +0 -40
  481. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +0 -71
  482. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +0 -1
  483. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.d.ts +0 -115
  484. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js +0 -61
  485. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +0 -1
  486. package/dist/src/core/shaders/templates/shaderUtils.d.ts +0 -5
  487. package/dist/src/core/shaders/templates/shaderUtils.js +0 -41
  488. package/dist/src/core/shaders/templates/shaderUtils.js.map +0 -1
  489. package/dist/src/core/shaders/webgl/Magnifier.d.ts +0 -46
  490. package/dist/src/core/shaders/webgl/Magnifier.js +0 -107
  491. package/dist/src/core/shaders/webgl/Magnifier.js.map +0 -1
  492. package/dist/src/core/shaders/webgl/RoundedWithBorder copy.d.ts +0 -3
  493. package/dist/src/core/shaders/webgl/RoundedWithBorder copy.js +0 -218
  494. package/dist/src/core/shaders/webgl/RoundedWithBorder copy.js.map +0 -1
  495. package/dist/src/core/text-rendering/TextRenderingUtils.d.ts +0 -12
  496. package/dist/src/core/text-rendering/TextRenderingUtils.js +0 -14
  497. package/dist/src/core/text-rendering/TextRenderingUtils.js.map +0 -1
  498. package/dist/src/core/text-rendering/TextTextureRendererUtils.d.ts +0 -72
  499. package/dist/src/core/text-rendering/TextTextureRendererUtils.js +0 -217
  500. package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +0 -1
  501. package/dist/src/core/text-rendering/TrFontManager.d.ts +0 -26
  502. package/dist/src/core/text-rendering/TrFontManager.js +0 -131
  503. package/dist/src/core/text-rendering/TrFontManager.js.map +0 -1
  504. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.d.ts +0 -39
  505. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +0 -125
  506. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +0 -1
  507. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.d.ts +0 -103
  508. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js +0 -21
  509. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js.map +0 -1
  510. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.d.ts +0 -62
  511. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +0 -88
  512. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +0 -1
  513. package/dist/src/core/text-rendering/font-face-types/TrFontFace.d.ts +0 -118
  514. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +0 -63
  515. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +0 -1
  516. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.d.ts +0 -14
  517. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +0 -66
  518. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +0 -1
  519. package/dist/src/core/text-rendering/font-face-types/utils.d.ts +0 -1
  520. package/dist/src/core/text-rendering/font-face-types/utils.js +0 -38
  521. package/dist/src/core/text-rendering/font-face-types/utils.js.map +0 -1
  522. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +0 -59
  523. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +0 -397
  524. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +0 -1
  525. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +0 -120
  526. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +0 -551
  527. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +0 -1
  528. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +0 -92
  529. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +0 -607
  530. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +0 -1
  531. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.d.ts +0 -12
  532. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js +0 -61
  533. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js.map +0 -1
  534. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.d.ts +0 -33
  535. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js +0 -52
  536. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js.map +0 -1
  537. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.d.ts +0 -13
  538. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js +0 -32
  539. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js.map +0 -1
  540. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +0 -23
  541. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +0 -84
  542. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js.map +0 -1
  543. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.d.ts +0 -4
  544. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js +0 -34
  545. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js.map +0 -1
  546. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +0 -20
  547. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +0 -308
  548. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +0 -1
  549. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.d.ts +0 -10
  550. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js +0 -40
  551. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js.map +0 -1
  552. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +0 -26
  553. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js +0 -70
  554. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js.map +0 -1
  555. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.d.ts +0 -16
  556. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js +0 -39
  557. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js.map +0 -1
  558. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +0 -373
  559. package/dist/src/core/text-rendering/renderers/TextRenderer.js +0 -178
  560. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +0 -1
  561. package/dist/src/main-api/DynamicShaderController.d.ts +0 -29
  562. package/dist/src/main-api/DynamicShaderController.js +0 -58
  563. package/dist/src/main-api/DynamicShaderController.js.map +0 -1
  564. package/dist/src/main-api/ShaderController.d.ts +0 -31
  565. package/dist/src/main-api/ShaderController.js +0 -37
  566. package/dist/src/main-api/ShaderController.js.map +0 -1
  567. package/scripts/please-use-pnpm.js +0 -13
  568. package/src/core/platform.ts +0 -100
  569. package/src/core/renderers/CoreShader.ts +0 -41
  570. package/src/core/renderers/canvas/CanvasCoreRenderer.ts +0 -375
  571. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +0 -231
  572. package/src/core/renderers/canvas/shaders/UnsupportedShader.ts +0 -48
  573. package/src/core/renderers/webgl/WebGlCoreCtxSubTexture.ts +0 -50
  574. package/src/core/renderers/webgl/WebGlCoreRenderOp.ts +0 -125
  575. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +0 -821
  576. package/src/core/renderers/webgl/WebGlCoreShader.ts +0 -365
  577. package/src/core/renderers/webgl/shaders/DefaultShader.ts +0 -93
  578. package/src/core/renderers/webgl/shaders/DefaultShaderBatched.ts +0 -132
  579. package/src/core/renderers/webgl/shaders/DynamicShader.ts +0 -580
  580. package/src/core/renderers/webgl/shaders/RoundedRectangle.ts +0 -167
  581. package/src/core/renderers/webgl/shaders/SdfShader.ts +0 -204
  582. package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +0 -101
  583. package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +0 -87
  584. package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +0 -101
  585. package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +0 -101
  586. package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +0 -101
  587. package/src/core/renderers/webgl/shaders/effects/EffectUtils.ts +0 -159
  588. package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +0 -127
  589. package/src/core/renderers/webgl/shaders/effects/GlitchEffect.ts +0 -148
  590. package/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.ts +0 -67
  591. package/src/core/renderers/webgl/shaders/effects/HolePunchEffect.ts +0 -157
  592. package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +0 -171
  593. package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +0 -168
  594. package/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.ts +0 -187
  595. package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +0 -110
  596. package/src/core/renderers/webgl/shaders/effects/ShaderEffect.ts +0 -196
  597. package/src/core/text-rendering/TextRenderingUtils.ts +0 -36
  598. package/src/core/text-rendering/TextTextureRendererUtils.ts +0 -263
  599. package/src/core/text-rendering/TrFontManager.ts +0 -183
  600. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +0 -176
  601. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +0 -139
  602. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +0 -173
  603. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +0 -171
  604. package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -187
  605. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -94
  606. package/src/core/text-rendering/font-face-types/utils.ts +0 -39
  607. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +0 -509
  608. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -808
  609. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +0 -853
  610. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +0 -48
  611. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +0 -66
  612. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +0 -52
  613. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +0 -32
  614. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +0 -117
  615. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +0 -133
  616. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +0 -38
  617. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +0 -408
  618. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +0 -49
  619. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +0 -52
  620. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +0 -205
  621. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +0 -93
  622. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +0 -40
  623. package/src/core/text-rendering/renderers/TextRenderer.ts +0 -557
  624. package/src/main-api/DynamicShaderController.ts +0 -104
  625. package/src/main-api/ShaderController.ts +0 -80
@@ -1,22 +1,4 @@
1
- /*
2
- * If not stated otherwise in this file or this component's LICENSE file the
3
- * following copyright and licenses apply:
4
- *
5
- * Copyright 2023 Comcast Cable Communications Management, LLC.
6
- *
7
- * Licensed under the Apache License, Version 2.0 (the License);
8
- * you may not use this file except in compliance with the License.
9
- * You may obtain a copy of the License at
10
- *
11
- * http://www.apache.org/licenses/LICENSE-2.0
12
- *
13
- * Unless required by applicable law or agreed to in writing, software
14
- * distributed under the License is distributed on an "AS IS" BASIS,
15
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- * See the License for the specific language governing permissions and
17
- * limitations under the License.
18
- */
19
- import { assertTruthy, getNewId, isProductionEnvironment, mergeColorAlphaPremultiplied, } from '../utils.js';
1
+ import { assertTruthy, getNewId, premultiplyColorABGR, USE_RTT, ENABLE_AUTOSIZE, EMIT_BOUNDS_EVENTS, } from '../utils.js';
20
2
  import {} from './textures/Texture.js';
21
3
  import { EventEmitter } from '../common/EventEmitter.js';
22
4
  import { copyRect, intersectRect, createBound, boundInsideBound, boundLargeThanBound, createPreloadBounds, } from './lib/utils.js';
@@ -24,6 +6,8 @@ import { Matrix3d } from './lib/Matrix3d.js';
24
6
  import { RenderCoords } from './lib/RenderCoords.js';
25
7
  import { CoreAnimation } from './animations/CoreAnimation.js';
26
8
  import { CoreAnimationController } from './animations/CoreAnimationController.js';
9
+ import { AutosizeMode, Autosizer } from './Autosizer.js';
10
+ import { removeChild } from './lib/collectionUtils.js';
27
11
  export var CoreNodeRenderState;
28
12
  (function (CoreNodeRenderState) {
29
13
  CoreNodeRenderState[CoreNodeRenderState["Init"] = 0] = "Init";
@@ -31,6 +15,13 @@ export var CoreNodeRenderState;
31
15
  CoreNodeRenderState[CoreNodeRenderState["InBounds"] = 4] = "InBounds";
32
16
  CoreNodeRenderState[CoreNodeRenderState["InViewport"] = 8] = "InViewport";
33
17
  })(CoreNodeRenderState || (CoreNodeRenderState = {}));
18
+ const NO_CLIPPING_RECT = {
19
+ x: 0,
20
+ y: 0,
21
+ width: 0,
22
+ height: 0,
23
+ valid: false,
24
+ };
34
25
  const CoreNodeRenderStateMap = new Map();
35
26
  CoreNodeRenderStateMap.set(CoreNodeRenderState.Init, 'init');
36
27
  CoreNodeRenderStateMap.set(CoreNodeRenderState.OutOfBounds, 'outOfBounds');
@@ -43,31 +34,23 @@ export var UpdateType;
43
34
  */
44
35
  UpdateType[UpdateType["Children"] = 1] = "Children";
45
36
  /**
46
- * Scale/Rotate transform update
47
- *
48
- * @remarks
49
- * CoreNode Properties Updated:
50
- * - `scaleRotateTransform`
51
- */
52
- UpdateType[UpdateType["ScaleRotate"] = 2] = "ScaleRotate";
53
- /**
54
- * Translate transform update (x/y/width/height/pivot/mount)
37
+ * localTransform
55
38
  *
56
39
  * @remarks
57
40
  * CoreNode Properties Updated:
58
41
  * - `localTransform`
59
42
  */
60
- UpdateType[UpdateType["Local"] = 4] = "Local";
43
+ UpdateType[UpdateType["Local"] = 2] = "Local";
61
44
  /**
62
- * Global Transform update
45
+ * globalTransform
63
46
  *
64
- * @remarks
47
+ * * @remarks
65
48
  * CoreNode Properties Updated:
66
49
  * - `globalTransform`
50
+ * - `renderBounds`
67
51
  * - `renderCoords`
68
- * - `renderBound`
69
52
  */
70
- UpdateType[UpdateType["Global"] = 8] = "Global";
53
+ UpdateType[UpdateType["Global"] = 4] = "Global";
71
54
  /**
72
55
  * Clipping rect update
73
56
  *
@@ -75,23 +58,15 @@ export var UpdateType;
75
58
  * CoreNode Properties Updated:
76
59
  * - `clippingRect`
77
60
  */
78
- UpdateType[UpdateType["Clipping"] = 16] = "Clipping";
79
- /**
80
- * Calculated ZIndex update
81
- *
82
- * @remarks
83
- * CoreNode Properties Updated:
84
- * - `calcZIndex`
85
- */
86
- UpdateType[UpdateType["CalculatedZIndex"] = 32] = "CalculatedZIndex";
61
+ UpdateType[UpdateType["Clipping"] = 8] = "Clipping";
87
62
  /**
88
- * Z-Index Sorted Children update
63
+ * Sort Z-Index Children update
89
64
  *
90
65
  * @remarks
91
66
  * CoreNode Properties Updated:
92
67
  * - `children` (sorts children by their `calcZIndex`)
93
68
  */
94
- UpdateType[UpdateType["ZIndexSortedChildren"] = 64] = "ZIndexSortedChildren";
69
+ UpdateType[UpdateType["SortZIndexChildren"] = 16] = "SortZIndexChildren";
95
70
  /**
96
71
  * Premultiplied Colors update
97
72
  *
@@ -102,7 +77,7 @@ export var UpdateType;
102
77
  * - `premultipliedColorBl`
103
78
  * - `premultipliedColorBr`
104
79
  */
105
- UpdateType[UpdateType["PremultipliedColors"] = 128] = "PremultipliedColors";
80
+ UpdateType[UpdateType["PremultipliedColors"] = 32] = "PremultipliedColors";
106
81
  /**
107
82
  * World Alpha update
108
83
  *
@@ -110,7 +85,7 @@ export var UpdateType;
110
85
  * CoreNode Properties Updated:
111
86
  * - `worldAlpha` = `parent.worldAlpha` * `alpha`
112
87
  */
113
- UpdateType[UpdateType["WorldAlpha"] = 256] = "WorldAlpha";
88
+ UpdateType[UpdateType["WorldAlpha"] = 64] = "WorldAlpha";
114
89
  /**
115
90
  * Render State update
116
91
  *
@@ -118,7 +93,7 @@ export var UpdateType;
118
93
  * CoreNode Properties Updated:
119
94
  * - `renderState`
120
95
  */
121
- UpdateType[UpdateType["RenderState"] = 512] = "RenderState";
96
+ UpdateType[UpdateType["RenderState"] = 128] = "RenderState";
122
97
  /**
123
98
  * Is Renderable update
124
99
  *
@@ -126,19 +101,27 @@ export var UpdateType;
126
101
  * CoreNode Properties Updated:
127
102
  * - `isRenderable`
128
103
  */
129
- UpdateType[UpdateType["IsRenderable"] = 1024] = "IsRenderable";
104
+ UpdateType[UpdateType["IsRenderable"] = 256] = "IsRenderable";
130
105
  /**
131
106
  * Render Texture update
132
107
  */
133
- UpdateType[UpdateType["RenderTexture"] = 2048] = "RenderTexture";
108
+ UpdateType[UpdateType["RenderTexture"] = 512] = "RenderTexture";
134
109
  /**
135
110
  * Track if parent has render texture
136
111
  */
137
- UpdateType[UpdateType["ParentRenderTexture"] = 4096] = "ParentRenderTexture";
112
+ UpdateType[UpdateType["ParentRenderTexture"] = 1024] = "ParentRenderTexture";
138
113
  /**
139
114
  * Render Bounds update
140
115
  */
141
- UpdateType[UpdateType["RenderBounds"] = 8192] = "RenderBounds";
116
+ UpdateType[UpdateType["RenderBounds"] = 2048] = "RenderBounds";
117
+ /**
118
+ * RecalcUniforms
119
+ */
120
+ UpdateType[UpdateType["RecalcUniforms"] = 4096] = "RecalcUniforms";
121
+ /**
122
+ * Autosize update
123
+ */
124
+ UpdateType[UpdateType["Autosize"] = 8192] = "Autosize";
142
125
  /**
143
126
  * None
144
127
  */
@@ -146,7 +129,7 @@ export var UpdateType;
146
129
  /**
147
130
  * All
148
131
  */
149
- UpdateType[UpdateType["All"] = 14335] = "All";
132
+ UpdateType[UpdateType["All"] = 16383] = "All";
150
133
  })(UpdateType || (UpdateType = {}));
151
134
  /**
152
135
  * A visual Node in the Renderer scene graph.
@@ -161,10 +144,28 @@ export class CoreNode extends EventEmitter {
161
144
  children = [];
162
145
  _id = getNewId();
163
146
  props;
147
+ isCoreNode = true;
148
+ // WebGL Render Op State
149
+ renderOpBufferIdx = 0;
150
+ numQuads = 0;
151
+ renderOpTextures = [];
152
+ /**
153
+ * Permanent index (in float32 units) into the renderer's quad buffer.
154
+ * -1 means this node has not yet been assigned a slot.
155
+ */
156
+ quadBufferIndex = -1;
157
+ /**
158
+ * True when renderCoords, premultiplied colors, or textureCoords changed
159
+ * since the node's quad was last written to the GPU.
160
+ */
161
+ isQuadDirty = true;
162
+ hasShaderUpdater = false;
163
+ hasShaderTimeFn = false;
164
+ hasColorProps = false;
165
+ textureLoaded = false;
164
166
  updateType = UpdateType.All;
165
167
  childUpdateType = UpdateType.None;
166
168
  globalTransform;
167
- scaleRotateTransform;
168
169
  localTransform;
169
170
  sceneGlobalTransform;
170
171
  renderCoords;
@@ -179,8 +180,11 @@ export class CoreNode extends EventEmitter {
179
180
  height: 0,
180
181
  valid: false,
181
182
  };
183
+ textureCoords;
184
+ updateShaderUniforms = false;
182
185
  isRenderable = false;
183
186
  renderState = CoreNodeRenderState.Init;
187
+ isSimple = true;
184
188
  worldAlpha = 1;
185
189
  premultipliedColorTl = 0;
186
190
  premultipliedColorTr = 0;
@@ -190,104 +194,167 @@ export class CoreNode extends EventEmitter {
190
194
  hasRTTupdates = false;
191
195
  parentHasRenderTexture = false;
192
196
  rttParent = null;
197
+ /**
198
+ * only used when rtt = true
199
+ */
200
+ framebufferDimensions = null;
201
+ /**Autosize properties */
202
+ autosizer = null;
203
+ parentAutosizer = null;
193
204
  destroyed = false;
194
205
  constructor(stage, props) {
195
206
  super();
196
207
  this.stage = stage;
197
- this.props = {
198
- ...props,
199
- parent: null,
208
+ //inital update type
209
+ let initialUpdateType = UpdateType.Local | UpdateType.RenderBounds | UpdateType.RenderState;
210
+ // Fast-path assign only known keys
211
+ const p = (this.props = {
212
+ x: props.x,
213
+ y: props.y,
214
+ w: props.w,
215
+ h: props.h,
216
+ alpha: props.alpha,
217
+ autosize: props.autosize,
218
+ clipping: props.clipping,
219
+ color: props.color,
220
+ colorTop: props.colorTop,
221
+ colorBottom: props.colorBottom,
222
+ colorLeft: props.colorLeft,
223
+ colorRight: props.colorRight,
224
+ colorTl: props.colorTl,
225
+ colorTr: props.colorTr,
226
+ colorBl: props.colorBl,
227
+ colorBr: props.colorBr,
228
+ scaleX: props.scaleX,
229
+ scaleY: props.scaleY,
230
+ rotation: props.rotation,
231
+ pivotX: props.pivotX,
232
+ pivotY: props.pivotY,
233
+ mountX: props.mountX,
234
+ mountY: props.mountY,
235
+ mount: props.mount,
236
+ pivot: props.pivot,
237
+ zIndex: props.zIndex,
238
+ textureOptions: props.textureOptions,
239
+ data: props.data,
240
+ imageType: props.imageType,
241
+ srcX: props.srcX,
242
+ srcY: props.srcY,
243
+ srcWidth: props.srcWidth,
244
+ srcHeight: props.srcHeight,
245
+ parent: props.parent,
200
246
  texture: null,
247
+ shader: null,
201
248
  src: null,
202
249
  rtt: false,
203
- };
204
- // Assign props to instance
205
- this.parent = props.parent;
250
+ boundsMargin: null,
251
+ scale: null,
252
+ interactive: props.interactive,
253
+ });
254
+ //check if any color props are set for premultiplied color updates
255
+ if (p.color > 0 ||
256
+ p.colorTop > 0 ||
257
+ p.colorBottom > 0 ||
258
+ p.colorLeft > 0 ||
259
+ p.colorRight > 0 ||
260
+ p.colorTl > 0 ||
261
+ p.colorTr > 0 ||
262
+ p.colorBl > 0 ||
263
+ p.colorBr > 0) {
264
+ this.hasColorProps = true;
265
+ initialUpdateType |= UpdateType.PremultipliedColors;
266
+ }
267
+ // Only set non-default values
268
+ if (p.zIndex !== 0) {
269
+ this.zIndex = p.zIndex;
270
+ }
271
+ if (props.parent !== null) {
272
+ props.parent.addChild(this);
273
+ }
274
+ // Assign props to instances
206
275
  this.texture = props.texture;
276
+ this.shader = props.shader;
207
277
  this.src = props.src;
208
278
  this.rtt = props.rtt;
279
+ this.boundsMargin = props.boundsMargin;
209
280
  this.interactive = props.interactive;
210
- if (props.boundsMargin) {
211
- this.boundsMargin = Array.isArray(props.boundsMargin)
212
- ? props.boundsMargin
213
- : [
214
- props.boundsMargin,
215
- props.boundsMargin,
216
- props.boundsMargin,
217
- props.boundsMargin,
218
- ];
219
- }
220
- this.setUpdateType(UpdateType.ScaleRotate |
221
- UpdateType.Local |
222
- UpdateType.RenderBounds |
223
- UpdateType.RenderState);
224
- if (isProductionEnvironment() === false && props.preventCleanup === true) {
225
- console.warn('CoreNode.preventCleanup: Is deprecated and will be removed in upcoming release, please use textureOptions.preventCleanup instead');
281
+ // Initialize autosize if enabled
282
+ if (p.autosize === true) {
283
+ this.autosizer = new Autosizer(this);
226
284
  }
285
+ this.setUpdateType(initialUpdateType);
227
286
  // if the default texture isn't loaded yet, wait for it to load
228
287
  // this only happens when the node is created before the stage is ready
229
- if (this.stage.defaultTexture &&
230
- this.stage.defaultTexture.state !== 'loaded') {
231
- this.stage.defaultTexture.once('loaded', () => {
232
- this.setUpdateType(UpdateType.IsRenderable);
233
- });
288
+ const dt = this.stage.defaultTexture;
289
+ if (dt !== null && dt.state !== 'loaded') {
290
+ dt.once('loaded', () => this.setUpdateType(UpdateType.IsRenderable));
234
291
  }
292
+ this.updateIsSimple();
235
293
  }
236
294
  //#region Textures
237
295
  loadTexture() {
238
- const { texture } = this.props;
239
- assertTruthy(texture);
296
+ if (this.props.texture === null) {
297
+ return;
298
+ }
240
299
  // If texture is already loaded / failed, trigger loaded event manually
241
300
  // so that users get a consistent event experience.
242
301
  // We do this in a microtask to allow listeners to be attached in the same
243
302
  // synchronous task after calling loadTexture()
244
- queueMicrotask(() => {
245
- if (this.textureOptions.preload === true) {
246
- this.stage.txManager.loadTexture(texture);
247
- }
248
- texture.preventCleanup =
249
- this.props.textureOptions?.preventCleanup ?? false;
250
- texture.on('loaded', this.onTextureLoaded);
251
- texture.on('failed', this.onTextureFailed);
252
- texture.on('freed', this.onTextureFreed);
253
- // If the parent is a render texture, the initial texture status
254
- // will be set to freed until the texture is processed by the
255
- // Render RTT nodes. So we only need to listen fo changes and
256
- // no need to check the texture.state until we restructure how
257
- // textures are being processed.
258
- if (this.parentHasRenderTexture) {
259
- this.notifyParentRTTOfUpdate();
260
- return;
261
- }
262
- if (texture.state === 'loaded') {
263
- assertTruthy(texture.dimensions);
264
- this.onTextureLoaded(texture, texture.dimensions);
265
- }
266
- else if (texture.state === 'failed') {
267
- assertTruthy(texture.error);
268
- this.onTextureFailed(texture, texture.error);
269
- }
270
- else if (texture.state === 'freed') {
271
- this.onTextureFreed(texture);
272
- }
273
- });
303
+ queueMicrotask(this.loadTextureTask);
274
304
  }
275
- unloadTexture() {
276
- if (this.texture !== null) {
277
- this.texture.off('loaded', this.onTextureLoaded);
278
- this.texture.off('failed', this.onTextureFailed);
279
- this.texture.off('freed', this.onTextureFreed);
280
- this.texture.setRenderableOwner(this, false);
305
+ /**
306
+ * Task for queueMicrotask to loadTexture
307
+ *
308
+ * @remarks
309
+ * This method is called in a microtask to release the texture.
310
+ */
311
+ loadTextureTask = () => {
312
+ const texture = this.props.texture;
313
+ //it is possible that texture is null here if user sets the texture to null right after loadTexture call
314
+ if (texture === null) {
315
+ return;
281
316
  }
282
- }
283
- autosizeNode(dimensions) {
284
- if (this.autosize) {
285
- this.width = dimensions.width;
286
- this.height = dimensions.height;
317
+ if (this.textureOptions.preload === true) {
318
+ this.stage.txManager.loadTexture(texture);
319
+ }
320
+ texture.preventCleanup = this.props.textureOptions?.preventCleanup ?? false;
321
+ texture.on('loaded', this.onTextureLoaded);
322
+ texture.on('failed', this.onTextureFailed);
323
+ texture.on('freed', this.onTextureFreed);
324
+ // If the parent is a render texture, the initial texture status
325
+ // will be set to freed until the texture is processed by the
326
+ // Render RTT nodes. So we only need to listen fo changes and
327
+ // no need to check the texture.state until we restructure how
328
+ // textures are being processed.
329
+ if (this.parentHasRenderTexture) {
330
+ this.notifyParentRTTOfUpdate();
331
+ return;
332
+ }
333
+ if (texture.state === 'loaded') {
334
+ this.onTextureLoaded(texture, texture.dimensions);
287
335
  }
336
+ else if (texture.state === 'failed') {
337
+ this.onTextureFailed(texture, texture.error);
338
+ }
339
+ else if (texture.state === 'freed') {
340
+ this.onTextureFreed(texture);
341
+ }
342
+ };
343
+ unloadTexture() {
344
+ if (this.texture === null) {
345
+ return;
346
+ }
347
+ const texture = this.texture;
348
+ texture.off('loaded', this.onTextureLoaded);
349
+ texture.off('failed', this.onTextureFailed);
350
+ texture.off('freed', this.onTextureFreed);
351
+ texture.setRenderableOwner(this._id, false);
288
352
  }
289
353
  onTextureLoaded = (_, dimensions) => {
290
- this.autosizeNode(dimensions);
354
+ if (this.autosizer !== null) {
355
+ this.autosizer.update();
356
+ }
357
+ this.textureLoaded = true;
291
358
  this.setUpdateType(UpdateType.IsRenderable);
292
359
  // Texture was loaded. In case the RAF loop has already stopped, we request
293
360
  // a render to ensure the texture is rendered.
@@ -297,12 +364,16 @@ export class CoreNode extends EventEmitter {
297
364
  this.notifyParentRTTOfUpdate();
298
365
  }
299
366
  // ignore 1x1 pixel textures
300
- if (dimensions.width > 1 && dimensions.height > 1) {
367
+ if (dimensions.w > 1 && dimensions.h > 1) {
301
368
  this.emit('loaded', {
302
369
  type: 'texture',
303
370
  dimensions,
304
371
  });
305
372
  }
373
+ if (this.stage.calculateTextureCoord === true &&
374
+ this.props.textureOptions !== null) {
375
+ this.textureCoords = this.stage.renderer.getTextureCoords(this);
376
+ }
306
377
  // Trigger a local update if the texture is loaded and the resizeMode is 'contain'
307
378
  if (this.props.textureOptions?.resizeMode?.type === 'contain') {
308
379
  this.setUpdateType(UpdateType.Local);
@@ -311,21 +382,28 @@ export class CoreNode extends EventEmitter {
311
382
  onTextureFailed = (_, error) => {
312
383
  // immediately set isRenderable to false, so that we handle the error
313
384
  // without waiting for the next frame loop
385
+ this.textureLoaded = false;
314
386
  this.isRenderable = false;
387
+ this.updateTextureOwnership(false);
315
388
  this.setUpdateType(UpdateType.IsRenderable);
316
389
  // If parent has a render texture, flag that we need to update
317
390
  if (this.parentHasRenderTexture) {
318
391
  this.notifyParentRTTOfUpdate();
319
392
  }
320
- this.emit('failed', {
321
- type: 'texture',
322
- error,
323
- });
393
+ if (this.texture !== null &&
394
+ this.texture.retryCount > this.texture.maxRetryCount) {
395
+ this.emit('failed', {
396
+ type: 'texture',
397
+ error,
398
+ });
399
+ }
324
400
  };
325
401
  onTextureFreed = () => {
326
402
  // immediately set isRenderable to false, so that we handle the error
327
403
  // without waiting for the next frame loop
404
+ this.textureLoaded = false;
328
405
  this.isRenderable = false;
406
+ this.updateTextureOwnership(false);
329
407
  this.setUpdateType(UpdateType.IsRenderable);
330
408
  // If parent has a render texture, flag that we need to update
331
409
  if (this.parentHasRenderTexture) {
@@ -347,241 +425,274 @@ export class CoreNode extends EventEmitter {
347
425
  setUpdateType(type) {
348
426
  this.updateType |= type;
349
427
  const parent = this.props.parent;
350
- if (!parent)
428
+ if (!parent || parent.updateType & UpdateType.Children)
351
429
  return;
352
- if ((parent.updateType & UpdateType.Children) === 0) {
353
- // Inform the parent if it doesn’t already have a child update
354
- parent.setUpdateType(UpdateType.Children);
355
- }
356
- }
357
- sortChildren() {
358
- this.children.sort((a, b) => a.calcZIndex - b.calcZIndex);
430
+ parent.setUpdateType(UpdateType.Children);
359
431
  }
360
- updateScaleRotateTransform() {
361
- const { rotation, scaleX, scaleY } = this.props;
362
- // optimize simple translation cases
363
- if (rotation === 0 && scaleX === 1 && scaleY === 1) {
364
- this.scaleRotateTransform = undefined;
432
+ updateLocalTransform() {
433
+ const p = this.props;
434
+ const { x, y } = p;
435
+ if (this.isSimple) {
436
+ this.localTransform = Matrix3d.translate(x, y, this.localTransform);
365
437
  return;
366
438
  }
367
- this.scaleRotateTransform = Matrix3d.rotate(rotation, this.scaleRotateTransform).scale(scaleX, scaleY);
368
- }
369
- updateLocalTransform() {
370
- const { x, y, width, height } = this.props;
371
- const mountTranslateX = this.props.mountX * width;
372
- const mountTranslateY = this.props.mountY * height;
373
- if (this.scaleRotateTransform) {
374
- const pivotTranslateX = this.props.pivotX * width;
375
- const pivotTranslateY = this.props.pivotY * height;
439
+ const { w, h } = p;
440
+ const mountTranslateX = p.mountX * w;
441
+ const mountTranslateY = p.mountY * h;
442
+ if (p.rotation !== 0 || p.scaleX !== 1 || p.scaleY !== 1) {
443
+ const scaleRotate = Matrix3d.rotate(p.rotation, Matrix3d.temp).scale(p.scaleX, p.scaleY);
444
+ const pivotTranslateX = p.pivotX * w;
445
+ const pivotTranslateY = p.pivotY * h;
376
446
  this.localTransform = Matrix3d.translate(x - mountTranslateX + pivotTranslateX, y - mountTranslateY + pivotTranslateY, this.localTransform)
377
- .multiply(this.scaleRotateTransform)
447
+ .multiply(scaleRotate)
378
448
  .translate(-pivotTranslateX, -pivotTranslateY);
379
449
  }
380
450
  else {
381
451
  this.localTransform = Matrix3d.translate(x - mountTranslateX, y - mountTranslateY, this.localTransform);
382
452
  }
383
453
  // Handle 'contain' resize mode
384
- const texture = this.props.texture;
454
+ const texture = p.texture;
385
455
  if (texture &&
386
456
  texture.dimensions &&
387
- this.props.textureOptions?.resizeMode?.type === 'contain') {
457
+ p.textureOptions.resizeMode?.type === 'contain') {
388
458
  let resizeModeScaleX = 1;
389
459
  let resizeModeScaleY = 1;
390
460
  let extraX = 0;
391
461
  let extraY = 0;
392
- const { width: tw, height: th } = texture.dimensions;
462
+ const { w: tw, h: th } = texture.dimensions;
393
463
  const txAspectRatio = tw / th;
394
- const nodeAspectRatio = width / height;
464
+ const nodeAspectRatio = w / h;
395
465
  if (txAspectRatio > nodeAspectRatio) {
396
466
  // Texture is wider than node
397
467
  // Center the node vertically (shift down by extraY)
398
468
  // Scale the node vertically to maintain original aspect ratio
399
- const scaleX = width / tw;
469
+ const scaleX = w / tw;
400
470
  const scaledTxHeight = th * scaleX;
401
- extraY = (height - scaledTxHeight) / 2;
402
- resizeModeScaleY = scaledTxHeight / height;
471
+ extraY = (h - scaledTxHeight) / 2;
472
+ resizeModeScaleY = scaledTxHeight / h;
403
473
  }
404
474
  else {
405
475
  // Texture is taller than node (or equal)
406
476
  // Center the node horizontally (shift right by extraX)
407
477
  // Scale the node horizontally to maintain original aspect ratio
408
- const scaleY = height / th;
478
+ const scaleY = h / th;
409
479
  const scaledTxWidth = tw * scaleY;
410
- extraX = (width - scaledTxWidth) / 2;
411
- resizeModeScaleX = scaledTxWidth / width;
480
+ extraX = (w - scaledTxWidth) / 2;
481
+ resizeModeScaleX = scaledTxWidth / w;
412
482
  }
413
483
  // Apply the extra translation and scale to the local transform
414
484
  this.localTransform
415
485
  .translate(extraX, extraY)
416
486
  .scale(resizeModeScaleX, resizeModeScaleY);
417
487
  }
418
- this.setUpdateType(UpdateType.Global);
488
+ }
489
+ updateIsSimple() {
490
+ const p = this.props;
491
+ this.isSimple =
492
+ p.rotation === 0 &&
493
+ p.scaleX === 1 &&
494
+ p.scaleY === 1 &&
495
+ p.mountX === 0 &&
496
+ p.mountY === 0 &&
497
+ !(p.texture && p.textureOptions.resizeMode?.type === 'contain');
419
498
  }
420
499
  /**
421
500
  * @todo: test for correct calculation flag
422
501
  * @param delta
423
502
  */
424
503
  update(delta, parentClippingRect) {
425
- if (this.updateType & UpdateType.ScaleRotate) {
426
- this.updateScaleRotateTransform();
427
- this.setUpdateType(UpdateType.Local);
504
+ const props = this.props;
505
+ //parent can be forced to ! because the root node update loop uses updateRoot which implies that
506
+ //all other loops using this update method have a parent
507
+ const parent = props.parent;
508
+ const parentHasRenderTexture = this.parentHasRenderTexture;
509
+ let newRenderState = null;
510
+ let updateType = this.updateType;
511
+ let childUpdateType = this.childUpdateType;
512
+ //this needs to be handled before setting updateTypes are reset
513
+ if (ENABLE_AUTOSIZE &&
514
+ updateType & UpdateType.Autosize &&
515
+ this.autosizer !== null) {
516
+ this.autosizer.update();
428
517
  }
429
- if (this.updateType & UpdateType.Local) {
518
+ // reset update type
519
+ this.updateType = 0;
520
+ this.childUpdateType = 0;
521
+ if (updateType & UpdateType.Local) {
430
522
  this.updateLocalTransform();
431
- this.setUpdateType(UpdateType.Global);
523
+ updateType |= UpdateType.Global;
432
524
  }
433
- const parent = this.props.parent;
434
- let renderState = null;
435
525
  // Handle specific RTT updates at this node level
436
- if (this.updateType & UpdateType.RenderTexture && this.rtt) {
526
+ if (USE_RTT && updateType & UpdateType.RenderTexture && this.rtt === true) {
437
527
  this.hasRTTupdates = true;
438
528
  }
439
- if (this.updateType & UpdateType.Global) {
440
- assertTruthy(this.localTransform);
441
- if (this.parentHasRenderTexture === true && parent?.rtt === true) {
529
+ if (updateType & UpdateType.Global) {
530
+ if (USE_RTT &&
531
+ this.parentHasRenderTexture === true &&
532
+ parent.rtt === true) {
442
533
  // we are at the start of the RTT chain, so we need to reset the globalTransform
443
534
  // for correct RTT rendering
444
- this.globalTransform = Matrix3d.identity();
535
+ this.globalTransform = Matrix3d.identity(this.globalTransform);
445
536
  // Maintain a full scene global transform for bounds detection
446
- this.sceneGlobalTransform = Matrix3d.copy(parent?.globalTransform || Matrix3d.identity()).multiply(this.localTransform);
537
+ const parentTransform = parent.globalTransform || Matrix3d.identity(Matrix3d.temp);
538
+ this.sceneGlobalTransform = Matrix3d.copy(parentTransform, this.sceneGlobalTransform).translateOrMultiply(this.localTransform);
447
539
  }
448
- else if (this.parentHasRenderTexture === true &&
449
- parent?.rtt === false) {
540
+ else if (USE_RTT &&
541
+ this.parentHasRenderTexture === true &&
542
+ parent.rtt === false) {
450
543
  // we're part of an RTT chain but our parent is not the main RTT node
451
544
  // so we need to propogate the sceneGlobalTransform of the parent
452
545
  // to maintain a full scene global transform for bounds detection
453
- this.sceneGlobalTransform = Matrix3d.copy(parent?.sceneGlobalTransform || this.localTransform).multiply(this.localTransform);
454
- this.globalTransform = Matrix3d.copy(parent?.globalTransform || this.localTransform, this.globalTransform);
546
+ const parentSceneTransform = parent.sceneGlobalTransform || this.localTransform;
547
+ this.sceneGlobalTransform = Matrix3d.copy(parentSceneTransform, this.sceneGlobalTransform).translateOrMultiply(this.localTransform);
548
+ this.globalTransform = Matrix3d.copy(parent.globalTransform || this.localTransform, this.globalTransform);
455
549
  }
456
550
  else {
457
- this.globalTransform = Matrix3d.copy(parent?.globalTransform || this.localTransform, this.globalTransform);
551
+ this.globalTransform = Matrix3d.copy(parent.globalTransform || this.localTransform, this.globalTransform);
458
552
  }
459
- if (parent !== null) {
460
- this.globalTransform.multiply(this.localTransform);
553
+ if (this.isSimple) {
554
+ this.globalTransform.translate(this.localTransform.tx, this.localTransform.ty);
555
+ }
556
+ else {
557
+ this.globalTransform.translateOrMultiply(this.localTransform);
461
558
  }
462
559
  this.calculateRenderCoords();
463
560
  this.updateBoundingRect();
464
- this.setUpdateType(UpdateType.RenderState | UpdateType.Children);
465
- this.childUpdateType |= UpdateType.Global;
561
+ updateType |= UpdateType.RenderState | UpdateType.RecalcUniforms;
562
+ //only propagate children updates if not autosizing
563
+ if ((updateType & UpdateType.Autosize) === 0) {
564
+ updateType |= UpdateType.Children;
565
+ childUpdateType |= UpdateType.Global;
566
+ }
466
567
  if (this.clipping === true) {
467
- this.setUpdateType(UpdateType.Clipping | UpdateType.RenderBounds);
468
- this.childUpdateType |= UpdateType.RenderBounds;
568
+ updateType |= UpdateType.Clipping | UpdateType.RenderBounds;
569
+ childUpdateType |= UpdateType.RenderBounds;
469
570
  }
470
571
  }
471
- if (this.updateType & UpdateType.RenderBounds) {
572
+ if (updateType & UpdateType.RenderBounds) {
472
573
  this.createRenderBounds();
473
- this.setUpdateType(UpdateType.RenderState);
474
- this.setUpdateType(UpdateType.Children);
475
- this.childUpdateType |= UpdateType.RenderBounds;
574
+ updateType |= UpdateType.RenderState | UpdateType.Children;
575
+ childUpdateType |= UpdateType.RenderBounds;
476
576
  }
477
- if (this.updateType & UpdateType.RenderState) {
478
- renderState = this.checkRenderBounds();
479
- this.setUpdateType(UpdateType.IsRenderable);
577
+ if (updateType & UpdateType.RenderState) {
578
+ newRenderState = this.checkRenderBounds();
579
+ updateType |= UpdateType.IsRenderable;
480
580
  // if we're not going out of bounds, update the render state
481
581
  // this is done so the update loop can finish before we mark a node
482
582
  // as out of bounds
483
- if (renderState !== CoreNodeRenderState.OutOfBounds) {
484
- this.updateRenderState(renderState);
583
+ if (newRenderState !== CoreNodeRenderState.OutOfBounds) {
584
+ this.updateRenderState(newRenderState);
485
585
  }
486
586
  }
487
- if (this.updateType & UpdateType.WorldAlpha) {
488
- if (parent) {
489
- this.worldAlpha = parent.worldAlpha * this.props.alpha;
490
- }
491
- else {
492
- this.worldAlpha = this.props.alpha;
493
- }
494
- this.setUpdateType(UpdateType.Children |
587
+ if (updateType & UpdateType.WorldAlpha) {
588
+ this.worldAlpha = parent.worldAlpha * this.props.alpha;
589
+ updateType |=
495
590
  UpdateType.PremultipliedColors |
496
- UpdateType.IsRenderable);
497
- this.childUpdateType |= UpdateType.WorldAlpha;
591
+ UpdateType.Children |
592
+ UpdateType.IsRenderable;
593
+ childUpdateType |= UpdateType.WorldAlpha;
498
594
  }
499
- if (this.updateType & UpdateType.IsRenderable) {
595
+ if (updateType & UpdateType.IsRenderable) {
500
596
  this.updateIsRenderable();
501
597
  }
502
- if (this.updateType & UpdateType.Clipping) {
598
+ // Handle autosize updates when children transforms change
599
+ if (ENABLE_AUTOSIZE &&
600
+ updateType & UpdateType.Global &&
601
+ this.isRenderable === true &&
602
+ this.parentAutosizer !== null) {
603
+ this.parentAutosizer.patch(this.id);
604
+ }
605
+ if (updateType & UpdateType.Clipping) {
503
606
  this.calculateClippingRect(parentClippingRect);
504
- this.setUpdateType(UpdateType.Children);
505
- this.childUpdateType |= UpdateType.Clipping;
506
- this.childUpdateType |= UpdateType.RenderBounds;
507
- }
508
- if (this.updateType & UpdateType.PremultipliedColors) {
509
- this.premultipliedColorTl = mergeColorAlphaPremultiplied(this.props.colorTl, this.worldAlpha, true);
510
- // If all the colors are the same just sent them all to the same value
511
- if (this.props.colorTl === this.props.colorTr &&
512
- this.props.colorBl === this.props.colorBr &&
513
- this.props.colorTl === this.props.colorBl) {
607
+ updateType |= UpdateType.Children;
608
+ childUpdateType |= UpdateType.Clipping | UpdateType.RenderBounds;
609
+ }
610
+ if (updateType & UpdateType.PremultipliedColors) {
611
+ const alpha = this.worldAlpha;
612
+ const tl = props.colorTl;
613
+ const tr = props.colorTr;
614
+ const bl = props.colorBl;
615
+ const br = props.colorBr;
616
+ // Fast equality check (covers all 4 corners)
617
+ const same = tl === tr && tl === bl && tl === br;
618
+ const merged = premultiplyColorABGR(tl, alpha);
619
+ this.premultipliedColorTl = merged;
620
+ if (same === true) {
514
621
  this.premultipliedColorTr =
515
622
  this.premultipliedColorBl =
516
623
  this.premultipliedColorBr =
517
- this.premultipliedColorTl;
624
+ merged;
518
625
  }
519
626
  else {
520
- this.premultipliedColorTr = mergeColorAlphaPremultiplied(this.props.colorTr, this.worldAlpha, true);
521
- this.premultipliedColorBl = mergeColorAlphaPremultiplied(this.props.colorBl, this.worldAlpha, true);
522
- this.premultipliedColorBr = mergeColorAlphaPremultiplied(this.props.colorBr, this.worldAlpha, true);
627
+ this.premultipliedColorTr = premultiplyColorABGR(tr, alpha);
628
+ this.premultipliedColorBl = premultiplyColorABGR(bl, alpha);
629
+ this.premultipliedColorBr = premultiplyColorABGR(br, alpha);
523
630
  }
524
631
  }
525
- // No need to update zIndex if there is no parent
526
- if (parent !== null && this.updateType & UpdateType.CalculatedZIndex) {
527
- this.calculateZIndex();
528
- // Tell parent to re-sort children
529
- parent.setUpdateType(UpdateType.ZIndexSortedChildren);
530
- }
531
- if (this.props.strictBounds === true &&
532
- this.renderState === CoreNodeRenderState.OutOfBounds) {
533
- this.updateType &= ~UpdateType.RenderBounds; // remove render bounds update
632
+ if (this.renderState === CoreNodeRenderState.OutOfBounds) {
633
+ // Delay updating children until the node is in bounds
634
+ this.updateType = updateType;
635
+ this.childUpdateType = childUpdateType;
534
636
  return;
535
637
  }
536
- if (this.updateType & UpdateType.Children && this.children.length > 0) {
638
+ if (updateType & UpdateType.RecalcUniforms &&
639
+ this.hasShaderUpdater === true) {
640
+ this.updateShaderUniforms = true;
641
+ }
642
+ if (this.isRenderable === true && this.updateShaderUniforms === true) {
643
+ this.updateShaderUniforms = false;
644
+ //this exists because the boolean hasShaderUpdater === true
645
+ this.shader.update();
646
+ }
647
+ if (updateType & UpdateType.Children && this.children.length > 0) {
648
+ let childClippingRect = this.clippingRect;
649
+ if (USE_RTT && this.rtt === true) {
650
+ childClippingRect = NO_CLIPPING_RECT;
651
+ }
537
652
  for (let i = 0, length = this.children.length; i < length; i++) {
538
653
  const child = this.children[i];
539
- child.setUpdateType(this.childUpdateType);
654
+ if (childUpdateType !== 0) {
655
+ child.setUpdateType(childUpdateType);
656
+ }
540
657
  if (child.updateType === 0) {
541
658
  continue;
542
659
  }
543
- let childClippingRect = this.clippingRect;
544
- if (this.rtt === true) {
545
- childClippingRect = {
546
- x: 0,
547
- y: 0,
548
- width: 0,
549
- height: 0,
550
- valid: false,
551
- };
552
- }
553
660
  child.update(delta, childClippingRect);
554
661
  }
555
662
  }
556
663
  // If the node has an RTT parent and requires a texture re-render, inform the RTT parent
557
- // if (this.parentHasRenderTexture && this.updateType & UpdateType.RenderTexture) {
664
+ // if (this.parentHasRenderTexture && updateType & UpdateType.RenderTexture) {
558
665
  // @TODO have a more scoped down updateType for RTT updates
559
- if (this.parentHasRenderTexture && this.updateType > 0) {
666
+ if (USE_RTT === true && parentHasRenderTexture === true) {
560
667
  this.notifyParentRTTOfUpdate();
561
668
  }
562
- // Sorting children MUST happen after children have been updated so
563
- // that they have the oppotunity to update their calculated zIndex.
564
- if (this.updateType & UpdateType.ZIndexSortedChildren) {
669
+ //Resort children if needed
670
+ if (updateType & UpdateType.SortZIndexChildren) {
565
671
  // reorder z-index
566
672
  this.sortChildren();
567
673
  }
568
674
  // If we're out of bounds, apply the render state now
569
675
  // this is done so nodes can finish their entire update loop before
570
676
  // being marked as out of bounds
571
- if (renderState === CoreNodeRenderState.OutOfBounds) {
572
- this.updateRenderState(renderState);
677
+ if (newRenderState === CoreNodeRenderState.OutOfBounds) {
678
+ this.updateRenderState(newRenderState);
573
679
  this.updateIsRenderable();
574
- if (this.rtt === true &&
575
- renderState === CoreNodeRenderState.OutOfBounds) {
680
+ if (USE_RTT === true &&
681
+ this.rtt === true &&
682
+ newRenderState === CoreNodeRenderState.OutOfBounds) {
576
683
  // notify children that we are going out of bounds
577
684
  // we have to do this now before we stop processing the render tree
578
- this.notifyChildrenRTTOfUpdate(renderState);
579
- // this.childUpdateType |= UpdateType.RenderState;
685
+ this.notifyChildrenRTTOfUpdate(newRenderState);
580
686
  }
581
687
  }
582
- // reset update type
583
- this.updateType = 0;
584
- this.childUpdateType = 0;
688
+ // Mark quad dirty only when visual data (transforms, colors) actually
689
+ // changed, so the WebGL renderer only re-uploads modified slots.
690
+ if (updateType &
691
+ (UpdateType.Global |
692
+ UpdateType.PremultipliedColors |
693
+ UpdateType.WorldAlpha)) {
694
+ this.isQuadDirty = true;
695
+ }
585
696
  }
586
697
  findParentRTTNode() {
587
698
  let rttNode = this.parent;
@@ -590,13 +701,6 @@ export class CoreNode extends EventEmitter {
590
701
  }
591
702
  return rttNode;
592
703
  }
593
- getRTTParentRenderState() {
594
- const rttNode = this.rttParent || this.findParentRTTNode();
595
- if (!rttNode) {
596
- return null;
597
- }
598
- return rttNode.renderState;
599
- }
600
704
  notifyChildrenRTTOfUpdate(renderState) {
601
705
  for (const child of this.children) {
602
706
  // force child to update render state
@@ -622,9 +726,6 @@ export class CoreNode extends EventEmitter {
622
726
  }
623
727
  }
624
728
  checkRenderBounds() {
625
- assertTruthy(this.renderBound);
626
- assertTruthy(this.strictBound);
627
- assertTruthy(this.preloadBound);
628
729
  if (boundInsideBound(this.renderBound, this.strictBound)) {
629
730
  return CoreNodeRenderState.InViewport;
630
731
  }
@@ -636,34 +737,30 @@ export class CoreNode extends EventEmitter {
636
737
  return CoreNodeRenderState.InViewport;
637
738
  }
638
739
  // check if we dont have dimensions, take our parent's render state
639
- if (this.parent !== null &&
640
- (this.props.width === 0 || this.props.height === 0)) {
740
+ if (this.parent !== null && (this.props.w === 0 || this.props.h === 0)) {
641
741
  return this.parent.renderState;
642
742
  }
643
743
  return CoreNodeRenderState.OutOfBounds;
644
744
  }
645
745
  updateBoundingRect() {
646
- const transform = this.sceneGlobalTransform || this.globalTransform;
647
- const renderCoords = this.sceneRenderCoords || this.renderCoords;
648
- assertTruthy(transform);
649
- assertTruthy(renderCoords);
650
- const { tb, tc } = transform;
651
- const { x1, y1, x3, y3 } = renderCoords;
652
- if (tb === 0 || tc === 0) {
653
- this.renderBound = createBound(x1, y1, x3, y3, this.renderBound);
746
+ const transform = (this.sceneGlobalTransform ||
747
+ this.globalTransform);
748
+ const renderCoords = (this.sceneRenderCoords ||
749
+ this.renderCoords);
750
+ if (transform.tb === 0 || transform.tc === 0) {
751
+ this.renderBound = createBound(renderCoords.x1, renderCoords.y1, renderCoords.x3, renderCoords.y3, this.renderBound);
654
752
  }
655
753
  else {
656
- const { x2, x4, y2, y4 } = renderCoords;
754
+ const { x1, y1, x2, y2, x3, y3, x4, y4 } = renderCoords;
657
755
  this.renderBound = createBound(Math.min(x1, x2, x3, x4), Math.min(y1, y2, y3, y4), Math.max(x1, x2, x3, x4), Math.max(y1, y2, y3, y4), this.renderBound);
658
756
  }
659
757
  }
660
758
  createRenderBounds() {
661
- assertTruthy(this.stage);
662
759
  if (this.parent !== null && this.parent.strictBound !== undefined) {
663
760
  // we have a parent with a valid bound, copy it
664
761
  const parentBound = this.parent.strictBound;
665
- this.strictBound = createBound(parentBound.x1, parentBound.y1, parentBound.x2, parentBound.y2);
666
- this.preloadBound = createPreloadBounds(this.strictBound, this.boundsMargin);
762
+ this.strictBound = createBound(parentBound.x1, parentBound.y1, parentBound.x2, parentBound.y2, this.strictBound);
763
+ this.preloadBound = createPreloadBounds(this.strictBound, this.boundsMargin, this.preloadBound);
667
764
  }
668
765
  else {
669
766
  // no parent or parent does not have a bound, take the stage boundaries
@@ -684,14 +781,14 @@ export class CoreNode extends EventEmitter {
684
781
  return;
685
782
  }
686
783
  // clipping is enabled and we are in bounds create our own bounds
687
- const { x, y, width, height } = this.props;
784
+ const { x, y, w, h } = this.props;
688
785
  // Pick the global transform if available, otherwise use the local transform
689
786
  // global transform is only available if the node in an RTT chain
690
787
  const { tx, ty } = this.sceneGlobalTransform || this.globalTransform || {};
691
788
  const _x = tx ?? x;
692
789
  const _y = ty ?? y;
693
- this.strictBound = createBound(_x, _y, _x + width, _y + height, this.strictBound);
694
- this.preloadBound = createPreloadBounds(this.strictBound, this.boundsMargin);
790
+ this.strictBound = createBound(_x, _y, _x + w, _y + h, this.strictBound);
791
+ this.preloadBound = createPreloadBounds(this.strictBound, this.boundsMargin, this.preloadBound);
695
792
  }
696
793
  updateRenderState(renderState) {
697
794
  if (renderState === this.renderState) {
@@ -699,12 +796,30 @@ export class CoreNode extends EventEmitter {
699
796
  }
700
797
  const previous = this.renderState;
701
798
  this.renderState = renderState;
702
- const event = CoreNodeRenderStateMap.get(renderState);
703
- assertTruthy(event);
704
- this.emit(event, {
705
- previous,
706
- current: renderState,
707
- });
799
+ // If node visibility changes, dirty the render list cache
800
+ if (renderState === CoreNodeRenderState.OutOfBounds ||
801
+ previous === CoreNodeRenderState.OutOfBounds) {
802
+ this.stage.requestRenderListUpdate();
803
+ }
804
+ if (EMIT_BOUNDS_EVENTS) {
805
+ const event = CoreNodeRenderStateMap.get(renderState);
806
+ assertTruthy(event);
807
+ this.emit(event, {
808
+ previous,
809
+ current: renderState,
810
+ });
811
+ }
812
+ }
813
+ /**
814
+ * Checks if the node is renderable based on world alpha, dimensions and out of bounds status.
815
+ */
816
+ checkBasicRenderability() {
817
+ if (this.worldAlpha === 0 || this.isOutOfBounds() === true) {
818
+ return false;
819
+ }
820
+ else {
821
+ return true;
822
+ }
708
823
  }
709
824
  /**
710
825
  * Updates the `isRenderable` property based on various conditions.
@@ -719,44 +834,53 @@ export class CoreNode extends EventEmitter {
719
834
  return;
720
835
  }
721
836
  if (this.texture !== null) {
837
+ // preemptive check for failed textures this will mark the current node as non-renderable
838
+ // and will prevent further checks until the texture is reloaded or retry is reset on the texture
839
+ if (this.texture.retryCount > this.texture.maxRetryCount) {
840
+ // texture has failed to load, we cannot render
841
+ this.updateTextureOwnership(false);
842
+ this.setRenderable(false);
843
+ return;
844
+ }
722
845
  needsTextureOwnership = true;
723
- // we're only renderable if the texture state is loaded
724
- newIsRenderable = this.texture.state === 'loaded';
725
- }
726
- else if ((this.hasShader() || this.hasColorProperties() === true) &&
846
+ // Use cached boolean instead of string comparison
847
+ newIsRenderable = this.textureLoaded;
848
+ }
849
+ else if (
850
+ // check shader
851
+ (this.props.shader !== this.stage.renderer.getDefaultShaderNode() ||
852
+ this.hasColorProps === true) &&
853
+ // check dimensions
727
854
  this.hasDimensions() === true) {
728
855
  // This mean we have dimensions and a color set, so we can render a ColorTexture
729
- if (this.stage.defaultTexture &&
730
- this.stage.defaultTexture.state === 'loaded') {
731
- newIsRenderable = true;
732
- }
856
+ newIsRenderable = true;
733
857
  }
734
858
  this.updateTextureOwnership(needsTextureOwnership);
735
859
  this.setRenderable(newIsRenderable);
736
860
  }
737
- /**
738
- * Checks if the node is renderable based on world alpha, dimensions and out of bounds status.
739
- */
740
- checkBasicRenderability() {
741
- if (this.worldAlpha === 0 || this.isOutOfBounds() === true) {
742
- return false;
743
- }
744
- else {
745
- return true;
746
- }
747
- }
748
861
  /**
749
862
  * Sets the renderable state and triggers changes if necessary.
750
863
  * @param isRenderable - The new renderable state
751
864
  */
752
865
  setRenderable(isRenderable) {
866
+ const previousIsRenderable = this.isRenderable;
753
867
  this.isRenderable = isRenderable;
868
+ // Emit event if renderable status has changed
869
+ if (previousIsRenderable !== isRenderable) {
870
+ this.stage.requestRenderListUpdate();
871
+ if (EMIT_BOUNDS_EVENTS) {
872
+ this.emit('renderable', {
873
+ type: 'renderable',
874
+ isRenderable,
875
+ });
876
+ }
877
+ }
754
878
  }
755
879
  /**
756
880
  * Changes the renderable state of the node.
757
881
  */
758
882
  updateTextureOwnership(isRenderable) {
759
- this.texture?.setRenderableOwner(this, isRenderable);
883
+ this.texture?.setRenderableOwner(this._id, isRenderable);
760
884
  }
761
885
  /**
762
886
  * Checks if the node is out of the viewport bounds.
@@ -768,33 +892,17 @@ export class CoreNode extends EventEmitter {
768
892
  * Checks if the node has dimensions (width/height)
769
893
  */
770
894
  hasDimensions() {
771
- return this.props.width !== 0 && this.props.height !== 0;
772
- }
773
- /**
774
- * Checks if the node has any color properties set.
775
- */
776
- hasColorProperties() {
777
- return (this.props.color !== 0 ||
778
- this.props.colorTop !== 0 ||
779
- this.props.colorBottom !== 0 ||
780
- this.props.colorLeft !== 0 ||
781
- this.props.colorRight !== 0 ||
782
- this.props.colorTl !== 0 ||
783
- this.props.colorTr !== 0 ||
784
- this.props.colorBl !== 0 ||
785
- this.props.colorBr !== 0);
786
- }
787
- hasShader() {
788
- return this.props.shader !== null;
895
+ return this.props.w !== 0 && this.props.h !== 0;
789
896
  }
790
897
  calculateRenderCoords() {
791
- const { width, height } = this;
792
- const { tx, ty, ta, tb, tc, td } = this.globalTransform;
898
+ const { w, h } = this.props;
899
+ const g = this.globalTransform;
900
+ const tx = g.tx, ty = g.ty, ta = g.ta, tb = g.tb, tc = g.tc, td = g.td;
793
901
  if (tb === 0 && tc === 0) {
794
902
  const minX = tx;
795
- const maxX = tx + width * ta;
903
+ const maxX = tx + w * ta;
796
904
  const minY = ty;
797
- const maxY = ty + height * td;
905
+ const maxY = ty + h * td;
798
906
  this.renderCoords = RenderCoords.translate(
799
907
  //top-left
800
908
  minX, minY,
@@ -810,21 +918,21 @@ export class CoreNode extends EventEmitter {
810
918
  //top-left
811
919
  tx, ty,
812
920
  //top-right
813
- tx + width * ta, ty + width * tc,
921
+ tx + w * ta, ty + w * tc,
814
922
  //bottom-right
815
- tx + width * ta + height * tb, ty + width * tc + height * td,
923
+ tx + w * ta + h * tb, ty + w * tc + h * td,
816
924
  //bottom-left
817
- tx + height * tb, ty + height * td, this.renderCoords);
925
+ tx + h * tb, ty + h * td, this.renderCoords);
818
926
  }
819
- if (this.sceneGlobalTransform === undefined) {
927
+ if (!USE_RTT || this.sceneGlobalTransform === undefined) {
820
928
  return;
821
929
  }
822
930
  const { tx: stx, ty: sty, ta: sta, tb: stb, tc: stc, td: std, } = this.sceneGlobalTransform;
823
931
  if (stb === 0 && stc === 0) {
824
932
  const minX = stx;
825
- const maxX = stx + width * sta;
933
+ const maxX = stx + w * sta;
826
934
  const minY = sty;
827
- const maxY = sty + height * std;
935
+ const maxY = sty + h * std;
828
936
  this.sceneRenderCoords = RenderCoords.translate(
829
937
  //top-left
830
938
  minX, minY,
@@ -840,11 +948,11 @@ export class CoreNode extends EventEmitter {
840
948
  //top-left
841
949
  stx, sty,
842
950
  //top-right
843
- stx + width * sta, sty + width * stc,
951
+ stx + w * sta, sty + w * stc,
844
952
  //bottom-right
845
- stx + width * sta + height * stb, sty + width * stc + height * std,
953
+ stx + w * sta + h * stb, sty + w * stc + h * std,
846
954
  //bottom-left
847
- stx + height * stb, sty + height * std, this.sceneRenderCoords);
955
+ stx + h * stb, sty + h * std, this.sceneRenderCoords);
848
956
  }
849
957
  }
850
958
  /**
@@ -856,15 +964,14 @@ export class CoreNode extends EventEmitter {
856
964
  * Finally, the node's parentClippingRect and clippingRect properties are updated.
857
965
  */
858
966
  calculateClippingRect(parentClippingRect) {
859
- assertTruthy(this.globalTransform);
860
967
  const { clippingRect, props, globalTransform: gt } = this;
861
968
  const { clipping } = props;
862
969
  const isRotated = gt.tb !== 0 || gt.tc !== 0;
863
970
  if (clipping === true && isRotated === false) {
864
971
  clippingRect.x = gt.tx;
865
972
  clippingRect.y = gt.ty;
866
- clippingRect.width = this.width * gt.ta;
867
- clippingRect.height = this.height * gt.td;
973
+ clippingRect.width = this.props.w * gt.ta;
974
+ clippingRect.height = this.props.h * gt.td;
868
975
  clippingRect.valid = true;
869
976
  }
870
977
  else {
@@ -880,88 +987,154 @@ export class CoreNode extends EventEmitter {
880
987
  clippingRect.valid = true;
881
988
  }
882
989
  }
883
- calculateZIndex() {
884
- const props = this.props;
885
- const z = props.zIndex || 0;
886
- const p = props.parent?.zIndex || 0;
887
- let zIndex = z;
888
- if (props.parent?.zIndexLocked) {
889
- zIndex = z < p ? z : p;
890
- }
891
- this.calcZIndex = zIndex;
892
- }
893
990
  /**
894
991
  * Destroy the node and cleanup all resources
895
992
  */
896
- destroy() {
993
+ destroy(isChild = false) {
897
994
  if (this.destroyed === true) {
898
995
  return;
899
996
  }
900
997
  this.destroyed = true;
998
+ // Detach from parent first to stop propagation of updates
999
+ if (isChild === false) {
1000
+ const parent = this.parent;
1001
+ if (parent !== null) {
1002
+ parent.removeChild(this);
1003
+ }
1004
+ this.props.parent = null;
1005
+ this.stage.requestRender();
1006
+ }
1007
+ this.removeAllListeners();
901
1008
  this.unloadTexture();
902
- this.clippingRect.valid = false;
903
1009
  this.isRenderable = false;
904
- this.renderCoords = undefined;
905
- this.renderBound = undefined;
906
- this.strictBound = undefined;
907
- this.preloadBound = undefined;
908
- this.globalTransform = undefined;
909
- this.scaleRotateTransform = undefined;
910
- this.localTransform = undefined;
911
- this.props.texture = null;
912
- this.props.shader = this.stage.defShaderCtr;
913
- while (this.children.length > 0) {
914
- this.children[0]?.destroy();
1010
+ if (this.hasShaderTimeFn === true) {
1011
+ this.stage.untrackTimedNode(this);
915
1012
  }
916
- // This very action will also remove the node from the parent's children array
917
- this.parent = null;
918
- if (this.rtt) {
1013
+ if (USE_RTT && this.rtt === true) {
919
1014
  this.stage.renderer.removeRTTNode(this);
920
1015
  }
921
- this.removeAllListeners();
1016
+ // Kill children
1017
+ for (let i = 0, n = this.children.length; i < n; i++) {
1018
+ this.children[i].destroy(true);
1019
+ }
1020
+ this.children.length = 0;
1021
+ this.props.texture = null;
922
1022
  }
923
1023
  renderQuads(renderer) {
924
- // Prevent quad rendering if parent has a render texture
925
- // and renderer is not currently rendering to a texture
926
- if (this.parentHasRenderTexture) {
927
- if (!renderer.renderToTextureActive) {
1024
+ if (USE_RTT && this.parentHasRenderTexture === true) {
1025
+ const rtt = renderer.renderToTextureActive;
1026
+ if (rtt === false || this.parentRenderTexture !== renderer.activeRttNode)
928
1027
  return;
1028
+ }
1029
+ // There is a race condition where the texture can be null
1030
+ // with RTT nodes. Adding this defensively to avoid errors.
1031
+ // Also check if we have a valid texture or default texture to render
1032
+ if (USE_RTT && this.renderTexture.state !== 'loaded') {
1033
+ return;
1034
+ }
1035
+ renderer.addQuad(this);
1036
+ }
1037
+ get renderTexture() {
1038
+ return this.props.texture || this.stage.defaultTexture;
1039
+ }
1040
+ get renderTextureCoords() {
1041
+ return this.textureCoords || this.stage.renderer.defaultTextureCoords;
1042
+ }
1043
+ get quadBufferCollection() {
1044
+ return this.stage.renderer.quadBufferCollection;
1045
+ }
1046
+ get width() {
1047
+ return this.props.w;
1048
+ }
1049
+ get height() {
1050
+ return this.props.h;
1051
+ }
1052
+ get time() {
1053
+ if (this.hasShaderTimeFn === true) {
1054
+ return this.getTimerValue();
1055
+ }
1056
+ return 0;
1057
+ }
1058
+ getTimerValue() {
1059
+ if (typeof this.shader.time === 'function') {
1060
+ return this.shader.time(this.stage);
1061
+ }
1062
+ return this.stage.elapsedTime;
1063
+ }
1064
+ sortChildren() {
1065
+ this.children.sort((a, b) => a.props.zIndex - b.props.zIndex);
1066
+ this.stage.requestRenderListUpdate();
1067
+ }
1068
+ removeChild(node, targetParent = null) {
1069
+ if (targetParent === null) {
1070
+ if (USE_RTT &&
1071
+ this.props.rtt === true &&
1072
+ this.parentHasRenderTexture === true) {
1073
+ node.clearRTTInheritance();
929
1074
  }
930
- // Prevent quad rendering if parent render texture is not the active render texture
931
- if (this.parentRenderTexture !== renderer.activeRttNode) {
932
- return;
1075
+ if (ENABLE_AUTOSIZE) {
1076
+ const autosizeTarget = this.autosizer || this.parentAutosizer;
1077
+ if (autosizeTarget !== null) {
1078
+ autosizeTarget.detach(node);
1079
+ }
933
1080
  }
934
1081
  }
935
- assertTruthy(this.globalTransform);
936
- assertTruthy(this.renderCoords);
937
- // add to list of renderables to be sorted before rendering
938
- renderer.addQuad({
939
- width: this.props.width,
940
- height: this.props.height,
941
- colorTl: this.premultipliedColorTl,
942
- colorTr: this.premultipliedColorTr,
943
- colorBl: this.premultipliedColorBl,
944
- colorBr: this.premultipliedColorBr,
945
- // if we do not have a texture, use the default texture
946
- // this assumes any renderable node is either a distinct texture or a ColorTexture
947
- texture: this.texture || this.stage.defaultTexture,
948
- textureOptions: this.textureOptions,
949
- zIndex: this.zIndex,
950
- shader: this.shader.shader,
951
- shaderProps: this.shader.getResolvedProps(),
952
- alpha: this.worldAlpha,
953
- clippingRect: this.clippingRect,
954
- tx: this.globalTransform.tx,
955
- ty: this.globalTransform.ty,
956
- ta: this.globalTransform.ta,
957
- tb: this.globalTransform.tb,
958
- tc: this.globalTransform.tc,
959
- td: this.globalTransform.td,
960
- renderCoords: this.renderCoords,
961
- rtt: this.rtt,
962
- parentHasRenderTexture: this.parentHasRenderTexture,
963
- framebufferDimensions: this.framebufferDimensions,
964
- });
1082
+ removeChild(node, this.children);
1083
+ this.stage.requestRenderListUpdate();
1084
+ }
1085
+ addChild(node, previousParent = null) {
1086
+ const inRttCluster = USE_RTT &&
1087
+ (this.props.rtt === true || this.parentHasRenderTexture === true);
1088
+ const children = this.children;
1089
+ let attachToAutosizer = false;
1090
+ let autosizeTarget = null;
1091
+ if (ENABLE_AUTOSIZE) {
1092
+ autosizeTarget = this.autosizer || this.parentAutosizer;
1093
+ attachToAutosizer = autosizeTarget !== null;
1094
+ }
1095
+ node.parentHasRenderTexture = inRttCluster;
1096
+ if (previousParent !== null) {
1097
+ const previousParentInRttCluster = USE_RTT &&
1098
+ (previousParent.props.rtt === true ||
1099
+ previousParent.parentHasRenderTexture === true);
1100
+ if (inRttCluster === false && previousParentInRttCluster === true) {
1101
+ // update child RTT status
1102
+ node.clearRTTInheritance();
1103
+ }
1104
+ if (ENABLE_AUTOSIZE) {
1105
+ const previousAutosizer = node.autosizer || node.parentAutosizer;
1106
+ if (previousAutosizer !== null) {
1107
+ if (!autosizeTarget || previousAutosizer.id !== autosizeTarget.id) {
1108
+ previousAutosizer.detach(node);
1109
+ }
1110
+ attachToAutosizer = false;
1111
+ }
1112
+ }
1113
+ }
1114
+ if (ENABLE_AUTOSIZE && attachToAutosizer === true && autosizeTarget) {
1115
+ //if this is true, then the autosizer really exists
1116
+ autosizeTarget.attach(node);
1117
+ }
1118
+ if (inRttCluster === true) {
1119
+ node.markChildrenWithRTT(this);
1120
+ }
1121
+ children.push(node);
1122
+ // check if we need to sort
1123
+ const lastIndex = children.length - 1;
1124
+ let shouldSort = node.zIndex !== 0;
1125
+ if (shouldSort === false && lastIndex > 0) {
1126
+ // If the new node has zIndex 0, we check if any existing children have (had) non-zero zIndex.
1127
+ // Since children are sorted, we only need to check the first and the last (before the new one).
1128
+ // The new node is at `lastIndex`. The previous last node is at `lastIndex - 1`.
1129
+ const first = children[0];
1130
+ const last = children[lastIndex - 1];
1131
+ shouldSort = first.zIndex !== 0 || last.zIndex !== 0;
1132
+ }
1133
+ if (shouldSort) {
1134
+ this.setUpdateType(UpdateType.SortZIndexChildren);
1135
+ }
1136
+ this.setUpdateType(UpdateType.Children);
1137
+ this.stage.requestRenderListUpdate();
965
1138
  }
966
1139
  //#region Properties
967
1140
  get id() {
@@ -984,12 +1157,12 @@ export class CoreNode extends EventEmitter {
984
1157
  }
985
1158
  get absX() {
986
1159
  return (this.props.x +
987
- -this.props.width * this.props.mountX +
1160
+ -this.props.w * this.props.mountX +
988
1161
  (this.props.parent?.absX || this.props.parent?.globalTransform?.tx || 0));
989
1162
  }
990
1163
  get absY() {
991
1164
  return (this.props.y +
992
- -this.props.height * this.props.mountY +
1165
+ -this.props.h * this.props.mountY +
993
1166
  (this.props.parent?.absY ?? 0));
994
1167
  }
995
1168
  get y() {
@@ -1001,36 +1174,46 @@ export class CoreNode extends EventEmitter {
1001
1174
  this.setUpdateType(UpdateType.Local);
1002
1175
  }
1003
1176
  }
1004
- get width() {
1005
- return this.props.width;
1177
+ get w() {
1178
+ return this.props.w;
1006
1179
  }
1007
- set width(value) {
1008
- if (this.props.width !== value) {
1009
- this.props.width = value;
1010
- this.setUpdateType(UpdateType.Local);
1011
- if (this.props.rtt) {
1012
- this.texture = this.stage.txManager.createTexture('RenderTexture', {
1013
- width: this.width,
1014
- height: this.height,
1015
- });
1016
- this.setUpdateType(UpdateType.RenderTexture);
1180
+ set w(value) {
1181
+ const props = this.props;
1182
+ if (props.w !== value) {
1183
+ props.w = value;
1184
+ let updateType = UpdateType.Local;
1185
+ if (props.texture !== null &&
1186
+ this.stage.calculateTextureCoord === true &&
1187
+ props.textureOptions !== null) {
1188
+ this.textureCoords = this.stage.renderer.getTextureCoords(this);
1017
1189
  }
1190
+ if (props.rtt === true) {
1191
+ this.framebufferDimensions.w = value;
1192
+ this.texture = this.stage.txManager.createTexture('RenderTexture', this.framebufferDimensions);
1193
+ updateType |= UpdateType.RenderTexture;
1194
+ }
1195
+ this.setUpdateType(updateType);
1018
1196
  }
1019
1197
  }
1020
- get height() {
1021
- return this.props.height;
1198
+ get h() {
1199
+ return this.props.h;
1022
1200
  }
1023
- set height(value) {
1024
- if (this.props.height !== value) {
1025
- this.props.height = value;
1026
- this.setUpdateType(UpdateType.Local);
1027
- if (this.props.rtt) {
1028
- this.texture = this.stage.txManager.createTexture('RenderTexture', {
1029
- width: this.width,
1030
- height: this.height,
1031
- });
1032
- this.setUpdateType(UpdateType.RenderTexture);
1201
+ set h(value) {
1202
+ const props = this.props;
1203
+ if (props.h !== value) {
1204
+ props.h = value;
1205
+ let updateType = UpdateType.Local;
1206
+ if (props.texture !== null &&
1207
+ this.stage.calculateTextureCoord === true &&
1208
+ props.textureOptions !== null) {
1209
+ this.textureCoords = this.stage.renderer.getTextureCoords(this);
1033
1210
  }
1211
+ if (props.rtt === true) {
1212
+ this.framebufferDimensions.h = value;
1213
+ this.texture = this.stage.txManager.createTexture('RenderTexture', this.framebufferDimensions);
1214
+ updateType |= UpdateType.RenderTexture;
1215
+ }
1216
+ this.setUpdateType(updateType);
1034
1217
  }
1035
1218
  }
1036
1219
  get scale() {
@@ -1043,6 +1226,7 @@ export class CoreNode extends EventEmitter {
1043
1226
  // Unlike INode, `null` should never be possibility for Animations.
1044
1227
  this.scaleX = value;
1045
1228
  this.scaleY = value;
1229
+ this.updateIsSimple();
1046
1230
  }
1047
1231
  get scaleX() {
1048
1232
  return this.props.scaleX;
@@ -1050,7 +1234,8 @@ export class CoreNode extends EventEmitter {
1050
1234
  set scaleX(value) {
1051
1235
  if (this.props.scaleX !== value) {
1052
1236
  this.props.scaleX = value;
1053
- this.setUpdateType(UpdateType.ScaleRotate);
1237
+ this.setUpdateType(UpdateType.Local);
1238
+ this.updateIsSimple();
1054
1239
  }
1055
1240
  }
1056
1241
  get scaleY() {
@@ -1059,7 +1244,8 @@ export class CoreNode extends EventEmitter {
1059
1244
  set scaleY(value) {
1060
1245
  if (this.props.scaleY !== value) {
1061
1246
  this.props.scaleY = value;
1062
- this.setUpdateType(UpdateType.ScaleRotate);
1247
+ this.setUpdateType(UpdateType.Local);
1248
+ this.updateIsSimple();
1063
1249
  }
1064
1250
  }
1065
1251
  get mount() {
@@ -1071,6 +1257,7 @@ export class CoreNode extends EventEmitter {
1071
1257
  this.props.mountY = value;
1072
1258
  this.props.mount = value;
1073
1259
  this.setUpdateType(UpdateType.Local);
1260
+ this.updateIsSimple();
1074
1261
  }
1075
1262
  }
1076
1263
  get mountX() {
@@ -1080,6 +1267,7 @@ export class CoreNode extends EventEmitter {
1080
1267
  if (this.props.mountX !== value) {
1081
1268
  this.props.mountX = value;
1082
1269
  this.setUpdateType(UpdateType.Local);
1270
+ this.updateIsSimple();
1083
1271
  }
1084
1272
  }
1085
1273
  get mountY() {
@@ -1089,6 +1277,7 @@ export class CoreNode extends EventEmitter {
1089
1277
  if (this.props.mountY !== value) {
1090
1278
  this.props.mountY = value;
1091
1279
  this.setUpdateType(UpdateType.Local);
1280
+ this.updateIsSimple();
1092
1281
  }
1093
1282
  }
1094
1283
  get pivot() {
@@ -1126,7 +1315,8 @@ export class CoreNode extends EventEmitter {
1126
1315
  set rotation(value) {
1127
1316
  if (this.props.rotation !== value) {
1128
1317
  this.props.rotation = value;
1129
- this.setUpdateType(UpdateType.ScaleRotate);
1318
+ this.setUpdateType(UpdateType.Local);
1319
+ this.updateIsSimple();
1130
1320
  }
1131
1321
  }
1132
1322
  get alpha() {
@@ -1144,12 +1334,30 @@ export class CoreNode extends EventEmitter {
1144
1334
  return this.props.autosize;
1145
1335
  }
1146
1336
  set autosize(value) {
1337
+ if (this.props.autosize === value) {
1338
+ return;
1339
+ }
1147
1340
  this.props.autosize = value;
1341
+ if (value === true && this.autosizer === null) {
1342
+ this.autosizer = new Autosizer(this);
1343
+ }
1344
+ else {
1345
+ this.autosizer = null;
1346
+ }
1148
1347
  }
1149
1348
  get boundsMargin() {
1150
- return (this.props.boundsMargin ??
1151
- this.parent?.boundsMargin ??
1152
- this.stage.boundsMargin);
1349
+ const props = this.props;
1350
+ if (props.boundsMargin !== null) {
1351
+ return props.boundsMargin;
1352
+ }
1353
+ const parent = this.parent;
1354
+ if (parent !== null) {
1355
+ const margin = parent.boundsMargin;
1356
+ if (margin !== undefined) {
1357
+ return margin;
1358
+ }
1359
+ }
1360
+ return this.stage.boundsMargin;
1153
1361
  }
1154
1362
  set boundsMargin(value) {
1155
1363
  if (value === this.props.boundsMargin) {
@@ -1178,11 +1386,23 @@ export class CoreNode extends EventEmitter {
1178
1386
  return this.props.color;
1179
1387
  }
1180
1388
  set color(value) {
1181
- this.colorTop = value;
1182
- this.colorBottom = value;
1183
- this.colorLeft = value;
1184
- this.colorRight = value;
1185
- this.props.color = value;
1389
+ const p = this.props;
1390
+ if (p.color === value)
1391
+ return;
1392
+ p.color = value;
1393
+ const has = value > 0;
1394
+ if (has !== this.hasColorProps) {
1395
+ this.setUpdateType(UpdateType.IsRenderable);
1396
+ }
1397
+ this.hasColorProps = has;
1398
+ if (p.colorTop !== value)
1399
+ this.colorTop = value;
1400
+ if (p.colorBottom !== value)
1401
+ this.colorBottom = value;
1402
+ if (p.colorLeft !== value)
1403
+ this.colorLeft = value;
1404
+ if (p.colorRight !== value)
1405
+ this.colorRight = value;
1186
1406
  this.setUpdateType(UpdateType.PremultipliedColors);
1187
1407
  }
1188
1408
  get colorTop() {
@@ -1194,7 +1414,8 @@ export class CoreNode extends EventEmitter {
1194
1414
  this.colorTr = value;
1195
1415
  }
1196
1416
  this.props.colorTop = value;
1197
- this.setUpdateType(UpdateType.PremultipliedColors);
1417
+ this.hasColorProps = value > 0;
1418
+ this.setUpdateType(UpdateType.PremultipliedColors | UpdateType.IsRenderable);
1198
1419
  }
1199
1420
  get colorBottom() {
1200
1421
  return this.props.colorBottom;
@@ -1205,7 +1426,8 @@ export class CoreNode extends EventEmitter {
1205
1426
  this.colorBr = value;
1206
1427
  }
1207
1428
  this.props.colorBottom = value;
1208
- this.setUpdateType(UpdateType.PremultipliedColors);
1429
+ this.hasColorProps = value > 0;
1430
+ this.setUpdateType(UpdateType.PremultipliedColors | UpdateType.IsRenderable);
1209
1431
  }
1210
1432
  get colorLeft() {
1211
1433
  return this.props.colorLeft;
@@ -1216,7 +1438,8 @@ export class CoreNode extends EventEmitter {
1216
1438
  this.colorBl = value;
1217
1439
  }
1218
1440
  this.props.colorLeft = value;
1219
- this.setUpdateType(UpdateType.PremultipliedColors);
1441
+ this.hasColorProps = value > 0;
1442
+ this.setUpdateType(UpdateType.PremultipliedColors | UpdateType.IsRenderable);
1220
1443
  }
1221
1444
  get colorRight() {
1222
1445
  return this.props.colorRight;
@@ -1227,56 +1450,64 @@ export class CoreNode extends EventEmitter {
1227
1450
  this.colorBr = value;
1228
1451
  }
1229
1452
  this.props.colorRight = value;
1230
- this.setUpdateType(UpdateType.PremultipliedColors);
1453
+ this.hasColorProps = value > 0;
1454
+ this.setUpdateType(UpdateType.PremultipliedColors | UpdateType.IsRenderable);
1231
1455
  }
1232
1456
  get colorTl() {
1233
1457
  return this.props.colorTl;
1234
1458
  }
1235
1459
  set colorTl(value) {
1236
1460
  this.props.colorTl = value;
1237
- this.setUpdateType(UpdateType.PremultipliedColors);
1461
+ this.hasColorProps = value > 0;
1462
+ this.setUpdateType(UpdateType.PremultipliedColors | UpdateType.IsRenderable);
1238
1463
  }
1239
1464
  get colorTr() {
1240
1465
  return this.props.colorTr;
1241
1466
  }
1242
1467
  set colorTr(value) {
1243
1468
  this.props.colorTr = value;
1244
- this.setUpdateType(UpdateType.PremultipliedColors);
1469
+ this.hasColorProps = value > 0;
1470
+ this.setUpdateType(UpdateType.PremultipliedColors | UpdateType.IsRenderable);
1245
1471
  }
1246
1472
  get colorBl() {
1247
1473
  return this.props.colorBl;
1248
1474
  }
1249
1475
  set colorBl(value) {
1250
1476
  this.props.colorBl = value;
1251
- this.setUpdateType(UpdateType.PremultipliedColors);
1477
+ this.hasColorProps = value > 0;
1478
+ this.setUpdateType(UpdateType.PremultipliedColors | UpdateType.IsRenderable);
1252
1479
  }
1253
1480
  get colorBr() {
1254
1481
  return this.props.colorBr;
1255
1482
  }
1256
1483
  set colorBr(value) {
1257
1484
  this.props.colorBr = value;
1258
- this.setUpdateType(UpdateType.PremultipliedColors);
1259
- }
1260
- // we're only interested in parent zIndex to test
1261
- // if we should use node zIndex is higher then parent zIndex
1262
- get zIndexLocked() {
1263
- return this.props.zIndexLocked || 0;
1264
- }
1265
- set zIndexLocked(value) {
1266
- this.props.zIndexLocked = value;
1267
- this.setUpdateType(UpdateType.CalculatedZIndex | UpdateType.Children);
1268
- for (let i = 0, length = this.children.length; i < length; i++) {
1269
- this.children[i].setUpdateType(UpdateType.CalculatedZIndex);
1270
- }
1485
+ this.hasColorProps = value > 0;
1486
+ this.setUpdateType(UpdateType.PremultipliedColors | UpdateType.IsRenderable);
1271
1487
  }
1272
1488
  get zIndex() {
1273
1489
  return this.props.zIndex;
1274
1490
  }
1275
1491
  set zIndex(value) {
1276
- this.props.zIndex = value;
1277
- this.setUpdateType(UpdateType.CalculatedZIndex | UpdateType.Children);
1278
- for (let i = 0, length = this.children.length; i < length; i++) {
1279
- this.children[i].setUpdateType(UpdateType.CalculatedZIndex);
1492
+ let sanitizedValue = value;
1493
+ if (isNaN(sanitizedValue) || Number.isFinite(sanitizedValue) === false) {
1494
+ console.warn(`zIndex was set to an invalid value: ${value}, defaulting to 0`);
1495
+ sanitizedValue = 0;
1496
+ }
1497
+ //Clamp to safe integer range
1498
+ if (sanitizedValue > Number.MAX_SAFE_INTEGER) {
1499
+ sanitizedValue = 1000;
1500
+ }
1501
+ else if (sanitizedValue < Number.MIN_SAFE_INTEGER) {
1502
+ sanitizedValue = -1000;
1503
+ }
1504
+ if (this.props.zIndex === sanitizedValue) {
1505
+ return;
1506
+ }
1507
+ this.props.zIndex = sanitizedValue;
1508
+ const parent = this.parent;
1509
+ if (parent !== null) {
1510
+ parent.setUpdateType(UpdateType.SortZIndexChildren);
1280
1511
  }
1281
1512
  }
1282
1513
  get parent() {
@@ -1289,34 +1520,13 @@ export class CoreNode extends EventEmitter {
1289
1520
  }
1290
1521
  this.props.parent = newParent;
1291
1522
  if (oldParent) {
1292
- const index = oldParent.children.indexOf(this);
1293
- assertTruthy(index !== -1, "CoreNode.parent: Node not found in old parent's children!");
1294
- oldParent.children.splice(index, 1);
1295
- oldParent.setUpdateType(UpdateType.Children | UpdateType.ZIndexSortedChildren);
1296
- }
1297
- if (newParent) {
1298
- newParent.children.push(this);
1299
- // Since this node has a new parent, to be safe, have it do a full update.
1300
- this.setUpdateType(UpdateType.All);
1301
- // Tell parent that it's children need to be updated and sorted.
1302
- newParent.setUpdateType(UpdateType.Children | UpdateType.ZIndexSortedChildren);
1303
- // If the new parent has an RTT enabled, apply RTT inheritance
1304
- if (newParent.rtt || newParent.parentHasRenderTexture) {
1305
- this.applyRTTInheritance(newParent);
1306
- }
1523
+ oldParent.removeChild(this, newParent);
1307
1524
  }
1308
- this.updateScaleRotateTransform();
1309
- // fetch render bounds from parent
1310
- this.setUpdateType(UpdateType.RenderBounds | UpdateType.Children);
1311
- }
1312
- get preventCleanup() {
1313
- return this.props.textureOptions.preventCleanup || false;
1314
- }
1315
- set preventCleanup(value) {
1316
- if (isProductionEnvironment() === false) {
1317
- console.warn('CoreNode.preventCleanup: Is deprecated and will be removed in upcoming release, please use textureOptions.preventCleanup instead');
1525
+ if (newParent !== null) {
1526
+ newParent.addChild(this, oldParent);
1318
1527
  }
1319
- this.props.textureOptions.preventCleanup = value;
1528
+ //since this node has a new parent, recalc global and render bounds
1529
+ this.setUpdateType(UpdateType.Global | UpdateType.RenderBounds);
1320
1530
  }
1321
1531
  get rtt() {
1322
1532
  return this.props.rtt;
@@ -1339,10 +1549,11 @@ export class CoreNode extends EventEmitter {
1339
1549
  }
1340
1550
  }
1341
1551
  initRenderTexture() {
1342
- this.texture = this.stage.txManager.createTexture('RenderTexture', {
1343
- width: this.width,
1344
- height: this.height,
1345
- });
1552
+ this.framebufferDimensions = {
1553
+ w: this.props.w,
1554
+ h: this.props.h,
1555
+ };
1556
+ this.texture = this.stage.txManager.createTexture('RenderTexture', this.framebufferDimensions);
1346
1557
  this.stage.renderer.renderToTexture(this);
1347
1558
  }
1348
1559
  cleanupRenderTexture() {
@@ -1350,6 +1561,7 @@ export class CoreNode extends EventEmitter {
1350
1561
  this.clearRTTInheritance();
1351
1562
  this.hasRTTupdates = false;
1352
1563
  this.texture = null;
1564
+ this.framebufferDimensions = null;
1353
1565
  }
1354
1566
  markChildrenWithRTT(node = null) {
1355
1567
  const parent = node || this;
@@ -1386,12 +1598,29 @@ export class CoreNode extends EventEmitter {
1386
1598
  get shader() {
1387
1599
  return this.props.shader;
1388
1600
  }
1389
- set shader(value) {
1390
- if (this.props.shader === value) {
1601
+ set shader(shader) {
1602
+ if (this.props.shader === shader) {
1391
1603
  return;
1392
1604
  }
1393
- this.props.shader = value;
1394
- this.setUpdateType(UpdateType.IsRenderable);
1605
+ if (shader === null) {
1606
+ this.hasShaderUpdater = false;
1607
+ this.props.shader = this.stage.defShaderNode;
1608
+ this.setUpdateType(UpdateType.IsRenderable);
1609
+ return;
1610
+ }
1611
+ if (shader.shaderKey !== 'default') {
1612
+ this.hasShaderUpdater = shader.update !== undefined;
1613
+ this.hasShaderTimeFn = shader.time !== undefined;
1614
+ shader.attachNode(this);
1615
+ }
1616
+ if (this.hasShaderTimeFn === true) {
1617
+ this.stage.trackTimedNode(this);
1618
+ }
1619
+ else {
1620
+ this.stage.untrackTimedNode(this);
1621
+ }
1622
+ this.props.shader = shader;
1623
+ this.setUpdateType(UpdateType.IsRenderable | UpdateType.RecalcUniforms);
1395
1624
  }
1396
1625
  get src() {
1397
1626
  return this.props.src;
@@ -1407,8 +1636,8 @@ export class CoreNode extends EventEmitter {
1407
1636
  }
1408
1637
  this.texture = this.stage.txManager.createTexture('ImageTexture', {
1409
1638
  src: imageUrl,
1410
- width: this.props.width,
1411
- height: this.props.height,
1639
+ w: this.props.w,
1640
+ h: this.props.h,
1412
1641
  type: this.props.imageType,
1413
1642
  sx: this.props.srcX,
1414
1643
  sy: this.props.srcY,
@@ -1450,16 +1679,14 @@ export class CoreNode extends EventEmitter {
1450
1679
  this.props.srcY = value;
1451
1680
  }
1452
1681
  /**
1453
- * Returns the framebuffer dimensions of the node.
1454
- * If the node has a render texture, the dimensions are the same as the node's dimensions.
1455
- * If the node does not have a render texture, the dimensions are inherited from the parent.
1456
- * If the node parent has a render texture and the node is a render texture, the nodes dimensions are used.
1682
+ * Returns the framebuffer dimensions of the RTT parent
1457
1683
  */
1458
- get framebufferDimensions() {
1459
- if (this.parentHasRenderTexture && !this.rtt && this.parent) {
1460
- return this.parent.framebufferDimensions;
1684
+ get parentFramebufferDimensions() {
1685
+ if (this.rttParent !== null) {
1686
+ return this.rttParent.framebufferDimensions;
1461
1687
  }
1462
- return { width: this.width, height: this.height };
1688
+ this.rttParent = this.findParentRTTNode();
1689
+ return this.rttParent ? this.rttParent.framebufferDimensions : null;
1463
1690
  }
1464
1691
  /**
1465
1692
  * Returns the parent render texture node if it exists.
@@ -1483,33 +1710,33 @@ export class CoreNode extends EventEmitter {
1483
1710
  }
1484
1711
  const oldTexture = this.props.texture;
1485
1712
  if (oldTexture) {
1486
- oldTexture.setRenderableOwner(this, false);
1487
1713
  this.unloadTexture();
1714
+ if (this.autosizer !== null && value === null) {
1715
+ this.autosizer.setMode(AutosizeMode.Children); // Set to children size mode
1716
+ }
1488
1717
  }
1718
+ this.textureCoords = undefined;
1489
1719
  this.props.texture = value;
1490
1720
  if (value !== null) {
1491
- value.setRenderableOwner(this, this.isRenderable);
1721
+ if (this.autosizer !== null) {
1722
+ this.autosizer.setMode(AutosizeMode.Texture); // Set to texture size mode
1723
+ }
1724
+ value.setRenderableOwner(this._id, this.isRenderable);
1492
1725
  this.loadTexture();
1493
1726
  }
1494
1727
  this.setUpdateType(UpdateType.IsRenderable);
1728
+ this.updateIsSimple();
1495
1729
  }
1496
1730
  set textureOptions(value) {
1497
1731
  this.props.textureOptions = value;
1732
+ if (this.stage.calculateTextureCoord === true && value !== null) {
1733
+ this.textureCoords = this.stage.renderer.getTextureCoords(this);
1734
+ }
1735
+ this.updateIsSimple();
1498
1736
  }
1499
1737
  get textureOptions() {
1500
1738
  return this.props.textureOptions;
1501
1739
  }
1502
- get strictBounds() {
1503
- return this.props.strictBounds;
1504
- }
1505
- set strictBounds(v) {
1506
- if (v === this.props.strictBounds) {
1507
- return;
1508
- }
1509
- this.props.strictBounds = v;
1510
- this.setUpdateType(UpdateType.RenderBounds | UpdateType.Children);
1511
- this.childUpdateType |= UpdateType.RenderBounds | UpdateType.Children;
1512
- }
1513
1740
  set interactive(value) {
1514
1741
  this.props.interactive = value;
1515
1742
  // Update Stage's interactive Set
@@ -1520,6 +1747,10 @@ export class CoreNode extends EventEmitter {
1520
1747
  get interactive() {
1521
1748
  return this.props.interactive;
1522
1749
  }
1750
+ setRTTUpdates(type) {
1751
+ this.hasRTTupdates = true;
1752
+ this.parent?.setRTTUpdates(type);
1753
+ }
1523
1754
  animate(props, settings) {
1524
1755
  const animation = new CoreAnimation(this, props, settings);
1525
1756
  const controller = new CoreAnimationController(this.stage.animationManager, animation);
@@ -1528,5 +1759,53 @@ export class CoreNode extends EventEmitter {
1528
1759
  flush() {
1529
1760
  // no-op
1530
1761
  }
1762
+ /**
1763
+ * Add a texture to the current RenderOp.
1764
+ *
1765
+ * @param texture
1766
+ * @returns Assigned Texture Index of the texture in the render op
1767
+ */
1768
+ addTexture(texture) {
1769
+ const textures = this.renderOpTextures;
1770
+ const length = textures.length;
1771
+ for (let i = 0; i < length; i++) {
1772
+ if (textures[i] === texture) {
1773
+ return i;
1774
+ }
1775
+ }
1776
+ if (length >= 1) {
1777
+ return 0xffffffff;
1778
+ }
1779
+ textures.push(texture);
1780
+ return length;
1781
+ }
1782
+ draw(renderer) {
1783
+ const { glw, options, stage } = renderer;
1784
+ const shader = this.props.shader;
1785
+ stage.shManager.useShader(shader.program);
1786
+ shader.program.bindRenderOp(this);
1787
+ // Clipping
1788
+ if (this.clippingRect.valid === true) {
1789
+ const pixelRatio = USE_RTT && this.parentHasRenderTexture ? 1 : stage.pixelRatio;
1790
+ const clipX = Math.round(this.clippingRect.x * pixelRatio);
1791
+ const clipWidth = Math.round(this.clippingRect.width * pixelRatio);
1792
+ const clipHeight = Math.round(this.clippingRect.height * pixelRatio);
1793
+ let clipY = Math.round(options.canvas.height - clipHeight - this.clippingRect.y * pixelRatio);
1794
+ // if parent has render texture, we need to adjust the scissor rect
1795
+ // to be relative to the parent's framebuffer
1796
+ if (USE_RTT && this.parentHasRenderTexture) {
1797
+ clipY = this.parentFramebufferDimensions
1798
+ ? this.parentFramebufferDimensions.h - this.props.h
1799
+ : 0;
1800
+ }
1801
+ glw.setScissorTest(true);
1802
+ glw.scissor(clipX, clipY, clipWidth, clipHeight);
1803
+ }
1804
+ else {
1805
+ glw.setScissorTest(false);
1806
+ }
1807
+ const quadIdx = (this.renderOpBufferIdx / 20) * 6 * 2;
1808
+ glw.drawElements(glw.TRIANGLES, 6 * this.numQuads, glw.UNSIGNED_SHORT, quadIdx);
1809
+ }
1531
1810
  }
1532
1811
  //# sourceMappingURL=CoreNode.js.map