@babylonjs/core 6.8.0 → 6.9.0
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/abstractActionManager.js.map +1 -1
- package/Actions/action.d.ts +4 -5
- package/Actions/action.js.map +1 -1
- package/Actions/condition.d.ts +1 -2
- package/Actions/condition.js.map +1 -1
- package/Actions/directActions.d.ts +1 -2
- package/Actions/directActions.js.map +1 -1
- package/Animations/animatable.interface.d.ts +1 -2
- package/Animations/animatable.interface.js.map +1 -1
- package/Animations/animation.d.ts +3 -4
- package/Animations/animation.js.map +1 -1
- package/Animations/animationGroup.d.ts +5 -0
- package/Animations/animationGroup.js +12 -0
- package/Animations/animationGroup.js.map +1 -1
- package/Animations/easing.js.map +1 -1
- package/Animations/runtimeAnimation.d.ts +1 -2
- package/Animations/runtimeAnimation.js.map +1 -1
- package/Audio/audioSceneComponent.js.map +1 -1
- package/Audio/sound.js.map +1 -1
- package/BakedVertexAnimation/bakedVertexAnimationManager.js.map +1 -1
- package/Behaviors/Cameras/bouncingBehavior.js.map +1 -1
- package/Behaviors/Cameras/framingBehavior.js.map +1 -1
- package/Behaviors/Meshes/fadeInOutBehavior.js.map +1 -1
- package/Behaviors/Meshes/pointerDragBehavior.js.map +1 -1
- package/Bones/bone.d.ts +3 -3
- package/Bones/bone.js.map +1 -1
- package/Bones/boneIKController.js.map +1 -1
- package/Bones/boneLookController.js.map +1 -1
- package/Buffers/dataBuffer.js.map +1 -1
- package/Cameras/Inputs/BaseCameraMouseWheelInput.js.map +1 -1
- package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
- package/Cameras/Inputs/arcRotateCameraGamepadInput.js.map +1 -1
- package/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.js.map +1 -1
- package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js.map +1 -1
- package/Cameras/Inputs/arcRotateCameraPointersInput.js.map +1 -1
- package/Cameras/Inputs/flyCameraKeyboardInput.js.map +1 -1
- package/Cameras/Inputs/flyCameraMouseInput.js.map +1 -1
- package/Cameras/Inputs/followCameraKeyboardMoveInput.js.map +1 -1
- package/Cameras/Inputs/followCameraMouseWheelInput.js.map +1 -1
- package/Cameras/Inputs/followCameraPointersInput.js.map +1 -1
- package/Cameras/Inputs/freeCameraGamepadInput.js.map +1 -1
- package/Cameras/Inputs/freeCameraKeyboardMoveInput.js.map +1 -1
- package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
- package/Cameras/Inputs/freeCameraTouchInput.js.map +1 -1
- package/Cameras/VR/vrExperienceHelper.js.map +1 -1
- package/Cameras/arcRotateCamera.d.ts +1 -2
- package/Cameras/arcRotateCamera.js.map +1 -1
- package/Cameras/camera.d.ts +6 -7
- package/Cameras/camera.js.map +1 -1
- package/Cameras/flyCamera.js.map +1 -1
- package/Cameras/followCamera.js.map +1 -1
- package/Cameras/freeCamera.js.map +1 -1
- package/Cameras/targetCamera.js.map +1 -1
- package/Collisions/collider.js.map +1 -1
- package/Collisions/meshCollisionData.d.ts +1 -2
- package/Collisions/meshCollisionData.js.map +1 -1
- package/Collisions/pickingInfo.d.ts +1 -2
- package/Collisions/pickingInfo.js.map +1 -1
- package/Compute/computeEffect.d.ts +1 -2
- package/Compute/computeEffect.js.map +1 -1
- package/Compute/computeShader.js +1 -5
- package/Compute/computeShader.js.map +1 -1
- package/Culling/Octrees/octree.js.map +1 -1
- package/Culling/Octrees/octreeSceneComponent.d.ts +1 -2
- package/Culling/Octrees/octreeSceneComponent.js.map +1 -1
- package/Culling/boundingBox.d.ts +1 -2
- package/Culling/boundingBox.js.map +1 -1
- package/Culling/boundingInfo.d.ts +1 -2
- package/Culling/boundingInfo.js.map +1 -1
- package/Culling/boundingSphere.js.map +1 -1
- package/Culling/ray.js.map +1 -1
- package/Debug/debugLayer.js +1 -9
- package/Debug/debugLayer.js.map +1 -1
- package/Debug/skeletonViewer.js.map +1 -1
- package/Engines/Extensions/engine.cubeTexture.js +1 -6
- package/Engines/Extensions/engine.cubeTexture.js.map +1 -1
- package/Engines/Extensions/engine.multiRender.js.map +1 -1
- package/Engines/Extensions/engine.renderTarget.js +1 -6
- package/Engines/Extensions/engine.renderTarget.js.map +1 -1
- package/Engines/Extensions/engine.renderTargetCube.js +1 -9
- package/Engines/Extensions/engine.renderTargetCube.js.map +1 -1
- package/Engines/Extensions/engine.storageBuffer.d.ts +1 -2
- package/Engines/Extensions/engine.storageBuffer.js.map +1 -1
- package/Engines/Extensions/engine.textureSampler.d.ts +1 -2
- package/Engines/Extensions/engine.textureSampler.js.map +1 -1
- package/Engines/Extensions/engine.webVR.js +1 -5
- package/Engines/Extensions/engine.webVR.js.map +1 -1
- package/Engines/Processors/Expressions/Operators/shaderDefineArithmeticOperator.js +3 -0
- package/Engines/Processors/Expressions/Operators/shaderDefineArithmeticOperator.js.map +1 -1
- package/Engines/Processors/iShaderProcessor.d.ts +1 -2
- package/Engines/Processors/iShaderProcessor.js.map +1 -1
- package/Engines/Processors/shaderCodeInliner.js.map +1 -1
- package/Engines/Processors/shaderProcessor.d.ts +5 -6
- package/Engines/Processors/shaderProcessor.js +10 -3
- package/Engines/Processors/shaderProcessor.js.map +1 -1
- package/Engines/WebGL/webGLShaderProcessors.d.ts +1 -2
- package/Engines/WebGL/webGLShaderProcessors.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.cubeTexture.js +1 -7
- package/Engines/WebGPU/Extensions/engine.cubeTexture.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.query.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.rawTexture.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.renderTarget.js +1 -8
- package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.renderTargetCube.js +1 -10
- package/Engines/WebGPU/Extensions/engine.renderTargetCube.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.storageBuffer.d.ts +1 -2
- package/Engines/WebGPU/Extensions/engine.storageBuffer.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.textureSampler.d.ts +1 -2
- package/Engines/WebGPU/Extensions/engine.textureSampler.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheBindGroups.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheSampler.js +1 -6
- package/Engines/WebGPU/webgpuCacheSampler.js.map +1 -1
- package/Engines/WebGPU/webgpuHardwareTexture.d.ts +1 -2
- package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
- package/Engines/WebGPU/webgpuTintWASM.js +1 -4
- package/Engines/WebGPU/webgpuTintWASM.js.map +1 -1
- package/Engines/engine.d.ts +3 -3
- package/Engines/engine.js.map +1 -1
- package/Engines/engineStore.d.ts +4 -5
- package/Engines/engineStore.js.map +1 -1
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/nullEngine.js +1 -9
- package/Engines/nullEngine.js.map +1 -1
- package/Engines/thinEngine.js +3 -2
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.d.ts +1 -2
- package/Engines/webgpuEngine.js +3 -14
- package/Engines/webgpuEngine.js.map +1 -1
- package/Events/pointerEvents.d.ts +1 -2
- package/Events/pointerEvents.js.map +1 -1
- package/Gamepads/Controllers/gearVRController.js.map +1 -1
- package/Gamepads/Controllers/oculusTouchController.js.map +1 -1
- package/Gamepads/Controllers/poseEnabledController.js.map +1 -1
- package/Gamepads/Controllers/windowsMotionController.js.map +1 -1
- package/Gamepads/gamepad.js.map +1 -1
- package/Gizmos/cameraGizmo.js.map +1 -1
- package/Gizmos/gizmo.js.map +1 -1
- package/Gizmos/lightGizmo.js.map +1 -1
- package/Gizmos/planeRotationGizmo.js.map +1 -1
- package/Helpers/environmentHelper.js +2 -8
- package/Helpers/environmentHelper.js.map +1 -1
- package/Helpers/textureDome.js.map +1 -1
- package/Inputs/scene.inputManager.d.ts +1 -2
- package/Inputs/scene.inputManager.js +4 -1
- package/Inputs/scene.inputManager.js.map +1 -1
- package/Layers/effectLayer.js +1 -8
- package/Layers/effectLayer.js.map +1 -1
- package/Layers/glowLayer.js +1 -12
- package/Layers/glowLayer.js.map +1 -1
- package/Layers/highlightLayer.js +1 -11
- package/Layers/highlightLayer.js.map +1 -1
- package/Legacy/legacy.js +1 -1
- package/Legacy/legacy.js.map +1 -1
- package/LensFlares/lensFlareSystem.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.js +1 -4
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Lights/directionalLight.js.map +1 -1
- package/Lights/hemisphericLight.js.map +1 -1
- package/Lights/light.js.map +1 -1
- package/Lights/spotLight.js.map +1 -1
- package/Loading/loadingScreen.js.map +1 -1
- package/Materials/Background/backgroundMaterial.js.map +1 -1
- package/Materials/Node/Blocks/Dual/currentScreenBlock.d.ts +2 -3
- package/Materials/Node/Blocks/Dual/currentScreenBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/sceneDepthBlock.d.ts +2 -3
- package/Materials/Node/Blocks/Dual/sceneDepthBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.d.ts +3 -4
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/clearCoatBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/refractionBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/sheenBlock.js.map +1 -1
- package/Materials/Node/Blocks/Particle/particleTextureBlock.d.ts +1 -2
- package/Materials/Node/Blocks/Particle/particleTextureBlock.js.map +1 -1
- package/Materials/Node/Blocks/Vertex/vertexOutputBlock.js.map +1 -1
- package/Materials/Node/Blocks/addBlock.js +2 -0
- package/Materials/Node/Blocks/addBlock.js.map +1 -1
- package/Materials/Node/Blocks/clampBlock.js.map +1 -1
- package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
- package/Materials/Node/Blocks/customBlock.d.ts +1 -0
- package/Materials/Node/Blocks/customBlock.js +18 -2
- package/Materials/Node/Blocks/customBlock.js.map +1 -1
- package/Materials/Node/Blocks/divideBlock.js +2 -0
- package/Materials/Node/Blocks/divideBlock.js.map +1 -1
- package/Materials/Node/Blocks/meshAttributeExistsBlock.js.map +1 -1
- package/Materials/Node/Blocks/multiplyBlock.js +2 -0
- package/Materials/Node/Blocks/multiplyBlock.js.map +1 -1
- package/Materials/Node/Blocks/remapBlock.js.map +1 -1
- package/Materials/Node/Blocks/subtractBlock.js +2 -0
- package/Materials/Node/Blocks/subtractBlock.js.map +1 -1
- package/Materials/Node/Blocks/triPlanarBlock.js.map +1 -1
- package/Materials/Node/Blocks/worleyNoise3DBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.js +2 -8
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/Node/nodeMaterialDecorator.d.ts +2 -3
- package/Materials/Node/nodeMaterialDecorator.js.map +1 -1
- package/Materials/PBR/pbrAnisotropicConfiguration.d.ts +3 -4
- package/Materials/PBR/pbrAnisotropicConfiguration.js.map +1 -1
- package/Materials/PBR/pbrBRDFConfiguration.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.js +1 -5
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/PBR/pbrBaseSimpleMaterial.js.map +1 -1
- package/Materials/PBR/pbrClearCoatConfiguration.d.ts +3 -4
- package/Materials/PBR/pbrClearCoatConfiguration.js.map +1 -1
- package/Materials/PBR/pbrIridescenceConfiguration.d.ts +3 -4
- package/Materials/PBR/pbrIridescenceConfiguration.js.map +1 -1
- package/Materials/PBR/pbrMaterial.d.ts +2 -1
- package/Materials/PBR/pbrMaterial.js +6 -13
- package/Materials/PBR/pbrMaterial.js.map +1 -1
- package/Materials/PBR/pbrMetallicRoughnessMaterial.js.map +1 -1
- package/Materials/PBR/pbrSheenConfiguration.d.ts +3 -4
- package/Materials/PBR/pbrSheenConfiguration.js.map +1 -1
- package/Materials/PBR/pbrSpecularGlossinessMaterial.js.map +1 -1
- package/Materials/PBR/pbrSubSurfaceConfiguration.d.ts +3 -4
- package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
- package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
- package/Materials/Textures/baseTexture.d.ts +2 -1
- package/Materials/Textures/baseTexture.js.map +1 -1
- package/Materials/Textures/cubeTexture.js.map +1 -1
- package/Materials/Textures/equiRectangularCubeTexture.js.map +1 -1
- package/Materials/Textures/hdrCubeTexture.js.map +1 -1
- package/Materials/Textures/htmlElementTexture.d.ts +2 -3
- package/Materials/Textures/htmlElementTexture.js +1 -4
- package/Materials/Textures/htmlElementTexture.js.map +1 -1
- package/Materials/Textures/internalTexture.d.ts +3 -4
- package/Materials/Textures/internalTexture.js.map +1 -1
- package/Materials/Textures/rawTexture.d.ts +1 -2
- package/Materials/Textures/rawTexture.js.map +1 -1
- package/Materials/Textures/rawTexture2DArray.d.ts +1 -2
- package/Materials/Textures/rawTexture2DArray.js.map +1 -1
- package/Materials/Textures/renderTargetTexture.d.ts +1 -2
- package/Materials/Textures/renderTargetTexture.js.map +1 -1
- package/Materials/Textures/texture.d.ts +4 -5
- package/Materials/Textures/texture.js.map +1 -1
- package/Materials/Textures/videoTexture.js +9 -22
- package/Materials/Textures/videoTexture.js.map +1 -1
- package/Materials/colorCurves.js.map +1 -1
- package/Materials/drawWrapper.d.ts +3 -4
- package/Materials/drawWrapper.js.map +1 -1
- package/Materials/effect.d.ts +5 -6
- package/Materials/effect.js.map +1 -1
- package/Materials/effectFallbacks.d.ts +2 -3
- package/Materials/effectFallbacks.js.map +1 -1
- package/Materials/greasedLinePluginMaterial.d.ts +307 -0
- package/Materials/greasedLinePluginMaterial.js +553 -0
- package/Materials/greasedLinePluginMaterial.js.map +1 -0
- package/Materials/iEffectFallbacks.d.ts +1 -2
- package/Materials/iEffectFallbacks.js.map +1 -1
- package/Materials/imageProcessingConfiguration.d.ts +2 -3
- package/Materials/imageProcessingConfiguration.js.map +1 -1
- package/Materials/index.d.ts +1 -0
- package/Materials/index.js +1 -0
- package/Materials/index.js.map +1 -1
- package/Materials/material.d.ts +6 -4
- package/Materials/material.decalMapConfiguration.js.map +1 -1
- package/Materials/material.detailMapConfiguration.d.ts +4 -5
- package/Materials/material.detailMapConfiguration.js.map +1 -1
- package/Materials/material.js +40 -5
- package/Materials/material.js.map +1 -1
- package/Materials/materialPluginBase.d.ts +13 -14
- package/Materials/materialPluginBase.js +2 -2
- package/Materials/materialPluginBase.js.map +1 -1
- package/Materials/materialPluginEvent.d.ts +8 -9
- package/Materials/materialPluginEvent.js.map +1 -1
- package/Materials/materialPluginFactoryExport.d.ts +1 -2
- package/Materials/materialPluginFactoryExport.js.map +1 -1
- package/Materials/materialPluginManager.d.ts +6 -6
- package/Materials/materialPluginManager.js +3 -1
- package/Materials/materialPluginManager.js.map +1 -1
- package/Materials/materialStencilState.d.ts +1 -2
- package/Materials/materialStencilState.js.map +1 -1
- package/Materials/shaderMaterial.d.ts +4 -5
- package/Materials/shaderMaterial.js +6 -19
- package/Materials/shaderMaterial.js.map +1 -1
- package/Materials/standardMaterial.d.ts +2 -1
- package/Materials/standardMaterial.js +4 -1
- package/Materials/standardMaterial.js.map +1 -1
- package/Materials/uniformBuffer.js.map +1 -1
- package/Maths/math.vector.d.ts +2 -1
- package/Maths/math.vector.js +3 -2
- package/Maths/math.vector.js.map +1 -1
- package/Meshes/Builders/decalBuilder.js +4 -4
- package/Meshes/Builders/decalBuilder.js.map +1 -1
- package/Meshes/Builders/greasedLineBuilder.d.ts +105 -0
- package/Meshes/Builders/greasedLineBuilder.js +330 -0
- package/Meshes/Builders/greasedLineBuilder.js.map +1 -0
- package/Meshes/Builders/index.d.ts +1 -0
- package/Meshes/Builders/index.js +1 -0
- package/Meshes/Builders/index.js.map +1 -1
- package/Meshes/Builders/linesBuilder.d.ts +1 -2
- package/Meshes/Builders/linesBuilder.js.map +1 -1
- package/Meshes/Builders/textBuilder.d.ts +34 -0
- package/Meshes/Builders/textBuilder.js +10 -2
- package/Meshes/Builders/textBuilder.js.map +1 -1
- package/Meshes/abstractMesh.d.ts +6 -6
- package/Meshes/abstractMesh.js +3 -2
- package/Meshes/abstractMesh.js.map +1 -1
- package/Meshes/geometry.d.ts +1 -2
- package/Meshes/geometry.js.map +1 -1
- package/Meshes/greasedLineMesh.d.ts +189 -0
- package/Meshes/greasedLineMesh.js +437 -0
- package/Meshes/greasedLineMesh.js.map +1 -0
- package/Meshes/index.d.ts +1 -0
- package/Meshes/index.js +1 -0
- package/Meshes/index.js.map +1 -1
- package/Meshes/mesh.d.ts +10 -6
- package/Meshes/mesh.js +20 -10
- package/Meshes/mesh.js.map +1 -1
- package/Meshes/mesh.vertexData.d.ts +2 -3
- package/Meshes/mesh.vertexData.js.map +1 -1
- package/Meshes/meshUVSpaceRenderer.js +1 -8
- package/Meshes/meshUVSpaceRenderer.js.map +1 -1
- package/Meshes/subMesh.d.ts +7 -8
- package/Meshes/subMesh.js.map +1 -1
- package/Meshes/transformNode.js.map +1 -1
- package/Misc/basis.js.map +1 -1
- package/Misc/copyTools.d.ts +1 -2
- package/Misc/copyTools.js.map +1 -1
- package/Misc/decorators.d.ts +5 -6
- package/Misc/decorators.js.map +1 -1
- package/Misc/deepCopier.js +7 -1
- package/Misc/deepCopier.js.map +1 -1
- package/Misc/dumpTools.d.ts +4 -3
- package/Misc/dumpTools.js +5 -4
- package/Misc/dumpTools.js.map +1 -1
- package/Misc/environmentTextureTools.js +1 -1
- package/Misc/environmentTextureTools.js.map +1 -1
- package/Misc/fileTools.js +10 -10
- package/Misc/fileTools.js.map +1 -1
- package/Misc/greasedLineTools.d.ts +153 -0
- package/Misc/greasedLineTools.js +299 -0
- package/Misc/greasedLineTools.js.map +1 -0
- package/Misc/index.d.ts +1 -0
- package/Misc/index.js +1 -0
- package/Misc/index.js.map +1 -1
- package/Misc/khronosTextureContainer.js.map +1 -1
- package/Misc/rgbdTextureTools.d.ts +3 -4
- package/Misc/rgbdTextureTools.js.map +1 -1
- package/Misc/sceneOptimizer.js.map +1 -1
- package/Misc/screenshotTools.d.ts +16 -7
- package/Misc/screenshotTools.js +23 -13
- package/Misc/screenshotTools.js.map +1 -1
- package/Misc/smartArray.js.map +1 -1
- package/Misc/tools.d.ts +21 -9
- package/Misc/tools.js +21 -9
- package/Misc/tools.js.map +1 -1
- package/Misc/videoRecorder.js +1 -4
- package/Misc/videoRecorder.js.map +1 -1
- package/Misc/virtualJoystick.js +1 -4
- package/Misc/virtualJoystick.js.map +1 -1
- package/Misc/webRequest.js.map +1 -1
- package/Morph/morphTarget.d.ts +2 -1
- package/Morph/morphTarget.js.map +1 -1
- package/Morph/morphTargetManager.js.map +1 -1
- package/Offline/database.js.map +1 -1
- package/Particles/EmitterTypes/IParticleEmitterType.d.ts +1 -2
- package/Particles/EmitterTypes/IParticleEmitterType.js.map +1 -1
- package/Particles/IParticleSystem.d.ts +2 -3
- package/Particles/IParticleSystem.js.map +1 -1
- package/Particles/baseParticleSystem.js.map +1 -1
- package/Particles/gpuParticleSystem.d.ts +1 -2
- package/Particles/gpuParticleSystem.js +2 -6
- package/Particles/gpuParticleSystem.js.map +1 -1
- package/Particles/particle.js.map +1 -1
- package/Particles/particleSystem.d.ts +1 -2
- package/Particles/particleSystem.js +1 -1
- package/Particles/particleSystem.js.map +1 -1
- package/Particles/particleSystemSet.js.map +1 -1
- package/Particles/subEmitter.d.ts +2 -3
- package/Particles/subEmitter.js.map +1 -1
- package/Particles/webgl2ParticleSystem.js.map +1 -1
- package/Physics/physicsHelper.js +4 -4
- package/Physics/physicsHelper.js.map +1 -1
- package/Physics/physicsRaycastResult.d.ts +3 -1
- package/Physics/physicsRaycastResult.js +10 -1
- package/Physics/physicsRaycastResult.js.map +1 -1
- package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
- package/Physics/v1/physicsImpostor.js.map +1 -1
- package/Physics/v2/IPhysicsEnginePlugin.d.ts +10 -0
- package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
- package/Physics/v2/Plugins/havokPlugin.d.ts +3 -2
- package/Physics/v2/Plugins/havokPlugin.js +9 -6
- package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.d.ts +1 -2
- package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.d.ts +1 -2
- package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/postProcessRenderPipeline.d.ts +1 -2
- package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js.map +1 -1
- package/PostProcesses/blackAndWhitePostProcess.d.ts +1 -2
- package/PostProcesses/blackAndWhitePostProcess.js.map +1 -1
- package/PostProcesses/bloomMergePostProcess.js.map +1 -1
- package/PostProcesses/blurPostProcess.d.ts +1 -2
- package/PostProcesses/blurPostProcess.js.map +1 -1
- package/PostProcesses/chromaticAberrationPostProcess.d.ts +1 -2
- package/PostProcesses/chromaticAberrationPostProcess.js.map +1 -1
- package/PostProcesses/circleOfConfusionPostProcess.js.map +1 -1
- package/PostProcesses/colorCorrectionPostProcess.d.ts +1 -2
- package/PostProcesses/colorCorrectionPostProcess.js.map +1 -1
- package/PostProcesses/convolutionPostProcess.d.ts +1 -2
- package/PostProcesses/convolutionPostProcess.js.map +1 -1
- package/PostProcesses/depthOfFieldBlurPostProcess.js.map +1 -1
- package/PostProcesses/displayPassPostProcess.d.ts +1 -2
- package/PostProcesses/displayPassPostProcess.js.map +1 -1
- package/PostProcesses/extractHighlightsPostProcess.js.map +1 -1
- package/PostProcesses/filterPostProcess.d.ts +1 -2
- package/PostProcesses/filterPostProcess.js.map +1 -1
- package/PostProcesses/fxaaPostProcess.d.ts +1 -2
- package/PostProcesses/fxaaPostProcess.js.map +1 -1
- package/PostProcesses/grainPostProcess.d.ts +1 -2
- package/PostProcesses/grainPostProcess.js.map +1 -1
- package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
- package/PostProcesses/motionBlurPostProcess.d.ts +2 -3
- package/PostProcesses/motionBlurPostProcess.js.map +1 -1
- package/PostProcesses/passPostProcess.d.ts +1 -2
- package/PostProcesses/passPostProcess.js.map +1 -1
- package/PostProcesses/postProcess.d.ts +6 -6
- package/PostProcesses/postProcess.js.map +1 -1
- package/PostProcesses/postProcessManager.d.ts +1 -2
- package/PostProcesses/postProcessManager.js.map +1 -1
- package/PostProcesses/refractionPostProcess.d.ts +1 -2
- package/PostProcesses/refractionPostProcess.js.map +1 -1
- package/PostProcesses/screenSpaceCurvaturePostProcess.d.ts +2 -3
- package/PostProcesses/screenSpaceCurvaturePostProcess.js.map +1 -1
- package/PostProcesses/screenSpaceReflectionPostProcess.d.ts +2 -3
- package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
- package/PostProcesses/sharpenPostProcess.d.ts +2 -3
- package/PostProcesses/sharpenPostProcess.js.map +1 -1
- package/PostProcesses/tonemapPostProcess.d.ts +1 -2
- package/PostProcesses/tonemapPostProcess.js.map +1 -1
- package/PostProcesses/volumetricLightScatteringPostProcess.d.ts +1 -2
- package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
- package/Probes/reflectionProbe.js.map +1 -1
- package/Rendering/depthPeelingRenderer.js.map +1 -1
- package/Rendering/depthRenderer.d.ts +2 -3
- package/Rendering/depthRenderer.js.map +1 -1
- package/Rendering/geometryBufferRenderer.js +2 -2
- package/Rendering/geometryBufferRenderer.js.map +1 -1
- package/Rendering/outlineRenderer.js.map +1 -1
- package/Rendering/prePassRenderer.js.map +1 -1
- package/Rendering/renderingGroup.js.map +1 -1
- package/Rendering/renderingManager.d.ts +5 -6
- package/Rendering/renderingManager.js.map +1 -1
- package/Rendering/subSurfaceConfiguration.js.map +1 -1
- package/Rendering/utilityLayerRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.js +4 -2
- package/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.js.map +1 -1
- package/Shaders/ShadersInclude/pbrDebug.js +3 -1
- package/Shaders/ShadersInclude/pbrDebug.js.map +1 -1
- package/Sprites/sprite.d.ts +1 -2
- package/Sprites/sprite.js.map +1 -1
- package/Sprites/spriteManager.d.ts +1 -2
- package/Sprites/spriteManager.js.map +1 -1
- package/Sprites/spriteRenderer.d.ts +2 -3
- package/Sprites/spriteRenderer.js.map +1 -1
- package/XR/features/WebXRAnchorSystem.js.map +1 -1
- package/XR/features/WebXRBackgroundRemover.js.map +1 -1
- package/XR/features/WebXRControllerMovement.js.map +1 -1
- package/XR/features/WebXRControllerPhysics.js +4 -13
- package/XR/features/WebXRControllerPhysics.js.map +1 -1
- package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
- package/XR/features/WebXRControllerTeleportation.js.map +1 -1
- package/XR/features/WebXRDOMOverlay.js.map +1 -1
- package/XR/features/WebXRDepthSensing.js.map +1 -1
- package/XR/features/WebXREyeTracking.js.map +1 -1
- package/XR/features/WebXRFeaturePointSystem.js.map +1 -1
- package/XR/features/WebXRHandTracking.js +2 -8
- package/XR/features/WebXRHandTracking.js.map +1 -1
- package/XR/features/WebXRHitTest.js.map +1 -1
- package/XR/features/WebXRHitTestLegacy.js.map +1 -1
- package/XR/features/WebXRImageTracking.js.map +1 -1
- package/XR/features/WebXRLayers.js +2 -2
- package/XR/features/WebXRLayers.js.map +1 -1
- package/XR/features/WebXRLightEstimation.js.map +1 -1
- package/XR/features/WebXRMeshDetector.js.map +1 -1
- package/XR/features/WebXRNearInteraction.js.map +1 -1
- package/XR/features/WebXRPlaneDetector.js.map +1 -1
- package/XR/features/WebXRSpaceWarp.js.map +1 -1
- package/XR/motionController/webXRAbstractMotionController.js +1 -4
- package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
- package/XR/motionController/webXRControllerComponent.js.map +1 -1
- package/XR/motionController/webXRGenericMotionController.js.map +1 -1
- package/XR/motionController/webXRHTCViveMotionController.js.map +1 -1
- package/XR/motionController/webXRMicrosoftMixedRealityController.js.map +1 -1
- package/XR/motionController/webXROculusTouchMotionController.js.map +1 -1
- package/XR/webXRCamera.js.map +1 -1
- package/XR/webXRDefaultExperience.js +6 -28
- package/XR/webXRDefaultExperience.js.map +1 -1
- package/XR/webXRExperienceHelper.js +1 -0
- package/XR/webXRExperienceHelper.js.map +1 -1
- package/XR/webXRFeaturesManager.js +1 -4
- package/XR/webXRFeaturesManager.js.map +1 -1
- package/XR/webXRInput.js +1 -6
- package/XR/webXRInput.js.map +1 -1
- package/abstractScene.d.ts +3 -3
- package/abstractScene.js.map +1 -1
- package/assetContainer.js +1 -4
- package/assetContainer.js.map +1 -1
- package/node.d.ts +6 -7
- package/node.js.map +1 -1
- package/package.json +2 -4
- package/scene.d.ts +49 -50
- package/scene.js +4 -10
- package/scene.js.map +1 -1
- package/sceneComponent.d.ts +6 -7
- package/sceneComponent.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRImageTracking.js","sourceRoot":"","sources":["../../../../../lts/core/generated/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\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 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 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 dispose(): void {\r\n super.dispose();\r\n this._trackedImages.forEach((trackedImage) => {\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((image) => {\r\n if (typeof image.src === \"string\") {\r\n return this._xrSessionManager.scene.getEngine()._createImageBitmapFromSource(image.src);\r\n } else {\r\n return Promise.resolve(image.src); // resolve is probably unneeded\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":["../../../../../lts/core/generated/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\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 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 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 dispose(): void {\r\n super.dispose();\r\n this._trackedImages.forEach((trackedImage) => {\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((image) => {\r\n if (typeof image.src === \"string\") {\r\n return this._xrSessionManager.scene.getEngine()._createImageBitmapFromSource(image.src);\r\n } else {\r\n return Promise.resolve(image.src); // resolve is probably unneeded\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"]}
|
|
@@ -165,7 +165,7 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
165
165
|
this._glContext = engine._gl;
|
|
166
166
|
this._xrWebGLBinding = new XRWebGLBinding(this._xrSessionManager.session, this._glContext);
|
|
167
167
|
this._existingLayers.length = 0;
|
|
168
|
-
const projectionLayerInit = {
|
|
168
|
+
const projectionLayerInit = Object.assign({}, defaultXRProjectionLayerInit);
|
|
169
169
|
const projectionLayerMultiview = this._options.preferMultiviewOnInit && engine.getCaps().multiview;
|
|
170
170
|
if (projectionLayerMultiview) {
|
|
171
171
|
projectionLayerInit.textureType = "texture-array";
|
|
@@ -224,7 +224,7 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
224
224
|
*/
|
|
225
225
|
setXRSessionLayers(wrappedLayers) {
|
|
226
226
|
this._existingLayers = wrappedLayers;
|
|
227
|
-
const renderStateInit = {
|
|
227
|
+
const renderStateInit = Object.assign({}, this._xrSessionManager.session.renderState);
|
|
228
228
|
// Clear out the layer-related fields.
|
|
229
229
|
renderStateInit.baseLayer = undefined;
|
|
230
230
|
renderStateInit.layers = wrappedLayers.map((wrappedLayer) => wrappedLayer.layer);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRLayers.js","sourceRoot":"","sources":["../../../../../lts/core/generated/XR/features/WebXRLayers.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { WebXRLayerRenderTargetTextureProvider } from \"../webXRRenderTargetTextureProvider\";\r\nimport type { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture\";\r\nimport type { WebXRLayerType } from \"../webXRLayerWrapper\";\r\nimport { WebXRLayerWrapper } from \"../webXRLayerWrapper\";\r\nimport type { Viewport } from \"../../Maths/math.viewport\";\r\nimport { WebXRWebGLLayerWrapper } from \"../webXRWebGLLayer\";\r\n\r\n/**\r\n * Wraps xr composition layers.\r\n * @internal\r\n */\r\nexport class WebXRCompositionLayerWrapper extends WebXRLayerWrapper {\r\n constructor(\r\n public getWidth: () => number,\r\n public getHeight: () => number,\r\n public readonly layer: XRCompositionLayer,\r\n public readonly layerType: WebXRLayerType,\r\n public readonly isMultiview: boolean,\r\n public createRTTProvider: (xrSessionManager: WebXRSessionManager) => WebXRLayerRenderTargetTextureProvider\r\n ) {\r\n super(getWidth, getHeight, layer, layerType, createRTTProvider);\r\n }\r\n}\r\n\r\n/**\r\n * Provides render target textures and other important rendering information for a given XRCompositionLayer.\r\n * @internal\r\n */\r\nclass WebXRCompositionLayerRenderTargetTextureProvider extends WebXRLayerRenderTargetTextureProvider {\r\n protected _lastSubImages = new Map<XREye, XRWebGLSubImage>();\r\n private _compositionLayer: XRCompositionLayer;\r\n\r\n constructor(\r\n protected readonly _xrSessionManager: WebXRSessionManager,\r\n protected readonly _xrWebGLBinding: XRWebGLBinding,\r\n public readonly layerWrapper: WebXRCompositionLayerWrapper\r\n ) {\r\n super(_xrSessionManager.scene, layerWrapper);\r\n this._compositionLayer = layerWrapper.layer;\r\n }\r\n\r\n protected _getRenderTargetForSubImage(subImage: XRWebGLSubImage, eye: XREye) {\r\n const lastSubImage = this._lastSubImages.get(eye);\r\n const eyeIndex = eye == \"left\" ? 0 : 1;\r\n\r\n const colorTextureWidth = subImage.colorTextureWidth ?? subImage.textureWidth;\r\n const colorTextureHeight = subImage.colorTextureHeight ?? subImage.textureHeight;\r\n\r\n if (!this._renderTargetTextures[eyeIndex] || lastSubImage?.textureWidth !== colorTextureWidth || lastSubImage?.textureHeight !== colorTextureHeight) {\r\n let depthStencilTexture;\r\n const depthStencilTextureWidth = subImage.depthStencilTextureWidth ?? colorTextureWidth;\r\n const depthStencilTextureHeight = subImage.depthStencilTextureHeight ?? colorTextureHeight;\r\n if (colorTextureWidth === depthStencilTextureWidth || colorTextureHeight === depthStencilTextureHeight) {\r\n depthStencilTexture = subImage.depthStencilTexture;\r\n }\r\n\r\n this._renderTargetTextures[eyeIndex] = this._createRenderTargetTexture(\r\n colorTextureWidth,\r\n colorTextureHeight,\r\n null,\r\n subImage.colorTexture,\r\n depthStencilTexture,\r\n this.layerWrapper.isMultiview\r\n );\r\n\r\n this._framebufferDimensions = {\r\n framebufferWidth: colorTextureWidth,\r\n framebufferHeight: colorTextureHeight,\r\n };\r\n }\r\n\r\n this._lastSubImages.set(eye, subImage);\r\n return this._renderTargetTextures[eyeIndex];\r\n }\r\n private _getSubImageForEye(eye: XREye): Nullable<XRWebGLSubImage> {\r\n const currentFrame = this._xrSessionManager.currentFrame;\r\n if (currentFrame) {\r\n return this._xrWebGLBinding.getSubImage(this._compositionLayer, currentFrame, eye);\r\n }\r\n return null;\r\n }\r\n public getRenderTargetTextureForEye(eye: XREye): Nullable<RenderTargetTexture> {\r\n const subImage = this._getSubImageForEye(eye);\r\n if (subImage) {\r\n return this._getRenderTargetForSubImage(subImage, eye);\r\n }\r\n return null;\r\n }\r\n public getRenderTargetTextureForView(view: XRView): Nullable<RenderTargetTexture> {\r\n return this.getRenderTargetTextureForEye(view.eye);\r\n }\r\n\r\n protected _setViewportForSubImage(viewport: Viewport, subImage: XRWebGLSubImage) {\r\n const textureWidth = subImage.colorTextureWidth ?? subImage.textureWidth;\r\n const textureHeight = subImage.colorTextureWidth ?? subImage.textureHeight;\r\n const xrViewport = subImage.viewport;\r\n viewport.x = xrViewport.x / textureWidth;\r\n viewport.y = xrViewport.y / textureHeight;\r\n viewport.width = xrViewport.width / textureWidth;\r\n viewport.height = xrViewport.height / textureHeight;\r\n }\r\n\r\n public trySetViewportForView(viewport: Viewport, view: XRView): boolean {\r\n const subImage = this._lastSubImages.get(view.eye) || this._getSubImageForEye(view.eye);\r\n if (subImage) {\r\n this._setViewportForSubImage(viewport, subImage);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Wraps xr projection layers.\r\n * @internal\r\n */\r\nexport class WebXRProjectionLayerWrapper extends WebXRCompositionLayerWrapper {\r\n constructor(public readonly layer: XRProjectionLayer, isMultiview: boolean, xrGLBinding: XRWebGLBinding) {\r\n super(\r\n () => layer.textureWidth,\r\n () => layer.textureHeight,\r\n layer,\r\n \"XRProjectionLayer\",\r\n isMultiview,\r\n (sessionManager) => new WebXRProjectionLayerRenderTargetTextureProvider(sessionManager, xrGLBinding, this)\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Provides render target textures and other important rendering information for a given XRProjectionLayer.\r\n * @internal\r\n */\r\nclass WebXRProjectionLayerRenderTargetTextureProvider extends WebXRCompositionLayerRenderTargetTextureProvider {\r\n private readonly _projectionLayer: XRProjectionLayer;\r\n\r\n constructor(_xrSessionManager: WebXRSessionManager, _xrWebGLBinding: XRWebGLBinding, public readonly layerWrapper: WebXRProjectionLayerWrapper) {\r\n super(_xrSessionManager, _xrWebGLBinding, layerWrapper);\r\n this._projectionLayer = layerWrapper.layer;\r\n }\r\n\r\n private _getSubImageForView(view: XRView): XRWebGLSubImage {\r\n return this._xrWebGLBinding.getViewSubImage(this._projectionLayer, view);\r\n }\r\n\r\n public getRenderTargetTextureForView(view: XRView): Nullable<RenderTargetTexture> {\r\n return this._getRenderTargetForSubImage(this._getSubImageForView(view), view.eye);\r\n }\r\n\r\n public getRenderTargetTextureForEye(eye: XREye): Nullable<RenderTargetTexture> {\r\n const lastSubImage = this._lastSubImages.get(eye);\r\n if (lastSubImage) {\r\n return this._getRenderTargetForSubImage(lastSubImage, eye);\r\n }\r\n return null;\r\n }\r\n\r\n public trySetViewportForView(viewport: Viewport, view: XRView): boolean {\r\n const subImage = this._lastSubImages.get(view.eye) || this._getSubImageForView(view);\r\n if (subImage) {\r\n this._setViewportForSubImage(viewport, subImage);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\nconst defaultXRWebGLLayerInit: XRWebGLLayerInit = {};\r\n\r\nconst defaultXRProjectionLayerInit: XRProjectionLayerInit = {\r\n textureType: \"texture\",\r\n colorFormat: 0x1908 /* WebGLRenderingContext.RGBA */,\r\n depthFormat: 0x88f0 /* WebGLRenderingContext.DEPTH24_STENCIL8 */,\r\n scaleFactor: 1.0,\r\n};\r\n\r\n/**\r\n * Configuration options of the layers feature\r\n */\r\nexport interface IWebXRLayersOptions {\r\n /**\r\n * Whether to try initializing the base projection layer as a multiview render target, if multiview is supported.\r\n * Defaults to false.\r\n */\r\n preferMultiviewOnInit?: boolean;\r\n}\r\n\r\n/**\r\n * Exposes the WebXR Layers API.\r\n */\r\nexport class WebXRLayers extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.LAYERS;\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 * Already-created layers\r\n */\r\n private _existingLayers: WebXRLayerWrapper[] = [];\r\n\r\n private _glContext: WebGLRenderingContext | WebGL2RenderingContext;\r\n private _xrWebGLBinding: XRWebGLBinding;\r\n\r\n constructor(_xrSessionManager: WebXRSessionManager, private readonly _options: IWebXRLayersOptions = {}) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"layers\";\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 attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n const engine = this._xrSessionManager.scene.getEngine();\r\n this._glContext = engine._gl;\r\n this._xrWebGLBinding = new XRWebGLBinding(this._xrSessionManager.session, this._glContext);\r\n this._existingLayers.length = 0;\r\n\r\n const projectionLayerInit = { ...defaultXRProjectionLayerInit };\r\n const projectionLayerMultiview = this._options.preferMultiviewOnInit && engine.getCaps().multiview;\r\n if (projectionLayerMultiview) {\r\n projectionLayerInit.textureType = \"texture-array\";\r\n }\r\n this.addXRSessionLayer(this.createProjectionLayer(projectionLayerInit, projectionLayerMultiview));\r\n\r\n return true;\r\n }\r\n\r\n public detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n this._existingLayers.length = 0;\r\n return true;\r\n }\r\n\r\n /**\r\n * Creates a new XRWebGLLayer.\r\n * @param params an object providing configuration options for the new XRWebGLLayer\r\n * @returns the XRWebGLLayer\r\n */\r\n public createXRWebGLLayer(params = defaultXRWebGLLayerInit): WebXRWebGLLayerWrapper {\r\n const layer = new XRWebGLLayer(this._xrSessionManager.session, this._glContext, params);\r\n return new WebXRWebGLLayerWrapper(layer);\r\n }\r\n\r\n /**\r\n * Creates a new XRProjectionLayer.\r\n * @param params an object providing configuration options for the new XRProjectionLayer.\r\n * @param multiview whether the projection layer should render with multiview.\r\n * @returns the projection layer\r\n */\r\n public createProjectionLayer(params = defaultXRProjectionLayerInit, multiview = false): WebXRProjectionLayerWrapper {\r\n if (multiview && params.textureType !== \"texture-array\") {\r\n throw new Error(\"Projection layers can only be made multiview if they use texture arrays. Set the textureType parameter to 'texture-array'.\");\r\n }\r\n\r\n // TODO (rgerd): Support RTT's that are bound to sub-images in the texture array.\r\n if (!multiview && params.textureType === \"texture-array\") {\r\n throw new Error(\"We currently only support multiview rendering when the textureType parameter is set to 'texture-array'.\");\r\n }\r\n\r\n const projLayer = this._xrWebGLBinding.createProjectionLayer(params);\r\n return new WebXRProjectionLayerWrapper(projLayer, multiview, this._xrWebGLBinding);\r\n }\r\n\r\n /**\r\n * Add a new layer to the already-existing list of layers\r\n * @param wrappedLayer the new layer to add to the existing ones\r\n */\r\n public addXRSessionLayer(wrappedLayer: WebXRLayerWrapper) {\r\n this.setXRSessionLayers([...this._existingLayers, wrappedLayer]);\r\n }\r\n\r\n /**\r\n * Sets the layers to be used by the XR session.\r\n * Note that you must call this function with any layers you wish to render to\r\n * since it adds them to the XR session's render state\r\n * (replacing any layers that were added in a previous call to setXRSessionLayers or updateRenderState).\r\n * This method also sets up the session manager's render target texture provider\r\n * as the first layer in the array, which feeds the WebXR camera(s) attached to the session.\r\n * @param wrappedLayers An array of WebXRLayerWrapper, usually returned from the WebXRLayers createLayer functions.\r\n */\r\n public setXRSessionLayers(wrappedLayers: Array<WebXRLayerWrapper>): void {\r\n this._existingLayers = wrappedLayers;\r\n const renderStateInit: XRRenderStateInit = { ...this._xrSessionManager.session.renderState };\r\n // Clear out the layer-related fields.\r\n renderStateInit.baseLayer = undefined;\r\n renderStateInit.layers = wrappedLayers.map((wrappedLayer) => wrappedLayer.layer);\r\n this._xrSessionManager.updateRenderState(renderStateInit);\r\n this._xrSessionManager._setBaseLayerWrapper(wrappedLayers.length > 0 ? wrappedLayers[0] : null);\r\n }\r\n\r\n public isCompatible(): boolean {\r\n // TODO (rgerd): Add native support.\r\n return !this._xrSessionManager.isNative && typeof XRWebGLBinding !== \"undefined\" && !!XRWebGLBinding.prototype.createProjectionLayer;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached.\r\n */\r\n public dispose(): void {\r\n super.dispose();\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n /* empty */\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRLayers.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRLayers(xrSessionManager, options);\r\n },\r\n WebXRLayers.Version,\r\n false\r\n);\r\n"]}
|
|
1
|
+
{"version":3,"file":"WebXRLayers.js","sourceRoot":"","sources":["../../../../../lts/core/generated/XR/features/WebXRLayers.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { WebXRLayerRenderTargetTextureProvider } from \"../webXRRenderTargetTextureProvider\";\r\nimport type { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture\";\r\nimport type { WebXRLayerType } from \"../webXRLayerWrapper\";\r\nimport { WebXRLayerWrapper } from \"../webXRLayerWrapper\";\r\nimport type { Viewport } from \"../../Maths/math.viewport\";\r\nimport { WebXRWebGLLayerWrapper } from \"../webXRWebGLLayer\";\r\n\r\n/**\r\n * Wraps xr composition layers.\r\n * @internal\r\n */\r\nexport class WebXRCompositionLayerWrapper extends WebXRLayerWrapper {\r\n constructor(\r\n public getWidth: () => number,\r\n public getHeight: () => number,\r\n public readonly layer: XRCompositionLayer,\r\n public readonly layerType: WebXRLayerType,\r\n public readonly isMultiview: boolean,\r\n public createRTTProvider: (xrSessionManager: WebXRSessionManager) => WebXRLayerRenderTargetTextureProvider\r\n ) {\r\n super(getWidth, getHeight, layer, layerType, createRTTProvider);\r\n }\r\n}\r\n\r\n/**\r\n * Provides render target textures and other important rendering information for a given XRCompositionLayer.\r\n * @internal\r\n */\r\nclass WebXRCompositionLayerRenderTargetTextureProvider extends WebXRLayerRenderTargetTextureProvider {\r\n protected _lastSubImages = new Map<XREye, XRWebGLSubImage>();\r\n private _compositionLayer: XRCompositionLayer;\r\n\r\n constructor(\r\n protected readonly _xrSessionManager: WebXRSessionManager,\r\n protected readonly _xrWebGLBinding: XRWebGLBinding,\r\n public readonly layerWrapper: WebXRCompositionLayerWrapper\r\n ) {\r\n super(_xrSessionManager.scene, layerWrapper);\r\n this._compositionLayer = layerWrapper.layer;\r\n }\r\n\r\n protected _getRenderTargetForSubImage(subImage: XRWebGLSubImage, eye: XREye) {\r\n const lastSubImage = this._lastSubImages.get(eye);\r\n const eyeIndex = eye == \"left\" ? 0 : 1;\r\n\r\n const colorTextureWidth = subImage.colorTextureWidth ?? subImage.textureWidth;\r\n const colorTextureHeight = subImage.colorTextureHeight ?? subImage.textureHeight;\r\n\r\n if (!this._renderTargetTextures[eyeIndex] || lastSubImage?.textureWidth !== colorTextureWidth || lastSubImage?.textureHeight !== colorTextureHeight) {\r\n let depthStencilTexture;\r\n const depthStencilTextureWidth = subImage.depthStencilTextureWidth ?? colorTextureWidth;\r\n const depthStencilTextureHeight = subImage.depthStencilTextureHeight ?? colorTextureHeight;\r\n if (colorTextureWidth === depthStencilTextureWidth || colorTextureHeight === depthStencilTextureHeight) {\r\n depthStencilTexture = subImage.depthStencilTexture;\r\n }\r\n\r\n this._renderTargetTextures[eyeIndex] = this._createRenderTargetTexture(\r\n colorTextureWidth,\r\n colorTextureHeight,\r\n null,\r\n subImage.colorTexture,\r\n depthStencilTexture,\r\n this.layerWrapper.isMultiview\r\n );\r\n\r\n this._framebufferDimensions = {\r\n framebufferWidth: colorTextureWidth,\r\n framebufferHeight: colorTextureHeight,\r\n };\r\n }\r\n\r\n this._lastSubImages.set(eye, subImage);\r\n return this._renderTargetTextures[eyeIndex];\r\n }\r\n private _getSubImageForEye(eye: XREye): Nullable<XRWebGLSubImage> {\r\n const currentFrame = this._xrSessionManager.currentFrame;\r\n if (currentFrame) {\r\n return this._xrWebGLBinding.getSubImage(this._compositionLayer, currentFrame, eye);\r\n }\r\n return null;\r\n }\r\n public getRenderTargetTextureForEye(eye: XREye): Nullable<RenderTargetTexture> {\r\n const subImage = this._getSubImageForEye(eye);\r\n if (subImage) {\r\n return this._getRenderTargetForSubImage(subImage, eye);\r\n }\r\n return null;\r\n }\r\n public getRenderTargetTextureForView(view: XRView): Nullable<RenderTargetTexture> {\r\n return this.getRenderTargetTextureForEye(view.eye);\r\n }\r\n\r\n protected _setViewportForSubImage(viewport: Viewport, subImage: XRWebGLSubImage) {\r\n const textureWidth = subImage.colorTextureWidth ?? subImage.textureWidth;\r\n const textureHeight = subImage.colorTextureWidth ?? subImage.textureHeight;\r\n const xrViewport = subImage.viewport;\r\n viewport.x = xrViewport.x / textureWidth;\r\n viewport.y = xrViewport.y / textureHeight;\r\n viewport.width = xrViewport.width / textureWidth;\r\n viewport.height = xrViewport.height / textureHeight;\r\n }\r\n\r\n public trySetViewportForView(viewport: Viewport, view: XRView): boolean {\r\n const subImage = this._lastSubImages.get(view.eye) || this._getSubImageForEye(view.eye);\r\n if (subImage) {\r\n this._setViewportForSubImage(viewport, subImage);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Wraps xr projection layers.\r\n * @internal\r\n */\r\nexport class WebXRProjectionLayerWrapper extends WebXRCompositionLayerWrapper {\r\n constructor(public readonly layer: XRProjectionLayer, isMultiview: boolean, xrGLBinding: XRWebGLBinding) {\r\n super(\r\n () => layer.textureWidth,\r\n () => layer.textureHeight,\r\n layer,\r\n \"XRProjectionLayer\",\r\n isMultiview,\r\n (sessionManager) => new WebXRProjectionLayerRenderTargetTextureProvider(sessionManager, xrGLBinding, this)\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Provides render target textures and other important rendering information for a given XRProjectionLayer.\r\n * @internal\r\n */\r\nclass WebXRProjectionLayerRenderTargetTextureProvider extends WebXRCompositionLayerRenderTargetTextureProvider {\r\n private readonly _projectionLayer: XRProjectionLayer;\r\n\r\n constructor(_xrSessionManager: WebXRSessionManager, _xrWebGLBinding: XRWebGLBinding, public readonly layerWrapper: WebXRProjectionLayerWrapper) {\r\n super(_xrSessionManager, _xrWebGLBinding, layerWrapper);\r\n this._projectionLayer = layerWrapper.layer;\r\n }\r\n\r\n private _getSubImageForView(view: XRView): XRWebGLSubImage {\r\n return this._xrWebGLBinding.getViewSubImage(this._projectionLayer, view);\r\n }\r\n\r\n public getRenderTargetTextureForView(view: XRView): Nullable<RenderTargetTexture> {\r\n return this._getRenderTargetForSubImage(this._getSubImageForView(view), view.eye);\r\n }\r\n\r\n public getRenderTargetTextureForEye(eye: XREye): Nullable<RenderTargetTexture> {\r\n const lastSubImage = this._lastSubImages.get(eye);\r\n if (lastSubImage) {\r\n return this._getRenderTargetForSubImage(lastSubImage, eye);\r\n }\r\n return null;\r\n }\r\n\r\n public trySetViewportForView(viewport: Viewport, view: XRView): boolean {\r\n const subImage = this._lastSubImages.get(view.eye) || this._getSubImageForView(view);\r\n if (subImage) {\r\n this._setViewportForSubImage(viewport, subImage);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\nconst defaultXRWebGLLayerInit: XRWebGLLayerInit = {};\r\n\r\nconst defaultXRProjectionLayerInit: XRProjectionLayerInit = {\r\n textureType: \"texture\",\r\n colorFormat: 0x1908 /* WebGLRenderingContext.RGBA */,\r\n depthFormat: 0x88f0 /* WebGLRenderingContext.DEPTH24_STENCIL8 */,\r\n scaleFactor: 1.0,\r\n};\r\n\r\n/**\r\n * Configuration options of the layers feature\r\n */\r\nexport interface IWebXRLayersOptions {\r\n /**\r\n * Whether to try initializing the base projection layer as a multiview render target, if multiview is supported.\r\n * Defaults to false.\r\n */\r\n preferMultiviewOnInit?: boolean;\r\n}\r\n\r\n/**\r\n * Exposes the WebXR Layers API.\r\n */\r\nexport class WebXRLayers extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.LAYERS;\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 * Already-created layers\r\n */\r\n private _existingLayers: WebXRLayerWrapper[] = [];\r\n\r\n private _glContext: WebGLRenderingContext | WebGL2RenderingContext;\r\n private _xrWebGLBinding: XRWebGLBinding;\r\n\r\n constructor(_xrSessionManager: WebXRSessionManager, private readonly _options: IWebXRLayersOptions = {}) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"layers\";\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 attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n const engine = this._xrSessionManager.scene.getEngine();\r\n this._glContext = engine._gl;\r\n this._xrWebGLBinding = new XRWebGLBinding(this._xrSessionManager.session, this._glContext);\r\n this._existingLayers.length = 0;\r\n\r\n const projectionLayerInit = { ...defaultXRProjectionLayerInit };\r\n const projectionLayerMultiview = this._options.preferMultiviewOnInit && engine.getCaps().multiview;\r\n if (projectionLayerMultiview) {\r\n projectionLayerInit.textureType = \"texture-array\";\r\n }\r\n this.addXRSessionLayer(this.createProjectionLayer(projectionLayerInit, projectionLayerMultiview));\r\n\r\n return true;\r\n }\r\n\r\n public detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n this._existingLayers.length = 0;\r\n return true;\r\n }\r\n\r\n /**\r\n * Creates a new XRWebGLLayer.\r\n * @param params an object providing configuration options for the new XRWebGLLayer\r\n * @returns the XRWebGLLayer\r\n */\r\n public createXRWebGLLayer(params = defaultXRWebGLLayerInit): WebXRWebGLLayerWrapper {\r\n const layer = new XRWebGLLayer(this._xrSessionManager.session, this._glContext, params);\r\n return new WebXRWebGLLayerWrapper(layer);\r\n }\r\n\r\n /**\r\n * Creates a new XRProjectionLayer.\r\n * @param params an object providing configuration options for the new XRProjectionLayer.\r\n * @param multiview whether the projection layer should render with multiview.\r\n * @returns the projection layer\r\n */\r\n public createProjectionLayer(params = defaultXRProjectionLayerInit, multiview = false): WebXRProjectionLayerWrapper {\r\n if (multiview && params.textureType !== \"texture-array\") {\r\n throw new Error(\"Projection layers can only be made multiview if they use texture arrays. Set the textureType parameter to 'texture-array'.\");\r\n }\r\n\r\n // TODO (rgerd): Support RTT's that are bound to sub-images in the texture array.\r\n if (!multiview && params.textureType === \"texture-array\") {\r\n throw new Error(\"We currently only support multiview rendering when the textureType parameter is set to 'texture-array'.\");\r\n }\r\n\r\n const projLayer = this._xrWebGLBinding.createProjectionLayer(params);\r\n return new WebXRProjectionLayerWrapper(projLayer, multiview, this._xrWebGLBinding);\r\n }\r\n\r\n /**\r\n * Add a new layer to the already-existing list of layers\r\n * @param wrappedLayer the new layer to add to the existing ones\r\n */\r\n public addXRSessionLayer(wrappedLayer: WebXRLayerWrapper) {\r\n this.setXRSessionLayers([...this._existingLayers, wrappedLayer]);\r\n }\r\n\r\n /**\r\n * Sets the layers to be used by the XR session.\r\n * Note that you must call this function with any layers you wish to render to\r\n * since it adds them to the XR session's render state\r\n * (replacing any layers that were added in a previous call to setXRSessionLayers or updateRenderState).\r\n * This method also sets up the session manager's render target texture provider\r\n * as the first layer in the array, which feeds the WebXR camera(s) attached to the session.\r\n * @param wrappedLayers An array of WebXRLayerWrapper, usually returned from the WebXRLayers createLayer functions.\r\n */\r\n public setXRSessionLayers(wrappedLayers: Array<WebXRLayerWrapper>): void {\r\n this._existingLayers = wrappedLayers;\r\n const renderStateInit: XRRenderStateInit = { ...this._xrSessionManager.session.renderState };\r\n // Clear out the layer-related fields.\r\n renderStateInit.baseLayer = undefined;\r\n renderStateInit.layers = wrappedLayers.map((wrappedLayer) => wrappedLayer.layer);\r\n this._xrSessionManager.updateRenderState(renderStateInit);\r\n this._xrSessionManager._setBaseLayerWrapper(wrappedLayers.length > 0 ? wrappedLayers[0] : null);\r\n }\r\n\r\n public isCompatible(): boolean {\r\n // TODO (rgerd): Add native support.\r\n return !this._xrSessionManager.isNative && typeof XRWebGLBinding !== \"undefined\" && !!XRWebGLBinding.prototype.createProjectionLayer;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached.\r\n */\r\n public dispose(): void {\r\n super.dispose();\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n /* empty */\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRLayers.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRLayers(xrSessionManager, options);\r\n },\r\n WebXRLayers.Version,\r\n false\r\n);\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRLightEstimation.js","sourceRoot":"","sources":["../../../../../lts/core/generated/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\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/**\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 /**\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 // 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()._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 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 * 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 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 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 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":["../../../../../lts/core/generated/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\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/**\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 /**\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 // 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()._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 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 * 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 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 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 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRMeshDetector.js","sourceRoot":"","sources":["../../../../../lts/core/generated/XR/features/WebXRMeshDetector.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Matrix } from \"../../Maths/math\";\r\nimport { Observable } from \"../../Misc/observable\";\r\n\r\n/**\r\n * Options used in the mesh detector module\r\n */\r\nexport interface IWebXRMeshDetectorOptions {\r\n /**\r\n * The node to use to transform the local results to world coordinates\r\n */\r\n worldParentNode?: TransformNode;\r\n /**\r\n * If set to true a reference of the created meshes will be kept until the next session starts\r\n * If not defined, meshes will be removed from the array when the feature is detached or the session ended.\r\n */\r\n doNotRemoveMeshesOnSessionEnded?: boolean;\r\n /**\r\n * Preferred detector configuration, not all preferred options will be supported by all platforms.\r\n */\r\n preferredDetectorOptions?: XRGeometryDetectorOptions;\r\n /**\r\n * If set to true, WebXRMeshDetector will convert coordinate systems for meshes.\r\n * If not defined, mesh conversions from right handed to left handed coordinate systems won't be conducted.\r\n * Right handed mesh data will be available through IWebXRVertexData.xrMesh.\r\n */\r\n convertCoordinateSystems?: boolean;\r\n}\r\n\r\n/**\r\n * A babylon interface for a XR mesh's vertex data.\r\n *\r\n * Currently not supported by WebXR, available only with BabylonNative\r\n */\r\nexport interface IWebXRVertexData {\r\n /**\r\n * A babylon-assigned ID for this mesh\r\n */\r\n id: number;\r\n /**\r\n * Data required for constructing a mesh in Babylon.js.\r\n */\r\n xrMesh: XRMesh;\r\n /**\r\n * The node to use to transform the local results to world coordinates.\r\n * WorldParentNode will only exist if it was declared in the IWebXRMeshDetectorOptions.\r\n */\r\n worldParentNode?: TransformNode;\r\n /**\r\n * An array of vertex positions in babylon space. right/left hand system is taken into account.\r\n * Positions will only be calculated if convertCoordinateSystems is set to true in the IWebXRMeshDetectorOptions.\r\n */\r\n positions?: Float32Array;\r\n /**\r\n * An array of indices in babylon space. Indices have a counterclockwise winding order.\r\n * Indices will only be populated if convertCoordinateSystems is set to true in the IWebXRMeshDetectorOptions.\r\n */\r\n indices?: Uint32Array;\r\n /**\r\n * An array of vertex normals in babylon space. right/left hand system is taken into account.\r\n * Normals will not be calculated if convertCoordinateSystems is undefined in the IWebXRMeshDetectorOptions.\r\n * Different platforms may or may not support mesh normals when convertCoordinateSystems is set to true.\r\n */\r\n normals?: Float32Array;\r\n /**\r\n * A transformation matrix to apply on the mesh that will be built using the meshDefinition.\r\n * Local vs. World are decided if worldParentNode was provided or not in the options when constructing the module.\r\n * TransformationMatrix will only be calculated if convertCoordinateSystems is set to true in the IWebXRMeshDetectorOptions.\r\n */\r\n transformationMatrix?: Matrix;\r\n}\r\n\r\nlet meshIdProvider = 0;\r\n\r\n/**\r\n * The mesh detector is used to detect meshes in the real world when in AR\r\n */\r\nexport class WebXRMeshDetector extends WebXRAbstractFeature {\r\n private _detectedMeshes: Map<XRMesh, IWebXRVertexData> = new Map<XRMesh, IWebXRVertexData>();\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.MESH_DETECTION;\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 * Observers registered here will be executed when a new mesh was added to the session\r\n */\r\n public onMeshAddedObservable: Observable<IWebXRVertexData> = new Observable();\r\n /**\r\n * Observers registered here will be executed when a mesh is no longer detected in the session\r\n */\r\n public onMeshRemovedObservable: Observable<IWebXRVertexData> = new Observable();\r\n /**\r\n * Observers registered here will be executed when an existing mesh updates\r\n */\r\n public onMeshUpdatedObservable: Observable<IWebXRVertexData> = new Observable();\r\n\r\n constructor(_xrSessionManager: WebXRSessionManager, private _options: IWebXRMeshDetectorOptions = {}) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"mesh-detection\";\r\n if (this._xrSessionManager.session) {\r\n this._init();\r\n } else {\r\n this._xrSessionManager.onXRSessionInit.addOnce(() => {\r\n this._init();\r\n });\r\n }\r\n }\r\n\r\n public detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n // Only supported by BabylonNative\r\n if (!!this._xrSessionManager.isNative && !!this._xrSessionManager.session.trySetMeshDetectorEnabled) {\r\n this._xrSessionManager.session.trySetMeshDetectorEnabled(false);\r\n }\r\n\r\n if (!this._options.doNotRemoveMeshesOnSessionEnded) {\r\n this._detectedMeshes.forEach((mesh) => {\r\n this.onMeshRemovedObservable.notifyObservers(mesh);\r\n });\r\n\r\n this._detectedMeshes.clear();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public dispose(): void {\r\n super.dispose();\r\n this.onMeshAddedObservable.clear();\r\n this.onMeshRemovedObservable.clear();\r\n this.onMeshUpdatedObservable.clear();\r\n }\r\n\r\n protected _onXRFrame(frame: XRFrame) {\r\n // TODO remove try catch\r\n try {\r\n if (!this.attached || !frame) {\r\n return;\r\n }\r\n\r\n const detectedMeshes = frame.worldInformation?.detectedMeshes;\r\n if (detectedMeshes) {\r\n const toRemove = new Set<XRMesh>();\r\n this._detectedMeshes.forEach((vertexData, xrMesh) => {\r\n if (!detectedMeshes.has(xrMesh)) {\r\n toRemove.add(xrMesh);\r\n }\r\n });\r\n toRemove.forEach((xrMesh) => {\r\n const vertexData = this._detectedMeshes.get(xrMesh);\r\n if (vertexData) {\r\n this.onMeshRemovedObservable.notifyObservers(vertexData);\r\n this._detectedMeshes.delete(xrMesh);\r\n }\r\n });\r\n\r\n // now check for new ones\r\n detectedMeshes.forEach((xrMesh) => {\r\n if (!this._detectedMeshes.has(xrMesh)) {\r\n const partialVertexData: Partial<IWebXRVertexData> = {\r\n id: meshIdProvider++,\r\n xrMesh: xrMesh,\r\n };\r\n const vertexData = this._updateVertexDataWithXRMesh(xrMesh, partialVertexData, frame);\r\n this._detectedMeshes.set(xrMesh, vertexData);\r\n this.onMeshAddedObservable.notifyObservers(vertexData);\r\n } else {\r\n // updated?\r\n if (xrMesh.lastChangedTime === this._xrSessionManager.currentTimestamp) {\r\n const vertexData = this._detectedMeshes.get(xrMesh);\r\n if (vertexData) {\r\n this._updateVertexDataWithXRMesh(xrMesh, vertexData, frame);\r\n this.onMeshUpdatedObservable.notifyObservers(vertexData);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } catch (error) {\r\n console.log(error.stack);\r\n }\r\n }\r\n\r\n private _init() {\r\n // Only supported by BabylonNative\r\n if (this._xrSessionManager.isNative) {\r\n if (this._xrSessionManager.session.trySetMeshDetectorEnabled) {\r\n this._xrSessionManager.session.trySetMeshDetectorEnabled(true);\r\n }\r\n\r\n if (!!this._options.preferredDetectorOptions && !!this._xrSessionManager.session.trySetPreferredMeshDetectorOptions) {\r\n this._xrSessionManager.session.trySetPreferredMeshDetectorOptions(this._options.preferredDetectorOptions);\r\n }\r\n }\r\n }\r\n\r\n private _updateVertexDataWithXRMesh(xrMesh: XRMesh, mesh: Partial<IWebXRVertexData>, xrFrame: XRFrame): IWebXRVertexData {\r\n mesh.xrMesh = xrMesh;\r\n mesh.worldParentNode = this._options.worldParentNode;\r\n\r\n if (this._options.convertCoordinateSystems) {\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n mesh.positions = new Float32Array(xrMesh.positions.length);\r\n for (let i = 0; i < xrMesh.positions.length; i += 3) {\r\n mesh.positions[i] = xrMesh.positions[i];\r\n mesh.positions[i + 1] = xrMesh.positions[i + 1];\r\n mesh.positions[i + 2] = -1 * xrMesh.positions[i + 2];\r\n }\r\n\r\n if (xrMesh.normals) {\r\n mesh.normals = new Float32Array(xrMesh.normals.length);\r\n for (let i = 0; i < xrMesh.normals.length; i += 3) {\r\n mesh.normals[i] = xrMesh.normals[i];\r\n mesh.normals[i + 1] = xrMesh.normals[i + 1];\r\n mesh.normals[i + 2] = -1 * xrMesh.normals[i + 2];\r\n }\r\n }\r\n } else {\r\n mesh.positions = xrMesh.positions;\r\n mesh.normals = xrMesh.normals;\r\n }\r\n\r\n // WebXR should provide indices in a counterclockwise winding order regardless of coordinate system handedness\r\n mesh.indices = xrMesh.indices;\r\n\r\n // matrix\r\n const pose = xrFrame.getPose(xrMesh.meshSpace, this._xrSessionManager.referenceSpace);\r\n if (pose) {\r\n const mat = mesh.transformationMatrix || new Matrix();\r\n Matrix.FromArrayToRef(pose.transform.matrix, 0, mat);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n mat.toggleModelMatrixHandInPlace();\r\n }\r\n mesh.transformationMatrix = mat;\r\n if (this._options.worldParentNode) {\r\n mat.multiplyToRef(this._options.worldParentNode.getWorldMatrix(), mat);\r\n }\r\n }\r\n }\r\n\r\n return <IWebXRVertexData>mesh;\r\n }\r\n}\r\n\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRMeshDetector.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRMeshDetector(xrSessionManager, options);\r\n },\r\n WebXRMeshDetector.Version,\r\n false\r\n);\r\n"]}
|
|
1
|
+
{"version":3,"file":"WebXRMeshDetector.js","sourceRoot":"","sources":["../../../../../lts/core/generated/XR/features/WebXRMeshDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAsEnD,IAAI,cAAc,GAAG,CAAC,CAAC;AAEvB;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,oBAAoB;IA2BvD,YAAY,iBAAsC,EAAU,WAAsC,EAAE;QAChG,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAD+B,aAAQ,GAAR,QAAQ,CAAgC;QA1B5F,oBAAe,GAAkC,IAAI,GAAG,EAA4B,CAAC;QAa7F;;WAEG;QACI,0BAAqB,GAAiC,IAAI,UAAU,EAAE,CAAC;QAC9E;;WAEG;QACI,4BAAuB,GAAiC,IAAI,UAAU,EAAE,CAAC;QAChF;;WAEG;QACI,4BAAuB,GAAiC,IAAI,UAAU,EAAE,CAAC;QAI5E,IAAI,CAAC,mBAAmB,GAAG,gBAAgB,CAAC;QAC5C,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE;YAChC,IAAI,CAAC,KAAK,EAAE,CAAC;SAChB;aAAM;YACH,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE;gBAChD,IAAI,CAAC,KAAK,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;SACN;IACL,CAAC;IAEM,MAAM;QACT,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;YACjB,OAAO,KAAK,CAAC;SAChB;QAED,kCAAkC;QAClC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,yBAAyB,EAAE;YACjG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC;SACnE;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,+BAA+B,EAAE;YAChD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBAClC,IAAI,CAAC,uBAAuB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACvD,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;SAChC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,OAAO;QACV,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;IACzC,CAAC;IAES,UAAU,CAAC,KAAc;;QAC/B,wBAAwB;QACxB,IAAI;YACA,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE;gBAC1B,OAAO;aACV;YAED,MAAM,cAAc,GAAG,MAAA,KAAK,CAAC,gBAAgB,0CAAE,cAAc,CAAC;YAC9D,IAAI,cAAc,EAAE;gBAChB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;gBACnC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE;oBAChD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;wBAC7B,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;qBACxB;gBACL,CAAC,CAAC,CAAC;gBACH,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;oBACxB,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACpD,IAAI,UAAU,EAAE;wBACZ,IAAI,CAAC,uBAAuB,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;wBACzD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;qBACvC;gBACL,CAAC,CAAC,CAAC;gBAEH,yBAAyB;gBACzB,cAAc,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;oBAC9B,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;wBACnC,MAAM,iBAAiB,GAA8B;4BACjD,EAAE,EAAE,cAAc,EAAE;4BACpB,MAAM,EAAE,MAAM;yBACjB,CAAC;wBACF,MAAM,UAAU,GAAG,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,CAAC,CAAC;wBACtF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;wBAC7C,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;qBAC1D;yBAAM;wBACH,WAAW;wBACX,IAAI,MAAM,CAAC,eAAe,KAAK,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,EAAE;4BACpE,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;4BACpD,IAAI,UAAU,EAAE;gCACZ,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;gCAC5D,IAAI,CAAC,uBAAuB,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;6BAC5D;yBACJ;qBACJ;gBACL,CAAC,CAAC,CAAC;aACN;SACJ;QAAC,OAAO,KAAK,EAAE;YACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SAC5B;IACL,CAAC;IAEO,KAAK;QACT,kCAAkC;QAClC,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE;YACjC,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,yBAAyB,EAAE;gBAC1D,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;aAClE;YAED,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,wBAAwB,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,kCAAkC,EAAE;gBACjH,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,kCAAkC,CAAC,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;aAC7G;SACJ;IACL,CAAC;IAEO,2BAA2B,CAAC,MAAc,EAAE,IAA+B,EAAE,OAAgB;QACjG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;QAErD,IAAI,IAAI,CAAC,QAAQ,CAAC,wBAAwB,EAAE;YACxC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,oBAAoB,EAAE;gBACpD,IAAI,CAAC,SAAS,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;oBACjD,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;oBACxC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBAChD,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;iBACxD;gBAED,IAAI,MAAM,CAAC,OAAO,EAAE;oBAChB,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;wBAC/C,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;wBACpC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;wBAC5C,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;qBACpD;iBACJ;aACJ;iBAAM;gBACH,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;gBAClC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;aACjC;YAED,8GAA8G;YAC9G,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YAE9B,SAAS;YACT,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;YACtF,IAAI,IAAI,EAAE;gBACN,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,IAAI,IAAI,MAAM,EAAE,CAAC;gBACtD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;gBACrD,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,oBAAoB,EAAE;oBACpD,GAAG,CAAC,4BAA4B,EAAE,CAAC;iBACtC;gBACD,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC;gBAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE;oBAC/B,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;iBAC1E;aACJ;SACJ;QAED,OAAyB,IAAI,CAAC;IAClC,CAAC;;AA5KD;;GAEG;AACoB,sBAAI,GAAG,gBAAgB,CAAC,cAAc,AAAlC,CAAmC;AAC9D;;;;GAIG;AACoB,yBAAO,GAAG,CAAC,AAAJ,CAAK;AAsKvC,oBAAoB,CAAC,eAAe,CAChC,iBAAiB,CAAC,IAAI,EACtB,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE;IAC1B,OAAO,GAAG,EAAE,CAAC,IAAI,iBAAiB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;AAClE,CAAC,EACD,iBAAiB,CAAC,OAAO,EACzB,KAAK,CACR,CAAC","sourcesContent":["import { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Matrix } from \"../../Maths/math\";\r\nimport { Observable } from \"../../Misc/observable\";\r\n\r\n/**\r\n * Options used in the mesh detector module\r\n */\r\nexport interface IWebXRMeshDetectorOptions {\r\n /**\r\n * The node to use to transform the local results to world coordinates\r\n */\r\n worldParentNode?: TransformNode;\r\n /**\r\n * If set to true a reference of the created meshes will be kept until the next session starts\r\n * If not defined, meshes will be removed from the array when the feature is detached or the session ended.\r\n */\r\n doNotRemoveMeshesOnSessionEnded?: boolean;\r\n /**\r\n * Preferred detector configuration, not all preferred options will be supported by all platforms.\r\n */\r\n preferredDetectorOptions?: XRGeometryDetectorOptions;\r\n /**\r\n * If set to true, WebXRMeshDetector will convert coordinate systems for meshes.\r\n * If not defined, mesh conversions from right handed to left handed coordinate systems won't be conducted.\r\n * Right handed mesh data will be available through IWebXRVertexData.xrMesh.\r\n */\r\n convertCoordinateSystems?: boolean;\r\n}\r\n\r\n/**\r\n * A babylon interface for a XR mesh's vertex data.\r\n *\r\n * Currently not supported by WebXR, available only with BabylonNative\r\n */\r\nexport interface IWebXRVertexData {\r\n /**\r\n * A babylon-assigned ID for this mesh\r\n */\r\n id: number;\r\n /**\r\n * Data required for constructing a mesh in Babylon.js.\r\n */\r\n xrMesh: XRMesh;\r\n /**\r\n * The node to use to transform the local results to world coordinates.\r\n * WorldParentNode will only exist if it was declared in the IWebXRMeshDetectorOptions.\r\n */\r\n worldParentNode?: TransformNode;\r\n /**\r\n * An array of vertex positions in babylon space. right/left hand system is taken into account.\r\n * Positions will only be calculated if convertCoordinateSystems is set to true in the IWebXRMeshDetectorOptions.\r\n */\r\n positions?: Float32Array;\r\n /**\r\n * An array of indices in babylon space. Indices have a counterclockwise winding order.\r\n * Indices will only be populated if convertCoordinateSystems is set to true in the IWebXRMeshDetectorOptions.\r\n */\r\n indices?: Uint32Array;\r\n /**\r\n * An array of vertex normals in babylon space. right/left hand system is taken into account.\r\n * Normals will not be calculated if convertCoordinateSystems is undefined in the IWebXRMeshDetectorOptions.\r\n * Different platforms may or may not support mesh normals when convertCoordinateSystems is set to true.\r\n */\r\n normals?: Float32Array;\r\n /**\r\n * A transformation matrix to apply on the mesh that will be built using the meshDefinition.\r\n * Local vs. World are decided if worldParentNode was provided or not in the options when constructing the module.\r\n * TransformationMatrix will only be calculated if convertCoordinateSystems is set to true in the IWebXRMeshDetectorOptions.\r\n */\r\n transformationMatrix?: Matrix;\r\n}\r\n\r\nlet meshIdProvider = 0;\r\n\r\n/**\r\n * The mesh detector is used to detect meshes in the real world when in AR\r\n */\r\nexport class WebXRMeshDetector extends WebXRAbstractFeature {\r\n private _detectedMeshes: Map<XRMesh, IWebXRVertexData> = new Map<XRMesh, IWebXRVertexData>();\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.MESH_DETECTION;\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 * Observers registered here will be executed when a new mesh was added to the session\r\n */\r\n public onMeshAddedObservable: Observable<IWebXRVertexData> = new Observable();\r\n /**\r\n * Observers registered here will be executed when a mesh is no longer detected in the session\r\n */\r\n public onMeshRemovedObservable: Observable<IWebXRVertexData> = new Observable();\r\n /**\r\n * Observers registered here will be executed when an existing mesh updates\r\n */\r\n public onMeshUpdatedObservable: Observable<IWebXRVertexData> = new Observable();\r\n\r\n constructor(_xrSessionManager: WebXRSessionManager, private _options: IWebXRMeshDetectorOptions = {}) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"mesh-detection\";\r\n if (this._xrSessionManager.session) {\r\n this._init();\r\n } else {\r\n this._xrSessionManager.onXRSessionInit.addOnce(() => {\r\n this._init();\r\n });\r\n }\r\n }\r\n\r\n public detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n // Only supported by BabylonNative\r\n if (!!this._xrSessionManager.isNative && !!this._xrSessionManager.session.trySetMeshDetectorEnabled) {\r\n this._xrSessionManager.session.trySetMeshDetectorEnabled(false);\r\n }\r\n\r\n if (!this._options.doNotRemoveMeshesOnSessionEnded) {\r\n this._detectedMeshes.forEach((mesh) => {\r\n this.onMeshRemovedObservable.notifyObservers(mesh);\r\n });\r\n\r\n this._detectedMeshes.clear();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public dispose(): void {\r\n super.dispose();\r\n this.onMeshAddedObservable.clear();\r\n this.onMeshRemovedObservable.clear();\r\n this.onMeshUpdatedObservable.clear();\r\n }\r\n\r\n protected _onXRFrame(frame: XRFrame) {\r\n // TODO remove try catch\r\n try {\r\n if (!this.attached || !frame) {\r\n return;\r\n }\r\n\r\n const detectedMeshes = frame.worldInformation?.detectedMeshes;\r\n if (detectedMeshes) {\r\n const toRemove = new Set<XRMesh>();\r\n this._detectedMeshes.forEach((vertexData, xrMesh) => {\r\n if (!detectedMeshes.has(xrMesh)) {\r\n toRemove.add(xrMesh);\r\n }\r\n });\r\n toRemove.forEach((xrMesh) => {\r\n const vertexData = this._detectedMeshes.get(xrMesh);\r\n if (vertexData) {\r\n this.onMeshRemovedObservable.notifyObservers(vertexData);\r\n this._detectedMeshes.delete(xrMesh);\r\n }\r\n });\r\n\r\n // now check for new ones\r\n detectedMeshes.forEach((xrMesh) => {\r\n if (!this._detectedMeshes.has(xrMesh)) {\r\n const partialVertexData: Partial<IWebXRVertexData> = {\r\n id: meshIdProvider++,\r\n xrMesh: xrMesh,\r\n };\r\n const vertexData = this._updateVertexDataWithXRMesh(xrMesh, partialVertexData, frame);\r\n this._detectedMeshes.set(xrMesh, vertexData);\r\n this.onMeshAddedObservable.notifyObservers(vertexData);\r\n } else {\r\n // updated?\r\n if (xrMesh.lastChangedTime === this._xrSessionManager.currentTimestamp) {\r\n const vertexData = this._detectedMeshes.get(xrMesh);\r\n if (vertexData) {\r\n this._updateVertexDataWithXRMesh(xrMesh, vertexData, frame);\r\n this.onMeshUpdatedObservable.notifyObservers(vertexData);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } catch (error) {\r\n console.log(error.stack);\r\n }\r\n }\r\n\r\n private _init() {\r\n // Only supported by BabylonNative\r\n if (this._xrSessionManager.isNative) {\r\n if (this._xrSessionManager.session.trySetMeshDetectorEnabled) {\r\n this._xrSessionManager.session.trySetMeshDetectorEnabled(true);\r\n }\r\n\r\n if (!!this._options.preferredDetectorOptions && !!this._xrSessionManager.session.trySetPreferredMeshDetectorOptions) {\r\n this._xrSessionManager.session.trySetPreferredMeshDetectorOptions(this._options.preferredDetectorOptions);\r\n }\r\n }\r\n }\r\n\r\n private _updateVertexDataWithXRMesh(xrMesh: XRMesh, mesh: Partial<IWebXRVertexData>, xrFrame: XRFrame): IWebXRVertexData {\r\n mesh.xrMesh = xrMesh;\r\n mesh.worldParentNode = this._options.worldParentNode;\r\n\r\n if (this._options.convertCoordinateSystems) {\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n mesh.positions = new Float32Array(xrMesh.positions.length);\r\n for (let i = 0; i < xrMesh.positions.length; i += 3) {\r\n mesh.positions[i] = xrMesh.positions[i];\r\n mesh.positions[i + 1] = xrMesh.positions[i + 1];\r\n mesh.positions[i + 2] = -1 * xrMesh.positions[i + 2];\r\n }\r\n\r\n if (xrMesh.normals) {\r\n mesh.normals = new Float32Array(xrMesh.normals.length);\r\n for (let i = 0; i < xrMesh.normals.length; i += 3) {\r\n mesh.normals[i] = xrMesh.normals[i];\r\n mesh.normals[i + 1] = xrMesh.normals[i + 1];\r\n mesh.normals[i + 2] = -1 * xrMesh.normals[i + 2];\r\n }\r\n }\r\n } else {\r\n mesh.positions = xrMesh.positions;\r\n mesh.normals = xrMesh.normals;\r\n }\r\n\r\n // WebXR should provide indices in a counterclockwise winding order regardless of coordinate system handedness\r\n mesh.indices = xrMesh.indices;\r\n\r\n // matrix\r\n const pose = xrFrame.getPose(xrMesh.meshSpace, this._xrSessionManager.referenceSpace);\r\n if (pose) {\r\n const mat = mesh.transformationMatrix || new Matrix();\r\n Matrix.FromArrayToRef(pose.transform.matrix, 0, mat);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n mat.toggleModelMatrixHandInPlace();\r\n }\r\n mesh.transformationMatrix = mat;\r\n if (this._options.worldParentNode) {\r\n mat.multiplyToRef(this._options.worldParentNode.getWorldMatrix(), mat);\r\n }\r\n }\r\n }\r\n\r\n return <IWebXRVertexData>mesh;\r\n }\r\n}\r\n\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRMeshDetector.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRMeshDetector(xrSessionManager, options);\r\n },\r\n WebXRMeshDetector.Version,\r\n false\r\n);\r\n"]}
|