@babylonjs/core 8.8.0 → 8.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Actions/actionManager.js +2 -0
- package/Actions/actionManager.js.map +1 -1
- package/Animations/animatable.core.js +1 -1
- package/Animations/animatable.core.js.map +1 -1
- package/Animations/animation.js +4 -2
- package/Animations/animation.js.map +1 -1
- package/Audio/audioEngine.d.ts +1 -1
- package/Audio/audioEngine.js +20 -10
- package/Audio/audioEngine.js.map +1 -1
- package/Audio/audioSceneComponent.js +2 -0
- package/Audio/audioSceneComponent.js.map +1 -1
- package/Audio/sound.js +2 -0
- package/Audio/sound.js.map +1 -1
- package/AudioV2/abstractAudio/audioEngineV2.js +8 -1
- package/AudioV2/abstractAudio/audioEngineV2.js.map +1 -1
- package/AudioV2/abstractAudio/streamingSound.js +3 -1
- package/AudioV2/abstractAudio/streamingSound.js.map +1 -1
- package/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.js +6 -2
- package/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.js.map +1 -1
- package/AudioV2/abstractAudio/subProperties/audioAnalyzer.js +3 -0
- package/AudioV2/abstractAudio/subProperties/audioAnalyzer.js.map +1 -1
- package/AudioV2/abstractAudio/subProperties/spatialAudio.js +1 -0
- package/AudioV2/abstractAudio/subProperties/spatialAudio.js.map +1 -1
- package/AudioV2/webAudio/webAudioEngine.js +5 -1
- package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
- package/AudioV2/webAudio/webAudioStaticSound.js +2 -0
- package/AudioV2/webAudio/webAudioStaticSound.js.map +1 -1
- package/AudioV2/webAudio/webAudioStreamingSound.js +3 -0
- package/AudioV2/webAudio/webAudioStreamingSound.js.map +1 -1
- package/AudioV2/webAudio/webAudioUnmuteUI.js +1 -0
- package/AudioV2/webAudio/webAudioUnmuteUI.js.map +1 -1
- package/BakedVertexAnimation/vertexAnimationBaker.d.ts +1 -0
- package/BakedVertexAnimation/vertexAnimationBaker.js +3 -1
- package/BakedVertexAnimation/vertexAnimationBaker.js.map +1 -1
- package/Buffers/buffer.nonFloatVertexBuffers.js +1 -0
- package/Buffers/buffer.nonFloatVertexBuffers.js.map +1 -1
- package/Buffers/storageBuffer.js +1 -1
- package/Buffers/storageBuffer.js.map +1 -1
- package/Cameras/Inputs/arcRotateCameraVRDeviceOrientationInput.js +2 -0
- package/Cameras/Inputs/arcRotateCameraVRDeviceOrientationInput.js.map +1 -1
- package/Cameras/Inputs/freeCameraDeviceOrientationInput.js +6 -1
- package/Cameras/Inputs/freeCameraDeviceOrientationInput.js.map +1 -1
- package/Cameras/VR/vrExperienceHelper.js +2 -0
- package/Cameras/VR/vrExperienceHelper.js.map +1 -1
- package/Collisions/gpuPicker.js +9 -6
- package/Collisions/gpuPicker.js.map +1 -1
- package/Compute/computeShader.js +1 -1
- package/Compute/computeShader.js.map +1 -1
- package/Culling/Helper/boundingInfoHelper.js +3 -3
- package/Culling/Helper/boundingInfoHelper.js.map +1 -1
- package/Culling/Helper/computeShaderBoundingHelper.js +3 -1
- package/Culling/Helper/computeShaderBoundingHelper.js.map +1 -1
- package/Culling/Helper/transformFeedbackBoundingHelper.js +3 -0
- package/Culling/Helper/transformFeedbackBoundingHelper.js.map +1 -1
- package/Debug/debugLayer.js +1 -1
- package/Debug/debugLayer.js.map +1 -1
- package/Engines/AbstractEngine/abstractEngine.cubeTexture.js +1 -0
- package/Engines/AbstractEngine/abstractEngine.cubeTexture.js.map +1 -1
- package/Engines/Extensions/engine.prefilteredCubeTexture.js +1 -0
- package/Engines/Extensions/engine.prefilteredCubeTexture.js.map +1 -1
- package/Engines/Extensions/engine.readTexture.js +1 -0
- package/Engines/Extensions/engine.readTexture.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.computeShader.js +1 -0
- package/Engines/WebGPU/Extensions/engine.computeShader.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.readTexture.js +1 -0
- package/Engines/WebGPU/Extensions/engine.readTexture.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.videoTexture.js +2 -0
- package/Engines/WebGPU/Extensions/engine.videoTexture.js.map +1 -1
- package/Engines/WebGPU/webgpuBufferManager.js +3 -1
- package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
- package/Engines/WebGPU/webgpuOcclusionQuery.js +1 -0
- package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
- package/Engines/WebGPU/webgpuQuerySet.js +15 -9
- package/Engines/WebGPU/webgpuQuerySet.js.map +1 -1
- package/Engines/WebGPU/webgpuTextureManager.js +1 -0
- package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
- package/Engines/WebGPU/webgpuTimestampQuery.js +4 -2
- package/Engines/WebGPU/webgpuTimestampQuery.js.map +1 -1
- package/Engines/WebGPU/webgpuTintWASM.js +1 -0
- package/Engines/WebGPU/webgpuTintWASM.js.map +1 -1
- package/Engines/abstractEngine.js +5 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/constants.d.ts +23 -0
- package/Engines/constants.js +23 -0
- package/Engines/constants.js.map +1 -1
- package/Engines/engine.common.js +7 -1
- package/Engines/engine.common.js.map +1 -1
- package/Engines/engine.js +5 -3
- package/Engines/engine.js.map +1 -1
- package/Engines/engineFactory.js +1 -1
- package/Engines/engineFactory.js.map +1 -1
- package/Engines/nativeEngine.js +19 -11
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/thinEngine.d.ts +1 -0
- package/Engines/thinEngine.js +22 -18
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.js +30 -11
- package/Engines/webgpuEngine.js.map +1 -1
- package/FlowGraph/flowGraphParser.js +2 -2
- package/FlowGraph/flowGraphParser.js.map +1 -1
- package/FrameGraph/Node/nodeRenderGraph.js +5 -1
- package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
- package/FrameGraph/Node/nodeRenderGraphBlock.js +1 -1
- package/FrameGraph/Node/nodeRenderGraphBlock.js.map +1 -1
- package/FrameGraph/frameGraph.js +1 -1
- package/FrameGraph/frameGraph.js.map +1 -1
- package/Helpers/sceneHelpers.js +1 -3
- package/Helpers/sceneHelpers.js.map +1 -1
- package/Helpers/videoDome.js +1 -0
- package/Helpers/videoDome.js.map +1 -1
- package/Layers/thinEffectLayer.js +1 -0
- package/Layers/thinEffectLayer.js.map +1 -1
- package/LensFlares/lensFlareSystem.js +1 -0
- package/LensFlares/lensFlareSystem.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.js +3 -2
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Lights/areaLight.js +2 -0
- package/Lights/areaLight.js.map +1 -1
- package/Loading/sceneLoader.js +56 -22
- package/Loading/sceneLoader.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.d.ts +15 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +34 -7
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
- package/Materials/Node/Blocks/Dual/clipPlanesBlock.js +1 -0
- package/Materials/Node/Blocks/Dual/clipPlanesBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/fogBlock.js +1 -0
- package/Materials/Node/Blocks/Dual/fogBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/lightBlock.js +1 -0
- package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js +1 -0
- package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js +1 -0
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js +1 -0
- package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/shadowMapBlock.js +1 -0
- package/Materials/Node/Blocks/Fragment/shadowMapBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +9 -11
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/sheenBlock.js +1 -1
- package/Materials/Node/Blocks/PBR/sheenBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/subSurfaceBlock.js +6 -2
- package/Materials/Node/Blocks/PBR/subSurfaceBlock.js.map +1 -1
- package/Materials/Node/Blocks/Vertex/bonesBlock.js +1 -0
- package/Materials/Node/Blocks/Vertex/bonesBlock.js.map +1 -1
- package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js +1 -0
- package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.js +11 -3
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/Node/nodeMaterialBuildState.js +1 -0
- package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
- package/Materials/PBR/pbrBRDFConfiguration.d.ts +11 -0
- package/Materials/PBR/pbrBRDFConfiguration.js +16 -0
- package/Materials/PBR/pbrBRDFConfiguration.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.d.ts +4 -0
- package/Materials/PBR/pbrBaseMaterial.js +12 -8
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/PBR/pbrMaterial.d.ts +8 -0
- package/Materials/PBR/pbrMaterial.js +16 -0
- package/Materials/PBR/pbrMaterial.js.map +1 -1
- package/Materials/Textures/Filtering/hdrIrradianceFiltering.js +1 -0
- package/Materials/Textures/Filtering/hdrIrradianceFiltering.js.map +1 -1
- package/Materials/Textures/Loaders/basisTextureLoader.js +4 -0
- package/Materials/Textures/Loaders/basisTextureLoader.js.map +1 -1
- package/Materials/Textures/Loaders/envTextureLoader.js +1 -0
- package/Materials/Textures/Loaders/envTextureLoader.js.map +1 -1
- package/Materials/Textures/Loaders/exrTextureLoader.js +2 -0
- package/Materials/Textures/Loaders/exrTextureLoader.js.map +1 -1
- package/Materials/Textures/Loaders/ktxTextureLoader.js +1 -0
- package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
- package/Materials/Textures/Loaders/textureLoaderManager.js +9 -9
- package/Materials/Textures/Loaders/textureLoaderManager.js.map +1 -1
- package/Materials/Textures/Packer/packer.js +3 -1
- package/Materials/Textures/Packer/packer.js.map +1 -1
- package/Materials/Textures/Procedurals/proceduralTexture.js +1 -0
- package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
- package/Materials/Textures/baseTexture.polynomial.js +1 -0
- package/Materials/Textures/baseTexture.polynomial.js.map +1 -1
- package/Materials/Textures/hdrCubeTexture.js +1 -0
- package/Materials/Textures/hdrCubeTexture.js.map +1 -1
- package/Materials/Textures/internalTexture.js +1 -0
- package/Materials/Textures/internalTexture.js.map +1 -1
- package/Materials/Textures/rawCubeTexture.js +3 -0
- package/Materials/Textures/rawCubeTexture.js.map +1 -1
- package/Materials/Textures/renderTargetTexture.js +2 -0
- package/Materials/Textures/renderTargetTexture.js.map +1 -1
- package/Materials/Textures/videoTexture.js +6 -0
- package/Materials/Textures/videoTexture.js.map +1 -1
- package/Materials/effect.js +2 -1
- package/Materials/effect.js.map +1 -1
- package/Materials/effect.webgl.functions.js +3 -1
- package/Materials/effect.webgl.functions.js.map +1 -1
- package/Materials/effectRenderer.js +1 -0
- package/Materials/effectRenderer.js.map +1 -1
- package/Materials/material.js +2 -1
- package/Materials/material.js.map +1 -1
- package/Materials/shaderMaterial.js +4 -2
- package/Materials/shaderMaterial.js.map +1 -1
- package/Meshes/Compression/dracoCodec.js +5 -1
- package/Meshes/Compression/dracoCodec.js.map +1 -1
- package/Meshes/Compression/dracoCompression.js +4 -3
- package/Meshes/Compression/dracoCompression.js.map +1 -1
- package/Meshes/Compression/dracoCompressionWorker.js +5 -2
- package/Meshes/Compression/dracoCompressionWorker.js.map +1 -1
- package/Meshes/Compression/dracoDecoder.js +5 -1
- package/Meshes/Compression/dracoDecoder.js.map +1 -1
- package/Meshes/Compression/dracoEncoder.js +3 -2
- package/Meshes/Compression/dracoEncoder.js.map +1 -1
- package/Meshes/Compression/meshoptCompression.js +18 -18
- package/Meshes/Compression/meshoptCompression.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +14 -15
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Meshes/Node/Blocks/Textures/geometryTextureBlock.js +20 -10
- package/Meshes/Node/Blocks/Textures/geometryTextureBlock.js.map +1 -1
- package/Meshes/Node/Blocks/booleanGeometryBlock.js +1 -0
- package/Meshes/Node/Blocks/booleanGeometryBlock.js.map +1 -1
- package/Meshes/Node/nodeGeometry.js +5 -1
- package/Meshes/Node/nodeGeometry.js.map +1 -1
- package/Meshes/mesh.js +2 -2
- package/Meshes/mesh.js.map +1 -1
- package/Meshes/meshUVSpaceRenderer.js +1 -0
- package/Meshes/meshUVSpaceRenderer.js.map +1 -1
- package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js +1 -0
- package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js.map +1 -1
- package/Misc/assetsManager.js +2 -1
- package/Misc/assetsManager.js.map +1 -1
- package/Misc/asyncLock.js +5 -2
- package/Misc/asyncLock.js.map +1 -1
- package/Misc/basis.js +9 -2
- package/Misc/basis.js.map +1 -1
- package/Misc/basisWorker.js +3 -1
- package/Misc/basisWorker.js.map +1 -1
- package/Misc/copyTextureToTexture.js +1 -0
- package/Misc/copyTextureToTexture.js.map +1 -1
- package/Misc/coroutine.js +2 -1
- package/Misc/coroutine.js.map +1 -1
- package/Misc/dataReader.js +3 -4
- package/Misc/dataReader.js.map +1 -1
- package/Misc/dumpTools.js +7 -1
- package/Misc/dumpTools.js.map +1 -1
- package/Misc/environmentTextureTools.d.ts +0 -2
- package/Misc/environmentTextureTools.js +20 -7
- package/Misc/environmentTextureTools.js.map +1 -1
- package/Misc/equirectangularCapture.js +2 -1
- package/Misc/equirectangularCapture.js.map +1 -1
- package/Misc/fileTools.js +2 -0
- package/Misc/fileTools.js.map +1 -1
- package/Misc/filesInput.js +5 -1
- package/Misc/filesInput.js.map +1 -1
- package/Misc/khronosTextureContainer2.js +10 -3
- package/Misc/khronosTextureContainer2.js.map +1 -1
- package/Misc/khronosTextureContainer2Worker.js +4 -1
- package/Misc/khronosTextureContainer2Worker.js.map +1 -1
- package/Misc/minMaxReducer.js +1 -0
- package/Misc/minMaxReducer.js.map +1 -1
- package/Misc/observable.extensions.js +3 -1
- package/Misc/observable.extensions.js.map +1 -1
- package/Misc/observable.js +2 -0
- package/Misc/observable.js.map +1 -1
- package/Misc/observableCoroutine.js +1 -0
- package/Misc/observableCoroutine.js.map +1 -1
- package/Misc/reflector.js +1 -0
- package/Misc/reflector.js.map +1 -1
- package/Misc/rgbdTextureTools.js +2 -1
- package/Misc/rgbdTextureTools.js.map +1 -1
- package/Misc/sceneSerializer.js +2 -2
- package/Misc/sceneSerializer.js.map +1 -1
- package/Misc/screenshotTools.js +9 -4
- package/Misc/screenshotTools.js.map +1 -1
- package/Misc/textureTools.js +2 -0
- package/Misc/textureTools.js.map +1 -1
- package/Misc/tools.internals.js +2 -1
- package/Misc/tools.internals.js.map +1 -1
- package/Misc/tools.js +9 -3
- package/Misc/tools.js.map +1 -1
- package/Misc/videoRecorder.js +1 -0
- package/Misc/videoRecorder.js.map +1 -1
- package/Misc/webRequest.fetch.js +2 -1
- package/Misc/webRequest.fetch.js.map +1 -1
- package/Misc/workerPool.js +3 -0
- package/Misc/workerPool.js.map +1 -1
- package/Particles/flowMap.js +1 -1
- package/Particles/flowMap.js.map +1 -1
- package/Particles/particleHelper.js +7 -0
- package/Particles/particleHelper.js.map +1 -1
- package/Particles/pointsCloudSystem.js +7 -7
- package/Particles/pointsCloudSystem.js.map +1 -1
- package/Particles/thinParticleSystem.js +2 -0
- package/Particles/thinParticleSystem.js.map +1 -1
- package/Physics/physicsHelper.js +2 -2
- package/Physics/physicsHelper.js.map +1 -1
- package/Physics/v1/Plugins/oimoJSPlugin.js +1 -1
- package/Physics/v1/Plugins/oimoJSPlugin.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
- package/Rendering/GlobalIllumination/giRSMManager.js +1 -0
- package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +1 -0
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
- package/Rendering/depthRenderer.js +1 -0
- package/Rendering/depthRenderer.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +3 -1
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingTextures.js.map +1 -1
- package/Rendering/geometryBufferRenderer.js +1 -0
- package/Rendering/geometryBufferRenderer.js.map +1 -1
- package/Rendering/iblCdfGenerator.js +4 -1
- package/Rendering/iblCdfGenerator.js.map +1 -1
- package/Shaders/ShadersInclude/lightFragment.js +5 -1
- package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBRDFFunctions.js +12 -5
- package/Shaders/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockDirectLighting.js +3 -0
- package/Shaders/ShadersInclude/pbrBlockDirectLighting.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js +21 -8
- package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents.js +3 -0
- package/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockReflectance.js +6 -6
- package/Shaders/ShadersInclude/pbrBlockReflectance.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockReflectance0.js +2 -7
- package/Shaders/ShadersInclude/pbrBlockReflectance0.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockReflectivity.js +20 -16
- package/Shaders/ShadersInclude/pbrBlockReflectivity.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockSubSurface.js +6 -8
- package/Shaders/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
- package/Shaders/ShadersInclude/pbrDebug.js +2 -2
- package/Shaders/ShadersInclude/pbrDebug.js.map +1 -1
- package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +1 -5
- package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
- package/Shaders/pbr.fragment.js +7 -3
- package/Shaders/pbr.fragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightFragment.js +5 -1
- package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js +5 -5
- package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockDirectLighting.js +3 -0
- package/ShadersWGSL/ShadersInclude/pbrBlockDirectLighting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js +21 -8
- package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents.js +3 -0
- package/ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js +6 -6
- package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockReflectance0.js +2 -7
- package/ShadersWGSL/ShadersInclude/pbrBlockReflectance0.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.js +22 -15
- package/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js +6 -8
- package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDebug.js +2 -2
- package/ShadersWGSL/ShadersInclude/pbrDebug.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +1 -7
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
- package/ShadersWGSL/pbr.fragment.js +7 -3
- package/ShadersWGSL/pbr.fragment.js.map +1 -1
- package/Sprites/spriteManager.js +5 -1
- package/Sprites/spriteManager.js.map +1 -1
- package/Sprites/spriteRenderer.js +1 -0
- package/Sprites/spriteRenderer.js.map +1 -1
- package/XR/features/WebXRAnchorSystem.js +4 -3
- package/XR/features/WebXRAnchorSystem.js.map +1 -1
- package/XR/features/WebXRDepthSensing.js +1 -1
- package/XR/features/WebXRDepthSensing.js.map +1 -1
- package/XR/features/WebXRHandTracking.js +4 -1
- package/XR/features/WebXRHandTracking.js.map +1 -1
- package/XR/features/WebXRHitTest.js +4 -1
- package/XR/features/WebXRHitTest.js.map +1 -1
- package/XR/features/WebXRHitTestLegacy.js +6 -5
- package/XR/features/WebXRHitTestLegacy.js.map +1 -1
- package/XR/features/WebXRImageTracking.js +2 -1
- package/XR/features/WebXRImageTracking.js.map +1 -1
- package/XR/features/WebXRLightEstimation.js +3 -0
- package/XR/features/WebXRLightEstimation.js.map +1 -1
- package/XR/features/WebXRNearInteraction.js +2 -0
- package/XR/features/WebXRNearInteraction.js.map +1 -1
- package/XR/features/WebXRPlaneDetector.js +2 -2
- package/XR/features/WebXRPlaneDetector.js.map +1 -1
- package/XR/motionController/webXRAbstractMotionController.js +3 -2
- package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
- package/XR/motionController/webXRMicrosoftMixedRealityController.js +6 -6
- package/XR/motionController/webXRMicrosoftMixedRealityController.js.map +1 -1
- package/XR/motionController/webXRMotionControllerManager.js +15 -9
- package/XR/motionController/webXRMotionControllerManager.js.map +1 -1
- package/XR/motionController/webXRProfiledMotionController.js +1 -1
- package/XR/motionController/webXRProfiledMotionController.js.map +1 -1
- package/XR/native/nativeXRFrame.js +1 -0
- package/XR/native/nativeXRFrame.js.map +1 -1
- package/XR/webXRDefaultExperience.js +10 -12
- package/XR/webXRDefaultExperience.js.map +1 -1
- package/XR/webXREnterExitUI.js +2 -1
- package/XR/webXREnterExitUI.js.map +1 -1
- package/XR/webXRExperienceHelper.js +5 -2
- package/XR/webXRExperienceHelper.js.map +1 -1
- package/XR/webXRFeaturesManager.js +1 -0
- package/XR/webXRFeaturesManager.js.map +1 -1
- package/XR/webXRInput.js +1 -0
- package/XR/webXRInput.js.map +1 -1
- package/XR/webXRInputSource.js +2 -0
- package/XR/webXRInputSource.js.map +1 -1
- package/XR/webXRManagedOutputCanvas.js +5 -1
- package/XR/webXRManagedOutputCanvas.js.map +1 -1
- package/XR/webXRSessionManager.js +56 -60
- package/XR/webXRSessionManager.js.map +1 -1
- package/assetContainer.js +28 -28
- package/assetContainer.js.map +1 -1
- package/package.json +1 -1
- package/scene.js +5 -4
- package/scene.js.map +1 -1
|
@@ -99,7 +99,7 @@ export class WebXRImageTracking extends WebXRAbstractFeature {
|
|
|
99
99
|
}
|
|
100
100
|
const promises = this.options.images.map(async (image) => {
|
|
101
101
|
if (typeof image.src === "string") {
|
|
102
|
-
return this._xrSessionManager.scene.getEngine()._createImageBitmapFromSource(image.src);
|
|
102
|
+
return await this._xrSessionManager.scene.getEngine()._createImageBitmapFromSource(image.src);
|
|
103
103
|
}
|
|
104
104
|
else {
|
|
105
105
|
return image.src;
|
|
@@ -129,6 +129,7 @@ export class WebXRImageTracking extends WebXRAbstractFeature {
|
|
|
129
129
|
// Image tracking scores may be generated a few frames after the XR Session initializes.
|
|
130
130
|
// If we haven't received scores yet, then kick off the task to check scores and return immediately.
|
|
131
131
|
if (this._trackableScoreStatus === ImageTrackingScoreStatus.NotReceived) {
|
|
132
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
132
133
|
this._checkScoresAsync();
|
|
133
134
|
return;
|
|
134
135
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRImageTracking.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRImageTracking.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { Matrix } from \"../../Maths/math.vector\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport type { Engine } from \"../../Engines/engine\";\r\n\r\n/**\r\n * Options interface for the background remover plugin\r\n */\r\nexport interface IWebXRImageTrackingOptions {\r\n /**\r\n * A required array with images to track\r\n */\r\n images: {\r\n /**\r\n * The source of the image. can be a URL or an image bitmap\r\n */\r\n src: string | ImageBitmap;\r\n /**\r\n * The estimated width in the real world (in meters)\r\n */\r\n estimatedRealWorldWidth: number; // In meters!\r\n }[];\r\n}\r\n\r\n/**\r\n * An object representing an image tracked by the system\r\n */\r\nexport interface IWebXRTrackedImage {\r\n /**\r\n * The ID of this image (which is the same as the position in the array that was used to initialize the feature)\r\n */\r\n id: number;\r\n /**\r\n * Is the transformation provided emulated. If it is, the system \"guesses\" its real position. Otherwise it can be considered as exact position.\r\n */\r\n emulated?: boolean;\r\n /**\r\n * Just in case it is needed - the image bitmap that is being tracked\r\n */\r\n originalBitmap: ImageBitmap;\r\n /**\r\n * The native XR result image tracking result, untouched\r\n */\r\n xrTrackingResult?: XRImageTrackingResult;\r\n /**\r\n * Width in real world (meters)\r\n */\r\n realWorldWidth?: number;\r\n /**\r\n * A transformation matrix of this current image in the current reference space.\r\n */\r\n transformationMatrix: Matrix;\r\n /**\r\n * The width/height ratio of this image. can be used to calculate the size of the detected object/image\r\n */\r\n ratio?: number;\r\n}\r\n\r\n/**\r\n * Enum that describes the state of the image trackability score status for this session.\r\n */\r\nenum ImageTrackingScoreStatus {\r\n // AR Session has not yet assessed image trackability scores.\r\n NotReceived,\r\n // A request to retrieve trackability scores has been sent, but no response has been received.\r\n Waiting,\r\n // Image trackability scores have been received for this session\r\n Received,\r\n}\r\n\r\n/**\r\n * Image tracking for immersive AR sessions.\r\n * Providing a list of images and their estimated widths will enable tracking those images in the real world.\r\n */\r\nexport class WebXRImageTracking extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.IMAGE_TRACKING;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /**\r\n * This will be triggered if the underlying system deems an image untrackable.\r\n * The index is the index of the image from the array used to initialize the feature.\r\n */\r\n public onUntrackableImageFoundObservable: Observable<number> = new Observable();\r\n /**\r\n * An image was deemed trackable, and the system will start tracking it.\r\n */\r\n public onTrackableImageFoundObservable: Observable<IWebXRTrackedImage> = new Observable();\r\n /**\r\n * The image was found and its state was updated.\r\n */\r\n public onTrackedImageUpdatedObservable: Observable<IWebXRTrackedImage> = new Observable();\r\n\r\n private _trackableScoreStatus: ImageTrackingScoreStatus = ImageTrackingScoreStatus.NotReceived;\r\n private _trackedImages: IWebXRTrackedImage[] = [];\r\n\r\n private _originalTrackingRequest: XRTrackedImageInit[];\r\n\r\n /**\r\n * constructs the image tracking feature\r\n * @param _xrSessionManager the session manager for this module\r\n * @param options read-only options to be used in this module\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /**\r\n * read-only options to be used in this module\r\n */\r\n public readonly options: IWebXRImageTrackingOptions\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"image-tracking\";\r\n }\r\n\r\n /**\r\n * attach this feature\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public override attach(): boolean {\r\n return super.attach();\r\n }\r\n\r\n /**\r\n * detach this feature.\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public override detach(): boolean {\r\n return super.detach();\r\n }\r\n\r\n /**\r\n * Get a tracked image by its ID.\r\n *\r\n * @param id the id of the image to load (position in the init array)\r\n * @returns a trackable image, if exists in this location\r\n */\r\n public getTrackedImageById(id: number): Nullable<IWebXRTrackedImage> {\r\n return this._trackedImages[id] || null;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n for (const trackedImage of this._trackedImages) {\r\n trackedImage.originalBitmap.close();\r\n }\r\n this._trackedImages.length = 0;\r\n this.onTrackableImageFoundObservable.clear();\r\n this.onUntrackableImageFoundObservable.clear();\r\n this.onTrackedImageUpdatedObservable.clear();\r\n }\r\n\r\n /**\r\n * Extends the session init object if needed\r\n * @returns augmentation object fo the xr session init object.\r\n */\r\n public async getXRSessionInitExtension(): Promise<Partial<XRSessionInit>> {\r\n if (!this.options.images || !this.options.images.length) {\r\n return {};\r\n }\r\n const promises = this.options.images.map(async (image) => {\r\n if (typeof image.src === \"string\") {\r\n return (this._xrSessionManager.scene.getEngine() as Engine)._createImageBitmapFromSource(image.src);\r\n } else {\r\n return image.src;\r\n }\r\n });\r\n\r\n try {\r\n const images = await Promise.all(promises);\r\n\r\n this._originalTrackingRequest = images.map((image, idx) => {\r\n return {\r\n image,\r\n widthInMeters: this.options.images[idx].estimatedRealWorldWidth,\r\n };\r\n });\r\n\r\n return {\r\n trackedImages: this._originalTrackingRequest,\r\n };\r\n } catch (ex) {\r\n Tools.Error(\"Error loading images for tracking, WebXRImageTracking disabled for this session.\");\r\n return {};\r\n }\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame) {\r\n if (!_xrFrame.getImageTrackingResults || this._trackableScoreStatus === ImageTrackingScoreStatus.Waiting) {\r\n return;\r\n }\r\n\r\n // Image tracking scores may be generated a few frames after the XR Session initializes.\r\n // If we haven't received scores yet, then kick off the task to check scores and return immediately.\r\n if (this._trackableScoreStatus === ImageTrackingScoreStatus.NotReceived) {\r\n this._checkScoresAsync();\r\n return;\r\n }\r\n\r\n const imageTrackedResults = _xrFrame.getImageTrackingResults();\r\n for (const result of imageTrackedResults) {\r\n let changed = false;\r\n const imageIndex = result.index;\r\n\r\n const imageObject = this._trackedImages[imageIndex];\r\n if (!imageObject) {\r\n // something went wrong!\r\n continue;\r\n }\r\n\r\n imageObject.xrTrackingResult = result;\r\n if (imageObject.realWorldWidth !== result.measuredWidthInMeters) {\r\n imageObject.realWorldWidth = result.measuredWidthInMeters;\r\n changed = true;\r\n }\r\n\r\n // Get the pose of the image relative to a reference space.\r\n const pose = _xrFrame.getPose(result.imageSpace, this._xrSessionManager.referenceSpace);\r\n\r\n if (pose) {\r\n const mat = imageObject.transformationMatrix;\r\n Matrix.FromArrayToRef(pose.transform.matrix, 0, mat);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n mat.toggleModelMatrixHandInPlace();\r\n }\r\n changed = true;\r\n }\r\n\r\n const state = result.trackingState;\r\n const emulated = state === \"emulated\";\r\n\r\n if (imageObject.emulated !== emulated) {\r\n imageObject.emulated = emulated;\r\n changed = true;\r\n }\r\n if (changed) {\r\n this.onTrackedImageUpdatedObservable.notifyObservers(imageObject);\r\n }\r\n }\r\n }\r\n\r\n private async _checkScoresAsync(): Promise<void> {\r\n if (!this._xrSessionManager.session.getTrackedImageScores || this._trackableScoreStatus !== ImageTrackingScoreStatus.NotReceived) {\r\n return;\r\n }\r\n\r\n this._trackableScoreStatus = ImageTrackingScoreStatus.Waiting;\r\n const imageScores = await this._xrSessionManager.session.getTrackedImageScores();\r\n if (!imageScores || imageScores.length === 0) {\r\n this._trackableScoreStatus = ImageTrackingScoreStatus.NotReceived;\r\n return;\r\n }\r\n\r\n // check the scores for all\r\n for (let idx = 0; idx < imageScores.length; ++idx) {\r\n if (imageScores[idx] == \"untrackable\") {\r\n this.onUntrackableImageFoundObservable.notifyObservers(idx);\r\n } else {\r\n const originalBitmap = this._originalTrackingRequest[idx].image;\r\n const imageObject: IWebXRTrackedImage = {\r\n id: idx,\r\n originalBitmap,\r\n transformationMatrix: new Matrix(),\r\n ratio: originalBitmap.width / originalBitmap.height,\r\n };\r\n this._trackedImages[idx] = imageObject;\r\n this.onTrackableImageFoundObservable.notifyObservers(imageObject);\r\n }\r\n }\r\n\r\n this._trackableScoreStatus = imageScores.length > 0 ? ImageTrackingScoreStatus.Received : ImageTrackingScoreStatus.NotReceived;\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRImageTracking.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRImageTracking(xrSessionManager, options);\r\n },\r\n WebXRImageTracking.Version,\r\n false\r\n);\r\n"]}
|
|
1
|
+
{"version":3,"file":"WebXRImageTracking.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRImageTracking.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { Matrix } from \"../../Maths/math.vector\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport type { Engine } from \"../../Engines/engine\";\r\n\r\n/**\r\n * Options interface for the background remover plugin\r\n */\r\nexport interface IWebXRImageTrackingOptions {\r\n /**\r\n * A required array with images to track\r\n */\r\n images: {\r\n /**\r\n * The source of the image. can be a URL or an image bitmap\r\n */\r\n src: string | ImageBitmap;\r\n /**\r\n * The estimated width in the real world (in meters)\r\n */\r\n estimatedRealWorldWidth: number; // In meters!\r\n }[];\r\n}\r\n\r\n/**\r\n * An object representing an image tracked by the system\r\n */\r\nexport interface IWebXRTrackedImage {\r\n /**\r\n * The ID of this image (which is the same as the position in the array that was used to initialize the feature)\r\n */\r\n id: number;\r\n /**\r\n * Is the transformation provided emulated. If it is, the system \"guesses\" its real position. Otherwise it can be considered as exact position.\r\n */\r\n emulated?: boolean;\r\n /**\r\n * Just in case it is needed - the image bitmap that is being tracked\r\n */\r\n originalBitmap: ImageBitmap;\r\n /**\r\n * The native XR result image tracking result, untouched\r\n */\r\n xrTrackingResult?: XRImageTrackingResult;\r\n /**\r\n * Width in real world (meters)\r\n */\r\n realWorldWidth?: number;\r\n /**\r\n * A transformation matrix of this current image in the current reference space.\r\n */\r\n transformationMatrix: Matrix;\r\n /**\r\n * The width/height ratio of this image. can be used to calculate the size of the detected object/image\r\n */\r\n ratio?: number;\r\n}\r\n\r\n/**\r\n * Enum that describes the state of the image trackability score status for this session.\r\n */\r\nenum ImageTrackingScoreStatus {\r\n // AR Session has not yet assessed image trackability scores.\r\n NotReceived,\r\n // A request to retrieve trackability scores has been sent, but no response has been received.\r\n Waiting,\r\n // Image trackability scores have been received for this session\r\n Received,\r\n}\r\n\r\n/**\r\n * Image tracking for immersive AR sessions.\r\n * Providing a list of images and their estimated widths will enable tracking those images in the real world.\r\n */\r\nexport class WebXRImageTracking extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.IMAGE_TRACKING;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /**\r\n * This will be triggered if the underlying system deems an image untrackable.\r\n * The index is the index of the image from the array used to initialize the feature.\r\n */\r\n public onUntrackableImageFoundObservable: Observable<number> = new Observable();\r\n /**\r\n * An image was deemed trackable, and the system will start tracking it.\r\n */\r\n public onTrackableImageFoundObservable: Observable<IWebXRTrackedImage> = new Observable();\r\n /**\r\n * The image was found and its state was updated.\r\n */\r\n public onTrackedImageUpdatedObservable: Observable<IWebXRTrackedImage> = new Observable();\r\n\r\n private _trackableScoreStatus: ImageTrackingScoreStatus = ImageTrackingScoreStatus.NotReceived;\r\n private _trackedImages: IWebXRTrackedImage[] = [];\r\n\r\n private _originalTrackingRequest: XRTrackedImageInit[];\r\n\r\n /**\r\n * constructs the image tracking feature\r\n * @param _xrSessionManager the session manager for this module\r\n * @param options read-only options to be used in this module\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /**\r\n * read-only options to be used in this module\r\n */\r\n public readonly options: IWebXRImageTrackingOptions\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"image-tracking\";\r\n }\r\n\r\n /**\r\n * attach this feature\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public override attach(): boolean {\r\n return super.attach();\r\n }\r\n\r\n /**\r\n * detach this feature.\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public override detach(): boolean {\r\n return super.detach();\r\n }\r\n\r\n /**\r\n * Get a tracked image by its ID.\r\n *\r\n * @param id the id of the image to load (position in the init array)\r\n * @returns a trackable image, if exists in this location\r\n */\r\n public getTrackedImageById(id: number): Nullable<IWebXRTrackedImage> {\r\n return this._trackedImages[id] || null;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n for (const trackedImage of this._trackedImages) {\r\n trackedImage.originalBitmap.close();\r\n }\r\n this._trackedImages.length = 0;\r\n this.onTrackableImageFoundObservable.clear();\r\n this.onUntrackableImageFoundObservable.clear();\r\n this.onTrackedImageUpdatedObservable.clear();\r\n }\r\n\r\n /**\r\n * Extends the session init object if needed\r\n * @returns augmentation object fo the xr session init object.\r\n */\r\n public async getXRSessionInitExtension(): Promise<Partial<XRSessionInit>> {\r\n if (!this.options.images || !this.options.images.length) {\r\n return {};\r\n }\r\n const promises = this.options.images.map(async (image) => {\r\n if (typeof image.src === \"string\") {\r\n return await (this._xrSessionManager.scene.getEngine() as Engine)._createImageBitmapFromSource(image.src);\r\n } else {\r\n return image.src;\r\n }\r\n });\r\n\r\n try {\r\n const images = await Promise.all(promises);\r\n\r\n this._originalTrackingRequest = images.map((image, idx) => {\r\n return {\r\n image,\r\n widthInMeters: this.options.images[idx].estimatedRealWorldWidth,\r\n };\r\n });\r\n\r\n return {\r\n trackedImages: this._originalTrackingRequest,\r\n };\r\n } catch (ex) {\r\n Tools.Error(\"Error loading images for tracking, WebXRImageTracking disabled for this session.\");\r\n return {};\r\n }\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame) {\r\n if (!_xrFrame.getImageTrackingResults || this._trackableScoreStatus === ImageTrackingScoreStatus.Waiting) {\r\n return;\r\n }\r\n\r\n // Image tracking scores may be generated a few frames after the XR Session initializes.\r\n // If we haven't received scores yet, then kick off the task to check scores and return immediately.\r\n if (this._trackableScoreStatus === ImageTrackingScoreStatus.NotReceived) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._checkScoresAsync();\r\n return;\r\n }\r\n\r\n const imageTrackedResults = _xrFrame.getImageTrackingResults();\r\n for (const result of imageTrackedResults) {\r\n let changed = false;\r\n const imageIndex = result.index;\r\n\r\n const imageObject = this._trackedImages[imageIndex];\r\n if (!imageObject) {\r\n // something went wrong!\r\n continue;\r\n }\r\n\r\n imageObject.xrTrackingResult = result;\r\n if (imageObject.realWorldWidth !== result.measuredWidthInMeters) {\r\n imageObject.realWorldWidth = result.measuredWidthInMeters;\r\n changed = true;\r\n }\r\n\r\n // Get the pose of the image relative to a reference space.\r\n const pose = _xrFrame.getPose(result.imageSpace, this._xrSessionManager.referenceSpace);\r\n\r\n if (pose) {\r\n const mat = imageObject.transformationMatrix;\r\n Matrix.FromArrayToRef(pose.transform.matrix, 0, mat);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n mat.toggleModelMatrixHandInPlace();\r\n }\r\n changed = true;\r\n }\r\n\r\n const state = result.trackingState;\r\n const emulated = state === \"emulated\";\r\n\r\n if (imageObject.emulated !== emulated) {\r\n imageObject.emulated = emulated;\r\n changed = true;\r\n }\r\n if (changed) {\r\n this.onTrackedImageUpdatedObservable.notifyObservers(imageObject);\r\n }\r\n }\r\n }\r\n\r\n private async _checkScoresAsync(): Promise<void> {\r\n if (!this._xrSessionManager.session.getTrackedImageScores || this._trackableScoreStatus !== ImageTrackingScoreStatus.NotReceived) {\r\n return;\r\n }\r\n\r\n this._trackableScoreStatus = ImageTrackingScoreStatus.Waiting;\r\n const imageScores = await this._xrSessionManager.session.getTrackedImageScores();\r\n if (!imageScores || imageScores.length === 0) {\r\n this._trackableScoreStatus = ImageTrackingScoreStatus.NotReceived;\r\n return;\r\n }\r\n\r\n // check the scores for all\r\n for (let idx = 0; idx < imageScores.length; ++idx) {\r\n if (imageScores[idx] == \"untrackable\") {\r\n this.onUntrackableImageFoundObservable.notifyObservers(idx);\r\n } else {\r\n const originalBitmap = this._originalTrackingRequest[idx].image;\r\n const imageObject: IWebXRTrackedImage = {\r\n id: idx,\r\n originalBitmap,\r\n transformationMatrix: new Matrix(),\r\n ratio: originalBitmap.width / originalBitmap.height,\r\n };\r\n this._trackedImages[idx] = imageObject;\r\n this.onTrackableImageFoundObservable.notifyObservers(imageObject);\r\n }\r\n }\r\n\r\n this._trackableScoreStatus = imageScores.length > 0 ? ImageTrackingScoreStatus.Received : ImageTrackingScoreStatus.NotReceived;\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRImageTracking.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRImageTracking(xrSessionManager, options);\r\n },\r\n WebXRImageTracking.Version,\r\n false\r\n);\r\n"]}
|
|
@@ -97,6 +97,7 @@ export class WebXRLightEstimation extends WebXRAbstractFeature {
|
|
|
97
97
|
this._reflectionCubeMap._texture.isReady = true;
|
|
98
98
|
if (!this.options.disablePreFiltering) {
|
|
99
99
|
this._xrLightProbe.removeEventListener("reflectionchange", this._updateReflectionCubeMap);
|
|
100
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then
|
|
100
101
|
this._hdrFilter.prefilter(this._reflectionCubeMap).then(() => {
|
|
101
102
|
this._xrSessionManager.scene.markAllMaterialsAsDirty(1);
|
|
102
103
|
this.onReflectionCubeMapUpdatedObservable.notifyObservers(this._reflectionCubeMap);
|
|
@@ -168,10 +169,12 @@ export class WebXRLightEstimation extends WebXRAbstractFeature {
|
|
|
168
169
|
}
|
|
169
170
|
const reflectionFormat = this.options.reflectionFormat ?? (this._xrSessionManager.session.preferredReflectionFormat || "srgba8");
|
|
170
171
|
this.options.reflectionFormat = reflectionFormat;
|
|
172
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
171
173
|
this._xrSessionManager.session
|
|
172
174
|
.requestLightProbe({
|
|
173
175
|
reflectionFormat,
|
|
174
176
|
})
|
|
177
|
+
// eslint-disable-next-line github/no-then
|
|
175
178
|
.then((xrLightProbe) => {
|
|
176
179
|
this._xrLightProbe = xrLightProbe;
|
|
177
180
|
if (!this.options.disableCubeMapReflection) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRLightEstimation.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRLightEstimation.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebGLHardwareTexture } from \"../../Engines/WebGL/webGLHardwareTexture\";\r\nimport { InternalTexture, InternalTextureSource } from \"../../Materials/Textures/internalTexture\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { Color3 } from \"../../Maths/math.color\";\r\nimport { Vector3 } from \"../../Maths/math.vector\";\r\nimport { DirectionalLight } from \"../../Lights/directionalLight\";\r\nimport { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport { SphericalHarmonics, SphericalPolynomial } from \"../../Maths/sphericalPolynomial\";\r\nimport { LightConstants } from \"../../Lights/lightConstants\";\r\nimport { HDRFiltering } from \"core/Materials/Textures/Filtering/hdrFiltering\";\r\nimport type { ThinEngine } from \"core/Engines\";\r\n\r\n/**\r\n * Options for Light Estimation feature\r\n */\r\nexport interface IWebXRLightEstimationOptions {\r\n /**\r\n * Disable the cube map reflection feature. In this case only light direction and color will be updated\r\n */\r\n disableCubeMapReflection?: boolean;\r\n /**\r\n * Should the scene's env texture be set to the cube map reflection texture\r\n * Note that this doesn't work is disableCubeMapReflection if set to false\r\n */\r\n setSceneEnvironmentTexture?: boolean;\r\n /**\r\n * How often should the cubemap update in ms.\r\n * If not set the cubemap will be updated every time the underlying system updates the environment texture.\r\n */\r\n cubeMapPollInterval?: number;\r\n /**\r\n * How often should the light estimation properties update in ms.\r\n * If not set the light estimation properties will be updated on every frame (depending on the underlying system)\r\n */\r\n lightEstimationPollInterval?: number;\r\n /**\r\n * Should a directional light source be created.\r\n * If created, this light source will be updated whenever the light estimation values change\r\n */\r\n createDirectionalLightSource?: boolean;\r\n /**\r\n * Define the format to be used for the light estimation texture.\r\n */\r\n reflectionFormat?: XRReflectionFormat;\r\n /**\r\n * Should the light estimation's needed vectors be constructed on each frame.\r\n * Use this when you use those vectors and don't want their values to change outside of the light estimation feature\r\n */\r\n disableVectorReuse?: boolean;\r\n\r\n /**\r\n * disable applying the spherical polynomial to the cube map texture\r\n */\r\n disableSphericalPolynomial?: boolean;\r\n\r\n /**\r\n * disable prefiltering the cube map texture\r\n */\r\n disablePreFiltering?: boolean;\r\n}\r\n\r\n/**\r\n * An interface describing the result of a light estimation\r\n */\r\nexport interface IWebXRLightEstimation {\r\n /**\r\n * The intensity of the light source\r\n */\r\n lightIntensity: number;\r\n /**\r\n * Color of light source\r\n */\r\n lightColor: Color3;\r\n /**\r\n * The direction from the light source\r\n */\r\n lightDirection: Vector3;\r\n /**\r\n * Spherical harmonics coefficients of the light source\r\n */\r\n sphericalHarmonics: SphericalHarmonics;\r\n}\r\n\r\n/**\r\n * Light Estimation Feature\r\n *\r\n * @since 5.0.0\r\n */\r\nexport class WebXRLightEstimation extends WebXRAbstractFeature {\r\n private _canvasContext: Nullable<WebGLRenderingContext | WebGL2RenderingContext> = null;\r\n private _reflectionCubeMap: Nullable<BaseTexture> = null;\r\n private _xrLightEstimate: Nullable<XRLightEstimate> = null;\r\n private _xrLightProbe: Nullable<XRLightProbe> = null;\r\n private _xrWebGLBinding: Nullable<XRWebGLBinding> = null;\r\n private _lightDirection: Vector3 = Vector3.Up().negateInPlace();\r\n private _lightColor: Color3 = Color3.White();\r\n private _intensity: number = 1;\r\n private _sphericalHarmonics: SphericalHarmonics = new SphericalHarmonics();\r\n private _cubeMapPollTime = Date.now();\r\n private _lightEstimationPollTime = Date.now();\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.LIGHT_ESTIMATION;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /**\r\n * ARCore's reflection cube map size is 16x16.\r\n * Once other systems support this feature we will need to change this to be dynamic.\r\n * see https://github.com/immersive-web/lighting-estimation/blob/main/lighting-estimation-explainer.md#cube-map-open-questions\r\n */\r\n private _reflectionCubeMapTextureSize: number = 16;\r\n\r\n private _hdrFilter: HDRFiltering;\r\n\r\n /**\r\n * If createDirectionalLightSource is set to true this light source will be created automatically.\r\n * Otherwise this can be set with an external directional light source.\r\n * This light will be updated whenever the light estimation values change.\r\n */\r\n public directionalLight: Nullable<DirectionalLight> = null;\r\n\r\n /**\r\n * This observable will notify when the reflection cube map is updated.\r\n */\r\n public onReflectionCubeMapUpdatedObservable: Observable<BaseTexture> = new Observable();\r\n\r\n /**\r\n * Creates a new instance of the light estimation feature\r\n * @param _xrSessionManager an instance of WebXRSessionManager\r\n * @param options options to use when constructing this feature\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /**\r\n * options to use when constructing this feature\r\n */\r\n public readonly options: IWebXRLightEstimationOptions\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"light-estimation\";\r\n\r\n if (this.options.createDirectionalLightSource) {\r\n this.directionalLight = new DirectionalLight(\"light estimation directional\", this._lightDirection, this._xrSessionManager.scene);\r\n this.directionalLight.position = new Vector3(0, 8, 0);\r\n // intensity will be set later\r\n this.directionalLight.intensity = 0;\r\n this.directionalLight.falloffType = LightConstants.FALLOFF_GLTF;\r\n }\r\n\r\n this._hdrFilter = new HDRFiltering(this._xrSessionManager.scene.getEngine() as ThinEngine);\r\n\r\n // https://immersive-web.github.io/lighting-estimation/\r\n Tools.Warn(\"light-estimation is an experimental and unstable feature.\");\r\n }\r\n\r\n /**\r\n * While the estimated cube map is expected to update over time to better reflect the user's environment as they move around those changes are unlikely to happen with every XRFrame.\r\n * Since creating and processing the cube map is potentially expensive, especially if mip maps are needed, you can listen to the onReflectionCubeMapUpdatedObservable to determine\r\n * when it has been updated.\r\n */\r\n public get reflectionCubeMapTexture(): Nullable<BaseTexture> {\r\n return this._reflectionCubeMap;\r\n }\r\n\r\n /**\r\n * The most recent light estimate. Available starting on the first frame where the device provides a light probe.\r\n */\r\n public get xrLightingEstimate(): Nullable<IWebXRLightEstimation> {\r\n if (this._xrLightEstimate) {\r\n return {\r\n lightColor: this._lightColor,\r\n lightDirection: this._lightDirection,\r\n lightIntensity: this._intensity,\r\n sphericalHarmonics: this._sphericalHarmonics,\r\n };\r\n }\r\n return this._xrLightEstimate;\r\n }\r\n\r\n private _getCanvasContext(): WebGLRenderingContext | WebGL2RenderingContext {\r\n if (this._canvasContext === null) {\r\n this._canvasContext = (this._xrSessionManager.scene.getEngine() as ThinEngine)._gl;\r\n }\r\n return this._canvasContext;\r\n }\r\n\r\n private _getXRGLBinding(): XRWebGLBinding {\r\n if (this._xrWebGLBinding === null) {\r\n const context = this._getCanvasContext();\r\n this._xrWebGLBinding = new XRWebGLBinding(this._xrSessionManager.session, context);\r\n }\r\n return this._xrWebGLBinding;\r\n }\r\n\r\n /**\r\n * Event Listener for \"reflectionchange\" events.\r\n */\r\n private _updateReflectionCubeMap = (): void => {\r\n if (!this._xrLightProbe) {\r\n return;\r\n }\r\n // check poll time, do not update if it has not been long enough\r\n if (this.options.cubeMapPollInterval) {\r\n const now = Date.now();\r\n if (now - this._cubeMapPollTime < this.options.cubeMapPollInterval) {\r\n return;\r\n }\r\n this._cubeMapPollTime = now;\r\n }\r\n const lp = this._getXRGLBinding().getReflectionCubeMap(this._xrLightProbe);\r\n if (lp && this._reflectionCubeMap) {\r\n if (!this._reflectionCubeMap._texture) {\r\n const internalTexture = new InternalTexture(this._xrSessionManager.scene.getEngine(), InternalTextureSource.Unknown);\r\n internalTexture.isCube = true;\r\n internalTexture.invertY = false;\r\n internalTexture._useSRGBBuffer = this.options.reflectionFormat === \"srgba8\";\r\n internalTexture.format = Constants.TEXTUREFORMAT_RGBA;\r\n internalTexture.generateMipMaps = true;\r\n internalTexture.type = this.options.reflectionFormat !== \"srgba8\" ? Constants.TEXTURETYPE_HALF_FLOAT : Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n internalTexture.samplingMode = Constants.TEXTURE_LINEAR_LINEAR_MIPLINEAR;\r\n internalTexture.width = this._reflectionCubeMapTextureSize;\r\n internalTexture.height = this._reflectionCubeMapTextureSize;\r\n internalTexture._cachedWrapU = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n internalTexture._cachedWrapV = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n internalTexture._hardwareTexture = new WebGLHardwareTexture(lp, this._getCanvasContext() as WebGLRenderingContext);\r\n this._reflectionCubeMap._texture = internalTexture;\r\n } else {\r\n this._reflectionCubeMap._texture._hardwareTexture?.set(lp);\r\n this._reflectionCubeMap._texture.getEngine().resetTextureCache();\r\n }\r\n this._reflectionCubeMap._texture.isReady = true;\r\n if (!this.options.disablePreFiltering) {\r\n this._xrLightProbe.removeEventListener(\"reflectionchange\", this._updateReflectionCubeMap);\r\n this._hdrFilter.prefilter(this._reflectionCubeMap).then(() => {\r\n this._xrSessionManager.scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n this.onReflectionCubeMapUpdatedObservable.notifyObservers(this._reflectionCubeMap!);\r\n this._xrLightProbe!.addEventListener(\"reflectionchange\", this._updateReflectionCubeMap);\r\n });\r\n } else {\r\n this._xrSessionManager.scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n\r\n this.onReflectionCubeMapUpdatedObservable.notifyObservers(this._reflectionCubeMap);\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * attach this feature\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public override attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n const reflectionFormat = this.options.reflectionFormat ?? (this._xrSessionManager.session.preferredReflectionFormat || \"srgba8\");\r\n this.options.reflectionFormat = reflectionFormat;\r\n this._xrSessionManager.session\r\n .requestLightProbe({\r\n reflectionFormat,\r\n })\r\n .then((xrLightProbe: XRLightProbe) => {\r\n this._xrLightProbe = xrLightProbe;\r\n if (!this.options.disableCubeMapReflection) {\r\n if (!this._reflectionCubeMap) {\r\n this._reflectionCubeMap = new BaseTexture(this._xrSessionManager.scene);\r\n this._reflectionCubeMap._isCube = true;\r\n this._reflectionCubeMap.coordinatesMode = Constants.TEXTURE_CUBIC_MODE;\r\n if (this.options.setSceneEnvironmentTexture) {\r\n this._xrSessionManager.scene.environmentTexture = this._reflectionCubeMap;\r\n }\r\n }\r\n this._xrLightProbe.addEventListener(\"reflectionchange\", this._updateReflectionCubeMap);\r\n }\r\n });\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * detach this feature.\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public override detach(): boolean {\r\n const detached = super.detach();\r\n\r\n if (this._xrLightProbe !== null && !this.options.disableCubeMapReflection) {\r\n this._xrLightProbe.removeEventListener(\"reflectionchange\", this._updateReflectionCubeMap);\r\n this._xrLightProbe = null;\r\n }\r\n\r\n this._canvasContext = null;\r\n this._xrLightEstimate = null;\r\n // When the session ends (on detach) we must clear our XRWebGLBinging instance, which references the ended session.\r\n this._xrWebGLBinding = null;\r\n\r\n return detached;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n\r\n this.onReflectionCubeMapUpdatedObservable.clear();\r\n\r\n if (this.directionalLight) {\r\n this.directionalLight.dispose();\r\n this.directionalLight = null;\r\n }\r\n\r\n if (this._reflectionCubeMap !== null) {\r\n if (this._reflectionCubeMap._texture) {\r\n this._reflectionCubeMap._texture.dispose();\r\n }\r\n this._reflectionCubeMap.dispose();\r\n this._reflectionCubeMap = null;\r\n }\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n if (this._xrLightProbe !== null) {\r\n if (this.options.lightEstimationPollInterval) {\r\n const now = Date.now();\r\n if (now - this._lightEstimationPollTime < this.options.lightEstimationPollInterval) {\r\n return;\r\n }\r\n this._lightEstimationPollTime = now;\r\n }\r\n this._xrLightEstimate = _xrFrame.getLightEstimate(this._xrLightProbe);\r\n if (this._xrLightEstimate) {\r\n this._intensity = Math.max(\r\n 1.0,\r\n this._xrLightEstimate.primaryLightIntensity.x,\r\n this._xrLightEstimate.primaryLightIntensity.y,\r\n this._xrLightEstimate.primaryLightIntensity.z\r\n );\r\n\r\n const rhsFactor = this._xrSessionManager.scene.useRightHandedSystem ? 1.0 : -1.0;\r\n\r\n // recreate the vector caches, so that the last one provided to the user will persist\r\n if (this.options.disableVectorReuse) {\r\n this._lightDirection = new Vector3();\r\n this._lightColor = new Color3();\r\n if (this.directionalLight) {\r\n this.directionalLight.direction = this._lightDirection;\r\n this.directionalLight.diffuse = this._lightColor;\r\n }\r\n }\r\n\r\n this._lightDirection.copyFromFloats(\r\n this._xrLightEstimate.primaryLightDirection.x,\r\n this._xrLightEstimate.primaryLightDirection.y,\r\n this._xrLightEstimate.primaryLightDirection.z * rhsFactor\r\n );\r\n this._lightColor.copyFromFloats(\r\n this._xrLightEstimate.primaryLightIntensity.x / this._intensity,\r\n this._xrLightEstimate.primaryLightIntensity.y / this._intensity,\r\n this._xrLightEstimate.primaryLightIntensity.z / this._intensity\r\n );\r\n this._sphericalHarmonics.updateFromFloatsArray(this._xrLightEstimate.sphericalHarmonicsCoefficients);\r\n if (this._reflectionCubeMap && !this.options.disableSphericalPolynomial) {\r\n this._reflectionCubeMap.sphericalPolynomial = this._reflectionCubeMap.sphericalPolynomial || new SphericalPolynomial();\r\n this._reflectionCubeMap.sphericalPolynomial?.updateFromHarmonics(this._sphericalHarmonics);\r\n }\r\n\r\n // direction from instead of direction to\r\n this._lightDirection.negateInPlace();\r\n // set the values after calculating them\r\n if (this.directionalLight) {\r\n this.directionalLight.direction.copyFrom(this._lightDirection);\r\n this.directionalLight.intensity = Math.min(this._intensity, 1.0);\r\n this.directionalLight.diffuse.copyFrom(this._lightColor);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n// register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRLightEstimation.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRLightEstimation(xrSessionManager, options);\r\n },\r\n WebXRLightEstimation.Version,\r\n false\r\n);\r\n"]}
|
|
1
|
+
{"version":3,"file":"WebXRLightEstimation.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRLightEstimation.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebGLHardwareTexture } from \"../../Engines/WebGL/webGLHardwareTexture\";\r\nimport { InternalTexture, InternalTextureSource } from \"../../Materials/Textures/internalTexture\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { Color3 } from \"../../Maths/math.color\";\r\nimport { Vector3 } from \"../../Maths/math.vector\";\r\nimport { DirectionalLight } from \"../../Lights/directionalLight\";\r\nimport { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport { SphericalHarmonics, SphericalPolynomial } from \"../../Maths/sphericalPolynomial\";\r\nimport { LightConstants } from \"../../Lights/lightConstants\";\r\nimport { HDRFiltering } from \"core/Materials/Textures/Filtering/hdrFiltering\";\r\nimport type { ThinEngine } from \"core/Engines\";\r\n\r\n/**\r\n * Options for Light Estimation feature\r\n */\r\nexport interface IWebXRLightEstimationOptions {\r\n /**\r\n * Disable the cube map reflection feature. In this case only light direction and color will be updated\r\n */\r\n disableCubeMapReflection?: boolean;\r\n /**\r\n * Should the scene's env texture be set to the cube map reflection texture\r\n * Note that this doesn't work is disableCubeMapReflection if set to false\r\n */\r\n setSceneEnvironmentTexture?: boolean;\r\n /**\r\n * How often should the cubemap update in ms.\r\n * If not set the cubemap will be updated every time the underlying system updates the environment texture.\r\n */\r\n cubeMapPollInterval?: number;\r\n /**\r\n * How often should the light estimation properties update in ms.\r\n * If not set the light estimation properties will be updated on every frame (depending on the underlying system)\r\n */\r\n lightEstimationPollInterval?: number;\r\n /**\r\n * Should a directional light source be created.\r\n * If created, this light source will be updated whenever the light estimation values change\r\n */\r\n createDirectionalLightSource?: boolean;\r\n /**\r\n * Define the format to be used for the light estimation texture.\r\n */\r\n reflectionFormat?: XRReflectionFormat;\r\n /**\r\n * Should the light estimation's needed vectors be constructed on each frame.\r\n * Use this when you use those vectors and don't want their values to change outside of the light estimation feature\r\n */\r\n disableVectorReuse?: boolean;\r\n\r\n /**\r\n * disable applying the spherical polynomial to the cube map texture\r\n */\r\n disableSphericalPolynomial?: boolean;\r\n\r\n /**\r\n * disable prefiltering the cube map texture\r\n */\r\n disablePreFiltering?: boolean;\r\n}\r\n\r\n/**\r\n * An interface describing the result of a light estimation\r\n */\r\nexport interface IWebXRLightEstimation {\r\n /**\r\n * The intensity of the light source\r\n */\r\n lightIntensity: number;\r\n /**\r\n * Color of light source\r\n */\r\n lightColor: Color3;\r\n /**\r\n * The direction from the light source\r\n */\r\n lightDirection: Vector3;\r\n /**\r\n * Spherical harmonics coefficients of the light source\r\n */\r\n sphericalHarmonics: SphericalHarmonics;\r\n}\r\n\r\n/**\r\n * Light Estimation Feature\r\n *\r\n * @since 5.0.0\r\n */\r\nexport class WebXRLightEstimation extends WebXRAbstractFeature {\r\n private _canvasContext: Nullable<WebGLRenderingContext | WebGL2RenderingContext> = null;\r\n private _reflectionCubeMap: Nullable<BaseTexture> = null;\r\n private _xrLightEstimate: Nullable<XRLightEstimate> = null;\r\n private _xrLightProbe: Nullable<XRLightProbe> = null;\r\n private _xrWebGLBinding: Nullable<XRWebGLBinding> = null;\r\n private _lightDirection: Vector3 = Vector3.Up().negateInPlace();\r\n private _lightColor: Color3 = Color3.White();\r\n private _intensity: number = 1;\r\n private _sphericalHarmonics: SphericalHarmonics = new SphericalHarmonics();\r\n private _cubeMapPollTime = Date.now();\r\n private _lightEstimationPollTime = Date.now();\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.LIGHT_ESTIMATION;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /**\r\n * ARCore's reflection cube map size is 16x16.\r\n * Once other systems support this feature we will need to change this to be dynamic.\r\n * see https://github.com/immersive-web/lighting-estimation/blob/main/lighting-estimation-explainer.md#cube-map-open-questions\r\n */\r\n private _reflectionCubeMapTextureSize: number = 16;\r\n\r\n private _hdrFilter: HDRFiltering;\r\n\r\n /**\r\n * If createDirectionalLightSource is set to true this light source will be created automatically.\r\n * Otherwise this can be set with an external directional light source.\r\n * This light will be updated whenever the light estimation values change.\r\n */\r\n public directionalLight: Nullable<DirectionalLight> = null;\r\n\r\n /**\r\n * This observable will notify when the reflection cube map is updated.\r\n */\r\n public onReflectionCubeMapUpdatedObservable: Observable<BaseTexture> = new Observable();\r\n\r\n /**\r\n * Creates a new instance of the light estimation feature\r\n * @param _xrSessionManager an instance of WebXRSessionManager\r\n * @param options options to use when constructing this feature\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /**\r\n * options to use when constructing this feature\r\n */\r\n public readonly options: IWebXRLightEstimationOptions\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"light-estimation\";\r\n\r\n if (this.options.createDirectionalLightSource) {\r\n this.directionalLight = new DirectionalLight(\"light estimation directional\", this._lightDirection, this._xrSessionManager.scene);\r\n this.directionalLight.position = new Vector3(0, 8, 0);\r\n // intensity will be set later\r\n this.directionalLight.intensity = 0;\r\n this.directionalLight.falloffType = LightConstants.FALLOFF_GLTF;\r\n }\r\n\r\n this._hdrFilter = new HDRFiltering(this._xrSessionManager.scene.getEngine() as ThinEngine);\r\n\r\n // https://immersive-web.github.io/lighting-estimation/\r\n Tools.Warn(\"light-estimation is an experimental and unstable feature.\");\r\n }\r\n\r\n /**\r\n * While the estimated cube map is expected to update over time to better reflect the user's environment as they move around those changes are unlikely to happen with every XRFrame.\r\n * Since creating and processing the cube map is potentially expensive, especially if mip maps are needed, you can listen to the onReflectionCubeMapUpdatedObservable to determine\r\n * when it has been updated.\r\n */\r\n public get reflectionCubeMapTexture(): Nullable<BaseTexture> {\r\n return this._reflectionCubeMap;\r\n }\r\n\r\n /**\r\n * The most recent light estimate. Available starting on the first frame where the device provides a light probe.\r\n */\r\n public get xrLightingEstimate(): Nullable<IWebXRLightEstimation> {\r\n if (this._xrLightEstimate) {\r\n return {\r\n lightColor: this._lightColor,\r\n lightDirection: this._lightDirection,\r\n lightIntensity: this._intensity,\r\n sphericalHarmonics: this._sphericalHarmonics,\r\n };\r\n }\r\n return this._xrLightEstimate;\r\n }\r\n\r\n private _getCanvasContext(): WebGLRenderingContext | WebGL2RenderingContext {\r\n if (this._canvasContext === null) {\r\n this._canvasContext = (this._xrSessionManager.scene.getEngine() as ThinEngine)._gl;\r\n }\r\n return this._canvasContext;\r\n }\r\n\r\n private _getXRGLBinding(): XRWebGLBinding {\r\n if (this._xrWebGLBinding === null) {\r\n const context = this._getCanvasContext();\r\n this._xrWebGLBinding = new XRWebGLBinding(this._xrSessionManager.session, context);\r\n }\r\n return this._xrWebGLBinding;\r\n }\r\n\r\n /**\r\n * Event Listener for \"reflectionchange\" events.\r\n */\r\n private _updateReflectionCubeMap = (): void => {\r\n if (!this._xrLightProbe) {\r\n return;\r\n }\r\n // check poll time, do not update if it has not been long enough\r\n if (this.options.cubeMapPollInterval) {\r\n const now = Date.now();\r\n if (now - this._cubeMapPollTime < this.options.cubeMapPollInterval) {\r\n return;\r\n }\r\n this._cubeMapPollTime = now;\r\n }\r\n const lp = this._getXRGLBinding().getReflectionCubeMap(this._xrLightProbe);\r\n if (lp && this._reflectionCubeMap) {\r\n if (!this._reflectionCubeMap._texture) {\r\n const internalTexture = new InternalTexture(this._xrSessionManager.scene.getEngine(), InternalTextureSource.Unknown);\r\n internalTexture.isCube = true;\r\n internalTexture.invertY = false;\r\n internalTexture._useSRGBBuffer = this.options.reflectionFormat === \"srgba8\";\r\n internalTexture.format = Constants.TEXTUREFORMAT_RGBA;\r\n internalTexture.generateMipMaps = true;\r\n internalTexture.type = this.options.reflectionFormat !== \"srgba8\" ? Constants.TEXTURETYPE_HALF_FLOAT : Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n internalTexture.samplingMode = Constants.TEXTURE_LINEAR_LINEAR_MIPLINEAR;\r\n internalTexture.width = this._reflectionCubeMapTextureSize;\r\n internalTexture.height = this._reflectionCubeMapTextureSize;\r\n internalTexture._cachedWrapU = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n internalTexture._cachedWrapV = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n internalTexture._hardwareTexture = new WebGLHardwareTexture(lp, this._getCanvasContext() as WebGLRenderingContext);\r\n this._reflectionCubeMap._texture = internalTexture;\r\n } else {\r\n this._reflectionCubeMap._texture._hardwareTexture?.set(lp);\r\n this._reflectionCubeMap._texture.getEngine().resetTextureCache();\r\n }\r\n this._reflectionCubeMap._texture.isReady = true;\r\n if (!this.options.disablePreFiltering) {\r\n this._xrLightProbe.removeEventListener(\"reflectionchange\", this._updateReflectionCubeMap);\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n this._hdrFilter.prefilter(this._reflectionCubeMap).then(() => {\r\n this._xrSessionManager.scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n this.onReflectionCubeMapUpdatedObservable.notifyObservers(this._reflectionCubeMap!);\r\n this._xrLightProbe!.addEventListener(\"reflectionchange\", this._updateReflectionCubeMap);\r\n });\r\n } else {\r\n this._xrSessionManager.scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n\r\n this.onReflectionCubeMapUpdatedObservable.notifyObservers(this._reflectionCubeMap);\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * attach this feature\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public override attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n const reflectionFormat = this.options.reflectionFormat ?? (this._xrSessionManager.session.preferredReflectionFormat || \"srgba8\");\r\n this.options.reflectionFormat = reflectionFormat;\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._xrSessionManager.session\r\n .requestLightProbe({\r\n reflectionFormat,\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .then((xrLightProbe: XRLightProbe) => {\r\n this._xrLightProbe = xrLightProbe;\r\n if (!this.options.disableCubeMapReflection) {\r\n if (!this._reflectionCubeMap) {\r\n this._reflectionCubeMap = new BaseTexture(this._xrSessionManager.scene);\r\n this._reflectionCubeMap._isCube = true;\r\n this._reflectionCubeMap.coordinatesMode = Constants.TEXTURE_CUBIC_MODE;\r\n if (this.options.setSceneEnvironmentTexture) {\r\n this._xrSessionManager.scene.environmentTexture = this._reflectionCubeMap;\r\n }\r\n }\r\n this._xrLightProbe.addEventListener(\"reflectionchange\", this._updateReflectionCubeMap);\r\n }\r\n });\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * detach this feature.\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public override detach(): boolean {\r\n const detached = super.detach();\r\n\r\n if (this._xrLightProbe !== null && !this.options.disableCubeMapReflection) {\r\n this._xrLightProbe.removeEventListener(\"reflectionchange\", this._updateReflectionCubeMap);\r\n this._xrLightProbe = null;\r\n }\r\n\r\n this._canvasContext = null;\r\n this._xrLightEstimate = null;\r\n // When the session ends (on detach) we must clear our XRWebGLBinging instance, which references the ended session.\r\n this._xrWebGLBinding = null;\r\n\r\n return detached;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n\r\n this.onReflectionCubeMapUpdatedObservable.clear();\r\n\r\n if (this.directionalLight) {\r\n this.directionalLight.dispose();\r\n this.directionalLight = null;\r\n }\r\n\r\n if (this._reflectionCubeMap !== null) {\r\n if (this._reflectionCubeMap._texture) {\r\n this._reflectionCubeMap._texture.dispose();\r\n }\r\n this._reflectionCubeMap.dispose();\r\n this._reflectionCubeMap = null;\r\n }\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n if (this._xrLightProbe !== null) {\r\n if (this.options.lightEstimationPollInterval) {\r\n const now = Date.now();\r\n if (now - this._lightEstimationPollTime < this.options.lightEstimationPollInterval) {\r\n return;\r\n }\r\n this._lightEstimationPollTime = now;\r\n }\r\n this._xrLightEstimate = _xrFrame.getLightEstimate(this._xrLightProbe);\r\n if (this._xrLightEstimate) {\r\n this._intensity = Math.max(\r\n 1.0,\r\n this._xrLightEstimate.primaryLightIntensity.x,\r\n this._xrLightEstimate.primaryLightIntensity.y,\r\n this._xrLightEstimate.primaryLightIntensity.z\r\n );\r\n\r\n const rhsFactor = this._xrSessionManager.scene.useRightHandedSystem ? 1.0 : -1.0;\r\n\r\n // recreate the vector caches, so that the last one provided to the user will persist\r\n if (this.options.disableVectorReuse) {\r\n this._lightDirection = new Vector3();\r\n this._lightColor = new Color3();\r\n if (this.directionalLight) {\r\n this.directionalLight.direction = this._lightDirection;\r\n this.directionalLight.diffuse = this._lightColor;\r\n }\r\n }\r\n\r\n this._lightDirection.copyFromFloats(\r\n this._xrLightEstimate.primaryLightDirection.x,\r\n this._xrLightEstimate.primaryLightDirection.y,\r\n this._xrLightEstimate.primaryLightDirection.z * rhsFactor\r\n );\r\n this._lightColor.copyFromFloats(\r\n this._xrLightEstimate.primaryLightIntensity.x / this._intensity,\r\n this._xrLightEstimate.primaryLightIntensity.y / this._intensity,\r\n this._xrLightEstimate.primaryLightIntensity.z / this._intensity\r\n );\r\n this._sphericalHarmonics.updateFromFloatsArray(this._xrLightEstimate.sphericalHarmonicsCoefficients);\r\n if (this._reflectionCubeMap && !this.options.disableSphericalPolynomial) {\r\n this._reflectionCubeMap.sphericalPolynomial = this._reflectionCubeMap.sphericalPolynomial || new SphericalPolynomial();\r\n this._reflectionCubeMap.sphericalPolynomial?.updateFromHarmonics(this._sphericalHarmonics);\r\n }\r\n\r\n // direction from instead of direction to\r\n this._lightDirection.negateInPlace();\r\n // set the values after calculating them\r\n if (this.directionalLight) {\r\n this.directionalLight.direction.copyFrom(this._lightDirection);\r\n this.directionalLight.intensity = Math.min(this._intensity, 1.0);\r\n this.directionalLight.diffuse.copyFrom(this._lightColor);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n// register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRLightEstimation.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRLightEstimation(xrSessionManager, options);\r\n },\r\n WebXRLightEstimation.Version,\r\n false\r\n);\r\n"]}
|
|
@@ -670,9 +670,11 @@ export class WebXRNearInteraction extends WebXRAbstractFeature {
|
|
|
670
670
|
parsePromise = NodeMaterial.ParseFromSnippetAsync("8RUNKL#3", meshCreationScene);
|
|
671
671
|
}
|
|
672
672
|
parsePromise
|
|
673
|
+
// eslint-disable-next-line github/no-then
|
|
673
674
|
.then((mat) => {
|
|
674
675
|
touchCollisionMesh.material = mat;
|
|
675
676
|
})
|
|
677
|
+
// eslint-disable-next-line github/no-then
|
|
676
678
|
.catch((err) => {
|
|
677
679
|
Logger.Warn(`Error creating touch material in WebXRNearInteraction: ${err}`);
|
|
678
680
|
});
|