@lightningjs/renderer 3.0.0-beta6 → 3.0.0-beta8

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 (497) hide show
  1. package/COPYING +1 -0
  2. package/LICENSE +202 -202
  3. package/NOTICE +3 -3
  4. package/README.md +147 -147
  5. package/dist/exports/utils.d.ts +2 -1
  6. package/dist/exports/utils.js +2 -1
  7. package/dist/exports/utils.js.map +1 -1
  8. package/dist/src/core/CoreNode.d.ts +33 -49
  9. package/dist/src/core/CoreNode.js +268 -255
  10. package/dist/src/core/CoreNode.js.map +1 -1
  11. package/dist/src/core/CoreTextNode.d.ts +1 -1
  12. package/dist/src/core/CoreTextNode.js +14 -15
  13. package/dist/src/core/CoreTextNode.js.map +1 -1
  14. package/dist/src/core/CoreTextureManager.js +11 -4
  15. package/dist/src/core/CoreTextureManager.js.map +1 -1
  16. package/dist/src/core/Stage.d.ts +27 -26
  17. package/dist/src/core/Stage.js +88 -36
  18. package/dist/src/core/Stage.js.map +1 -1
  19. package/dist/src/core/TextureMemoryManager.d.ts +9 -0
  20. package/dist/src/core/TextureMemoryManager.js +78 -48
  21. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  22. package/dist/src/core/animations/CoreAnimation.js +5 -0
  23. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  24. package/dist/src/core/animations/CoreAnimationController.d.ts +1 -0
  25. package/dist/src/core/animations/CoreAnimationController.js +7 -1
  26. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  27. package/dist/src/core/lib/ImageWorker.js +1 -1
  28. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  29. package/dist/src/core/lib/utils.d.ts +1 -0
  30. package/dist/src/core/lib/utils.js +3 -0
  31. package/dist/src/core/lib/utils.js.map +1 -1
  32. package/dist/src/core/renderers/CoreRenderer.d.ts +1 -0
  33. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  34. package/dist/src/core/renderers/CoreShaderNode.d.ts +1 -0
  35. package/dist/src/core/renderers/CoreShaderNode.js +9 -0
  36. package/dist/src/core/renderers/CoreShaderNode.js.map +1 -1
  37. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +1 -0
  38. package/dist/src/core/renderers/canvas/CanvasRenderer.js +3 -0
  39. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  40. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +1 -4
  41. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
  42. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +0 -3
  43. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  44. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +2 -2
  45. package/dist/src/core/renderers/webgl/WebGlRenderer.js +57 -57
  46. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  47. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +1 -4
  48. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  49. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +35 -35
  50. package/dist/src/core/shaders/canvas/LinearGradient.js +5 -3
  51. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -1
  52. package/dist/src/core/shaders/canvas/RadialGradient.js +13 -11
  53. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
  54. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +7 -5
  55. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  56. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +10 -8
  57. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
  58. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +7 -5
  59. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
  60. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +1 -1
  61. package/dist/src/core/shaders/templates/BorderTemplate.js +1 -1
  62. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -1
  63. package/dist/src/core/shaders/templates/HolePunchTemplate.js +1 -1
  64. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -1
  65. package/dist/src/core/shaders/templates/RoundedTemplate.js +1 -1
  66. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -1
  67. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +1 -1
  68. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +1 -1
  69. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +1 -1
  70. package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +1 -1
  71. package/dist/src/core/shaders/{templates/shaderUtils.d.ts → utils.d.ts} +1 -1
  72. package/dist/src/core/shaders/{templates/shaderUtils.js → utils.js} +2 -2
  73. package/dist/src/core/shaders/utils.js.map +1 -0
  74. package/dist/src/core/shaders/webgl/Border.js +82 -82
  75. package/dist/src/core/shaders/webgl/Default.js +47 -47
  76. package/dist/src/core/shaders/webgl/DefaultBatched.js +61 -61
  77. package/dist/src/core/shaders/webgl/HolePunch.js +36 -35
  78. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -1
  79. package/dist/src/core/shaders/webgl/LinearGradient.js +41 -40
  80. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  81. package/dist/src/core/shaders/webgl/RadialGradient.js +39 -38
  82. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  83. package/dist/src/core/shaders/webgl/Rounded.js +71 -71
  84. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +111 -100
  85. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  86. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +136 -123
  87. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  88. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +54 -54
  89. package/dist/src/core/shaders/webgl/SdfShader.js +62 -62
  90. package/dist/src/core/shaders/webgl/Shadow.js +83 -83
  91. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +0 -50
  92. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  93. package/dist/src/core/textures/ImageTexture.d.ts +1 -1
  94. package/dist/src/core/textures/ImageTexture.js +6 -1
  95. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  96. package/dist/src/core/textures/Texture.d.ts +8 -0
  97. package/dist/src/core/textures/Texture.js +13 -0
  98. package/dist/src/core/textures/Texture.js.map +1 -1
  99. package/dist/src/core/utils.d.ts +1 -1
  100. package/dist/src/main-api/Inspector.d.ts +6 -1
  101. package/dist/src/main-api/Inspector.js +42 -4
  102. package/dist/src/main-api/Inspector.js.map +1 -1
  103. package/dist/src/main-api/Renderer.d.ts +62 -43
  104. package/dist/src/main-api/Renderer.js +119 -31
  105. package/dist/src/main-api/Renderer.js.map +1 -1
  106. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  107. package/exports/canvas-shaders.ts +28 -28
  108. package/exports/canvas.ts +45 -45
  109. package/exports/index.ts +90 -90
  110. package/exports/inspector.ts +24 -24
  111. package/exports/utils.ts +50 -44
  112. package/exports/webgl-shaders.ts +28 -28
  113. package/exports/webgl.ts +50 -50
  114. package/package.json +1 -2
  115. package/src/common/CommonTypes.ts +146 -146
  116. package/src/common/EventEmitter.ts +77 -77
  117. package/src/common/IAnimationController.ts +92 -92
  118. package/src/common/IEventEmitter.ts +28 -28
  119. package/src/core/CoreNode.test.ts +202 -202
  120. package/src/core/CoreNode.ts +2483 -2469
  121. package/src/core/CoreShaderManager.ts +188 -188
  122. package/src/core/CoreTextNode.ts +451 -448
  123. package/src/core/CoreTextureManager.ts +608 -600
  124. package/src/core/Stage.ts +800 -751
  125. package/src/core/TextureMemoryManager.ts +435 -394
  126. package/src/core/animations/AnimationManager.ts +38 -38
  127. package/src/core/animations/CoreAnimation.ts +291 -284
  128. package/src/core/animations/CoreAnimationController.ts +164 -157
  129. package/src/core/lib/ContextSpy.ts +41 -41
  130. package/src/core/lib/ImageWorker.ts +286 -280
  131. package/src/core/lib/Matrix3d.ts +244 -244
  132. package/src/core/lib/RenderCoords.ts +71 -71
  133. package/src/core/lib/WebGlContextWrapper.ts +1374 -1374
  134. package/src/core/lib/textureCompression.ts +152 -152
  135. package/src/core/lib/textureSvg.ts +78 -78
  136. package/src/core/lib/utils.ts +390 -386
  137. package/src/core/lib/validateImageBitmap.ts +87 -87
  138. package/src/core/platforms/Platform.ts +77 -77
  139. package/src/core/platforms/web/WebPlatform.ts +84 -84
  140. package/src/core/renderers/CoreContextTexture.ts +43 -43
  141. package/src/core/renderers/CoreRenderOp.ts +22 -22
  142. package/src/core/renderers/CoreRenderer.ts +110 -109
  143. package/src/core/renderers/CoreShaderNode.ts +175 -165
  144. package/src/core/renderers/CoreShaderProgram.ts +23 -23
  145. package/src/core/renderers/canvas/CanvasRenderer.ts +302 -298
  146. package/src/core/renderers/canvas/CanvasShaderNode.ts +96 -99
  147. package/src/core/renderers/canvas/CanvasTexture.ts +156 -156
  148. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +220 -220
  149. package/src/core/renderers/canvas/internal/ColorUtils.ts +85 -85
  150. package/src/core/renderers/webgl/WebGlCtxRenderTexture.ts +86 -86
  151. package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +50 -50
  152. package/src/core/renderers/webgl/WebGlCtxTexture.ts +298 -301
  153. package/src/core/renderers/webgl/WebGlRenderOp.ts +161 -161
  154. package/src/core/renderers/webgl/WebGlRenderer.ts +747 -750
  155. package/src/core/renderers/webgl/WebGlShaderNode.ts +435 -437
  156. package/src/core/renderers/webgl/WebGlShaderProgram.ts +318 -318
  157. package/src/core/renderers/webgl/internal/BufferCollection.ts +54 -54
  158. package/src/core/renderers/webgl/internal/RendererUtils.ts +155 -155
  159. package/src/core/renderers/webgl/internal/ShaderUtils.ts +281 -281
  160. package/src/core/renderers/webgl/internal/WebGlUtils.ts +35 -35
  161. package/src/core/shaders/canvas/Border.ts +78 -78
  162. package/src/core/shaders/canvas/HolePunch.ts +62 -62
  163. package/src/core/shaders/canvas/LinearGradient.ts +71 -69
  164. package/src/core/shaders/canvas/RadialGradient.ts +99 -113
  165. package/src/core/shaders/canvas/Rounded.ts +55 -55
  166. package/src/core/shaders/canvas/RoundedWithBorder.ts +74 -72
  167. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +90 -88
  168. package/src/core/shaders/canvas/RoundedWithShadow.ts +70 -69
  169. package/src/core/shaders/canvas/Shadow.ts +52 -52
  170. package/src/core/shaders/canvas/utils/render.ts +151 -151
  171. package/src/core/shaders/templates/BorderTemplate.ts +115 -115
  172. package/src/core/shaders/templates/HolePunchTemplate.ts +82 -82
  173. package/src/core/shaders/templates/LinearGradientTemplate.ts +71 -71
  174. package/src/core/shaders/templates/RadialGradientTemplate.ts +81 -81
  175. package/src/core/shaders/templates/RoundedTemplate.ts +98 -98
  176. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +38 -38
  177. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +35 -35
  178. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +35 -35
  179. package/src/core/shaders/templates/ShadowTemplate.ts +106 -106
  180. package/src/core/shaders/{templates/shaderUtils.ts → utils.ts} +46 -47
  181. package/src/core/shaders/webgl/Border.ts +116 -116
  182. package/src/core/shaders/webgl/Default.ts +89 -89
  183. package/src/core/shaders/webgl/DefaultBatched.ts +129 -129
  184. package/src/core/shaders/webgl/HolePunch.ts +75 -78
  185. package/src/core/shaders/webgl/LinearGradient.ts +82 -81
  186. package/src/core/shaders/webgl/RadialGradient.ts +85 -84
  187. package/src/core/shaders/webgl/Rounded.ts +117 -117
  188. package/src/core/shaders/webgl/RoundedWithBorder.ts +155 -144
  189. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +175 -166
  190. package/src/core/shaders/webgl/RoundedWithShadow.ts +98 -98
  191. package/src/core/shaders/webgl/SdfShader.ts +134 -134
  192. package/src/core/shaders/webgl/Shadow.ts +115 -115
  193. package/src/core/text-rendering/TextRenderingUtils.ts +36 -36
  194. package/src/core/text-rendering/TextTextureRendererUtils.ts +263 -263
  195. package/src/core/text-rendering/TrFontManager.ts +183 -183
  196. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +176 -176
  197. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +139 -139
  198. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +173 -173
  199. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +171 -171
  200. package/src/core/text-rendering/font-face-types/TrFontFace.ts +187 -187
  201. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +94 -94
  202. package/src/core/text-rendering/font-face-types/utils.ts +39 -39
  203. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +514 -514
  204. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +863 -863
  205. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +793 -849
  206. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +48 -48
  207. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +66 -66
  208. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +52 -52
  209. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +32 -32
  210. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +117 -117
  211. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +133 -133
  212. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +38 -38
  213. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +497 -497
  214. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +49 -49
  215. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +52 -52
  216. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +205 -205
  217. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +93 -93
  218. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +40 -40
  219. package/src/core/text-rendering/renderers/TextRenderer.ts +567 -567
  220. package/src/core/textures/ColorTexture.ts +102 -102
  221. package/src/core/textures/ImageTexture.ts +418 -410
  222. package/src/core/textures/NoiseTexture.ts +104 -104
  223. package/src/core/textures/RenderTexture.ts +85 -85
  224. package/src/core/textures/SubTexture.ts +205 -205
  225. package/src/core/textures/Texture.ts +372 -358
  226. package/src/core/utils.ts +227 -227
  227. package/src/env.d.ts +7 -7
  228. package/src/main-api/INode.ts +100 -100
  229. package/src/main-api/Inspector.ts +569 -522
  230. package/src/main-api/Renderer.ts +818 -673
  231. package/src/main-api/utils.ts +45 -45
  232. package/src/utils.ts +267 -267
  233. package/dist/exports/core-api.d.ts +0 -74
  234. package/dist/exports/core-api.js +0 -96
  235. package/dist/exports/core-api.js.map +0 -1
  236. package/dist/exports/main-api.d.ts +0 -30
  237. package/dist/exports/main-api.js +0 -45
  238. package/dist/exports/main-api.js.map +0 -1
  239. package/dist/src/core/CoreExtension.d.ts +0 -12
  240. package/dist/src/core/CoreExtension.js +0 -29
  241. package/dist/src/core/CoreExtension.js.map +0 -1
  242. package/dist/src/core/CoreStuff.d.ts +0 -1
  243. package/dist/src/core/CoreStuff.js +0 -138
  244. package/dist/src/core/CoreStuff.js.map +0 -1
  245. package/dist/src/core/CoreTexturizer.d.ts +0 -14
  246. package/dist/src/core/CoreTexturizer.js +0 -47
  247. package/dist/src/core/CoreTexturizer.js.map +0 -1
  248. package/dist/src/core/LngNode.d.ts +0 -736
  249. package/dist/src/core/LngNode.js +0 -1174
  250. package/dist/src/core/LngNode.js.map +0 -1
  251. package/dist/src/core/Matrix2DContext.d.ts +0 -15
  252. package/dist/src/core/Matrix2DContext.js +0 -45
  253. package/dist/src/core/Matrix2DContext.js.map +0 -1
  254. package/dist/src/core/ShaderNode.d.ts +0 -10
  255. package/dist/src/core/ShaderNode.js +0 -30
  256. package/dist/src/core/ShaderNode.js.map +0 -1
  257. package/dist/src/core/TextNode.d.ts +0 -103
  258. package/dist/src/core/TextNode.js +0 -331
  259. package/dist/src/core/TextNode.js.map +0 -1
  260. package/dist/src/core/lib/Coords.d.ts +0 -14
  261. package/dist/src/core/lib/Coords.js +0 -55
  262. package/dist/src/core/lib/Coords.js.map +0 -1
  263. package/dist/src/core/lib/glm/common.d.ts +0 -162
  264. package/dist/src/core/lib/glm/common.js +0 -81
  265. package/dist/src/core/lib/glm/common.js.map +0 -1
  266. package/dist/src/core/lib/glm/index.d.ts +0 -11
  267. package/dist/src/core/lib/glm/index.js +0 -30
  268. package/dist/src/core/lib/glm/index.js.map +0 -1
  269. package/dist/src/core/lib/glm/mat2.d.ts +0 -219
  270. package/dist/src/core/lib/glm/mat2.js +0 -396
  271. package/dist/src/core/lib/glm/mat2.js.map +0 -1
  272. package/dist/src/core/lib/glm/mat2d.d.ts +0 -237
  273. package/dist/src/core/lib/glm/mat2d.js +0 -442
  274. package/dist/src/core/lib/glm/mat2d.js.map +0 -1
  275. package/dist/src/core/lib/glm/mat3.d.ts +0 -283
  276. package/dist/src/core/lib/glm/mat3.js +0 -680
  277. package/dist/src/core/lib/glm/mat3.js.map +0 -1
  278. package/dist/src/core/lib/glm/mat4.d.ts +0 -550
  279. package/dist/src/core/lib/glm/mat4.js +0 -1802
  280. package/dist/src/core/lib/glm/mat4.js.map +0 -1
  281. package/dist/src/core/lib/glm/quat.d.ts +0 -363
  282. package/dist/src/core/lib/glm/quat.js +0 -693
  283. package/dist/src/core/lib/glm/quat.js.map +0 -1
  284. package/dist/src/core/lib/glm/quat2.d.ts +0 -356
  285. package/dist/src/core/lib/glm/quat2.js +0 -754
  286. package/dist/src/core/lib/glm/quat2.js.map +0 -1
  287. package/dist/src/core/lib/glm/vec2.d.ts +0 -365
  288. package/dist/src/core/lib/glm/vec2.js +0 -569
  289. package/dist/src/core/lib/glm/vec2.js.map +0 -1
  290. package/dist/src/core/lib/glm/vec3.d.ts +0 -406
  291. package/dist/src/core/lib/glm/vec3.js +0 -720
  292. package/dist/src/core/lib/glm/vec3.js.map +0 -1
  293. package/dist/src/core/lib/glm/vec4.d.ts +0 -330
  294. package/dist/src/core/lib/glm/vec4.js +0 -608
  295. package/dist/src/core/lib/glm/vec4.js.map +0 -1
  296. package/dist/src/core/platform.d.ts +0 -10
  297. package/dist/src/core/platform.js +0 -56
  298. package/dist/src/core/platform.js.map +0 -1
  299. package/dist/src/core/renderers/CoreShader.d.ts +0 -9
  300. package/dist/src/core/renderers/CoreShader.js +0 -28
  301. package/dist/src/core/renderers/CoreShader.js.map +0 -1
  302. package/dist/src/core/renderers/CoreShaderManager.d.ts +0 -19
  303. package/dist/src/core/renderers/CoreShaderManager.js +0 -33
  304. package/dist/src/core/renderers/CoreShaderManager.js.map +0 -1
  305. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +0 -33
  306. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +0 -250
  307. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +0 -1
  308. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +0 -16
  309. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +0 -123
  310. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +0 -1
  311. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.d.ts +0 -10
  312. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js +0 -43
  313. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js.map +0 -1
  314. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.d.ts +0 -12
  315. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +0 -55
  316. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +0 -1
  317. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.d.ts +0 -9
  318. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +0 -38
  319. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +0 -1
  320. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +0 -57
  321. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +0 -227
  322. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +0 -1
  323. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +0 -34
  324. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +0 -114
  325. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +0 -1
  326. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +0 -133
  327. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +0 -613
  328. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +0 -1
  329. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +0 -83
  330. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +0 -231
  331. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +0 -1
  332. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.d.ts +0 -27
  333. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.js +0 -82
  334. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.js.map +0 -1
  335. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.d.ts +0 -11
  336. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.js +0 -34
  337. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.js.map +0 -1
  338. package/dist/src/core/renderers/webgl/shaders/DefaultShader.d.ts +0 -9
  339. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +0 -87
  340. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +0 -1
  341. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.d.ts +0 -10
  342. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +0 -119
  343. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +0 -1
  344. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +0 -29
  345. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +0 -413
  346. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +0 -1
  347. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.d.ts +0 -28
  348. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +0 -131
  349. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +0 -1
  350. package/dist/src/core/renderers/webgl/shaders/SdfShader.d.ts +0 -47
  351. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +0 -160
  352. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +0 -1
  353. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.d.ts +0 -31
  354. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +0 -71
  355. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +0 -1
  356. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.d.ts +0 -30
  357. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +0 -58
  358. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +0 -1
  359. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.d.ts +0 -31
  360. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +0 -71
  361. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +0 -1
  362. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.d.ts +0 -31
  363. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +0 -71
  364. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +0 -1
  365. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.d.ts +0 -31
  366. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +0 -71
  367. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +0 -1
  368. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.d.ts +0 -9
  369. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +0 -136
  370. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +0 -1
  371. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.d.ts +0 -36
  372. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +0 -85
  373. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +0 -1
  374. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.d.ts +0 -45
  375. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +0 -104
  376. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +0 -1
  377. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +0 -22
  378. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +0 -45
  379. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +0 -1
  380. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.d.ts +0 -58
  381. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +0 -80
  382. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js.map +0 -1
  383. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +0 -35
  384. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +0 -129
  385. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +0 -1
  386. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +0 -39
  387. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +0 -116
  388. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +0 -1
  389. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.d.ts +0 -61
  390. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +0 -127
  391. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js.map +0 -1
  392. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.d.ts +0 -40
  393. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +0 -71
  394. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +0 -1
  395. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.d.ts +0 -115
  396. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js +0 -61
  397. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +0 -1
  398. package/dist/src/core/scene/Scene.d.ts +0 -59
  399. package/dist/src/core/scene/Scene.js +0 -106
  400. package/dist/src/core/scene/Scene.js.map +0 -1
  401. package/dist/src/core/shaders/templates/shaderUtils.js.map +0 -1
  402. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.d.ts +0 -20
  403. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js +0 -55
  404. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js.map +0 -1
  405. package/dist/src/main-api/DynamicShaderController.d.ts +0 -29
  406. package/dist/src/main-api/DynamicShaderController.js +0 -58
  407. package/dist/src/main-api/DynamicShaderController.js.map +0 -1
  408. package/dist/src/main-api/ICoreDriver.d.ts +0 -27
  409. package/dist/src/main-api/ICoreDriver.js +0 -20
  410. package/dist/src/main-api/ICoreDriver.js.map +0 -1
  411. package/dist/src/main-api/IRenderDriver.d.ts +0 -20
  412. package/dist/src/main-api/IRenderDriver.js +0 -20
  413. package/dist/src/main-api/IRenderDriver.js.map +0 -1
  414. package/dist/src/main-api/IShaderController.d.ts +0 -14
  415. package/dist/src/main-api/IShaderController.js +0 -30
  416. package/dist/src/main-api/IShaderController.js.map +0 -1
  417. package/dist/src/main-api/IShaderNode.d.ts +0 -17
  418. package/dist/src/main-api/IShaderNode.js +0 -19
  419. package/dist/src/main-api/IShaderNode.js.map +0 -1
  420. package/dist/src/main-api/RendererMain.d.ts +0 -375
  421. package/dist/src/main-api/RendererMain.js +0 -365
  422. package/dist/src/main-api/RendererMain.js.map +0 -1
  423. package/dist/src/main-api/ShaderController.d.ts +0 -31
  424. package/dist/src/main-api/ShaderController.js +0 -37
  425. package/dist/src/main-api/ShaderController.js.map +0 -1
  426. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.d.ts +0 -9
  427. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js +0 -38
  428. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js.map +0 -1
  429. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.d.ts +0 -56
  430. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js +0 -101
  431. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js.map +0 -1
  432. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.d.ts +0 -32
  433. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js +0 -28
  434. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js.map +0 -1
  435. package/dist/src/render-drivers/main/MainCoreDriver.d.ts +0 -24
  436. package/dist/src/render-drivers/main/MainCoreDriver.js +0 -118
  437. package/dist/src/render-drivers/main/MainCoreDriver.js.map +0 -1
  438. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +0 -99
  439. package/dist/src/render-drivers/main/MainOnlyNode.js +0 -396
  440. package/dist/src/render-drivers/main/MainOnlyNode.js.map +0 -1
  441. package/dist/src/render-drivers/main/MainOnlyShaderController.d.ts +0 -6
  442. package/dist/src/render-drivers/main/MainOnlyShaderController.js +0 -15
  443. package/dist/src/render-drivers/main/MainOnlyShaderController.js.map +0 -1
  444. package/dist/src/render-drivers/main/MainOnlyShaderNode.d.ts +0 -7
  445. package/dist/src/render-drivers/main/MainOnlyShaderNode.js +0 -34
  446. package/dist/src/render-drivers/main/MainOnlyShaderNode.js.map +0 -1
  447. package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +0 -47
  448. package/dist/src/render-drivers/main/MainOnlyTextNode.js +0 -205
  449. package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +0 -1
  450. package/dist/src/render-drivers/main/MainRenderDriver.d.ts +0 -17
  451. package/dist/src/render-drivers/main/MainRenderDriver.js +0 -88
  452. package/dist/src/render-drivers/main/MainRenderDriver.js.map +0 -1
  453. package/dist/src/render-drivers/threadx/NodeStruct.d.ts +0 -90
  454. package/dist/src/render-drivers/threadx/NodeStruct.js +0 -281
  455. package/dist/src/render-drivers/threadx/NodeStruct.js.map +0 -1
  456. package/dist/src/render-drivers/threadx/SharedNode.d.ts +0 -39
  457. package/dist/src/render-drivers/threadx/SharedNode.js +0 -60
  458. package/dist/src/render-drivers/threadx/SharedNode.js.map +0 -1
  459. package/dist/src/render-drivers/threadx/TextNodeStruct.d.ts +0 -44
  460. package/dist/src/render-drivers/threadx/TextNodeStruct.js +0 -201
  461. package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +0 -1
  462. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +0 -28
  463. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +0 -234
  464. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +0 -1
  465. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.d.ts +0 -20
  466. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js +0 -84
  467. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js.map +0 -1
  468. package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +0 -44
  469. package/dist/src/render-drivers/threadx/ThreadXMainNode.js +0 -154
  470. package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +0 -1
  471. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.d.ts +0 -6
  472. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.js +0 -16
  473. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.js.map +0 -1
  474. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.d.ts +0 -7
  475. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.js +0 -15
  476. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.js.map +0 -1
  477. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.d.ts +0 -28
  478. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +0 -55
  479. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +0 -1
  480. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.d.ts +0 -21
  481. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js +0 -198
  482. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js.map +0 -1
  483. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +0 -70
  484. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js +0 -32
  485. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +0 -1
  486. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.d.ts +0 -19
  487. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +0 -177
  488. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +0 -1
  489. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.d.ts +0 -27
  490. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +0 -108
  491. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +0 -1
  492. package/dist/src/render-drivers/threadx/worker/renderer.d.ts +0 -1
  493. package/dist/src/render-drivers/threadx/worker/renderer.js +0 -145
  494. package/dist/src/render-drivers/threadx/worker/renderer.js.map +0 -1
  495. package/dist/src/render-drivers/utils.d.ts +0 -12
  496. package/dist/src/render-drivers/utils.js +0 -69
  497. package/dist/src/render-drivers/utils.js.map +0 -1
@@ -1,600 +1,608 @@
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 { ImageWorkerManager } from './lib/ImageWorker.js';
21
- import type { CoreRenderer } from './renderers/CoreRenderer.js';
22
- import { ColorTexture } from './textures/ColorTexture.js';
23
- import { ImageTexture } from './textures/ImageTexture.js';
24
- import { NoiseTexture } from './textures/NoiseTexture.js';
25
- import { SubTexture } from './textures/SubTexture.js';
26
- import { RenderTexture } from './textures/RenderTexture.js';
27
- import { TextureType, type Texture } from './textures/Texture.js';
28
- import { EventEmitter } from '../common/EventEmitter.js';
29
- import type { Stage } from './Stage.js';
30
- import {
31
- validateCreateImageBitmap,
32
- type CreateImageBitmapSupport,
33
- } from './lib/validateImageBitmap.js';
34
- import type { Platform } from './platforms/Platform.js';
35
-
36
- /**
37
- * Augmentable map of texture class types
38
- *
39
- * @remarks
40
- * This interface can be augmented by other modules/apps to add additional
41
- * texture types. The ones included directly here are the ones that are
42
- * included in the core library.
43
- */
44
- export interface TextureMap {
45
- ColorTexture: typeof ColorTexture;
46
- ImageTexture: typeof ImageTexture;
47
- NoiseTexture: typeof NoiseTexture;
48
- SubTexture: typeof SubTexture;
49
- RenderTexture: typeof RenderTexture;
50
- }
51
-
52
- export type ExtractProps<Type> = Type extends { z$__type__Props: infer Props }
53
- ? Props
54
- : never;
55
-
56
- /**
57
- * Contains information about the texture manager's internal state
58
- * for debugging purposes.
59
- */
60
- export interface TextureManagerDebugInfo {
61
- keyCacheSize: number;
62
- }
63
-
64
- export interface TextureManagerSettings {
65
- numImageWorkers: number;
66
- createImageBitmapSupport: 'auto' | 'basic' | 'options' | 'full';
67
- }
68
-
69
- export type ResizeModeOptions =
70
- | {
71
- /**
72
- * Specifies that the image should be resized to cover the specified dimensions.
73
- */
74
- type: 'cover';
75
- /**
76
- * The horizontal clipping position
77
- * To clip the left, set clipX to 0. To clip the right, set clipX to 1.
78
- * clipX 0.5 will clip a equal amount from left and right
79
- *
80
- * @defaultValue 0.5
81
- */
82
- clipX?: number;
83
- /**
84
- * The vertical clipping position
85
- * To clip the top, set clipY to 0. To clip the bottom, set clipY to 1.
86
- * clipY 0.5 will clip a equal amount from top and bottom
87
- *
88
- * @defaultValue 0.5
89
- */
90
- clipY?: number;
91
- }
92
- | {
93
- /**
94
- * Specifies that the image should be resized to fit within the specified dimensions.
95
- */
96
- type: 'contain';
97
- };
98
-
99
- /**
100
- * Universal options for all texture types
101
- *
102
- * @remarks
103
- * Texture Options provide a way to specify options that are relevant to the
104
- * texture loading process (including caching) and specifically for how a
105
- * texture is rendered within a specific Node (or set of Nodes).
106
- *
107
- * They are not used in determining the cache key for a texture (except if
108
- * the `cacheKey` option is provided explicitly to oveerride the default
109
- * cache key for the texture instance) nor are they stored/referenced within
110
- * the texture instance itself. Instead, the options are stored/referenced
111
- * within individual Nodes. So a single texture instance can be used in
112
- * multiple Nodes each using a different set of options.
113
- */
114
- export interface TextureOptions {
115
- /**
116
- * Preload the texture immediately even if it's not being rendered to the
117
- * screen.
118
- *
119
- * @remarks
120
- * This allows the texture to be used immediately without any delay when it
121
- * is first needed for rendering. Otherwise the loading process will start
122
- * when the texture is first rendered, which may cause a delay in that texture
123
- * being shown properly.
124
- *
125
- * @defaultValue `false`
126
- */
127
- preload?: boolean;
128
-
129
- /**
130
- * Prevent clean up of the texture when it is no longer being used.
131
- *
132
- * @remarks
133
- * This is useful when you want to keep the texture in memory for later use.
134
- * Regardless of whether the texture is being used or not, it will not be
135
- * cleaned up.
136
- *
137
- * @defaultValue `false`
138
- */
139
- preventCleanup?: boolean;
140
-
141
- /**
142
- * Flip the texture horizontally when rendering
143
- *
144
- * @defaultValue `false`
145
- */
146
- flipX?: boolean;
147
-
148
- /**
149
- * Flip the texture vertically when rendering
150
- *
151
- * @defaultValue `false`
152
- */
153
- flipY?: boolean;
154
-
155
- /**
156
- * You can use resizeMode to determine the clipping automatically from the width
157
- * and height of the source texture. This can be convenient if you are unsure about
158
- * the exact image sizes but want the image to cover a specific area.
159
- *
160
- * The resize modes cover and contain are supported
161
- */
162
- resizeMode?: ResizeModeOptions;
163
- }
164
-
165
- export class CoreTextureManager extends EventEmitter {
166
- /**
167
- * Map of textures by cache key
168
- */
169
- keyCache: Map<string, Texture> = new Map();
170
-
171
- /**
172
- * Map of cache keys by texture
173
- */
174
- inverseKeyCache: WeakMap<Texture, string> = new WeakMap();
175
-
176
- /**
177
- * Map of texture constructors by their type name
178
- */
179
- txConstructors: Partial<TextureMap> = {};
180
-
181
- private downloadTextureSourceQueue: Array<Texture> = [];
182
- private priorityQueue: Array<Texture> = [];
183
- private uploadTextureQueue: Array<Texture> = [];
184
- private initialized = false;
185
- private stage: Stage;
186
- private numImageWorkers: number;
187
-
188
- public platform: Platform;
189
-
190
- imageWorkerManager: ImageWorkerManager | null = null;
191
- hasCreateImageBitmap = false;
192
- imageBitmapSupported = {
193
- basic: false,
194
- options: false,
195
- full: false,
196
- };
197
-
198
- hasWorker = !!self.Worker;
199
- /**
200
- * Renderer that this texture manager is associated with
201
- *
202
- * @remarks
203
- * This MUST be set before the texture manager is used. Otherwise errors
204
- * will occur when using the texture manager.
205
- */
206
- renderer!: CoreRenderer;
207
-
208
- /**
209
- * The current frame time in milliseconds
210
- *
211
- * @remarks
212
- * This is used to populate the `lastRenderableChangeTime` property of
213
- * {@link Texture} instances when their renderable state changes.
214
- *
215
- * Set by stage via `updateFrameTime` method.
216
- */
217
- frameTime = 0;
218
-
219
- constructor(stage: Stage, settings: TextureManagerSettings) {
220
- super();
221
-
222
- const { numImageWorkers, createImageBitmapSupport } = settings;
223
- this.stage = stage;
224
- this.platform = stage.platform;
225
- this.numImageWorkers = numImageWorkers;
226
-
227
- if (createImageBitmapSupport === 'auto') {
228
- validateCreateImageBitmap(this.platform)
229
- .then((result) => {
230
- this.initialize(result);
231
- })
232
- .catch((e) => {
233
- console.warn(
234
- '[Lightning] createImageBitmap is not supported on this browser. ImageTexture will be slower.',
235
- );
236
-
237
- // initialized without image worker manager and createImageBitmap
238
- this.initialized = true;
239
- this.emit('initialized');
240
- });
241
- } else {
242
- this.initialize({
243
- basic: createImageBitmapSupport === 'basic',
244
- options: createImageBitmapSupport === 'options',
245
- full: createImageBitmapSupport === 'full',
246
- });
247
- }
248
-
249
- this.registerTextureType('ImageTexture', ImageTexture);
250
- this.registerTextureType('ColorTexture', ColorTexture);
251
- this.registerTextureType('NoiseTexture', NoiseTexture);
252
- this.registerTextureType('SubTexture', SubTexture);
253
- this.registerTextureType('RenderTexture', RenderTexture);
254
- }
255
-
256
- registerTextureType<Type extends keyof TextureMap>(
257
- textureType: Type,
258
- textureClass: TextureMap[Type],
259
- ): void {
260
- this.txConstructors[textureType] = textureClass;
261
- }
262
-
263
- private initialize(support: CreateImageBitmapSupport) {
264
- this.hasCreateImageBitmap =
265
- support.basic || support.options || support.full;
266
- this.imageBitmapSupported = support;
267
-
268
- if (this.hasCreateImageBitmap === false) {
269
- console.warn(
270
- '[Lightning] createImageBitmap is not supported on this browser. ImageTexture will be slower.',
271
- );
272
- }
273
-
274
- if (
275
- this.hasCreateImageBitmap === true &&
276
- this.hasWorker === true &&
277
- this.numImageWorkers > 0
278
- ) {
279
- this.imageWorkerManager = new ImageWorkerManager(
280
- this.numImageWorkers,
281
- support,
282
- );
283
- } else {
284
- console.warn(
285
- '[Lightning] Imageworker is 0 or not supported on this browser. Image loading will be slower.',
286
- );
287
- }
288
-
289
- this.initialized = true;
290
- this.emit('initialized');
291
- }
292
-
293
- /**
294
- * Enqueue a texture for downloading its source image.
295
- */
296
- enqueueDownloadTextureSource(texture: Texture): void {
297
- if (!this.downloadTextureSourceQueue.includes(texture)) {
298
- this.downloadTextureSourceQueue.push(texture);
299
- }
300
- }
301
-
302
- /**
303
- * Enqueue a texture for uploading to the GPU.
304
- *
305
- * @param texture - The texture to upload
306
- */
307
- enqueueUploadTexture(texture: Texture): void {
308
- if (this.uploadTextureQueue.includes(texture) === false) {
309
- this.uploadTextureQueue.push(texture);
310
- }
311
- }
312
-
313
- /**
314
- * Create a texture
315
- *
316
- * @param textureType - The type of texture to create
317
- * @param props - The properties to use for the texture
318
- */
319
- createTexture<Type extends keyof TextureMap>(
320
- textureType: Type,
321
- props: ExtractProps<TextureMap[Type]>,
322
- ): InstanceType<TextureMap[Type]> {
323
- let texture: Texture | undefined;
324
- const TextureClass = this.txConstructors[textureType];
325
- if (!TextureClass) {
326
- throw new Error(`Texture type "${textureType}" is not registered`);
327
- }
328
-
329
- const cacheKey = TextureClass.makeCacheKey(props as any);
330
- if (cacheKey && this.keyCache.has(cacheKey)) {
331
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
332
- texture = this.keyCache.get(cacheKey)!;
333
- } else {
334
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
335
- texture = new TextureClass(this, props as any);
336
-
337
- if (cacheKey) {
338
- this.initTextureToCache(texture, cacheKey);
339
- }
340
- }
341
-
342
- return texture as InstanceType<TextureMap[Type]>;
343
- }
344
-
345
- orphanTexture(texture: Texture): void {
346
- // if it is part of the download or upload queue, remove it
347
- this.removeTextureFromQueue(texture);
348
-
349
- if (texture.type === TextureType.subTexture) {
350
- // ignore subtextures
351
- return;
352
- }
353
-
354
- this.stage.txMemManager.addToOrphanedTextures(texture);
355
- }
356
-
357
- /**
358
- * Override loadTexture to use the batched approach.
359
- *
360
- * @param texture - The texture to load
361
- * @param immediate - Whether to prioritize the texture for immediate loading
362
- */
363
- loadTexture(texture: Texture, priority?: boolean): void {
364
- this.stage.txMemManager.removeFromOrphanedTextures(texture);
365
-
366
- if (texture.type === TextureType.subTexture) {
367
- // ignore subtextures - they get loaded through their parent
368
- return;
369
- }
370
-
371
- // if the texture is already loaded, don't load it again
372
- if (
373
- texture.ctxTexture !== undefined &&
374
- texture.ctxTexture.state === 'loaded'
375
- ) {
376
- texture.setState('loaded');
377
- return;
378
- }
379
-
380
- // if the texture is already being processed, don't load it again
381
- if (
382
- this.downloadTextureSourceQueue.includes(texture) === true ||
383
- this.uploadTextureQueue.includes(texture) === true
384
- ) {
385
- return;
386
- }
387
-
388
- // if the texture is already loading, free it, this can happen if the texture is
389
- // orphaned and then reloaded
390
- if (
391
- texture.ctxTexture !== undefined &&
392
- texture.ctxTexture.state === 'loading'
393
- ) {
394
- // if the texture has texture data, queue it for upload
395
- if (texture.textureData !== null) {
396
- this.enqueueUploadTexture(texture);
397
- }
398
-
399
- // else we will have to re-download the texture
400
- texture.free();
401
- }
402
-
403
- // if we're not initialized, just queue the texture into the priority queue
404
- if (this.initialized === false) {
405
- this.priorityQueue.push(texture);
406
- return;
407
- }
408
-
409
- // these types of textures don't need to be downloaded
410
- // Technically the noise texture shouldn't either, but it's a special case
411
- // and not really used in production so who cares ¯\_(ツ)_/¯
412
- if (
413
- (texture.type === TextureType.color ||
414
- texture.type === TextureType.renderToTexture) &&
415
- texture.state !== 'initial'
416
- ) {
417
- texture.setState('fetched');
418
- this.enqueueUploadTexture(texture);
419
- return;
420
- }
421
-
422
- texture.setState('loading');
423
-
424
- // prioritize the texture for immediate loading
425
- if (priority === true) {
426
- texture
427
- .getTextureData()
428
- .then(() => {
429
- this.uploadTexture(texture);
430
- })
431
- .catch((err) => {
432
- console.error(err);
433
- });
434
- }
435
-
436
- // enqueue the texture for download and upload
437
- this.enqueueDownloadTextureSource(texture);
438
- }
439
-
440
- /**
441
- * Upload a texture to the GPU
442
- *
443
- * @param texture Texture to upload
444
- */
445
- uploadTexture(texture: Texture): void {
446
- if (
447
- this.stage.txMemManager.doNotExceedCriticalThreshold === true &&
448
- this.stage.txMemManager.criticalCleanupRequested === true
449
- ) {
450
- // we're at a critical memory threshold, don't upload textures
451
- this.enqueueUploadTexture(texture);
452
- return;
453
- }
454
-
455
- const coreContext = texture.loadCtxTexture();
456
- if (coreContext !== null && coreContext.state === 'loaded') {
457
- texture.setState('loaded');
458
- return;
459
- }
460
-
461
- coreContext.load();
462
- }
463
-
464
- /**
465
- * Check if a texture is being processed
466
- */
467
- isProcessingTexture(texture: Texture): boolean {
468
- return (
469
- this.downloadTextureSourceQueue.includes(texture) === true ||
470
- this.uploadTextureQueue.includes(texture) === true
471
- );
472
- }
473
-
474
- /**
475
- * Process a limited number of downloads and uploads.
476
- *
477
- * @param maxItems - The maximum number of items to process
478
- */
479
- processSome(maxProcessingTime: number): void {
480
- if (this.initialized === false) {
481
- return;
482
- }
483
-
484
- const startTime = this.platform.getTimeStamp();
485
-
486
- // Process priority queue
487
- while (
488
- this.priorityQueue.length > 0 &&
489
- this.platform.getTimeStamp() - startTime < maxProcessingTime
490
- ) {
491
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
492
- const texture = this.priorityQueue.pop()!;
493
- texture.getTextureData().then(() => {
494
- this.uploadTexture(texture);
495
- });
496
- }
497
-
498
- // Process uploads
499
- while (
500
- this.uploadTextureQueue.length > 0 &&
501
- this.platform.getTimeStamp() - startTime < maxProcessingTime
502
- ) {
503
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
504
- this.uploadTexture(this.uploadTextureQueue.pop()!);
505
- }
506
-
507
- // Process downloads
508
- while (
509
- this.downloadTextureSourceQueue.length > 0 &&
510
- this.platform.getTimeStamp() - startTime < maxProcessingTime
511
- ) {
512
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
513
- const texture = this.downloadTextureSourceQueue.shift()!;
514
- texture.getTextureData().then(() => {
515
- if (texture.state === 'fetched') {
516
- this.enqueueUploadTexture(texture);
517
- }
518
- });
519
- }
520
- }
521
-
522
- public hasUpdates(): boolean {
523
- return (
524
- this.downloadTextureSourceQueue.length > 0 ||
525
- this.uploadTextureQueue.length > 0
526
- );
527
- }
528
-
529
- /**
530
- * Initialize a texture to the cache
531
- *
532
- * @param texture Texture to cache
533
- * @param cacheKey Cache key for the texture
534
- */
535
- initTextureToCache(texture: Texture, cacheKey: string) {
536
- const { keyCache, inverseKeyCache } = this;
537
- keyCache.set(cacheKey, texture);
538
- inverseKeyCache.set(texture, cacheKey);
539
- }
540
-
541
- /**
542
- * Get a texture from the cache
543
- *
544
- * @param cacheKey
545
- */
546
- getTextureFromCache(cacheKey: string): Texture | undefined {
547
- return this.keyCache.get(cacheKey);
548
- }
549
-
550
- /**
551
- * Remove a texture from the cache
552
- *
553
- * @remarks
554
- * Called by Texture Cleanup when a texture is freed.
555
- *
556
- * @param texture
557
- */
558
- removeTextureFromCache(texture: Texture) {
559
- const { inverseKeyCache, keyCache } = this;
560
- const cacheKey = inverseKeyCache.get(texture);
561
- if (cacheKey) {
562
- keyCache.delete(cacheKey);
563
- }
564
- }
565
-
566
- /**
567
- * Remove texture from the queue's
568
- *
569
- * @param texture - The texture to remove
570
- */
571
- removeTextureFromQueue(texture: Texture): void {
572
- const downloadIndex = this.downloadTextureSourceQueue.indexOf(texture);
573
- if (downloadIndex !== -1) {
574
- this.downloadTextureSourceQueue.splice(downloadIndex, 1);
575
- }
576
-
577
- const uploadIndex = this.uploadTextureQueue.indexOf(texture);
578
- if (uploadIndex !== -1) {
579
- this.uploadTextureQueue.splice(uploadIndex, 1);
580
- }
581
- }
582
-
583
- /**
584
- * Resolve a parent texture from the cache or fallback to the provided texture.
585
- *
586
- * @param texture - The provided texture to resolve.
587
- * @returns The cached or provided texture.
588
- */
589
- resolveParentTexture(texture: ImageTexture): Texture {
590
- if (!texture?.props) {
591
- return texture;
592
- }
593
-
594
- const cacheKey = ImageTexture.makeCacheKey(texture.props);
595
- const cachedTexture = cacheKey
596
- ? this.getTextureFromCache(cacheKey)
597
- : undefined;
598
- return cachedTexture ?? texture;
599
- }
600
- }
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 { ImageWorkerManager } from './lib/ImageWorker.js';
21
+ import type { CoreRenderer } from './renderers/CoreRenderer.js';
22
+ import { ColorTexture } from './textures/ColorTexture.js';
23
+ import { ImageTexture } from './textures/ImageTexture.js';
24
+ import { NoiseTexture } from './textures/NoiseTexture.js';
25
+ import { SubTexture } from './textures/SubTexture.js';
26
+ import { RenderTexture } from './textures/RenderTexture.js';
27
+ import { TextureType, type Texture } from './textures/Texture.js';
28
+ import { EventEmitter } from '../common/EventEmitter.js';
29
+ import type { Stage } from './Stage.js';
30
+ import {
31
+ validateCreateImageBitmap,
32
+ type CreateImageBitmapSupport,
33
+ } from './lib/validateImageBitmap.js';
34
+ import type { Platform } from './platforms/Platform.js';
35
+
36
+ /**
37
+ * Augmentable map of texture class types
38
+ *
39
+ * @remarks
40
+ * This interface can be augmented by other modules/apps to add additional
41
+ * texture types. The ones included directly here are the ones that are
42
+ * included in the core library.
43
+ */
44
+ export interface TextureMap {
45
+ ColorTexture: typeof ColorTexture;
46
+ ImageTexture: typeof ImageTexture;
47
+ NoiseTexture: typeof NoiseTexture;
48
+ SubTexture: typeof SubTexture;
49
+ RenderTexture: typeof RenderTexture;
50
+ }
51
+
52
+ export type ExtractProps<Type> = Type extends { z$__type__Props: infer Props }
53
+ ? Props
54
+ : never;
55
+
56
+ /**
57
+ * Contains information about the texture manager's internal state
58
+ * for debugging purposes.
59
+ */
60
+ export interface TextureManagerDebugInfo {
61
+ keyCacheSize: number;
62
+ }
63
+
64
+ export interface TextureManagerSettings {
65
+ numImageWorkers: number;
66
+ createImageBitmapSupport: 'auto' | 'basic' | 'options' | 'full';
67
+ }
68
+
69
+ export type ResizeModeOptions =
70
+ | {
71
+ /**
72
+ * Specifies that the image should be resized to cover the specified dimensions.
73
+ */
74
+ type: 'cover';
75
+ /**
76
+ * The horizontal clipping position
77
+ * To clip the left, set clipX to 0. To clip the right, set clipX to 1.
78
+ * clipX 0.5 will clip a equal amount from left and right
79
+ *
80
+ * @defaultValue 0.5
81
+ */
82
+ clipX?: number;
83
+ /**
84
+ * The vertical clipping position
85
+ * To clip the top, set clipY to 0. To clip the bottom, set clipY to 1.
86
+ * clipY 0.5 will clip a equal amount from top and bottom
87
+ *
88
+ * @defaultValue 0.5
89
+ */
90
+ clipY?: number;
91
+ }
92
+ | {
93
+ /**
94
+ * Specifies that the image should be resized to fit within the specified dimensions.
95
+ */
96
+ type: 'contain';
97
+ };
98
+
99
+ /**
100
+ * Universal options for all texture types
101
+ *
102
+ * @remarks
103
+ * Texture Options provide a way to specify options that are relevant to the
104
+ * texture loading process (including caching) and specifically for how a
105
+ * texture is rendered within a specific Node (or set of Nodes).
106
+ *
107
+ * They are not used in determining the cache key for a texture (except if
108
+ * the `cacheKey` option is provided explicitly to oveerride the default
109
+ * cache key for the texture instance) nor are they stored/referenced within
110
+ * the texture instance itself. Instead, the options are stored/referenced
111
+ * within individual Nodes. So a single texture instance can be used in
112
+ * multiple Nodes each using a different set of options.
113
+ */
114
+ export interface TextureOptions {
115
+ /**
116
+ * Preload the texture immediately even if it's not being rendered to the
117
+ * screen.
118
+ *
119
+ * @remarks
120
+ * This allows the texture to be used immediately without any delay when it
121
+ * is first needed for rendering. Otherwise the loading process will start
122
+ * when the texture is first rendered, which may cause a delay in that texture
123
+ * being shown properly.
124
+ *
125
+ * @defaultValue `false`
126
+ */
127
+ preload?: boolean;
128
+
129
+ /**
130
+ * Prevent clean up of the texture when it is no longer being used.
131
+ *
132
+ * @remarks
133
+ * This is useful when you want to keep the texture in memory for later use.
134
+ * Regardless of whether the texture is being used or not, it will not be
135
+ * cleaned up.
136
+ *
137
+ * @defaultValue `false`
138
+ */
139
+ preventCleanup?: boolean;
140
+
141
+ /**
142
+ * Flip the texture horizontally when rendering
143
+ *
144
+ * @defaultValue `false`
145
+ */
146
+ flipX?: boolean;
147
+
148
+ /**
149
+ * Flip the texture vertically when rendering
150
+ *
151
+ * @defaultValue `false`
152
+ */
153
+ flipY?: boolean;
154
+
155
+ /**
156
+ * You can use resizeMode to determine the clipping automatically from the width
157
+ * and height of the source texture. This can be convenient if you are unsure about
158
+ * the exact image sizes but want the image to cover a specific area.
159
+ *
160
+ * The resize modes cover and contain are supported
161
+ */
162
+ resizeMode?: ResizeModeOptions;
163
+ }
164
+
165
+ export class CoreTextureManager extends EventEmitter {
166
+ /**
167
+ * Map of textures by cache key
168
+ */
169
+ keyCache: Map<string, Texture> = new Map();
170
+
171
+ /**
172
+ * Map of cache keys by texture
173
+ */
174
+ inverseKeyCache: WeakMap<Texture, string> = new WeakMap();
175
+
176
+ /**
177
+ * Map of texture constructors by their type name
178
+ */
179
+ txConstructors: Partial<TextureMap> = {};
180
+
181
+ private downloadTextureSourceQueue: Array<Texture> = [];
182
+ private priorityQueue: Array<Texture> = [];
183
+ private uploadTextureQueue: Array<Texture> = [];
184
+ private initialized = false;
185
+ private stage: Stage;
186
+ private numImageWorkers: number;
187
+
188
+ public platform: Platform;
189
+
190
+ imageWorkerManager: ImageWorkerManager | null = null;
191
+ hasCreateImageBitmap = false;
192
+ imageBitmapSupported = {
193
+ basic: false,
194
+ options: false,
195
+ full: false,
196
+ };
197
+
198
+ hasWorker = !!self.Worker;
199
+ /**
200
+ * Renderer that this texture manager is associated with
201
+ *
202
+ * @remarks
203
+ * This MUST be set before the texture manager is used. Otherwise errors
204
+ * will occur when using the texture manager.
205
+ */
206
+ renderer!: CoreRenderer;
207
+
208
+ /**
209
+ * The current frame time in milliseconds
210
+ *
211
+ * @remarks
212
+ * This is used to populate the `lastRenderableChangeTime` property of
213
+ * {@link Texture} instances when their renderable state changes.
214
+ *
215
+ * Set by stage via `updateFrameTime` method.
216
+ */
217
+ frameTime = 0;
218
+
219
+ constructor(stage: Stage, settings: TextureManagerSettings) {
220
+ super();
221
+
222
+ const { numImageWorkers, createImageBitmapSupport } = settings;
223
+ this.stage = stage;
224
+ this.platform = stage.platform;
225
+ this.numImageWorkers = numImageWorkers;
226
+
227
+ if (createImageBitmapSupport === 'auto') {
228
+ validateCreateImageBitmap(this.platform)
229
+ .then((result) => {
230
+ this.initialize(result);
231
+ })
232
+ .catch((e) => {
233
+ console.warn(
234
+ '[Lightning] createImageBitmap is not supported on this browser. ImageTexture will be slower.',
235
+ );
236
+
237
+ // initialized without image worker manager and createImageBitmap
238
+ this.initialized = true;
239
+ this.emit('initialized');
240
+ });
241
+ } else {
242
+ this.initialize({
243
+ basic: createImageBitmapSupport === 'basic',
244
+ options: createImageBitmapSupport === 'options',
245
+ full: createImageBitmapSupport === 'full',
246
+ });
247
+ }
248
+
249
+ this.registerTextureType('ImageTexture', ImageTexture);
250
+ this.registerTextureType('ColorTexture', ColorTexture);
251
+ this.registerTextureType('NoiseTexture', NoiseTexture);
252
+ this.registerTextureType('SubTexture', SubTexture);
253
+ this.registerTextureType('RenderTexture', RenderTexture);
254
+ }
255
+
256
+ registerTextureType<Type extends keyof TextureMap>(
257
+ textureType: Type,
258
+ textureClass: TextureMap[Type],
259
+ ): void {
260
+ this.txConstructors[textureType] = textureClass;
261
+ }
262
+
263
+ private initialize(support: CreateImageBitmapSupport) {
264
+ this.hasCreateImageBitmap =
265
+ support.basic || support.options || support.full;
266
+ this.imageBitmapSupported = support;
267
+
268
+ if (this.hasCreateImageBitmap === false) {
269
+ console.warn(
270
+ '[Lightning] createImageBitmap is not supported on this browser. ImageTexture will be slower.',
271
+ );
272
+ }
273
+
274
+ if (
275
+ this.hasCreateImageBitmap === true &&
276
+ this.hasWorker === true &&
277
+ this.numImageWorkers > 0
278
+ ) {
279
+ this.imageWorkerManager = new ImageWorkerManager(
280
+ this.numImageWorkers,
281
+ support,
282
+ );
283
+ } else {
284
+ console.warn(
285
+ '[Lightning] Imageworker is 0 or not supported on this browser. Image loading will be slower.',
286
+ );
287
+ }
288
+
289
+ this.initialized = true;
290
+ this.emit('initialized');
291
+ }
292
+
293
+ /**
294
+ * Enqueue a texture for downloading its source image.
295
+ */
296
+ enqueueDownloadTextureSource(texture: Texture): void {
297
+ if (!this.downloadTextureSourceQueue.includes(texture)) {
298
+ this.downloadTextureSourceQueue.push(texture);
299
+ }
300
+ }
301
+
302
+ /**
303
+ * Enqueue a texture for uploading to the GPU.
304
+ *
305
+ * @param texture - The texture to upload
306
+ */
307
+ enqueueUploadTexture(texture: Texture): void {
308
+ if (this.uploadTextureQueue.includes(texture) === false) {
309
+ this.uploadTextureQueue.push(texture);
310
+ }
311
+ }
312
+
313
+ /**
314
+ * Create a texture
315
+ *
316
+ * @param textureType - The type of texture to create
317
+ * @param props - The properties to use for the texture
318
+ */
319
+ createTexture<Type extends keyof TextureMap>(
320
+ textureType: Type,
321
+ props: ExtractProps<TextureMap[Type]>,
322
+ ): InstanceType<TextureMap[Type]> {
323
+ let texture: Texture | undefined;
324
+ const TextureClass = this.txConstructors[textureType];
325
+ if (!TextureClass) {
326
+ throw new Error(`Texture type "${textureType}" is not registered`);
327
+ }
328
+
329
+ const cacheKey = TextureClass.makeCacheKey(props as any);
330
+ if (cacheKey && this.keyCache.has(cacheKey)) {
331
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
332
+ texture = this.keyCache.get(cacheKey)!;
333
+ } else {
334
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
335
+ texture = new TextureClass(this, props as any);
336
+
337
+ if (cacheKey) {
338
+ this.initTextureToCache(texture, cacheKey);
339
+ }
340
+ }
341
+
342
+ return texture as InstanceType<TextureMap[Type]>;
343
+ }
344
+
345
+ orphanTexture(texture: Texture): void {
346
+ // if it is part of the download or upload queue, remove it
347
+ this.removeTextureFromQueue(texture);
348
+
349
+ if (texture.type === TextureType.subTexture) {
350
+ // ignore subtextures
351
+ return;
352
+ }
353
+
354
+ this.stage.txMemManager.addToOrphanedTextures(texture);
355
+ }
356
+
357
+ /**
358
+ * Override loadTexture to use the batched approach.
359
+ *
360
+ * @param texture - The texture to load
361
+ * @param immediate - Whether to prioritize the texture for immediate loading
362
+ */
363
+ loadTexture(texture: Texture, priority?: boolean): void {
364
+ this.stage.txMemManager.removeFromOrphanedTextures(texture);
365
+
366
+ if (texture.type === TextureType.subTexture) {
367
+ // ignore subtextures - they get loaded through their parent
368
+ return;
369
+ }
370
+
371
+ // if the texture is already loaded, don't load it again
372
+ if (
373
+ texture.ctxTexture !== undefined &&
374
+ texture.ctxTexture.state === 'loaded'
375
+ ) {
376
+ texture.setState('loaded');
377
+ return;
378
+ }
379
+
380
+ // if the texture is already being processed, don't load it again
381
+ if (
382
+ this.downloadTextureSourceQueue.includes(texture) === true ||
383
+ this.uploadTextureQueue.includes(texture) === true
384
+ ) {
385
+ return;
386
+ }
387
+
388
+ // if the texture is already loading, free it, this can happen if the texture is
389
+ // orphaned and then reloaded
390
+ if (
391
+ texture.ctxTexture !== undefined &&
392
+ texture.ctxTexture.state === 'loading'
393
+ ) {
394
+ // if the texture has texture data, queue it for upload
395
+ if (texture.textureData !== null) {
396
+ this.enqueueUploadTexture(texture);
397
+ return;
398
+ }
399
+
400
+ // else we will have to re-download the texture
401
+ texture.free();
402
+ }
403
+
404
+ // if we're not initialized, just queue the texture into the priority queue
405
+ if (this.initialized === false) {
406
+ this.priorityQueue.push(texture);
407
+ return;
408
+ }
409
+
410
+ // If the texture failed to load, we need to re-download it.
411
+ if (texture.state === 'failed') {
412
+ texture.free();
413
+ texture.freeTextureData();
414
+ }
415
+
416
+ // these types of textures don't need to be downloaded
417
+ // Technically the noise texture shouldn't either, but it's a special case
418
+ // and not really used in production so who cares ¯\_()_/¯
419
+ if (
420
+ (texture.type === TextureType.color ||
421
+ texture.type === TextureType.renderToTexture) &&
422
+ texture.state !== 'initial'
423
+ ) {
424
+ texture.setState('fetched');
425
+ this.enqueueUploadTexture(texture);
426
+ return;
427
+ }
428
+
429
+ texture.setState('loading');
430
+
431
+ // prioritize the texture for immediate loading
432
+ if (priority === true) {
433
+ texture
434
+ .getTextureData()
435
+ .then(() => {
436
+ this.uploadTexture(texture);
437
+ })
438
+ .catch((err) => {
439
+ console.error(err);
440
+ });
441
+ }
442
+
443
+ // enqueue the texture for download and upload
444
+ this.enqueueDownloadTextureSource(texture);
445
+ }
446
+
447
+ /**
448
+ * Upload a texture to the GPU
449
+ *
450
+ * @param texture Texture to upload
451
+ */
452
+ uploadTexture(texture: Texture): void {
453
+ if (
454
+ this.stage.txMemManager.doNotExceedCriticalThreshold === true &&
455
+ this.stage.txMemManager.criticalCleanupRequested === true
456
+ ) {
457
+ // we're at a critical memory threshold, don't upload textures
458
+ this.enqueueUploadTexture(texture);
459
+ return;
460
+ }
461
+
462
+ const coreContext = texture.loadCtxTexture();
463
+ if (coreContext !== null && coreContext.state === 'loaded') {
464
+ texture.setState('loaded');
465
+ return;
466
+ }
467
+
468
+ coreContext.load();
469
+ }
470
+
471
+ /**
472
+ * Check if a texture is being processed
473
+ */
474
+ isProcessingTexture(texture: Texture): boolean {
475
+ return (
476
+ this.downloadTextureSourceQueue.includes(texture) === true ||
477
+ this.uploadTextureQueue.includes(texture) === true
478
+ );
479
+ }
480
+
481
+ /**
482
+ * Process a limited number of downloads and uploads.
483
+ *
484
+ * @param maxItems - The maximum number of items to process
485
+ */
486
+ processSome(maxProcessingTime: number): void {
487
+ if (this.initialized === false) {
488
+ return;
489
+ }
490
+
491
+ const platform = this.platform;
492
+ const startTime = platform.getTimeStamp();
493
+
494
+ // Process priority queue
495
+ while (
496
+ this.priorityQueue.length > 0 &&
497
+ platform.getTimeStamp() - startTime < maxProcessingTime
498
+ ) {
499
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
500
+ const texture = this.priorityQueue.pop()!;
501
+ texture.getTextureData().then(() => {
502
+ this.uploadTexture(texture);
503
+ });
504
+ }
505
+
506
+ // Process uploads
507
+ while (
508
+ this.uploadTextureQueue.length > 0 &&
509
+ platform.getTimeStamp() - startTime < maxProcessingTime
510
+ ) {
511
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
512
+ this.uploadTexture(this.uploadTextureQueue.pop()!);
513
+ }
514
+
515
+ // Process downloads
516
+ while (
517
+ this.downloadTextureSourceQueue.length > 0 &&
518
+ platform.getTimeStamp() - startTime < maxProcessingTime
519
+ ) {
520
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
521
+ const texture = this.downloadTextureSourceQueue.shift()!;
522
+ texture.getTextureData().then(() => {
523
+ if (texture.state === 'fetched') {
524
+ this.enqueueUploadTexture(texture);
525
+ }
526
+ });
527
+ }
528
+ }
529
+
530
+ public hasUpdates(): boolean {
531
+ return (
532
+ this.downloadTextureSourceQueue.length > 0 ||
533
+ this.uploadTextureQueue.length > 0
534
+ );
535
+ }
536
+
537
+ /**
538
+ * Initialize a texture to the cache
539
+ *
540
+ * @param texture Texture to cache
541
+ * @param cacheKey Cache key for the texture
542
+ */
543
+ initTextureToCache(texture: Texture, cacheKey: string) {
544
+ const { keyCache, inverseKeyCache } = this;
545
+ keyCache.set(cacheKey, texture);
546
+ inverseKeyCache.set(texture, cacheKey);
547
+ }
548
+
549
+ /**
550
+ * Get a texture from the cache
551
+ *
552
+ * @param cacheKey
553
+ */
554
+ getTextureFromCache(cacheKey: string): Texture | undefined {
555
+ return this.keyCache.get(cacheKey);
556
+ }
557
+
558
+ /**
559
+ * Remove a texture from the cache
560
+ *
561
+ * @remarks
562
+ * Called by Texture Cleanup when a texture is freed.
563
+ *
564
+ * @param texture
565
+ */
566
+ removeTextureFromCache(texture: Texture) {
567
+ const { inverseKeyCache, keyCache } = this;
568
+ const cacheKey = inverseKeyCache.get(texture);
569
+ if (cacheKey) {
570
+ keyCache.delete(cacheKey);
571
+ }
572
+ }
573
+
574
+ /**
575
+ * Remove texture from the queue's
576
+ *
577
+ * @param texture - The texture to remove
578
+ */
579
+ removeTextureFromQueue(texture: Texture): void {
580
+ const downloadIndex = this.downloadTextureSourceQueue.indexOf(texture);
581
+ if (downloadIndex !== -1) {
582
+ this.downloadTextureSourceQueue.splice(downloadIndex, 1);
583
+ }
584
+
585
+ const uploadIndex = this.uploadTextureQueue.indexOf(texture);
586
+ if (uploadIndex !== -1) {
587
+ this.uploadTextureQueue.splice(uploadIndex, 1);
588
+ }
589
+ }
590
+
591
+ /**
592
+ * Resolve a parent texture from the cache or fallback to the provided texture.
593
+ *
594
+ * @param texture - The provided texture to resolve.
595
+ * @returns The cached or provided texture.
596
+ */
597
+ resolveParentTexture(texture: ImageTexture): Texture {
598
+ if (!texture?.props) {
599
+ return texture;
600
+ }
601
+
602
+ const cacheKey = ImageTexture.makeCacheKey(texture.props);
603
+ const cachedTexture = cacheKey
604
+ ? this.getTextureFromCache(cacheKey)
605
+ : undefined;
606
+ return cachedTexture ?? texture;
607
+ }
608
+ }