@babylonjs/core 8.8.0 → 8.8.2

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 (409) hide show
  1. package/Actions/actionManager.js +2 -0
  2. package/Actions/actionManager.js.map +1 -1
  3. package/Animations/animatable.core.js +1 -1
  4. package/Animations/animatable.core.js.map +1 -1
  5. package/Animations/animation.js +4 -2
  6. package/Animations/animation.js.map +1 -1
  7. package/Audio/audioEngine.d.ts +1 -1
  8. package/Audio/audioEngine.js +20 -10
  9. package/Audio/audioEngine.js.map +1 -1
  10. package/Audio/audioSceneComponent.js +2 -0
  11. package/Audio/audioSceneComponent.js.map +1 -1
  12. package/Audio/sound.js +2 -0
  13. package/Audio/sound.js.map +1 -1
  14. package/AudioV2/abstractAudio/audioEngineV2.js +8 -1
  15. package/AudioV2/abstractAudio/audioEngineV2.js.map +1 -1
  16. package/AudioV2/abstractAudio/streamingSound.js +3 -1
  17. package/AudioV2/abstractAudio/streamingSound.js.map +1 -1
  18. package/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.js +6 -2
  19. package/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.js.map +1 -1
  20. package/AudioV2/abstractAudio/subProperties/audioAnalyzer.js +3 -0
  21. package/AudioV2/abstractAudio/subProperties/audioAnalyzer.js.map +1 -1
  22. package/AudioV2/abstractAudio/subProperties/spatialAudio.js +1 -0
  23. package/AudioV2/abstractAudio/subProperties/spatialAudio.js.map +1 -1
  24. package/AudioV2/webAudio/webAudioEngine.js +5 -1
  25. package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
  26. package/AudioV2/webAudio/webAudioStaticSound.js +2 -0
  27. package/AudioV2/webAudio/webAudioStaticSound.js.map +1 -1
  28. package/AudioV2/webAudio/webAudioStreamingSound.js +3 -0
  29. package/AudioV2/webAudio/webAudioStreamingSound.js.map +1 -1
  30. package/AudioV2/webAudio/webAudioUnmuteUI.js +1 -0
  31. package/AudioV2/webAudio/webAudioUnmuteUI.js.map +1 -1
  32. package/BakedVertexAnimation/vertexAnimationBaker.d.ts +1 -0
  33. package/BakedVertexAnimation/vertexAnimationBaker.js +3 -1
  34. package/BakedVertexAnimation/vertexAnimationBaker.js.map +1 -1
  35. package/Buffers/buffer.nonFloatVertexBuffers.js +1 -0
  36. package/Buffers/buffer.nonFloatVertexBuffers.js.map +1 -1
  37. package/Buffers/storageBuffer.js +1 -1
  38. package/Buffers/storageBuffer.js.map +1 -1
  39. package/Cameras/Inputs/arcRotateCameraVRDeviceOrientationInput.js +2 -0
  40. package/Cameras/Inputs/arcRotateCameraVRDeviceOrientationInput.js.map +1 -1
  41. package/Cameras/Inputs/freeCameraDeviceOrientationInput.js +6 -1
  42. package/Cameras/Inputs/freeCameraDeviceOrientationInput.js.map +1 -1
  43. package/Cameras/VR/vrExperienceHelper.js +2 -0
  44. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  45. package/Collisions/gpuPicker.js +9 -6
  46. package/Collisions/gpuPicker.js.map +1 -1
  47. package/Compute/computeShader.js +1 -1
  48. package/Compute/computeShader.js.map +1 -1
  49. package/Culling/Helper/boundingInfoHelper.js +3 -3
  50. package/Culling/Helper/boundingInfoHelper.js.map +1 -1
  51. package/Culling/Helper/computeShaderBoundingHelper.js +3 -1
  52. package/Culling/Helper/computeShaderBoundingHelper.js.map +1 -1
  53. package/Culling/Helper/transformFeedbackBoundingHelper.js +3 -0
  54. package/Culling/Helper/transformFeedbackBoundingHelper.js.map +1 -1
  55. package/Debug/debugLayer.js +1 -1
  56. package/Debug/debugLayer.js.map +1 -1
  57. package/Engines/AbstractEngine/abstractEngine.cubeTexture.js +1 -0
  58. package/Engines/AbstractEngine/abstractEngine.cubeTexture.js.map +1 -1
  59. package/Engines/Extensions/engine.prefilteredCubeTexture.js +1 -0
  60. package/Engines/Extensions/engine.prefilteredCubeTexture.js.map +1 -1
  61. package/Engines/Extensions/engine.readTexture.js +1 -0
  62. package/Engines/Extensions/engine.readTexture.js.map +1 -1
  63. package/Engines/WebGPU/Extensions/engine.computeShader.js +1 -0
  64. package/Engines/WebGPU/Extensions/engine.computeShader.js.map +1 -1
  65. package/Engines/WebGPU/Extensions/engine.readTexture.js +1 -0
  66. package/Engines/WebGPU/Extensions/engine.readTexture.js.map +1 -1
  67. package/Engines/WebGPU/Extensions/engine.videoTexture.js +2 -0
  68. package/Engines/WebGPU/Extensions/engine.videoTexture.js.map +1 -1
  69. package/Engines/WebGPU/webgpuBufferManager.js +3 -1
  70. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  71. package/Engines/WebGPU/webgpuOcclusionQuery.js +1 -0
  72. package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
  73. package/Engines/WebGPU/webgpuQuerySet.js +15 -9
  74. package/Engines/WebGPU/webgpuQuerySet.js.map +1 -1
  75. package/Engines/WebGPU/webgpuTextureManager.js +1 -0
  76. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  77. package/Engines/WebGPU/webgpuTimestampQuery.js +4 -2
  78. package/Engines/WebGPU/webgpuTimestampQuery.js.map +1 -1
  79. package/Engines/WebGPU/webgpuTintWASM.js +1 -0
  80. package/Engines/WebGPU/webgpuTintWASM.js.map +1 -1
  81. package/Engines/abstractEngine.js +5 -2
  82. package/Engines/abstractEngine.js.map +1 -1
  83. package/Engines/constants.d.ts +23 -0
  84. package/Engines/constants.js +23 -0
  85. package/Engines/constants.js.map +1 -1
  86. package/Engines/engine.common.js +7 -1
  87. package/Engines/engine.common.js.map +1 -1
  88. package/Engines/engine.js +5 -3
  89. package/Engines/engine.js.map +1 -1
  90. package/Engines/engineFactory.js +1 -1
  91. package/Engines/engineFactory.js.map +1 -1
  92. package/Engines/nativeEngine.js +19 -11
  93. package/Engines/nativeEngine.js.map +1 -1
  94. package/Engines/thinEngine.d.ts +1 -0
  95. package/Engines/thinEngine.js +22 -18
  96. package/Engines/thinEngine.js.map +1 -1
  97. package/Engines/webgpuEngine.js +30 -11
  98. package/Engines/webgpuEngine.js.map +1 -1
  99. package/FlowGraph/flowGraphParser.js +2 -2
  100. package/FlowGraph/flowGraphParser.js.map +1 -1
  101. package/FrameGraph/Node/nodeRenderGraph.js +5 -1
  102. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  103. package/FrameGraph/Node/nodeRenderGraphBlock.js +1 -1
  104. package/FrameGraph/Node/nodeRenderGraphBlock.js.map +1 -1
  105. package/FrameGraph/frameGraph.js +1 -1
  106. package/FrameGraph/frameGraph.js.map +1 -1
  107. package/Helpers/sceneHelpers.js +1 -3
  108. package/Helpers/sceneHelpers.js.map +1 -1
  109. package/Helpers/videoDome.js +1 -0
  110. package/Helpers/videoDome.js.map +1 -1
  111. package/Layers/thinEffectLayer.js +1 -0
  112. package/Layers/thinEffectLayer.js.map +1 -1
  113. package/LensFlares/lensFlareSystem.js +1 -0
  114. package/LensFlares/lensFlareSystem.js.map +1 -1
  115. package/Lights/Shadows/shadowGenerator.js +3 -2
  116. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  117. package/Lights/areaLight.js +2 -0
  118. package/Lights/areaLight.js.map +1 -1
  119. package/Loading/sceneLoader.js +56 -22
  120. package/Loading/sceneLoader.js.map +1 -1
  121. package/Materials/GaussianSplatting/gaussianSplattingMaterial.d.ts +15 -1
  122. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +34 -7
  123. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  124. package/Materials/Node/Blocks/Dual/clipPlanesBlock.js +1 -0
  125. package/Materials/Node/Blocks/Dual/clipPlanesBlock.js.map +1 -1
  126. package/Materials/Node/Blocks/Dual/fogBlock.js +1 -0
  127. package/Materials/Node/Blocks/Dual/fogBlock.js.map +1 -1
  128. package/Materials/Node/Blocks/Dual/lightBlock.js +1 -0
  129. package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
  130. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js +1 -0
  131. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js.map +1 -1
  132. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js +1 -0
  133. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js.map +1 -1
  134. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js +1 -0
  135. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js.map +1 -1
  136. package/Materials/Node/Blocks/Fragment/shadowMapBlock.js +1 -0
  137. package/Materials/Node/Blocks/Fragment/shadowMapBlock.js.map +1 -1
  138. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +9 -11
  139. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  140. package/Materials/Node/Blocks/PBR/sheenBlock.js +1 -1
  141. package/Materials/Node/Blocks/PBR/sheenBlock.js.map +1 -1
  142. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js +6 -2
  143. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js.map +1 -1
  144. package/Materials/Node/Blocks/Vertex/bonesBlock.js +1 -0
  145. package/Materials/Node/Blocks/Vertex/bonesBlock.js.map +1 -1
  146. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js +1 -0
  147. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js.map +1 -1
  148. package/Materials/Node/nodeMaterial.js +11 -3
  149. package/Materials/Node/nodeMaterial.js.map +1 -1
  150. package/Materials/Node/nodeMaterialBuildState.js +1 -0
  151. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  152. package/Materials/PBR/pbrBRDFConfiguration.d.ts +11 -0
  153. package/Materials/PBR/pbrBRDFConfiguration.js +16 -0
  154. package/Materials/PBR/pbrBRDFConfiguration.js.map +1 -1
  155. package/Materials/PBR/pbrBaseMaterial.d.ts +4 -0
  156. package/Materials/PBR/pbrBaseMaterial.js +12 -8
  157. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  158. package/Materials/PBR/pbrMaterial.d.ts +8 -0
  159. package/Materials/PBR/pbrMaterial.js +16 -0
  160. package/Materials/PBR/pbrMaterial.js.map +1 -1
  161. package/Materials/Textures/Filtering/hdrIrradianceFiltering.js +1 -0
  162. package/Materials/Textures/Filtering/hdrIrradianceFiltering.js.map +1 -1
  163. package/Materials/Textures/Loaders/basisTextureLoader.js +4 -0
  164. package/Materials/Textures/Loaders/basisTextureLoader.js.map +1 -1
  165. package/Materials/Textures/Loaders/envTextureLoader.js +1 -0
  166. package/Materials/Textures/Loaders/envTextureLoader.js.map +1 -1
  167. package/Materials/Textures/Loaders/exrTextureLoader.js +2 -0
  168. package/Materials/Textures/Loaders/exrTextureLoader.js.map +1 -1
  169. package/Materials/Textures/Loaders/ktxTextureLoader.js +1 -0
  170. package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
  171. package/Materials/Textures/Loaders/textureLoaderManager.js +9 -9
  172. package/Materials/Textures/Loaders/textureLoaderManager.js.map +1 -1
  173. package/Materials/Textures/Packer/packer.js +3 -1
  174. package/Materials/Textures/Packer/packer.js.map +1 -1
  175. package/Materials/Textures/Procedurals/proceduralTexture.js +1 -0
  176. package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
  177. package/Materials/Textures/baseTexture.polynomial.js +1 -0
  178. package/Materials/Textures/baseTexture.polynomial.js.map +1 -1
  179. package/Materials/Textures/hdrCubeTexture.js +1 -0
  180. package/Materials/Textures/hdrCubeTexture.js.map +1 -1
  181. package/Materials/Textures/internalTexture.js +1 -0
  182. package/Materials/Textures/internalTexture.js.map +1 -1
  183. package/Materials/Textures/rawCubeTexture.js +3 -0
  184. package/Materials/Textures/rawCubeTexture.js.map +1 -1
  185. package/Materials/Textures/renderTargetTexture.js +2 -0
  186. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  187. package/Materials/Textures/videoTexture.js +6 -0
  188. package/Materials/Textures/videoTexture.js.map +1 -1
  189. package/Materials/effect.js +2 -1
  190. package/Materials/effect.js.map +1 -1
  191. package/Materials/effect.webgl.functions.js +3 -1
  192. package/Materials/effect.webgl.functions.js.map +1 -1
  193. package/Materials/effectRenderer.js +1 -0
  194. package/Materials/effectRenderer.js.map +1 -1
  195. package/Materials/material.js +2 -1
  196. package/Materials/material.js.map +1 -1
  197. package/Materials/shaderMaterial.js +4 -2
  198. package/Materials/shaderMaterial.js.map +1 -1
  199. package/Meshes/Compression/dracoCodec.js +5 -1
  200. package/Meshes/Compression/dracoCodec.js.map +1 -1
  201. package/Meshes/Compression/dracoCompression.js +4 -3
  202. package/Meshes/Compression/dracoCompression.js.map +1 -1
  203. package/Meshes/Compression/dracoCompressionWorker.js +5 -2
  204. package/Meshes/Compression/dracoCompressionWorker.js.map +1 -1
  205. package/Meshes/Compression/dracoDecoder.js +5 -1
  206. package/Meshes/Compression/dracoDecoder.js.map +1 -1
  207. package/Meshes/Compression/dracoEncoder.js +3 -2
  208. package/Meshes/Compression/dracoEncoder.js.map +1 -1
  209. package/Meshes/Compression/meshoptCompression.js +18 -18
  210. package/Meshes/Compression/meshoptCompression.js.map +1 -1
  211. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +14 -15
  212. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  213. package/Meshes/Node/Blocks/Textures/geometryTextureBlock.js +20 -10
  214. package/Meshes/Node/Blocks/Textures/geometryTextureBlock.js.map +1 -1
  215. package/Meshes/Node/Blocks/booleanGeometryBlock.js +1 -0
  216. package/Meshes/Node/Blocks/booleanGeometryBlock.js.map +1 -1
  217. package/Meshes/Node/nodeGeometry.js +5 -1
  218. package/Meshes/Node/nodeGeometry.js.map +1 -1
  219. package/Meshes/mesh.js +2 -2
  220. package/Meshes/mesh.js.map +1 -1
  221. package/Meshes/meshUVSpaceRenderer.js +1 -0
  222. package/Meshes/meshUVSpaceRenderer.js.map +1 -1
  223. package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js +1 -0
  224. package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js.map +1 -1
  225. package/Misc/assetsManager.js +2 -1
  226. package/Misc/assetsManager.js.map +1 -1
  227. package/Misc/asyncLock.js +5 -2
  228. package/Misc/asyncLock.js.map +1 -1
  229. package/Misc/basis.js +9 -2
  230. package/Misc/basis.js.map +1 -1
  231. package/Misc/basisWorker.js +3 -1
  232. package/Misc/basisWorker.js.map +1 -1
  233. package/Misc/copyTextureToTexture.js +1 -0
  234. package/Misc/copyTextureToTexture.js.map +1 -1
  235. package/Misc/coroutine.js +2 -1
  236. package/Misc/coroutine.js.map +1 -1
  237. package/Misc/dataReader.js +3 -4
  238. package/Misc/dataReader.js.map +1 -1
  239. package/Misc/dumpTools.js +7 -1
  240. package/Misc/dumpTools.js.map +1 -1
  241. package/Misc/environmentTextureTools.d.ts +0 -2
  242. package/Misc/environmentTextureTools.js +20 -7
  243. package/Misc/environmentTextureTools.js.map +1 -1
  244. package/Misc/equirectangularCapture.js +2 -1
  245. package/Misc/equirectangularCapture.js.map +1 -1
  246. package/Misc/fileTools.js +2 -0
  247. package/Misc/fileTools.js.map +1 -1
  248. package/Misc/filesInput.js +5 -1
  249. package/Misc/filesInput.js.map +1 -1
  250. package/Misc/khronosTextureContainer2.js +10 -3
  251. package/Misc/khronosTextureContainer2.js.map +1 -1
  252. package/Misc/khronosTextureContainer2Worker.js +4 -1
  253. package/Misc/khronosTextureContainer2Worker.js.map +1 -1
  254. package/Misc/minMaxReducer.js +1 -0
  255. package/Misc/minMaxReducer.js.map +1 -1
  256. package/Misc/observable.extensions.js +3 -1
  257. package/Misc/observable.extensions.js.map +1 -1
  258. package/Misc/observable.js +2 -0
  259. package/Misc/observable.js.map +1 -1
  260. package/Misc/observableCoroutine.js +1 -0
  261. package/Misc/observableCoroutine.js.map +1 -1
  262. package/Misc/reflector.js +1 -0
  263. package/Misc/reflector.js.map +1 -1
  264. package/Misc/rgbdTextureTools.js +2 -1
  265. package/Misc/rgbdTextureTools.js.map +1 -1
  266. package/Misc/sceneSerializer.js +2 -2
  267. package/Misc/sceneSerializer.js.map +1 -1
  268. package/Misc/screenshotTools.js +9 -4
  269. package/Misc/screenshotTools.js.map +1 -1
  270. package/Misc/textureTools.js +2 -0
  271. package/Misc/textureTools.js.map +1 -1
  272. package/Misc/tools.internals.js +2 -1
  273. package/Misc/tools.internals.js.map +1 -1
  274. package/Misc/tools.js +9 -3
  275. package/Misc/tools.js.map +1 -1
  276. package/Misc/videoRecorder.js +1 -0
  277. package/Misc/videoRecorder.js.map +1 -1
  278. package/Misc/webRequest.fetch.js +2 -1
  279. package/Misc/webRequest.fetch.js.map +1 -1
  280. package/Misc/workerPool.js +3 -0
  281. package/Misc/workerPool.js.map +1 -1
  282. package/Particles/flowMap.js +1 -1
  283. package/Particles/flowMap.js.map +1 -1
  284. package/Particles/particleHelper.js +7 -0
  285. package/Particles/particleHelper.js.map +1 -1
  286. package/Particles/pointsCloudSystem.js +7 -7
  287. package/Particles/pointsCloudSystem.js.map +1 -1
  288. package/Particles/thinParticleSystem.js +2 -0
  289. package/Particles/thinParticleSystem.js.map +1 -1
  290. package/Physics/physicsHelper.js +2 -2
  291. package/Physics/physicsHelper.js.map +1 -1
  292. package/Physics/v1/Plugins/oimoJSPlugin.js +1 -1
  293. package/Physics/v1/Plugins/oimoJSPlugin.js.map +1 -1
  294. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +1 -0
  295. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  296. package/Rendering/GlobalIllumination/giRSMManager.js +1 -0
  297. package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
  298. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +1 -0
  299. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  300. package/Rendering/depthRenderer.js +1 -0
  301. package/Rendering/depthRenderer.js.map +1 -1
  302. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +3 -1
  303. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
  304. package/Rendering/fluidRenderer/fluidRenderingTextures.js.map +1 -1
  305. package/Rendering/geometryBufferRenderer.js +1 -0
  306. package/Rendering/geometryBufferRenderer.js.map +1 -1
  307. package/Rendering/iblCdfGenerator.js +4 -1
  308. package/Rendering/iblCdfGenerator.js.map +1 -1
  309. package/Shaders/ShadersInclude/lightFragment.js +5 -1
  310. package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
  311. package/Shaders/ShadersInclude/pbrBRDFFunctions.js +12 -5
  312. package/Shaders/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
  313. package/Shaders/ShadersInclude/pbrBlockDirectLighting.js +3 -0
  314. package/Shaders/ShadersInclude/pbrBlockDirectLighting.js.map +1 -1
  315. package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js +21 -8
  316. package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
  317. package/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents.js +3 -0
  318. package/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents.js.map +1 -1
  319. package/Shaders/ShadersInclude/pbrBlockReflectance.js +6 -6
  320. package/Shaders/ShadersInclude/pbrBlockReflectance.js.map +1 -1
  321. package/Shaders/ShadersInclude/pbrBlockReflectance0.js +2 -7
  322. package/Shaders/ShadersInclude/pbrBlockReflectance0.js.map +1 -1
  323. package/Shaders/ShadersInclude/pbrBlockReflectivity.js +20 -16
  324. package/Shaders/ShadersInclude/pbrBlockReflectivity.js.map +1 -1
  325. package/Shaders/ShadersInclude/pbrBlockSubSurface.js +6 -8
  326. package/Shaders/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  327. package/Shaders/ShadersInclude/pbrDebug.js +2 -2
  328. package/Shaders/ShadersInclude/pbrDebug.js.map +1 -1
  329. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +1 -5
  330. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  331. package/Shaders/pbr.fragment.js +7 -3
  332. package/Shaders/pbr.fragment.js.map +1 -1
  333. package/ShadersWGSL/ShadersInclude/lightFragment.js +5 -1
  334. package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
  335. package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js +5 -5
  336. package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
  337. package/ShadersWGSL/ShadersInclude/pbrBlockDirectLighting.js +3 -0
  338. package/ShadersWGSL/ShadersInclude/pbrBlockDirectLighting.js.map +1 -1
  339. package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js +21 -8
  340. package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
  341. package/ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents.js +3 -0
  342. package/ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents.js.map +1 -1
  343. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js +6 -6
  344. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js.map +1 -1
  345. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance0.js +2 -7
  346. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance0.js.map +1 -1
  347. package/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.js +22 -15
  348. package/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.js.map +1 -1
  349. package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js +6 -8
  350. package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  351. package/ShadersWGSL/ShadersInclude/pbrDebug.js +2 -2
  352. package/ShadersWGSL/ShadersInclude/pbrDebug.js.map +1 -1
  353. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +1 -7
  354. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  355. package/ShadersWGSL/pbr.fragment.js +7 -3
  356. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  357. package/Sprites/spriteManager.js +5 -1
  358. package/Sprites/spriteManager.js.map +1 -1
  359. package/Sprites/spriteRenderer.js +1 -0
  360. package/Sprites/spriteRenderer.js.map +1 -1
  361. package/XR/features/WebXRAnchorSystem.js +4 -3
  362. package/XR/features/WebXRAnchorSystem.js.map +1 -1
  363. package/XR/features/WebXRDepthSensing.js +1 -1
  364. package/XR/features/WebXRDepthSensing.js.map +1 -1
  365. package/XR/features/WebXRHandTracking.js +4 -1
  366. package/XR/features/WebXRHandTracking.js.map +1 -1
  367. package/XR/features/WebXRHitTest.js +4 -1
  368. package/XR/features/WebXRHitTest.js.map +1 -1
  369. package/XR/features/WebXRHitTestLegacy.js +6 -5
  370. package/XR/features/WebXRHitTestLegacy.js.map +1 -1
  371. package/XR/features/WebXRImageTracking.js +2 -1
  372. package/XR/features/WebXRImageTracking.js.map +1 -1
  373. package/XR/features/WebXRLightEstimation.js +3 -0
  374. package/XR/features/WebXRLightEstimation.js.map +1 -1
  375. package/XR/features/WebXRNearInteraction.js +2 -0
  376. package/XR/features/WebXRNearInteraction.js.map +1 -1
  377. package/XR/features/WebXRPlaneDetector.js +2 -2
  378. package/XR/features/WebXRPlaneDetector.js.map +1 -1
  379. package/XR/motionController/webXRAbstractMotionController.js +3 -2
  380. package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
  381. package/XR/motionController/webXRMicrosoftMixedRealityController.js +6 -6
  382. package/XR/motionController/webXRMicrosoftMixedRealityController.js.map +1 -1
  383. package/XR/motionController/webXRMotionControllerManager.js +15 -9
  384. package/XR/motionController/webXRMotionControllerManager.js.map +1 -1
  385. package/XR/motionController/webXRProfiledMotionController.js +1 -1
  386. package/XR/motionController/webXRProfiledMotionController.js.map +1 -1
  387. package/XR/native/nativeXRFrame.js +1 -0
  388. package/XR/native/nativeXRFrame.js.map +1 -1
  389. package/XR/webXRDefaultExperience.js +10 -12
  390. package/XR/webXRDefaultExperience.js.map +1 -1
  391. package/XR/webXREnterExitUI.js +2 -1
  392. package/XR/webXREnterExitUI.js.map +1 -1
  393. package/XR/webXRExperienceHelper.js +5 -2
  394. package/XR/webXRExperienceHelper.js.map +1 -1
  395. package/XR/webXRFeaturesManager.js +1 -0
  396. package/XR/webXRFeaturesManager.js.map +1 -1
  397. package/XR/webXRInput.js +1 -0
  398. package/XR/webXRInput.js.map +1 -1
  399. package/XR/webXRInputSource.js +2 -0
  400. package/XR/webXRInputSource.js.map +1 -1
  401. package/XR/webXRManagedOutputCanvas.js +5 -1
  402. package/XR/webXRManagedOutputCanvas.js.map +1 -1
  403. package/XR/webXRSessionManager.js +56 -60
  404. package/XR/webXRSessionManager.js.map +1 -1
  405. package/assetContainer.js +28 -28
  406. package/assetContainer.js.map +1 -1
  407. package/package.json +1 -1
  408. package/scene.js +5 -4
  409. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"khronosTextureContainer2.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/khronosTextureContainer2.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { AutoReleaseWorkerPool } from \"./workerPool\";\r\nimport { Tools } from \"./tools\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { ICompressedFormatCapabilities, IDecodedData, IKTX2DecoderOptions } from \"core/Materials/Textures/ktx2decoderTypes\";\r\nimport { EngineFormat, TranscodeTarget } from \"core/Materials/Textures/ktx2decoderTypes\";\r\nimport type { AllowedKeys } from \"./khronosTextureContainer2Worker\";\r\nimport { applyConfig, initializeWebWorker, workerFunction } from \"./khronosTextureContainer2Worker\";\r\n\r\ndeclare let KTX2DECODER: any;\r\n\r\n/**\r\n * Class that defines the default KTX2 decoder options.\r\n *\r\n * This class is useful for providing options to the KTX2 decoder to control how the source data is transcoded.\r\n */\r\nexport class DefaultKTX2DecoderOptions {\r\n private _isDirty = true;\r\n\r\n /**\r\n * Gets the dirty flag\r\n */\r\n public get isDirty() {\r\n return this._isDirty;\r\n }\r\n\r\n private _useRGBAIfASTCBC7NotAvailableWhenUASTC?: boolean;\r\n /**\r\n * force a (uncompressed) RGBA transcoded format if transcoding a UASTC source format and ASTC + BC7 are not available as a compressed transcoded format\r\n */\r\n public get useRGBAIfASTCBC7NotAvailableWhenUASTC() {\r\n return this._useRGBAIfASTCBC7NotAvailableWhenUASTC;\r\n }\r\n\r\n public set useRGBAIfASTCBC7NotAvailableWhenUASTC(value: boolean | undefined) {\r\n if (this._useRGBAIfASTCBC7NotAvailableWhenUASTC === value) {\r\n return;\r\n }\r\n this._useRGBAIfASTCBC7NotAvailableWhenUASTC = value;\r\n this._isDirty = true;\r\n }\r\n\r\n private _useRGBAIfOnlyBC1BC3AvailableWhenUASTC?: boolean = true;\r\n /**\r\n * force a (uncompressed) RGBA transcoded format if transcoding a UASTC source format and only BC1 or BC3 are available as a compressed transcoded format.\r\n * This property is true by default to favor speed over memory, because currently transcoding from UASTC to BC1/3 is slow because the transcoder transcodes\r\n * to uncompressed and then recompresses the texture\r\n */\r\n public get useRGBAIfOnlyBC1BC3AvailableWhenUASTC() {\r\n return this._useRGBAIfOnlyBC1BC3AvailableWhenUASTC;\r\n }\r\n\r\n public set useRGBAIfOnlyBC1BC3AvailableWhenUASTC(value: boolean | undefined) {\r\n if (this._useRGBAIfOnlyBC1BC3AvailableWhenUASTC === value) {\r\n return;\r\n }\r\n this._useRGBAIfOnlyBC1BC3AvailableWhenUASTC = value;\r\n this._isDirty = true;\r\n }\r\n\r\n private _forceRGBA?: boolean;\r\n /**\r\n * force to always use (uncompressed) RGBA for transcoded format\r\n */\r\n public get forceRGBA() {\r\n return this._forceRGBA;\r\n }\r\n\r\n public set forceRGBA(value: boolean | undefined) {\r\n if (this._forceRGBA === value) {\r\n return;\r\n }\r\n this._forceRGBA = value;\r\n this._isDirty = true;\r\n }\r\n\r\n private _forceR8?: boolean;\r\n /**\r\n * force to always use (uncompressed) R8 for transcoded format\r\n */\r\n public get forceR8() {\r\n return this._forceR8;\r\n }\r\n\r\n public set forceR8(value: boolean | undefined) {\r\n if (this._forceR8 === value) {\r\n return;\r\n }\r\n this._forceR8 = value;\r\n this._isDirty = true;\r\n }\r\n\r\n private _forceRG8?: boolean;\r\n /**\r\n * force to always use (uncompressed) RG8 for transcoded format\r\n */\r\n public get forceRG8() {\r\n return this._forceRG8;\r\n }\r\n\r\n public set forceRG8(value: boolean | undefined) {\r\n if (this._forceRG8 === value) {\r\n return;\r\n }\r\n this._forceRG8 = value;\r\n this._isDirty = true;\r\n }\r\n\r\n private _bypassTranscoders?: string[];\r\n /**\r\n * list of transcoders to bypass when looking for a suitable transcoder. The available transcoders are:\r\n * UniversalTranscoder_UASTC_ASTC\r\n * UniversalTranscoder_UASTC_BC7\r\n * UniversalTranscoder_UASTC_RGBA_UNORM\r\n * UniversalTranscoder_UASTC_RGBA_SRGB\r\n * UniversalTranscoder_UASTC_R8_UNORM\r\n * UniversalTranscoder_UASTC_RG8_UNORM\r\n * MSCTranscoder\r\n */\r\n public get bypassTranscoders() {\r\n return this._bypassTranscoders;\r\n }\r\n\r\n public set bypassTranscoders(value: string[] | undefined) {\r\n if (this._bypassTranscoders === value) {\r\n return;\r\n }\r\n this._bypassTranscoders = value;\r\n this._isDirty = true;\r\n }\r\n\r\n private _ktx2DecoderOptions: IKTX2DecoderOptions = {};\r\n\r\n /** @internal */\r\n public _getKTX2DecoderOptions(): IKTX2DecoderOptions {\r\n if (!this._isDirty) {\r\n return this._ktx2DecoderOptions;\r\n }\r\n\r\n this._isDirty = false;\r\n\r\n const options: IKTX2DecoderOptions = {\r\n useRGBAIfASTCBC7NotAvailableWhenUASTC: this._useRGBAIfASTCBC7NotAvailableWhenUASTC,\r\n forceRGBA: this._forceRGBA,\r\n forceR8: this._forceR8,\r\n forceRG8: this._forceRG8,\r\n bypassTranscoders: this._bypassTranscoders,\r\n };\r\n\r\n if (this.useRGBAIfOnlyBC1BC3AvailableWhenUASTC) {\r\n options.transcodeFormatDecisionTree = {\r\n UASTC: {\r\n transcodeFormat: [TranscodeTarget.BC1_RGB, TranscodeTarget.BC3_RGBA],\r\n yes: {\r\n transcodeFormat: TranscodeTarget.RGBA32,\r\n engineFormat: EngineFormat.RGBA8Format,\r\n roundToMultiple4: false,\r\n },\r\n },\r\n };\r\n }\r\n\r\n this._ktx2DecoderOptions = options;\r\n\r\n return options;\r\n }\r\n}\r\n\r\n/**\r\n * Options for the KTX2 decoder\r\n */\r\nexport interface IKhronosTextureContainer2Options {\r\n /**\r\n * Number of workers to use for async operations. Specify `0` to disable web workers and run synchronously in the current context.\r\n */\r\n numWorkers?: number;\r\n /**\r\n * Worker pool to use for async operations. If set, `numWorkers` will be ignored.\r\n */\r\n workerPool?: AutoReleaseWorkerPool;\r\n /**\r\n * Optional container for the KTX2 decoder module and its dependencies. If set, the module will be used from this container and the URLs will be ignored.\r\n */\r\n // No need for | any here\r\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\r\n binariesAndModulesContainer?: { [key in AllowedKeys]?: ArrayBuffer | any };\r\n}\r\n\r\n/**\r\n * Class for loading KTX2 files\r\n */\r\nexport class KhronosTextureContainer2 {\r\n private static _WorkerPoolPromise?: Promise<AutoReleaseWorkerPool>;\r\n private static _DecoderModulePromise?: Promise<any>;\r\n private static _KTX2DecoderModule?: any;\r\n\r\n /**\r\n * URLs to use when loading the KTX2 decoder module as well as its dependencies\r\n * If a url is null, the default url is used (pointing to https://preview.babylonjs.com)\r\n * Note that jsDecoderModule can't be null and that the other dependencies will only be loaded if necessary\r\n * Urls you can change:\r\n * URLConfig.jsDecoderModule\r\n * URLConfig.wasmUASTCToASTC\r\n * URLConfig.wasmUASTCToBC7\r\n * URLConfig.wasmUASTCToRGBA_UNORM\r\n * URLConfig.wasmUASTCToRGBA_SRGB\r\n * URLConfig.wasmUASTCToR8_UNORM\r\n * URLConfig.wasmUASTCToRG8_UNORM\r\n * URLConfig.jsMSCTranscoder\r\n * URLConfig.wasmMSCTranscoder\r\n * URLConfig.wasmZSTDDecoder\r\n * You can see their default values in this PG: https://playground.babylonjs.com/#EIJH8L#29\r\n */\r\n public static URLConfig: {\r\n jsDecoderModule: string;\r\n wasmUASTCToASTC: Nullable<string>;\r\n wasmUASTCToBC7: Nullable<string>;\r\n wasmUASTCToRGBA_UNORM: Nullable<string>;\r\n wasmUASTCToRGBA_SRGB: Nullable<string>;\r\n wasmUASTCToR8_UNORM: Nullable<string>;\r\n wasmUASTCToRG8_UNORM: Nullable<string>;\r\n jsMSCTranscoder: Nullable<string>;\r\n wasmMSCTranscoder: Nullable<string>;\r\n wasmZSTDDecoder: Nullable<string>;\r\n } = {\r\n jsDecoderModule: \"https://cdn.babylonjs.com/babylon.ktx2Decoder.js\",\r\n wasmUASTCToASTC: null,\r\n wasmUASTCToBC7: null,\r\n wasmUASTCToRGBA_UNORM: null,\r\n wasmUASTCToRGBA_SRGB: null,\r\n wasmUASTCToR8_UNORM: null,\r\n wasmUASTCToRG8_UNORM: null,\r\n jsMSCTranscoder: null,\r\n wasmMSCTranscoder: null,\r\n wasmZSTDDecoder: null,\r\n };\r\n\r\n /**\r\n * If provided, this worker pool will be used instead of creating a new one.\r\n * This is useful when loading the WASM and the js modules on your own and\r\n * you want to use the ktxTextureLoader and not construct this class directly.\r\n */\r\n public static WorkerPool?: AutoReleaseWorkerPool;\r\n\r\n /**\r\n * Default number of workers used to handle data decoding\r\n */\r\n public static DefaultNumWorkers = KhronosTextureContainer2.GetDefaultNumWorkers();\r\n\r\n /**\r\n * Default configuration for the KTX2 decoder.\r\n * The options defined in this way have priority over those passed when creating a KTX2 texture with new Texture(...).\r\n */\r\n public static DefaultDecoderOptions = new DefaultKTX2DecoderOptions();\r\n\r\n private static GetDefaultNumWorkers(): number {\r\n if (typeof navigator !== \"object\" || !navigator.hardwareConcurrency) {\r\n return 1;\r\n }\r\n\r\n // Use 50% of the available logical processors but capped at 4.\r\n return Math.min(Math.floor(navigator.hardwareConcurrency * 0.5), 4);\r\n }\r\n\r\n private _engine: AbstractEngine;\r\n\r\n private static _Initialize(numWorkers: number): void {\r\n if (KhronosTextureContainer2._WorkerPoolPromise || KhronosTextureContainer2._DecoderModulePromise) {\r\n return;\r\n }\r\n\r\n const urls = {\r\n jsDecoderModule: Tools.GetBabylonScriptURL(this.URLConfig.jsDecoderModule, true),\r\n wasmUASTCToASTC: Tools.GetBabylonScriptURL(this.URLConfig.wasmUASTCToASTC, true),\r\n wasmUASTCToBC7: Tools.GetBabylonScriptURL(this.URLConfig.wasmUASTCToBC7, true),\r\n wasmUASTCToRGBA_UNORM: Tools.GetBabylonScriptURL(this.URLConfig.wasmUASTCToRGBA_UNORM, true),\r\n wasmUASTCToRGBA_SRGB: Tools.GetBabylonScriptURL(this.URLConfig.wasmUASTCToRGBA_SRGB, true),\r\n wasmUASTCToR8_UNORM: Tools.GetBabylonScriptURL(this.URLConfig.wasmUASTCToR8_UNORM, true),\r\n wasmUASTCToRG8_UNORM: Tools.GetBabylonScriptURL(this.URLConfig.wasmUASTCToRG8_UNORM, true),\r\n jsMSCTranscoder: Tools.GetBabylonScriptURL(this.URLConfig.jsMSCTranscoder, true),\r\n wasmMSCTranscoder: Tools.GetBabylonScriptURL(this.URLConfig.wasmMSCTranscoder, true),\r\n wasmZSTDDecoder: Tools.GetBabylonScriptURL(this.URLConfig.wasmZSTDDecoder, true),\r\n };\r\n\r\n if (numWorkers && typeof Worker === \"function\" && typeof URL !== \"undefined\") {\r\n KhronosTextureContainer2._WorkerPoolPromise = new Promise((resolve) => {\r\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\r\n const workerContent = `${applyConfig}(${workerFunction})()`;\r\n const workerBlobUrl = URL.createObjectURL(new Blob([workerContent], { type: \"application/javascript\" }));\r\n resolve(new AutoReleaseWorkerPool(numWorkers, async () => initializeWebWorker(new Worker(workerBlobUrl), undefined, urls)));\r\n });\r\n } else {\r\n if (typeof KhronosTextureContainer2._KTX2DecoderModule === \"undefined\") {\r\n KhronosTextureContainer2._DecoderModulePromise = Tools.LoadBabylonScriptAsync(urls.jsDecoderModule).then(() => {\r\n KhronosTextureContainer2._KTX2DecoderModule = KTX2DECODER;\r\n KhronosTextureContainer2._KTX2DecoderModule.MSCTranscoder.UseFromWorkerThread = false;\r\n KhronosTextureContainer2._KTX2DecoderModule.WASMMemoryManager.LoadBinariesFromCurrentThread = true;\r\n applyConfig(urls, KhronosTextureContainer2._KTX2DecoderModule);\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\r\n return new KhronosTextureContainer2._KTX2DecoderModule.KTX2Decoder();\r\n });\r\n } else {\r\n KhronosTextureContainer2._KTX2DecoderModule.MSCTranscoder.UseFromWorkerThread = false;\r\n KhronosTextureContainer2._KTX2DecoderModule.WASMMemoryManager.LoadBinariesFromCurrentThread = true;\r\n KhronosTextureContainer2._DecoderModulePromise = Promise.resolve(new KhronosTextureContainer2._KTX2DecoderModule.KTX2Decoder());\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Constructor\r\n * @param engine The engine to use\r\n * @param numWorkersOrOptions The number of workers for async operations. Specify `0` to disable web workers and run synchronously in the current context.\r\n */\r\n public constructor(engine: AbstractEngine, numWorkersOrOptions: number | IKhronosTextureContainer2Options = KhronosTextureContainer2.DefaultNumWorkers) {\r\n this._engine = engine;\r\n const workerPoolOption = (typeof numWorkersOrOptions === \"object\" && numWorkersOrOptions.workerPool) || KhronosTextureContainer2.WorkerPool;\r\n if (workerPoolOption) {\r\n KhronosTextureContainer2._WorkerPoolPromise = Promise.resolve(workerPoolOption);\r\n } else {\r\n // set the KTX2 decoder module\r\n if (typeof numWorkersOrOptions === \"object\") {\r\n KhronosTextureContainer2._KTX2DecoderModule = numWorkersOrOptions?.binariesAndModulesContainer?.jsDecoderModule;\r\n } else if (typeof KTX2DECODER !== \"undefined\") {\r\n KhronosTextureContainer2._KTX2DecoderModule = KTX2DECODER;\r\n }\r\n const numberOfWorkers = typeof numWorkersOrOptions === \"number\" ? numWorkersOrOptions : (numWorkersOrOptions.numWorkers ?? KhronosTextureContainer2.DefaultNumWorkers);\r\n KhronosTextureContainer2._Initialize(numberOfWorkers);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public async _uploadAsync(data: ArrayBufferView, internalTexture: InternalTexture, options?: IKTX2DecoderOptions & IDecodedData): Promise<void> {\r\n const caps = this._engine.getCaps();\r\n\r\n const compressedTexturesCaps: ICompressedFormatCapabilities = {\r\n astc: !!caps.astc,\r\n bptc: !!caps.bptc,\r\n s3tc: !!caps.s3tc,\r\n pvrtc: !!caps.pvrtc,\r\n etc2: !!caps.etc2,\r\n etc1: !!caps.etc1,\r\n };\r\n\r\n if (KhronosTextureContainer2._WorkerPoolPromise) {\r\n const workerPool = await KhronosTextureContainer2._WorkerPoolPromise;\r\n return new Promise((resolve, reject) => {\r\n workerPool.push((worker, onComplete) => {\r\n const onError = (error: ErrorEvent) => {\r\n worker.removeEventListener(\"error\", onError);\r\n worker.removeEventListener(\"message\", onMessage);\r\n reject(error);\r\n onComplete();\r\n };\r\n\r\n const onMessage = (message: MessageEvent) => {\r\n if (message.data.action === \"decoded\") {\r\n worker.removeEventListener(\"error\", onError);\r\n worker.removeEventListener(\"message\", onMessage);\r\n if (!message.data.success) {\r\n reject({ message: message.data.msg });\r\n } else {\r\n try {\r\n this._createTexture(message.data.decodedData, internalTexture, options);\r\n resolve();\r\n } catch (err) {\r\n reject({ message: err });\r\n }\r\n }\r\n onComplete();\r\n }\r\n };\r\n\r\n worker.addEventListener(\"error\", onError);\r\n worker.addEventListener(\"message\", onMessage);\r\n worker.postMessage({ action: \"setDefaultDecoderOptions\", options: KhronosTextureContainer2.DefaultDecoderOptions._getKTX2DecoderOptions() });\r\n\r\n const dataCopy = new Uint8Array(data.byteLength);\r\n dataCopy.set(new Uint8Array(data.buffer, data.byteOffset, data.byteLength));\r\n\r\n worker.postMessage({ action: \"decode\", data: dataCopy, caps: compressedTexturesCaps, options }, [dataCopy.buffer]);\r\n });\r\n });\r\n } else if (KhronosTextureContainer2._DecoderModulePromise) {\r\n const decoder = await KhronosTextureContainer2._DecoderModulePromise;\r\n if (KhronosTextureContainer2.DefaultDecoderOptions.isDirty) {\r\n KhronosTextureContainer2._KTX2DecoderModule.KTX2Decoder.DefaultDecoderOptions = KhronosTextureContainer2.DefaultDecoderOptions._getKTX2DecoderOptions();\r\n }\r\n return new Promise((resolve, reject) => {\r\n decoder\r\n .decode(data, caps)\r\n .then((data: IDecodedData) => {\r\n this._createTexture(data, internalTexture);\r\n resolve();\r\n })\r\n .catch((reason: any) => {\r\n reject({ message: reason });\r\n });\r\n });\r\n }\r\n\r\n throw new Error(\"KTX2 decoder module is not available\");\r\n }\r\n\r\n protected _createTexture(data: IDecodedData, internalTexture: InternalTexture, options?: IKTX2DecoderOptions & IDecodedData): void {\r\n const oglTexture2D = 3553; // gl.TEXTURE_2D\r\n\r\n this._engine._bindTextureDirectly(oglTexture2D, internalTexture);\r\n\r\n if (options) {\r\n // return back some information about the decoded data\r\n options.transcodedFormat = data.transcodedFormat;\r\n options.isInGammaSpace = data.isInGammaSpace;\r\n options.hasAlpha = data.hasAlpha;\r\n options.transcoderName = data.transcoderName;\r\n }\r\n\r\n let isUncompressedFormat = true;\r\n\r\n switch (data.transcodedFormat) {\r\n case 0x8058 /* RGBA8 */:\r\n internalTexture.type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n internalTexture.format = Constants.TEXTUREFORMAT_RGBA;\r\n break;\r\n case 0x8229 /* R8 */:\r\n internalTexture.type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n internalTexture.format = Constants.TEXTUREFORMAT_R;\r\n break;\r\n case 0x822b /* RG8 */:\r\n internalTexture.type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n internalTexture.format = Constants.TEXTUREFORMAT_RG;\r\n break;\r\n default:\r\n internalTexture.format = data.transcodedFormat;\r\n isUncompressedFormat = false;\r\n break;\r\n }\r\n\r\n internalTexture._gammaSpace = data.isInGammaSpace;\r\n internalTexture.generateMipMaps = data.mipmaps.length > 1;\r\n\r\n if (data.errors) {\r\n throw new Error(\"KTX2 container - could not transcode the data. \" + data.errors);\r\n }\r\n\r\n for (let t = 0; t < data.mipmaps.length; ++t) {\r\n const mipmap = data.mipmaps[t];\r\n\r\n if (!mipmap || !mipmap.data) {\r\n throw new Error(\"KTX2 container - could not transcode one of the image\");\r\n }\r\n\r\n if (isUncompressedFormat) {\r\n // uncompressed RGBA / R8 / RG8\r\n internalTexture.width = mipmap.width; // need to set width/height so that the call to _uploadDataToTextureDirectly uses the right dimensions\r\n internalTexture.height = mipmap.height;\r\n\r\n this._engine._uploadDataToTextureDirectly(internalTexture, mipmap.data, 0, t, undefined, true);\r\n } else {\r\n this._engine._uploadCompressedDataToTextureDirectly(internalTexture, data.transcodedFormat, mipmap.width, mipmap.height, mipmap.data, 0, t);\r\n }\r\n }\r\n\r\n internalTexture._extension = \".ktx2\";\r\n internalTexture.width = data.mipmaps[0].width;\r\n internalTexture.height = data.mipmaps[0].height;\r\n internalTexture.isReady = true;\r\n\r\n this._engine._bindTextureDirectly(oglTexture2D, null);\r\n }\r\n\r\n /**\r\n * Checks if the given data starts with a KTX2 file identifier.\r\n * @param data the data to check\r\n * @returns true if the data is a KTX2 file or false otherwise\r\n */\r\n public static IsValid(data: ArrayBufferView): boolean {\r\n if (data.byteLength >= 12) {\r\n // '«', 'K', 'T', 'X', ' ', '2', '0', '»', '\\r', '\\n', '\\x1A', '\\n'\r\n const identifier = new Uint8Array(data.buffer, data.byteOffset, 12);\r\n if (\r\n identifier[0] === 0xab &&\r\n identifier[1] === 0x4b &&\r\n identifier[2] === 0x54 &&\r\n identifier[3] === 0x58 &&\r\n identifier[4] === 0x20 &&\r\n identifier[5] === 0x32 &&\r\n identifier[6] === 0x30 &&\r\n identifier[7] === 0xbb &&\r\n identifier[8] === 0x0d &&\r\n identifier[9] === 0x0a &&\r\n identifier[10] === 0x1a &&\r\n identifier[11] === 0x0a\r\n ) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"khronosTextureContainer2.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/khronosTextureContainer2.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { AutoReleaseWorkerPool } from \"./workerPool\";\r\nimport { Tools } from \"./tools\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { ICompressedFormatCapabilities, IDecodedData, IKTX2DecoderOptions } from \"core/Materials/Textures/ktx2decoderTypes\";\r\nimport { EngineFormat, TranscodeTarget } from \"core/Materials/Textures/ktx2decoderTypes\";\r\nimport type { AllowedKeys } from \"./khronosTextureContainer2Worker\";\r\nimport { applyConfig, initializeWebWorker, workerFunction } from \"./khronosTextureContainer2Worker\";\r\n\r\ndeclare let KTX2DECODER: any;\r\n\r\n/**\r\n * Class that defines the default KTX2 decoder options.\r\n *\r\n * This class is useful for providing options to the KTX2 decoder to control how the source data is transcoded.\r\n */\r\nexport class DefaultKTX2DecoderOptions {\r\n private _isDirty = true;\r\n\r\n /**\r\n * Gets the dirty flag\r\n */\r\n public get isDirty() {\r\n return this._isDirty;\r\n }\r\n\r\n private _useRGBAIfASTCBC7NotAvailableWhenUASTC?: boolean;\r\n /**\r\n * force a (uncompressed) RGBA transcoded format if transcoding a UASTC source format and ASTC + BC7 are not available as a compressed transcoded format\r\n */\r\n public get useRGBAIfASTCBC7NotAvailableWhenUASTC() {\r\n return this._useRGBAIfASTCBC7NotAvailableWhenUASTC;\r\n }\r\n\r\n public set useRGBAIfASTCBC7NotAvailableWhenUASTC(value: boolean | undefined) {\r\n if (this._useRGBAIfASTCBC7NotAvailableWhenUASTC === value) {\r\n return;\r\n }\r\n this._useRGBAIfASTCBC7NotAvailableWhenUASTC = value;\r\n this._isDirty = true;\r\n }\r\n\r\n private _useRGBAIfOnlyBC1BC3AvailableWhenUASTC?: boolean = true;\r\n /**\r\n * force a (uncompressed) RGBA transcoded format if transcoding a UASTC source format and only BC1 or BC3 are available as a compressed transcoded format.\r\n * This property is true by default to favor speed over memory, because currently transcoding from UASTC to BC1/3 is slow because the transcoder transcodes\r\n * to uncompressed and then recompresses the texture\r\n */\r\n public get useRGBAIfOnlyBC1BC3AvailableWhenUASTC() {\r\n return this._useRGBAIfOnlyBC1BC3AvailableWhenUASTC;\r\n }\r\n\r\n public set useRGBAIfOnlyBC1BC3AvailableWhenUASTC(value: boolean | undefined) {\r\n if (this._useRGBAIfOnlyBC1BC3AvailableWhenUASTC === value) {\r\n return;\r\n }\r\n this._useRGBAIfOnlyBC1BC3AvailableWhenUASTC = value;\r\n this._isDirty = true;\r\n }\r\n\r\n private _forceRGBA?: boolean;\r\n /**\r\n * force to always use (uncompressed) RGBA for transcoded format\r\n */\r\n public get forceRGBA() {\r\n return this._forceRGBA;\r\n }\r\n\r\n public set forceRGBA(value: boolean | undefined) {\r\n if (this._forceRGBA === value) {\r\n return;\r\n }\r\n this._forceRGBA = value;\r\n this._isDirty = true;\r\n }\r\n\r\n private _forceR8?: boolean;\r\n /**\r\n * force to always use (uncompressed) R8 for transcoded format\r\n */\r\n public get forceR8() {\r\n return this._forceR8;\r\n }\r\n\r\n public set forceR8(value: boolean | undefined) {\r\n if (this._forceR8 === value) {\r\n return;\r\n }\r\n this._forceR8 = value;\r\n this._isDirty = true;\r\n }\r\n\r\n private _forceRG8?: boolean;\r\n /**\r\n * force to always use (uncompressed) RG8 for transcoded format\r\n */\r\n public get forceRG8() {\r\n return this._forceRG8;\r\n }\r\n\r\n public set forceRG8(value: boolean | undefined) {\r\n if (this._forceRG8 === value) {\r\n return;\r\n }\r\n this._forceRG8 = value;\r\n this._isDirty = true;\r\n }\r\n\r\n private _bypassTranscoders?: string[];\r\n /**\r\n * list of transcoders to bypass when looking for a suitable transcoder. The available transcoders are:\r\n * UniversalTranscoder_UASTC_ASTC\r\n * UniversalTranscoder_UASTC_BC7\r\n * UniversalTranscoder_UASTC_RGBA_UNORM\r\n * UniversalTranscoder_UASTC_RGBA_SRGB\r\n * UniversalTranscoder_UASTC_R8_UNORM\r\n * UniversalTranscoder_UASTC_RG8_UNORM\r\n * MSCTranscoder\r\n */\r\n public get bypassTranscoders() {\r\n return this._bypassTranscoders;\r\n }\r\n\r\n public set bypassTranscoders(value: string[] | undefined) {\r\n if (this._bypassTranscoders === value) {\r\n return;\r\n }\r\n this._bypassTranscoders = value;\r\n this._isDirty = true;\r\n }\r\n\r\n private _ktx2DecoderOptions: IKTX2DecoderOptions = {};\r\n\r\n /** @internal */\r\n public _getKTX2DecoderOptions(): IKTX2DecoderOptions {\r\n if (!this._isDirty) {\r\n return this._ktx2DecoderOptions;\r\n }\r\n\r\n this._isDirty = false;\r\n\r\n const options: IKTX2DecoderOptions = {\r\n useRGBAIfASTCBC7NotAvailableWhenUASTC: this._useRGBAIfASTCBC7NotAvailableWhenUASTC,\r\n forceRGBA: this._forceRGBA,\r\n forceR8: this._forceR8,\r\n forceRG8: this._forceRG8,\r\n bypassTranscoders: this._bypassTranscoders,\r\n };\r\n\r\n if (this.useRGBAIfOnlyBC1BC3AvailableWhenUASTC) {\r\n options.transcodeFormatDecisionTree = {\r\n UASTC: {\r\n transcodeFormat: [TranscodeTarget.BC1_RGB, TranscodeTarget.BC3_RGBA],\r\n yes: {\r\n transcodeFormat: TranscodeTarget.RGBA32,\r\n engineFormat: EngineFormat.RGBA8Format,\r\n roundToMultiple4: false,\r\n },\r\n },\r\n };\r\n }\r\n\r\n this._ktx2DecoderOptions = options;\r\n\r\n return options;\r\n }\r\n}\r\n\r\n/**\r\n * Options for the KTX2 decoder\r\n */\r\nexport interface IKhronosTextureContainer2Options {\r\n /**\r\n * Number of workers to use for async operations. Specify `0` to disable web workers and run synchronously in the current context.\r\n */\r\n numWorkers?: number;\r\n /**\r\n * Worker pool to use for async operations. If set, `numWorkers` will be ignored.\r\n */\r\n workerPool?: AutoReleaseWorkerPool;\r\n /**\r\n * Optional container for the KTX2 decoder module and its dependencies. If set, the module will be used from this container and the URLs will be ignored.\r\n */\r\n // No need for | any here\r\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\r\n binariesAndModulesContainer?: { [key in AllowedKeys]?: ArrayBuffer | any };\r\n}\r\n\r\n/**\r\n * Class for loading KTX2 files\r\n */\r\nexport class KhronosTextureContainer2 {\r\n private static _WorkerPoolPromise?: Promise<AutoReleaseWorkerPool>;\r\n private static _DecoderModulePromise?: Promise<any>;\r\n private static _KTX2DecoderModule?: any;\r\n\r\n /**\r\n * URLs to use when loading the KTX2 decoder module as well as its dependencies\r\n * If a url is null, the default url is used (pointing to https://preview.babylonjs.com)\r\n * Note that jsDecoderModule can't be null and that the other dependencies will only be loaded if necessary\r\n * Urls you can change:\r\n * URLConfig.jsDecoderModule\r\n * URLConfig.wasmUASTCToASTC\r\n * URLConfig.wasmUASTCToBC7\r\n * URLConfig.wasmUASTCToRGBA_UNORM\r\n * URLConfig.wasmUASTCToRGBA_SRGB\r\n * URLConfig.wasmUASTCToR8_UNORM\r\n * URLConfig.wasmUASTCToRG8_UNORM\r\n * URLConfig.jsMSCTranscoder\r\n * URLConfig.wasmMSCTranscoder\r\n * URLConfig.wasmZSTDDecoder\r\n * You can see their default values in this PG: https://playground.babylonjs.com/#EIJH8L#29\r\n */\r\n public static URLConfig: {\r\n jsDecoderModule: string;\r\n wasmUASTCToASTC: Nullable<string>;\r\n wasmUASTCToBC7: Nullable<string>;\r\n wasmUASTCToRGBA_UNORM: Nullable<string>;\r\n wasmUASTCToRGBA_SRGB: Nullable<string>;\r\n wasmUASTCToR8_UNORM: Nullable<string>;\r\n wasmUASTCToRG8_UNORM: Nullable<string>;\r\n jsMSCTranscoder: Nullable<string>;\r\n wasmMSCTranscoder: Nullable<string>;\r\n wasmZSTDDecoder: Nullable<string>;\r\n } = {\r\n jsDecoderModule: \"https://cdn.babylonjs.com/babylon.ktx2Decoder.js\",\r\n wasmUASTCToASTC: null,\r\n wasmUASTCToBC7: null,\r\n wasmUASTCToRGBA_UNORM: null,\r\n wasmUASTCToRGBA_SRGB: null,\r\n wasmUASTCToR8_UNORM: null,\r\n wasmUASTCToRG8_UNORM: null,\r\n jsMSCTranscoder: null,\r\n wasmMSCTranscoder: null,\r\n wasmZSTDDecoder: null,\r\n };\r\n\r\n /**\r\n * If provided, this worker pool will be used instead of creating a new one.\r\n * This is useful when loading the WASM and the js modules on your own and\r\n * you want to use the ktxTextureLoader and not construct this class directly.\r\n */\r\n public static WorkerPool?: AutoReleaseWorkerPool;\r\n\r\n /**\r\n * Default number of workers used to handle data decoding\r\n */\r\n public static DefaultNumWorkers = KhronosTextureContainer2.GetDefaultNumWorkers();\r\n\r\n /**\r\n * Default configuration for the KTX2 decoder.\r\n * The options defined in this way have priority over those passed when creating a KTX2 texture with new Texture(...).\r\n */\r\n public static DefaultDecoderOptions = new DefaultKTX2DecoderOptions();\r\n\r\n private static GetDefaultNumWorkers(): number {\r\n if (typeof navigator !== \"object\" || !navigator.hardwareConcurrency) {\r\n return 1;\r\n }\r\n\r\n // Use 50% of the available logical processors but capped at 4.\r\n return Math.min(Math.floor(navigator.hardwareConcurrency * 0.5), 4);\r\n }\r\n\r\n private _engine: AbstractEngine;\r\n\r\n private static _Initialize(numWorkers: number): void {\r\n if (KhronosTextureContainer2._WorkerPoolPromise || KhronosTextureContainer2._DecoderModulePromise) {\r\n return;\r\n }\r\n\r\n const urls = {\r\n jsDecoderModule: Tools.GetBabylonScriptURL(this.URLConfig.jsDecoderModule, true),\r\n wasmUASTCToASTC: Tools.GetBabylonScriptURL(this.URLConfig.wasmUASTCToASTC, true),\r\n wasmUASTCToBC7: Tools.GetBabylonScriptURL(this.URLConfig.wasmUASTCToBC7, true),\r\n wasmUASTCToRGBA_UNORM: Tools.GetBabylonScriptURL(this.URLConfig.wasmUASTCToRGBA_UNORM, true),\r\n wasmUASTCToRGBA_SRGB: Tools.GetBabylonScriptURL(this.URLConfig.wasmUASTCToRGBA_SRGB, true),\r\n wasmUASTCToR8_UNORM: Tools.GetBabylonScriptURL(this.URLConfig.wasmUASTCToR8_UNORM, true),\r\n wasmUASTCToRG8_UNORM: Tools.GetBabylonScriptURL(this.URLConfig.wasmUASTCToRG8_UNORM, true),\r\n jsMSCTranscoder: Tools.GetBabylonScriptURL(this.URLConfig.jsMSCTranscoder, true),\r\n wasmMSCTranscoder: Tools.GetBabylonScriptURL(this.URLConfig.wasmMSCTranscoder, true),\r\n wasmZSTDDecoder: Tools.GetBabylonScriptURL(this.URLConfig.wasmZSTDDecoder, true),\r\n };\r\n\r\n if (numWorkers && typeof Worker === \"function\" && typeof URL !== \"undefined\") {\r\n KhronosTextureContainer2._WorkerPoolPromise = new Promise((resolve) => {\r\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\r\n const workerContent = `${applyConfig}(${workerFunction})()`;\r\n const workerBlobUrl = URL.createObjectURL(new Blob([workerContent], { type: \"application/javascript\" }));\r\n resolve(new AutoReleaseWorkerPool(numWorkers, async () => await initializeWebWorker(new Worker(workerBlobUrl), undefined, urls)));\r\n });\r\n } else {\r\n if (typeof KhronosTextureContainer2._KTX2DecoderModule === \"undefined\") {\r\n // eslint-disable-next-line github/no-then\r\n KhronosTextureContainer2._DecoderModulePromise = Tools.LoadBabylonScriptAsync(urls.jsDecoderModule).then(() => {\r\n KhronosTextureContainer2._KTX2DecoderModule = KTX2DECODER;\r\n KhronosTextureContainer2._KTX2DecoderModule.MSCTranscoder.UseFromWorkerThread = false;\r\n KhronosTextureContainer2._KTX2DecoderModule.WASMMemoryManager.LoadBinariesFromCurrentThread = true;\r\n applyConfig(urls, KhronosTextureContainer2._KTX2DecoderModule);\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\r\n return new KhronosTextureContainer2._KTX2DecoderModule.KTX2Decoder();\r\n });\r\n } else {\r\n KhronosTextureContainer2._KTX2DecoderModule.MSCTranscoder.UseFromWorkerThread = false;\r\n KhronosTextureContainer2._KTX2DecoderModule.WASMMemoryManager.LoadBinariesFromCurrentThread = true;\r\n KhronosTextureContainer2._DecoderModulePromise = Promise.resolve(new KhronosTextureContainer2._KTX2DecoderModule.KTX2Decoder());\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Constructor\r\n * @param engine The engine to use\r\n * @param numWorkersOrOptions The number of workers for async operations. Specify `0` to disable web workers and run synchronously in the current context.\r\n */\r\n public constructor(engine: AbstractEngine, numWorkersOrOptions: number | IKhronosTextureContainer2Options = KhronosTextureContainer2.DefaultNumWorkers) {\r\n this._engine = engine;\r\n const workerPoolOption = (typeof numWorkersOrOptions === \"object\" && numWorkersOrOptions.workerPool) || KhronosTextureContainer2.WorkerPool;\r\n if (workerPoolOption) {\r\n KhronosTextureContainer2._WorkerPoolPromise = Promise.resolve(workerPoolOption);\r\n } else {\r\n // set the KTX2 decoder module\r\n if (typeof numWorkersOrOptions === \"object\") {\r\n KhronosTextureContainer2._KTX2DecoderModule = numWorkersOrOptions?.binariesAndModulesContainer?.jsDecoderModule;\r\n } else if (typeof KTX2DECODER !== \"undefined\") {\r\n KhronosTextureContainer2._KTX2DecoderModule = KTX2DECODER;\r\n }\r\n const numberOfWorkers = typeof numWorkersOrOptions === \"number\" ? numWorkersOrOptions : (numWorkersOrOptions.numWorkers ?? KhronosTextureContainer2.DefaultNumWorkers);\r\n KhronosTextureContainer2._Initialize(numberOfWorkers);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public async _uploadAsync(data: ArrayBufferView, internalTexture: InternalTexture, options?: IKTX2DecoderOptions & IDecodedData): Promise<void> {\r\n const caps = this._engine.getCaps();\r\n\r\n const compressedTexturesCaps: ICompressedFormatCapabilities = {\r\n astc: !!caps.astc,\r\n bptc: !!caps.bptc,\r\n s3tc: !!caps.s3tc,\r\n pvrtc: !!caps.pvrtc,\r\n etc2: !!caps.etc2,\r\n etc1: !!caps.etc1,\r\n };\r\n\r\n if (KhronosTextureContainer2._WorkerPoolPromise) {\r\n const workerPool = await KhronosTextureContainer2._WorkerPoolPromise;\r\n return await new Promise((resolve, reject) => {\r\n workerPool.push((worker, onComplete) => {\r\n const onError = (error: ErrorEvent) => {\r\n worker.removeEventListener(\"error\", onError);\r\n worker.removeEventListener(\"message\", onMessage);\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(error);\r\n onComplete();\r\n };\r\n\r\n const onMessage = (message: MessageEvent) => {\r\n if (message.data.action === \"decoded\") {\r\n worker.removeEventListener(\"error\", onError);\r\n worker.removeEventListener(\"message\", onMessage);\r\n if (!message.data.success) {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject({ message: message.data.msg });\r\n } else {\r\n try {\r\n this._createTexture(message.data.decodedData, internalTexture, options);\r\n resolve();\r\n } catch (err) {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject({ message: err });\r\n }\r\n }\r\n onComplete();\r\n }\r\n };\r\n\r\n worker.addEventListener(\"error\", onError);\r\n worker.addEventListener(\"message\", onMessage);\r\n worker.postMessage({ action: \"setDefaultDecoderOptions\", options: KhronosTextureContainer2.DefaultDecoderOptions._getKTX2DecoderOptions() });\r\n\r\n const dataCopy = new Uint8Array(data.byteLength);\r\n dataCopy.set(new Uint8Array(data.buffer, data.byteOffset, data.byteLength));\r\n\r\n worker.postMessage({ action: \"decode\", data: dataCopy, caps: compressedTexturesCaps, options }, [dataCopy.buffer]);\r\n });\r\n });\r\n } else if (KhronosTextureContainer2._DecoderModulePromise) {\r\n const decoder = await KhronosTextureContainer2._DecoderModulePromise;\r\n if (KhronosTextureContainer2.DefaultDecoderOptions.isDirty) {\r\n KhronosTextureContainer2._KTX2DecoderModule.KTX2Decoder.DefaultDecoderOptions = KhronosTextureContainer2.DefaultDecoderOptions._getKTX2DecoderOptions();\r\n }\r\n return await new Promise((resolve, reject) => {\r\n decoder\r\n .decode(data, caps)\r\n // eslint-disable-next-line github/no-then\r\n .then((data: IDecodedData) => {\r\n this._createTexture(data, internalTexture);\r\n resolve();\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .catch((reason: any) => {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject({ message: reason });\r\n });\r\n });\r\n }\r\n\r\n throw new Error(\"KTX2 decoder module is not available\");\r\n }\r\n\r\n protected _createTexture(data: IDecodedData, internalTexture: InternalTexture, options?: IKTX2DecoderOptions & IDecodedData): void {\r\n const oglTexture2D = 3553; // gl.TEXTURE_2D\r\n\r\n this._engine._bindTextureDirectly(oglTexture2D, internalTexture);\r\n\r\n if (options) {\r\n // return back some information about the decoded data\r\n options.transcodedFormat = data.transcodedFormat;\r\n options.isInGammaSpace = data.isInGammaSpace;\r\n options.hasAlpha = data.hasAlpha;\r\n options.transcoderName = data.transcoderName;\r\n }\r\n\r\n let isUncompressedFormat = true;\r\n\r\n switch (data.transcodedFormat) {\r\n case 0x8058 /* RGBA8 */:\r\n internalTexture.type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n internalTexture.format = Constants.TEXTUREFORMAT_RGBA;\r\n break;\r\n case 0x8229 /* R8 */:\r\n internalTexture.type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n internalTexture.format = Constants.TEXTUREFORMAT_R;\r\n break;\r\n case 0x822b /* RG8 */:\r\n internalTexture.type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n internalTexture.format = Constants.TEXTUREFORMAT_RG;\r\n break;\r\n default:\r\n internalTexture.format = data.transcodedFormat;\r\n isUncompressedFormat = false;\r\n break;\r\n }\r\n\r\n internalTexture._gammaSpace = data.isInGammaSpace;\r\n internalTexture.generateMipMaps = data.mipmaps.length > 1;\r\n\r\n if (data.errors) {\r\n throw new Error(\"KTX2 container - could not transcode the data. \" + data.errors);\r\n }\r\n\r\n for (let t = 0; t < data.mipmaps.length; ++t) {\r\n const mipmap = data.mipmaps[t];\r\n\r\n if (!mipmap || !mipmap.data) {\r\n throw new Error(\"KTX2 container - could not transcode one of the image\");\r\n }\r\n\r\n if (isUncompressedFormat) {\r\n // uncompressed RGBA / R8 / RG8\r\n internalTexture.width = mipmap.width; // need to set width/height so that the call to _uploadDataToTextureDirectly uses the right dimensions\r\n internalTexture.height = mipmap.height;\r\n\r\n this._engine._uploadDataToTextureDirectly(internalTexture, mipmap.data, 0, t, undefined, true);\r\n } else {\r\n this._engine._uploadCompressedDataToTextureDirectly(internalTexture, data.transcodedFormat, mipmap.width, mipmap.height, mipmap.data, 0, t);\r\n }\r\n }\r\n\r\n internalTexture._extension = \".ktx2\";\r\n internalTexture.width = data.mipmaps[0].width;\r\n internalTexture.height = data.mipmaps[0].height;\r\n internalTexture.isReady = true;\r\n\r\n this._engine._bindTextureDirectly(oglTexture2D, null);\r\n }\r\n\r\n /**\r\n * Checks if the given data starts with a KTX2 file identifier.\r\n * @param data the data to check\r\n * @returns true if the data is a KTX2 file or false otherwise\r\n */\r\n public static IsValid(data: ArrayBufferView): boolean {\r\n if (data.byteLength >= 12) {\r\n // '«', 'K', 'T', 'X', ' ', '2', '0', '»', '\\r', '\\n', '\\x1A', '\\n'\r\n const identifier = new Uint8Array(data.buffer, data.byteOffset, 12);\r\n if (\r\n identifier[0] === 0xab &&\r\n identifier[1] === 0x4b &&\r\n identifier[2] === 0x54 &&\r\n identifier[3] === 0x58 &&\r\n identifier[4] === 0x20 &&\r\n identifier[5] === 0x32 &&\r\n identifier[6] === 0x30 &&\r\n identifier[7] === 0xbb &&\r\n identifier[8] === 0x0d &&\r\n identifier[9] === 0x0a &&\r\n identifier[10] === 0x1a &&\r\n identifier[11] === 0x0a\r\n ) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n"]}
@@ -93,6 +93,7 @@ export function workerFunction(KTX2DecoderModule) {
93
93
  case "decode":
94
94
  ktx2Decoder
95
95
  .decode(event.data.data, event.data.caps, event.data.options)
96
+ // eslint-disable-next-line github/no-then
96
97
  .then((data) => {
97
98
  const buffers = [];
98
99
  for (let mip = 0; mip < data.mipmaps.length; ++mip) {
@@ -103,6 +104,7 @@ export function workerFunction(KTX2DecoderModule) {
103
104
  }
104
105
  postMessage({ action: "decoded", success: true, decodedData: data }, buffers);
105
106
  })
107
+ // eslint-disable-next-line github/no-then
106
108
  .catch((reason) => {
107
109
  postMessage({ action: "decoded", success: false, msg: reason });
108
110
  });
@@ -111,10 +113,11 @@ export function workerFunction(KTX2DecoderModule) {
111
113
  };
112
114
  }
113
115
  export async function initializeWebWorker(worker, wasmBinaries, urls) {
114
- return new Promise((resolve, reject) => {
116
+ return await new Promise((resolve, reject) => {
115
117
  const onError = (error) => {
116
118
  worker.removeEventListener("error", onError);
117
119
  worker.removeEventListener("message", onMessage);
120
+ // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors
118
121
  reject(error);
119
122
  };
120
123
  const onMessage = (message) => {
@@ -1 +1 @@
1
- {"version":3,"file":"khronosTextureContainer2Worker.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/khronosTextureContainer2Worker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IDecodedData } from \"core/Materials/Textures/ktx2decoderTypes\";\r\n\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nexport type AllowedKeys =\r\n | \"wasmUASTCToASTC\"\r\n | \"wasmUASTCToBC7\"\r\n | \"wasmUASTCToRGBA_UNORM\"\r\n | \"wasmUASTCToRGBA_SRGB\"\r\n | \"wasmUASTCToR8_UNORM\"\r\n | \"wasmUASTCToRG8_UNORM\"\r\n | \"wasmMSCTranscoder\"\r\n | \"wasmZSTDDecoder\"\r\n | \"jsDecoderModule\"\r\n | \"jsMSCTranscoder\";\r\n\r\ndeclare function importScripts(...urls: string[]): void;\r\ndeclare function postMessage(message: any, transfer?: any[]): void;\r\ndeclare let KTX2DECODER: any;\r\n\r\nexport function applyConfig(urls?: { [key in AllowedKeys]: string }, binariesAndModulesContainer?: { [key in AllowedKeys]: ArrayBuffer | any }): void {\r\n const KTX2DecoderModule = binariesAndModulesContainer?.jsDecoderModule || KTX2DECODER;\r\n if (urls) {\r\n if (urls.wasmUASTCToASTC) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_ASTC.WasmModuleURL = urls.wasmUASTCToASTC;\r\n }\r\n\r\n if (urls.wasmUASTCToBC7) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_BC7.WasmModuleURL = urls.wasmUASTCToBC7;\r\n }\r\n\r\n if (urls.wasmUASTCToRGBA_UNORM) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_RGBA_UNORM.WasmModuleURL = urls.wasmUASTCToRGBA_UNORM;\r\n }\r\n\r\n if (urls.wasmUASTCToRGBA_SRGB) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_RGBA_SRGB.WasmModuleURL = urls.wasmUASTCToRGBA_SRGB;\r\n }\r\n\r\n if (urls.wasmUASTCToR8_UNORM) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_R8_UNORM.WasmModuleURL = urls.wasmUASTCToR8_UNORM;\r\n }\r\n\r\n if (urls.wasmUASTCToRG8_UNORM) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_RG8_UNORM.WasmModuleURL = urls.wasmUASTCToRG8_UNORM;\r\n }\r\n\r\n if (urls.jsMSCTranscoder) {\r\n KTX2DecoderModule.MSCTranscoder.JSModuleURL = urls.jsMSCTranscoder;\r\n }\r\n\r\n if (urls.wasmMSCTranscoder) {\r\n KTX2DecoderModule.MSCTranscoder.WasmModuleURL = urls.wasmMSCTranscoder;\r\n }\r\n\r\n if (urls.wasmZSTDDecoder) {\r\n KTX2DecoderModule.ZSTDDecoder.WasmModuleURL = urls.wasmZSTDDecoder;\r\n }\r\n }\r\n if (binariesAndModulesContainer) {\r\n if (binariesAndModulesContainer.wasmUASTCToASTC) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_ASTC.WasmBinary = binariesAndModulesContainer.wasmUASTCToASTC;\r\n }\r\n if (binariesAndModulesContainer.wasmUASTCToBC7) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_BC7.WasmBinary = binariesAndModulesContainer.wasmUASTCToBC7;\r\n }\r\n if (binariesAndModulesContainer.wasmUASTCToRGBA_UNORM) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_RGBA_UNORM.WasmBinary = binariesAndModulesContainer.wasmUASTCToRGBA_UNORM;\r\n }\r\n if (binariesAndModulesContainer.wasmUASTCToRGBA_SRGB) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_RGBA_SRGB.WasmBinary = binariesAndModulesContainer.wasmUASTCToRGBA_SRGB;\r\n }\r\n if (binariesAndModulesContainer.wasmUASTCToR8_UNORM) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_R8_UNORM.WasmBinary = binariesAndModulesContainer.wasmUASTCToR8_UNORM;\r\n }\r\n if (binariesAndModulesContainer.wasmUASTCToRG8_UNORM) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_RG8_UNORM.WasmBinary = binariesAndModulesContainer.wasmUASTCToRG8_UNORM;\r\n }\r\n if (binariesAndModulesContainer.jsMSCTranscoder) {\r\n KTX2DecoderModule.MSCTranscoder.JSModule = binariesAndModulesContainer.jsMSCTranscoder;\r\n }\r\n if (binariesAndModulesContainer.wasmMSCTranscoder) {\r\n KTX2DecoderModule.MSCTranscoder.WasmBinary = binariesAndModulesContainer.wasmMSCTranscoder;\r\n }\r\n if (binariesAndModulesContainer.wasmZSTDDecoder) {\r\n KTX2DecoderModule.ZSTDDecoder.WasmBinary = binariesAndModulesContainer.wasmZSTDDecoder;\r\n }\r\n }\r\n}\r\n\r\nexport function workerFunction(KTX2DecoderModule: any): void {\r\n if (typeof KTX2DecoderModule === \"undefined\" && typeof KTX2DECODER !== \"undefined\") {\r\n KTX2DecoderModule = KTX2DECODER;\r\n }\r\n let ktx2Decoder: any;\r\n\r\n onmessage = (event) => {\r\n if (!event.data) {\r\n return;\r\n }\r\n switch (event.data.action) {\r\n case \"init\": {\r\n const urls = event.data.urls;\r\n if (urls) {\r\n if (urls.jsDecoderModule && typeof KTX2DecoderModule === \"undefined\") {\r\n importScripts(urls.jsDecoderModule);\r\n // assuming global namespace populated by the script (UMD pattern)\r\n KTX2DecoderModule = KTX2DECODER;\r\n }\r\n applyConfig(urls);\r\n }\r\n if (event.data.wasmBinaries) {\r\n applyConfig(undefined, { ...event.data.wasmBinaries, jsDecoderModule: KTX2DecoderModule });\r\n }\r\n ktx2Decoder = new KTX2DecoderModule.KTX2Decoder();\r\n postMessage({ action: \"init\" });\r\n break;\r\n }\r\n case \"setDefaultDecoderOptions\": {\r\n KTX2DecoderModule.KTX2Decoder.DefaultDecoderOptions = event.data.options;\r\n break;\r\n }\r\n case \"decode\":\r\n ktx2Decoder\r\n .decode(event.data.data, event.data.caps, event.data.options)\r\n .then((data: IDecodedData) => {\r\n const buffers = [];\r\n for (let mip = 0; mip < data.mipmaps.length; ++mip) {\r\n const mipmap = data.mipmaps[mip];\r\n if (mipmap && mipmap.data) {\r\n buffers.push(mipmap.data.buffer);\r\n }\r\n }\r\n postMessage({ action: \"decoded\", success: true, decodedData: data }, buffers);\r\n })\r\n .catch((reason: any) => {\r\n postMessage({ action: \"decoded\", success: false, msg: reason });\r\n });\r\n break;\r\n }\r\n };\r\n}\r\n\r\nexport async function initializeWebWorker(worker: Worker, wasmBinaries?: { [key in AllowedKeys]?: ArrayBuffer }, urls?: { [key in AllowedKeys]: string }): Promise<Worker> {\r\n return new Promise((resolve, reject) => {\r\n const onError = (error: ErrorEvent) => {\r\n worker.removeEventListener(\"error\", onError);\r\n worker.removeEventListener(\"message\", onMessage);\r\n reject(error);\r\n };\r\n\r\n const onMessage = (message: MessageEvent) => {\r\n if (message.data.action === \"init\") {\r\n worker.removeEventListener(\"error\", onError);\r\n worker.removeEventListener(\"message\", onMessage);\r\n resolve(worker);\r\n }\r\n };\r\n\r\n worker.addEventListener(\"error\", onError);\r\n worker.addEventListener(\"message\", onMessage);\r\n\r\n worker.postMessage({\r\n action: \"init\",\r\n urls,\r\n wasmBinaries,\r\n });\r\n });\r\n}\r\n"]}
1
+ {"version":3,"file":"khronosTextureContainer2Worker.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/khronosTextureContainer2Worker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IDecodedData } from \"core/Materials/Textures/ktx2decoderTypes\";\r\n\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nexport type AllowedKeys =\r\n | \"wasmUASTCToASTC\"\r\n | \"wasmUASTCToBC7\"\r\n | \"wasmUASTCToRGBA_UNORM\"\r\n | \"wasmUASTCToRGBA_SRGB\"\r\n | \"wasmUASTCToR8_UNORM\"\r\n | \"wasmUASTCToRG8_UNORM\"\r\n | \"wasmMSCTranscoder\"\r\n | \"wasmZSTDDecoder\"\r\n | \"jsDecoderModule\"\r\n | \"jsMSCTranscoder\";\r\n\r\ndeclare function importScripts(...urls: string[]): void;\r\ndeclare function postMessage(message: any, transfer?: any[]): void;\r\ndeclare let KTX2DECODER: any;\r\n\r\nexport function applyConfig(urls?: { [key in AllowedKeys]: string }, binariesAndModulesContainer?: { [key in AllowedKeys]: ArrayBuffer | any }): void {\r\n const KTX2DecoderModule = binariesAndModulesContainer?.jsDecoderModule || KTX2DECODER;\r\n if (urls) {\r\n if (urls.wasmUASTCToASTC) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_ASTC.WasmModuleURL = urls.wasmUASTCToASTC;\r\n }\r\n\r\n if (urls.wasmUASTCToBC7) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_BC7.WasmModuleURL = urls.wasmUASTCToBC7;\r\n }\r\n\r\n if (urls.wasmUASTCToRGBA_UNORM) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_RGBA_UNORM.WasmModuleURL = urls.wasmUASTCToRGBA_UNORM;\r\n }\r\n\r\n if (urls.wasmUASTCToRGBA_SRGB) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_RGBA_SRGB.WasmModuleURL = urls.wasmUASTCToRGBA_SRGB;\r\n }\r\n\r\n if (urls.wasmUASTCToR8_UNORM) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_R8_UNORM.WasmModuleURL = urls.wasmUASTCToR8_UNORM;\r\n }\r\n\r\n if (urls.wasmUASTCToRG8_UNORM) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_RG8_UNORM.WasmModuleURL = urls.wasmUASTCToRG8_UNORM;\r\n }\r\n\r\n if (urls.jsMSCTranscoder) {\r\n KTX2DecoderModule.MSCTranscoder.JSModuleURL = urls.jsMSCTranscoder;\r\n }\r\n\r\n if (urls.wasmMSCTranscoder) {\r\n KTX2DecoderModule.MSCTranscoder.WasmModuleURL = urls.wasmMSCTranscoder;\r\n }\r\n\r\n if (urls.wasmZSTDDecoder) {\r\n KTX2DecoderModule.ZSTDDecoder.WasmModuleURL = urls.wasmZSTDDecoder;\r\n }\r\n }\r\n if (binariesAndModulesContainer) {\r\n if (binariesAndModulesContainer.wasmUASTCToASTC) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_ASTC.WasmBinary = binariesAndModulesContainer.wasmUASTCToASTC;\r\n }\r\n if (binariesAndModulesContainer.wasmUASTCToBC7) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_BC7.WasmBinary = binariesAndModulesContainer.wasmUASTCToBC7;\r\n }\r\n if (binariesAndModulesContainer.wasmUASTCToRGBA_UNORM) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_RGBA_UNORM.WasmBinary = binariesAndModulesContainer.wasmUASTCToRGBA_UNORM;\r\n }\r\n if (binariesAndModulesContainer.wasmUASTCToRGBA_SRGB) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_RGBA_SRGB.WasmBinary = binariesAndModulesContainer.wasmUASTCToRGBA_SRGB;\r\n }\r\n if (binariesAndModulesContainer.wasmUASTCToR8_UNORM) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_R8_UNORM.WasmBinary = binariesAndModulesContainer.wasmUASTCToR8_UNORM;\r\n }\r\n if (binariesAndModulesContainer.wasmUASTCToRG8_UNORM) {\r\n KTX2DecoderModule.LiteTranscoder_UASTC_RG8_UNORM.WasmBinary = binariesAndModulesContainer.wasmUASTCToRG8_UNORM;\r\n }\r\n if (binariesAndModulesContainer.jsMSCTranscoder) {\r\n KTX2DecoderModule.MSCTranscoder.JSModule = binariesAndModulesContainer.jsMSCTranscoder;\r\n }\r\n if (binariesAndModulesContainer.wasmMSCTranscoder) {\r\n KTX2DecoderModule.MSCTranscoder.WasmBinary = binariesAndModulesContainer.wasmMSCTranscoder;\r\n }\r\n if (binariesAndModulesContainer.wasmZSTDDecoder) {\r\n KTX2DecoderModule.ZSTDDecoder.WasmBinary = binariesAndModulesContainer.wasmZSTDDecoder;\r\n }\r\n }\r\n}\r\n\r\nexport function workerFunction(KTX2DecoderModule: any): void {\r\n if (typeof KTX2DecoderModule === \"undefined\" && typeof KTX2DECODER !== \"undefined\") {\r\n KTX2DecoderModule = KTX2DECODER;\r\n }\r\n let ktx2Decoder: any;\r\n\r\n onmessage = (event) => {\r\n if (!event.data) {\r\n return;\r\n }\r\n switch (event.data.action) {\r\n case \"init\": {\r\n const urls = event.data.urls;\r\n if (urls) {\r\n if (urls.jsDecoderModule && typeof KTX2DecoderModule === \"undefined\") {\r\n importScripts(urls.jsDecoderModule);\r\n // assuming global namespace populated by the script (UMD pattern)\r\n KTX2DecoderModule = KTX2DECODER;\r\n }\r\n applyConfig(urls);\r\n }\r\n if (event.data.wasmBinaries) {\r\n applyConfig(undefined, { ...event.data.wasmBinaries, jsDecoderModule: KTX2DecoderModule });\r\n }\r\n ktx2Decoder = new KTX2DecoderModule.KTX2Decoder();\r\n postMessage({ action: \"init\" });\r\n break;\r\n }\r\n case \"setDefaultDecoderOptions\": {\r\n KTX2DecoderModule.KTX2Decoder.DefaultDecoderOptions = event.data.options;\r\n break;\r\n }\r\n case \"decode\":\r\n ktx2Decoder\r\n .decode(event.data.data, event.data.caps, event.data.options)\r\n // eslint-disable-next-line github/no-then\r\n .then((data: IDecodedData) => {\r\n const buffers = [];\r\n for (let mip = 0; mip < data.mipmaps.length; ++mip) {\r\n const mipmap = data.mipmaps[mip];\r\n if (mipmap && mipmap.data) {\r\n buffers.push(mipmap.data.buffer);\r\n }\r\n }\r\n postMessage({ action: \"decoded\", success: true, decodedData: data }, buffers);\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .catch((reason: any) => {\r\n postMessage({ action: \"decoded\", success: false, msg: reason });\r\n });\r\n break;\r\n }\r\n };\r\n}\r\n\r\nexport async function initializeWebWorker(worker: Worker, wasmBinaries?: { [key in AllowedKeys]?: ArrayBuffer }, urls?: { [key in AllowedKeys]: string }): Promise<Worker> {\r\n return await new Promise((resolve, reject) => {\r\n const onError = (error: ErrorEvent) => {\r\n worker.removeEventListener(\"error\", onError);\r\n worker.removeEventListener(\"message\", onMessage);\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(error);\r\n };\r\n\r\n const onMessage = (message: MessageEvent) => {\r\n if (message.data.action === \"init\") {\r\n worker.removeEventListener(\"error\", onError);\r\n worker.removeEventListener(\"message\", onMessage);\r\n resolve(worker);\r\n }\r\n };\r\n\r\n worker.addEventListener(\"error\", onError);\r\n worker.addEventListener(\"message\", onMessage);\r\n\r\n worker.postMessage({\r\n action: \"init\",\r\n urls,\r\n wasmBinaries,\r\n });\r\n });\r\n}\r\n"]}
@@ -105,6 +105,7 @@ export class MinMaxReducer {
105
105
  const func = (w, h, reduction) => {
106
106
  const buffer = new Float32Array(4 * w * h), minmax = { min: 0, max: 0 };
107
107
  return () => {
108
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
108
109
  scene.getEngine()._readTexturePixels(reduction.inputTexture.texture, w, h, -1, 0, buffer, false);
109
110
  minmax.min = buffer[0];
110
111
  minmax.max = buffer[1];
@@ -1 +1 @@
1
- {"version":3,"file":"minMaxReducer.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/minMaxReducer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Observer } from \"./observable\";\r\nimport { Observable } from \"./observable\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { PostProcess } from \"../PostProcesses/postProcess\";\r\nimport { PostProcessManager } from \"../PostProcesses/postProcessManager\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\nimport \"../Shaders/minmaxRedux.fragment\";\r\nimport \"../ShadersWGSL/minmaxRedux.fragment\";\r\n\r\n/**\r\n * This class computes a min/max reduction from a texture: it means it computes the minimum\r\n * and maximum values from all values of the texture.\r\n * It is performed on the GPU for better performances, thanks to a succession of post processes.\r\n * The source values are read from the red channel of the texture.\r\n */\r\nexport class MinMaxReducer {\r\n /**\r\n * Observable triggered when the computation has been performed\r\n */\r\n public onAfterReductionPerformed = new Observable<{ min: number; max: number }>();\r\n\r\n protected _camera: Camera;\r\n protected _sourceTexture: Nullable<RenderTargetTexture>;\r\n protected _reductionSteps: Nullable<Array<PostProcess>>;\r\n protected _postProcessManager: PostProcessManager;\r\n protected _onAfterUnbindObserver: Nullable<Observer<RenderTargetTexture>>;\r\n protected _forceFullscreenViewport = true;\r\n protected _onContextRestoredObserver: Nullable<Observer<AbstractEngine>>;\r\n\r\n /**\r\n * Creates a min/max reducer\r\n * @param camera The camera to use for the post processes\r\n */\r\n constructor(camera: Camera) {\r\n this._camera = camera;\r\n this._postProcessManager = new PostProcessManager(camera.getScene());\r\n\r\n this._onContextRestoredObserver = camera.getEngine().onContextRestoredObservable.add(() => {\r\n this._postProcessManager._rebuild();\r\n });\r\n }\r\n\r\n /**\r\n * Gets the texture used to read the values from.\r\n */\r\n public get sourceTexture(): Nullable<RenderTargetTexture> {\r\n return this._sourceTexture;\r\n }\r\n\r\n /**\r\n * Sets the source texture to read the values from.\r\n * One must indicate if the texture is a depth texture or not through the depthRedux parameter\r\n * because in such textures '1' value must not be taken into account to compute the maximum\r\n * as this value is used to clear the texture.\r\n * Note that the computation is not activated by calling this function, you must call activate() for that!\r\n * @param sourceTexture The texture to read the values from. The values should be in the red channel.\r\n * @param depthRedux Indicates if the texture is a depth texture or not\r\n * @param type The type of the textures created for the reduction (defaults to TEXTURETYPE_HALF_FLOAT)\r\n * @param forceFullscreenViewport Forces the post processes used for the reduction to be applied without taking into account viewport (defaults to true)\r\n */\r\n public setSourceTexture(sourceTexture: RenderTargetTexture, depthRedux: boolean, type: number = Constants.TEXTURETYPE_HALF_FLOAT, forceFullscreenViewport = true): void {\r\n if (sourceTexture === this._sourceTexture) {\r\n return;\r\n }\r\n\r\n this.dispose(false);\r\n\r\n this._sourceTexture = sourceTexture;\r\n this._reductionSteps = [];\r\n this._forceFullscreenViewport = forceFullscreenViewport;\r\n\r\n const scene = this._camera.getScene();\r\n\r\n // create the first step\r\n const reductionInitial = new PostProcess(\r\n \"Initial reduction phase\",\r\n \"minmaxRedux\", // shader\r\n [\"texSize\"],\r\n [\"sourceTexture\"], // textures\r\n 1.0, // options\r\n null, // camera\r\n Constants.TEXTURE_NEAREST_NEAREST, // sampling\r\n scene.getEngine(), // engine\r\n false, // reusable\r\n \"#define INITIAL\" + (depthRedux ? \"\\n#define DEPTH_REDUX\" : \"\"), // defines\r\n type,\r\n undefined,\r\n undefined,\r\n undefined,\r\n Constants.TEXTUREFORMAT_RG,\r\n scene.getEngine().isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL\r\n );\r\n\r\n reductionInitial.autoClear = false;\r\n reductionInitial.forceFullscreenViewport = forceFullscreenViewport;\r\n\r\n let w = this._sourceTexture.getRenderWidth(),\r\n h = this._sourceTexture.getRenderHeight();\r\n\r\n reductionInitial.onApply = ((w: number, h: number) => {\r\n return (effect: Effect) => {\r\n effect.setTexture(\"sourceTexture\", this._sourceTexture);\r\n effect.setFloat2(\"texSize\", w, h);\r\n };\r\n })(w, h);\r\n\r\n this._reductionSteps.push(reductionInitial);\r\n\r\n let index = 1;\r\n\r\n // create the additional steps\r\n while (w > 1 || h > 1) {\r\n w = Math.max(Math.round(w / 2), 1);\r\n h = Math.max(Math.round(h / 2), 1);\r\n\r\n const reduction = new PostProcess(\r\n \"Reduction phase \" + index,\r\n \"minmaxRedux\", // shader\r\n [\"texSize\"],\r\n null,\r\n { width: w, height: h }, // options\r\n null, // camera\r\n Constants.TEXTURE_NEAREST_NEAREST, // sampling\r\n scene.getEngine(), // engine\r\n false, // reusable\r\n \"#define \" + (w == 1 && h == 1 ? \"LAST\" : w == 1 || h == 1 ? \"ONEBEFORELAST\" : \"MAIN\"), // defines\r\n type,\r\n undefined,\r\n undefined,\r\n undefined,\r\n Constants.TEXTUREFORMAT_RG,\r\n scene.getEngine().isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL\r\n );\r\n\r\n reduction.autoClear = false;\r\n reduction.forceFullscreenViewport = forceFullscreenViewport;\r\n\r\n reduction.onApply = ((w: number, h: number) => {\r\n return (effect: Effect) => {\r\n if (w == 1 || h == 1) {\r\n effect.setInt2(\"texSize\", w, h);\r\n } else {\r\n effect.setFloat2(\"texSize\", w, h);\r\n }\r\n };\r\n })(w, h);\r\n\r\n this._reductionSteps.push(reduction);\r\n\r\n index++;\r\n\r\n if (w == 1 && h == 1) {\r\n const func = (w: number, h: number, reduction: PostProcess) => {\r\n const buffer = new Float32Array(4 * w * h),\r\n minmax = { min: 0, max: 0 };\r\n return () => {\r\n scene.getEngine()._readTexturePixels(reduction.inputTexture.texture!, w, h, -1, 0, buffer, false);\r\n minmax.min = buffer[0];\r\n minmax.max = buffer[1];\r\n this.onAfterReductionPerformed.notifyObservers(minmax);\r\n };\r\n };\r\n reduction.onAfterRenderObservable.add(func(w, h, reduction));\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Defines the refresh rate of the computation.\r\n * Use 0 to compute just once, 1 to compute on every frame, 2 to compute every two frames and so on...\r\n */\r\n public get refreshRate(): number {\r\n return this._sourceTexture ? this._sourceTexture.refreshRate : -1;\r\n }\r\n\r\n public set refreshRate(value: number) {\r\n if (this._sourceTexture) {\r\n this._sourceTexture.refreshRate = value;\r\n }\r\n }\r\n\r\n protected _activated = false;\r\n\r\n /**\r\n * Gets the activation status of the reducer\r\n */\r\n public get activated(): boolean {\r\n return this._activated;\r\n }\r\n\r\n /**\r\n * Activates the reduction computation.\r\n * When activated, the observers registered in onAfterReductionPerformed are\r\n * called after the computation is performed\r\n */\r\n public activate(): void {\r\n if (this._onAfterUnbindObserver || !this._sourceTexture) {\r\n return;\r\n }\r\n\r\n this._onAfterUnbindObserver = this._sourceTexture.onAfterUnbindObservable.add(() => {\r\n const engine = this._camera.getScene().getEngine();\r\n engine._debugPushGroup?.(`min max reduction`, 1);\r\n this._reductionSteps![0].activate(this._camera);\r\n this._postProcessManager.directRender(this._reductionSteps!, this._reductionSteps![0].inputTexture, this._forceFullscreenViewport);\r\n engine.unBindFramebuffer(this._reductionSteps![0].inputTexture, false);\r\n engine._debugPopGroup?.(1);\r\n });\r\n\r\n this._activated = true;\r\n }\r\n\r\n /**\r\n * Deactivates the reduction computation.\r\n */\r\n public deactivate(): void {\r\n if (!this._onAfterUnbindObserver || !this._sourceTexture) {\r\n return;\r\n }\r\n\r\n this._sourceTexture.onAfterUnbindObservable.remove(this._onAfterUnbindObserver);\r\n this._onAfterUnbindObserver = null;\r\n this._activated = false;\r\n }\r\n\r\n /**\r\n * Disposes the min/max reducer\r\n * @param disposeAll true to dispose all the resources. You should always call this function with true as the parameter (or without any parameter as it is the default one). This flag is meant to be used internally.\r\n */\r\n public dispose(disposeAll = true): void {\r\n if (disposeAll) {\r\n this.onAfterReductionPerformed.clear();\r\n\r\n if (this._onContextRestoredObserver) {\r\n this._camera.getEngine().onContextRestoredObservable.remove(this._onContextRestoredObserver);\r\n this._onContextRestoredObserver = null;\r\n }\r\n }\r\n\r\n this.deactivate();\r\n\r\n if (this._reductionSteps) {\r\n for (let i = 0; i < this._reductionSteps.length; ++i) {\r\n this._reductionSteps[i].dispose();\r\n }\r\n this._reductionSteps = null;\r\n }\r\n\r\n if (this._postProcessManager && disposeAll) {\r\n this._postProcessManager.dispose();\r\n }\r\n\r\n this._sourceTexture = null;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"minMaxReducer.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/minMaxReducer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Observer } from \"./observable\";\r\nimport { Observable } from \"./observable\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { PostProcess } from \"../PostProcesses/postProcess\";\r\nimport { PostProcessManager } from \"../PostProcesses/postProcessManager\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\nimport \"../Shaders/minmaxRedux.fragment\";\r\nimport \"../ShadersWGSL/minmaxRedux.fragment\";\r\n\r\n/**\r\n * This class computes a min/max reduction from a texture: it means it computes the minimum\r\n * and maximum values from all values of the texture.\r\n * It is performed on the GPU for better performances, thanks to a succession of post processes.\r\n * The source values are read from the red channel of the texture.\r\n */\r\nexport class MinMaxReducer {\r\n /**\r\n * Observable triggered when the computation has been performed\r\n */\r\n public onAfterReductionPerformed = new Observable<{ min: number; max: number }>();\r\n\r\n protected _camera: Camera;\r\n protected _sourceTexture: Nullable<RenderTargetTexture>;\r\n protected _reductionSteps: Nullable<Array<PostProcess>>;\r\n protected _postProcessManager: PostProcessManager;\r\n protected _onAfterUnbindObserver: Nullable<Observer<RenderTargetTexture>>;\r\n protected _forceFullscreenViewport = true;\r\n protected _onContextRestoredObserver: Nullable<Observer<AbstractEngine>>;\r\n\r\n /**\r\n * Creates a min/max reducer\r\n * @param camera The camera to use for the post processes\r\n */\r\n constructor(camera: Camera) {\r\n this._camera = camera;\r\n this._postProcessManager = new PostProcessManager(camera.getScene());\r\n\r\n this._onContextRestoredObserver = camera.getEngine().onContextRestoredObservable.add(() => {\r\n this._postProcessManager._rebuild();\r\n });\r\n }\r\n\r\n /**\r\n * Gets the texture used to read the values from.\r\n */\r\n public get sourceTexture(): Nullable<RenderTargetTexture> {\r\n return this._sourceTexture;\r\n }\r\n\r\n /**\r\n * Sets the source texture to read the values from.\r\n * One must indicate if the texture is a depth texture or not through the depthRedux parameter\r\n * because in such textures '1' value must not be taken into account to compute the maximum\r\n * as this value is used to clear the texture.\r\n * Note that the computation is not activated by calling this function, you must call activate() for that!\r\n * @param sourceTexture The texture to read the values from. The values should be in the red channel.\r\n * @param depthRedux Indicates if the texture is a depth texture or not\r\n * @param type The type of the textures created for the reduction (defaults to TEXTURETYPE_HALF_FLOAT)\r\n * @param forceFullscreenViewport Forces the post processes used for the reduction to be applied without taking into account viewport (defaults to true)\r\n */\r\n public setSourceTexture(sourceTexture: RenderTargetTexture, depthRedux: boolean, type: number = Constants.TEXTURETYPE_HALF_FLOAT, forceFullscreenViewport = true): void {\r\n if (sourceTexture === this._sourceTexture) {\r\n return;\r\n }\r\n\r\n this.dispose(false);\r\n\r\n this._sourceTexture = sourceTexture;\r\n this._reductionSteps = [];\r\n this._forceFullscreenViewport = forceFullscreenViewport;\r\n\r\n const scene = this._camera.getScene();\r\n\r\n // create the first step\r\n const reductionInitial = new PostProcess(\r\n \"Initial reduction phase\",\r\n \"minmaxRedux\", // shader\r\n [\"texSize\"],\r\n [\"sourceTexture\"], // textures\r\n 1.0, // options\r\n null, // camera\r\n Constants.TEXTURE_NEAREST_NEAREST, // sampling\r\n scene.getEngine(), // engine\r\n false, // reusable\r\n \"#define INITIAL\" + (depthRedux ? \"\\n#define DEPTH_REDUX\" : \"\"), // defines\r\n type,\r\n undefined,\r\n undefined,\r\n undefined,\r\n Constants.TEXTUREFORMAT_RG,\r\n scene.getEngine().isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL\r\n );\r\n\r\n reductionInitial.autoClear = false;\r\n reductionInitial.forceFullscreenViewport = forceFullscreenViewport;\r\n\r\n let w = this._sourceTexture.getRenderWidth(),\r\n h = this._sourceTexture.getRenderHeight();\r\n\r\n reductionInitial.onApply = ((w: number, h: number) => {\r\n return (effect: Effect) => {\r\n effect.setTexture(\"sourceTexture\", this._sourceTexture);\r\n effect.setFloat2(\"texSize\", w, h);\r\n };\r\n })(w, h);\r\n\r\n this._reductionSteps.push(reductionInitial);\r\n\r\n let index = 1;\r\n\r\n // create the additional steps\r\n while (w > 1 || h > 1) {\r\n w = Math.max(Math.round(w / 2), 1);\r\n h = Math.max(Math.round(h / 2), 1);\r\n\r\n const reduction = new PostProcess(\r\n \"Reduction phase \" + index,\r\n \"minmaxRedux\", // shader\r\n [\"texSize\"],\r\n null,\r\n { width: w, height: h }, // options\r\n null, // camera\r\n Constants.TEXTURE_NEAREST_NEAREST, // sampling\r\n scene.getEngine(), // engine\r\n false, // reusable\r\n \"#define \" + (w == 1 && h == 1 ? \"LAST\" : w == 1 || h == 1 ? \"ONEBEFORELAST\" : \"MAIN\"), // defines\r\n type,\r\n undefined,\r\n undefined,\r\n undefined,\r\n Constants.TEXTUREFORMAT_RG,\r\n scene.getEngine().isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL\r\n );\r\n\r\n reduction.autoClear = false;\r\n reduction.forceFullscreenViewport = forceFullscreenViewport;\r\n\r\n reduction.onApply = ((w: number, h: number) => {\r\n return (effect: Effect) => {\r\n if (w == 1 || h == 1) {\r\n effect.setInt2(\"texSize\", w, h);\r\n } else {\r\n effect.setFloat2(\"texSize\", w, h);\r\n }\r\n };\r\n })(w, h);\r\n\r\n this._reductionSteps.push(reduction);\r\n\r\n index++;\r\n\r\n if (w == 1 && h == 1) {\r\n const func = (w: number, h: number, reduction: PostProcess) => {\r\n const buffer = new Float32Array(4 * w * h),\r\n minmax = { min: 0, max: 0 };\r\n return () => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n scene.getEngine()._readTexturePixels(reduction.inputTexture.texture!, w, h, -1, 0, buffer, false);\r\n minmax.min = buffer[0];\r\n minmax.max = buffer[1];\r\n this.onAfterReductionPerformed.notifyObservers(minmax);\r\n };\r\n };\r\n reduction.onAfterRenderObservable.add(func(w, h, reduction));\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Defines the refresh rate of the computation.\r\n * Use 0 to compute just once, 1 to compute on every frame, 2 to compute every two frames and so on...\r\n */\r\n public get refreshRate(): number {\r\n return this._sourceTexture ? this._sourceTexture.refreshRate : -1;\r\n }\r\n\r\n public set refreshRate(value: number) {\r\n if (this._sourceTexture) {\r\n this._sourceTexture.refreshRate = value;\r\n }\r\n }\r\n\r\n protected _activated = false;\r\n\r\n /**\r\n * Gets the activation status of the reducer\r\n */\r\n public get activated(): boolean {\r\n return this._activated;\r\n }\r\n\r\n /**\r\n * Activates the reduction computation.\r\n * When activated, the observers registered in onAfterReductionPerformed are\r\n * called after the computation is performed\r\n */\r\n public activate(): void {\r\n if (this._onAfterUnbindObserver || !this._sourceTexture) {\r\n return;\r\n }\r\n\r\n this._onAfterUnbindObserver = this._sourceTexture.onAfterUnbindObservable.add(() => {\r\n const engine = this._camera.getScene().getEngine();\r\n engine._debugPushGroup?.(`min max reduction`, 1);\r\n this._reductionSteps![0].activate(this._camera);\r\n this._postProcessManager.directRender(this._reductionSteps!, this._reductionSteps![0].inputTexture, this._forceFullscreenViewport);\r\n engine.unBindFramebuffer(this._reductionSteps![0].inputTexture, false);\r\n engine._debugPopGroup?.(1);\r\n });\r\n\r\n this._activated = true;\r\n }\r\n\r\n /**\r\n * Deactivates the reduction computation.\r\n */\r\n public deactivate(): void {\r\n if (!this._onAfterUnbindObserver || !this._sourceTexture) {\r\n return;\r\n }\r\n\r\n this._sourceTexture.onAfterUnbindObservable.remove(this._onAfterUnbindObserver);\r\n this._onAfterUnbindObserver = null;\r\n this._activated = false;\r\n }\r\n\r\n /**\r\n * Disposes the min/max reducer\r\n * @param disposeAll true to dispose all the resources. You should always call this function with true as the parameter (or without any parameter as it is the default one). This flag is meant to be used internally.\r\n */\r\n public dispose(disposeAll = true): void {\r\n if (disposeAll) {\r\n this.onAfterReductionPerformed.clear();\r\n\r\n if (this._onContextRestoredObserver) {\r\n this._camera.getEngine().onContextRestoredObservable.remove(this._onContextRestoredObserver);\r\n this._onContextRestoredObserver = null;\r\n }\r\n }\r\n\r\n this.deactivate();\r\n\r\n if (this._reductionSteps) {\r\n for (let i = 0; i < this._reductionSteps.length; ++i) {\r\n this._reductionSteps[i].dispose();\r\n }\r\n this._reductionSteps = null;\r\n }\r\n\r\n if (this._postProcessManager && disposeAll) {\r\n this._postProcessManager.dispose();\r\n }\r\n\r\n this._sourceTexture = null;\r\n }\r\n}\r\n"]}
@@ -41,7 +41,7 @@ Observable.prototype.notifyObserversWithPromise = async function (eventData, mas
41
41
  let p = Promise.resolve(eventData);
42
42
  // no observers? return this promise.
43
43
  if (!this.observers.length) {
44
- return p;
44
+ return await p;
45
45
  }
46
46
  const state = this._eventState;
47
47
  state.mask = mask;
@@ -59,12 +59,14 @@ Observable.prototype.notifyObserversWithPromise = async function (eventData, mas
59
59
  }
60
60
  if (obs.mask & mask) {
61
61
  if (obs.scope) {
62
+ // eslint-disable-next-line github/no-then
62
63
  p = p.then((lastReturnedValue) => {
63
64
  state.lastReturnValue = lastReturnedValue;
64
65
  return obs.callback.apply(obs.scope, [eventData, state]);
65
66
  });
66
67
  }
67
68
  else {
69
+ // eslint-disable-next-line github/no-then
68
70
  p = p.then((lastReturnedValue) => {
69
71
  state.lastReturnValue = lastReturnedValue;
70
72
  return obs.callback(eventData, state);
@@ -1 +1 @@
1
- {"version":3,"file":"observable.extensions.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/observable.extensions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport type { Observer, EventState } from \"./observable\";\r\nimport { Observable } from \"./observable\";\r\n\r\n/**\r\n * Represent a list of observers registered to multiple Observables object.\r\n */\r\nexport class MultiObserver<T> {\r\n private _observers: Nullable<Observer<T>[]>;\r\n private _observables: Nullable<Observable<T>[]>;\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._observers && this._observables) {\r\n for (let index = 0; index < this._observers.length; index++) {\r\n this._observables[index].remove(this._observers[index]);\r\n }\r\n }\r\n\r\n this._observers = null;\r\n this._observables = null;\r\n }\r\n\r\n /**\r\n * Raise a callback when one of the observable will notify\r\n * @param observables defines a list of observables to watch\r\n * @param callback defines the callback to call on notification\r\n * @param mask defines the mask used to filter notifications\r\n * @param scope defines the current scope used to restore the JS context\r\n * @returns the new MultiObserver\r\n */\r\n public static Watch<T>(observables: Observable<T>[], callback: (eventData: T, eventState: EventState) => void, mask: number = -1, scope: any = null): MultiObserver<T> {\r\n const result = new MultiObserver<T>();\r\n\r\n result._observers = new Array<Observer<T>>();\r\n result._observables = observables;\r\n\r\n for (const observable of observables) {\r\n const observer = observable.add(callback, mask, false, scope);\r\n if (observer) {\r\n result._observers.push(observer);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\ndeclare module \"./observable\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface Observable<T> {\r\n /**\r\n * Calling this will execute each callback, expecting it to be a promise or return a value.\r\n * If at any point in the chain one function fails, the promise will fail and the execution will not continue.\r\n * This is useful when a chain of events (sometimes async events) is needed to initialize a certain object\r\n * and it is crucial that all callbacks will be executed.\r\n * The order of the callbacks is kept, callbacks are not executed parallel.\r\n *\r\n * @param eventData The data to be sent to each callback\r\n * @param mask is used to filter observers defaults to -1\r\n * @param target defines the callback target (see EventState)\r\n * @param currentTarget defines he current object in the bubbling phase\r\n * @param userInfo defines any user info to send to observers\r\n * @returns {Promise<T>} will return a Promise than resolves when all callbacks executed successfully.\r\n */\r\n notifyObserversWithPromise(eventData: T, mask?: number, target?: any, currentTarget?: any, userInfo?: any): Promise<T>;\r\n }\r\n}\r\n\r\nObservable.prototype.notifyObserversWithPromise = async function <T>(eventData: T, mask: number = -1, target?: any, currentTarget?: any, userInfo?: any): Promise<T> {\r\n // create an empty promise\r\n let p: Promise<any> = Promise.resolve(eventData);\r\n\r\n // no observers? return this promise.\r\n if (!this.observers.length) {\r\n return p;\r\n }\r\n\r\n const state = this._eventState;\r\n state.mask = mask;\r\n state.target = target;\r\n state.currentTarget = currentTarget;\r\n state.skipNextObservers = false;\r\n state.userInfo = userInfo;\r\n\r\n // execute one callback after another (not using Promise.all, the order is important)\r\n for (const obs of this.observers) {\r\n if (state.skipNextObservers) {\r\n continue;\r\n }\r\n if (obs._willBeUnregistered) {\r\n continue;\r\n }\r\n if (obs.mask & mask) {\r\n if (obs.scope) {\r\n p = p.then((lastReturnedValue) => {\r\n state.lastReturnValue = lastReturnedValue;\r\n return obs.callback.apply(obs.scope, [eventData, state]);\r\n });\r\n } else {\r\n p = p.then((lastReturnedValue) => {\r\n state.lastReturnValue = lastReturnedValue;\r\n return obs.callback(eventData, state);\r\n });\r\n }\r\n if (obs.unregisterOnNextCall) {\r\n this._deferUnregister(obs);\r\n }\r\n }\r\n }\r\n\r\n // return the eventData\r\n await p;\r\n return eventData;\r\n};\r\n"]}
1
+ {"version":3,"file":"observable.extensions.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/observable.extensions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport type { Observer, EventState } from \"./observable\";\r\nimport { Observable } from \"./observable\";\r\n\r\n/**\r\n * Represent a list of observers registered to multiple Observables object.\r\n */\r\nexport class MultiObserver<T> {\r\n private _observers: Nullable<Observer<T>[]>;\r\n private _observables: Nullable<Observable<T>[]>;\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._observers && this._observables) {\r\n for (let index = 0; index < this._observers.length; index++) {\r\n this._observables[index].remove(this._observers[index]);\r\n }\r\n }\r\n\r\n this._observers = null;\r\n this._observables = null;\r\n }\r\n\r\n /**\r\n * Raise a callback when one of the observable will notify\r\n * @param observables defines a list of observables to watch\r\n * @param callback defines the callback to call on notification\r\n * @param mask defines the mask used to filter notifications\r\n * @param scope defines the current scope used to restore the JS context\r\n * @returns the new MultiObserver\r\n */\r\n public static Watch<T>(observables: Observable<T>[], callback: (eventData: T, eventState: EventState) => void, mask: number = -1, scope: any = null): MultiObserver<T> {\r\n const result = new MultiObserver<T>();\r\n\r\n result._observers = new Array<Observer<T>>();\r\n result._observables = observables;\r\n\r\n for (const observable of observables) {\r\n const observer = observable.add(callback, mask, false, scope);\r\n if (observer) {\r\n result._observers.push(observer);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\ndeclare module \"./observable\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface Observable<T> {\r\n /**\r\n * Calling this will execute each callback, expecting it to be a promise or return a value.\r\n * If at any point in the chain one function fails, the promise will fail and the execution will not continue.\r\n * This is useful when a chain of events (sometimes async events) is needed to initialize a certain object\r\n * and it is crucial that all callbacks will be executed.\r\n * The order of the callbacks is kept, callbacks are not executed parallel.\r\n *\r\n * @param eventData The data to be sent to each callback\r\n * @param mask is used to filter observers defaults to -1\r\n * @param target defines the callback target (see EventState)\r\n * @param currentTarget defines he current object in the bubbling phase\r\n * @param userInfo defines any user info to send to observers\r\n * @returns {Promise<T>} will return a Promise than resolves when all callbacks executed successfully.\r\n */\r\n notifyObserversWithPromise(eventData: T, mask?: number, target?: any, currentTarget?: any, userInfo?: any): Promise<T>;\r\n }\r\n}\r\n\r\nObservable.prototype.notifyObserversWithPromise = async function <T>(eventData: T, mask: number = -1, target?: any, currentTarget?: any, userInfo?: any): Promise<T> {\r\n // create an empty promise\r\n let p: Promise<any> = Promise.resolve(eventData);\r\n\r\n // no observers? return this promise.\r\n if (!this.observers.length) {\r\n return await p;\r\n }\r\n\r\n const state = this._eventState;\r\n state.mask = mask;\r\n state.target = target;\r\n state.currentTarget = currentTarget;\r\n state.skipNextObservers = false;\r\n state.userInfo = userInfo;\r\n\r\n // execute one callback after another (not using Promise.all, the order is important)\r\n for (const obs of this.observers) {\r\n if (state.skipNextObservers) {\r\n continue;\r\n }\r\n if (obs._willBeUnregistered) {\r\n continue;\r\n }\r\n if (obs.mask & mask) {\r\n if (obs.scope) {\r\n // eslint-disable-next-line github/no-then\r\n p = p.then((lastReturnedValue) => {\r\n state.lastReturnValue = lastReturnedValue;\r\n return obs.callback.apply(obs.scope, [eventData, state]);\r\n });\r\n } else {\r\n // eslint-disable-next-line github/no-then\r\n p = p.then((lastReturnedValue) => {\r\n state.lastReturnValue = lastReturnedValue;\r\n return obs.callback(eventData, state);\r\n });\r\n }\r\n if (obs.unregisterOnNextCall) {\r\n this._deferUnregister(obs);\r\n }\r\n }\r\n }\r\n\r\n // return the eventData\r\n await p;\r\n return eventData;\r\n};\r\n"]}
@@ -97,9 +97,11 @@ export class Observable {
97
97
  static FromPromise(promise, onErrorObservable) {
98
98
  const observable = new Observable();
99
99
  promise
100
+ // eslint-disable-next-line github/no-then
100
101
  .then((ret) => {
101
102
  observable.notifyObservers(ret);
102
103
  })
104
+ // eslint-disable-next-line github/no-then
103
105
  .catch((err) => {
104
106
  if (onErrorObservable) {
105
107
  onErrorObservable.notifyObservers(err);
@@ -1 +1 @@
1
- {"version":3,"file":"observable.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/observable.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\n\r\ndeclare const WeakRef: any;\r\n\r\nconst IsWeakRefSupported = typeof WeakRef !== \"undefined\";\r\n\r\n/**\r\n * A class serves as a medium between the observable and its observers\r\n */\r\nexport class EventState {\r\n /**\r\n * Create a new EventState\r\n * @param mask defines the mask associated with this state\r\n * @param skipNextObservers defines a flag which will instruct the observable to skip following observers when set to true\r\n * @param target defines the original target of the state\r\n * @param currentTarget defines the current target of the state\r\n */\r\n constructor(mask: number, skipNextObservers = false, target?: any, currentTarget?: any) {\r\n this.initialize(mask, skipNextObservers, target, currentTarget);\r\n }\r\n\r\n /**\r\n * Initialize the current event state\r\n * @param mask defines the mask associated with this state\r\n * @param skipNextObservers defines a flag which will instruct the observable to skip following observers when set to true\r\n * @param target defines the original target of the state\r\n * @param currentTarget defines the current target of the state\r\n * @returns the current event state\r\n */\r\n public initialize(mask: number, skipNextObservers = false, target?: any, currentTarget?: any): EventState {\r\n this.mask = mask;\r\n this.skipNextObservers = skipNextObservers;\r\n this.target = target;\r\n this.currentTarget = currentTarget;\r\n return this;\r\n }\r\n\r\n /**\r\n * An Observer can set this property to true to prevent subsequent observers of being notified\r\n */\r\n public skipNextObservers: boolean;\r\n\r\n /**\r\n * Get the mask value that were used to trigger the event corresponding to this EventState object\r\n */\r\n public mask: number;\r\n\r\n /**\r\n * The object that originally notified the event\r\n */\r\n public target?: any;\r\n\r\n /**\r\n * The current object in the bubbling phase\r\n */\r\n public currentTarget?: any;\r\n\r\n /**\r\n * This will be populated with the return value of the last function that was executed.\r\n * If it is the first function in the callback chain it will be the event data.\r\n */\r\n public lastReturnValue?: any;\r\n\r\n /**\r\n * User defined information that will be sent to observers\r\n */\r\n public userInfo?: any;\r\n}\r\n\r\n/**\r\n * Represent an Observer registered to a given Observable object.\r\n */\r\nexport class Observer<T> {\r\n /** @internal */\r\n public _willBeUnregistered = false;\r\n /**\r\n * Gets or sets a property defining that the observer as to be unregistered after the next notification\r\n */\r\n public unregisterOnNextCall = false;\r\n\r\n /**\r\n * this function can be used to remove the observer from the observable.\r\n * It will be set by the observable that the observer belongs to.\r\n * @internal\r\n */\r\n public _remove: Nullable<(defer?: boolean) => void> = null;\r\n\r\n /**\r\n * Creates a new observer\r\n * @param callback defines the callback to call when the observer is notified\r\n * @param mask defines the mask of the observer (used to filter notifications)\r\n * @param scope defines the current scope used to restore the JS context\r\n */\r\n constructor(\r\n /**\r\n * Defines the callback to call when the observer is notified\r\n */\r\n public callback: (eventData: T, eventState: EventState) => void,\r\n /**\r\n * Defines the mask of the observer (used to filter notifications)\r\n */\r\n public mask: number,\r\n /**\r\n * [null] Defines the current scope used to restore the JS context\r\n */\r\n public scope: any = null\r\n ) {}\r\n\r\n /**\r\n * Remove the observer from its observable\r\n * This can be used instead of using the observable's remove function.\r\n * @param defer if true, the removal will be deferred to avoid callback skipping (default: false)\r\n */\r\n public remove(defer = false) {\r\n if (this._remove) {\r\n this._remove(defer);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * The Observable class is a simple implementation of the Observable pattern.\r\n *\r\n * There's one slight particularity though: a given Observable can notify its observer using a particular mask value, only the Observers registered with this mask value will be notified.\r\n * This enable a more fine grained execution without having to rely on multiple different Observable objects.\r\n * For instance you may have a given Observable that have four different types of notifications: Move (mask = 0x01), Stop (mask = 0x02), Turn Right (mask = 0X04), Turn Left (mask = 0X08).\r\n * A given observer can register itself with only Move and Stop (mask = 0x03), then it will only be notified when one of these two occurs and will never be for Turn Left/Right.\r\n */\r\nexport class Observable<T> {\r\n private _observers = new Array<Observer<T>>();\r\n private _numObserversMarkedAsDeleted = 0;\r\n private _hasNotified = false;\r\n private _lastNotifiedValue?: T;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _eventState: EventState;\r\n\r\n private _onObserverAdded: Nullable<(observer: Observer<T>) => void>;\r\n\r\n /**\r\n * Create an observable from a Promise.\r\n * @param promise a promise to observe for fulfillment.\r\n * @param onErrorObservable an observable to notify if a promise was rejected.\r\n * @returns the new Observable\r\n */\r\n public static FromPromise<T, E = Error>(promise: Promise<T>, onErrorObservable?: Observable<E>): Observable<T> {\r\n const observable = new Observable<T>();\r\n\r\n promise\r\n .then((ret: T) => {\r\n observable.notifyObservers(ret);\r\n })\r\n .catch((err) => {\r\n if (onErrorObservable) {\r\n onErrorObservable.notifyObservers(err as E);\r\n } else {\r\n throw err;\r\n }\r\n });\r\n\r\n return observable;\r\n }\r\n\r\n /**\r\n * Gets the list of observers\r\n * Note that observers that were recently deleted may still be present in the list because they are only really deleted on the next javascript tick!\r\n */\r\n public get observers(): Array<Observer<T>> {\r\n return this._observers;\r\n }\r\n\r\n /**\r\n * Creates a new observable\r\n * @param onObserverAdded defines a callback to call when a new observer is added\r\n * @param notifyIfTriggered If set to true the observable will notify when an observer was added if the observable was already triggered.\r\n */\r\n constructor(\r\n onObserverAdded?: (observer: Observer<T>) => void,\r\n /**\r\n * [false] If set to true the observable will notify when an observer was added if the observable was already triggered.\r\n * This is helpful to single-state observables like the scene onReady or the dispose observable.\r\n */\r\n public notifyIfTriggered = false\r\n ) {\r\n this._eventState = new EventState(0);\r\n\r\n if (onObserverAdded) {\r\n this._onObserverAdded = onObserverAdded;\r\n }\r\n }\r\n\r\n /**\r\n * Create a new Observer with the specified callback\r\n * @param callback the callback that will be executed for that Observer\r\n * @param mask the mask used to filter observers\r\n * @param insertFirst if true the callback will be inserted at the first position, hence executed before the others ones. If false (default behavior) the callback will be inserted at the last position, executed after all the others already present.\r\n * @param scope optional scope for the callback to be called from\r\n * @param unregisterOnFirstCall defines if the observer as to be unregistered after the next notification\r\n * @returns the new observer created for the callback\r\n */\r\n public add(callback?: null, mask?: number, insertFirst?: boolean, scope?: any, unregisterOnFirstCall?: boolean): null;\r\n public add(callback: (eventData: T, eventState: EventState) => void, mask?: number, insertFirst?: boolean, scope?: any, unregisterOnFirstCall?: boolean): Observer<T>;\r\n public add(\r\n callback?: ((eventData: T, eventState: EventState) => void) | null,\r\n mask?: number,\r\n insertFirst?: boolean,\r\n scope?: any,\r\n unregisterOnFirstCall?: boolean\r\n ): Nullable<Observer<T>>;\r\n public add(\r\n callback?: ((eventData: T, eventState: EventState) => void) | null,\r\n mask: number = -1,\r\n insertFirst = false,\r\n scope: any = null,\r\n unregisterOnFirstCall = false\r\n ): Nullable<Observer<T>> {\r\n if (!callback) {\r\n return null;\r\n }\r\n\r\n const observer = new Observer(callback, mask, scope);\r\n observer.unregisterOnNextCall = unregisterOnFirstCall;\r\n\r\n if (insertFirst) {\r\n this._observers.unshift(observer);\r\n } else {\r\n this._observers.push(observer);\r\n }\r\n\r\n if (this._onObserverAdded) {\r\n this._onObserverAdded(observer);\r\n }\r\n\r\n // If the observable was already triggered and the observable is set to notify if triggered, notify the new observer\r\n if (this._hasNotified && this.notifyIfTriggered) {\r\n if (this._lastNotifiedValue !== undefined) {\r\n this.notifyObserver(observer, this._lastNotifiedValue);\r\n }\r\n }\r\n\r\n // attach the remove function to the observer\r\n const observableWeakRef = IsWeakRefSupported ? new WeakRef(this) : { deref: () => this };\r\n observer._remove = (defer = false) => {\r\n const observable = observableWeakRef.deref();\r\n if (observable) {\r\n defer ? observable.remove(observer) : observable._remove(observer);\r\n }\r\n };\r\n\r\n return observer;\r\n }\r\n\r\n /**\r\n * Create a new Observer with the specified callback and unregisters after the next notification\r\n * @param callback the callback that will be executed for that Observer\r\n * @returns the new observer created for the callback\r\n */\r\n public addOnce(callback?: null): null;\r\n public addOnce(callback: (eventData: T, eventState: EventState) => void): Observer<T>;\r\n public addOnce(callback?: ((eventData: T, eventState: EventState) => void) | null): Nullable<Observer<T>>;\r\n public addOnce(callback?: ((eventData: T, eventState: EventState) => void) | null): Nullable<Observer<T>> {\r\n return this.add(callback, undefined, undefined, undefined, true);\r\n }\r\n\r\n /**\r\n * Remove an Observer from the Observable object\r\n * @param observer the instance of the Observer to remove\r\n * @returns false if it doesn't belong to this Observable\r\n */\r\n public remove(observer: Nullable<Observer<T>>): boolean {\r\n if (!observer) {\r\n return false;\r\n }\r\n\r\n observer._remove = null;\r\n const index = this._observers.indexOf(observer);\r\n\r\n if (index !== -1) {\r\n this._deferUnregister(observer);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Remove a callback from the Observable object\r\n * @param callback the callback to remove\r\n * @param scope optional scope. If used only the callbacks with this scope will be removed\r\n * @returns false if it doesn't belong to this Observable\r\n */\r\n public removeCallback(callback: (eventData: T, eventState: EventState) => void, scope?: any): boolean {\r\n for (let index = 0; index < this._observers.length; index++) {\r\n const observer = this._observers[index];\r\n if (observer._willBeUnregistered) {\r\n continue;\r\n }\r\n if (observer.callback === callback && (!scope || scope === observer.scope)) {\r\n this._deferUnregister(observer);\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _deferUnregister(observer: Observer<T>): void {\r\n if (observer._willBeUnregistered) {\r\n return;\r\n }\r\n this._numObserversMarkedAsDeleted++;\r\n observer.unregisterOnNextCall = false;\r\n observer._willBeUnregistered = true;\r\n setTimeout(() => {\r\n this._remove(observer);\r\n }, 0);\r\n }\r\n\r\n // This should only be called when not iterating over _observers to avoid callback skipping.\r\n // Removes an observer from the _observer Array.\r\n private _remove(observer: Nullable<Observer<T>>, updateCounter = true): boolean {\r\n if (!observer) {\r\n return false;\r\n }\r\n\r\n const index = this._observers.indexOf(observer);\r\n\r\n if (index !== -1) {\r\n if (updateCounter) {\r\n this._numObserversMarkedAsDeleted--;\r\n }\r\n this._observers.splice(index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Moves the observable to the top of the observer list making it get called first when notified\r\n * @param observer the observer to move\r\n */\r\n public makeObserverTopPriority(observer: Observer<T>) {\r\n this._remove(observer, false);\r\n this._observers.unshift(observer);\r\n }\r\n\r\n /**\r\n * Moves the observable to the bottom of the observer list making it get called last when notified\r\n * @param observer the observer to move\r\n */\r\n public makeObserverBottomPriority(observer: Observer<T>) {\r\n this._remove(observer, false);\r\n this._observers.push(observer);\r\n }\r\n\r\n /**\r\n * Notify all Observers by calling their respective callback with the given data\r\n * Will return true if all observers were executed, false if an observer set skipNextObservers to true, then prevent the subsequent ones to execute\r\n * @param eventData defines the data to send to all observers\r\n * @param mask defines the mask of the current notification (observers with incompatible mask (ie mask & observer.mask === 0) will not be notified)\r\n * @param target defines the original target of the state\r\n * @param currentTarget defines the current target of the state\r\n * @param userInfo defines any user info to send to observers\r\n * @returns false if the complete observer chain was not processed (because one observer set the skipNextObservers to true)\r\n */\r\n public notifyObservers(eventData: T, mask: number = -1, target?: any, currentTarget?: any, userInfo?: any): boolean {\r\n // this prevents potential memory leaks - if an object is disposed but the observable doesn't get cleared.\r\n if (this.notifyIfTriggered) {\r\n this._hasNotified = true;\r\n this._lastNotifiedValue = eventData;\r\n }\r\n if (!this._observers.length) {\r\n return true;\r\n }\r\n\r\n const state = this._eventState;\r\n state.mask = mask;\r\n state.target = target;\r\n state.currentTarget = currentTarget;\r\n state.skipNextObservers = false;\r\n state.lastReturnValue = eventData;\r\n state.userInfo = userInfo;\r\n\r\n for (const obs of this._observers) {\r\n if (obs._willBeUnregistered) {\r\n continue;\r\n }\r\n\r\n if (obs.mask & mask) {\r\n if (obs.unregisterOnNextCall) {\r\n this._deferUnregister(obs);\r\n }\r\n\r\n if (obs.scope) {\r\n state.lastReturnValue = obs.callback.apply(obs.scope, [eventData, state]);\r\n } else {\r\n state.lastReturnValue = obs.callback(eventData, state);\r\n }\r\n }\r\n if (state.skipNextObservers) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Notify a specific observer\r\n * @param observer defines the observer to notify\r\n * @param eventData defines the data to be sent to each callback\r\n * @param mask is used to filter observers defaults to -1\r\n */\r\n public notifyObserver(observer: Observer<T>, eventData: T, mask: number = -1): void {\r\n // this prevents potential memory leaks - if an object is disposed but the observable doesn't get cleared.\r\n if (this.notifyIfTriggered) {\r\n this._hasNotified = true;\r\n this._lastNotifiedValue = eventData;\r\n }\r\n if (observer._willBeUnregistered) {\r\n return;\r\n }\r\n\r\n const state = this._eventState;\r\n state.mask = mask;\r\n state.skipNextObservers = false;\r\n\r\n if (observer.unregisterOnNextCall) {\r\n this._deferUnregister(observer);\r\n }\r\n\r\n observer.callback(eventData, state);\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the observable has at least one observer\r\n * @returns true is the Observable has at least one Observer registered\r\n */\r\n public hasObservers(): boolean {\r\n return this._observers.length - this._numObserversMarkedAsDeleted > 0;\r\n }\r\n\r\n /**\r\n * Clear the list of observers\r\n */\r\n public clear(): void {\r\n while (this._observers.length) {\r\n const o = this._observers.pop();\r\n if (o) {\r\n o._remove = null;\r\n }\r\n }\r\n this._onObserverAdded = null;\r\n this._numObserversMarkedAsDeleted = 0;\r\n this.cleanLastNotifiedState();\r\n }\r\n\r\n /**\r\n * Clean the last notified state - both the internal last value and the has-notified flag\r\n */\r\n public cleanLastNotifiedState(): void {\r\n this._hasNotified = false;\r\n this._lastNotifiedValue = undefined;\r\n }\r\n\r\n /**\r\n * Clone the current observable\r\n * @returns a new observable\r\n */\r\n public clone(): Observable<T> {\r\n const result = new Observable<T>();\r\n\r\n result._observers = this._observers.slice(0);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Does this observable handles observer registered with a given mask\r\n * @param mask defines the mask to be tested\r\n * @returns whether or not one observer registered with the given mask is handled\r\n **/\r\n public hasSpecificMask(mask: number = -1): boolean {\r\n for (const obs of this._observers) {\r\n if (obs.mask & mask || obs.mask === mask) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"observable.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/observable.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\n\r\ndeclare const WeakRef: any;\r\n\r\nconst IsWeakRefSupported = typeof WeakRef !== \"undefined\";\r\n\r\n/**\r\n * A class serves as a medium between the observable and its observers\r\n */\r\nexport class EventState {\r\n /**\r\n * Create a new EventState\r\n * @param mask defines the mask associated with this state\r\n * @param skipNextObservers defines a flag which will instruct the observable to skip following observers when set to true\r\n * @param target defines the original target of the state\r\n * @param currentTarget defines the current target of the state\r\n */\r\n constructor(mask: number, skipNextObservers = false, target?: any, currentTarget?: any) {\r\n this.initialize(mask, skipNextObservers, target, currentTarget);\r\n }\r\n\r\n /**\r\n * Initialize the current event state\r\n * @param mask defines the mask associated with this state\r\n * @param skipNextObservers defines a flag which will instruct the observable to skip following observers when set to true\r\n * @param target defines the original target of the state\r\n * @param currentTarget defines the current target of the state\r\n * @returns the current event state\r\n */\r\n public initialize(mask: number, skipNextObservers = false, target?: any, currentTarget?: any): EventState {\r\n this.mask = mask;\r\n this.skipNextObservers = skipNextObservers;\r\n this.target = target;\r\n this.currentTarget = currentTarget;\r\n return this;\r\n }\r\n\r\n /**\r\n * An Observer can set this property to true to prevent subsequent observers of being notified\r\n */\r\n public skipNextObservers: boolean;\r\n\r\n /**\r\n * Get the mask value that were used to trigger the event corresponding to this EventState object\r\n */\r\n public mask: number;\r\n\r\n /**\r\n * The object that originally notified the event\r\n */\r\n public target?: any;\r\n\r\n /**\r\n * The current object in the bubbling phase\r\n */\r\n public currentTarget?: any;\r\n\r\n /**\r\n * This will be populated with the return value of the last function that was executed.\r\n * If it is the first function in the callback chain it will be the event data.\r\n */\r\n public lastReturnValue?: any;\r\n\r\n /**\r\n * User defined information that will be sent to observers\r\n */\r\n public userInfo?: any;\r\n}\r\n\r\n/**\r\n * Represent an Observer registered to a given Observable object.\r\n */\r\nexport class Observer<T> {\r\n /** @internal */\r\n public _willBeUnregistered = false;\r\n /**\r\n * Gets or sets a property defining that the observer as to be unregistered after the next notification\r\n */\r\n public unregisterOnNextCall = false;\r\n\r\n /**\r\n * this function can be used to remove the observer from the observable.\r\n * It will be set by the observable that the observer belongs to.\r\n * @internal\r\n */\r\n public _remove: Nullable<(defer?: boolean) => void> = null;\r\n\r\n /**\r\n * Creates a new observer\r\n * @param callback defines the callback to call when the observer is notified\r\n * @param mask defines the mask of the observer (used to filter notifications)\r\n * @param scope defines the current scope used to restore the JS context\r\n */\r\n constructor(\r\n /**\r\n * Defines the callback to call when the observer is notified\r\n */\r\n public callback: (eventData: T, eventState: EventState) => void,\r\n /**\r\n * Defines the mask of the observer (used to filter notifications)\r\n */\r\n public mask: number,\r\n /**\r\n * [null] Defines the current scope used to restore the JS context\r\n */\r\n public scope: any = null\r\n ) {}\r\n\r\n /**\r\n * Remove the observer from its observable\r\n * This can be used instead of using the observable's remove function.\r\n * @param defer if true, the removal will be deferred to avoid callback skipping (default: false)\r\n */\r\n public remove(defer = false) {\r\n if (this._remove) {\r\n this._remove(defer);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * The Observable class is a simple implementation of the Observable pattern.\r\n *\r\n * There's one slight particularity though: a given Observable can notify its observer using a particular mask value, only the Observers registered with this mask value will be notified.\r\n * This enable a more fine grained execution without having to rely on multiple different Observable objects.\r\n * For instance you may have a given Observable that have four different types of notifications: Move (mask = 0x01), Stop (mask = 0x02), Turn Right (mask = 0X04), Turn Left (mask = 0X08).\r\n * A given observer can register itself with only Move and Stop (mask = 0x03), then it will only be notified when one of these two occurs and will never be for Turn Left/Right.\r\n */\r\nexport class Observable<T> {\r\n private _observers = new Array<Observer<T>>();\r\n private _numObserversMarkedAsDeleted = 0;\r\n private _hasNotified = false;\r\n private _lastNotifiedValue?: T;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _eventState: EventState;\r\n\r\n private _onObserverAdded: Nullable<(observer: Observer<T>) => void>;\r\n\r\n /**\r\n * Create an observable from a Promise.\r\n * @param promise a promise to observe for fulfillment.\r\n * @param onErrorObservable an observable to notify if a promise was rejected.\r\n * @returns the new Observable\r\n */\r\n public static FromPromise<T, E = Error>(promise: Promise<T>, onErrorObservable?: Observable<E>): Observable<T> {\r\n const observable = new Observable<T>();\r\n\r\n promise\r\n // eslint-disable-next-line github/no-then\r\n .then((ret: T) => {\r\n observable.notifyObservers(ret);\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .catch((err) => {\r\n if (onErrorObservable) {\r\n onErrorObservable.notifyObservers(err as E);\r\n } else {\r\n throw err;\r\n }\r\n });\r\n\r\n return observable;\r\n }\r\n\r\n /**\r\n * Gets the list of observers\r\n * Note that observers that were recently deleted may still be present in the list because they are only really deleted on the next javascript tick!\r\n */\r\n public get observers(): Array<Observer<T>> {\r\n return this._observers;\r\n }\r\n\r\n /**\r\n * Creates a new observable\r\n * @param onObserverAdded defines a callback to call when a new observer is added\r\n * @param notifyIfTriggered If set to true the observable will notify when an observer was added if the observable was already triggered.\r\n */\r\n constructor(\r\n onObserverAdded?: (observer: Observer<T>) => void,\r\n /**\r\n * [false] If set to true the observable will notify when an observer was added if the observable was already triggered.\r\n * This is helpful to single-state observables like the scene onReady or the dispose observable.\r\n */\r\n public notifyIfTriggered = false\r\n ) {\r\n this._eventState = new EventState(0);\r\n\r\n if (onObserverAdded) {\r\n this._onObserverAdded = onObserverAdded;\r\n }\r\n }\r\n\r\n /**\r\n * Create a new Observer with the specified callback\r\n * @param callback the callback that will be executed for that Observer\r\n * @param mask the mask used to filter observers\r\n * @param insertFirst if true the callback will be inserted at the first position, hence executed before the others ones. If false (default behavior) the callback will be inserted at the last position, executed after all the others already present.\r\n * @param scope optional scope for the callback to be called from\r\n * @param unregisterOnFirstCall defines if the observer as to be unregistered after the next notification\r\n * @returns the new observer created for the callback\r\n */\r\n public add(callback?: null, mask?: number, insertFirst?: boolean, scope?: any, unregisterOnFirstCall?: boolean): null;\r\n public add(callback: (eventData: T, eventState: EventState) => void, mask?: number, insertFirst?: boolean, scope?: any, unregisterOnFirstCall?: boolean): Observer<T>;\r\n public add(\r\n callback?: ((eventData: T, eventState: EventState) => void) | null,\r\n mask?: number,\r\n insertFirst?: boolean,\r\n scope?: any,\r\n unregisterOnFirstCall?: boolean\r\n ): Nullable<Observer<T>>;\r\n public add(\r\n callback?: ((eventData: T, eventState: EventState) => void) | null,\r\n mask: number = -1,\r\n insertFirst = false,\r\n scope: any = null,\r\n unregisterOnFirstCall = false\r\n ): Nullable<Observer<T>> {\r\n if (!callback) {\r\n return null;\r\n }\r\n\r\n const observer = new Observer(callback, mask, scope);\r\n observer.unregisterOnNextCall = unregisterOnFirstCall;\r\n\r\n if (insertFirst) {\r\n this._observers.unshift(observer);\r\n } else {\r\n this._observers.push(observer);\r\n }\r\n\r\n if (this._onObserverAdded) {\r\n this._onObserverAdded(observer);\r\n }\r\n\r\n // If the observable was already triggered and the observable is set to notify if triggered, notify the new observer\r\n if (this._hasNotified && this.notifyIfTriggered) {\r\n if (this._lastNotifiedValue !== undefined) {\r\n this.notifyObserver(observer, this._lastNotifiedValue);\r\n }\r\n }\r\n\r\n // attach the remove function to the observer\r\n const observableWeakRef = IsWeakRefSupported ? new WeakRef(this) : { deref: () => this };\r\n observer._remove = (defer = false) => {\r\n const observable = observableWeakRef.deref();\r\n if (observable) {\r\n defer ? observable.remove(observer) : observable._remove(observer);\r\n }\r\n };\r\n\r\n return observer;\r\n }\r\n\r\n /**\r\n * Create a new Observer with the specified callback and unregisters after the next notification\r\n * @param callback the callback that will be executed for that Observer\r\n * @returns the new observer created for the callback\r\n */\r\n public addOnce(callback?: null): null;\r\n public addOnce(callback: (eventData: T, eventState: EventState) => void): Observer<T>;\r\n public addOnce(callback?: ((eventData: T, eventState: EventState) => void) | null): Nullable<Observer<T>>;\r\n public addOnce(callback?: ((eventData: T, eventState: EventState) => void) | null): Nullable<Observer<T>> {\r\n return this.add(callback, undefined, undefined, undefined, true);\r\n }\r\n\r\n /**\r\n * Remove an Observer from the Observable object\r\n * @param observer the instance of the Observer to remove\r\n * @returns false if it doesn't belong to this Observable\r\n */\r\n public remove(observer: Nullable<Observer<T>>): boolean {\r\n if (!observer) {\r\n return false;\r\n }\r\n\r\n observer._remove = null;\r\n const index = this._observers.indexOf(observer);\r\n\r\n if (index !== -1) {\r\n this._deferUnregister(observer);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Remove a callback from the Observable object\r\n * @param callback the callback to remove\r\n * @param scope optional scope. If used only the callbacks with this scope will be removed\r\n * @returns false if it doesn't belong to this Observable\r\n */\r\n public removeCallback(callback: (eventData: T, eventState: EventState) => void, scope?: any): boolean {\r\n for (let index = 0; index < this._observers.length; index++) {\r\n const observer = this._observers[index];\r\n if (observer._willBeUnregistered) {\r\n continue;\r\n }\r\n if (observer.callback === callback && (!scope || scope === observer.scope)) {\r\n this._deferUnregister(observer);\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _deferUnregister(observer: Observer<T>): void {\r\n if (observer._willBeUnregistered) {\r\n return;\r\n }\r\n this._numObserversMarkedAsDeleted++;\r\n observer.unregisterOnNextCall = false;\r\n observer._willBeUnregistered = true;\r\n setTimeout(() => {\r\n this._remove(observer);\r\n }, 0);\r\n }\r\n\r\n // This should only be called when not iterating over _observers to avoid callback skipping.\r\n // Removes an observer from the _observer Array.\r\n private _remove(observer: Nullable<Observer<T>>, updateCounter = true): boolean {\r\n if (!observer) {\r\n return false;\r\n }\r\n\r\n const index = this._observers.indexOf(observer);\r\n\r\n if (index !== -1) {\r\n if (updateCounter) {\r\n this._numObserversMarkedAsDeleted--;\r\n }\r\n this._observers.splice(index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Moves the observable to the top of the observer list making it get called first when notified\r\n * @param observer the observer to move\r\n */\r\n public makeObserverTopPriority(observer: Observer<T>) {\r\n this._remove(observer, false);\r\n this._observers.unshift(observer);\r\n }\r\n\r\n /**\r\n * Moves the observable to the bottom of the observer list making it get called last when notified\r\n * @param observer the observer to move\r\n */\r\n public makeObserverBottomPriority(observer: Observer<T>) {\r\n this._remove(observer, false);\r\n this._observers.push(observer);\r\n }\r\n\r\n /**\r\n * Notify all Observers by calling their respective callback with the given data\r\n * Will return true if all observers were executed, false if an observer set skipNextObservers to true, then prevent the subsequent ones to execute\r\n * @param eventData defines the data to send to all observers\r\n * @param mask defines the mask of the current notification (observers with incompatible mask (ie mask & observer.mask === 0) will not be notified)\r\n * @param target defines the original target of the state\r\n * @param currentTarget defines the current target of the state\r\n * @param userInfo defines any user info to send to observers\r\n * @returns false if the complete observer chain was not processed (because one observer set the skipNextObservers to true)\r\n */\r\n public notifyObservers(eventData: T, mask: number = -1, target?: any, currentTarget?: any, userInfo?: any): boolean {\r\n // this prevents potential memory leaks - if an object is disposed but the observable doesn't get cleared.\r\n if (this.notifyIfTriggered) {\r\n this._hasNotified = true;\r\n this._lastNotifiedValue = eventData;\r\n }\r\n if (!this._observers.length) {\r\n return true;\r\n }\r\n\r\n const state = this._eventState;\r\n state.mask = mask;\r\n state.target = target;\r\n state.currentTarget = currentTarget;\r\n state.skipNextObservers = false;\r\n state.lastReturnValue = eventData;\r\n state.userInfo = userInfo;\r\n\r\n for (const obs of this._observers) {\r\n if (obs._willBeUnregistered) {\r\n continue;\r\n }\r\n\r\n if (obs.mask & mask) {\r\n if (obs.unregisterOnNextCall) {\r\n this._deferUnregister(obs);\r\n }\r\n\r\n if (obs.scope) {\r\n state.lastReturnValue = obs.callback.apply(obs.scope, [eventData, state]);\r\n } else {\r\n state.lastReturnValue = obs.callback(eventData, state);\r\n }\r\n }\r\n if (state.skipNextObservers) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Notify a specific observer\r\n * @param observer defines the observer to notify\r\n * @param eventData defines the data to be sent to each callback\r\n * @param mask is used to filter observers defaults to -1\r\n */\r\n public notifyObserver(observer: Observer<T>, eventData: T, mask: number = -1): void {\r\n // this prevents potential memory leaks - if an object is disposed but the observable doesn't get cleared.\r\n if (this.notifyIfTriggered) {\r\n this._hasNotified = true;\r\n this._lastNotifiedValue = eventData;\r\n }\r\n if (observer._willBeUnregistered) {\r\n return;\r\n }\r\n\r\n const state = this._eventState;\r\n state.mask = mask;\r\n state.skipNextObservers = false;\r\n\r\n if (observer.unregisterOnNextCall) {\r\n this._deferUnregister(observer);\r\n }\r\n\r\n observer.callback(eventData, state);\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the observable has at least one observer\r\n * @returns true is the Observable has at least one Observer registered\r\n */\r\n public hasObservers(): boolean {\r\n return this._observers.length - this._numObserversMarkedAsDeleted > 0;\r\n }\r\n\r\n /**\r\n * Clear the list of observers\r\n */\r\n public clear(): void {\r\n while (this._observers.length) {\r\n const o = this._observers.pop();\r\n if (o) {\r\n o._remove = null;\r\n }\r\n }\r\n this._onObserverAdded = null;\r\n this._numObserversMarkedAsDeleted = 0;\r\n this.cleanLastNotifiedState();\r\n }\r\n\r\n /**\r\n * Clean the last notified state - both the internal last value and the has-notified flag\r\n */\r\n public cleanLastNotifiedState(): void {\r\n this._hasNotified = false;\r\n this._lastNotifiedValue = undefined;\r\n }\r\n\r\n /**\r\n * Clone the current observable\r\n * @returns a new observable\r\n */\r\n public clone(): Observable<T> {\r\n const result = new Observable<T>();\r\n\r\n result._observers = this._observers.slice(0);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Does this observable handles observer registered with a given mask\r\n * @param mask defines the mask to be tested\r\n * @returns whether or not one observer registered with the given mask is handled\r\n **/\r\n public hasSpecificMask(mask: number = -1): boolean {\r\n for (const obs of this._observers) {\r\n if (obs.mask & mask || obs.mask === mask) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\n"]}
@@ -22,6 +22,7 @@ function CreateObservableScheduler(observable) {
22
22
  },
23
23
  };
24
24
  }
25
+ // eslint-disable-next-line @typescript-eslint/promise-function-async
25
26
  Observable.prototype.runCoroutineAsync = function (coroutine) {
26
27
  if (!this._coroutineScheduler) {
27
28
  const schedulerAndDispose = CreateObservableScheduler(this);