@onerjs/core 8.55.9 → 8.56.1
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/AudioV2/webAudio/webAudioEngine.d.ts +7 -0
- package/AudioV2/webAudio/webAudioEngine.js +6 -5
- package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
- package/Culling/Helper/boundingInfoHelper.js +8 -4
- package/Culling/Helper/boundingInfoHelper.js.map +1 -1
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.d.ts +5 -1
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.js +7 -3
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.js.map +1 -1
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.d.ts +6 -0
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.js +16 -0
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.js.map +1 -0
- package/Engines/AbstractEngine/pure.d.ts +1 -0
- package/Engines/AbstractEngine/pure.js +1 -0
- package/Engines/AbstractEngine/pure.js.map +1 -1
- package/Engines/IDrawContext.d.ts +2 -0
- package/Engines/IDrawContext.js.map +1 -1
- package/Engines/WebGPU/webgpuDrawContext.d.ts +8 -0
- package/Engines/WebGPU/webgpuDrawContext.js +15 -0
- package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
- package/Engines/abstractEngine.pure.js +2 -2
- package/Engines/abstractEngine.pure.js.map +1 -1
- package/Engines/engine.d.ts +11 -3
- package/Engines/webgpuEngine.d.ts +1 -0
- package/Engines/webgpuEngine.js +1 -0
- package/Engines/webgpuEngine.js.map +1 -1
- package/Engines/webgpuEngine.pure.d.ts +10 -0
- package/Engines/webgpuEngine.pure.js +15 -1
- package/Engines/webgpuEngine.pure.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.js +2 -5
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.pure.js +2 -0
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js +1 -0
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/powBlock.pure.js +2 -1
- package/Materials/Node/Blocks/powBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/triPlanarBlock.pure.js +14 -12
- package/Materials/Node/Blocks/triPlanarBlock.pure.js.map +1 -1
- package/Materials/Node/nodeMaterial.pure.d.ts +1 -0
- package/Materials/Node/nodeMaterialBuildState.d.ts +3 -3
- package/Materials/PBR/openpbrMaterial.pure.d.ts +1 -0
- package/Materials/PBR/pbrBaseMaterial.pure.d.ts +1 -0
- package/Materials/Textures/index.d.ts +1 -0
- package/Materials/Textures/index.js +1 -0
- package/Materials/Textures/index.js.map +1 -1
- package/Materials/drawWrapper.js +3 -0
- package/Materials/drawWrapper.js.map +1 -1
- package/Materials/imageProcessingConfiguration.defines.d.ts +3 -0
- package/Materials/imageProcessingConfiguration.defines.js +2 -0
- package/Materials/imageProcessingConfiguration.defines.js.map +1 -1
- package/Materials/imageProcessingConfiguration.functions.js +3 -0
- package/Materials/imageProcessingConfiguration.functions.js.map +1 -1
- package/Materials/imageProcessingConfiguration.pure.d.ts +58 -0
- package/Materials/imageProcessingConfiguration.pure.js +123 -2
- package/Materials/imageProcessingConfiguration.pure.js.map +1 -1
- package/Materials/standardMaterial.pure.d.ts +1 -0
- package/Materials/uniformBuffer.d.ts +29 -0
- package/Materials/uniformBuffer.js +146 -0
- package/Materials/uniformBuffer.js.map +1 -1
- package/Maths/colorTemperature.functions.d.ts +29 -0
- package/Maths/colorTemperature.functions.js +196 -0
- package/Maths/colorTemperature.functions.js.map +1 -0
- package/Maths/index.d.ts +1 -0
- package/Maths/index.js +1 -0
- package/Maths/index.js.map +1 -1
- package/Maths/pure.d.ts +1 -0
- package/Maths/pure.js +1 -0
- package/Maths/pure.js.map +1 -1
- package/Misc/observable.pure.js +1 -3
- package/Misc/observable.pure.js.map +1 -1
- package/Misc/tools.pure.js +1 -1
- package/Misc/tools.pure.js.map +1 -1
- package/PostProcesses/imageProcessingPostProcess.d.ts +41 -1
- package/PostProcesses/imageProcessingPostProcess.js +41 -1
- package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
- package/PostProcesses/thinImageProcessingPostProcess.d.ts +50 -0
- package/PostProcesses/thinImageProcessingPostProcess.js +65 -0
- package/PostProcesses/thinImageProcessingPostProcess.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.d.ts +12 -0
- package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.js +22 -0
- package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.js.map +1 -0
- package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.d.ts +1 -0
- package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.js +39 -0
- package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js +2 -4
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js.map +1 -1
- package/Rendering/IBLShadows/pure.d.ts +1 -0
- package/Rendering/IBLShadows/pure.js +1 -0
- package/Rendering/IBLShadows/pure.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObject.d.ts +11 -0
- package/Rendering/fluidRenderer/fluidRenderingObject.js +36 -14
- package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.d.ts +5 -0
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js +16 -3
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.d.ts +5 -0
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js +12 -0
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js.map +1 -1
- package/Rendering/iblCdfGenerator.js +10 -1
- package/Rendering/iblCdfGenerator.js.map +1 -1
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js +1 -1
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/helperFunctions.js +2 -2
- package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/imageProcessingDeclaration.js +3 -0
- package/Shaders/ShadersInclude/imageProcessingDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/imageProcessingFunctions.js +3 -0
- package/Shaders/ShadersInclude/imageProcessingFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrDirectLighting.js +34 -4
- package/Shaders/ShadersInclude/openpbrDirectLighting.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrIblFunctions.js +8 -2
- package/Shaders/ShadersInclude/openpbrIblFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +5 -0
- package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
- package/Shaders/fluidRenderingParticleDepth.vertex.js +7 -1
- package/Shaders/fluidRenderingParticleDepth.vertex.js.map +1 -1
- package/Shaders/fluidRenderingParticleDiffuse.vertex.js +7 -1
- package/Shaders/fluidRenderingParticleDiffuse.vertex.js.map +1 -1
- package/Shaders/fluidRenderingParticleThickness.vertex.js +7 -1
- package/Shaders/fluidRenderingParticleThickness.vertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/imageProcessingDeclaration.js +3 -0
- package/ShadersWGSL/ShadersInclude/imageProcessingDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js +3 -0
- package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js +35 -5
- package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLightingInit.js +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLightingInit.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js +8 -2
- package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +5 -0
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
- package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js +16 -4
- package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js.map +1 -1
- package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js +15 -3
- package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js.map +1 -1
- package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js +15 -3
- package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js.map +1 -1
- package/XR/features/Layers/WebXRCompositionLayer.d.ts +52 -0
- package/XR/features/Layers/WebXRCompositionLayer.js +80 -0
- package/XR/features/Layers/WebXRCompositionLayer.js.map +1 -1
- package/XR/features/WebXRControllerPointerSelection.pure.js +2 -1
- package/XR/features/WebXRControllerPointerSelection.pure.js.map +1 -1
- package/XR/features/WebXRControllerTeleportation.pure.js +2 -1
- package/XR/features/WebXRControllerTeleportation.pure.js.map +1 -1
- package/XR/features/WebXRDepthSensing.pure.d.ts +21 -0
- package/XR/features/WebXRDepthSensing.pure.js +42 -0
- package/XR/features/WebXRDepthSensing.pure.js.map +1 -1
- package/XR/features/WebXRHandTracking.pure.js +2 -0
- package/XR/features/WebXRHandTracking.pure.js.map +1 -1
- package/XR/features/WebXRLayers.pure.d.ts +12 -0
- package/XR/features/WebXRLayers.pure.js +31 -1
- package/XR/features/WebXRLayers.pure.js.map +1 -1
- package/XR/features/WebXRTrackedSources.d.ts +5 -0
- package/XR/features/WebXRTrackedSources.js +8 -0
- package/XR/features/WebXRTrackedSources.js.map +1 -0
- package/XR/features/WebXRTrackedSources.pure.d.ts +70 -0
- package/XR/features/WebXRTrackedSources.pure.js +153 -0
- package/XR/features/WebXRTrackedSources.pure.js.map +1 -0
- package/XR/features/index.d.ts +1 -0
- package/XR/features/index.js +1 -0
- package/XR/features/index.js.map +1 -1
- package/XR/features/pure.d.ts +1 -0
- package/XR/features/pure.js +1 -0
- package/XR/features/pure.js.map +1 -1
- package/XR/motionController/webXRAbstractMotionController.d.ts +53 -1
- package/XR/motionController/webXRAbstractMotionController.js +61 -0
- package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
- package/XR/webXRDefaultExperience.js +8 -4
- package/XR/webXRDefaultExperience.js.map +1 -1
- package/XR/webXRExperienceHelper.js +86 -44
- package/XR/webXRExperienceHelper.js.map +1 -1
- package/XR/webXRFeaturesManager.d.ts +9 -0
- package/XR/webXRFeaturesManager.js +4 -0
- package/XR/webXRFeaturesManager.js.map +1 -1
- package/XR/webXRGraphicsBinding.d.ts +29 -0
- package/XR/webXRGraphicsBinding.js +40 -0
- package/XR/webXRGraphicsBinding.js.map +1 -1
- package/XR/webXRInputSource.js +1 -1
- package/XR/webXRInputSource.js.map +1 -1
- package/XR/webXRLayerWrapper.d.ts +7 -5
- package/XR/webXRLayerWrapper.js +10 -7
- package/XR/webXRLayerWrapper.js.map +1 -1
- package/XR/webXRSessionManager.d.ts +45 -0
- package/XR/webXRSessionManager.js +174 -29
- package/XR/webXRSessionManager.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRHandTracking.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRHandTracking.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\n\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\nimport { type WebXRSessionManager } from \"../webXRSessionManager\";\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\nimport { type AbstractMesh } from \"../../Meshes/abstractMesh.pure\";\nimport { Mesh } from \"../../Meshes/mesh.pure\";\nimport { type WebXRInput } from \"../webXRInput\";\nimport { type WebXRInputSource } from \"../webXRInputSource\";\nimport { Matrix, Quaternion } from \"../../Maths/math.vector.pure\";\nimport { type Nullable } from \"../../types\";\nimport { PhysicsImpostor } from \"../../Physics/v1/physicsImpostor.pure\";\nimport { PhysicsAggregate } from \"../../Physics/v2/physicsAggregate\";\nimport { PhysicsMotionType, PhysicsShapeType } from \"../../Physics/v2/IPhysicsEnginePlugin\";\nimport { type IDisposable, type Scene } from \"../../scene.pure\";\nimport { Observable } from \"../../Misc/observable.pure\";\nimport { type Observer } from \"../../Misc/observable\";\nimport { type InstancedMesh } from \"../../Meshes/instancedMesh.pure\";\nimport { SceneLoader, type ISceneLoaderAsyncResult } from \"../../Loading/sceneLoader\";\n\nimport { Color3 } from \"../../Maths/math.color.pure\";\nimport { NodeMaterialParseFromFileAsync } from \"../../Materials/Node/nodeMaterial.pure\";\nimport { type InputBlock } from \"../../Materials/Node/Blocks/Input/inputBlock.pure\";\nimport { Material } from \"../../Materials/material.pure\";\nimport { CreateIcoSphere } from \"../../Meshes/Builders/icoSphereBuilder.pure\";\nimport { TransformNode } from \"../../Meshes/transformNode.pure\";\nimport { Axis } from \"../../Maths/math.axis\";\nimport { Constants } from \"../../Engines/constants\";\nimport { type WebXRCompositionLayerWrapper } from \"./Layers/WebXRCompositionLayer\";\nimport { Tools } from \"core/Misc/tools.pure\";\nimport { type WebXRCamera } from \"../webXRCamera\";\nimport { type Node } from \"../../node\";\n\ndeclare const XRHand: XRHand;\n\n/**\n * Configuration interface for the hand tracking feature\n */\nexport interface IWebXRHandTrackingOptions {\n /**\n * The xrInput that will be used as source for new hands\n */\n xrInput: WebXRInput;\n\n /**\n * Configuration object for the joint meshes.\n */\n jointMeshes?: {\n /**\n * Should the meshes created be invisible (defaults to false).\n */\n invisible?: boolean;\n /**\n * A source mesh to be used to create instances. Defaults to an icosphere with two subdivisions and smooth lighting.\n * This mesh will be the source for all other (25) meshes.\n * It should have the general size of a single unit, as the instances will be scaled according to the provided radius.\n */\n sourceMesh?: Mesh;\n /**\n * This function will be called after a mesh was created for a specific joint.\n * Using this function you can either manipulate the instance or return a new mesh.\n * When returning a new mesh the instance created before will be disposed.\n * @param meshInstance An instance of the original joint mesh being used for the joint.\n * @param jointId The joint's index, see https://immersive-web.github.io/webxr-hand-input/#skeleton-joints-section for more info.\n * @param hand Which hand (\"left\", \"right\") the joint will be on.\n */\n onHandJointMeshGenerated?: (meshInstance: InstancedMesh, jointId: number, hand: XRHandedness) => AbstractMesh | undefined;\n /**\n * Should the source mesh stay visible (defaults to false).\n */\n keepOriginalVisible?: boolean;\n /**\n * Should each instance have its own physics impostor\n */\n enablePhysics?: boolean;\n /**\n * If enabled, override default physics properties\n */\n physicsProps?: { friction?: number; restitution?: number; impostorType?: number };\n /**\n * Scale factor for all joint meshes (defaults to 1)\n */\n scaleFactor?: number;\n };\n\n /**\n * Configuration object for the hand meshes.\n */\n handMeshes?: {\n /**\n * Should the default hand mesh be disabled. In this case, the spheres will be visible (unless set invisible).\n */\n disableDefaultMeshes?: boolean;\n /**\n * Rigged hand meshes that will be tracked to the user's hands. This will override the default hand mesh.\n */\n customMeshes?: {\n right: AbstractMesh;\n left: AbstractMesh;\n };\n /**\n * Are the meshes prepared for a left-handed system. Default hand meshes are right-handed.\n */\n meshesUseLeftHandedCoordinates?: boolean;\n /**\n * If a hand mesh was provided, this array will define what axis will update which node. This will override the default hand mesh\n */\n customRigMappings?: {\n right: XRHandMeshRigMapping;\n left: XRHandMeshRigMapping;\n };\n\n /**\n * Override the colors of the hand meshes.\n */\n customColors?: {\n base?: Color3;\n fresnel?: Color3;\n fingerColor?: Color3;\n tipFresnel?: Color3;\n };\n\n /**\n * Define whether or not the hand meshes should be disposed on just invisible when the session ends.\n * Not setting, or setting to false, will maintain the hand meshes in the scene after the session ends, which will allow q quicker re-entry into XR.\n */\n disposeOnSessionEnd?: boolean;\n\n /**\n * Setting this will allow the developer to avoid loading the NME material and use the standard material instead.\n */\n disableHandShader?: boolean;\n };\n}\n\n/**\n * Parts of the hands divided to writs and finger names\n */\nexport const enum HandPart {\n /**\n * HandPart - Wrist\n */\n WRIST = \"wrist\",\n /**\n * HandPart - The thumb\n */\n THUMB = \"thumb\",\n /**\n * HandPart - Index finger\n */\n INDEX = \"index\",\n /**\n * HandPart - Middle finger\n */\n MIDDLE = \"middle\",\n /**\n * HandPart - Ring finger\n */\n RING = \"ring\",\n /**\n * HandPart - Little finger\n */\n LITTLE = \"little\",\n}\n\n/**\n * Joints of the hand as defined by the WebXR specification.\n * https://immersive-web.github.io/webxr-hand-input/#skeleton-joints-section\n */\nexport const enum WebXRHandJoint {\n /** Wrist */\n WRIST = \"wrist\",\n\n /** Thumb near wrist */\n THUMB_METACARPAL = \"thumb-metacarpal\",\n /** Thumb first knuckle */\n THUMB_PHALANX_PROXIMAL = \"thumb-phalanx-proximal\",\n /** Thumb second knuckle */\n THUMB_PHALANX_DISTAL = \"thumb-phalanx-distal\",\n /** Thumb tip */\n THUMB_TIP = \"thumb-tip\",\n\n /** Index finger near wrist */\n INDEX_FINGER_METACARPAL = \"index-finger-metacarpal\",\n /** Index finger first knuckle */\n INDEX_FINGER_PHALANX_PROXIMAL = \"index-finger-phalanx-proximal\",\n /** Index finger second knuckle */\n INDEX_FINGER_PHALANX_INTERMEDIATE = \"index-finger-phalanx-intermediate\",\n /** Index finger third knuckle */\n INDEX_FINGER_PHALANX_DISTAL = \"index-finger-phalanx-distal\",\n /** Index finger tip */\n INDEX_FINGER_TIP = \"index-finger-tip\",\n\n /** Middle finger near wrist */\n MIDDLE_FINGER_METACARPAL = \"middle-finger-metacarpal\",\n /** Middle finger first knuckle */\n MIDDLE_FINGER_PHALANX_PROXIMAL = \"middle-finger-phalanx-proximal\",\n /** Middle finger second knuckle */\n MIDDLE_FINGER_PHALANX_INTERMEDIATE = \"middle-finger-phalanx-intermediate\",\n /** Middle finger third knuckle */\n MIDDLE_FINGER_PHALANX_DISTAL = \"middle-finger-phalanx-distal\",\n /** Middle finger tip */\n MIDDLE_FINGER_TIP = \"middle-finger-tip\",\n\n /** Ring finger near wrist */\n RING_FINGER_METACARPAL = \"ring-finger-metacarpal\",\n /** Ring finger first knuckle */\n RING_FINGER_PHALANX_PROXIMAL = \"ring-finger-phalanx-proximal\",\n /** Ring finger second knuckle */\n RING_FINGER_PHALANX_INTERMEDIATE = \"ring-finger-phalanx-intermediate\",\n /** Ring finger third knuckle */\n RING_FINGER_PHALANX_DISTAL = \"ring-finger-phalanx-distal\",\n /** Ring finger tip */\n RING_FINGER_TIP = \"ring-finger-tip\",\n\n /** Pinky finger near wrist */\n PINKY_FINGER_METACARPAL = \"pinky-finger-metacarpal\",\n /** Pinky finger first knuckle */\n PINKY_FINGER_PHALANX_PROXIMAL = \"pinky-finger-phalanx-proximal\",\n /** Pinky finger second knuckle */\n PINKY_FINGER_PHALANX_INTERMEDIATE = \"pinky-finger-phalanx-intermediate\",\n /** Pinky finger third knuckle */\n PINKY_FINGER_PHALANX_DISTAL = \"pinky-finger-phalanx-distal\",\n /** Pinky finger tip */\n PINKY_FINGER_TIP = \"pinky-finger-tip\",\n}\n\n/** A type encapsulating a dictionary mapping WebXR joints to bone names in a rigged hand mesh. */\nexport type XRHandMeshRigMapping = { [webXRJointName in WebXRHandJoint]: string };\n\nconst HandJointReferenceArray: WebXRHandJoint[] = [\n WebXRHandJoint.WRIST,\n WebXRHandJoint.THUMB_METACARPAL,\n WebXRHandJoint.THUMB_PHALANX_PROXIMAL,\n WebXRHandJoint.THUMB_PHALANX_DISTAL,\n WebXRHandJoint.THUMB_TIP,\n WebXRHandJoint.INDEX_FINGER_METACARPAL,\n WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL,\n WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE,\n WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL,\n WebXRHandJoint.INDEX_FINGER_TIP,\n WebXRHandJoint.MIDDLE_FINGER_METACARPAL,\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL,\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE,\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL,\n WebXRHandJoint.MIDDLE_FINGER_TIP,\n WebXRHandJoint.RING_FINGER_METACARPAL,\n WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL,\n WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE,\n WebXRHandJoint.RING_FINGER_PHALANX_DISTAL,\n WebXRHandJoint.RING_FINGER_TIP,\n WebXRHandJoint.PINKY_FINGER_METACARPAL,\n WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL,\n WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE,\n WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL,\n WebXRHandJoint.PINKY_FINGER_TIP,\n];\n\nconst HandPartsDefinition: { [key in HandPart]: WebXRHandJoint[] } = {\n [HandPart.WRIST]: [WebXRHandJoint.WRIST],\n [HandPart.THUMB]: [WebXRHandJoint.THUMB_METACARPAL, WebXRHandJoint.THUMB_PHALANX_PROXIMAL, WebXRHandJoint.THUMB_PHALANX_DISTAL, WebXRHandJoint.THUMB_TIP],\n [HandPart.INDEX]: [\n WebXRHandJoint.INDEX_FINGER_METACARPAL,\n WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL,\n WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE,\n WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL,\n WebXRHandJoint.INDEX_FINGER_TIP,\n ],\n [HandPart.MIDDLE]: [\n WebXRHandJoint.MIDDLE_FINGER_METACARPAL,\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL,\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE,\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL,\n WebXRHandJoint.MIDDLE_FINGER_TIP,\n ],\n [HandPart.RING]: [\n WebXRHandJoint.RING_FINGER_METACARPAL,\n WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL,\n WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE,\n WebXRHandJoint.RING_FINGER_PHALANX_DISTAL,\n WebXRHandJoint.RING_FINGER_TIP,\n ],\n [HandPart.LITTLE]: [\n WebXRHandJoint.PINKY_FINGER_METACARPAL,\n WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL,\n WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE,\n WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL,\n WebXRHandJoint.PINKY_FINGER_TIP,\n ],\n};\n\n/**\n * Representing a single hand (with its corresponding native XRHand object)\n */\nexport class WebXRHand implements IDisposable {\n /**\n * This observable will notify registered observers when the hand object has been set with a new mesh.\n * you can get the hand mesh using `webxrHand.handMesh`\n */\n public onHandMeshSetObservable = new Observable<WebXRHand>();\n\n private _scene: Scene;\n\n /**\n * Transform nodes that will directly receive the transforms from the WebXR matrix data.\n */\n private _jointTransforms = new Array<TransformNode>(HandJointReferenceArray.length);\n\n /**\n * The float array that will directly receive the transform matrix data from WebXR.\n */\n private _jointTransformMatrices = new Float32Array(HandJointReferenceArray.length * 16);\n private _jointSpaces: XRJointSpace[] = new Array(HandJointReferenceArray.length);\n\n private _tempJointMatrix = new Matrix();\n\n /**\n * The float array that will directly receive the joint radii from WebXR.\n */\n private _jointRadii = new Float32Array(HandJointReferenceArray.length);\n\n /**\n * The hand mesh's top-most parent, if any.\n */\n private _handMeshRoot: Nullable<Node> = null;\n\n /**\n * Get the hand mesh.\n */\n public get handMesh(): Nullable<AbstractMesh> {\n return this._handMesh;\n }\n\n /**\n * Get meshes of part of the hand.\n * @param part The part of hand to get.\n * @returns An array of meshes that correlate to the hand part requested.\n */\n public getHandPartMeshes(part: HandPart): AbstractMesh[] {\n return HandPartsDefinition[part].map((name) => this._jointMeshes[HandJointReferenceArray.indexOf(name)]);\n }\n\n /**\n * Retrieves a mesh linked to a named joint in the hand.\n * @param jointName The name of the joint.\n * @returns An AbstractMesh whose position corresponds with the joint position.\n */\n public getJointMesh(jointName: WebXRHandJoint): AbstractMesh {\n return this._jointMeshes[HandJointReferenceArray.indexOf(jointName)];\n }\n\n /**\n * Construct a new hand object\n * @param xrController The controller to which the hand correlates.\n * @param _jointMeshes The meshes to be used to track the hand joints.\n * @param _handMesh An optional hand mesh.\n * @param rigMapping An optional rig mapping for the hand mesh.\n * If not provided (but a hand mesh is provided),\n * it will be assumed that the hand mesh's bones are named\n * directly after the WebXR bone names.\n * @param _leftHandedMeshes Are the hand meshes left-handed-system meshes\n * @param _jointsInvisible Are the tracked joint meshes visible\n * @param _jointScaleFactor Scale factor for all joint meshes\n */\n constructor(\n /** The controller to which the hand correlates. */\n public readonly xrController: WebXRInputSource,\n private readonly _jointMeshes: AbstractMesh[],\n private _handMesh: Nullable<AbstractMesh>,\n /** An optional rig mapping for the hand mesh. If not provided (but a hand mesh is provided),\n * it will be assumed that the hand mesh's bones are named directly after the WebXR bone names. */\n readonly rigMapping: Nullable<XRHandMeshRigMapping>,\n private readonly _leftHandedMeshes: boolean = false,\n private readonly _jointsInvisible: boolean = false,\n private readonly _jointScaleFactor: number = 1\n ) {\n this._scene = _jointMeshes[0].getScene();\n\n // Initialize the joint transform quaternions and link the transforms to the bones.\n for (let jointIdx = 0; jointIdx < this._jointTransforms.length; jointIdx++) {\n this._jointTransforms[jointIdx] = new TransformNode(HandJointReferenceArray[jointIdx], this._scene);\n this._jointTransforms[jointIdx].rotationQuaternion = new Quaternion();\n\n // Set the rotation quaternion so we can use it later for tracking.\n if (!_jointMeshes[jointIdx].rotationQuaternion) {\n _jointMeshes[jointIdx].rotationQuaternion = new Quaternion();\n }\n _jointMeshes[jointIdx].rotationQuaternion!.set(0, 0, 0, 1);\n }\n\n if (_handMesh) {\n // Note that this logic needs to happen after we initialize the joint tracking transform nodes.\n this.setHandMesh(_handMesh, rigMapping);\n }\n\n // hide the motion controller, if available/loaded\n if (this.xrController.motionController) {\n if (this.xrController.motionController.rootMesh) {\n this.xrController.motionController.rootMesh.dispose(false, true);\n }\n }\n\n this.xrController.onMotionControllerInitObservable.add((motionController) => {\n motionController._doNotLoadControllerMesh = true;\n });\n }\n\n /**\n * Sets the current hand mesh to render for the WebXRHand.\n * @param handMesh The rigged hand mesh that will be tracked to the user's hand.\n * @param rigMapping The mapping from XRHandJoint to bone names to use with the mesh.\n * @param _xrSessionManager The XRSessionManager used to initialize the hand mesh.\n */\n public setHandMesh(handMesh: AbstractMesh, rigMapping: Nullable<XRHandMeshRigMapping>, _xrSessionManager?: WebXRSessionManager) {\n this._handMesh = handMesh;\n\n this._handMeshRoot = this._handMesh;\n while (this._handMeshRoot.parent) {\n this._handMeshRoot = this._handMeshRoot.parent;\n }\n\n // Avoid any strange frustum culling. We will manually control visibility via attach and detach.\n handMesh.alwaysSelectAsActiveMesh = true;\n const children = handMesh.getChildMeshes();\n for (const mesh of children) {\n mesh.alwaysSelectAsActiveMesh = true;\n }\n\n // Link the bones in the hand mesh to the transform nodes that will be bound to the WebXR tracked joints.\n if (this._handMesh.skeleton) {\n const handMeshSkeleton = this._handMesh.skeleton;\n for (let jointIdx = 0; jointIdx < HandJointReferenceArray.length; jointIdx++) {\n const jointName = HandJointReferenceArray[jointIdx];\n const jointBoneIdx = handMeshSkeleton.getBoneIndexByName(rigMapping ? rigMapping[jointName] : jointName);\n if (jointBoneIdx !== -1) {\n handMeshSkeleton.bones[jointBoneIdx].linkTransformNode(this._jointTransforms[jointIdx]);\n }\n }\n }\n\n this.onHandMeshSetObservable.notifyObservers(this);\n }\n\n /**\n * Update this hand from the latest xr frame.\n * @param xrFrame The latest frame received from WebXR.\n * @param referenceSpace The current viewer reference space.\n * @param xrCamera the xr camera, used for parenting\n */\n public updateFromXRFrame(xrFrame: XRFrame, referenceSpace: XRReferenceSpace, xrCamera: WebXRCamera) {\n const hand = this.xrController.inputSource.hand;\n if (!hand) {\n return;\n }\n\n // TODO: Modify webxr.d.ts to better match WebXR IDL so we don't need this any cast.\n const anyHand: any = hand;\n for (let i = 0; i < HandJointReferenceArray.length; ++i) {\n this._jointSpaces[i] = anyHand[HandJointReferenceArray[i]] || hand.get(HandJointReferenceArray[i]);\n }\n let trackingSuccessful = false;\n\n if (xrFrame.fillPoses && xrFrame.fillJointRadii) {\n trackingSuccessful = xrFrame.fillPoses(this._jointSpaces, referenceSpace, this._jointTransformMatrices) && xrFrame.fillJointRadii(this._jointSpaces, this._jointRadii);\n } else if (xrFrame.getJointPose) {\n trackingSuccessful = true;\n // Warning: This codepath is slow by comparison, only here for compat.\n for (let jointIdx = 0; jointIdx < this._jointSpaces.length; jointIdx++) {\n const jointPose = xrFrame.getJointPose(this._jointSpaces[jointIdx], referenceSpace);\n if (jointPose) {\n this._jointTransformMatrices.set(jointPose.transform.matrix, jointIdx * 16);\n this._jointRadii[jointIdx] = jointPose.radius || 0.008;\n } else {\n trackingSuccessful = false;\n break;\n }\n }\n }\n\n if (!trackingSuccessful) {\n return;\n }\n\n // L1 Cache Optimization: Invert to LHS in valid Babylon systems IN PLACE\n // This linear loop is much faster than doing it per-object and avoids cache thrashing\n if (!this._scene.useRightHandedSystem) {\n for (let i = 0; i < HandJointReferenceArray.length; ++i) {\n const offset = i * 16;\n this._jointTransformMatrices[offset + 2] *= -1;\n this._jointTransformMatrices[offset + 6] *= -1;\n this._jointTransformMatrices[offset + 8] *= -1;\n this._jointTransformMatrices[offset + 9] *= -1;\n this._jointTransformMatrices[offset + 14] *= -1;\n }\n }\n\n for (let jointIdx = 0; jointIdx < HandJointReferenceArray.length; jointIdx++) {\n const jointTransform = this._jointTransforms[jointIdx];\n Matrix.FromArrayToRef(this._jointTransformMatrices, jointIdx * 16, this._tempJointMatrix);\n this._tempJointMatrix.decompose(undefined, jointTransform.rotationQuaternion!, jointTransform.position);\n\n // The radius we need to make the joint in order for it to roughly cover the joints of the user's real hand.\n const scaledJointRadius = this._jointRadii[jointIdx] * this._jointScaleFactor;\n\n const jointMesh = this._jointMeshes[jointIdx];\n jointMesh.isVisible = !this._handMesh && !this._jointsInvisible;\n jointMesh.position.copyFrom(jointTransform.position);\n jointMesh.rotationQuaternion!.copyFrom(jointTransform.rotationQuaternion!);\n jointMesh.scaling.setAll(scaledJointRadius);\n jointMesh.parent = xrCamera.parent;\n\n // Restore correct transform for meshes that are NOT left-handed (e.g. default GLTF)\n // The buffer is now LHS, so if the mesh expects RHS, we must un-flip.\n if (!this._leftHandedMeshes && !this._scene.useRightHandedSystem && this._handMesh) {\n jointTransform.position.z *= -1;\n jointTransform.rotationQuaternion!.z *= -1;\n jointTransform.rotationQuaternion!.w *= -1;\n }\n }\n\n if (this._handMesh) {\n this._handMesh.isVisible = true;\n\n if (this._handMeshRoot) {\n this._handMeshRoot.parent = xrCamera.parent;\n }\n }\n\n this.xrController.pointer.parent = xrCamera.parent;\n }\n\n /**\n * Dispose this Hand object\n * @param disposeMeshes Should the meshes be disposed as well\n */\n public dispose(disposeMeshes = false) {\n if (this._handMesh) {\n if (disposeMeshes) {\n this._handMesh.skeleton?.dispose();\n this._handMesh.dispose(false, true);\n } else {\n this._handMesh.isVisible = false;\n }\n }\n for (const transform of this._jointTransforms) {\n transform.dispose();\n }\n\n this._jointTransforms.length = 0;\n this.onHandMeshSetObservable.clear();\n }\n}\n\n/**\n * WebXR Hand Joint tracking feature, available for selected browsers and devices\n */\nexport class WebXRHandTracking extends WebXRAbstractFeature {\n /**\n * The module's name\n */\n public static readonly Name = WebXRFeatureName.HAND_TRACKING;\n /**\n * The (Babylon) version of this module.\n * This is an integer representing the implementation version.\n * This number does not correspond to the WebXR specs version\n */\n public static readonly Version = 1;\n\n /** The base URL for the default hand model. */\n public static DEFAULT_HAND_MODEL_BASE_URL = \"https://assets.babylonjs.com/core/HandMeshes/\";\n /** The filename to use for the default right hand model. */\n public static DEFAULT_HAND_MODEL_RIGHT_FILENAME = \"r_hand_rhs.glb\";\n /** The filename to use for the default left hand model. */\n public static DEFAULT_HAND_MODEL_LEFT_FILENAME = \"l_hand_rhs.glb\";\n /** The URL pointing to the default hand model NodeMaterial shader. */\n public static DEFAULT_HAND_MODEL_SHADER_URL = \"https://assets.babylonjs.com/core/HandMeshes/handsShader.json\";\n\n // We want to use lightweight models, diameter will initially be 1 but scaled to the values returned from WebXR.\n private static readonly _ICOSPHERE_PARAMS = { radius: 0.5, flat: false, subdivisions: 2 };\n\n private static _RightHandGLB: Nullable<ISceneLoaderAsyncResult> = null;\n private static _LeftHandGLB: Nullable<ISceneLoaderAsyncResult> = null;\n\n private static _GenerateTrackedJointMeshes(options: IWebXRHandTrackingOptions, originalMesh: AbstractMesh): { left: AbstractMesh[]; right: AbstractMesh[] } {\n const meshes: { left: AbstractMesh[]; right: AbstractMesh[] } = { left: [], right: [] };\n\n originalMesh.isVisible = !!options.jointMeshes?.keepOriginalVisible;\n for (const handedness of [\"left\", \"right\"] as const) {\n const h = handedness as \"left\" | \"right\";\n const trackedMeshes: AbstractMesh[] = [];\n for (let i = 0; i < HandJointReferenceArray.length; i++) {\n let newInstance: AbstractMesh;\n if (originalMesh instanceof Mesh) {\n newInstance = originalMesh.createInstance(`${handedness}-handJoint-${i}`);\n } else {\n newInstance = originalMesh.clone(`${handedness}-handJoint-${i}`, null) as AbstractMesh;\n }\n if (options.jointMeshes?.onHandJointMeshGenerated) {\n const returnedMesh = options.jointMeshes.onHandJointMeshGenerated(newInstance as InstancedMesh, i, h);\n if (returnedMesh) {\n if (returnedMesh !== newInstance) {\n newInstance.dispose();\n newInstance = returnedMesh;\n }\n }\n }\n newInstance.isPickable = false;\n if (options.jointMeshes?.enablePhysics) {\n const props = options.jointMeshes?.physicsProps;\n // downscale the instances so that physics will be initialized correctly\n newInstance.scaling.setAll(0.02);\n // Detect physics version\n const scene = newInstance.getScene();\n const physicsEngine = scene.getPhysicsEngine();\n const physicsVersion = physicsEngine?.getPluginVersion() || 1;\n\n if (physicsVersion === 2) {\n // V2 physics\n const impostorType = props?.impostorType !== undefined ? props.impostorType : PhysicsImpostor.SphereImpostor;\n let shapeType: PhysicsShapeType;\n\n // Map v1 impostor types to v2 shape types\n switch (impostorType) {\n case PhysicsImpostor.SphereImpostor:\n shapeType = PhysicsShapeType.SPHERE;\n break;\n case PhysicsImpostor.BoxImpostor:\n shapeType = PhysicsShapeType.BOX;\n break;\n case PhysicsImpostor.CapsuleImpostor:\n shapeType = PhysicsShapeType.CAPSULE;\n break;\n default:\n shapeType = PhysicsShapeType.SPHERE;\n }\n\n const aggregate = new PhysicsAggregate(\n newInstance,\n shapeType,\n {\n mass: 0,\n friction: props?.friction ?? 0.2,\n restitution: props?.restitution ?? 0.2,\n },\n scene\n );\n aggregate.body.setMotionType(PhysicsMotionType.ANIMATED);\n aggregate.body.disableSync = true;\n } else {\n // V1 physics\n const type = props?.impostorType !== undefined ? props.impostorType : PhysicsImpostor.SphereImpostor;\n newInstance.physicsImpostor = new PhysicsImpostor(newInstance, type, props ? { mass: 0, ...props } : { mass: 0 });\n }\n }\n newInstance.isVisible = false;\n newInstance.rotationQuaternion = new Quaternion();\n trackedMeshes.push(newInstance);\n }\n\n meshes[h] = trackedMeshes;\n }\n return meshes;\n }\n\n private static async _GenerateDefaultHandMeshesAsync(\n xrSessionManager: WebXRSessionManager,\n options?: IWebXRHandTrackingOptions\n ): Promise<{ left: AbstractMesh; right: AbstractMesh }> {\n const scene = xrSessionManager.scene;\n // eslint-disable-next-line no-async-promise-executor\n return await new Promise(async (resolve) => {\n const riggedMeshes: { [handedness: string]: AbstractMesh } = {};\n // check the cache, defensive\n if (WebXRHandTracking._RightHandGLB?.meshes[1]?.isDisposed()) {\n WebXRHandTracking._RightHandGLB = null;\n }\n if (WebXRHandTracking._LeftHandGLB?.meshes[1]?.isDisposed()) {\n WebXRHandTracking._LeftHandGLB = null;\n }\n\n const handsDefined = !!(WebXRHandTracking._RightHandGLB && WebXRHandTracking._LeftHandGLB);\n // load them in parallel\n const defaulrHandGLBUrl = Tools.GetAssetUrl(WebXRHandTracking.DEFAULT_HAND_MODEL_BASE_URL);\n const handGLBs = await Promise.all([\n WebXRHandTracking._RightHandGLB || SceneLoader.ImportMeshAsync(\"\", defaulrHandGLBUrl, WebXRHandTracking.DEFAULT_HAND_MODEL_RIGHT_FILENAME, scene),\n WebXRHandTracking._LeftHandGLB || SceneLoader.ImportMeshAsync(\"\", defaulrHandGLBUrl, WebXRHandTracking.DEFAULT_HAND_MODEL_LEFT_FILENAME, scene),\n ]);\n // eslint-disable-next-line require-atomic-updates\n WebXRHandTracking._RightHandGLB = handGLBs[0];\n // eslint-disable-next-line require-atomic-updates\n WebXRHandTracking._LeftHandGLB = handGLBs[1];\n const shaderUrl = Tools.GetAssetUrl(WebXRHandTracking.DEFAULT_HAND_MODEL_SHADER_URL);\n const handShader = await NodeMaterialParseFromFileAsync(\"handShader\", shaderUrl, scene, undefined, true);\n\n // depth prepass and alpha mode\n handShader.needDepthPrePass = true;\n handShader.transparencyMode = Material.MATERIAL_ALPHABLEND;\n handShader.alphaMode = Constants.ALPHA_COMBINE;\n\n // build node materials\n handShader.build(false);\n\n // shader\n const handColors = {\n base: Color3.FromInts(116, 63, 203),\n fresnel: Color3.FromInts(149, 102, 229),\n fingerColor: Color3.FromInts(177, 130, 255),\n tipFresnel: Color3.FromInts(220, 200, 255),\n ...options?.handMeshes?.customColors,\n };\n\n const handNodes = {\n base: handShader.getBlockByName(\"baseColor\") as InputBlock,\n fresnel: handShader.getBlockByName(\"fresnelColor\") as InputBlock,\n fingerColor: handShader.getBlockByName(\"fingerColor\") as InputBlock,\n tipFresnel: handShader.getBlockByName(\"tipFresnelColor\") as InputBlock,\n };\n\n handNodes.base.value = handColors.base;\n handNodes.fresnel.value = handColors.fresnel;\n handNodes.fingerColor.value = handColors.fingerColor;\n handNodes.tipFresnel.value = handColors.tipFresnel;\n const isMultiview = (xrSessionManager._getBaseLayerWrapper() as WebXRCompositionLayerWrapper)?.isMultiview;\n const hd = [\"left\", \"right\"];\n for (const handedness of hd) {\n const handGLB = handedness == \"left\" ? WebXRHandTracking._LeftHandGLB : WebXRHandTracking._RightHandGLB;\n if (!handGLB) {\n // this should never happen!\n throw new Error(\"Could not load hand model\");\n }\n const handMesh = handGLB.meshes[1];\n handMesh._internalAbstractMeshDataInfo._computeBonesUsingShaders = true;\n if (handMesh.skeleton) {\n handMesh.skeleton.useTextureToStoreBoneMatrices = false;\n }\n // if in multiview do not use the material\n if (!isMultiview && !options?.handMeshes?.disableHandShader) {\n handMesh.material = handShader.clone(`${handedness}HandShaderClone`, true);\n handMesh.material.freeze();\n }\n handMesh.isVisible = false;\n\n riggedMeshes[handedness] = handMesh;\n\n // single change for left handed systems\n if (!handsDefined && !scene.useRightHandedSystem) {\n handGLB.meshes[1].rotate(Axis.Y, Math.PI);\n }\n }\n\n handShader.dispose();\n resolve({ left: riggedMeshes.left, right: riggedMeshes.right });\n });\n }\n\n /**\n * Generates a mapping from XRHandJoint to bone name for the default hand mesh.\n * @param handedness The handedness being mapped for.\n * @returns A mapping from XRHandJoint to bone name.\n */\n private static _GenerateDefaultHandMeshRigMapping(handedness: XRHandedness): XRHandMeshRigMapping {\n const h = handedness == \"right\" ? \"R\" : \"L\";\n return {\n [WebXRHandJoint.WRIST]: `wrist_${h}`,\n [WebXRHandJoint.THUMB_METACARPAL]: `thumb_metacarpal_${h}`,\n [WebXRHandJoint.THUMB_PHALANX_PROXIMAL]: `thumb_proxPhalanx_${h}`,\n [WebXRHandJoint.THUMB_PHALANX_DISTAL]: `thumb_distPhalanx_${h}`,\n [WebXRHandJoint.THUMB_TIP]: `thumb_tip_${h}`,\n [WebXRHandJoint.INDEX_FINGER_METACARPAL]: `index_metacarpal_${h}`,\n [WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL]: `index_proxPhalanx_${h}`,\n [WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE]: `index_intPhalanx_${h}`,\n [WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL]: `index_distPhalanx_${h}`,\n [WebXRHandJoint.INDEX_FINGER_TIP]: `index_tip_${h}`,\n [WebXRHandJoint.MIDDLE_FINGER_METACARPAL]: `middle_metacarpal_${h}`,\n [WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL]: `middle_proxPhalanx_${h}`,\n [WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE]: `middle_intPhalanx_${h}`,\n [WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL]: `middle_distPhalanx_${h}`,\n [WebXRHandJoint.MIDDLE_FINGER_TIP]: `middle_tip_${h}`,\n [WebXRHandJoint.RING_FINGER_METACARPAL]: `ring_metacarpal_${h}`,\n [WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL]: `ring_proxPhalanx_${h}`,\n [WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE]: `ring_intPhalanx_${h}`,\n [WebXRHandJoint.RING_FINGER_PHALANX_DISTAL]: `ring_distPhalanx_${h}`,\n [WebXRHandJoint.RING_FINGER_TIP]: `ring_tip_${h}`,\n [WebXRHandJoint.PINKY_FINGER_METACARPAL]: `little_metacarpal_${h}`,\n [WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL]: `little_proxPhalanx_${h}`,\n [WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE]: `little_intPhalanx_${h}`,\n [WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL]: `little_distPhalanx_${h}`,\n [WebXRHandJoint.PINKY_FINGER_TIP]: `little_tip_${h}`,\n };\n }\n\n private _attachedHands: {\n [uniqueId: string]: WebXRHand;\n } = {};\n\n private _trackingHands: {\n left: Nullable<WebXRHand>;\n right: Nullable<WebXRHand>;\n } = { left: null, right: null };\n\n private _handResources: {\n jointMeshes: Nullable<{ left: AbstractMesh[]; right: AbstractMesh[] }>;\n handMeshes: Nullable<{ left: AbstractMesh; right: AbstractMesh }>;\n rigMappings: Nullable<{ left: XRHandMeshRigMapping; right: XRHandMeshRigMapping }>;\n } = { jointMeshes: null, handMeshes: null, rigMappings: null };\n\n private _worldScaleObserver?: Nullable<Observer<{ previousScaleFactor: number; newScaleFactor: number }>> = null;\n\n /**\n * This observable will notify registered observers when a new hand object was added and initialized\n */\n public onHandAddedObservable: Observable<WebXRHand> = new Observable();\n /**\n * This observable will notify its observers right before the hand object is disposed\n */\n public onHandRemovedObservable: Observable<WebXRHand> = new Observable();\n\n private _originalMesh?: Mesh;\n\n /**\n * Check if the needed objects are defined.\n * This does not mean that the feature is enabled, but that the objects needed are well defined.\n * @returns true if the needed objects for this feature are defined\n */\n public override isCompatible(): boolean {\n return typeof XRHand !== \"undefined\";\n }\n\n /**\n * Get the hand object according to the controller id\n * @param controllerId the controller id to which we want to get the hand\n * @returns null if not found or the WebXRHand object if found\n */\n public getHandByControllerId(controllerId: string): Nullable<WebXRHand> {\n return this._attachedHands[controllerId];\n }\n\n /**\n * Get a hand object according to the requested handedness\n * @param handedness the handedness to request\n * @returns null if not found or the WebXRHand object if found\n */\n public getHandByHandedness(handedness: XRHandedness): Nullable<WebXRHand> {\n if (handedness == \"none\") {\n return null;\n }\n return this._trackingHands[handedness];\n }\n\n /**\n * Creates a new instance of the XR hand tracking feature.\n * @param _xrSessionManager An instance of WebXRSessionManager.\n * @param options Options to use when constructing this feature.\n */\n constructor(\n _xrSessionManager: WebXRSessionManager,\n /** Options to use when constructing this feature. */\n public readonly options: IWebXRHandTrackingOptions\n ) {\n super(_xrSessionManager);\n this.xrNativeFeatureName = \"hand-tracking\";\n\n // Support legacy versions of the options object by copying over joint mesh properties\n const anyOptions = options as any;\n const anyJointMeshOptions = anyOptions.jointMeshes;\n if (anyJointMeshOptions) {\n if (typeof anyJointMeshOptions.disableDefaultHandMesh !== \"undefined\") {\n options.handMeshes = options.handMeshes || {};\n options.handMeshes.disableDefaultMeshes = anyJointMeshOptions.disableDefaultHandMesh;\n }\n if (typeof anyJointMeshOptions.handMeshes !== \"undefined\") {\n options.handMeshes = options.handMeshes || {};\n options.handMeshes.customMeshes = anyJointMeshOptions.handMeshes;\n }\n if (typeof anyJointMeshOptions.leftHandedSystemMeshes !== \"undefined\") {\n options.handMeshes = options.handMeshes || {};\n options.handMeshes.meshesUseLeftHandedCoordinates = anyJointMeshOptions.leftHandedSystemMeshes;\n }\n if (typeof anyJointMeshOptions.rigMapping !== \"undefined\") {\n options.handMeshes = options.handMeshes || {};\n const leftRigMapping = {};\n const rightRigMapping = {};\n const rigMappingTuples = [\n [anyJointMeshOptions.rigMapping.left, leftRigMapping],\n [anyJointMeshOptions.rigMapping.right, rightRigMapping],\n ];\n\n for (const rigMappingTuple of rigMappingTuples) {\n const legacyRigMapping = rigMappingTuple[0] as string[];\n const rigMapping = rigMappingTuple[1] as XRHandMeshRigMapping;\n for (let index = 0; index < legacyRigMapping.length; index++) {\n const modelJointName = legacyRigMapping[index];\n rigMapping[HandJointReferenceArray[index]] = modelJointName;\n }\n }\n options.handMeshes.customRigMappings = {\n left: leftRigMapping as XRHandMeshRigMapping,\n right: rightRigMapping as XRHandMeshRigMapping,\n };\n }\n }\n }\n\n /**\n * Attach this feature.\n * Will usually be called by the features manager.\n *\n * @returns true if successful.\n */\n public override attach(): boolean {\n if (!super.attach()) {\n return false;\n }\n\n if (!this._handResources.jointMeshes) {\n this._originalMesh =\n this._originalMesh || this.options.jointMeshes?.sourceMesh || CreateIcoSphere(\"jointParent\", WebXRHandTracking._ICOSPHERE_PARAMS, this._xrSessionManager.scene);\n this._originalMesh.isVisible = false;\n\n this._handResources.jointMeshes = WebXRHandTracking._GenerateTrackedJointMeshes(this.options, this._originalMesh);\n }\n this._handResources.handMeshes = this.options.handMeshes?.customMeshes || null;\n this._handResources.rigMappings = this.options.handMeshes?.customRigMappings || null;\n // If they didn't supply custom meshes and are not disabling the default meshes...\n if (!this.options.handMeshes?.customMeshes && !this.options.handMeshes?.disableDefaultMeshes) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\n WebXRHandTracking._GenerateDefaultHandMeshesAsync(this._xrSessionManager, this.options).then((defaultHandMeshes) => {\n this._handResources.handMeshes = defaultHandMeshes;\n this._handResources.rigMappings = {\n left: WebXRHandTracking._GenerateDefaultHandMeshRigMapping(\"left\"),\n right: WebXRHandTracking._GenerateDefaultHandMeshRigMapping(\"right\"),\n };\n\n // Apply meshes to existing hands if already tracking.\n this._trackingHands.left?.setHandMesh(this._handResources.handMeshes.left, this._handResources.rigMappings.left, this._xrSessionManager);\n this._trackingHands.right?.setHandMesh(this._handResources.handMeshes.right, this._handResources.rigMappings.right, this._xrSessionManager);\n this._handResources.handMeshes.left.scaling.setAll(this._xrSessionManager.worldScalingFactor);\n this._handResources.handMeshes.right.scaling.setAll(this._xrSessionManager.worldScalingFactor);\n });\n this._worldScaleObserver = this._xrSessionManager.onWorldScaleFactorChangedObservable.add((scalingFactors) => {\n if (this._handResources.handMeshes) {\n this._handResources.handMeshes.left.scaling.scaleInPlace(scalingFactors.newScaleFactor / scalingFactors.previousScaleFactor);\n this._handResources.handMeshes.right.scaling.scaleInPlace(scalingFactors.newScaleFactor / scalingFactors.previousScaleFactor);\n }\n });\n }\n\n for (const controller of this.options.xrInput.controllers) {\n this._attachHand(controller);\n }\n\n this._addNewAttachObserver(this.options.xrInput.onControllerAddedObservable, this._attachHand);\n this._addNewAttachObserver(this.options.xrInput.onControllerRemovedObservable, this._detachHand);\n\n return true;\n }\n\n protected _onXRFrame(_xrFrame: XRFrame): void {\n this._trackingHands.left?.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace, this.options.xrInput.xrCamera);\n this._trackingHands.right?.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace, this.options.xrInput.xrCamera);\n }\n\n private _attachHand = (xrController: WebXRInputSource) => {\n if (!xrController.inputSource.hand || xrController.inputSource.handedness == \"none\" || !this._handResources.jointMeshes) {\n return;\n }\n\n const handedness = xrController.inputSource.handedness;\n const webxrHand = new WebXRHand(\n xrController,\n this._handResources.jointMeshes && this._handResources.jointMeshes[handedness],\n this._handResources.handMeshes && this._handResources.handMeshes[handedness],\n this._handResources.rigMappings && this._handResources.rigMappings[handedness],\n this.options.handMeshes?.meshesUseLeftHandedCoordinates,\n this.options.jointMeshes?.invisible,\n this.options.jointMeshes?.scaleFactor\n );\n\n this._attachedHands[xrController.uniqueId] = webxrHand;\n this._trackingHands[handedness] = webxrHand;\n\n this.onHandAddedObservable.notifyObservers(webxrHand);\n };\n\n private _detachHandById(controllerId: string, disposeMesh?: boolean) {\n const hand = this.getHandByControllerId(controllerId);\n if (hand) {\n const handedness = hand.xrController.inputSource.handedness == \"left\" ? \"left\" : \"right\";\n if (this._trackingHands[handedness]?.xrController.uniqueId === controllerId) {\n this._trackingHands[handedness] = null;\n }\n this.onHandRemovedObservable.notifyObservers(hand);\n hand.dispose(disposeMesh);\n delete this._attachedHands[controllerId];\n }\n }\n\n private _detachHand = (xrController: WebXRInputSource) => {\n this._detachHandById(xrController.uniqueId);\n };\n\n /**\n * Detach this feature.\n * Will usually be called by the features manager.\n *\n * @returns true if successful.\n */\n public override detach(): boolean {\n if (!super.detach()) {\n return false;\n }\n\n const keys = Object.keys(this._attachedHands);\n for (const uniqueId of keys) {\n this._detachHandById(uniqueId, this.options.handMeshes?.disposeOnSessionEnd);\n }\n\n if (this.options.handMeshes?.disposeOnSessionEnd) {\n if (this._handResources.jointMeshes) {\n for (const trackedMesh of this._handResources.jointMeshes.left) {\n trackedMesh.dispose();\n }\n for (const trackedMesh of this._handResources.jointMeshes.right) {\n trackedMesh.dispose();\n }\n this._handResources.jointMeshes = null;\n }\n\n if (this._handResources.handMeshes) {\n this._handResources.handMeshes.left.dispose();\n this._handResources.handMeshes.right.dispose();\n this._handResources.handMeshes = null;\n }\n\n if (WebXRHandTracking._RightHandGLB) {\n for (const mesh of WebXRHandTracking._RightHandGLB.meshes) {\n mesh.dispose();\n }\n }\n if (WebXRHandTracking._LeftHandGLB) {\n for (const mesh of WebXRHandTracking._LeftHandGLB.meshes) {\n mesh.dispose();\n }\n }\n WebXRHandTracking._RightHandGLB = null;\n WebXRHandTracking._LeftHandGLB = null;\n this._originalMesh?.dispose();\n this._originalMesh = undefined;\n }\n\n // remove world scale observer\n if (this._worldScaleObserver) {\n this._xrSessionManager.onWorldScaleFactorChangedObservable.remove(this._worldScaleObserver);\n }\n\n return true;\n }\n\n /**\n * Dispose this feature and all of the resources attached.\n */\n public override dispose(): void {\n super.dispose();\n this.onHandAddedObservable.clear();\n this.onHandRemovedObservable.clear();\n\n if (this._handResources.handMeshes && !this.options.handMeshes?.customMeshes) {\n // this will dispose the cached meshes\n this._handResources.handMeshes.left.dispose();\n this._handResources.handMeshes.right.dispose();\n // remove the cached meshes\n\n if (WebXRHandTracking._RightHandGLB) {\n for (const mesh of WebXRHandTracking._RightHandGLB.meshes) {\n mesh.dispose();\n }\n }\n if (WebXRHandTracking._LeftHandGLB) {\n for (const mesh of WebXRHandTracking._LeftHandGLB.meshes) {\n mesh.dispose();\n }\n }\n WebXRHandTracking._RightHandGLB = null;\n WebXRHandTracking._LeftHandGLB = null;\n }\n\n if (this._handResources.jointMeshes) {\n for (const trackedMesh of this._handResources.jointMeshes.left) {\n trackedMesh.dispose();\n }\n for (const trackedMesh of this._handResources.jointMeshes.right) {\n trackedMesh.dispose();\n }\n }\n }\n}\n\nlet _Registered = false;\n/**\n * Register side effects for webXRHandTracking.\n * Safe to call multiple times; only the first call has an effect.\n */\nexport function RegisterWebXRHandTracking(): void {\n if (_Registered) {\n return;\n }\n _Registered = true;\n\n //register the plugin\n WebXRFeaturesManager.AddWebXRFeature(\n WebXRHandTracking.Name,\n (xrSessionManager, options) => {\n return () => new WebXRHandTracking(xrSessionManager, options);\n },\n WebXRHandTracking.Version,\n false\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"WebXRHandTracking.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRHandTracking.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\n\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\nimport { type WebXRSessionManager } from \"../webXRSessionManager\";\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\nimport { type AbstractMesh } from \"../../Meshes/abstractMesh.pure\";\nimport { Mesh } from \"../../Meshes/mesh.pure\";\nimport { type WebXRInput } from \"../webXRInput\";\nimport { type WebXRInputSource } from \"../webXRInputSource\";\nimport { Matrix, Quaternion } from \"../../Maths/math.vector.pure\";\nimport { type Nullable } from \"../../types\";\nimport { PhysicsImpostor } from \"../../Physics/v1/physicsImpostor.pure\";\nimport { PhysicsAggregate } from \"../../Physics/v2/physicsAggregate\";\nimport { PhysicsMotionType, PhysicsShapeType } from \"../../Physics/v2/IPhysicsEnginePlugin\";\nimport { type IDisposable, type Scene } from \"../../scene.pure\";\nimport { Observable } from \"../../Misc/observable.pure\";\nimport { type Observer } from \"../../Misc/observable\";\nimport { type InstancedMesh, RegisterInstancedMesh } from \"../../Meshes/instancedMesh.pure\";\nimport { SceneLoader, type ISceneLoaderAsyncResult } from \"../../Loading/sceneLoader\";\n\nimport { Color3 } from \"../../Maths/math.color.pure\";\nimport { NodeMaterialParseFromFileAsync } from \"../../Materials/Node/nodeMaterial.pure\";\nimport { type InputBlock } from \"../../Materials/Node/Blocks/Input/inputBlock.pure\";\nimport { Material } from \"../../Materials/material.pure\";\nimport { CreateIcoSphere } from \"../../Meshes/Builders/icoSphereBuilder.pure\";\nimport { TransformNode } from \"../../Meshes/transformNode.pure\";\nimport { Axis } from \"../../Maths/math.axis\";\nimport { Constants } from \"../../Engines/constants\";\nimport { type WebXRCompositionLayerWrapper } from \"./Layers/WebXRCompositionLayer\";\nimport { Tools } from \"core/Misc/tools.pure\";\nimport { type WebXRCamera } from \"../webXRCamera\";\nimport { type Node } from \"../../node\";\n\ndeclare const XRHand: XRHand;\n\n/**\n * Configuration interface for the hand tracking feature\n */\nexport interface IWebXRHandTrackingOptions {\n /**\n * The xrInput that will be used as source for new hands\n */\n xrInput: WebXRInput;\n\n /**\n * Configuration object for the joint meshes.\n */\n jointMeshes?: {\n /**\n * Should the meshes created be invisible (defaults to false).\n */\n invisible?: boolean;\n /**\n * A source mesh to be used to create instances. Defaults to an icosphere with two subdivisions and smooth lighting.\n * This mesh will be the source for all other (25) meshes.\n * It should have the general size of a single unit, as the instances will be scaled according to the provided radius.\n */\n sourceMesh?: Mesh;\n /**\n * This function will be called after a mesh was created for a specific joint.\n * Using this function you can either manipulate the instance or return a new mesh.\n * When returning a new mesh the instance created before will be disposed.\n * @param meshInstance An instance of the original joint mesh being used for the joint.\n * @param jointId The joint's index, see https://immersive-web.github.io/webxr-hand-input/#skeleton-joints-section for more info.\n * @param hand Which hand (\"left\", \"right\") the joint will be on.\n */\n onHandJointMeshGenerated?: (meshInstance: InstancedMesh, jointId: number, hand: XRHandedness) => AbstractMesh | undefined;\n /**\n * Should the source mesh stay visible (defaults to false).\n */\n keepOriginalVisible?: boolean;\n /**\n * Should each instance have its own physics impostor\n */\n enablePhysics?: boolean;\n /**\n * If enabled, override default physics properties\n */\n physicsProps?: { friction?: number; restitution?: number; impostorType?: number };\n /**\n * Scale factor for all joint meshes (defaults to 1)\n */\n scaleFactor?: number;\n };\n\n /**\n * Configuration object for the hand meshes.\n */\n handMeshes?: {\n /**\n * Should the default hand mesh be disabled. In this case, the spheres will be visible (unless set invisible).\n */\n disableDefaultMeshes?: boolean;\n /**\n * Rigged hand meshes that will be tracked to the user's hands. This will override the default hand mesh.\n */\n customMeshes?: {\n right: AbstractMesh;\n left: AbstractMesh;\n };\n /**\n * Are the meshes prepared for a left-handed system. Default hand meshes are right-handed.\n */\n meshesUseLeftHandedCoordinates?: boolean;\n /**\n * If a hand mesh was provided, this array will define what axis will update which node. This will override the default hand mesh\n */\n customRigMappings?: {\n right: XRHandMeshRigMapping;\n left: XRHandMeshRigMapping;\n };\n\n /**\n * Override the colors of the hand meshes.\n */\n customColors?: {\n base?: Color3;\n fresnel?: Color3;\n fingerColor?: Color3;\n tipFresnel?: Color3;\n };\n\n /**\n * Define whether or not the hand meshes should be disposed on just invisible when the session ends.\n * Not setting, or setting to false, will maintain the hand meshes in the scene after the session ends, which will allow q quicker re-entry into XR.\n */\n disposeOnSessionEnd?: boolean;\n\n /**\n * Setting this will allow the developer to avoid loading the NME material and use the standard material instead.\n */\n disableHandShader?: boolean;\n };\n}\n\n/**\n * Parts of the hands divided to writs and finger names\n */\nexport const enum HandPart {\n /**\n * HandPart - Wrist\n */\n WRIST = \"wrist\",\n /**\n * HandPart - The thumb\n */\n THUMB = \"thumb\",\n /**\n * HandPart - Index finger\n */\n INDEX = \"index\",\n /**\n * HandPart - Middle finger\n */\n MIDDLE = \"middle\",\n /**\n * HandPart - Ring finger\n */\n RING = \"ring\",\n /**\n * HandPart - Little finger\n */\n LITTLE = \"little\",\n}\n\n/**\n * Joints of the hand as defined by the WebXR specification.\n * https://immersive-web.github.io/webxr-hand-input/#skeleton-joints-section\n */\nexport const enum WebXRHandJoint {\n /** Wrist */\n WRIST = \"wrist\",\n\n /** Thumb near wrist */\n THUMB_METACARPAL = \"thumb-metacarpal\",\n /** Thumb first knuckle */\n THUMB_PHALANX_PROXIMAL = \"thumb-phalanx-proximal\",\n /** Thumb second knuckle */\n THUMB_PHALANX_DISTAL = \"thumb-phalanx-distal\",\n /** Thumb tip */\n THUMB_TIP = \"thumb-tip\",\n\n /** Index finger near wrist */\n INDEX_FINGER_METACARPAL = \"index-finger-metacarpal\",\n /** Index finger first knuckle */\n INDEX_FINGER_PHALANX_PROXIMAL = \"index-finger-phalanx-proximal\",\n /** Index finger second knuckle */\n INDEX_FINGER_PHALANX_INTERMEDIATE = \"index-finger-phalanx-intermediate\",\n /** Index finger third knuckle */\n INDEX_FINGER_PHALANX_DISTAL = \"index-finger-phalanx-distal\",\n /** Index finger tip */\n INDEX_FINGER_TIP = \"index-finger-tip\",\n\n /** Middle finger near wrist */\n MIDDLE_FINGER_METACARPAL = \"middle-finger-metacarpal\",\n /** Middle finger first knuckle */\n MIDDLE_FINGER_PHALANX_PROXIMAL = \"middle-finger-phalanx-proximal\",\n /** Middle finger second knuckle */\n MIDDLE_FINGER_PHALANX_INTERMEDIATE = \"middle-finger-phalanx-intermediate\",\n /** Middle finger third knuckle */\n MIDDLE_FINGER_PHALANX_DISTAL = \"middle-finger-phalanx-distal\",\n /** Middle finger tip */\n MIDDLE_FINGER_TIP = \"middle-finger-tip\",\n\n /** Ring finger near wrist */\n RING_FINGER_METACARPAL = \"ring-finger-metacarpal\",\n /** Ring finger first knuckle */\n RING_FINGER_PHALANX_PROXIMAL = \"ring-finger-phalanx-proximal\",\n /** Ring finger second knuckle */\n RING_FINGER_PHALANX_INTERMEDIATE = \"ring-finger-phalanx-intermediate\",\n /** Ring finger third knuckle */\n RING_FINGER_PHALANX_DISTAL = \"ring-finger-phalanx-distal\",\n /** Ring finger tip */\n RING_FINGER_TIP = \"ring-finger-tip\",\n\n /** Pinky finger near wrist */\n PINKY_FINGER_METACARPAL = \"pinky-finger-metacarpal\",\n /** Pinky finger first knuckle */\n PINKY_FINGER_PHALANX_PROXIMAL = \"pinky-finger-phalanx-proximal\",\n /** Pinky finger second knuckle */\n PINKY_FINGER_PHALANX_INTERMEDIATE = \"pinky-finger-phalanx-intermediate\",\n /** Pinky finger third knuckle */\n PINKY_FINGER_PHALANX_DISTAL = \"pinky-finger-phalanx-distal\",\n /** Pinky finger tip */\n PINKY_FINGER_TIP = \"pinky-finger-tip\",\n}\n\n/** A type encapsulating a dictionary mapping WebXR joints to bone names in a rigged hand mesh. */\nexport type XRHandMeshRigMapping = { [webXRJointName in WebXRHandJoint]: string };\n\nconst HandJointReferenceArray: WebXRHandJoint[] = [\n WebXRHandJoint.WRIST,\n WebXRHandJoint.THUMB_METACARPAL,\n WebXRHandJoint.THUMB_PHALANX_PROXIMAL,\n WebXRHandJoint.THUMB_PHALANX_DISTAL,\n WebXRHandJoint.THUMB_TIP,\n WebXRHandJoint.INDEX_FINGER_METACARPAL,\n WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL,\n WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE,\n WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL,\n WebXRHandJoint.INDEX_FINGER_TIP,\n WebXRHandJoint.MIDDLE_FINGER_METACARPAL,\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL,\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE,\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL,\n WebXRHandJoint.MIDDLE_FINGER_TIP,\n WebXRHandJoint.RING_FINGER_METACARPAL,\n WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL,\n WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE,\n WebXRHandJoint.RING_FINGER_PHALANX_DISTAL,\n WebXRHandJoint.RING_FINGER_TIP,\n WebXRHandJoint.PINKY_FINGER_METACARPAL,\n WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL,\n WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE,\n WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL,\n WebXRHandJoint.PINKY_FINGER_TIP,\n];\n\nconst HandPartsDefinition: { [key in HandPart]: WebXRHandJoint[] } = {\n [HandPart.WRIST]: [WebXRHandJoint.WRIST],\n [HandPart.THUMB]: [WebXRHandJoint.THUMB_METACARPAL, WebXRHandJoint.THUMB_PHALANX_PROXIMAL, WebXRHandJoint.THUMB_PHALANX_DISTAL, WebXRHandJoint.THUMB_TIP],\n [HandPart.INDEX]: [\n WebXRHandJoint.INDEX_FINGER_METACARPAL,\n WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL,\n WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE,\n WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL,\n WebXRHandJoint.INDEX_FINGER_TIP,\n ],\n [HandPart.MIDDLE]: [\n WebXRHandJoint.MIDDLE_FINGER_METACARPAL,\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL,\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE,\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL,\n WebXRHandJoint.MIDDLE_FINGER_TIP,\n ],\n [HandPart.RING]: [\n WebXRHandJoint.RING_FINGER_METACARPAL,\n WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL,\n WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE,\n WebXRHandJoint.RING_FINGER_PHALANX_DISTAL,\n WebXRHandJoint.RING_FINGER_TIP,\n ],\n [HandPart.LITTLE]: [\n WebXRHandJoint.PINKY_FINGER_METACARPAL,\n WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL,\n WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE,\n WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL,\n WebXRHandJoint.PINKY_FINGER_TIP,\n ],\n};\n\n/**\n * Representing a single hand (with its corresponding native XRHand object)\n */\nexport class WebXRHand implements IDisposable {\n /**\n * This observable will notify registered observers when the hand object has been set with a new mesh.\n * you can get the hand mesh using `webxrHand.handMesh`\n */\n public onHandMeshSetObservable = new Observable<WebXRHand>();\n\n private _scene: Scene;\n\n /**\n * Transform nodes that will directly receive the transforms from the WebXR matrix data.\n */\n private _jointTransforms = new Array<TransformNode>(HandJointReferenceArray.length);\n\n /**\n * The float array that will directly receive the transform matrix data from WebXR.\n */\n private _jointTransformMatrices = new Float32Array(HandJointReferenceArray.length * 16);\n private _jointSpaces: XRJointSpace[] = new Array(HandJointReferenceArray.length);\n\n private _tempJointMatrix = new Matrix();\n\n /**\n * The float array that will directly receive the joint radii from WebXR.\n */\n private _jointRadii = new Float32Array(HandJointReferenceArray.length);\n\n /**\n * The hand mesh's top-most parent, if any.\n */\n private _handMeshRoot: Nullable<Node> = null;\n\n /**\n * Get the hand mesh.\n */\n public get handMesh(): Nullable<AbstractMesh> {\n return this._handMesh;\n }\n\n /**\n * Get meshes of part of the hand.\n * @param part The part of hand to get.\n * @returns An array of meshes that correlate to the hand part requested.\n */\n public getHandPartMeshes(part: HandPart): AbstractMesh[] {\n return HandPartsDefinition[part].map((name) => this._jointMeshes[HandJointReferenceArray.indexOf(name)]);\n }\n\n /**\n * Retrieves a mesh linked to a named joint in the hand.\n * @param jointName The name of the joint.\n * @returns An AbstractMesh whose position corresponds with the joint position.\n */\n public getJointMesh(jointName: WebXRHandJoint): AbstractMesh {\n return this._jointMeshes[HandJointReferenceArray.indexOf(jointName)];\n }\n\n /**\n * Construct a new hand object\n * @param xrController The controller to which the hand correlates.\n * @param _jointMeshes The meshes to be used to track the hand joints.\n * @param _handMesh An optional hand mesh.\n * @param rigMapping An optional rig mapping for the hand mesh.\n * If not provided (but a hand mesh is provided),\n * it will be assumed that the hand mesh's bones are named\n * directly after the WebXR bone names.\n * @param _leftHandedMeshes Are the hand meshes left-handed-system meshes\n * @param _jointsInvisible Are the tracked joint meshes visible\n * @param _jointScaleFactor Scale factor for all joint meshes\n */\n constructor(\n /** The controller to which the hand correlates. */\n public readonly xrController: WebXRInputSource,\n private readonly _jointMeshes: AbstractMesh[],\n private _handMesh: Nullable<AbstractMesh>,\n /** An optional rig mapping for the hand mesh. If not provided (but a hand mesh is provided),\n * it will be assumed that the hand mesh's bones are named directly after the WebXR bone names. */\n readonly rigMapping: Nullable<XRHandMeshRigMapping>,\n private readonly _leftHandedMeshes: boolean = false,\n private readonly _jointsInvisible: boolean = false,\n private readonly _jointScaleFactor: number = 1\n ) {\n this._scene = _jointMeshes[0].getScene();\n\n // Initialize the joint transform quaternions and link the transforms to the bones.\n for (let jointIdx = 0; jointIdx < this._jointTransforms.length; jointIdx++) {\n this._jointTransforms[jointIdx] = new TransformNode(HandJointReferenceArray[jointIdx], this._scene);\n this._jointTransforms[jointIdx].rotationQuaternion = new Quaternion();\n\n // Set the rotation quaternion so we can use it later for tracking.\n if (!_jointMeshes[jointIdx].rotationQuaternion) {\n _jointMeshes[jointIdx].rotationQuaternion = new Quaternion();\n }\n _jointMeshes[jointIdx].rotationQuaternion!.set(0, 0, 0, 1);\n }\n\n if (_handMesh) {\n // Note that this logic needs to happen after we initialize the joint tracking transform nodes.\n this.setHandMesh(_handMesh, rigMapping);\n }\n\n // hide the motion controller, if available/loaded\n if (this.xrController.motionController) {\n if (this.xrController.motionController.rootMesh) {\n this.xrController.motionController.rootMesh.dispose(false, true);\n }\n }\n\n this.xrController.onMotionControllerInitObservable.add((motionController) => {\n motionController._doNotLoadControllerMesh = true;\n });\n }\n\n /**\n * Sets the current hand mesh to render for the WebXRHand.\n * @param handMesh The rigged hand mesh that will be tracked to the user's hand.\n * @param rigMapping The mapping from XRHandJoint to bone names to use with the mesh.\n * @param _xrSessionManager The XRSessionManager used to initialize the hand mesh.\n */\n public setHandMesh(handMesh: AbstractMesh, rigMapping: Nullable<XRHandMeshRigMapping>, _xrSessionManager?: WebXRSessionManager) {\n this._handMesh = handMesh;\n\n this._handMeshRoot = this._handMesh;\n while (this._handMeshRoot.parent) {\n this._handMeshRoot = this._handMeshRoot.parent;\n }\n\n // Avoid any strange frustum culling. We will manually control visibility via attach and detach.\n handMesh.alwaysSelectAsActiveMesh = true;\n const children = handMesh.getChildMeshes();\n for (const mesh of children) {\n mesh.alwaysSelectAsActiveMesh = true;\n }\n\n // Link the bones in the hand mesh to the transform nodes that will be bound to the WebXR tracked joints.\n if (this._handMesh.skeleton) {\n const handMeshSkeleton = this._handMesh.skeleton;\n for (let jointIdx = 0; jointIdx < HandJointReferenceArray.length; jointIdx++) {\n const jointName = HandJointReferenceArray[jointIdx];\n const jointBoneIdx = handMeshSkeleton.getBoneIndexByName(rigMapping ? rigMapping[jointName] : jointName);\n if (jointBoneIdx !== -1) {\n handMeshSkeleton.bones[jointBoneIdx].linkTransformNode(this._jointTransforms[jointIdx]);\n }\n }\n }\n\n this.onHandMeshSetObservable.notifyObservers(this);\n }\n\n /**\n * Update this hand from the latest xr frame.\n * @param xrFrame The latest frame received from WebXR.\n * @param referenceSpace The current viewer reference space.\n * @param xrCamera the xr camera, used for parenting\n */\n public updateFromXRFrame(xrFrame: XRFrame, referenceSpace: XRReferenceSpace, xrCamera: WebXRCamera) {\n const hand = this.xrController.inputSource.hand;\n if (!hand) {\n return;\n }\n\n // TODO: Modify webxr.d.ts to better match WebXR IDL so we don't need this any cast.\n const anyHand: any = hand;\n for (let i = 0; i < HandJointReferenceArray.length; ++i) {\n this._jointSpaces[i] = anyHand[HandJointReferenceArray[i]] || hand.get(HandJointReferenceArray[i]);\n }\n let trackingSuccessful = false;\n\n if (xrFrame.fillPoses && xrFrame.fillJointRadii) {\n trackingSuccessful = xrFrame.fillPoses(this._jointSpaces, referenceSpace, this._jointTransformMatrices) && xrFrame.fillJointRadii(this._jointSpaces, this._jointRadii);\n } else if (xrFrame.getJointPose) {\n trackingSuccessful = true;\n // Warning: This codepath is slow by comparison, only here for compat.\n for (let jointIdx = 0; jointIdx < this._jointSpaces.length; jointIdx++) {\n const jointPose = xrFrame.getJointPose(this._jointSpaces[jointIdx], referenceSpace);\n if (jointPose) {\n this._jointTransformMatrices.set(jointPose.transform.matrix, jointIdx * 16);\n this._jointRadii[jointIdx] = jointPose.radius || 0.008;\n } else {\n trackingSuccessful = false;\n break;\n }\n }\n }\n\n if (!trackingSuccessful) {\n return;\n }\n\n // L1 Cache Optimization: Invert to LHS in valid Babylon systems IN PLACE\n // This linear loop is much faster than doing it per-object and avoids cache thrashing\n if (!this._scene.useRightHandedSystem) {\n for (let i = 0; i < HandJointReferenceArray.length; ++i) {\n const offset = i * 16;\n this._jointTransformMatrices[offset + 2] *= -1;\n this._jointTransformMatrices[offset + 6] *= -1;\n this._jointTransformMatrices[offset + 8] *= -1;\n this._jointTransformMatrices[offset + 9] *= -1;\n this._jointTransformMatrices[offset + 14] *= -1;\n }\n }\n\n for (let jointIdx = 0; jointIdx < HandJointReferenceArray.length; jointIdx++) {\n const jointTransform = this._jointTransforms[jointIdx];\n Matrix.FromArrayToRef(this._jointTransformMatrices, jointIdx * 16, this._tempJointMatrix);\n this._tempJointMatrix.decompose(undefined, jointTransform.rotationQuaternion!, jointTransform.position);\n\n // The radius we need to make the joint in order for it to roughly cover the joints of the user's real hand.\n const scaledJointRadius = this._jointRadii[jointIdx] * this._jointScaleFactor;\n\n const jointMesh = this._jointMeshes[jointIdx];\n jointMesh.isVisible = !this._handMesh && !this._jointsInvisible;\n jointMesh.position.copyFrom(jointTransform.position);\n jointMesh.rotationQuaternion!.copyFrom(jointTransform.rotationQuaternion!);\n jointMesh.scaling.setAll(scaledJointRadius);\n jointMesh.parent = xrCamera.parent;\n\n // Restore correct transform for meshes that are NOT left-handed (e.g. default GLTF)\n // The buffer is now LHS, so if the mesh expects RHS, we must un-flip.\n if (!this._leftHandedMeshes && !this._scene.useRightHandedSystem && this._handMesh) {\n jointTransform.position.z *= -1;\n jointTransform.rotationQuaternion!.z *= -1;\n jointTransform.rotationQuaternion!.w *= -1;\n }\n }\n\n if (this._handMesh) {\n this._handMesh.isVisible = true;\n\n if (this._handMeshRoot) {\n this._handMeshRoot.parent = xrCamera.parent;\n }\n }\n\n this.xrController.pointer.parent = xrCamera.parent;\n }\n\n /**\n * Dispose this Hand object\n * @param disposeMeshes Should the meshes be disposed as well\n */\n public dispose(disposeMeshes = false) {\n if (this._handMesh) {\n if (disposeMeshes) {\n this._handMesh.skeleton?.dispose();\n this._handMesh.dispose(false, true);\n } else {\n this._handMesh.isVisible = false;\n }\n }\n for (const transform of this._jointTransforms) {\n transform.dispose();\n }\n\n this._jointTransforms.length = 0;\n this.onHandMeshSetObservable.clear();\n }\n}\n\n/**\n * WebXR Hand Joint tracking feature, available for selected browsers and devices\n */\nexport class WebXRHandTracking extends WebXRAbstractFeature {\n /**\n * The module's name\n */\n public static readonly Name = WebXRFeatureName.HAND_TRACKING;\n /**\n * The (Babylon) version of this module.\n * This is an integer representing the implementation version.\n * This number does not correspond to the WebXR specs version\n */\n public static readonly Version = 1;\n\n /** The base URL for the default hand model. */\n public static DEFAULT_HAND_MODEL_BASE_URL = \"https://assets.babylonjs.com/core/HandMeshes/\";\n /** The filename to use for the default right hand model. */\n public static DEFAULT_HAND_MODEL_RIGHT_FILENAME = \"r_hand_rhs.glb\";\n /** The filename to use for the default left hand model. */\n public static DEFAULT_HAND_MODEL_LEFT_FILENAME = \"l_hand_rhs.glb\";\n /** The URL pointing to the default hand model NodeMaterial shader. */\n public static DEFAULT_HAND_MODEL_SHADER_URL = \"https://assets.babylonjs.com/core/HandMeshes/handsShader.json\";\n\n // We want to use lightweight models, diameter will initially be 1 but scaled to the values returned from WebXR.\n private static readonly _ICOSPHERE_PARAMS = { radius: 0.5, flat: false, subdivisions: 2 };\n\n private static _RightHandGLB: Nullable<ISceneLoaderAsyncResult> = null;\n private static _LeftHandGLB: Nullable<ISceneLoaderAsyncResult> = null;\n\n private static _GenerateTrackedJointMeshes(options: IWebXRHandTrackingOptions, originalMesh: AbstractMesh): { left: AbstractMesh[]; right: AbstractMesh[] } {\n const meshes: { left: AbstractMesh[]; right: AbstractMesh[] } = { left: [], right: [] };\n\n originalMesh.isVisible = !!options.jointMeshes?.keepOriginalVisible;\n for (const handedness of [\"left\", \"right\"] as const) {\n const h = handedness as \"left\" | \"right\";\n const trackedMeshes: AbstractMesh[] = [];\n for (let i = 0; i < HandJointReferenceArray.length; i++) {\n let newInstance: AbstractMesh;\n if (originalMesh instanceof Mesh) {\n newInstance = originalMesh.createInstance(`${handedness}-handJoint-${i}`);\n } else {\n newInstance = originalMesh.clone(`${handedness}-handJoint-${i}`, null) as AbstractMesh;\n }\n if (options.jointMeshes?.onHandJointMeshGenerated) {\n const returnedMesh = options.jointMeshes.onHandJointMeshGenerated(newInstance as InstancedMesh, i, h);\n if (returnedMesh) {\n if (returnedMesh !== newInstance) {\n newInstance.dispose();\n newInstance = returnedMesh;\n }\n }\n }\n newInstance.isPickable = false;\n if (options.jointMeshes?.enablePhysics) {\n const props = options.jointMeshes?.physicsProps;\n // downscale the instances so that physics will be initialized correctly\n newInstance.scaling.setAll(0.02);\n // Detect physics version\n const scene = newInstance.getScene();\n const physicsEngine = scene.getPhysicsEngine();\n const physicsVersion = physicsEngine?.getPluginVersion() || 1;\n\n if (physicsVersion === 2) {\n // V2 physics\n const impostorType = props?.impostorType !== undefined ? props.impostorType : PhysicsImpostor.SphereImpostor;\n let shapeType: PhysicsShapeType;\n\n // Map v1 impostor types to v2 shape types\n switch (impostorType) {\n case PhysicsImpostor.SphereImpostor:\n shapeType = PhysicsShapeType.SPHERE;\n break;\n case PhysicsImpostor.BoxImpostor:\n shapeType = PhysicsShapeType.BOX;\n break;\n case PhysicsImpostor.CapsuleImpostor:\n shapeType = PhysicsShapeType.CAPSULE;\n break;\n default:\n shapeType = PhysicsShapeType.SPHERE;\n }\n\n const aggregate = new PhysicsAggregate(\n newInstance,\n shapeType,\n {\n mass: 0,\n friction: props?.friction ?? 0.2,\n restitution: props?.restitution ?? 0.2,\n },\n scene\n );\n aggregate.body.setMotionType(PhysicsMotionType.ANIMATED);\n aggregate.body.disableSync = true;\n } else {\n // V1 physics\n const type = props?.impostorType !== undefined ? props.impostorType : PhysicsImpostor.SphereImpostor;\n newInstance.physicsImpostor = new PhysicsImpostor(newInstance, type, props ? { mass: 0, ...props } : { mass: 0 });\n }\n }\n newInstance.isVisible = false;\n newInstance.rotationQuaternion = new Quaternion();\n trackedMeshes.push(newInstance);\n }\n\n meshes[h] = trackedMeshes;\n }\n return meshes;\n }\n\n private static async _GenerateDefaultHandMeshesAsync(\n xrSessionManager: WebXRSessionManager,\n options?: IWebXRHandTrackingOptions\n ): Promise<{ left: AbstractMesh; right: AbstractMesh }> {\n const scene = xrSessionManager.scene;\n // eslint-disable-next-line no-async-promise-executor\n return await new Promise(async (resolve) => {\n const riggedMeshes: { [handedness: string]: AbstractMesh } = {};\n // check the cache, defensive\n if (WebXRHandTracking._RightHandGLB?.meshes[1]?.isDisposed()) {\n WebXRHandTracking._RightHandGLB = null;\n }\n if (WebXRHandTracking._LeftHandGLB?.meshes[1]?.isDisposed()) {\n WebXRHandTracking._LeftHandGLB = null;\n }\n\n const handsDefined = !!(WebXRHandTracking._RightHandGLB && WebXRHandTracking._LeftHandGLB);\n // load them in parallel\n const defaulrHandGLBUrl = Tools.GetAssetUrl(WebXRHandTracking.DEFAULT_HAND_MODEL_BASE_URL);\n const handGLBs = await Promise.all([\n WebXRHandTracking._RightHandGLB || SceneLoader.ImportMeshAsync(\"\", defaulrHandGLBUrl, WebXRHandTracking.DEFAULT_HAND_MODEL_RIGHT_FILENAME, scene),\n WebXRHandTracking._LeftHandGLB || SceneLoader.ImportMeshAsync(\"\", defaulrHandGLBUrl, WebXRHandTracking.DEFAULT_HAND_MODEL_LEFT_FILENAME, scene),\n ]);\n // eslint-disable-next-line require-atomic-updates\n WebXRHandTracking._RightHandGLB = handGLBs[0];\n // eslint-disable-next-line require-atomic-updates\n WebXRHandTracking._LeftHandGLB = handGLBs[1];\n const shaderUrl = Tools.GetAssetUrl(WebXRHandTracking.DEFAULT_HAND_MODEL_SHADER_URL);\n const handShader = await NodeMaterialParseFromFileAsync(\"handShader\", shaderUrl, scene, undefined, true);\n\n // depth prepass and alpha mode\n handShader.needDepthPrePass = true;\n handShader.transparencyMode = Material.MATERIAL_ALPHABLEND;\n handShader.alphaMode = Constants.ALPHA_COMBINE;\n\n // build node materials\n handShader.build(false);\n\n // shader\n const handColors = {\n base: Color3.FromInts(116, 63, 203),\n fresnel: Color3.FromInts(149, 102, 229),\n fingerColor: Color3.FromInts(177, 130, 255),\n tipFresnel: Color3.FromInts(220, 200, 255),\n ...options?.handMeshes?.customColors,\n };\n\n const handNodes = {\n base: handShader.getBlockByName(\"baseColor\") as InputBlock,\n fresnel: handShader.getBlockByName(\"fresnelColor\") as InputBlock,\n fingerColor: handShader.getBlockByName(\"fingerColor\") as InputBlock,\n tipFresnel: handShader.getBlockByName(\"tipFresnelColor\") as InputBlock,\n };\n\n handNodes.base.value = handColors.base;\n handNodes.fresnel.value = handColors.fresnel;\n handNodes.fingerColor.value = handColors.fingerColor;\n handNodes.tipFresnel.value = handColors.tipFresnel;\n const isMultiview = (xrSessionManager._getBaseLayerWrapper() as WebXRCompositionLayerWrapper)?.isMultiview;\n const hd = [\"left\", \"right\"];\n for (const handedness of hd) {\n const handGLB = handedness == \"left\" ? WebXRHandTracking._LeftHandGLB : WebXRHandTracking._RightHandGLB;\n if (!handGLB) {\n // this should never happen!\n throw new Error(\"Could not load hand model\");\n }\n const handMesh = handGLB.meshes[1];\n handMesh._internalAbstractMeshDataInfo._computeBonesUsingShaders = true;\n if (handMesh.skeleton) {\n handMesh.skeleton.useTextureToStoreBoneMatrices = false;\n }\n // if in multiview do not use the material\n if (!isMultiview && !options?.handMeshes?.disableHandShader) {\n handMesh.material = handShader.clone(`${handedness}HandShaderClone`, true);\n handMesh.material.freeze();\n }\n handMesh.isVisible = false;\n\n riggedMeshes[handedness] = handMesh;\n\n // single change for left handed systems\n if (!handsDefined && !scene.useRightHandedSystem) {\n handGLB.meshes[1].rotate(Axis.Y, Math.PI);\n }\n }\n\n handShader.dispose();\n resolve({ left: riggedMeshes.left, right: riggedMeshes.right });\n });\n }\n\n /**\n * Generates a mapping from XRHandJoint to bone name for the default hand mesh.\n * @param handedness The handedness being mapped for.\n * @returns A mapping from XRHandJoint to bone name.\n */\n private static _GenerateDefaultHandMeshRigMapping(handedness: XRHandedness): XRHandMeshRigMapping {\n const h = handedness == \"right\" ? \"R\" : \"L\";\n return {\n [WebXRHandJoint.WRIST]: `wrist_${h}`,\n [WebXRHandJoint.THUMB_METACARPAL]: `thumb_metacarpal_${h}`,\n [WebXRHandJoint.THUMB_PHALANX_PROXIMAL]: `thumb_proxPhalanx_${h}`,\n [WebXRHandJoint.THUMB_PHALANX_DISTAL]: `thumb_distPhalanx_${h}`,\n [WebXRHandJoint.THUMB_TIP]: `thumb_tip_${h}`,\n [WebXRHandJoint.INDEX_FINGER_METACARPAL]: `index_metacarpal_${h}`,\n [WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL]: `index_proxPhalanx_${h}`,\n [WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE]: `index_intPhalanx_${h}`,\n [WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL]: `index_distPhalanx_${h}`,\n [WebXRHandJoint.INDEX_FINGER_TIP]: `index_tip_${h}`,\n [WebXRHandJoint.MIDDLE_FINGER_METACARPAL]: `middle_metacarpal_${h}`,\n [WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL]: `middle_proxPhalanx_${h}`,\n [WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE]: `middle_intPhalanx_${h}`,\n [WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL]: `middle_distPhalanx_${h}`,\n [WebXRHandJoint.MIDDLE_FINGER_TIP]: `middle_tip_${h}`,\n [WebXRHandJoint.RING_FINGER_METACARPAL]: `ring_metacarpal_${h}`,\n [WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL]: `ring_proxPhalanx_${h}`,\n [WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE]: `ring_intPhalanx_${h}`,\n [WebXRHandJoint.RING_FINGER_PHALANX_DISTAL]: `ring_distPhalanx_${h}`,\n [WebXRHandJoint.RING_FINGER_TIP]: `ring_tip_${h}`,\n [WebXRHandJoint.PINKY_FINGER_METACARPAL]: `little_metacarpal_${h}`,\n [WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL]: `little_proxPhalanx_${h}`,\n [WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE]: `little_intPhalanx_${h}`,\n [WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL]: `little_distPhalanx_${h}`,\n [WebXRHandJoint.PINKY_FINGER_TIP]: `little_tip_${h}`,\n };\n }\n\n private _attachedHands: {\n [uniqueId: string]: WebXRHand;\n } = {};\n\n private _trackingHands: {\n left: Nullable<WebXRHand>;\n right: Nullable<WebXRHand>;\n } = { left: null, right: null };\n\n private _handResources: {\n jointMeshes: Nullable<{ left: AbstractMesh[]; right: AbstractMesh[] }>;\n handMeshes: Nullable<{ left: AbstractMesh; right: AbstractMesh }>;\n rigMappings: Nullable<{ left: XRHandMeshRigMapping; right: XRHandMeshRigMapping }>;\n } = { jointMeshes: null, handMeshes: null, rigMappings: null };\n\n private _worldScaleObserver?: Nullable<Observer<{ previousScaleFactor: number; newScaleFactor: number }>> = null;\n\n /**\n * This observable will notify registered observers when a new hand object was added and initialized\n */\n public onHandAddedObservable: Observable<WebXRHand> = new Observable();\n /**\n * This observable will notify its observers right before the hand object is disposed\n */\n public onHandRemovedObservable: Observable<WebXRHand> = new Observable();\n\n private _originalMesh?: Mesh;\n\n /**\n * Check if the needed objects are defined.\n * This does not mean that the feature is enabled, but that the objects needed are well defined.\n * @returns true if the needed objects for this feature are defined\n */\n public override isCompatible(): boolean {\n return typeof XRHand !== \"undefined\";\n }\n\n /**\n * Get the hand object according to the controller id\n * @param controllerId the controller id to which we want to get the hand\n * @returns null if not found or the WebXRHand object if found\n */\n public getHandByControllerId(controllerId: string): Nullable<WebXRHand> {\n return this._attachedHands[controllerId];\n }\n\n /**\n * Get a hand object according to the requested handedness\n * @param handedness the handedness to request\n * @returns null if not found or the WebXRHand object if found\n */\n public getHandByHandedness(handedness: XRHandedness): Nullable<WebXRHand> {\n if (handedness == \"none\") {\n return null;\n }\n return this._trackingHands[handedness];\n }\n\n /**\n * Creates a new instance of the XR hand tracking feature.\n * @param _xrSessionManager An instance of WebXRSessionManager.\n * @param options Options to use when constructing this feature.\n */\n constructor(\n _xrSessionManager: WebXRSessionManager,\n /** Options to use when constructing this feature. */\n public readonly options: IWebXRHandTrackingOptions\n ) {\n super(_xrSessionManager);\n this.xrNativeFeatureName = \"hand-tracking\";\n\n // Support legacy versions of the options object by copying over joint mesh properties\n const anyOptions = options as any;\n const anyJointMeshOptions = anyOptions.jointMeshes;\n if (anyJointMeshOptions) {\n if (typeof anyJointMeshOptions.disableDefaultHandMesh !== \"undefined\") {\n options.handMeshes = options.handMeshes || {};\n options.handMeshes.disableDefaultMeshes = anyJointMeshOptions.disableDefaultHandMesh;\n }\n if (typeof anyJointMeshOptions.handMeshes !== \"undefined\") {\n options.handMeshes = options.handMeshes || {};\n options.handMeshes.customMeshes = anyJointMeshOptions.handMeshes;\n }\n if (typeof anyJointMeshOptions.leftHandedSystemMeshes !== \"undefined\") {\n options.handMeshes = options.handMeshes || {};\n options.handMeshes.meshesUseLeftHandedCoordinates = anyJointMeshOptions.leftHandedSystemMeshes;\n }\n if (typeof anyJointMeshOptions.rigMapping !== \"undefined\") {\n options.handMeshes = options.handMeshes || {};\n const leftRigMapping = {};\n const rightRigMapping = {};\n const rigMappingTuples = [\n [anyJointMeshOptions.rigMapping.left, leftRigMapping],\n [anyJointMeshOptions.rigMapping.right, rightRigMapping],\n ];\n\n for (const rigMappingTuple of rigMappingTuples) {\n const legacyRigMapping = rigMappingTuple[0] as string[];\n const rigMapping = rigMappingTuple[1] as XRHandMeshRigMapping;\n for (let index = 0; index < legacyRigMapping.length; index++) {\n const modelJointName = legacyRigMapping[index];\n rigMapping[HandJointReferenceArray[index]] = modelJointName;\n }\n }\n options.handMeshes.customRigMappings = {\n left: leftRigMapping as XRHandMeshRigMapping,\n right: rightRigMapping as XRHandMeshRigMapping,\n };\n }\n }\n }\n\n /**\n * Attach this feature.\n * Will usually be called by the features manager.\n *\n * @returns true if successful.\n */\n public override attach(): boolean {\n if (!super.attach()) {\n return false;\n }\n\n if (!this._handResources.jointMeshes) {\n this._originalMesh =\n this._originalMesh || this.options.jointMeshes?.sourceMesh || CreateIcoSphere(\"jointParent\", WebXRHandTracking._ICOSPHERE_PARAMS, this._xrSessionManager.scene);\n this._originalMesh.isVisible = false;\n\n this._handResources.jointMeshes = WebXRHandTracking._GenerateTrackedJointMeshes(this.options, this._originalMesh);\n }\n this._handResources.handMeshes = this.options.handMeshes?.customMeshes || null;\n this._handResources.rigMappings = this.options.handMeshes?.customRigMappings || null;\n // If they didn't supply custom meshes and are not disabling the default meshes...\n if (!this.options.handMeshes?.customMeshes && !this.options.handMeshes?.disableDefaultMeshes) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\n WebXRHandTracking._GenerateDefaultHandMeshesAsync(this._xrSessionManager, this.options).then((defaultHandMeshes) => {\n this._handResources.handMeshes = defaultHandMeshes;\n this._handResources.rigMappings = {\n left: WebXRHandTracking._GenerateDefaultHandMeshRigMapping(\"left\"),\n right: WebXRHandTracking._GenerateDefaultHandMeshRigMapping(\"right\"),\n };\n\n // Apply meshes to existing hands if already tracking.\n this._trackingHands.left?.setHandMesh(this._handResources.handMeshes.left, this._handResources.rigMappings.left, this._xrSessionManager);\n this._trackingHands.right?.setHandMesh(this._handResources.handMeshes.right, this._handResources.rigMappings.right, this._xrSessionManager);\n this._handResources.handMeshes.left.scaling.setAll(this._xrSessionManager.worldScalingFactor);\n this._handResources.handMeshes.right.scaling.setAll(this._xrSessionManager.worldScalingFactor);\n });\n this._worldScaleObserver = this._xrSessionManager.onWorldScaleFactorChangedObservable.add((scalingFactors) => {\n if (this._handResources.handMeshes) {\n this._handResources.handMeshes.left.scaling.scaleInPlace(scalingFactors.newScaleFactor / scalingFactors.previousScaleFactor);\n this._handResources.handMeshes.right.scaling.scaleInPlace(scalingFactors.newScaleFactor / scalingFactors.previousScaleFactor);\n }\n });\n }\n\n for (const controller of this.options.xrInput.controllers) {\n this._attachHand(controller);\n }\n\n this._addNewAttachObserver(this.options.xrInput.onControllerAddedObservable, this._attachHand);\n this._addNewAttachObserver(this.options.xrInput.onControllerRemovedObservable, this._detachHand);\n\n return true;\n }\n\n protected _onXRFrame(_xrFrame: XRFrame): void {\n this._trackingHands.left?.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace, this.options.xrInput.xrCamera);\n this._trackingHands.right?.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace, this.options.xrInput.xrCamera);\n }\n\n private _attachHand = (xrController: WebXRInputSource) => {\n if (!xrController.inputSource.hand || xrController.inputSource.handedness == \"none\" || !this._handResources.jointMeshes) {\n return;\n }\n\n const handedness = xrController.inputSource.handedness;\n const webxrHand = new WebXRHand(\n xrController,\n this._handResources.jointMeshes && this._handResources.jointMeshes[handedness],\n this._handResources.handMeshes && this._handResources.handMeshes[handedness],\n this._handResources.rigMappings && this._handResources.rigMappings[handedness],\n this.options.handMeshes?.meshesUseLeftHandedCoordinates,\n this.options.jointMeshes?.invisible,\n this.options.jointMeshes?.scaleFactor\n );\n\n this._attachedHands[xrController.uniqueId] = webxrHand;\n this._trackingHands[handedness] = webxrHand;\n\n this.onHandAddedObservable.notifyObservers(webxrHand);\n };\n\n private _detachHandById(controllerId: string, disposeMesh?: boolean) {\n const hand = this.getHandByControllerId(controllerId);\n if (hand) {\n const handedness = hand.xrController.inputSource.handedness == \"left\" ? \"left\" : \"right\";\n if (this._trackingHands[handedness]?.xrController.uniqueId === controllerId) {\n this._trackingHands[handedness] = null;\n }\n this.onHandRemovedObservable.notifyObservers(hand);\n hand.dispose(disposeMesh);\n delete this._attachedHands[controllerId];\n }\n }\n\n private _detachHand = (xrController: WebXRInputSource) => {\n this._detachHandById(xrController.uniqueId);\n };\n\n /**\n * Detach this feature.\n * Will usually be called by the features manager.\n *\n * @returns true if successful.\n */\n public override detach(): boolean {\n if (!super.detach()) {\n return false;\n }\n\n const keys = Object.keys(this._attachedHands);\n for (const uniqueId of keys) {\n this._detachHandById(uniqueId, this.options.handMeshes?.disposeOnSessionEnd);\n }\n\n if (this.options.handMeshes?.disposeOnSessionEnd) {\n if (this._handResources.jointMeshes) {\n for (const trackedMesh of this._handResources.jointMeshes.left) {\n trackedMesh.dispose();\n }\n for (const trackedMesh of this._handResources.jointMeshes.right) {\n trackedMesh.dispose();\n }\n this._handResources.jointMeshes = null;\n }\n\n if (this._handResources.handMeshes) {\n this._handResources.handMeshes.left.dispose();\n this._handResources.handMeshes.right.dispose();\n this._handResources.handMeshes = null;\n }\n\n if (WebXRHandTracking._RightHandGLB) {\n for (const mesh of WebXRHandTracking._RightHandGLB.meshes) {\n mesh.dispose();\n }\n }\n if (WebXRHandTracking._LeftHandGLB) {\n for (const mesh of WebXRHandTracking._LeftHandGLB.meshes) {\n mesh.dispose();\n }\n }\n WebXRHandTracking._RightHandGLB = null;\n WebXRHandTracking._LeftHandGLB = null;\n this._originalMesh?.dispose();\n this._originalMesh = undefined;\n }\n\n // remove world scale observer\n if (this._worldScaleObserver) {\n this._xrSessionManager.onWorldScaleFactorChangedObservable.remove(this._worldScaleObserver);\n }\n\n return true;\n }\n\n /**\n * Dispose this feature and all of the resources attached.\n */\n public override dispose(): void {\n super.dispose();\n this.onHandAddedObservable.clear();\n this.onHandRemovedObservable.clear();\n\n if (this._handResources.handMeshes && !this.options.handMeshes?.customMeshes) {\n // this will dispose the cached meshes\n this._handResources.handMeshes.left.dispose();\n this._handResources.handMeshes.right.dispose();\n // remove the cached meshes\n\n if (WebXRHandTracking._RightHandGLB) {\n for (const mesh of WebXRHandTracking._RightHandGLB.meshes) {\n mesh.dispose();\n }\n }\n if (WebXRHandTracking._LeftHandGLB) {\n for (const mesh of WebXRHandTracking._LeftHandGLB.meshes) {\n mesh.dispose();\n }\n }\n WebXRHandTracking._RightHandGLB = null;\n WebXRHandTracking._LeftHandGLB = null;\n }\n\n if (this._handResources.jointMeshes) {\n for (const trackedMesh of this._handResources.jointMeshes.left) {\n trackedMesh.dispose();\n }\n for (const trackedMesh of this._handResources.jointMeshes.right) {\n trackedMesh.dispose();\n }\n }\n }\n}\n\nlet _Registered = false;\n/**\n * Register side effects for webXRHandTracking.\n * Safe to call multiple times; only the first call has an effect.\n */\nexport function RegisterWebXRHandTracking(): void {\n if (_Registered) {\n return;\n }\n _Registered = true;\n\n RegisterInstancedMesh();\n\n //register the plugin\n WebXRFeaturesManager.AddWebXRFeature(\n WebXRHandTracking.Name,\n (xrSessionManager, options) => {\n return () => new WebXRHandTracking(xrSessionManager, options);\n },\n WebXRHandTracking.Version,\n false\n );\n}\n"]}
|
|
@@ -145,6 +145,17 @@ export declare class WebXRLayers extends WebXRAbstractFeature {
|
|
|
145
145
|
private _layerToRTTProviderMapping;
|
|
146
146
|
private _layerCleanupFunctions;
|
|
147
147
|
constructor(_xrSessionManager: WebXRSessionManager, _options?: IWebXRLayersOptions);
|
|
148
|
+
/**
|
|
149
|
+
* Whether the active XR session exposes its compositor layer limit.
|
|
150
|
+
*/
|
|
151
|
+
get isMaxRenderLayersSupported(): boolean;
|
|
152
|
+
/**
|
|
153
|
+
* Gets the maximum number of native layers accepted in the active session's render-state `layers` array.
|
|
154
|
+
* The projection layer counts toward this limit. Fallback mesh layers do not.
|
|
155
|
+
* @returns The native layer limit, or `null` when the runtime does not expose it.
|
|
156
|
+
* @see https://playground.babylonjs.com/#TODARD#0
|
|
157
|
+
*/
|
|
158
|
+
get maxRenderLayers(): Nullable<number>;
|
|
148
159
|
/**
|
|
149
160
|
* Attach this feature.
|
|
150
161
|
* Will usually be called by the features manager.
|
|
@@ -276,6 +287,7 @@ export declare class WebXRLayers extends WebXRAbstractFeature {
|
|
|
276
287
|
* @param wrappedLayers An array of WebXRLayerWrapper, usually returned from the WebXRLayers createLayer functions.
|
|
277
288
|
*/
|
|
278
289
|
setXRSessionLayers(wrappedLayers?: Array<WebXRLayerWrapper<WebXRSupportedLayerType>>): void;
|
|
290
|
+
private _validateLayerCount;
|
|
279
291
|
/**
|
|
280
292
|
* Checks whether the active runtime exposes the factory needed for a layer type.
|
|
281
293
|
* This is a capability check only; creation can still fail when an initialization dictionary is invalid.
|
|
@@ -6,6 +6,7 @@ import { WebXRProjectionLayerWrapper, DefaultXRProjectionLayerInit } from "./Lay
|
|
|
6
6
|
import { WebXRCompositionLayerRenderTargetTextureProvider, WebXRCompositionLayerWrapper, WebXRCubeLayerWrapper, WebXRMediaLayerWrapper, WebXRSpatialLayerWrapper, } from "./Layers/WebXRCompositionLayer.js";
|
|
7
7
|
import { WebXRWebGPUProjectionLayerWrapper, CreateDefaultXRGPUProjectionLayerInit } from "./Layers/WebXRWebGPUProjectionLayer.js";
|
|
8
8
|
import { WebXRWebGPUCompositionLayerRenderTargetTextureProvider } from "./Layers/WebXRWebGPUCompositionLayer.js";
|
|
9
|
+
import { IsWebGPUXRSupported } from "../webXRGraphicsBinding.js";
|
|
9
10
|
import { Color4 } from "../../Maths/math.color.pure.js";
|
|
10
11
|
import { Logger } from "../../Misc/logger.js";
|
|
11
12
|
import { TransformNode } from "../../Meshes/transformNode.pure.js";
|
|
@@ -43,6 +44,22 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
43
44
|
this._layerCleanupFunctions = new WeakMap();
|
|
44
45
|
this.xrNativeFeatureName = "layers";
|
|
45
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Whether the active XR session exposes its compositor layer limit.
|
|
49
|
+
*/
|
|
50
|
+
get isMaxRenderLayersSupported() {
|
|
51
|
+
return this.maxRenderLayers !== null;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Gets the maximum number of native layers accepted in the active session's render-state `layers` array.
|
|
55
|
+
* The projection layer counts toward this limit. Fallback mesh layers do not.
|
|
56
|
+
* @returns The native layer limit, or `null` when the runtime does not expose it.
|
|
57
|
+
* @see https://playground.babylonjs.com/#TODARD#0
|
|
58
|
+
*/
|
|
59
|
+
get maxRenderLayers() {
|
|
60
|
+
const maxRenderLayers = this._xrSessionManager.session?.maxRenderLayers;
|
|
61
|
+
return typeof maxRenderLayers === "number" ? maxRenderLayers : null;
|
|
62
|
+
}
|
|
46
63
|
/**
|
|
47
64
|
* Attach this feature.
|
|
48
65
|
* Will usually be called by the features manager.
|
|
@@ -205,6 +222,7 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
205
222
|
}
|
|
206
223
|
return null;
|
|
207
224
|
}
|
|
225
|
+
this._validateLayerCount(this._existingLayers.length + 1);
|
|
208
226
|
const dimensions = this._getProjectionLayerDimensions();
|
|
209
227
|
const defaultViewPixelWidth = layerType === "XRCubeLayer" ? Math.min(dimensions.width, dimensions.height) : dimensions.width;
|
|
210
228
|
const defaultViewPixelHeight = layerType === "XRCubeLayer" ? defaultViewPixelWidth : dimensions.height;
|
|
@@ -289,6 +307,7 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
289
307
|
}
|
|
290
308
|
return null;
|
|
291
309
|
}
|
|
310
|
+
this._validateLayerCount(this._existingLayers.length + 1);
|
|
292
311
|
const populatedParams = {
|
|
293
312
|
space: this._xrSessionManager.referenceSpace,
|
|
294
313
|
layout: "mono",
|
|
@@ -310,6 +329,7 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
310
329
|
createProjectionLayer(params = DefaultXRProjectionLayerInit, multiview = this._isMultiviewEnabled) {
|
|
311
330
|
const extendedParams = this._extendXRLayerInit(params, multiview);
|
|
312
331
|
this._validateLayerInit(extendedParams, multiview);
|
|
332
|
+
this._validateLayerCount(this._existingLayers.length + 1);
|
|
313
333
|
const projLayer = this._xrWebGLBinding.createProjectionLayer(extendedParams);
|
|
314
334
|
const layer = new WebXRProjectionLayerWrapper(projLayer, multiview, this._xrWebGLBinding);
|
|
315
335
|
this.addXRSessionLayer(layer);
|
|
@@ -324,6 +344,7 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
324
344
|
if (!this._xrSessionManager.inXRSession) {
|
|
325
345
|
throw new Error("Cannot create a layer outside of a WebXR session. Make sure the session has started before creating layers.");
|
|
326
346
|
}
|
|
347
|
+
this._validateLayerCount(this._existingLayers.length + 1);
|
|
327
348
|
const binding = this._xrGPUBinding;
|
|
328
349
|
const init = CreateDefaultXRGPUProjectionLayerInit(binding.getPreferredColorFormat());
|
|
329
350
|
const projLayer = binding.createProjectionLayer(init);
|
|
@@ -616,6 +637,7 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
616
637
|
* @param wrappedLayer the new layer to add to the existing ones
|
|
617
638
|
*/
|
|
618
639
|
addXRSessionLayer(wrappedLayer) {
|
|
640
|
+
this._validateLayerCount(this._existingLayers.length + 1);
|
|
619
641
|
this._existingLayers.push(wrappedLayer);
|
|
620
642
|
this.setXRSessionLayers(this._existingLayers);
|
|
621
643
|
}
|
|
@@ -676,6 +698,7 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
676
698
|
* @param wrappedLayers An array of WebXRLayerWrapper, usually returned from the WebXRLayers createLayer functions.
|
|
677
699
|
*/
|
|
678
700
|
setXRSessionLayers(wrappedLayers = this._existingLayers) {
|
|
701
|
+
this._validateLayerCount(wrappedLayers.length);
|
|
679
702
|
// this._existingLayers = wrappedLayers;
|
|
680
703
|
const renderStateInit = { ...this._xrSessionManager.session.renderState };
|
|
681
704
|
// Clear out the layer-related fields.
|
|
@@ -686,6 +709,13 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
686
709
|
this._xrSessionManager._setBaseLayerWrapper(wrappedLayers.length > 0 ? wrappedLayers.at(0) : null);
|
|
687
710
|
}
|
|
688
711
|
}
|
|
712
|
+
_validateLayerCount(layerCount) {
|
|
713
|
+
const maxRenderLayers = this.maxRenderLayers;
|
|
714
|
+
if (maxRenderLayers !== null && layerCount > maxRenderLayers) {
|
|
715
|
+
const layerLabel = maxRenderLayers === 1 ? "layer" : "layers";
|
|
716
|
+
throw new Error(`The XR session supports at most ${maxRenderLayers} render ${layerLabel}, but ${layerCount} were provided.`);
|
|
717
|
+
}
|
|
718
|
+
}
|
|
689
719
|
/**
|
|
690
720
|
* Checks whether the active runtime exposes the factory needed for a layer type.
|
|
691
721
|
* This is a capability check only; creation can still fail when an initialization dictionary is invalid.
|
|
@@ -742,7 +772,7 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
742
772
|
}
|
|
743
773
|
isCompatible() {
|
|
744
774
|
if (this._xrSessionManager.scene.getEngine().isWebGPU) {
|
|
745
|
-
return
|
|
775
|
+
return IsWebGPUXRSupported();
|
|
746
776
|
}
|
|
747
777
|
// Native WebGL continues to use NativeXRRenderTarget instead of WebXR Layers.
|
|
748
778
|
if (this._xrSessionManager.isNative) {
|