@onerjs/core 9.0.1 → 9.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Animations/animationGroup.pure.js.map +1 -1
- package/Buffers/buffer.pure.js +4 -0
- package/Buffers/buffer.pure.js.map +1 -1
- package/Cameras/camera.pure.d.ts +14 -0
- package/Cameras/camera.pure.js +15 -0
- package/Cameras/camera.pure.js.map +1 -1
- package/Compute/computeShader.pure.d.ts +2 -1
- package/Compute/computeShader.pure.js +29 -10
- package/Compute/computeShader.pure.js.map +1 -1
- package/Culling/ray.core.js +22 -9
- package/Culling/ray.core.js.map +1 -1
- package/Engines/IDrawContext.d.ts +2 -0
- package/Engines/IDrawContext.js.map +1 -1
- package/Engines/Native/nativeInterfaces.d.ts +55 -4
- package/Engines/Native/nativeInterfaces.js.map +1 -1
- package/Engines/Native/nativeRenderTargetWrapper.d.ts +1 -0
- package/Engines/Native/nativeRenderTargetWrapper.js +5 -1
- package/Engines/Native/nativeRenderTargetWrapper.js.map +1 -1
- package/Engines/Processors/shaderCodeInliner.d.ts +2 -0
- package/Engines/Processors/shaderCodeInliner.js +251 -6
- package/Engines/Processors/shaderCodeInliner.js.map +1 -1
- package/Engines/Processors/shaderProcessor.js +10 -1
- package/Engines/Processors/shaderProcessor.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.debugging.pure.js +12 -0
- package/Engines/WebGPU/Extensions/engine.debugging.pure.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.multiRender.pure.js +0 -1
- package/Engines/WebGPU/Extensions/engine.multiRender.pure.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.query.pure.js +5 -0
- package/Engines/WebGPU/Extensions/engine.query.pure.js.map +1 -1
- package/Engines/WebGPU/webgpuBufferManager.js +7 -0
- package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheTextureView.d.ts +1 -1
- package/Engines/WebGPU/webgpuCacheTextureView.js +20 -8
- package/Engines/WebGPU/webgpuCacheTextureView.js.map +1 -1
- package/Engines/WebGPU/webgpuDrawContext.d.ts +2 -0
- package/Engines/WebGPU/webgpuDrawContext.js +6 -0
- package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
- package/Engines/WebGPU/webgpuQuerySet.d.ts +3 -3
- package/Engines/WebGPU/webgpuQuerySet.js +23 -9
- package/Engines/WebGPU/webgpuQuerySet.js.map +1 -1
- package/Engines/WebGPU/webgpuRenderPassCommandStream.d.ts +156 -0
- package/Engines/WebGPU/webgpuRenderPassCommandStream.js +323 -0
- package/Engines/WebGPU/webgpuRenderPassCommandStream.js.map +1 -0
- package/Engines/WebGPU/webgpuTextureManager.d.ts +1 -1
- package/Engines/WebGPU/webgpuTextureManager.js +4 -3
- package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
- package/Engines/WebGPU/webgpuTimestampQuery.d.ts +3 -1
- package/Engines/WebGPU/webgpuTimestampQuery.js +9 -6
- package/Engines/WebGPU/webgpuTimestampQuery.js.map +1 -1
- package/Engines/abstractEngine.pure.d.ts +2 -0
- package/Engines/abstractEngine.pure.js +14 -5
- package/Engines/abstractEngine.pure.js.map +1 -1
- package/Engines/constants.d.ts +6 -0
- package/Engines/constants.js +6 -0
- package/Engines/constants.js.map +1 -1
- package/Engines/engine.d.ts +198 -24
- package/Engines/pure.d.ts +1 -0
- package/Engines/pure.js +1 -0
- package/Engines/pure.js.map +1 -1
- package/Engines/renderCommandBatcher.pure.d.ts +16 -0
- package/Engines/renderCommandBatcher.pure.js +24 -0
- package/Engines/renderCommandBatcher.pure.js.map +1 -0
- package/Engines/thinEngine.functions.js +3 -2
- package/Engines/thinEngine.functions.js.map +1 -1
- package/Engines/thinEngine.pure.js +18 -2
- package/Engines/thinEngine.pure.js.map +1 -1
- package/Engines/thinNativeEngine.pure.d.ts +10 -7
- package/Engines/thinNativeEngine.pure.js +117 -46
- package/Engines/thinNativeEngine.pure.js.map +1 -1
- package/Engines/thinWebGPUEngine.d.ts +8 -0
- package/Engines/thinWebGPUEngine.js +11 -0
- package/Engines/thinWebGPUEngine.js.map +1 -1
- package/Engines/webgpuEngine.pure.d.ts +60 -1
- package/Engines/webgpuEngine.pure.js +238 -42
- package/Engines/webgpuEngine.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/Audio/flowGraphGetSoundVolumeBlock.pure.d.ts +3 -3
- package/FlowGraph/Blocks/Data/Audio/flowGraphGetSoundVolumeBlock.pure.js +2 -1
- package/FlowGraph/Blocks/Data/Audio/flowGraphGetSoundVolumeBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/Audio/flowGraphIsSoundPlayingBlock.pure.d.ts +3 -3
- package/FlowGraph/Blocks/Data/Audio/flowGraphIsSoundPlayingBlock.pure.js +2 -1
- package/FlowGraph/Blocks/Data/Audio/flowGraphIsSoundPlayingBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.d.ts +5 -0
- package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.js +8 -0
- package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.js.map +1 -0
- package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.pure.d.ts +77 -0
- package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.pure.js +141 -0
- package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.pure.js.map +1 -0
- package/FlowGraph/Blocks/Event/flowGraphSoundEndedEventBlock.pure.d.ts +5 -3
- package/FlowGraph/Blocks/Event/flowGraphSoundEndedEventBlock.pure.js +38 -7
- package/FlowGraph/Blocks/Event/flowGraphSoundEndedEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/index.d.ts +1 -0
- package/FlowGraph/Blocks/Event/index.js +1 -0
- package/FlowGraph/Blocks/Event/index.js.map +1 -1
- package/FlowGraph/Blocks/Event/pure.d.ts +1 -0
- package/FlowGraph/Blocks/Event/pure.js +1 -0
- package/FlowGraph/Blocks/Event/pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPauseSoundBlock.pure.d.ts +3 -3
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPauseSoundBlock.pure.js +2 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPauseSoundBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPlaySoundBlock.pure.d.ts +3 -3
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPlaySoundBlock.pure.js +2 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPlaySoundBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphSetSoundVolumeBlock.pure.d.ts +3 -3
- package/FlowGraph/Blocks/Execution/Audio/flowGraphSetSoundVolumeBlock.pure.js +2 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphSetSoundVolumeBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphStopSoundBlock.pure.d.ts +3 -3
- package/FlowGraph/Blocks/Execution/Audio/flowGraphStopSoundBlock.pure.js +2 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphStopSoundBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/allBlocks.pure.js +2 -0
- package/FlowGraph/Blocks/allBlocks.pure.js.map +1 -1
- package/FlowGraph/Blocks/flowGraphBlockFactory.js +2 -0
- package/FlowGraph/Blocks/flowGraphBlockFactory.js.map +1 -1
- package/FlowGraph/Blocks/flowGraphBlockNames.d.ts +1 -0
- package/FlowGraph/Blocks/flowGraphBlockNames.js +1 -0
- package/FlowGraph/Blocks/flowGraphBlockNames.js.map +1 -1
- package/FlowGraph/flowGraph.d.ts +12 -1
- package/FlowGraph/flowGraph.js +38 -0
- package/FlowGraph/flowGraph.js.map +1 -1
- package/FlowGraph/flowGraphCoordinator.d.ts +44 -0
- package/FlowGraph/flowGraphCoordinator.js +141 -0
- package/FlowGraph/flowGraphCoordinator.js.map +1 -1
- package/FlowGraph/flowGraphDataConnection.pure.js +41 -14
- package/FlowGraph/flowGraphDataConnection.pure.js.map +1 -1
- package/FlowGraph/flowGraphParser.js +105 -5
- package/FlowGraph/flowGraphParser.js.map +1 -1
- package/FlowGraph/flowGraphSoundAssets.d.ts +40 -0
- package/FlowGraph/flowGraphSoundAssets.js +33 -0
- package/FlowGraph/flowGraphSoundAssets.js.map +1 -0
- package/FlowGraph/index.d.ts +1 -0
- package/FlowGraph/index.js +1 -0
- package/FlowGraph/index.js.map +1 -1
- package/FlowGraph/pure.d.ts +1 -0
- package/FlowGraph/pure.js +1 -0
- package/FlowGraph/pure.js.map +1 -1
- package/FlowGraph/serialization.d.ts +8 -0
- package/FlowGraph/serialization.js +31 -12
- package/FlowGraph/serialization.js.map +1 -1
- package/FlowGraph/typeDefinitions.d.ts +25 -0
- package/FlowGraph/typeDefinitions.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/taaTask.js +2 -0
- package/FrameGraph/Tasks/PostProcesses/taaTask.js.map +1 -1
- package/Instrumentation/engineInstrumentation.d.ts +1 -0
- package/Instrumentation/engineInstrumentation.js +25 -6
- package/Instrumentation/engineInstrumentation.js.map +1 -1
- package/Lights/Clustered/clusteredLightContainer.pure.js +2 -0
- package/Lights/Clustered/clusteredLightContainer.pure.js.map +1 -1
- package/Lights/Shadows/cascadedShadowGenerator.pure.d.ts +36 -1
- package/Lights/Shadows/cascadedShadowGenerator.pure.js +202 -27
- package/Lights/Shadows/cascadedShadowGenerator.pure.js.map +1 -1
- package/Lights/directionalLight.pure.d.ts +24 -10
- package/Lights/directionalLight.pure.js +29 -11
- package/Lights/directionalLight.pure.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js +4 -4
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js.map +1 -1
- package/Materials/Node/Blocks/Dual/lightBlock.pure.js +1 -1
- package/Materials/Node/Blocks/Dual/lightBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/Input/inputBlock.pure.js +4 -0
- package/Materials/Node/Blocks/Input/inputBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.d.ts +9 -0
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js +23 -3
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js.map +1 -1
- package/Materials/PBR/openpbrMaterial.pure.js +1 -1
- package/Materials/PBR/openpbrMaterial.pure.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.pure.d.ts +9 -0
- package/Materials/PBR/pbrBaseMaterial.pure.js +60 -1
- package/Materials/PBR/pbrBaseMaterial.pure.js.map +1 -1
- package/Materials/PBR/pbrBaseSimpleMaterial.d.ts +11 -0
- package/Materials/PBR/pbrBaseSimpleMaterial.js +21 -2
- package/Materials/PBR/pbrBaseSimpleMaterial.js.map +1 -1
- package/Materials/PBR/pbrMaterial.pure.d.ts +12 -0
- package/Materials/PBR/pbrMaterial.pure.js +23 -3
- package/Materials/PBR/pbrMaterial.pure.js.map +1 -1
- package/Materials/Textures/Filtering/hdrIrradianceFiltering.d.ts +1 -0
- package/Materials/Textures/Filtering/hdrIrradianceFiltering.js +10 -0
- package/Materials/Textures/Filtering/hdrIrradianceFiltering.js.map +1 -1
- package/Materials/Textures/HTML/htmlInCanvasPolyfill.d.ts +5 -0
- package/Materials/Textures/HTML/htmlInCanvasPolyfill.js +7 -0
- package/Materials/Textures/HTML/htmlInCanvasPolyfill.js.map +1 -1
- package/Materials/Textures/HTML/htmlInteractionManager.d.ts +9 -3
- package/Materials/Textures/HTML/htmlInteractionManager.js +64 -5
- package/Materials/Textures/HTML/htmlInteractionManager.js.map +1 -1
- package/Materials/Textures/HTML/htmlTexture.d.ts +11 -11
- package/Materials/Textures/HTML/htmlTexture.js +106 -65
- package/Materials/Textures/HTML/htmlTexture.js.map +1 -1
- package/Materials/Textures/Loaders/internalTextureLoader.d.ts +2 -1
- package/Materials/Textures/Loaders/internalTextureLoader.js.map +1 -1
- package/Materials/Textures/Loaders/ktxTextureLoader.d.ts +2 -1
- package/Materials/Textures/Loaders/ktxTextureLoader.js +4 -50
- package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
- package/Materials/Textures/Procedurals/proceduralTexture.pure.js +10 -0
- package/Materials/Textures/Procedurals/proceduralTexture.pure.js.map +1 -1
- package/Materials/Textures/dynamicTexture.pure.js +6 -0
- package/Materials/Textures/dynamicTexture.pure.js.map +1 -1
- package/Materials/Textures/ktx2encoderTypes.d.ts +51 -0
- package/Materials/Textures/ktx2encoderTypes.js +2 -0
- package/Materials/Textures/ktx2encoderTypes.js.map +1 -0
- package/Materials/Textures/renderTargetTexture.pure.js +10 -2
- package/Materials/Textures/renderTargetTexture.pure.js.map +1 -1
- package/Materials/Textures/texture.pure.js +7 -1
- package/Materials/Textures/texture.pure.js.map +1 -1
- package/Materials/Textures/textureMerger.d.ts +11 -0
- package/Materials/Textures/textureMerger.js +34 -19
- package/Materials/Textures/textureMerger.js.map +1 -1
- package/Materials/Textures/textureProcessor.d.ts +145 -0
- package/Materials/Textures/textureProcessor.js +445 -45
- package/Materials/Textures/textureProcessor.js.map +1 -1
- package/Materials/Textures/textureSampling.functions.d.ts +41 -0
- package/Materials/Textures/textureSampling.functions.js +82 -0
- package/Materials/Textures/textureSampling.functions.js.map +1 -0
- package/Materials/drawWrapper.d.ts +8 -0
- package/Materials/drawWrapper.js +19 -0
- package/Materials/drawWrapper.js.map +1 -1
- package/Materials/effect.pure.d.ts +6 -0
- package/Materials/effect.pure.js +28 -6
- package/Materials/effect.pure.js.map +1 -1
- package/Materials/effect.webgl.functions.pure.js +1 -1
- package/Materials/effect.webgl.functions.pure.js.map +1 -1
- package/Materials/material.pure.d.ts +5 -0
- package/Materials/material.pure.js +9 -2
- package/Materials/material.pure.js.map +1 -1
- package/Materials/materialFlags.d.ts +6 -0
- package/Materials/materialFlags.js +14 -0
- package/Materials/materialFlags.js.map +1 -1
- package/Materials/materialHelper.functions.d.ts +2 -1
- package/Materials/materialHelper.functions.js +36 -2
- package/Materials/materialHelper.functions.js.map +1 -1
- package/Materials/materialHelper.geometryrendering.js +19 -16
- package/Materials/materialHelper.geometryrendering.js.map +1 -1
- package/Materials/materialPluginManager.pure.js +12 -8
- package/Materials/materialPluginManager.pure.js.map +1 -1
- package/Materials/prePassConfiguration.js +19 -16
- package/Materials/prePassConfiguration.js.map +1 -1
- package/Materials/shaderMaterial.pure.js +19 -6
- package/Materials/shaderMaterial.pure.js.map +1 -1
- package/Materials/shadowDepthWrapper.d.ts +6 -0
- package/Materials/shadowDepthWrapper.js +17 -0
- package/Materials/shadowDepthWrapper.js.map +1 -1
- package/Meshes/Compression/dracoCodec.d.ts +14 -0
- package/Meshes/Compression/dracoCodec.js +22 -0
- package/Meshes/Compression/dracoCodec.js.map +1 -1
- package/Meshes/Compression/dracoDecoder.d.ts +1 -0
- package/Meshes/Compression/dracoDecoder.js +27 -0
- package/Meshes/Compression/dracoDecoder.js.map +1 -1
- package/Meshes/Compression/dracoEncoder.d.ts +1 -0
- package/Meshes/Compression/dracoEncoder.js +8 -0
- package/Meshes/Compression/dracoEncoder.js.map +1 -1
- package/Meshes/Compression/meshoptCompression.d.ts +1 -0
- package/Meshes/Compression/meshoptCompression.js +9 -0
- package/Meshes/Compression/meshoptCompression.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingGpuSorter.d.ts +415 -0
- package/Meshes/GaussianSplatting/gaussianSplattingGpuSorter.js +912 -0
- package/Meshes/GaussianSplatting/gaussianSplattingGpuSorter.js.map +1 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.d.ts +3 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +40 -9
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +112 -8
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +696 -74
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
- package/Meshes/abstractMesh.pure.js +12 -4
- package/Meshes/abstractMesh.pure.js.map +1 -1
- package/Meshes/geometry.d.ts +5 -0
- package/Meshes/geometry.js +25 -0
- package/Meshes/geometry.js.map +1 -1
- package/Meshes/index.d.ts +1 -0
- package/Meshes/index.js +1 -0
- package/Meshes/index.js.map +1 -1
- package/Meshes/mesh.pure.d.ts +7 -0
- package/Meshes/mesh.pure.js +18 -13
- package/Meshes/mesh.pure.js.map +1 -1
- package/Meshes/pure.d.ts +1 -0
- package/Meshes/pure.js +1 -0
- package/Meshes/pure.js.map +1 -1
- package/Meshes/subMesh.pure.d.ts +3 -0
- package/Meshes/subMesh.pure.js +26 -0
- package/Meshes/subMesh.pure.js.map +1 -1
- package/Meshes/thinInstanceMesh.pure.js +5 -3
- package/Meshes/thinInstanceMesh.pure.js.map +1 -1
- package/Misc/index.d.ts +1 -0
- package/Misc/index.js +1 -0
- package/Misc/index.js.map +1 -1
- package/Misc/khronosTextureContainer2.d.ts +3 -2
- package/Misc/khronosTextureContainer2.js +24 -6
- package/Misc/khronosTextureContainer2.js.map +1 -1
- package/Misc/khronosTextureContainer2Encoder.d.ts +166 -0
- package/Misc/khronosTextureContainer2Encoder.js +556 -0
- package/Misc/khronosTextureContainer2Encoder.js.map +1 -0
- package/Misc/khronosTextureContainer2EncoderWorker.d.ts +61 -0
- package/Misc/khronosTextureContainer2EncoderWorker.js +55 -0
- package/Misc/khronosTextureContainer2EncoderWorker.js.map +1 -0
- package/Misc/pure.d.ts +1 -0
- package/Misc/pure.js +1 -0
- package/Misc/pure.js.map +1 -1
- package/Misc/textureFormat.functions.d.ts +6 -0
- package/Misc/textureFormat.functions.js +54 -0
- package/Misc/textureFormat.functions.js.map +1 -0
- package/Misc/textureTools.d.ts +6 -2
- package/Misc/textureTools.js +100 -42
- package/Misc/textureTools.js.map +1 -1
- package/Misc/tools.pure.js +1 -1
- package/Misc/tools.pure.js.map +1 -1
- package/Particles/Node/Blocks/systemBlock.pure.d.ts +1 -1
- package/Particles/Node/Blocks/systemBlock.pure.js +6 -3
- package/Particles/Node/Blocks/systemBlock.pure.js.map +1 -1
- package/Particles/computeShaderParticleSystem.pure.js +5 -0
- package/Particles/computeShaderParticleSystem.pure.js.map +1 -1
- package/Particles/gpuParticleSystem.pure.d.ts +2 -0
- package/Particles/gpuParticleSystem.pure.js +25 -1
- package/Particles/gpuParticleSystem.pure.js.map +1 -1
- package/Particles/solidParticle.d.ts +5 -0
- package/Particles/solidParticle.js +5 -0
- package/Particles/solidParticle.js.map +1 -1
- package/Particles/solidParticleSystem.d.ts +10 -0
- package/Particles/solidParticleSystem.js +72 -13
- package/Particles/solidParticleSystem.js.map +1 -1
- package/Particles/thinParticleSystem.pure.js +4 -0
- package/Particles/thinParticleSystem.pure.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.pure.d.ts +27 -6
- package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.pure.js +60 -5
- package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.pure.js.map +1 -1
- package/PostProcesses/thinTAAPostProcess.d.ts +1 -0
- package/PostProcesses/thinTAAPostProcess.js +17 -1
- package/PostProcesses/thinTAAPostProcess.js.map +1 -1
- package/PostProcesses/volumetricLightScatteringPostProcess.pure.d.ts +2 -1
- package/PostProcesses/volumetricLightScatteringPostProcess.pure.js +6 -5
- package/PostProcesses/volumetricLightScatteringPostProcess.pure.js.map +1 -1
- package/Rendering/boundingBoxRenderer.pure.js +2 -3
- package/Rendering/boundingBoxRenderer.pure.js.map +1 -1
- package/Rendering/geometryBufferRenderer.pure.js +8 -2
- package/Rendering/geometryBufferRenderer.pure.js.map +1 -1
- package/Rendering/objectRenderer.d.ts +1 -0
- package/Rendering/objectRenderer.js +14 -0
- package/Rendering/objectRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/bumpFragmentMainFunctions.js +2 -2
- package/Shaders/ShadersInclude/bumpFragmentMainFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/bumpVertex.js +1 -1
- package/Shaders/ShadersInclude/bumpVertex.js.map +1 -1
- package/Shaders/ShadersInclude/bumpVertexDeclaration.js +1 -1
- package/Shaders/ShadersInclude/bumpVertexDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js +5 -1
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/helperFunctions.js +2 -2
- package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js +1 -1
- package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrVertexDeclaration.js +6 -0
- package/Shaders/ShadersInclude/openpbrVertexDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js +11 -1
- package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockNormalFinal.js +9 -0
- package/Shaders/ShadersInclude/pbrBlockNormalFinal.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockReflectance.js +1 -1
- package/Shaders/ShadersInclude/pbrBlockReflectance.js.map +1 -1
- package/Shaders/ShadersInclude/pbrClusteredLightingFunctions.js +1 -1
- package/Shaders/ShadersInclude/pbrClusteredLightingFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrFragmentDeclaration.js +7 -1
- package/Shaders/ShadersInclude/pbrFragmentDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js +1 -0
- package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrIBLFunctions.js +12 -0
- package/Shaders/ShadersInclude/pbrIBLFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrUboDeclaration.js +1 -1
- package/Shaders/ShadersInclude/pbrUboDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrVertexDeclaration.js +3 -0
- package/Shaders/ShadersInclude/pbrVertexDeclaration.js.map +1 -1
- package/Shaders/geometry.vertex.js +6 -6
- package/Shaders/geometry.vertex.js.map +1 -1
- package/Shaders/gpuUpdateParticles.vertex.js +1 -1
- package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
- package/Shaders/lod.fragment.js +15 -2
- package/Shaders/lod.fragment.js.map +1 -1
- package/Shaders/lod3D.fragment.js +15 -2
- package/Shaders/lod3D.fragment.js.map +1 -1
- package/Shaders/lodCube.fragment.js +15 -2
- package/Shaders/lodCube.fragment.js.map +1 -1
- package/Shaders/openpbr.vertex.js +2 -0
- package/Shaders/openpbr.vertex.js.map +1 -1
- package/Shaders/pbr.fragment.js +12 -1
- package/Shaders/pbr.fragment.js.map +1 -1
- package/Shaders/pbr.vertex.js +2 -0
- package/Shaders/pbr.vertex.js.map +1 -1
- package/Shaders/textureMerger.fragment.js +28 -0
- package/Shaders/textureMerger.fragment.js.map +1 -1
- package/Shaders/textureProcessor.fragment.js +26 -4
- package/Shaders/textureProcessor.fragment.js.map +1 -1
- package/Shaders/volumetricLightScattering.fragment.js +1 -1
- package/Shaders/volumetricLightScattering.fragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.js +2 -2
- package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/bumpVertex.js +1 -1
- package/ShadersWGSL/ShadersInclude/bumpVertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/bumpVertexDeclaration.js +1 -1
- package/ShadersWGSL/ShadersInclude/bumpVertexDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js +1 -1
- package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/helperFunctions.js +2 -2
- package/ShadersWGSL/ShadersInclude/helperFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightFragment.js +44 -2
- package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js +17 -3
- package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js +12 -1
- package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js +11 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockNormalFinal.js +9 -0
- package/ShadersWGSL/ShadersInclude/pbrBlockNormalFinal.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrClusteredLightingFunctions.js +1 -1
- package/ShadersWGSL/ShadersInclude/pbrClusteredLightingFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js +1 -0
- package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrIBLFunctions.js +8 -0
- package/ShadersWGSL/ShadersInclude/pbrIBLFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrUboDeclaration.js +1 -1
- package/ShadersWGSL/ShadersInclude/pbrUboDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/prePassVertex.js +2 -2
- package/ShadersWGSL/ShadersInclude/prePassVertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/prePassVertexDeclaration.js +1 -1
- package/ShadersWGSL/ShadersInclude/prePassVertexDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/sceneUboDeclaration.js +3 -1
- package/ShadersWGSL/ShadersInclude/sceneUboDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/shadowsVertex.js +16 -0
- package/ShadersWGSL/ShadersInclude/shadowsVertex.js.map +1 -1
- package/ShadersWGSL/default.fragment.js +4 -4
- package/ShadersWGSL/default.fragment.js.map +1 -1
- package/ShadersWGSL/default.vertex.js +1 -1
- package/ShadersWGSL/default.vertex.js.map +1 -1
- package/ShadersWGSL/gaussianSplatting.vertex.js +3 -3
- package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
- package/ShadersWGSL/gpuUpdateParticles.compute.js +1 -1
- package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
- package/ShadersWGSL/gsSortCount.compute.d.ts +5 -0
- package/ShadersWGSL/gsSortCount.compute.js +19 -0
- package/ShadersWGSL/gsSortCount.compute.js.map +1 -0
- package/ShadersWGSL/gsSortKeys.compute.d.ts +5 -0
- package/ShadersWGSL/gsSortKeys.compute.js +49 -0
- package/ShadersWGSL/gsSortKeys.compute.js.map +1 -0
- package/ShadersWGSL/gsSortOutput.compute.d.ts +5 -0
- package/ShadersWGSL/gsSortOutput.compute.js +28 -0
- package/ShadersWGSL/gsSortOutput.compute.js.map +1 -0
- package/ShadersWGSL/gsSortScanLocal.compute.d.ts +5 -0
- package/ShadersWGSL/gsSortScanLocal.compute.js +23 -0
- package/ShadersWGSL/gsSortScanLocal.compute.js.map +1 -0
- package/ShadersWGSL/gsSortScanSums.compute.d.ts +5 -0
- package/ShadersWGSL/gsSortScanSums.compute.js +19 -0
- package/ShadersWGSL/gsSortScanSums.compute.js.map +1 -0
- package/ShadersWGSL/gsSortScatter.compute.d.ts +5 -0
- package/ShadersWGSL/gsSortScatter.compute.js +33 -0
- package/ShadersWGSL/gsSortScatter.compute.js.map +1 -0
- package/ShadersWGSL/lod.fragment.js +14 -2
- package/ShadersWGSL/lod.fragment.js.map +1 -1
- package/ShadersWGSL/lod3D.fragment.js +14 -2
- package/ShadersWGSL/lod3D.fragment.js.map +1 -1
- package/ShadersWGSL/lodCube.fragment.js +14 -2
- package/ShadersWGSL/lodCube.fragment.js.map +1 -1
- package/ShadersWGSL/openpbr.vertex.js +3 -1
- package/ShadersWGSL/openpbr.vertex.js.map +1 -1
- package/ShadersWGSL/pbr.fragment.js +11 -0
- package/ShadersWGSL/pbr.fragment.js.map +1 -1
- package/ShadersWGSL/pbr.vertex.js +3 -1
- package/ShadersWGSL/pbr.vertex.js.map +1 -1
- package/ShadersWGSL/textureMerger.fragment.js +40 -4
- package/ShadersWGSL/textureMerger.fragment.js.map +1 -1
- package/ShadersWGSL/textureProcessor.fragment.js +26 -4
- package/ShadersWGSL/textureProcessor.fragment.js.map +1 -1
- package/Sprites/spriteRenderer.js +15 -5
- package/Sprites/spriteRenderer.js.map +1 -1
- package/package.json +1 -1
- package/scene.pure.d.ts +23 -1
- package/scene.pure.js +83 -1
- package/scene.pure.js.map +1 -1
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
2
|
+
import { Tools } from "./tools.pure.js";
|
|
3
|
+
|
|
4
|
+
import { GetTextureDataAsync, _IsCompressedTextureFormat, WhenTextureReadyAsync } from "./textureTools.js";
|
|
5
|
+
import { AsyncLock } from "./asyncLock.js";
|
|
6
|
+
import { AutoReleaseWorkerPool } from "./workerPool.js";
|
|
7
|
+
import { KTX2EncoderWorkerFunction, } from "./khronosTextureContainer2EncoderWorker.js";
|
|
8
|
+
/**
|
|
9
|
+
* Encoder-wide KTX2 encoding options. Defined values override per-call options, as KhronosTextureContainer2.DefaultDecoderOptions does.
|
|
10
|
+
* ETC1S fields apply only to color usage; uastcQualityLevel and zstandard apply only to data and normal usage.
|
|
11
|
+
* @experimental
|
|
12
|
+
*/
|
|
13
|
+
export class DefaultKTX2EncoderOptions {
|
|
14
|
+
constructor() {
|
|
15
|
+
this._isDirty = true;
|
|
16
|
+
this._ktx2EncoderOptions = {};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Gets the dirty flag
|
|
20
|
+
* @experimental
|
|
21
|
+
*/
|
|
22
|
+
get isDirty() {
|
|
23
|
+
return this._isDirty;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Integer ETC1S quality for color usage, from 1 to 255.
|
|
27
|
+
* @experimental
|
|
28
|
+
*/
|
|
29
|
+
get etc1sQualityLevel() {
|
|
30
|
+
return this._etc1sQualityLevel;
|
|
31
|
+
}
|
|
32
|
+
set etc1sQualityLevel(value) {
|
|
33
|
+
if (this._etc1sQualityLevel === value) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
this._etc1sQualityLevel = value;
|
|
37
|
+
this._isDirty = true;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Integer ETC1S compression effort for color usage, from 0 to 6.
|
|
41
|
+
* @experimental
|
|
42
|
+
*/
|
|
43
|
+
get etc1sCompressionLevel() {
|
|
44
|
+
return this._etc1sCompressionLevel;
|
|
45
|
+
}
|
|
46
|
+
set etc1sCompressionLevel(value) {
|
|
47
|
+
if (this._etc1sCompressionLevel === value) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
this._etc1sCompressionLevel = value;
|
|
51
|
+
this._isDirty = true;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Integer UASTC quality for data and normal usage, from 0 to 4.
|
|
55
|
+
* @experimental
|
|
56
|
+
*/
|
|
57
|
+
get uastcQualityLevel() {
|
|
58
|
+
return this._uastcQualityLevel;
|
|
59
|
+
}
|
|
60
|
+
set uastcQualityLevel(value) {
|
|
61
|
+
if (this._uastcQualityLevel === value) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
this._uastcQualityLevel = value;
|
|
65
|
+
this._isDirty = true;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Use Zstandard with UASTC for data and normal usage.
|
|
69
|
+
* @experimental
|
|
70
|
+
*/
|
|
71
|
+
get zstandard() {
|
|
72
|
+
return this._zstandard;
|
|
73
|
+
}
|
|
74
|
+
set zstandard(value) {
|
|
75
|
+
if (this._zstandard === value) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
this._zstandard = value;
|
|
79
|
+
this._isDirty = true;
|
|
80
|
+
}
|
|
81
|
+
/** @internal */
|
|
82
|
+
_getKTX2EncoderOptions() {
|
|
83
|
+
if (!this._isDirty) {
|
|
84
|
+
return this._ktx2EncoderOptions;
|
|
85
|
+
}
|
|
86
|
+
this._isDirty = false;
|
|
87
|
+
const options = {};
|
|
88
|
+
if (this._etc1sQualityLevel !== undefined) {
|
|
89
|
+
options.etc1sQualityLevel = this._etc1sQualityLevel;
|
|
90
|
+
}
|
|
91
|
+
if (this._etc1sCompressionLevel !== undefined) {
|
|
92
|
+
options.etc1sCompressionLevel = this._etc1sCompressionLevel;
|
|
93
|
+
}
|
|
94
|
+
if (this._uastcQualityLevel !== undefined) {
|
|
95
|
+
options.uastcQualityLevel = this._uastcQualityLevel;
|
|
96
|
+
}
|
|
97
|
+
if (this._zstandard !== undefined) {
|
|
98
|
+
options.zstandard = this._zstandard;
|
|
99
|
+
}
|
|
100
|
+
this._ktx2EncoderOptions = options;
|
|
101
|
+
return options;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const AutomaticWorkers = new WeakMap();
|
|
105
|
+
let NextRequestId = 0;
|
|
106
|
+
function AbortError() {
|
|
107
|
+
return new DOMException("KTX2 encoding was aborted.", "AbortError");
|
|
108
|
+
}
|
|
109
|
+
function ToError(error) {
|
|
110
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
111
|
+
}
|
|
112
|
+
function UsesWorkers(numWorkers) {
|
|
113
|
+
return numWorkers > 0 && typeof Worker === "function" && typeof URL !== "undefined";
|
|
114
|
+
}
|
|
115
|
+
function ValidateTexture(texture, allowUninitialized) {
|
|
116
|
+
const internalTexture = texture.getInternalTexture();
|
|
117
|
+
const engine = internalTexture?.getEngine();
|
|
118
|
+
if (texture.isCube || texture.is3D || texture.is2DArray || internalTexture?.isCube || internalTexture?.is3D || internalTexture?.is2DArray) {
|
|
119
|
+
throw new Error("KTX2 encoding supports only 2D textures, not cube, 3D, or array textures.");
|
|
120
|
+
}
|
|
121
|
+
const hasKnownType = internalTexture?.type !== -1;
|
|
122
|
+
if (texture.textureType !== 0 && (!allowUninitialized || hasKnownType)) {
|
|
123
|
+
throw new Error("KTX2 encoding requires an unsigned byte texture.");
|
|
124
|
+
}
|
|
125
|
+
switch (texture.textureFormat) {
|
|
126
|
+
case 0:
|
|
127
|
+
case 1:
|
|
128
|
+
case 2:
|
|
129
|
+
if (engine && "webGLVersion" in engine) {
|
|
130
|
+
throw new Error("KTX2 encoding does not support alpha or luminance texture formats on WebGL.");
|
|
131
|
+
}
|
|
132
|
+
break;
|
|
133
|
+
case 8:
|
|
134
|
+
case 9:
|
|
135
|
+
case 10:
|
|
136
|
+
case 11:
|
|
137
|
+
throw new Error("KTX2 encoding does not support integer texture formats.");
|
|
138
|
+
}
|
|
139
|
+
if (internalTexture?._premulAlpha) {
|
|
140
|
+
throw new Error("KTX2 encoding does not support premultiplied alpha.");
|
|
141
|
+
}
|
|
142
|
+
if (_IsCompressedTextureFormat(texture.textureFormat) && !texture.getScene()) {
|
|
143
|
+
throw new Error("KTX2 encoding compressed textures requires a scene for GPU readback.");
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async function WithAbortAsync(operation, signal, abortError = AbortError) {
|
|
147
|
+
return await new Promise((resolve, reject) => {
|
|
148
|
+
const controller = new AbortController();
|
|
149
|
+
const onAbort = () => {
|
|
150
|
+
const error = abortError();
|
|
151
|
+
controller.abort(error);
|
|
152
|
+
reject(error);
|
|
153
|
+
};
|
|
154
|
+
if (signal?.aborted) {
|
|
155
|
+
onAbort();
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
159
|
+
void (async () => {
|
|
160
|
+
try {
|
|
161
|
+
resolve(await operation(controller.signal));
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
reject(ToError(error));
|
|
165
|
+
}
|
|
166
|
+
finally {
|
|
167
|
+
signal?.removeEventListener("abort", onAbort);
|
|
168
|
+
}
|
|
169
|
+
})();
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
async function PostRequestAsync(worker, request, transfer = []) {
|
|
173
|
+
return await new Promise((resolve, reject) => {
|
|
174
|
+
const failureSignal = AutomaticWorkers.get(worker)?.failure.signal;
|
|
175
|
+
const cleanup = () => {
|
|
176
|
+
worker.removeEventListener("message", onMessage);
|
|
177
|
+
worker.removeEventListener("error", onError);
|
|
178
|
+
worker.removeEventListener("messageerror", onMessageError);
|
|
179
|
+
failureSignal?.removeEventListener("abort", onFailure);
|
|
180
|
+
};
|
|
181
|
+
const fail = (error) => {
|
|
182
|
+
cleanup();
|
|
183
|
+
reject(error);
|
|
184
|
+
};
|
|
185
|
+
const onMessage = (event) => {
|
|
186
|
+
const reply = event.data;
|
|
187
|
+
if (reply?.id !== request.id) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
if (reply.action === "error") {
|
|
191
|
+
const error = new Error(reply.message);
|
|
192
|
+
fail(error);
|
|
193
|
+
if (reply.fatal) {
|
|
194
|
+
AutomaticWorkers.get(worker)?.fail(error);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
cleanup();
|
|
199
|
+
resolve(reply);
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
const onError = (event) => fail(new Error(event.message || "KTX2 encoder worker failed."));
|
|
203
|
+
const onMessageError = () => fail(new Error("KTX2 encoder worker message could not be deserialized."));
|
|
204
|
+
const onFailure = () => fail(ToError(failureSignal?.reason));
|
|
205
|
+
if (failureSignal?.aborted) {
|
|
206
|
+
onFailure();
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
worker.addEventListener("message", onMessage);
|
|
210
|
+
worker.addEventListener("error", onError);
|
|
211
|
+
worker.addEventListener("messageerror", onMessageError);
|
|
212
|
+
failureSignal?.addEventListener("abort", onFailure);
|
|
213
|
+
try {
|
|
214
|
+
worker.postMessage(request, transfer);
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
const failure = ToError(error);
|
|
218
|
+
AutomaticWorkers.get(worker)?.fail(failure);
|
|
219
|
+
fail(failure);
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
function CreateAutomaticWorker(workerUrl, initialize) {
|
|
224
|
+
const failure = new AbortController();
|
|
225
|
+
let worker;
|
|
226
|
+
try {
|
|
227
|
+
worker = new Worker(workerUrl);
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
// A rejected factory promise never reaches a pool action. Report construction failure to this job, then replace the slot.
|
|
231
|
+
const placeholder = { postMessage: () => { }, terminate: () => { }, addEventListener: () => { }, removeEventListener: () => { } };
|
|
232
|
+
failure.abort(ToError(error));
|
|
233
|
+
AutomaticWorkers.set(placeholder, { initialize, failure, fail: (error) => failure.abort(error), used: false });
|
|
234
|
+
return placeholder;
|
|
235
|
+
}
|
|
236
|
+
const fail = (error) => {
|
|
237
|
+
if (!failure.signal.aborted) {
|
|
238
|
+
worker.removeEventListener("error", onError);
|
|
239
|
+
worker.removeEventListener("messageerror", onMessageError);
|
|
240
|
+
failure.abort(error);
|
|
241
|
+
worker.terminate();
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
const onError = (event) => fail(new Error(event.message || "KTX2 encoder worker failed."));
|
|
245
|
+
const onMessageError = () => fail(new Error("KTX2 encoder worker message could not be deserialized."));
|
|
246
|
+
AutomaticWorkers.set(worker, { initialize, failure, fail, used: false });
|
|
247
|
+
// Keep fatal-error listeners between jobs and while initialization is waiting for the WASM.
|
|
248
|
+
worker.addEventListener("error", onError);
|
|
249
|
+
worker.addEventListener("messageerror", onMessageError);
|
|
250
|
+
return worker;
|
|
251
|
+
}
|
|
252
|
+
class KTX2EncoderWorkerPool extends AutoReleaseWorkerPool {
|
|
253
|
+
constructor(numWorkers, workerUrl, initialize) {
|
|
254
|
+
const createWorker = () => CreateAutomaticWorker(workerUrl, initialize);
|
|
255
|
+
super(numWorkers, async () => createWorker());
|
|
256
|
+
this._createEncoderWorker = createWorker;
|
|
257
|
+
}
|
|
258
|
+
_execute(workerInfo, action) {
|
|
259
|
+
super._execute(workerInfo, (worker, onComplete) => {
|
|
260
|
+
let currentWorker = worker;
|
|
261
|
+
let state = AutomaticWorkers.get(currentWorker);
|
|
262
|
+
if (state?.used && state.failure.signal.aborted) {
|
|
263
|
+
currentWorker = this._createEncoderWorker();
|
|
264
|
+
workerInfo.workerPromise = Promise.resolve(currentWorker);
|
|
265
|
+
state = AutomaticWorkers.get(currentWorker);
|
|
266
|
+
}
|
|
267
|
+
if (state) {
|
|
268
|
+
state.used = true;
|
|
269
|
+
}
|
|
270
|
+
action(currentWorker, onComplete);
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
async function EnsureWorkerReadyAsync(worker) {
|
|
275
|
+
const state = AutomaticWorkers.get(worker);
|
|
276
|
+
if (!state) {
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
state.failure.signal.throwIfAborted();
|
|
280
|
+
state.ready ?? (state.ready = WithAbortAsync(async () => await state.initialize(worker), state.failure.signal, () => ToError(state.failure.signal.reason)));
|
|
281
|
+
try {
|
|
282
|
+
await state.ready;
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
state.fail(ToError(error));
|
|
286
|
+
state.ready = undefined;
|
|
287
|
+
throw error;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Determines the Basis row flip without modifying pixels.
|
|
292
|
+
* GetTextureDataAsync's direct and LOD RTT paths preserve texture texel row order:
|
|
293
|
+
* WebGL reads bottom-first; WebGPU's Y-flipped RTT draw compensates its top-left origin.
|
|
294
|
+
* Uploaded images undo their upload flip. Compressed uploads retain their source rows;
|
|
295
|
+
* loader UV compensation does not change readback pixels.
|
|
296
|
+
* KTX2's uncompressed fallback uses the regular upload flip.
|
|
297
|
+
* Render targets need a flip on WebGL and on WebGPU, whose render-target draws are Y-flipped.
|
|
298
|
+
* @internal
|
|
299
|
+
*/
|
|
300
|
+
export function _GetKTX2TextureFlipY(texture) {
|
|
301
|
+
const internalTexture = texture.getInternalTexture();
|
|
302
|
+
const engine = internalTexture?.getEngine() ?? texture.getScene()?.getEngine();
|
|
303
|
+
if (texture.isRenderTarget) {
|
|
304
|
+
return !!engine && (engine.hasOriginBottomLeft || engine.isWebGPU);
|
|
305
|
+
}
|
|
306
|
+
if (_IsCompressedTextureFormat(texture.textureFormat)) {
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
return !!internalTexture?.invertY && !internalTexture._invertVScale;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Encodes Babylon textures to KTX2 through a shared pool of Basis Universal workers.
|
|
313
|
+
* This is groundwork for future glTF export; encoding is internal for now.
|
|
314
|
+
* Configure URLConfig, WorkerPool, and constructor options before the first construction, which fixes the automatic configuration.
|
|
315
|
+
* Fatally failed automatic workers are terminated and replaced for the next job.
|
|
316
|
+
* Normal encode-error replies and cancellation do not terminate healthy workers. Caller-provided pools remain caller-owned.
|
|
317
|
+
* Each worker starts with approximately 128 MiB of WASM memory.
|
|
318
|
+
* The official Basis v2_50 factory requires CSP 'unsafe-eval' for Embind.
|
|
319
|
+
* @experimental
|
|
320
|
+
*/
|
|
321
|
+
export class KhronosTextureContainer2Encoder {
|
|
322
|
+
static _Initialize(numWorkers, dependencies) {
|
|
323
|
+
if (KhronosTextureContainer2Encoder._WorkerPoolPromise || KhronosTextureContainer2Encoder._MainThreadSettings) {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
const urls = KhronosTextureContainer2Encoder.URLConfig;
|
|
327
|
+
const settings = {
|
|
328
|
+
jsEncoderModuleUrl: Tools.GetBabylonScriptURL(urls.jsEncoderModule, true),
|
|
329
|
+
basisJsUrl: Tools.GetBabylonScriptURL(urls.jsBasisEncoder, true),
|
|
330
|
+
basisWasmUrl: Tools.GetBabylonScriptURL(urls.wasmBasisEncoder, true),
|
|
331
|
+
dependencies: dependencies ? { ...dependencies } : undefined,
|
|
332
|
+
};
|
|
333
|
+
if (!UsesWorkers(numWorkers)) {
|
|
334
|
+
KhronosTextureContainer2Encoder._MainThreadSettings = settings;
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
const injectedWasm = dependencies?.wasmBasisEncoder?.slice(0);
|
|
338
|
+
let wasmPromise;
|
|
339
|
+
const loadWasmAsync = async () => {
|
|
340
|
+
if (injectedWasm) {
|
|
341
|
+
return injectedWasm;
|
|
342
|
+
}
|
|
343
|
+
wasmPromise ?? (wasmPromise = Tools.LoadFileAsync(settings.basisWasmUrl));
|
|
344
|
+
try {
|
|
345
|
+
return await wasmPromise;
|
|
346
|
+
}
|
|
347
|
+
catch (error) {
|
|
348
|
+
wasmPromise = undefined;
|
|
349
|
+
throw error;
|
|
350
|
+
}
|
|
351
|
+
};
|
|
352
|
+
const initializeAsync = async (worker) => {
|
|
353
|
+
const wasmBinary = await loadWasmAsync();
|
|
354
|
+
await PostRequestAsync(worker, { action: "init", id: NextRequestId++, jsEncoderModuleUrl: settings.jsEncoderModuleUrl, basisJsUrl: settings.basisJsUrl, wasmBinary });
|
|
355
|
+
};
|
|
356
|
+
const workerUrl = URL.createObjectURL(new Blob([`(${KTX2EncoderWorkerFunction.toString()})()`], { type: "application/javascript" }));
|
|
357
|
+
KhronosTextureContainer2Encoder._WorkerPoolPromise = Promise.resolve(new KTX2EncoderWorkerPool(numWorkers, workerUrl, initializeAsync));
|
|
358
|
+
}
|
|
359
|
+
static async _CreateMainThreadEncoderAsync(settings) {
|
|
360
|
+
const dependencies = settings.dependencies;
|
|
361
|
+
let module = dependencies?.jsEncoderModule;
|
|
362
|
+
if (!module) {
|
|
363
|
+
if (typeof KTX2ENCODER === "undefined") {
|
|
364
|
+
await Tools.LoadBabylonScriptAsync(settings.jsEncoderModuleUrl);
|
|
365
|
+
}
|
|
366
|
+
module = KTX2ENCODER;
|
|
367
|
+
}
|
|
368
|
+
const wasmBinary = dependencies?.wasmBasisEncoder ?? (await Tools.LoadFileAsync(settings.basisWasmUrl));
|
|
369
|
+
const constructor = module.KTX2Encoder;
|
|
370
|
+
const { JSModule, WasmBinary, JSModuleURL, WasmModuleURL } = constructor;
|
|
371
|
+
let encoder;
|
|
372
|
+
try {
|
|
373
|
+
constructor.JSModule = dependencies?.jsBasisEncoder ?? null;
|
|
374
|
+
constructor.WasmBinary = wasmBinary;
|
|
375
|
+
constructor.JSModuleURL = settings.basisJsUrl;
|
|
376
|
+
constructor.WasmModuleURL = settings.basisWasmUrl;
|
|
377
|
+
encoder = new constructor();
|
|
378
|
+
}
|
|
379
|
+
finally {
|
|
380
|
+
constructor.JSModule = JSModule;
|
|
381
|
+
constructor.WasmBinary = WasmBinary;
|
|
382
|
+
constructor.JSModuleURL = JSModuleURL;
|
|
383
|
+
constructor.WasmModuleURL = WasmModuleURL;
|
|
384
|
+
}
|
|
385
|
+
await encoder._initializeAsync();
|
|
386
|
+
return { module, encoder };
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Configures the shared encoder without loading scripts or creating workers.
|
|
390
|
+
* The first construction without a worker pool fixes the automatic worker count, URLs, and dependencies.
|
|
391
|
+
* @param numWorkersOrOptions The number of workers, or encoder options. Specify `0` to encode on the main thread.
|
|
392
|
+
* @experimental
|
|
393
|
+
*/
|
|
394
|
+
constructor(numWorkersOrOptions = KhronosTextureContainer2Encoder.DefaultNumWorkers) {
|
|
395
|
+
const options = typeof numWorkersOrOptions === "number" ? { numWorkers: numWorkersOrOptions } : numWorkersOrOptions;
|
|
396
|
+
this._workerPool = options.workerPool ?? KhronosTextureContainer2Encoder.WorkerPool;
|
|
397
|
+
if (this._workerPool) {
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
const numWorkers = options.numWorkers ?? KhronosTextureContainer2Encoder.DefaultNumWorkers;
|
|
401
|
+
if (!Number.isInteger(numWorkers) || numWorkers < 0) {
|
|
402
|
+
throw new Error("KTX2 encoder numWorkers must be a non-negative integer.");
|
|
403
|
+
}
|
|
404
|
+
const dependencies = options.binariesAndModulesContainer;
|
|
405
|
+
if (UsesWorkers(numWorkers) && (dependencies?.jsEncoderModule || dependencies?.jsBasisEncoder)) {
|
|
406
|
+
throw new Error("KTX2 encoder JavaScript modules cannot be sent to automatic workers. Use numWorkers: 0 or a prepared workerPool.");
|
|
407
|
+
}
|
|
408
|
+
KhronosTextureContainer2Encoder._Initialize(numWorkers, dependencies);
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Encodes level zero of a 2D unsigned byte texture to a top-down KTX2 image.
|
|
412
|
+
* flipY and mipmap generation are derived from the texture. Texture UV transforms are not baked into the image.
|
|
413
|
+
* Cancellation rejects promptly; an active worker finishes its encode before taking more work, and main-thread encoding is cooperative.
|
|
414
|
+
* @param texture Source texture. Dimensions must be multiples of 4 from 4 through 16,384, with at most 12,582,912 pixels.
|
|
415
|
+
* @param options Encoding options and an optional cancellation signal.
|
|
416
|
+
* @returns KTX2 file bytes.
|
|
417
|
+
* @internal
|
|
418
|
+
*/
|
|
419
|
+
async _encodeAsync(texture, options) {
|
|
420
|
+
const { signal, ...requestedOptions } = options;
|
|
421
|
+
if (signal?.aborted) {
|
|
422
|
+
throw AbortError();
|
|
423
|
+
}
|
|
424
|
+
const workerPoolPromise = this._workerPool ? Promise.resolve(this._workerPool) : KhronosTextureContainer2Encoder._WorkerPoolPromise;
|
|
425
|
+
const settings = KhronosTextureContainer2Encoder._MainThreadSettings;
|
|
426
|
+
if (!workerPoolPromise && !settings) {
|
|
427
|
+
throw new Error("KTX2 encoder is not initialized.");
|
|
428
|
+
}
|
|
429
|
+
ValidateTexture(texture, true);
|
|
430
|
+
await WithAbortAsync(async (abortSignal) => await WhenTextureReadyAsync(texture, abortSignal), signal);
|
|
431
|
+
ValidateTexture(texture, false);
|
|
432
|
+
const { width, height } = texture.getSize();
|
|
433
|
+
const readback = await WithAbortAsync(async () => await GetTextureDataAsync(texture, width, height, 0, 0, false, 0, false), signal);
|
|
434
|
+
const rgba = readback.buffer instanceof ArrayBuffer ? readback : readback.slice();
|
|
435
|
+
// WebGPU reads BGRA textures back in storage order.
|
|
436
|
+
if (texture.textureFormat === 12 && texture.getInternalTexture()?.getEngine().isWebGPU) {
|
|
437
|
+
for (let index = 0; index < rgba.length; index += 4) {
|
|
438
|
+
const blue = rgba[index];
|
|
439
|
+
rgba[index] = rgba[index + 2];
|
|
440
|
+
rgba[index + 2] = blue;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
const encodingOptions = {
|
|
444
|
+
...requestedOptions,
|
|
445
|
+
generateMipmaps: !texture.noMipmap && (texture.getInternalTexture()?.generateMipMaps ?? true),
|
|
446
|
+
flipY: _GetKTX2TextureFlipY(texture),
|
|
447
|
+
};
|
|
448
|
+
if (workerPoolPromise) {
|
|
449
|
+
return await KhronosTextureContainer2Encoder._EncodeOnWorkerAsync(await workerPoolPromise, rgba, width, height, encodingOptions, signal);
|
|
450
|
+
}
|
|
451
|
+
return await KhronosTextureContainer2Encoder._EncodeOnMainThreadAsync(settings, rgba, width, height, encodingOptions, signal);
|
|
452
|
+
}
|
|
453
|
+
static async _EncodeOnWorkerAsync(workerPool, rgba, width, height, options, signal) {
|
|
454
|
+
return await new Promise((resolve, reject) => {
|
|
455
|
+
let settled = false;
|
|
456
|
+
const onAbort = () => settle(() => reject(AbortError()));
|
|
457
|
+
const settle = (complete) => {
|
|
458
|
+
if (!settled) {
|
|
459
|
+
settled = true;
|
|
460
|
+
signal?.removeEventListener("abort", onAbort);
|
|
461
|
+
complete();
|
|
462
|
+
}
|
|
463
|
+
};
|
|
464
|
+
if (signal?.aborted) {
|
|
465
|
+
onAbort();
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
468
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
469
|
+
workerPool.push((worker, onComplete) => {
|
|
470
|
+
if (settled) {
|
|
471
|
+
onComplete();
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
void (async () => {
|
|
475
|
+
try {
|
|
476
|
+
await EnsureWorkerReadyAsync(worker);
|
|
477
|
+
if (!settled) {
|
|
478
|
+
const defaults = KhronosTextureContainer2Encoder.DefaultEncoderOptions._getKTX2EncoderOptions();
|
|
479
|
+
try {
|
|
480
|
+
AutomaticWorkers.get(worker)?.failure.signal.throwIfAborted();
|
|
481
|
+
worker.postMessage({ action: "setDefaultEncoderOptions", options: defaults });
|
|
482
|
+
}
|
|
483
|
+
catch (error) {
|
|
484
|
+
AutomaticWorkers.get(worker)?.fail(ToError(error));
|
|
485
|
+
throw error;
|
|
486
|
+
}
|
|
487
|
+
const reply = await PostRequestAsync(worker, { action: "encode", id: NextRequestId++, rgba, width, height, options }, [rgba.buffer]);
|
|
488
|
+
if (reply.action !== "encoded") {
|
|
489
|
+
throw new Error("KTX2 encoder worker sent an unexpected reply.");
|
|
490
|
+
}
|
|
491
|
+
settle(() => resolve(reply.data));
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
catch (error) {
|
|
495
|
+
settle(() => reject(ToError(error)));
|
|
496
|
+
}
|
|
497
|
+
finally {
|
|
498
|
+
onComplete();
|
|
499
|
+
}
|
|
500
|
+
})();
|
|
501
|
+
});
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
static async _EncodeOnMainThreadAsync(settings, rgba, width, height, options, signal) {
|
|
505
|
+
const { module, encoder } = await WithAbortAsync(async () => {
|
|
506
|
+
const initialization = (KhronosTextureContainer2Encoder._MainThreadEncoderPromise ?? (KhronosTextureContainer2Encoder._MainThreadEncoderPromise = KhronosTextureContainer2Encoder._CreateMainThreadEncoderAsync(settings)));
|
|
507
|
+
try {
|
|
508
|
+
return await initialization;
|
|
509
|
+
}
|
|
510
|
+
catch (error) {
|
|
511
|
+
if (KhronosTextureContainer2Encoder._MainThreadEncoderPromise === initialization) {
|
|
512
|
+
KhronosTextureContainer2Encoder._MainThreadEncoderPromise = undefined;
|
|
513
|
+
}
|
|
514
|
+
throw error;
|
|
515
|
+
}
|
|
516
|
+
}, signal);
|
|
517
|
+
return await WithAbortAsync(async (abortSignal) => {
|
|
518
|
+
return await KhronosTextureContainer2Encoder._MainThreadLock.lockAsync(async () => {
|
|
519
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
520
|
+
abortSignal.throwIfAborted();
|
|
521
|
+
const defaults = module.KTX2Encoder.DefaultEncoderOptions;
|
|
522
|
+
let encoding;
|
|
523
|
+
try {
|
|
524
|
+
module.KTX2Encoder.DefaultEncoderOptions = KhronosTextureContainer2Encoder.DefaultEncoderOptions._getKTX2EncoderOptions();
|
|
525
|
+
encoding = encoder.encode(rgba, width, height, options);
|
|
526
|
+
}
|
|
527
|
+
finally {
|
|
528
|
+
module.KTX2Encoder.DefaultEncoderOptions = defaults;
|
|
529
|
+
}
|
|
530
|
+
return await encoding;
|
|
531
|
+
}, abortSignal);
|
|
532
|
+
}, signal);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* URLs of the Babylon encoder module and its Basis Universal v2_50 dependencies.
|
|
537
|
+
* Each URL is resolved with Tools.GetBabylonScriptURL. Configure before the first construction.
|
|
538
|
+
* @experimental
|
|
539
|
+
*/
|
|
540
|
+
KhronosTextureContainer2Encoder.URLConfig = {
|
|
541
|
+
jsEncoderModule: `${Tools._DefaultCdnUrl}/babylon.ktx2Encoder.js`,
|
|
542
|
+
jsBasisEncoder: `${Tools._DefaultCdnUrl}/basisEncoder/v2_50/basis_encoder.js`,
|
|
543
|
+
wasmBasisEncoder: `${Tools._DefaultCdnUrl}/basisEncoder/v2_50/basis_encoder.wasm`,
|
|
544
|
+
};
|
|
545
|
+
/**
|
|
546
|
+
* Default number of workers: half the logical processors, from 1 to 2.
|
|
547
|
+
* @experimental
|
|
548
|
+
*/
|
|
549
|
+
KhronosTextureContainer2Encoder.DefaultNumWorkers = typeof navigator === "object" && navigator.hardwareConcurrency ? Math.max(1, Math.min(2, Math.floor(navigator.hardwareConcurrency / 2))) : 1;
|
|
550
|
+
/**
|
|
551
|
+
* Encoder-wide options. Defined values override per-call options for the usages they apply to.
|
|
552
|
+
* @experimental
|
|
553
|
+
*/
|
|
554
|
+
KhronosTextureContainer2Encoder.DefaultEncoderOptions = new DefaultKTX2EncoderOptions();
|
|
555
|
+
KhronosTextureContainer2Encoder._MainThreadLock = new AsyncLock();
|
|
556
|
+
//# sourceMappingURL=khronosTextureContainer2Encoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"khronosTextureContainer2Encoder.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/khronosTextureContainer2Encoder.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACxG,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EACH,yBAAyB,GAM5B,MAAM,yCAAyC,CAAC;AAMjD;;;;GAIG;AACH,MAAM,OAAO,yBAAyB;IAAtC;QACY,aAAQ,GAAG,IAAI,CAAC;QA8EhB,wBAAmB,GAAgC,EAAE,CAAC;IAwBlE,CAAC;IApGG;;;OAGG;IACH,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAGD;;;OAGG;IACH,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED,IAAW,iBAAiB,CAAC,KAAyB;QAClD,IAAI,IAAI,CAAC,kBAAkB,KAAK,KAAK,EAAE,CAAC;YACpC,OAAO;QACX,CAAC;QACD,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACzB,CAAC;IAGD;;;OAGG;IACH,IAAW,qBAAqB;QAC5B,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACvC,CAAC;IAED,IAAW,qBAAqB,CAAC,KAAyB;QACtD,IAAI,IAAI,CAAC,sBAAsB,KAAK,KAAK,EAAE,CAAC;YACxC,OAAO;QACX,CAAC;QACD,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACzB,CAAC;IAGD;;;OAGG;IACH,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED,IAAW,iBAAiB,CAAC,KAAyB;QAClD,IAAI,IAAI,CAAC,kBAAkB,KAAK,KAAK,EAAE,CAAC;YACpC,OAAO;QACX,CAAC;QACD,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACzB,CAAC;IAGD;;;OAGG;IACH,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,IAAW,SAAS,CAAC,KAA0B;QAC3C,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YAC5B,OAAO;QACX,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACzB,CAAC;IAID,gBAAgB;IACT,sBAAsB;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,mBAAmB,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,MAAM,OAAO,GAAgC,EAAE,CAAC;QAChD,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACxD,CAAC;QACD,IAAI,IAAI,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;YAC5C,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,sBAAsB,CAAC;QAChE,CAAC;QACD,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACxD,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC;QACnC,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ;AAiED,MAAM,gBAAgB,GAAG,IAAI,OAAO,EAAiC,CAAC;AACtE,IAAI,aAAa,GAAG,CAAC,CAAC;AAEtB,SAAS,UAAU;IACf,OAAO,IAAI,YAAY,CAAC,4BAA4B,EAAE,YAAY,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,OAAO,CAAC,KAAc;IAC3B,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,WAAW,CAAC,UAAkB;IACnC,OAAO,UAAU,GAAG,CAAC,IAAI,OAAO,MAAM,KAAK,UAAU,IAAI,OAAO,GAAG,KAAK,WAAW,CAAC;AACxF,CAAC;AAED,SAAS,eAAe,CAAC,OAAoB,EAAE,kBAA2B;IACtE,MAAM,eAAe,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IACrD,MAAM,MAAM,GAAG,eAAe,EAAE,SAAS,EAAE,CAAC;IAC5C,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,SAAS,IAAI,eAAe,EAAE,MAAM,IAAI,eAAe,EAAE,IAAI,IAAI,eAAe,EAAE,SAAS,EAAE,CAAC;QACxI,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IACjG,CAAC;IACD,MAAM,YAAY,GAAG,eAAe,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC;IAClD,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,yBAAyB,IAAI,CAAC,CAAC,kBAAkB,IAAI,YAAY,CAAC,EAAE,CAAC;QACvG,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACxE,CAAC;IACD,QAAQ,OAAO,CAAC,aAAa,EAAE,CAAC;QAC5B,KAAK,SAAS,CAAC,mBAAmB,CAAC;QACnC,KAAK,SAAS,CAAC,uBAAuB,CAAC;QACvC,KAAK,SAAS,CAAC,6BAA6B;YACxC,IAAI,MAAM,IAAI,cAAc,IAAI,MAAM,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;YACnG,CAAC;YACD,MAAM;QACV,KAAK,SAAS,CAAC,uBAAuB,CAAC;QACvC,KAAK,SAAS,CAAC,wBAAwB,CAAC;QACxC,KAAK,SAAS,CAAC,yBAAyB,CAAC;QACzC,KAAK,SAAS,CAAC,0BAA0B;YACrC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,eAAe,EAAE,YAAY,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,0BAA0B,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAC5F,CAAC;AACL,CAAC;AAED,KAAK,UAAU,cAAc,CAAI,SAA8C,EAAE,MAA+B,EAAE,aAA0B,UAAU;IAClJ,OAAO,MAAM,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC5C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,GAAG,EAAE;YACjB,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;YAC3B,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC,CAAC;QACF,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YAClB,OAAO,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QACD,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,KAAK,CAAC,KAAK,IAAI,EAAE;YACb,IAAI,CAAC;gBACD,OAAO,CAAC,MAAM,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;YAChD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3B,CAAC;oBAAS,CAAC;gBACP,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAClD,CAAC;QACL,CAAC,CAAC,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,MAAc,EAAE,OAAkD,EAAE,WAA2B,EAAE;IAC7H,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACzC,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC;QACnE,MAAM,OAAO,GAAG,GAAG,EAAE;YACjB,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACjD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,MAAM,CAAC,mBAAmB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;YAC3D,aAAa,EAAE,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC3D,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,KAAY,EAAE,EAAE;YAC1B,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC,CAAC;QACF,MAAM,SAAS,GAAG,CAAC,KAA2C,EAAE,EAAE;YAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;YACzB,IAAI,KAAK,EAAE,EAAE,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC;gBAC3B,OAAO;YACX,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACvC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACZ,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBACd,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC9C,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;QACL,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,CAAC,KAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,6BAA6B,CAAC,CAAC,CAAC;QACvG,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC,CAAC;QACvG,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7D,IAAI,aAAa,EAAE,OAAO,EAAE,CAAC;YACzB,SAAS,EAAE,CAAC;YACZ,OAAO;QACX,CAAC;QACD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QACxD,aAAa,EAAE,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC;YACD,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC/B,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5C,IAAI,CAAC,OAAO,CAAC,CAAC;QAClB,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAiB,EAAE,UAA6C;IAC3F,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;IACtC,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACD,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,0HAA0H;QAC1H,MAAM,WAAW,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,mBAAmB,EAAE,GAAG,EAAE,GAAE,CAAC,EAAuB,CAAC;QACnJ,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9B,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/G,OAAO,WAAW,CAAC;IACvB,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,KAAY,EAAE,EAAE;QAC1B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,MAAM,CAAC,mBAAmB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;YAC3D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,CAAC,SAAS,EAAE,CAAC;QACvB,CAAC;IACL,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,KAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,6BAA6B,CAAC,CAAC,CAAC;IACvG,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC,CAAC;IACvG,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE,4FAA4F;IAC5F,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IACxD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,qBAAsB,SAAQ,qBAAqB;IAGrD,YAAY,UAAkB,EAAE,SAAiB,EAAE,UAA6C;QAC5F,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,qBAAqB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACxE,KAAK,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,oBAAoB,GAAG,YAAY,CAAC;IAC7C,CAAC;IAEkB,QAAQ,CAAC,UAAyD,EAAE,MAAwD;QAC3I,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE;YAC9C,IAAI,aAAa,GAAG,MAAM,CAAC;YAC3B,IAAI,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAChD,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC9C,aAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC5C,UAAU,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;gBAC1D,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAChD,CAAC;YACD,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;YACtB,CAAC;YACD,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAED,KAAK,UAAU,sBAAsB,CAAC,MAAc;IAChD,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO;IACX,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;IACtC,KAAK,CAAC,KAAK,KAAX,KAAK,CAAC,KAAK,GAAK,cAAc,CAC1B,KAAK,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAC1C,KAAK,CAAC,OAAO,CAAC,MAAM,EACpB,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAC7C,EAAC;IACF,IAAI,CAAC;QACD,MAAM,KAAK,CAAC,KAAK,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3B,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;QACxB,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAoB;IACrD,MAAM,eAAe,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IACrD,MAAM,MAAM,GAAG,eAAe,EAAE,SAAS,EAAE,IAAI,OAAO,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC;IAC/E,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QACzB,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,mBAAmB,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,0BAA0B,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,CAAC,CAAC,eAAe,EAAE,OAAO,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC;AACxE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,OAAO,+BAA+B;IAyChC,MAAM,CAAC,WAAW,CAAC,UAAkB,EAAE,YAA6C;QACxF,IAAI,+BAA+B,CAAC,kBAAkB,IAAI,+BAA+B,CAAC,mBAAmB,EAAE,CAAC;YAC5G,OAAO;QACX,CAAC;QACD,MAAM,IAAI,GAAG,+BAA+B,CAAC,SAAS,CAAC;QACvD,MAAM,QAAQ,GAAqB;YAC/B,kBAAkB,EAAE,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC;YACzE,UAAU,EAAE,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC;YAChE,YAAY,EAAE,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC;YACpE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS;SAC/D,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,+BAA+B,CAAC,mBAAmB,GAAG,QAAQ,CAAC;YAC/D,OAAO;QACX,CAAC;QACD,MAAM,YAAY,GAAG,YAAY,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9D,IAAI,WAA6C,CAAC;QAClD,MAAM,aAAa,GAAG,KAAK,IAA0B,EAAE;YACnD,IAAI,YAAY,EAAE,CAAC;gBACf,OAAO,YAAY,CAAC;YACxB,CAAC;YACD,WAAW,KAAX,WAAW,GAAK,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAC;YAC3D,IAAI,CAAC;gBACD,OAAO,MAAM,WAAW,CAAC;YAC7B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,WAAW,GAAG,SAAS,CAAC;gBACxB,MAAM,KAAK,CAAC;YAChB,CAAC;QACL,CAAC,CAAC;QACF,MAAM,eAAe,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;YAC7C,MAAM,UAAU,GAAG,MAAM,aAAa,EAAE,CAAC;YACzC,MAAM,gBAAgB,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;QAC1K,CAAC,CAAC;QACF,MAAM,SAAS,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,yBAAyB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC;QACrI,+BAA+B,CAAC,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,qBAAqB,CAAC,UAAU,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;IAC5I,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,QAA0B;QACzE,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;QAC3C,IAAI,MAAM,GAAG,YAAY,EAAE,eAAe,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,IAAI,OAAO,WAAW,KAAK,WAAW,EAAE,CAAC;gBACrC,MAAM,KAAK,CAAC,sBAAsB,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YACpE,CAAC;YACD,MAAM,GAAG,WAAW,CAAC;QACzB,CAAC;QACD,MAAM,UAAU,GAAG,YAAY,EAAE,gBAAgB,IAAI,CAAC,MAAM,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;QACxG,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACvC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,WAAW,CAAC;QACzE,IAAI,OAA6B,CAAC;QAClC,IAAI,CAAC;YACD,WAAW,CAAC,QAAQ,GAAG,YAAY,EAAE,cAAc,IAAI,IAAI,CAAC;YAC5D,WAAW,CAAC,UAAU,GAAG,UAAU,CAAC;YACpC,WAAW,CAAC,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC;YAC9C,WAAW,CAAC,aAAa,GAAG,QAAQ,CAAC,YAAY,CAAC;YAClD,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAChC,CAAC;gBAAS,CAAC;YACP,WAAW,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAChC,WAAW,CAAC,UAAU,GAAG,UAAU,CAAC;YACpC,WAAW,CAAC,WAAW,GAAG,WAAW,CAAC;YACtC,WAAW,CAAC,aAAa,GAAG,aAAa,CAAC;QAC9C,CAAC;QACD,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACjC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED;;;;;OAKG;IACH,YAAmB,sBAAwE,+BAA+B,CAAC,iBAAiB;QACxI,MAAM,OAAO,GAAG,OAAO,mBAAmB,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC;QACpH,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,IAAI,+BAA+B,CAAC,UAAU,CAAC;QACpF,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QACD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,+BAA+B,CAAC,iBAAiB,CAAC;QAC3F,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,YAAY,GAAG,OAAO,CAAC,2BAA2B,CAAC;QACzD,IAAI,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,IAAI,YAAY,EAAE,cAAc,CAAC,EAAE,CAAC;YAC7F,MAAM,IAAI,KAAK,CAAC,kHAAkH,CAAC,CAAC;QACxI,CAAC;QACD,+BAA+B,CAAC,WAAW,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC1E,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,YAAY,CAAC,OAAoB,EAAE,OAA0F;QACtI,MAAM,EAAE,MAAM,EAAE,GAAG,gBAAgB,EAAE,GAAG,OAAO,CAAC;QAChD,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YAClB,MAAM,UAAU,EAAE,CAAC;QACvB,CAAC;QACD,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,+BAA+B,CAAC,kBAAkB,CAAC;QACpI,MAAM,QAAQ,GAAG,+BAA+B,CAAC,mBAAmB,CAAC;QACrE,IAAI,CAAC,iBAAiB,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACxD,CAAC;QACD,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/B,MAAM,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,MAAM,qBAAqB,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;QACvG,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAChC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;QACpI,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,YAAY,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClF,oDAAoD;QACpD,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC;YAC/G,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;gBACzB,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC9B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;YAC3B,CAAC;QACL,CAAC;QACD,MAAM,eAAe,GAAwB;YACzC,GAAG,gBAAgB;YACnB,eAAe,EAAE,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,eAAe,IAAI,IAAI,CAAC;YAC7F,KAAK,EAAE,oBAAoB,CAAC,OAAO,CAAC;SACvC,CAAC;QACF,IAAI,iBAAiB,EAAE,CAAC;YACpB,OAAO,MAAM,+BAA+B,CAAC,oBAAoB,CAAC,MAAM,iBAAiB,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;QAC7I,CAAC;QACD,OAAO,MAAM,+BAA+B,CAAC,wBAAwB,CAAC,QAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;IACnI,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,oBAAoB,CACrC,UAAiC,EACjC,IAAgB,EAChB,KAAa,EACb,MAAc,EACd,OAA4B,EAC5B,MAA+B;QAE/B,OAAO,MAAM,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrD,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,CAAC,QAAoB,EAAE,EAAE;gBACpC,IAAI,CAAC,OAAO,EAAE,CAAC;oBACX,OAAO,GAAG,IAAI,CAAC;oBACf,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBAC9C,QAAQ,EAAE,CAAC;gBACf,CAAC;YACL,CAAC,CAAC;YACF,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBAClB,OAAO,EAAE,CAAC;gBACV,OAAO;YACX,CAAC;YACD,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE;gBACnC,IAAI,OAAO,EAAE,CAAC;oBACV,UAAU,EAAE,CAAC;oBACb,OAAO;gBACX,CAAC;gBACD,KAAK,CAAC,KAAK,IAAI,EAAE;oBACb,IAAI,CAAC;wBACD,MAAM,sBAAsB,CAAC,MAAM,CAAC,CAAC;wBACrC,IAAI,CAAC,OAAO,EAAE,CAAC;4BACX,MAAM,QAAQ,GAAG,+BAA+B,CAAC,qBAAqB,CAAC,sBAAsB,EAAE,CAAC;4BAChG,IAAI,CAAC;gCACD,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gCAC9D,MAAM,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,0BAA0B,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;4BAClF,CAAC;4BAAC,OAAO,KAAK,EAAE,CAAC;gCACb,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;gCACnD,MAAM,KAAK,CAAC;4BAChB,CAAC;4BACD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,MAAqB,CAAC,CAAC,CAAC;4BACpJ,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gCAC7B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;4BACrE,CAAC;4BACD,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;wBACtC,CAAC;oBACL,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACb,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACzC,CAAC;4BAAS,CAAC;wBACP,UAAU,EAAE,CAAC;oBACjB,CAAC;gBACL,CAAC,CAAC,EAAE,CAAC;YACT,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,wBAAwB,CACzC,QAA0B,EAC1B,IAAgB,EAChB,KAAa,EACb,MAAc,EACd,OAA4B,EAC5B,MAA+B;QAE/B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,cAAc,CAAC,KAAK,IAAI,EAAE;YACxD,MAAM,cAAc,GAAG,CAAC,+BAA+B,CAAC,yBAAyB,KAAzD,+BAA+B,CAAC,yBAAyB,GAAK,+BAA+B,CAAC,6BAA6B,CAAC,QAAQ,CAAC,EAAC,CAAC;YAC/J,IAAI,CAAC;gBACD,OAAO,MAAM,cAAc,CAAC;YAChC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,IAAI,+BAA+B,CAAC,yBAAyB,KAAK,cAAc,EAAE,CAAC;oBAC/E,+BAA+B,CAAC,yBAAyB,GAAG,SAAS,CAAC;gBAC1E,CAAC;gBACD,MAAM,KAAK,CAAC;YAChB,CAAC;QACL,CAAC,EAAE,MAAM,CAAC,CAAC;QACX,OAAO,MAAM,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE;YAC9C,OAAO,MAAM,+BAA+B,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;gBAC9E,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC7D,WAAW,CAAC,cAAc,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,qBAAqB,CAAC;gBAC1D,IAAI,QAA6B,CAAC;gBAClC,IAAI,CAAC;oBACD,MAAM,CAAC,WAAW,CAAC,qBAAqB,GAAG,+BAA+B,CAAC,qBAAqB,CAAC,sBAAsB,EAAE,CAAC;oBAC1H,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC5D,CAAC;wBAAS,CAAC;oBACP,MAAM,CAAC,WAAW,CAAC,qBAAqB,GAAG,QAAQ,CAAC;gBACxD,CAAC;gBACD,OAAO,MAAM,QAAQ,CAAC;YAC1B,CAAC,EAAE,WAAW,CAAC,CAAC;QACpB,CAAC,EAAE,MAAM,CAAC,CAAC;IACf,CAAC;;AAvQD;;;;GAIG;AACW,yCAAS,GAInB;IACA,eAAe,EAAE,GAAG,KAAK,CAAC,cAAc,yBAAyB;IACjE,cAAc,EAAE,GAAG,KAAK,CAAC,cAAc,sCAAsC;IAC7E,gBAAgB,EAAE,GAAG,KAAK,CAAC,cAAc,wCAAwC;CACpF,CAAC;AASF;;;GAGG;AACW,iDAAiB,GAAG,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE/K;;;GAGG;AACW,qDAAqB,GAAG,IAAI,yBAAyB,EAAE,CAAC;AAK9C,+CAAe,GAAG,IAAI,SAAS,EAAE,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\nimport { Tools } from \"./tools.pure\";\nimport { type BaseTexture } from \"../Materials/Textures/baseTexture.pure\";\nimport { Constants } from \"../Engines/constants\";\nimport { GetTextureDataAsync, _IsCompressedTextureFormat, WhenTextureReadyAsync } from \"./textureTools\";\nimport { AsyncLock } from \"./asyncLock\";\nimport { AutoReleaseWorkerPool } from \"./workerPool\";\nimport { type _IKTX2EncoderDefaultOptions, type IKTX2EncoderOptions } from \"../Materials/Textures/ktx2encoderTypes\";\nimport {\n KTX2EncoderWorkerFunction,\n type _KTX2EncoderBasisFactory,\n type IKTX2EncoderInstance,\n type IKTX2EncoderModule,\n type KTX2EncoderWorkerReply,\n type KTX2EncoderWorkerRequest,\n} from \"./khronosTextureContainer2EncoderWorker\";\n\nexport type { IKTX2EncoderOptions, KTX2EncoderUsage } from \"../Materials/Textures/ktx2encoderTypes\";\n\ndeclare const KTX2ENCODER: IKTX2EncoderModule;\n\n/**\n * Encoder-wide KTX2 encoding options. Defined values override per-call options, as KhronosTextureContainer2.DefaultDecoderOptions does.\n * ETC1S fields apply only to color usage; uastcQualityLevel and zstandard apply only to data and normal usage.\n * @experimental\n */\nexport class DefaultKTX2EncoderOptions {\n private _isDirty = true;\n\n /**\n * Gets the dirty flag\n * @experimental\n */\n public get isDirty() {\n return this._isDirty;\n }\n\n private _etc1sQualityLevel?: number;\n /**\n * Integer ETC1S quality for color usage, from 1 to 255.\n * @experimental\n */\n public get etc1sQualityLevel() {\n return this._etc1sQualityLevel;\n }\n\n public set etc1sQualityLevel(value: number | undefined) {\n if (this._etc1sQualityLevel === value) {\n return;\n }\n this._etc1sQualityLevel = value;\n this._isDirty = true;\n }\n\n private _etc1sCompressionLevel?: number;\n /**\n * Integer ETC1S compression effort for color usage, from 0 to 6.\n * @experimental\n */\n public get etc1sCompressionLevel() {\n return this._etc1sCompressionLevel;\n }\n\n public set etc1sCompressionLevel(value: number | undefined) {\n if (this._etc1sCompressionLevel === value) {\n return;\n }\n this._etc1sCompressionLevel = value;\n this._isDirty = true;\n }\n\n private _uastcQualityLevel?: number;\n /**\n * Integer UASTC quality for data and normal usage, from 0 to 4.\n * @experimental\n */\n public get uastcQualityLevel() {\n return this._uastcQualityLevel;\n }\n\n public set uastcQualityLevel(value: number | undefined) {\n if (this._uastcQualityLevel === value) {\n return;\n }\n this._uastcQualityLevel = value;\n this._isDirty = true;\n }\n\n private _zstandard?: boolean;\n /**\n * Use Zstandard with UASTC for data and normal usage.\n * @experimental\n */\n public get zstandard() {\n return this._zstandard;\n }\n\n public set zstandard(value: boolean | undefined) {\n if (this._zstandard === value) {\n return;\n }\n this._zstandard = value;\n this._isDirty = true;\n }\n\n private _ktx2EncoderOptions: _IKTX2EncoderDefaultOptions = {};\n\n /** @internal */\n public _getKTX2EncoderOptions(): _IKTX2EncoderDefaultOptions {\n if (!this._isDirty) {\n return this._ktx2EncoderOptions;\n }\n this._isDirty = false;\n const options: _IKTX2EncoderDefaultOptions = {};\n if (this._etc1sQualityLevel !== undefined) {\n options.etc1sQualityLevel = this._etc1sQualityLevel;\n }\n if (this._etc1sCompressionLevel !== undefined) {\n options.etc1sCompressionLevel = this._etc1sCompressionLevel;\n }\n if (this._uastcQualityLevel !== undefined) {\n options.uastcQualityLevel = this._uastcQualityLevel;\n }\n if (this._zstandard !== undefined) {\n options.zstandard = this._zstandard;\n }\n this._ktx2EncoderOptions = options;\n return options;\n }\n}\n\n/**\n * Options for the KTX2 encoder.\n * @experimental\n */\nexport interface IKhronosTextureContainer2EncoderOptions {\n /**\n * Number of workers for the shared automatic pool. Specify `0` to encode on the main thread.\n * @experimental\n */\n numWorkers?: number;\n /**\n * Worker pool captured by this instance, whose workers are already initialized with the encoder worker protocol. If set, `numWorkers` is ignored.\n * This release has no public worker bootstrap.\n * @experimental\n */\n workerPool?: AutoReleaseWorkerPool;\n /**\n * Dependencies that replace their URLConfig entries.\n * JavaScript modules cannot be sent to automatic workers; use them with `numWorkers: 0`.\n * The WASM binary is copied to automatic workers and is not detached.\n * @experimental\n */\n binariesAndModulesContainer?: {\n /**\n * The Babylon KTX2 encoder module, such as the KTX2ENCODER global.\n * @experimental\n */\n jsEncoderModule?: IKTX2EncoderModule;\n /**\n * The Basis Universal v2_50 encoder factory, such as the BASIS global.\n * @experimental\n */\n jsBasisEncoder?: _KTX2EncoderBasisFactory;\n /**\n * The Basis Universal v2_50 encoder WASM binary.\n * @experimental\n */\n wasmBasisEncoder?: ArrayBuffer;\n };\n}\n\ntype EncoderDependencies = NonNullable<IKhronosTextureContainer2EncoderOptions[\"binariesAndModulesContainer\"]>;\n\ninterface IEncoderSettings {\n jsEncoderModuleUrl: string;\n basisJsUrl: string;\n basisWasmUrl: string;\n dependencies?: EncoderDependencies;\n}\n\ninterface IMainThreadEncoder {\n module: IKTX2EncoderModule;\n encoder: IKTX2EncoderInstance;\n}\n\ninterface IAutomaticWorkerState {\n initialize: (worker: Worker) => Promise<void>;\n ready?: Promise<void>;\n failure: AbortController;\n fail: (error: Error) => void;\n used: boolean;\n}\n\nconst AutomaticWorkers = new WeakMap<Worker, IAutomaticWorkerState>();\nlet NextRequestId = 0;\n\nfunction AbortError(): DOMException {\n return new DOMException(\"KTX2 encoding was aborted.\", \"AbortError\");\n}\n\nfunction ToError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction UsesWorkers(numWorkers: number): boolean {\n return numWorkers > 0 && typeof Worker === \"function\" && typeof URL !== \"undefined\";\n}\n\nfunction ValidateTexture(texture: BaseTexture, allowUninitialized: boolean): void {\n const internalTexture = texture.getInternalTexture();\n const engine = internalTexture?.getEngine();\n if (texture.isCube || texture.is3D || texture.is2DArray || internalTexture?.isCube || internalTexture?.is3D || internalTexture?.is2DArray) {\n throw new Error(\"KTX2 encoding supports only 2D textures, not cube, 3D, or array textures.\");\n }\n const hasKnownType = internalTexture?.type !== -1;\n if (texture.textureType !== Constants.TEXTURETYPE_UNSIGNED_BYTE && (!allowUninitialized || hasKnownType)) {\n throw new Error(\"KTX2 encoding requires an unsigned byte texture.\");\n }\n switch (texture.textureFormat) {\n case Constants.TEXTUREFORMAT_ALPHA:\n case Constants.TEXTUREFORMAT_LUMINANCE:\n case Constants.TEXTUREFORMAT_LUMINANCE_ALPHA:\n if (engine && \"webGLVersion\" in engine) {\n throw new Error(\"KTX2 encoding does not support alpha or luminance texture formats on WebGL.\");\n }\n break;\n case Constants.TEXTUREFORMAT_R_INTEGER:\n case Constants.TEXTUREFORMAT_RG_INTEGER:\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\n throw new Error(\"KTX2 encoding does not support integer texture formats.\");\n }\n if (internalTexture?._premulAlpha) {\n throw new Error(\"KTX2 encoding does not support premultiplied alpha.\");\n }\n if (_IsCompressedTextureFormat(texture.textureFormat) && !texture.getScene()) {\n throw new Error(\"KTX2 encoding compressed textures requires a scene for GPU readback.\");\n }\n}\n\nasync function WithAbortAsync<T>(operation: (signal: AbortSignal) => Promise<T>, signal: AbortSignal | undefined, abortError: () => Error = AbortError): Promise<T> {\n return await new Promise<T>((resolve, reject) => {\n const controller = new AbortController();\n const onAbort = () => {\n const error = abortError();\n controller.abort(error);\n reject(error);\n };\n if (signal?.aborted) {\n onAbort();\n return;\n }\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n void (async () => {\n try {\n resolve(await operation(controller.signal));\n } catch (error) {\n reject(ToError(error));\n } finally {\n signal?.removeEventListener(\"abort\", onAbort);\n }\n })();\n });\n}\n\nasync function PostRequestAsync(worker: Worker, request: KTX2EncoderWorkerRequest & { id: number }, transfer: Transferable[] = []): Promise<KTX2EncoderWorkerReply> {\n return await new Promise((resolve, reject) => {\n const failureSignal = AutomaticWorkers.get(worker)?.failure.signal;\n const cleanup = () => {\n worker.removeEventListener(\"message\", onMessage);\n worker.removeEventListener(\"error\", onError);\n worker.removeEventListener(\"messageerror\", onMessageError);\n failureSignal?.removeEventListener(\"abort\", onFailure);\n };\n const fail = (error: Error) => {\n cleanup();\n reject(error);\n };\n const onMessage = (event: MessageEvent<KTX2EncoderWorkerReply>) => {\n const reply = event.data;\n if (reply?.id !== request.id) {\n return;\n }\n if (reply.action === \"error\") {\n const error = new Error(reply.message);\n fail(error);\n if (reply.fatal) {\n AutomaticWorkers.get(worker)?.fail(error);\n }\n } else {\n cleanup();\n resolve(reply);\n }\n };\n const onError = (event: ErrorEvent) => fail(new Error(event.message || \"KTX2 encoder worker failed.\"));\n const onMessageError = () => fail(new Error(\"KTX2 encoder worker message could not be deserialized.\"));\n const onFailure = () => fail(ToError(failureSignal?.reason));\n if (failureSignal?.aborted) {\n onFailure();\n return;\n }\n worker.addEventListener(\"message\", onMessage);\n worker.addEventListener(\"error\", onError);\n worker.addEventListener(\"messageerror\", onMessageError);\n failureSignal?.addEventListener(\"abort\", onFailure);\n try {\n worker.postMessage(request, transfer);\n } catch (error) {\n const failure = ToError(error);\n AutomaticWorkers.get(worker)?.fail(failure);\n fail(failure);\n }\n });\n}\n\nfunction CreateAutomaticWorker(workerUrl: string, initialize: (worker: Worker) => Promise<void>): Worker {\n const failure = new AbortController();\n let worker: Worker;\n try {\n worker = new Worker(workerUrl);\n } catch (error) {\n // A rejected factory promise never reaches a pool action. Report construction failure to this job, then replace the slot.\n const placeholder = { postMessage: () => {}, terminate: () => {}, addEventListener: () => {}, removeEventListener: () => {} } as unknown as Worker;\n failure.abort(ToError(error));\n AutomaticWorkers.set(placeholder, { initialize, failure, fail: (error) => failure.abort(error), used: false });\n return placeholder;\n }\n const fail = (error: Error) => {\n if (!failure.signal.aborted) {\n worker.removeEventListener(\"error\", onError);\n worker.removeEventListener(\"messageerror\", onMessageError);\n failure.abort(error);\n worker.terminate();\n }\n };\n const onError = (event: ErrorEvent) => fail(new Error(event.message || \"KTX2 encoder worker failed.\"));\n const onMessageError = () => fail(new Error(\"KTX2 encoder worker message could not be deserialized.\"));\n AutomaticWorkers.set(worker, { initialize, failure, fail, used: false });\n // Keep fatal-error listeners between jobs and while initialization is waiting for the WASM.\n worker.addEventListener(\"error\", onError);\n worker.addEventListener(\"messageerror\", onMessageError);\n return worker;\n}\n\nclass KTX2EncoderWorkerPool extends AutoReleaseWorkerPool {\n private readonly _createEncoderWorker: () => Worker;\n\n constructor(numWorkers: number, workerUrl: string, initialize: (worker: Worker) => Promise<void>) {\n const createWorker = () => CreateAutomaticWorker(workerUrl, initialize);\n super(numWorkers, async () => createWorker());\n this._createEncoderWorker = createWorker;\n }\n\n protected override _execute(workerInfo: KTX2EncoderWorkerPool[\"_workerInfos\"][number], action: (worker: Worker, onComplete: () => void) => void): void {\n super._execute(workerInfo, (worker, onComplete) => {\n let currentWorker = worker;\n let state = AutomaticWorkers.get(currentWorker);\n if (state?.used && state.failure.signal.aborted) {\n currentWorker = this._createEncoderWorker();\n workerInfo.workerPromise = Promise.resolve(currentWorker);\n state = AutomaticWorkers.get(currentWorker);\n }\n if (state) {\n state.used = true;\n }\n action(currentWorker, onComplete);\n });\n }\n}\n\nasync function EnsureWorkerReadyAsync(worker: Worker): Promise<void> {\n const state = AutomaticWorkers.get(worker);\n if (!state) {\n return;\n }\n state.failure.signal.throwIfAborted();\n state.ready ??= WithAbortAsync(\n async () => await state.initialize(worker),\n state.failure.signal,\n () => ToError(state.failure.signal.reason)\n );\n try {\n await state.ready;\n } catch (error) {\n state.fail(ToError(error));\n state.ready = undefined;\n throw error;\n }\n}\n\n/**\n * Determines the Basis row flip without modifying pixels.\n * GetTextureDataAsync's direct and LOD RTT paths preserve texture texel row order:\n * WebGL reads bottom-first; WebGPU's Y-flipped RTT draw compensates its top-left origin.\n * Uploaded images undo their upload flip. Compressed uploads retain their source rows;\n * loader UV compensation does not change readback pixels.\n * KTX2's uncompressed fallback uses the regular upload flip.\n * Render targets need a flip on WebGL and on WebGPU, whose render-target draws are Y-flipped.\n * @internal\n */\nexport function _GetKTX2TextureFlipY(texture: BaseTexture): boolean {\n const internalTexture = texture.getInternalTexture();\n const engine = internalTexture?.getEngine() ?? texture.getScene()?.getEngine();\n if (texture.isRenderTarget) {\n return !!engine && (engine.hasOriginBottomLeft || engine.isWebGPU);\n }\n if (_IsCompressedTextureFormat(texture.textureFormat)) {\n return false;\n }\n return !!internalTexture?.invertY && !internalTexture._invertVScale;\n}\n\n/**\n * Encodes Babylon textures to KTX2 through a shared pool of Basis Universal workers.\n * This is groundwork for future glTF export; encoding is internal for now.\n * Configure URLConfig, WorkerPool, and constructor options before the first construction, which fixes the automatic configuration.\n * Fatally failed automatic workers are terminated and replaced for the next job.\n * Normal encode-error replies and cancellation do not terminate healthy workers. Caller-provided pools remain caller-owned.\n * Each worker starts with approximately 128 MiB of WASM memory.\n * The official Basis v2_50 factory requires CSP 'unsafe-eval' for Embind.\n * @experimental\n */\nexport class KhronosTextureContainer2Encoder {\n /**\n * URLs of the Babylon encoder module and its Basis Universal v2_50 dependencies.\n * Each URL is resolved with Tools.GetBabylonScriptURL. Configure before the first construction.\n * @experimental\n */\n public static URLConfig: {\n jsEncoderModule: string;\n jsBasisEncoder: string;\n wasmBasisEncoder: string;\n } = {\n jsEncoderModule: `${Tools._DefaultCdnUrl}/babylon.ktx2Encoder.js`,\n jsBasisEncoder: `${Tools._DefaultCdnUrl}/basisEncoder/v2_50/basis_encoder.js`,\n wasmBasisEncoder: `${Tools._DefaultCdnUrl}/basisEncoder/v2_50/basis_encoder.wasm`,\n };\n\n /**\n * Worker pool to use instead of creating one. Its workers must already be initialized with the encoder worker protocol;\n * this release has no public worker bootstrap. Each instance captures this setting at construction and never disposes the pool.\n * @experimental\n */\n public static WorkerPool?: AutoReleaseWorkerPool;\n\n /**\n * Default number of workers: half the logical processors, from 1 to 2.\n * @experimental\n */\n public static DefaultNumWorkers = typeof navigator === \"object\" && navigator.hardwareConcurrency ? Math.max(1, Math.min(2, Math.floor(navigator.hardwareConcurrency / 2))) : 1;\n\n /**\n * Encoder-wide options. Defined values override per-call options for the usages they apply to.\n * @experimental\n */\n public static DefaultEncoderOptions = new DefaultKTX2EncoderOptions();\n\n private static _WorkerPoolPromise?: Promise<AutoReleaseWorkerPool>;\n private static _MainThreadSettings?: IEncoderSettings;\n private static _MainThreadEncoderPromise?: Promise<IMainThreadEncoder>;\n private static readonly _MainThreadLock = new AsyncLock();\n private readonly _workerPool?: AutoReleaseWorkerPool;\n\n private static _Initialize(numWorkers: number, dependencies: EncoderDependencies | undefined): void {\n if (KhronosTextureContainer2Encoder._WorkerPoolPromise || KhronosTextureContainer2Encoder._MainThreadSettings) {\n return;\n }\n const urls = KhronosTextureContainer2Encoder.URLConfig;\n const settings: IEncoderSettings = {\n jsEncoderModuleUrl: Tools.GetBabylonScriptURL(urls.jsEncoderModule, true),\n basisJsUrl: Tools.GetBabylonScriptURL(urls.jsBasisEncoder, true),\n basisWasmUrl: Tools.GetBabylonScriptURL(urls.wasmBasisEncoder, true),\n dependencies: dependencies ? { ...dependencies } : undefined,\n };\n if (!UsesWorkers(numWorkers)) {\n KhronosTextureContainer2Encoder._MainThreadSettings = settings;\n return;\n }\n const injectedWasm = dependencies?.wasmBasisEncoder?.slice(0);\n let wasmPromise: Promise<ArrayBuffer> | undefined;\n const loadWasmAsync = async (): Promise<ArrayBuffer> => {\n if (injectedWasm) {\n return injectedWasm;\n }\n wasmPromise ??= Tools.LoadFileAsync(settings.basisWasmUrl);\n try {\n return await wasmPromise;\n } catch (error) {\n wasmPromise = undefined;\n throw error;\n }\n };\n const initializeAsync = async (worker: Worker) => {\n const wasmBinary = await loadWasmAsync();\n await PostRequestAsync(worker, { action: \"init\", id: NextRequestId++, jsEncoderModuleUrl: settings.jsEncoderModuleUrl, basisJsUrl: settings.basisJsUrl, wasmBinary });\n };\n const workerUrl = URL.createObjectURL(new Blob([`(${KTX2EncoderWorkerFunction.toString()})()`], { type: \"application/javascript\" }));\n KhronosTextureContainer2Encoder._WorkerPoolPromise = Promise.resolve(new KTX2EncoderWorkerPool(numWorkers, workerUrl, initializeAsync));\n }\n\n private static async _CreateMainThreadEncoderAsync(settings: IEncoderSettings): Promise<IMainThreadEncoder> {\n const dependencies = settings.dependencies;\n let module = dependencies?.jsEncoderModule;\n if (!module) {\n if (typeof KTX2ENCODER === \"undefined\") {\n await Tools.LoadBabylonScriptAsync(settings.jsEncoderModuleUrl);\n }\n module = KTX2ENCODER;\n }\n const wasmBinary = dependencies?.wasmBasisEncoder ?? (await Tools.LoadFileAsync(settings.basisWasmUrl));\n const constructor = module.KTX2Encoder;\n const { JSModule, WasmBinary, JSModuleURL, WasmModuleURL } = constructor;\n let encoder: IKTX2EncoderInstance;\n try {\n constructor.JSModule = dependencies?.jsBasisEncoder ?? null;\n constructor.WasmBinary = wasmBinary;\n constructor.JSModuleURL = settings.basisJsUrl;\n constructor.WasmModuleURL = settings.basisWasmUrl;\n encoder = new constructor();\n } finally {\n constructor.JSModule = JSModule;\n constructor.WasmBinary = WasmBinary;\n constructor.JSModuleURL = JSModuleURL;\n constructor.WasmModuleURL = WasmModuleURL;\n }\n await encoder._initializeAsync();\n return { module, encoder };\n }\n\n /**\n * Configures the shared encoder without loading scripts or creating workers.\n * The first construction without a worker pool fixes the automatic worker count, URLs, and dependencies.\n * @param numWorkersOrOptions The number of workers, or encoder options. Specify `0` to encode on the main thread.\n * @experimental\n */\n public constructor(numWorkersOrOptions: number | IKhronosTextureContainer2EncoderOptions = KhronosTextureContainer2Encoder.DefaultNumWorkers) {\n const options = typeof numWorkersOrOptions === \"number\" ? { numWorkers: numWorkersOrOptions } : numWorkersOrOptions;\n this._workerPool = options.workerPool ?? KhronosTextureContainer2Encoder.WorkerPool;\n if (this._workerPool) {\n return;\n }\n const numWorkers = options.numWorkers ?? KhronosTextureContainer2Encoder.DefaultNumWorkers;\n if (!Number.isInteger(numWorkers) || numWorkers < 0) {\n throw new Error(\"KTX2 encoder numWorkers must be a non-negative integer.\");\n }\n const dependencies = options.binariesAndModulesContainer;\n if (UsesWorkers(numWorkers) && (dependencies?.jsEncoderModule || dependencies?.jsBasisEncoder)) {\n throw new Error(\"KTX2 encoder JavaScript modules cannot be sent to automatic workers. Use numWorkers: 0 or a prepared workerPool.\");\n }\n KhronosTextureContainer2Encoder._Initialize(numWorkers, dependencies);\n }\n\n /**\n * Encodes level zero of a 2D unsigned byte texture to a top-down KTX2 image.\n * flipY and mipmap generation are derived from the texture. Texture UV transforms are not baked into the image.\n * Cancellation rejects promptly; an active worker finishes its encode before taking more work, and main-thread encoding is cooperative.\n * @param texture Source texture. Dimensions must be multiples of 4 from 4 through 16,384, with at most 12,582,912 pixels.\n * @param options Encoding options and an optional cancellation signal.\n * @returns KTX2 file bytes.\n * @internal\n */\n public async _encodeAsync(texture: BaseTexture, options: Omit<IKTX2EncoderOptions, \"flipY\" | \"generateMipmaps\"> & { signal?: AbortSignal }): Promise<Uint8Array> {\n const { signal, ...requestedOptions } = options;\n if (signal?.aborted) {\n throw AbortError();\n }\n const workerPoolPromise = this._workerPool ? Promise.resolve(this._workerPool) : KhronosTextureContainer2Encoder._WorkerPoolPromise;\n const settings = KhronosTextureContainer2Encoder._MainThreadSettings;\n if (!workerPoolPromise && !settings) {\n throw new Error(\"KTX2 encoder is not initialized.\");\n }\n ValidateTexture(texture, true);\n await WithAbortAsync(async (abortSignal) => await WhenTextureReadyAsync(texture, abortSignal), signal);\n ValidateTexture(texture, false);\n const { width, height } = texture.getSize();\n const readback = await WithAbortAsync(async () => await GetTextureDataAsync(texture, width, height, 0, 0, false, 0, false), signal);\n const rgba = readback.buffer instanceof ArrayBuffer ? readback : readback.slice();\n // WebGPU reads BGRA textures back in storage order.\n if (texture.textureFormat === Constants.TEXTUREFORMAT_BGRA && texture.getInternalTexture()?.getEngine().isWebGPU) {\n for (let index = 0; index < rgba.length; index += 4) {\n const blue = rgba[index];\n rgba[index] = rgba[index + 2];\n rgba[index + 2] = blue;\n }\n }\n const encodingOptions: IKTX2EncoderOptions = {\n ...requestedOptions,\n generateMipmaps: !texture.noMipmap && (texture.getInternalTexture()?.generateMipMaps ?? true),\n flipY: _GetKTX2TextureFlipY(texture),\n };\n if (workerPoolPromise) {\n return await KhronosTextureContainer2Encoder._EncodeOnWorkerAsync(await workerPoolPromise, rgba, width, height, encodingOptions, signal);\n }\n return await KhronosTextureContainer2Encoder._EncodeOnMainThreadAsync(settings!, rgba, width, height, encodingOptions, signal);\n }\n\n private static async _EncodeOnWorkerAsync(\n workerPool: AutoReleaseWorkerPool,\n rgba: Uint8Array,\n width: number,\n height: number,\n options: IKTX2EncoderOptions,\n signal: AbortSignal | undefined\n ): Promise<Uint8Array> {\n return await new Promise<Uint8Array>((resolve, reject) => {\n let settled = false;\n const onAbort = () => settle(() => reject(AbortError()));\n const settle = (complete: () => void) => {\n if (!settled) {\n settled = true;\n signal?.removeEventListener(\"abort\", onAbort);\n complete();\n }\n };\n if (signal?.aborted) {\n onAbort();\n return;\n }\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n workerPool.push((worker, onComplete) => {\n if (settled) {\n onComplete();\n return;\n }\n void (async () => {\n try {\n await EnsureWorkerReadyAsync(worker);\n if (!settled) {\n const defaults = KhronosTextureContainer2Encoder.DefaultEncoderOptions._getKTX2EncoderOptions();\n try {\n AutomaticWorkers.get(worker)?.failure.signal.throwIfAborted();\n worker.postMessage({ action: \"setDefaultEncoderOptions\", options: defaults });\n } catch (error) {\n AutomaticWorkers.get(worker)?.fail(ToError(error));\n throw error;\n }\n const reply = await PostRequestAsync(worker, { action: \"encode\", id: NextRequestId++, rgba, width, height, options }, [rgba.buffer as ArrayBuffer]);\n if (reply.action !== \"encoded\") {\n throw new Error(\"KTX2 encoder worker sent an unexpected reply.\");\n }\n settle(() => resolve(reply.data));\n }\n } catch (error) {\n settle(() => reject(ToError(error)));\n } finally {\n onComplete();\n }\n })();\n });\n });\n }\n\n private static async _EncodeOnMainThreadAsync(\n settings: IEncoderSettings,\n rgba: Uint8Array,\n width: number,\n height: number,\n options: IKTX2EncoderOptions,\n signal: AbortSignal | undefined\n ): Promise<Uint8Array> {\n const { module, encoder } = await WithAbortAsync(async () => {\n const initialization = (KhronosTextureContainer2Encoder._MainThreadEncoderPromise ??= KhronosTextureContainer2Encoder._CreateMainThreadEncoderAsync(settings));\n try {\n return await initialization;\n } catch (error) {\n if (KhronosTextureContainer2Encoder._MainThreadEncoderPromise === initialization) {\n KhronosTextureContainer2Encoder._MainThreadEncoderPromise = undefined;\n }\n throw error;\n }\n }, signal);\n return await WithAbortAsync(async (abortSignal) => {\n return await KhronosTextureContainer2Encoder._MainThreadLock.lockAsync(async () => {\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n abortSignal.throwIfAborted();\n const defaults = module.KTX2Encoder.DefaultEncoderOptions;\n let encoding: Promise<Uint8Array>;\n try {\n module.KTX2Encoder.DefaultEncoderOptions = KhronosTextureContainer2Encoder.DefaultEncoderOptions._getKTX2EncoderOptions();\n encoding = encoder.encode(rgba, width, height, options);\n } finally {\n module.KTX2Encoder.DefaultEncoderOptions = defaults;\n }\n return await encoding;\n }, abortSignal);\n }, signal);\n }\n}\n"]}
|