@lightningtv/renderer 3.0.0-beta1 → 3.2.4

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 (503) 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 +1 -1
  6. package/dist/exports/canvas.js +1 -19
  7. package/dist/exports/canvas.js.map +1 -1
  8. package/dist/exports/index.d.ts +2 -5
  9. package/dist/exports/index.js +1 -23
  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 +2 -1
  19. package/dist/exports/webgl.js +2 -19
  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 +139 -101
  32. package/dist/src/core/CoreNode.js +813 -528
  33. package/dist/src/core/CoreNode.js.map +1 -1
  34. package/dist/src/core/CoreShaderManager.d.ts +3 -3
  35. package/dist/src/core/CoreShaderManager.js +0 -18
  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 +25 -14
  41. package/dist/src/core/CoreTextureManager.js +83 -140
  42. package/dist/src/core/CoreTextureManager.js.map +1 -1
  43. package/dist/src/core/Stage.d.ts +102 -36
  44. package/dist/src/core/Stage.js +424 -191
  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 +11 -4
  50. package/dist/src/core/TextureMemoryManager.js +114 -134
  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 -3
  55. package/dist/src/core/animations/CoreAnimation.js +8 -24
  56. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  57. package/dist/src/core/animations/CoreAnimationController.d.ts +1 -0
  58. package/dist/src/core/animations/CoreAnimationController.js +11 -22
  59. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  60. package/dist/src/core/lib/ContextSpy.js +0 -18
  61. package/dist/src/core/lib/ContextSpy.js.map +1 -1
  62. package/dist/src/core/lib/ImageWorker.d.ts +2 -2
  63. package/dist/src/core/lib/ImageWorker.js +33 -31
  64. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  65. package/dist/src/core/lib/Matrix3d.d.ts +1 -0
  66. package/dist/src/core/lib/Matrix3d.js +7 -19
  67. package/dist/src/core/lib/Matrix3d.js.map +1 -1
  68. package/dist/src/core/lib/RenderCoords.d.ts +9 -10
  69. package/dist/src/core/lib/RenderCoords.js +27 -55
  70. package/dist/src/core/lib/RenderCoords.js.map +1 -1
  71. package/dist/src/core/lib/WebGlContextWrapper.d.ts +78 -3
  72. package/dist/src/core/lib/WebGlContextWrapper.js +150 -25
  73. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  74. package/dist/src/core/lib/collectionUtils.d.ts +5 -0
  75. package/dist/src/core/lib/collectionUtils.js +82 -0
  76. package/dist/src/core/lib/collectionUtils.js.map +1 -0
  77. package/dist/src/core/lib/colorCache.d.ts +1 -0
  78. package/dist/src/core/lib/colorCache.js +19 -0
  79. package/dist/src/core/lib/colorCache.js.map +1 -0
  80. package/dist/src/core/{renderers/canvas/internal/ColorUtils.js → lib/colorParser.js} +1 -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 -85
  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 -1
  88. package/dist/src/core/lib/utils.js +44 -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 +42 -0
  94. package/dist/src/core/platforms/Platform.js +4 -0
  95. package/dist/src/core/platforms/Platform.js.map +1 -0
  96. package/dist/src/core/platforms/web/WebPlatform.d.ts +10 -0
  97. package/dist/src/core/platforms/web/WebPlatform.js +90 -0
  98. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -0
  99. package/dist/src/core/renderers/CoreContextTexture.d.ts +2 -1
  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 +15 -3
  105. package/dist/src/core/renderers/CoreRenderer.js +1 -18
  106. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  107. package/dist/src/core/renderers/CoreShaderNode.d.ts +13 -3
  108. package/dist/src/core/renderers/CoreShaderNode.js +25 -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 +4 -5
  113. package/dist/src/core/renderers/canvas/CanvasRenderer.js +89 -83
  114. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  115. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +3 -21
  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 +18 -31
  119. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -1
  120. package/dist/src/core/renderers/webgl/BatchRenderOp.d.ts +25 -0
  121. package/dist/src/core/renderers/webgl/BatchRenderOp.js +60 -0
  122. package/dist/src/core/renderers/webgl/BatchRenderOp.js.map +1 -0
  123. package/dist/src/core/renderers/webgl/SdfRenderOp.d.ts +33 -0
  124. package/dist/src/core/renderers/webgl/SdfRenderOp.js +80 -0
  125. package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -0
  126. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +2 -0
  127. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +14 -24
  128. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -1
  129. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +13 -0
  130. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +34 -23
  131. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -1
  132. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +16 -6
  133. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +102 -70
  134. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  135. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +34 -20
  136. package/dist/src/core/renderers/webgl/WebGlRenderer.js +319 -195
  137. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  138. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +2 -3
  139. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +1 -4
  140. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  141. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +9 -7
  142. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +99 -48
  143. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  144. package/dist/src/core/renderers/webgl/internal/BufferCollection.d.ts +1 -0
  145. package/dist/src/core/renderers/webgl/internal/BufferCollection.js +12 -21
  146. package/dist/src/core/renderers/webgl/internal/BufferCollection.js.map +1 -1
  147. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +0 -18
  148. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
  149. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +0 -18
  150. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  151. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js +0 -18
  152. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js.map +1 -1
  153. package/dist/src/core/shaders/canvas/Border.d.ts +8 -2
  154. package/dist/src/core/shaders/canvas/Border.js +67 -41
  155. package/dist/src/core/shaders/canvas/Border.js.map +1 -1
  156. package/dist/src/core/shaders/canvas/HolePunch.js +3 -19
  157. package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -1
  158. package/dist/src/core/shaders/canvas/LinearGradient.js +7 -21
  159. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -1
  160. package/dist/src/core/shaders/canvas/RadialGradient.js +14 -28
  161. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
  162. package/dist/src/core/shaders/canvas/Rounded.js +1 -17
  163. package/dist/src/core/shaders/canvas/Rounded.js.map +1 -1
  164. package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +6 -3
  165. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +44 -22
  166. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  167. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +2 -3
  168. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +47 -25
  169. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
  170. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +9 -21
  171. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
  172. package/dist/src/core/shaders/canvas/Shadow.js +0 -16
  173. package/dist/src/core/shaders/canvas/Shadow.js.map +1 -1
  174. package/dist/src/core/shaders/canvas/utils/render.d.ts +1 -1
  175. package/dist/src/core/shaders/canvas/utils/render.js +31 -34
  176. package/dist/src/core/shaders/canvas/utils/render.js.map +1 -1
  177. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +12 -2
  178. package/dist/src/core/shaders/templates/BorderTemplate.js +31 -27
  179. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -1
  180. package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +2 -2
  181. package/dist/src/core/shaders/templates/HolePunchTemplate.js +3 -19
  182. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -1
  183. package/dist/src/core/shaders/templates/LinearGradientTemplate.js +0 -16
  184. package/dist/src/core/shaders/templates/LinearGradientTemplate.js.map +1 -1
  185. package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +8 -6
  186. package/dist/src/core/shaders/templates/RadialGradientTemplate.js +2 -18
  187. package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +1 -1
  188. package/dist/src/core/shaders/templates/RoundedTemplate.js +1 -17
  189. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -1
  190. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +1 -1
  191. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js +0 -16
  192. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js.map +1 -1
  193. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +4 -2
  194. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js +3 -17
  195. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js.map +1 -1
  196. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +1 -1
  197. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js +0 -16
  198. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js.map +1 -1
  199. package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +1 -1
  200. package/dist/src/core/shaders/templates/ShadowTemplate.js +0 -16
  201. package/dist/src/core/shaders/templates/ShadowTemplate.js.map +1 -1
  202. package/dist/src/core/shaders/{templates/shaderUtils.d.ts → utils.d.ts} +1 -1
  203. package/dist/src/core/shaders/utils.js +25 -0
  204. package/dist/src/core/shaders/utils.js.map +1 -0
  205. package/dist/src/core/shaders/webgl/Border.js +118 -51
  206. package/dist/src/core/shaders/webgl/Border.js.map +1 -1
  207. package/dist/src/core/shaders/webgl/Default.js +6 -41
  208. package/dist/src/core/shaders/webgl/Default.js.map +1 -1
  209. package/dist/src/core/shaders/webgl/HolePunch.js +4 -19
  210. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -1
  211. package/dist/src/core/shaders/webgl/LinearGradient.js +73 -34
  212. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  213. package/dist/src/core/shaders/webgl/RadialGradient.js +56 -48
  214. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  215. package/dist/src/core/shaders/webgl/Rounded.js +25 -23
  216. package/dist/src/core/shaders/webgl/Rounded.js.map +1 -1
  217. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +160 -55
  218. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  219. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +168 -58
  220. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  221. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +73 -34
  222. package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -1
  223. package/dist/src/core/shaders/webgl/SdfShader.d.ts +0 -2
  224. package/dist/src/core/shaders/webgl/SdfShader.js +8 -36
  225. package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -1
  226. package/dist/src/core/shaders/webgl/Shadow.js +39 -34
  227. package/dist/src/core/shaders/webgl/Shadow.js.map +1 -1
  228. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +59 -0
  229. package/dist/src/core/text-rendering/CanvasFontHandler.js +206 -0
  230. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -0
  231. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +17 -0
  232. package/dist/src/core/text-rendering/CanvasTextRenderer.js +139 -0
  233. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -0
  234. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +167 -0
  235. package/dist/src/core/text-rendering/SdfFontHandler.js +371 -0
  236. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -0
  237. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +18 -0
  238. package/dist/src/core/text-rendering/SdfTextRenderer.js +301 -0
  239. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -0
  240. package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +18 -0
  241. package/dist/src/core/text-rendering/TextLayoutEngine.js +380 -0
  242. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -0
  243. package/dist/src/core/text-rendering/TextRenderer.d.ts +384 -0
  244. package/dist/src/core/text-rendering/TextRenderer.js +2 -0
  245. package/dist/src/core/text-rendering/TextRenderer.js.map +1 -0
  246. package/dist/src/core/text-rendering/Utils.d.ts +30 -0
  247. package/dist/src/core/text-rendering/Utils.js +66 -0
  248. package/dist/src/core/text-rendering/Utils.js.map +1 -0
  249. package/dist/src/core/textures/ColorTexture.d.ts +1 -1
  250. package/dist/src/core/textures/ColorTexture.js +3 -22
  251. package/dist/src/core/textures/ColorTexture.js.map +1 -1
  252. package/dist/src/core/textures/ImageTexture.d.ts +13 -6
  253. package/dist/src/core/textures/ImageTexture.js +57 -66
  254. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  255. package/dist/src/core/textures/NoiseTexture.d.ts +3 -3
  256. package/dist/src/core/textures/NoiseTexture.js +8 -26
  257. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  258. package/dist/src/core/textures/RenderTexture.d.ts +7 -7
  259. package/dist/src/core/textures/RenderTexture.js +12 -30
  260. package/dist/src/core/textures/RenderTexture.js.map +1 -1
  261. package/dist/src/core/textures/SubTexture.d.ts +6 -8
  262. package/dist/src/core/textures/SubTexture.js +19 -55
  263. package/dist/src/core/textures/SubTexture.js.map +1 -1
  264. package/dist/src/core/textures/Texture.d.ts +90 -12
  265. package/dist/src/core/textures/Texture.js +160 -35
  266. package/dist/src/core/textures/Texture.js.map +1 -1
  267. package/dist/src/core/utils.d.ts +2 -1
  268. package/dist/src/core/utils.js +1 -19
  269. package/dist/src/core/utils.js.map +1 -1
  270. package/dist/src/main-api/INode.js.map +1 -1
  271. package/dist/src/main-api/Inspector.d.ts +135 -2
  272. package/dist/src/main-api/Inspector.js +507 -30
  273. package/dist/src/main-api/Inspector.js.map +1 -1
  274. package/dist/src/main-api/Renderer.d.ts +294 -81
  275. package/dist/src/main-api/Renderer.js +225 -96
  276. package/dist/src/main-api/Renderer.js.map +1 -1
  277. package/dist/src/utils.d.ts +19 -6
  278. package/dist/src/utils.js +32 -27
  279. package/dist/src/utils.js.map +1 -1
  280. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  281. package/dist/tsconfig.tsbuildinfo +1 -0
  282. package/exports/canvas-shaders.ts +0 -17
  283. package/exports/canvas.ts +1 -19
  284. package/exports/index.ts +6 -27
  285. package/exports/inspector.ts +0 -19
  286. package/exports/utils.ts +7 -19
  287. package/exports/webgl-shaders.ts +0 -16
  288. package/exports/webgl.ts +3 -20
  289. package/package.json +23 -22
  290. package/src/common/CommonTypes.ts +20 -22
  291. package/src/common/EventEmitter.ts +0 -19
  292. package/src/common/IAnimationController.ts +0 -18
  293. package/src/common/IEventEmitter.ts +0 -17
  294. package/src/core/Autosizer.ts +205 -0
  295. package/src/core/CoreNode.test.ts +376 -45
  296. package/src/core/CoreNode.ts +1017 -656
  297. package/src/core/CoreShaderManager.ts +3 -21
  298. package/src/core/CoreTextNode.ts +457 -314
  299. package/src/core/CoreTextureManager.ts +123 -168
  300. package/src/core/Stage.ts +526 -236
  301. package/src/core/TextureError.ts +46 -0
  302. package/src/core/TextureMemoryManager.ts +150 -167
  303. package/src/core/animations/AnimationManager.ts +0 -19
  304. package/src/core/animations/CoreAnimation.ts +15 -32
  305. package/src/core/animations/CoreAnimationController.ts +13 -23
  306. package/src/core/lib/ContextSpy.ts +0 -19
  307. package/src/core/lib/ImageWorker.ts +45 -32
  308. package/src/core/lib/Matrix3d.ts +7 -20
  309. package/src/core/lib/RenderCoords.ts +36 -67
  310. package/src/core/lib/WebGlContextWrapper.ts +196 -72
  311. package/src/core/lib/collectionUtils.ts +99 -0
  312. package/src/core/lib/colorCache.ts +20 -0
  313. package/src/core/{renderers/canvas/internal/ColorUtils.ts → lib/colorParser.ts} +2 -21
  314. package/src/core/lib/textureCompression.ts +433 -93
  315. package/src/core/lib/textureSvg.ts +0 -19
  316. package/src/core/lib/utils.ts +58 -19
  317. package/src/core/lib/validateImageBitmap.ts +17 -6
  318. package/src/core/platforms/Platform.ts +64 -0
  319. package/src/core/platforms/web/WebPlatform.ts +132 -0
  320. package/src/core/renderers/CoreContextTexture.ts +2 -20
  321. package/src/core/renderers/CoreRenderOp.ts +0 -19
  322. package/src/core/renderers/CoreRenderer.ts +16 -23
  323. package/src/core/renderers/CoreShaderNode.ts +37 -6
  324. package/src/core/renderers/CoreShaderProgram.ts +0 -19
  325. package/src/core/renderers/canvas/CanvasRenderer.ts +108 -137
  326. package/src/core/renderers/canvas/CanvasShaderNode.ts +3 -23
  327. package/src/core/renderers/canvas/CanvasTexture.ts +25 -37
  328. package/src/core/renderers/webgl/SdfRenderOp.ts +88 -0
  329. package/src/core/renderers/webgl/WebGlCtxRenderTexture.ts +18 -34
  330. package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +50 -24
  331. package/src/core/renderers/webgl/WebGlCtxTexture.ts +134 -103
  332. package/src/core/renderers/webgl/WebGlRenderer.ts +368 -233
  333. package/src/core/renderers/webgl/WebGlShaderNode.ts +4 -7
  334. package/src/core/renderers/webgl/WebGlShaderProgram.ts +122 -76
  335. package/src/core/renderers/webgl/internal/BufferCollection.ts +15 -23
  336. package/src/core/renderers/webgl/internal/RendererUtils.ts +0 -19
  337. package/src/core/renderers/webgl/internal/ShaderUtils.ts +0 -19
  338. package/src/core/renderers/webgl/internal/WebGlUtils.ts +0 -19
  339. package/src/core/shaders/canvas/Border.ts +91 -50
  340. package/src/core/shaders/canvas/HolePunch.ts +4 -28
  341. package/src/core/shaders/canvas/LinearGradient.ts +10 -25
  342. package/src/core/shaders/canvas/RadialGradient.ts +23 -54
  343. package/src/core/shaders/canvas/Rounded.ts +2 -19
  344. package/src/core/shaders/canvas/RoundedWithBorder.ts +72 -35
  345. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +77 -47
  346. package/src/core/shaders/canvas/RoundedWithShadow.ts +21 -34
  347. package/src/core/shaders/canvas/Shadow.ts +0 -17
  348. package/src/core/shaders/canvas/utils/render.ts +45 -53
  349. package/src/core/shaders/templates/BorderTemplate.ts +42 -29
  350. package/src/core/shaders/templates/HolePunchTemplate.ts +5 -22
  351. package/src/core/shaders/templates/LinearGradientTemplate.ts +0 -17
  352. package/src/core/shaders/templates/RadialGradientTemplate.ts +10 -25
  353. package/src/core/shaders/templates/RoundedTemplate.ts +1 -18
  354. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +1 -18
  355. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +7 -19
  356. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +1 -18
  357. package/src/core/shaders/templates/ShadowTemplate.ts +1 -18
  358. package/src/core/shaders/utils.ts +30 -0
  359. package/src/core/shaders/webgl/Border.ts +118 -55
  360. package/src/core/shaders/webgl/Default.ts +6 -43
  361. package/src/core/shaders/webgl/HolePunch.ts +4 -24
  362. package/src/core/shaders/webgl/LinearGradient.ts +73 -35
  363. package/src/core/shaders/webgl/RadialGradient.ts +58 -51
  364. package/src/core/shaders/webgl/Rounded.ts +25 -45
  365. package/src/core/shaders/webgl/RoundedWithBorder.ts +161 -63
  366. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +169 -68
  367. package/src/core/shaders/webgl/RoundedWithShadow.ts +73 -39
  368. package/src/core/shaders/webgl/SdfShader.ts +8 -41
  369. package/src/core/shaders/webgl/Shadow.ts +39 -35
  370. package/src/core/text-rendering/CanvasFontHandler.ts +285 -0
  371. package/src/core/text-rendering/CanvasTextRenderer.ts +236 -0
  372. package/src/core/text-rendering/SdfFontHandler.ts +566 -0
  373. package/src/core/text-rendering/SdfTextRenderer.ts +406 -0
  374. package/src/core/text-rendering/TextLayoutEngine.ts +672 -0
  375. package/src/core/text-rendering/TextRenderer.ts +426 -0
  376. package/src/core/text-rendering/Utils.ts +80 -0
  377. package/src/core/text-rendering/tests/TextLayoutEngine.test.ts +434 -0
  378. package/src/core/textures/ColorTexture.ts +7 -24
  379. package/src/core/textures/ImageTexture.ts +110 -92
  380. package/src/core/textures/NoiseTexture.ts +14 -31
  381. package/src/core/textures/RenderTexture.ts +18 -35
  382. package/src/core/textures/SubTexture.ts +25 -65
  383. package/src/core/textures/Texture.ts +214 -46
  384. package/src/core/utils.ts +9 -26
  385. package/src/main-api/INode.ts +0 -18
  386. package/src/main-api/Inspector.ts +794 -38
  387. package/src/main-api/Renderer.ts +519 -159
  388. package/src/utils.ts +64 -29
  389. package/dist/src/core/platform.d.ts +0 -10
  390. package/dist/src/core/platform.js +0 -56
  391. package/dist/src/core/platform.js.map +0 -1
  392. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +0 -1
  393. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +0 -217
  394. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +0 -1
  395. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +0 -1
  396. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +0 -36
  397. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +0 -107
  398. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +0 -1
  399. package/dist/src/core/shaders/templates/shaderUtils.js +0 -41
  400. package/dist/src/core/shaders/templates/shaderUtils.js.map +0 -1
  401. package/dist/src/core/shaders/webgl/DefaultBatched.d.ts +0 -2
  402. package/dist/src/core/shaders/webgl/DefaultBatched.js +0 -104
  403. package/dist/src/core/shaders/webgl/DefaultBatched.js.map +0 -1
  404. package/dist/src/core/text-rendering/TextRenderingUtils.d.ts +0 -12
  405. package/dist/src/core/text-rendering/TextRenderingUtils.js +0 -14
  406. package/dist/src/core/text-rendering/TextRenderingUtils.js.map +0 -1
  407. package/dist/src/core/text-rendering/TextTextureRendererUtils.d.ts +0 -72
  408. package/dist/src/core/text-rendering/TextTextureRendererUtils.js +0 -217
  409. package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +0 -1
  410. package/dist/src/core/text-rendering/TrFontManager.d.ts +0 -26
  411. package/dist/src/core/text-rendering/TrFontManager.js +0 -131
  412. package/dist/src/core/text-rendering/TrFontManager.js.map +0 -1
  413. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.d.ts +0 -39
  414. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +0 -125
  415. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +0 -1
  416. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.d.ts +0 -103
  417. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js +0 -21
  418. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js.map +0 -1
  419. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.d.ts +0 -62
  420. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +0 -88
  421. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +0 -1
  422. package/dist/src/core/text-rendering/font-face-types/TrFontFace.d.ts +0 -118
  423. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +0 -63
  424. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +0 -1
  425. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.d.ts +0 -14
  426. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +0 -66
  427. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +0 -1
  428. package/dist/src/core/text-rendering/font-face-types/utils.d.ts +0 -1
  429. package/dist/src/core/text-rendering/font-face-types/utils.js +0 -38
  430. package/dist/src/core/text-rendering/font-face-types/utils.js.map +0 -1
  431. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +0 -59
  432. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +0 -397
  433. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +0 -1
  434. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +0 -126
  435. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +0 -551
  436. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +0 -1
  437. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +0 -91
  438. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +0 -611
  439. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +0 -1
  440. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.d.ts +0 -12
  441. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js +0 -61
  442. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js.map +0 -1
  443. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.d.ts +0 -33
  444. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js +0 -52
  445. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js.map +0 -1
  446. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.d.ts +0 -13
  447. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js +0 -32
  448. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js.map +0 -1
  449. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +0 -23
  450. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +0 -84
  451. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js.map +0 -1
  452. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.d.ts +0 -4
  453. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js +0 -34
  454. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js.map +0 -1
  455. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +0 -20
  456. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +0 -308
  457. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +0 -1
  458. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.d.ts +0 -10
  459. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js +0 -40
  460. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js.map +0 -1
  461. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +0 -26
  462. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js +0 -70
  463. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js.map +0 -1
  464. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.d.ts +0 -16
  465. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js +0 -39
  466. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js.map +0 -1
  467. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +0 -370
  468. package/dist/src/core/text-rendering/renderers/TextRenderer.js +0 -178
  469. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +0 -1
  470. package/scripts/please-use-pnpm.js +0 -13
  471. package/src/core/platform.ts +0 -64
  472. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +0 -220
  473. package/src/core/renderers/webgl/WebGlRenderOp.ts +0 -145
  474. package/src/core/shaders/templates/shaderUtils.ts +0 -47
  475. package/src/core/shaders/webgl/DefaultBatched.ts +0 -129
  476. package/src/core/text-rendering/TextRenderingUtils.ts +0 -36
  477. package/src/core/text-rendering/TextTextureRendererUtils.ts +0 -263
  478. package/src/core/text-rendering/TrFontManager.ts +0 -183
  479. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +0 -176
  480. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +0 -139
  481. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +0 -173
  482. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +0 -171
  483. package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -187
  484. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -94
  485. package/src/core/text-rendering/font-face-types/utils.ts +0 -39
  486. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +0 -509
  487. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -815
  488. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +0 -841
  489. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +0 -48
  490. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +0 -66
  491. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +0 -52
  492. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +0 -32
  493. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +0 -117
  494. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +0 -133
  495. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +0 -38
  496. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +0 -408
  497. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +0 -49
  498. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +0 -52
  499. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +0 -205
  500. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +0 -93
  501. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +0 -40
  502. package/src/core/text-rendering/renderers/TextRenderer.ts +0 -550
  503. /package/dist/src/core/{renderers/canvas/internal/ColorUtils.d.ts → lib/colorParser.d.ts} +0 -0
@@ -1,30 +1,15 @@
1
- /*
2
- * If not stated otherwise in this file or this component's LICENSE file the
3
- * following copyright and licenses apply:
4
- *
5
- * Copyright 2023 Comcast Cable Communications Management, LLC.
6
- *
7
- * Licensed under the Apache License, Version 2.0 (the License);
8
- * you may not use this file except in compliance with the License.
9
- * You may obtain a copy of the License at
10
- *
11
- * http://www.apache.org/licenses/LICENSE-2.0
12
- *
13
- * Unless required by applicable law or agreed to in writing, software
14
- * distributed under the License is distributed on an "AS IS" BASIS,
15
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- * See the License for the specific language governing permissions and
17
- * limitations under the License.
18
- */
19
-
20
- import { assertTruthy, createWebGLContext } from '../../../utils.js';
1
+ import {
2
+ createWebGLContext,
3
+ USE_RTT,
4
+ RENDER_TEXT_BATCHING,
5
+ DIRTY_QUAD_BUFFER,
6
+ } from '../../../utils.js';
21
7
  import {
22
8
  CoreRenderer,
23
9
  type BufferInfo,
24
10
  type CoreRendererOptions,
25
- type QuadOptions,
26
11
  } from '../CoreRenderer.js';
27
- import { WebGlRenderOp } from './WebGlRenderOp.js';
12
+ import type { SdfRenderOp } from './SdfRenderOp.js';
28
13
  import type { CoreContextTexture } from '../CoreContextTexture.js';
29
14
  import {
30
15
  createIndexBuffer,
@@ -35,7 +20,11 @@ import {
35
20
  type WebGlColor,
36
21
  } from './internal/RendererUtils.js';
37
22
  import { WebGlCtxTexture } from './WebGlCtxTexture.js';
38
- import { Texture, TextureType } from '../../textures/Texture.js';
23
+ import {
24
+ Texture,
25
+ TextureType,
26
+ type TextureCoords,
27
+ } from '../../textures/Texture.js';
39
28
  import { SubTexture } from '../../textures/SubTexture.js';
40
29
  import { WebGlCtxSubTexture } from './WebGlCtxSubTexture.js';
41
30
  import { BufferCollection } from './internal/BufferCollection.js';
@@ -43,15 +32,12 @@ import { compareRect, getNormalizedRgbaComponents } from '../../lib/utils.js';
43
32
  import { WebGlShaderProgram } from './WebGlShaderProgram.js';
44
33
  import { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
45
34
  import { RenderTexture } from '../../textures/RenderTexture.js';
46
- import { CoreNodeRenderState, type CoreNode } from '../../CoreNode.js';
35
+ import { CoreNodeRenderState, CoreNode } from '../../CoreNode.js';
47
36
  import { WebGlCtxRenderTexture } from './WebGlCtxRenderTexture.js';
48
37
  import { Default } from '../../shaders/webgl/Default.js';
49
38
  import type { WebGlShaderType } from './WebGlShaderNode.js';
50
39
  import { WebGlShaderNode } from './WebGlShaderNode.js';
51
- import type { CoreShaderType } from '../CoreShaderNode.js';
52
-
53
- const WORDS_PER_QUAD = 24;
54
- // const BYTES_PER_QUAD = WORDS_PER_QUAD * 4;
40
+ import type { Dimensions } from '../../../common/CommonTypes.js';
55
41
 
56
42
  export type WebGlRendererOptions = CoreRendererOptions;
57
43
 
@@ -60,6 +46,8 @@ interface CoreWebGlSystem {
60
46
  extensions: CoreWebGlExtensions;
61
47
  }
62
48
 
49
+ export type WebGlRenderOp = CoreNode | SdfRenderOp;
50
+
63
51
  export class WebGlRenderer extends CoreRenderer {
64
52
  //// WebGL Native Context and Data
65
53
  glw: WebGlContextWrapper;
@@ -70,6 +58,7 @@ export class WebGlRenderer extends CoreRenderer {
70
58
  fQuadBuffer: Float32Array;
71
59
  uiQuadBuffer: Uint32Array;
72
60
  renderOps: WebGlRenderOp[] = [];
61
+ coreTextRenderOps: WebGlRenderOp[] = [];
73
62
 
74
63
  //// Render Op / Buffer Filling State
75
64
  curBufferIdx = 0;
@@ -77,6 +66,21 @@ export class WebGlRenderer extends CoreRenderer {
77
66
  override rttNodes: CoreNode[] = [];
78
67
  activeRttNode: CoreNode | null = null;
79
68
 
69
+ /**
70
+ * When true, the entire quad buffer is re-uploaded to the GPU via bufferData
71
+ * (DYNAMIC_DRAW) rather than the surgical per-node bufferSubData path.
72
+ * Set to true on first frame and whenever the renderList changes structurally
73
+ * (node added / removed / reordered).
74
+ */
75
+ needsFullUpload: boolean = true;
76
+
77
+ override defaultTextureCoords: TextureCoords = {
78
+ x1: 0,
79
+ y1: 0,
80
+ x2: 1,
81
+ y2: 1,
82
+ };
83
+
80
84
  //// Default Shader
81
85
  defaultShaderNode: WebGlShaderNode | null = null;
82
86
  quadBufferCollection: BufferCollection;
@@ -125,12 +129,30 @@ export class WebGlRenderer extends CoreRenderer {
125
129
  parameters: getWebGlParameters(this.glw),
126
130
  extensions: getWebGlExtensions(this.glw),
127
131
  };
132
+
133
+ // Create the static node coords buffer
134
+ // 80 is the magic number used in createIndexBuffer
135
+ // @see RendererUtils.ts
136
+ const maxQuads = ~~(this.stage.bufferMemory / 80);
137
+ const nodeCoords = new Float32Array(maxQuads * 8);
138
+ for (let i = 0; i < maxQuads * 8; i += 8) {
139
+ nodeCoords[i] = 0;
140
+ nodeCoords[i + 1] = 0;
141
+ nodeCoords[i + 2] = 1;
142
+ nodeCoords[i + 3] = 0;
143
+ nodeCoords[i + 4] = 0;
144
+ nodeCoords[i + 5] = 1;
145
+ nodeCoords[i + 6] = 1;
146
+ nodeCoords[i + 7] = 1;
147
+ }
148
+ const nodeCoordsBuffer = glw.createBuffer();
149
+ glw.arrayBufferData(nodeCoordsBuffer, nodeCoords, glw.STATIC_DRAW);
150
+
128
151
  const quadBuffer = glw.createBuffer();
129
- assertTruthy(quadBuffer);
130
- const stride = 8 * Float32Array.BYTES_PER_ELEMENT;
152
+ const stride = 5 * Float32Array.BYTES_PER_ELEMENT;
131
153
  this.quadBufferCollection = new BufferCollection([
132
154
  {
133
- buffer: quadBuffer,
155
+ buffer: quadBuffer!,
134
156
  attributes: {
135
157
  a_position: {
136
158
  name: 'a_position',
@@ -156,21 +178,18 @@ export class WebGlRenderer extends CoreRenderer {
156
178
  stride,
157
179
  offset: 4 * Float32Array.BYTES_PER_ELEMENT,
158
180
  },
159
- a_textureIndex: {
160
- name: 'a_textureIndex',
161
- size: 1,
162
- type: glw.FLOAT,
163
- normalized: false,
164
- stride,
165
- offset: 5 * Float32Array.BYTES_PER_ELEMENT,
166
- },
181
+ },
182
+ },
183
+ {
184
+ buffer: nodeCoordsBuffer!,
185
+ attributes: {
167
186
  a_nodeCoords: {
168
187
  name: 'a_nodeCoords',
169
188
  size: 2,
170
189
  type: glw.FLOAT,
171
190
  normalized: false,
172
- stride,
173
- offset: 6 * Float32Array.BYTES_PER_ELEMENT,
191
+ stride: 2 * Float32Array.BYTES_PER_ELEMENT,
192
+ offset: 0,
174
193
  },
175
194
  },
176
195
  },
@@ -179,11 +198,21 @@ export class WebGlRenderer extends CoreRenderer {
179
198
 
180
199
  reset() {
181
200
  const { glw } = this;
182
- this.curBufferIdx = 0;
201
+ if (DIRTY_QUAD_BUFFER) {
202
+ // NOTE: curBufferIdx is intentionally NOT reset here.
203
+ // Each node owns a permanent slot in the quad buffer (assigned in addQuad
204
+ // on first use). Resetting the index is only done when the renderList
205
+ // changes structurally (see Stage.requestRenderListUpdate).
206
+ } else {
207
+ this.curBufferIdx = 0;
208
+ }
183
209
  this.curRenderOp = null;
184
210
  this.renderOps.length = 0;
211
+ this.coreTextRenderOps.length = 0;
185
212
  glw.setScissorTest(false);
186
- glw.clear();
213
+ if (this.stage.options.enableClear !== false) {
214
+ glw.clear();
215
+ }
187
216
  }
188
217
 
189
218
  createShaderProgram(
@@ -246,137 +275,92 @@ export class WebGlRenderer extends CoreRenderer {
246
275
  * Finally, it calculates the vertices for the quad, taking into account any transformations, and adds them to the quad buffer.
247
276
  * The function updates the length and number of quads in the current render operation, and updates the current buffer index.
248
277
  */
249
- addQuad(params: QuadOptions) {
250
- const { fQuadBuffer, uiQuadBuffer } = this;
251
- let texture = params.texture;
278
+ addQuad(node: CoreNode) {
279
+ const f = this.fQuadBuffer;
280
+ const u = this.uiQuadBuffer;
252
281
 
253
- assertTruthy(texture !== null, 'Texture is required');
282
+ if (RENDER_TEXT_BATCHING === true && node.props.zIndex) {
283
+ this.flushTextRenderOps();
284
+ }
254
285
 
255
- let { curBufferIdx: bufferIdx, curRenderOp } = this;
286
+ const reuse = this.reuseRenderOp(node);
256
287
 
257
- if (this.reuseRenderOp(params) === false) {
258
- this.newRenderOp(params, bufferIdx);
259
- curRenderOp = this.curRenderOp;
260
- assertTruthy(curRenderOp);
288
+ // Assign a permanent buffer slot if this node hasn't been registered yet.
289
+ // Once assigned, the slot index never changes unless the renderList is
290
+ // rebuilt (which resets quadBufferIndex to -1 for all nodes).
291
+ if (DIRTY_QUAD_BUFFER) {
292
+ if (node.quadBufferIndex === -1) {
293
+ node.quadBufferIndex = this.curBufferIdx;
294
+ this.curBufferIdx += 20;
295
+ }
296
+ } else {
297
+ // Legacy path: always advance from curBufferIdx sequentially.
298
+ node.quadBufferIndex = this.curBufferIdx;
299
+ this.curBufferIdx += 20;
261
300
  }
262
301
 
263
- let texCoordX1 = 0;
264
- let texCoordY1 = 0;
265
- let texCoordX2 = 1;
266
- let texCoordY2 = 1;
302
+ const i = node.quadBufferIndex;
267
303
 
268
- if (texture.type === TextureType.subTexture) {
269
- const {
270
- x: tx,
271
- y: ty,
272
- width: tw,
273
- height: th,
274
- } = (texture as SubTexture).props;
275
- const { width: parentW = 0, height: parentH = 0 } = (
276
- texture as SubTexture
277
- ).parentTexture.dimensions || { width: 0, height: 0 };
278
- texCoordX1 = tx / parentW;
279
- texCoordX2 = texCoordX1 + tw / parentW;
280
- texCoordY1 = ty / parentH;
281
- texCoordY2 = texCoordY1 + th / parentH;
282
- texture = (texture as SubTexture).parentTexture;
304
+ if (reuse === false) {
305
+ this.newRenderOp(node, i);
283
306
  }
284
307
 
285
- if (
286
- texture.type === TextureType.image &&
287
- params.textureOptions !== null &&
288
- params.textureOptions.resizeMode !== undefined &&
289
- texture.dimensions !== null
290
- ) {
291
- const resizeMode = params.textureOptions.resizeMode;
292
- const { width: tw, height: th } = texture.dimensions;
293
- if (resizeMode.type === 'cover') {
294
- const scaleX = params.width / tw;
295
- const scaleY = params.height / th;
296
- const scale = Math.max(scaleX, scaleY);
297
- const precision = 1 / scale;
298
- // Determine based on width
299
- if (scale && scaleX && scaleX < scale) {
300
- const desiredSize = precision * params.width;
301
- texCoordX1 = (1 - desiredSize / tw) * (resizeMode.clipX ?? 0.5);
302
- texCoordX2 = texCoordX1 + desiredSize / tw;
303
- }
304
- // Determine based on height
305
- if (scale && scaleY && scaleY < scale) {
306
- const desiredSize = precision * params.height;
307
- texCoordY1 = (1 - desiredSize / th) * (resizeMode.clipY ?? 0.5);
308
- texCoordY2 = texCoordY1 + desiredSize / th;
309
- }
310
- }
308
+ const props = node.props;
309
+ let tx = props.texture || this.stage.defaultTexture!;
310
+
311
+ if (tx.type === TextureType.subTexture) {
312
+ tx = (tx as SubTexture).parentTexture;
311
313
  }
312
314
 
313
- // Flip texture coordinates if dictated by texture options
314
- let flipY = 0;
315
- if (params.textureOptions !== null) {
316
- if (params.textureOptions.flipX === true) {
317
- [texCoordX1, texCoordX2] = [texCoordX2, texCoordX1];
318
- }
315
+ const texture = tx.ctxTexture as WebGlCtxTexture;
316
+ let tidx = this.curRenderOp!.addTexture(texture);
317
+
318
+ if (tidx === 0xffffffff) {
319
+ this.newRenderOp(node, i);
320
+ tidx = this.curRenderOp!.addTexture(texture);
321
+ }
319
322
 
320
- // convert to integer for bitwise operation below
321
- flipY = +(params.textureOptions.flipY || false);
322
- }
323
-
324
- // Eitherone should be true
325
- if (flipY ^ +(texture.type === TextureType.renderToTexture)) {
326
- [texCoordY1, texCoordY2] = [texCoordY2, texCoordY1];
327
- }
328
-
329
- const ctxTexture = texture.ctxTexture as WebGlCtxTexture;
330
- assertTruthy(ctxTexture instanceof WebGlCtxTexture);
331
- const textureIdx = this.addTexture(ctxTexture, bufferIdx);
332
-
333
- assertTruthy(this.curRenderOp !== null);
334
- assertTruthy(params.renderCoords);
335
-
336
- // Upper-Left
337
- fQuadBuffer[bufferIdx++] = params.renderCoords.x1; // vertexX
338
- fQuadBuffer[bufferIdx++] = params.renderCoords.y1; // vertexY
339
- fQuadBuffer[bufferIdx++] = texCoordX1; // texCoordX
340
- fQuadBuffer[bufferIdx++] = texCoordY1; // texCoordY
341
- uiQuadBuffer[bufferIdx++] = params.colorTl; // color
342
- fQuadBuffer[bufferIdx++] = textureIdx; // texIndex
343
- fQuadBuffer[bufferIdx++] = 0; //node X coord
344
- fQuadBuffer[bufferIdx++] = 0; //node y coord
345
-
346
- // Upper-Right
347
- fQuadBuffer[bufferIdx++] = params.renderCoords.x2;
348
- fQuadBuffer[bufferIdx++] = params.renderCoords.y2;
349
- fQuadBuffer[bufferIdx++] = texCoordX2;
350
- fQuadBuffer[bufferIdx++] = texCoordY1;
351
- uiQuadBuffer[bufferIdx++] = params.colorTr;
352
- fQuadBuffer[bufferIdx++] = textureIdx;
353
- fQuadBuffer[bufferIdx++] = 1; //node X coord
354
- fQuadBuffer[bufferIdx++] = 0; //node y coord
355
-
356
- // Lower-Left
357
- fQuadBuffer[bufferIdx++] = params.renderCoords.x4;
358
- fQuadBuffer[bufferIdx++] = params.renderCoords.y4;
359
- fQuadBuffer[bufferIdx++] = texCoordX1;
360
- fQuadBuffer[bufferIdx++] = texCoordY2;
361
- uiQuadBuffer[bufferIdx++] = params.colorBl;
362
- fQuadBuffer[bufferIdx++] = textureIdx;
363
- fQuadBuffer[bufferIdx++] = 0; //node X coord
364
- fQuadBuffer[bufferIdx++] = 1; //node y coord
365
-
366
- // Lower-Right
367
- fQuadBuffer[bufferIdx++] = params.renderCoords.x3;
368
- fQuadBuffer[bufferIdx++] = params.renderCoords.y3;
369
- fQuadBuffer[bufferIdx++] = texCoordX2;
370
- fQuadBuffer[bufferIdx++] = texCoordY2;
371
- uiQuadBuffer[bufferIdx++] = params.colorBr;
372
- fQuadBuffer[bufferIdx++] = textureIdx;
373
- fQuadBuffer[bufferIdx++] = 1; //node X coord
374
- fQuadBuffer[bufferIdx++] = 1; //node y coord
375
-
376
- // Update the length of the current render op
377
- this.curRenderOp.length += WORDS_PER_QUAD;
378
- this.curRenderOp.numQuads++;
379
- this.curBufferIdx = bufferIdx;
323
+ // Only rewrite the CPU-side buffer when the node is dirty.
324
+ // The GPU upload is deferred to render().
325
+ if (!DIRTY_QUAD_BUFFER || node.isQuadDirty) {
326
+ const rc = node.renderCoords!;
327
+ const tc = node.textureCoords || this.defaultTextureCoords;
328
+
329
+ const cTl = node.premultipliedColorTl;
330
+ const cTr = node.premultipliedColorTr;
331
+ const cBl = node.premultipliedColorBl;
332
+ const cBr = node.premultipliedColorBr;
333
+
334
+ // Upper-Left
335
+ f[i] = rc.x1;
336
+ f[i + 1] = rc.y1;
337
+ f[i + 2] = tc.x1;
338
+ f[i + 3] = tc.y1;
339
+ u[i + 4] = cTl;
340
+
341
+ // Upper-Right
342
+ f[i + 5] = rc.x2;
343
+ f[i + 6] = rc.y2;
344
+ f[i + 7] = tc.x2;
345
+ f[i + 8] = tc.y1;
346
+ u[i + 9] = cTr;
347
+
348
+ // Lower-Left
349
+ f[i + 10] = rc.x4;
350
+ f[i + 11] = rc.y4;
351
+ f[i + 12] = tc.x1;
352
+ f[i + 13] = tc.y2;
353
+ u[i + 14] = cBl;
354
+
355
+ // Lower-Right
356
+ f[i + 15] = rc.x3;
357
+ f[i + 16] = rc.y3;
358
+ f[i + 17] = tc.x2;
359
+ f[i + 18] = tc.y2;
360
+ u[i + 19] = cBr;
361
+ }
362
+
363
+ this.curRenderOp!.numQuads++;
380
364
  }
381
365
 
382
366
  /**
@@ -386,83 +370,77 @@ export class WebGlRenderer extends CoreRenderer {
386
370
  * @param shader
387
371
  * @param bufferIdx
388
372
  */
389
- private newRenderOp(quad: QuadOptions, bufferIdx: number) {
390
- const curRenderOp = new WebGlRenderOp(this, quad, bufferIdx);
373
+ private newRenderOp(node: CoreNode, bufferIdx: number) {
374
+ const curRenderOp = node;
375
+ curRenderOp.renderOpBufferIdx = bufferIdx;
376
+ curRenderOp.numQuads = 0;
377
+ curRenderOp.renderOpTextures.length = 0;
378
+
391
379
  this.curRenderOp = curRenderOp;
392
380
  this.renderOps.push(curRenderOp);
393
381
  }
394
382
 
395
- /**
396
- * Add a texture to the current RenderOp. If the texture cannot be added to the
397
- * current RenderOp, a new RenderOp will be created and the texture will be added
398
- * to that one.
399
- *
400
- * If the texture cannot be added to the new RenderOp, an error will be thrown.
401
- *
402
- * @param texture
403
- * @param bufferIdx
404
- * @param recursive
405
- * @returns Assigned Texture Index of the texture in the render op
406
- */
407
- private addTexture(
408
- texture: WebGlCtxTexture,
409
- bufferIdx: number,
410
- recursive?: boolean,
411
- ): number {
412
- assertTruthy(this.curRenderOp);
413
- const textureIdx = this.curRenderOp.addTexture(texture);
414
- // TODO: Refactor to be more DRY
415
- if (textureIdx === 0xffffffff) {
416
- if (recursive) {
417
- throw new Error('Unable to add texture to render op');
418
- }
419
- this.newRenderOp(this.curRenderOp.quad as QuadOptions, bufferIdx);
420
- return this.addTexture(texture, bufferIdx, true);
421
- }
422
- return textureIdx;
423
- }
424
-
425
383
  /**
426
384
  * Test if the current Render operation can be reused for the specified parameters.
427
385
  * @param params
428
386
  * @returns
429
387
  */
430
- reuseRenderOp(params: QuadOptions): boolean {
431
- const { shader, parentHasRenderTexture, rtt, clippingRect } = params;
388
+ reuseRenderOp(node: CoreNode): boolean {
389
+ const curRenderOp = this.curRenderOp;
390
+ if (curRenderOp === null) {
391
+ return false;
392
+ }
432
393
 
433
- // Switching shader program will require a new render operation
434
- if (
435
- this.curRenderOp?.shader.shaderKey !==
436
- (shader as WebGlShaderNode).shaderKey
437
- ) {
394
+ const shader = node.props.shader as WebGlShaderNode;
395
+ const curShader = curRenderOp.shader as WebGlShaderNode;
396
+
397
+ if (curShader.shaderKey === 'default' && shader.shaderKey === 'default') {
398
+ return true;
399
+ }
400
+
401
+ // Check if the shader is the same
402
+ if (curShader !== shader) {
438
403
  return false;
439
404
  }
440
405
 
441
- // Switching clipping rect will require a new render operation
406
+ // Force new render operation if rendering to texture is different
407
+ // This is the cheap check, so do it first
442
408
  if (
443
- compareRect(this.curRenderOp.quad.clippingRect, clippingRect) === false
409
+ USE_RTT &&
410
+ (curRenderOp.parentHasRenderTexture !== node.parentHasRenderTexture ||
411
+ (curRenderOp.rtt === true) !== (node.props.rtt === true))
444
412
  ) {
445
413
  return false;
446
414
  }
447
415
 
448
- // Force new render operation if rendering to texture
449
- // @todo: This needs to be improved, render operations could also be reused
450
- // for rendering to texture
451
- if (parentHasRenderTexture !== undefined || rtt !== undefined) {
416
+ // Switching clipping rect will require a new render operation
417
+ // This involves object accessing so do it after integer/boolean checks
418
+ if (compareRect(curRenderOp.clippingRect, node.clippingRect) === false) {
452
419
  return false;
453
420
  }
454
421
 
455
- // Check if the shader can batch the shader properties
456
422
  if (
457
- !this.curRenderOp.shader.program.reuseRenderOp(
458
- params,
459
- this.curRenderOp.quad as QuadOptions,
460
- )
423
+ USE_RTT &&
424
+ node.parentHasRenderTexture === true &&
425
+ node.parentFramebufferDimensions !== null
461
426
  ) {
427
+ const curFbDims = curRenderOp.isCoreNode
428
+ ? curRenderOp.parentFramebufferDimensions
429
+ : curRenderOp.framebufferDimensions;
430
+ if (
431
+ curFbDims === null ||
432
+ curFbDims.w !== node.parentFramebufferDimensions.w ||
433
+ curFbDims.h !== node.parentFramebufferDimensions.h
434
+ ) {
435
+ return false;
436
+ }
437
+ }
438
+
439
+ // Check if the shader can batch the shader properties
440
+ if (curShader.program.reuseRenderOp(node, curRenderOp) === false) {
462
441
  return false;
463
442
  }
464
443
 
465
- // Render operation can be reused
466
444
  return true;
467
445
  }
468
446
 
@@ -470,33 +448,92 @@ export class WebGlRenderer extends CoreRenderer {
470
448
  * add RenderOp to the render pipeline
471
449
  */
472
450
  addRenderOp(renderable: WebGlRenderOp) {
451
+ if (RENDER_TEXT_BATCHING === true) {
452
+ // We are batching text nodes to be added later
453
+ this.coreTextRenderOps.push(renderable);
454
+ return;
455
+ }
473
456
  this.renderOps.push(renderable);
474
457
  this.curRenderOp = null;
475
458
  }
476
459
 
460
+ flushTextRenderOps() {
461
+ const len = this.coreTextRenderOps.length;
462
+ if (len === 0) {
463
+ return;
464
+ }
465
+ for (let i = 0; i < len; i++) {
466
+ this.renderOps.push(this.coreTextRenderOps[i]!);
467
+ }
468
+ this.coreTextRenderOps.length = 0;
469
+ this.curRenderOp = null;
470
+ }
471
+
477
472
  /**
478
473
  * Render the current set of RenderOps to render to the specified surface.
479
474
  *
475
+ * On the first frame after a renderList structural change (`needsFullUpload`
476
+ * is true) the entire quad buffer is re-allocated on the GPU with
477
+ * `bufferData(DYNAMIC_DRAW)`. On every subsequent frame only the slots of
478
+ * nodes flagged `isQuadDirty` are surgically updated via `bufferSubData`,
479
+ * leaving the rest of the GPU's buffer unchanged.
480
+ *
480
481
  * TODO: 'screen' is the only supported surface at the moment.
481
482
  *
482
483
  * @param surface
483
484
  */
484
485
  render(surface: 'screen' | CoreContextTexture = 'screen'): void {
486
+ if (RENDER_TEXT_BATCHING === true) {
487
+ this.flushTextRenderOps();
488
+ }
485
489
  const { glw, quadBuffer } = this;
486
-
487
- const arr = new Float32Array(quadBuffer, 0, this.curBufferIdx);
488
-
489
490
  const buffer = this.quadBufferCollection.getBuffer('a_position') || null;
490
- glw.arrayBufferData(buffer, arr, glw.STATIC_DRAW);
491
+ const BYTES = Float32Array.BYTES_PER_ELEMENT;
492
+
493
+ if (DIRTY_QUAD_BUFFER) {
494
+ if (this.needsFullUpload) {
495
+ // Full GPU re-allocation: covers new nodes and structural reorders.
496
+ // Uses DYNAMIC_DRAW to signal to the driver that the buffer will be
497
+ // updated frequently in smaller pieces going forward.
498
+ const arr = new Float32Array(quadBuffer, 0, this.curBufferIdx);
499
+ glw.arrayBufferData(buffer, arr, glw.DYNAMIC_DRAW);
500
+ this.needsFullUpload = false;
501
+
502
+ // Clear dirty flags since we just uploaded everything.
503
+ const renderList = this.stage.renderList;
504
+ for (let i = 0, len = renderList.length; i < len; i++) {
505
+ renderList[i]!.isQuadDirty = false;
506
+ }
507
+ } else {
508
+ // Surgical per-node uploads: only write the 20 float32s for nodes
509
+ // whose quad data changed since the last frame.
510
+ const renderList = this.stage.renderList;
511
+ for (let i = 0, len = renderList.length; i < len; i++) {
512
+ const node = renderList[i]!;
513
+ if (node.isQuadDirty && node.quadBufferIndex !== -1) {
514
+ const byteOffset = node.quadBufferIndex * BYTES;
515
+ // Create a view directly into the existing CPU buffer — no allocation.
516
+ const view = new Float32Array(quadBuffer, byteOffset, 20);
517
+ glw.arrayBufferSubData(buffer, byteOffset, view);
518
+ node.isQuadDirty = false;
519
+ }
520
+ }
521
+ }
522
+ } else {
523
+ // Legacy path: full buffer upload every frame.
524
+ const arr = new Float32Array(quadBuffer, 0, this.curBufferIdx);
525
+ glw.arrayBufferData(buffer, arr, glw.STATIC_DRAW);
526
+ }
491
527
 
492
528
  for (let i = 0, length = this.renderOps.length; i < length; i++) {
493
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
494
- this.renderOps[i]!.draw();
529
+ this.renderOps[i]!.draw(this);
495
530
  }
496
- this.quadBufferUsage = this.curBufferIdx * arr.BYTES_PER_ELEMENT;
531
+
532
+ const BYTES_PER_ELEMENT = Float32Array.BYTES_PER_ELEMENT;
533
+ this.quadBufferUsage = this.curBufferIdx * BYTES_PER_ELEMENT;
497
534
 
498
535
  // Calculate the size of each quad in bytes (4 vertices per quad) times the size of each vertex in bytes
499
- const QUAD_SIZE_IN_BYTES = 4 * (8 * arr.BYTES_PER_ELEMENT); // 8 attributes per vertex
536
+ const QUAD_SIZE_IN_BYTES = 4 * (5 * BYTES_PER_ELEMENT); // 5 attributes per vertex
500
537
  this.numQuadsRendered = this.quadBufferUsage / QUAD_SIZE_IN_BYTES;
501
538
  }
502
539
 
@@ -603,8 +640,7 @@ export class WebGlRenderer extends CoreRenderer {
603
640
  // Skip nodes that are not visible
604
641
  if (
605
642
  node.worldAlpha === 0 ||
606
- (node.strictBounds === true &&
607
- node.renderState === CoreNodeRenderState.OutOfBounds)
643
+ node.renderState === CoreNodeRenderState.OutOfBounds
608
644
  ) {
609
645
  continue;
610
646
  }
@@ -617,10 +653,7 @@ export class WebGlRenderer extends CoreRenderer {
617
653
  // Set the active RTT node to the current node
618
654
  // So we can prevent rendering children of nested RTT nodes
619
655
  this.activeRttNode = node;
620
-
621
- assertTruthy(node.texture !== null, 'RTT node missing texture');
622
- const ctxTexture = node.texture.ctxTexture;
623
- assertTruthy(ctxTexture instanceof WebGlCtxRenderTexture);
656
+ const ctxTexture = node.texture.ctxTexture as WebGlCtxRenderTexture;
624
657
  this.renderToTextureActive = true;
625
658
 
626
659
  // Bind the the texture's framebuffer
@@ -639,7 +672,7 @@ export class WebGlRenderer extends CoreRenderer {
639
672
  continue;
640
673
  }
641
674
 
642
- this.stage.addQuads(child);
675
+ child.renderQuads(this);
643
676
  child.hasRTTupdates = false;
644
677
  }
645
678
 
@@ -648,6 +681,7 @@ export class WebGlRenderer extends CoreRenderer {
648
681
 
649
682
  // Reset render operations
650
683
  this.renderOps.length = 0;
684
+ this.coreTextRenderOps.length = 0;
651
685
  node.hasRTTupdates = false;
652
686
  }
653
687
 
@@ -662,6 +696,10 @@ export class WebGlRenderer extends CoreRenderer {
662
696
  this.renderToTextureActive = false;
663
697
  }
664
698
 
699
+ updateViewport(): void {
700
+ this.glw.viewport(0, 0, this.glw.canvas.width, this.glw.canvas.height);
701
+ }
702
+
665
703
  removeRTTNode(node: CoreNode) {
666
704
  const index = this.rttNodes.indexOf(node);
667
705
  if (index === -1) {
@@ -682,16 +720,114 @@ export class WebGlRenderer extends CoreRenderer {
682
720
  if (this.defaultShaderNode !== null) {
683
721
  return this.defaultShaderNode as WebGlShaderNode;
684
722
  }
685
- this.stage.shManager.registerShaderType('Default', Default);
723
+ this.stage.shManager.registerShaderType('default', Default);
686
724
  this.defaultShaderNode = this.stage.shManager.createShader(
687
- 'Default',
725
+ 'default',
688
726
  ) as WebGlShaderNode;
689
727
  return this.defaultShaderNode;
690
728
  }
691
729
 
730
+ override getTextureCoords(node: CoreNode): TextureCoords | undefined {
731
+ const texture = node.texture;
732
+ if (texture === null) {
733
+ return undefined;
734
+ }
735
+
736
+ //this stuff needs to be properly moved to CtxSubTexture at some point in the future.
737
+ const ctxTexture =
738
+ (texture as SubTexture).parentTexture !== undefined
739
+ ? (texture as SubTexture).parentTexture.ctxTexture
740
+ : texture.ctxTexture;
741
+ if (ctxTexture === undefined) {
742
+ return undefined;
743
+ }
744
+
745
+ const textureOptions = node.props.textureOptions;
746
+
747
+ //early exit for textures with no options unless its a subtexture
748
+ if (
749
+ texture.type !== TextureType.subTexture &&
750
+ textureOptions === undefined
751
+ ) {
752
+ return (ctxTexture as WebGlCtxTexture).txCoords;
753
+ }
754
+
755
+ let { x1, x2, y1, y2 } = (ctxTexture as WebGlCtxTexture).txCoords;
756
+ if (texture.type === TextureType.subTexture) {
757
+ const { w: parentW, h: parentH } = (texture as SubTexture).parentTexture
758
+ .dimensions!;
759
+ const { x, y, w, h } = (texture as SubTexture).props;
760
+ x1 = x / parentW;
761
+ y1 = y / parentH;
762
+ x2 = x1 + w / parentW;
763
+ y2 = y1 + h / parentH;
764
+ }
765
+
766
+ const resizeMode = textureOptions.resizeMode;
767
+ if (
768
+ resizeMode !== undefined &&
769
+ resizeMode.type === 'cover' &&
770
+ texture.dimensions !== null
771
+ ) {
772
+ const dimensions = texture.dimensions as Dimensions;
773
+ const w = node.props.w;
774
+ const h = node.props.h;
775
+ const scaleX = w / dimensions.w;
776
+ const scaleY = h / dimensions.h;
777
+ const scale = Math.max(scaleX, scaleY);
778
+ const precision = 1 / scale;
779
+
780
+ // Determine based on width
781
+ if (scaleX < scale) {
782
+ const desiredSize = precision * node.props.w;
783
+ x1 = (1 - desiredSize / dimensions.w) * (resizeMode.clipX ?? 0.5);
784
+ x2 = x1 + desiredSize / dimensions.w;
785
+ }
786
+ // Determine based on height
787
+ if (scaleY < scale) {
788
+ const desiredSize = precision * node.props.h;
789
+ y1 = (1 - desiredSize / dimensions.h) * (resizeMode.clipY ?? 0.5);
790
+ y2 = y1 + desiredSize / dimensions.h;
791
+ }
792
+ }
793
+
794
+ if (textureOptions.flipX === true) {
795
+ [x1, x2] = [x2, x1];
796
+ }
797
+ if (textureOptions.flipY === true) {
798
+ [y1, y2] = [y2, y1];
799
+ }
800
+ return {
801
+ x1,
802
+ y1,
803
+ x2,
804
+ y2,
805
+ };
806
+ }
807
+
692
808
  /**
693
- * Updates the WebGL context's clear color and clears the color buffer.
809
+ * Resets all per-node quad buffer slot assignments and schedules a full GPU
810
+ * buffer re-upload on the next render call.
694
811
  *
812
+ * Called by Stage.requestRenderListUpdate() whenever the render list changes
813
+ * structurally (node added, removed, or reordered). After this call, the
814
+ * next addQuad() pass will reassign compact, contiguous slots starting from 0.
815
+ */
816
+ override invalidateQuadBuffer(): void {
817
+ if (!DIRTY_QUAD_BUFFER) {
818
+ return;
819
+ }
820
+ const renderList = this.stage.renderList;
821
+ for (let i = 0, len = renderList.length; i < len; i++) {
822
+ renderList[i]!.quadBufferIndex = -1;
823
+ renderList[i]!.isQuadDirty = true;
824
+ }
825
+ this.curBufferIdx = 0;
826
+ this.needsFullUpload = true;
827
+ }
828
+
829
+ /**
830
+ * Sets the glClearColor to the specified color. *
695
831
  * @param color - The color to set as the clear color, represented as a 32-bit integer.
696
832
  */
697
833
  updateClearColor(color: number) {
@@ -710,6 +846,5 @@ export class WebGlRenderer extends CoreRenderer {
710
846
  raw: color,
711
847
  normalized: normalizedColor,
712
848
  };
713
- glw.clear();
714
849
  }
715
850
  }