@babylonjs/core 5.0.3 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/Audio/audioSceneComponent.d.ts +2 -0
  2. package/Audio/audioSceneComponent.js +9 -7
  3. package/Audio/audioSceneComponent.js.map +1 -1
  4. package/Cameras/arcRotateCamera.d.ts +5 -0
  5. package/Cameras/arcRotateCamera.js +5 -0
  6. package/Cameras/arcRotateCamera.js.map +1 -1
  7. package/Cameras/camera.d.ts +5 -1
  8. package/Cameras/camera.js +7 -7
  9. package/Cameras/camera.js.map +1 -1
  10. package/Debug/debugLayer.d.ts +5 -0
  11. package/Debug/debugLayer.js +24 -0
  12. package/Debug/debugLayer.js.map +1 -1
  13. package/Engines/Processors/shaderCodeCursor.js +5 -0
  14. package/Engines/Processors/shaderCodeCursor.js.map +1 -1
  15. package/Engines/constants.d.ts +25 -1
  16. package/Engines/constants.js +25 -1
  17. package/Engines/constants.js.map +1 -1
  18. package/Engines/engine.d.ts +1 -1
  19. package/Engines/engine.js +1 -1
  20. package/Engines/engine.js.map +1 -1
  21. package/Engines/nativeEngine.d.ts +1 -1
  22. package/Engines/nativeEngine.js +7 -8
  23. package/Engines/nativeEngine.js.map +1 -1
  24. package/Engines/thinEngine.js +2 -2
  25. package/Engines/thinEngine.js.map +1 -1
  26. package/Engines/webgpuEngine.d.ts +4 -0
  27. package/Engines/webgpuEngine.js +2 -0
  28. package/Engines/webgpuEngine.js.map +1 -1
  29. package/Gizmos/boundingBoxGizmo.js +6 -6
  30. package/Gizmos/boundingBoxGizmo.js.map +1 -1
  31. package/Gizmos/gizmo.d.ts +5 -0
  32. package/Gizmos/gizmo.js +8 -2
  33. package/Gizmos/gizmo.js.map +1 -1
  34. package/Inputs/scene.inputManager.js +7 -1
  35. package/Inputs/scene.inputManager.js.map +1 -1
  36. package/Lights/Shadows/shadowGenerator.d.ts +5 -0
  37. package/Lights/Shadows/shadowGenerator.js +20 -2
  38. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  39. package/Loading/Plugins/babylonFileLoader.js +8 -6
  40. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  41. package/Materials/Node/Blocks/PBR/clearCoatBlock.d.ts +4 -0
  42. package/Materials/Node/Blocks/PBR/clearCoatBlock.js +19 -1
  43. package/Materials/Node/Blocks/PBR/clearCoatBlock.js.map +1 -1
  44. package/Materials/Node/Blocks/PBR/iridescenceBlock.d.ts +54 -0
  45. package/Materials/Node/Blocks/PBR/iridescenceBlock.js +135 -0
  46. package/Materials/Node/Blocks/PBR/iridescenceBlock.js.map +1 -0
  47. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.d.ts +4 -0
  48. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +42 -24
  49. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  50. package/Materials/PBR/index.d.ts +1 -0
  51. package/Materials/PBR/index.js +1 -0
  52. package/Materials/PBR/index.js.map +1 -1
  53. package/Materials/PBR/pbrBaseMaterial.d.ts +5 -0
  54. package/Materials/PBR/pbrBaseMaterial.js +2 -0
  55. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  56. package/Materials/PBR/pbrIridescenceConfiguration.d.ts +102 -0
  57. package/Materials/PBR/pbrIridescenceConfiguration.js +257 -0
  58. package/Materials/PBR/pbrIridescenceConfiguration.js.map +1 -0
  59. package/Materials/Textures/Loaders/ktxTextureLoader.js +31 -0
  60. package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
  61. package/Materials/Textures/MultiviewRenderTarget.js +1 -0
  62. package/Materials/Textures/MultiviewRenderTarget.js.map +1 -1
  63. package/Materials/Textures/videoTexture.js +12 -12
  64. package/Materials/Textures/videoTexture.js.map +1 -1
  65. package/Materials/materialFlags.d.ts +6 -0
  66. package/Materials/materialFlags.js +18 -0
  67. package/Materials/materialFlags.js.map +1 -1
  68. package/Materials/materialPluginFactoryExport.d.ts +6 -0
  69. package/Materials/materialPluginFactoryExport.js +12 -0
  70. package/Materials/materialPluginFactoryExport.js.map +1 -1
  71. package/Maths/math.color.d.ts +11 -2
  72. package/Maths/math.color.js +12 -7
  73. package/Maths/math.color.js.map +1 -1
  74. package/Meshes/abstractMesh.d.ts +1 -1
  75. package/Meshes/abstractMesh.js +6 -3
  76. package/Meshes/abstractMesh.js.map +1 -1
  77. package/Meshes/mesh.d.ts +2 -2
  78. package/Meshes/mesh.js +11 -3
  79. package/Meshes/mesh.js.map +1 -1
  80. package/Misc/khronosTextureContainer.js +1 -1
  81. package/Misc/khronosTextureContainer.js.map +1 -1
  82. package/Physics/physicsImpostor.js +1 -1
  83. package/Physics/physicsImpostor.js.map +1 -1
  84. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.d.ts +6 -1
  85. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js +13 -2
  86. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js.map +1 -1
  87. package/Rendering/boundingBoxRenderer.js +4 -4
  88. package/Rendering/boundingBoxRenderer.js.map +1 -1
  89. package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.js +1 -1
  90. package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.js.map +1 -1
  91. package/Shaders/ShadersInclude/helperFunctions.js +1 -1
  92. package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
  93. package/Shaders/ShadersInclude/lightFragment.js +1 -1
  94. package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
  95. package/Shaders/ShadersInclude/pbrBRDFFunctions.js +1 -1
  96. package/Shaders/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
  97. package/Shaders/ShadersInclude/pbrBlockIridescence.d.ts +5 -0
  98. package/Shaders/ShadersInclude/pbrBlockIridescence.js +9 -0
  99. package/Shaders/ShadersInclude/pbrBlockIridescence.js.map +1 -0
  100. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +1 -1
  101. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  102. package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.js +1 -1
  103. package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.js.map +1 -1
  104. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js +1 -1
  105. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js.map +1 -1
  106. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js +1 -1
  107. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
  108. package/Shaders/ShadersInclude/pbrVertexDeclaration.js +1 -1
  109. package/Shaders/ShadersInclude/pbrVertexDeclaration.js.map +1 -1
  110. package/Shaders/pbr.fragment.d.ts +1 -0
  111. package/Shaders/pbr.fragment.js +2 -1
  112. package/Shaders/pbr.fragment.js.map +1 -1
  113. package/Shaders/pbr.vertex.js +1 -1
  114. package/Shaders/pbr.vertex.js.map +1 -1
  115. package/XR/features/WebXRHandTracking.js +1 -1
  116. package/XR/features/WebXRHandTracking.js.map +1 -1
  117. package/XR/features/WebXRImageTracking.d.ts +0 -5
  118. package/XR/features/WebXRImageTracking.js +5 -8
  119. package/XR/features/WebXRImageTracking.js.map +1 -1
  120. package/XR/native/nativeXRFrame.d.ts +2 -1
  121. package/XR/native/nativeXRFrame.js +5 -1
  122. package/XR/native/nativeXRFrame.js.map +1 -1
  123. package/assetContainer.d.ts +13 -1
  124. package/assetContainer.js +130 -17
  125. package/assetContainer.js.map +1 -1
  126. package/package.json +1 -1
  127. package/scene.d.ts +4 -0
  128. package/scene.js +4 -0
  129. package/scene.js.map +1 -1
@@ -33,7 +33,7 @@ import "./ShadersInclude/fogVertex.js";
33
33
  import "./ShadersInclude/shadowsVertex.js";
34
34
  import "./ShadersInclude/logDepthVertex.js";
35
35
  var name = "pbrVertexShader";
36
- var shader = "precision highp float;\n#include<__decl__pbrVertex>\n#define CUSTOM_VERTEX_BEGIN\nattribute vec3 position;\n#ifdef NORMAL\nattribute vec3 normal;\n#endif\n#ifdef TANGENT\nattribute vec4 tangent;\n#endif\n#ifdef UV1\nattribute vec2 uv;\n#endif\n#include<uvAttributeDeclaration>[2..7]\n#include<mainUVVaryingDeclaration>[1..7]\n#ifdef VERTEXCOLOR\nattribute vec4 color;\n#endif\n#include<helperFunctions>\n#include<bonesDeclaration>\n#include<bakedVertexAnimationDeclaration>\n#include<instancesDeclaration>\n#include<prePassVertexDeclaration>\n#include<samplerVertexDeclaration>(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo)\n#include<samplerVertexDeclaration>(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail)\n#include<samplerVertexDeclaration>(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient)\n#include<samplerVertexDeclaration>(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity)\n#include<samplerVertexDeclaration>(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive)\n#include<samplerVertexDeclaration>(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap)\n#include<samplerVertexDeclaration>(_DEFINENAME_,REFLECTIVITY,_VARYINGNAME_,Reflectivity)\n#include<samplerVertexDeclaration>(_DEFINENAME_,MICROSURFACEMAP,_VARYINGNAME_,MicroSurfaceSampler)\n#include<samplerVertexDeclaration>(_DEFINENAME_,METALLIC_REFLECTANCE,_VARYINGNAME_,MetallicReflectance)\n#include<samplerVertexDeclaration>(_DEFINENAME_,REFLECTANCE,_VARYINGNAME_,Reflectance)\n#include<samplerVertexDeclaration>(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump)\n#ifdef CLEARCOAT\n#include<samplerVertexDeclaration>(_DEFINENAME_,CLEARCOAT_TEXTURE,_VARYINGNAME_,ClearCoat)\n#include<samplerVertexDeclaration>(_DEFINENAME_,CLEARCOAT_TEXTURE_ROUGHNESS,_VARYINGNAME_,ClearCoatRoughness)\n#include<samplerVertexDeclaration>(_DEFINENAME_,CLEARCOAT_BUMP,_VARYINGNAME_,ClearCoatBump)\n#include<samplerVertexDeclaration>(_DEFINENAME_,CLEARCOAT_TINT_TEXTURE,_VARYINGNAME_,ClearCoatTint)\n#endif\n#ifdef SHEEN\n#include<samplerVertexDeclaration>(_DEFINENAME_,SHEEN_TEXTURE,_VARYINGNAME_,Sheen)\n#include<samplerVertexDeclaration>(_DEFINENAME_,SHEEN_TEXTURE_ROUGHNESS,_VARYINGNAME_,SheenRoughness)\n#endif\n#ifdef ANISOTROPIC\n#include<samplerVertexDeclaration>(_DEFINENAME_,ANISOTROPIC_TEXTURE,_VARYINGNAME_,Anisotropy)\n#endif\n#ifdef SUBSURFACE\n#include<samplerVertexDeclaration>(_DEFINENAME_,SS_THICKNESSANDMASK_TEXTURE,_VARYINGNAME_,Thickness)\n#include<samplerVertexDeclaration>(_DEFINENAME_,SS_REFRACTIONINTENSITY_TEXTURE,_VARYINGNAME_,RefractionIntensity)\n#include<samplerVertexDeclaration>(_DEFINENAME_,SS_TRANSLUCENCYINTENSITY_TEXTURE,_VARYINGNAME_,TranslucencyIntensity)\n#endif\nvarying vec3 vPositionW;\n#if DEBUGMODE>0\nvarying vec4 vClipSpacePosition;\n#endif\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\nvarying vec3 vEnvironmentIrradiance;\n#include<harmonicsFunctions>\n#endif\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR)\nvarying vec4 vColor;\n#endif\n#include<bumpVertexDeclaration>\n#include<clipPlaneVertexDeclaration>\n#include<fogVertexDeclaration>\n#include<__decl__lightVxFragment>[0..maxSimultaneousLights]\n#include<morphTargetsVertexGlobalDeclaration>\n#include<morphTargetsVertexDeclaration>[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvarying vec3 vPositionUVW;\n#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvarying vec3 vDirectionW;\n#endif\n#include<logDepthDeclaration>\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvec3 positionUpdated=position;\n#ifdef NORMAL\nvec3 normalUpdated=normal;\n#endif\n#ifdef TANGENT\nvec4 tangentUpdated=tangent;\n#endif\n#ifdef UV1\nvec2 uvUpdated=uv;\n#endif\n#include<morphTargetsVertexGlobal>\n#include<morphTargetsVertex>[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvPositionUVW=positionUpdated;\n#endif\n#define CUSTOM_VERTEX_UPDATE_POSITION\n#define CUSTOM_VERTEX_UPDATE_NORMAL\n#include<instancesVertex>\n#if defined(PREPASS) && defined(PREPASS_VELOCITY) && !defined(BONES_VELOCITY_ENABLED)\nvCurrentPosition=viewProjection*finalWorld*vec4(positionUpdated,1.0);\nvPreviousPosition=previousViewProjection*finalPreviousWorld*vec4(positionUpdated,1.0);\n#endif\n#include<bonesVertex>\n#include<bakedVertexAnimation>\nvec4 worldPos=finalWorld*vec4(positionUpdated,1.0);\nvPositionW=vec3(worldPos);\n#include<prePassVertex>\n#ifdef NORMAL\nmat3 normalWorld=mat3(finalWorld);\n#if defined(INSTANCES) && defined(THIN_INSTANCES)\nvNormalW=normalUpdated/vec3(dot(normalWorld[0],normalWorld[0]),dot(normalWorld[1],normalWorld[1]),dot(normalWorld[2],normalWorld[2]));\nvNormalW=normalize(normalWorld*vNormalW);\n#else\n#ifdef NONUNIFORMSCALING\nnormalWorld=transposeMat3(inverseMat3(normalWorld));\n#endif\nvNormalW=normalize(normalWorld*normalUpdated);\n#endif\n#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\nvec3 reflectionVector=vec3(reflectionMatrix*vec4(vNormalW,0)).xyz;\n#ifdef REFLECTIONMAP_OPPOSITEZ\nreflectionVector.z*=-1.0;\n#endif\nvEnvironmentIrradiance=computeEnvironmentIrradiance(reflectionVector);\n#endif\n#endif\n#define CUSTOM_VERTEX_UPDATE_WORLDPOS\n#ifdef MULTIVIEW\nif (gl_ViewID_OVR==0u) {\ngl_Position=viewProjection*worldPos;\n} else {\ngl_Position=viewProjectionR*worldPos;\n}\n#else\ngl_Position=viewProjection*worldPos;\n#endif\n#if DEBUGMODE>0\nvClipSpacePosition=gl_Position;\n#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvDirectionW=normalize(vec3(finalWorld*vec4(positionUpdated,0.0)));\n#endif\n#ifndef UV1\nvec2 uvUpdated=vec2(0.,0.);\n#endif\n#ifdef MAINUV1\nvMainUV1=uvUpdated;\n#endif\n#include<uvVariableDeclaration>[2..7]\n#include<samplerVertexImplementation>(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo,_MATRIXNAME_,albedo,_INFONAME_,AlbedoInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_MATRIXNAME_,detail,_INFONAME_,DetailInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_MATRIXNAME_,ambient,_INFONAME_,AmbientInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_MATRIXNAME_,opacity,_INFONAME_,OpacityInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_MATRIXNAME_,emissive,_INFONAME_,EmissiveInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_MATRIXNAME_,lightmap,_INFONAME_,LightmapInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,REFLECTIVITY,_VARYINGNAME_,Reflectivity,_MATRIXNAME_,reflectivity,_INFONAME_,ReflectivityInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,MICROSURFACEMAP,_VARYINGNAME_,MicroSurfaceSampler,_MATRIXNAME_,microSurfaceSampler,_INFONAME_,MicroSurfaceSamplerInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,METALLIC_REFLECTANCE,_VARYINGNAME_,MetallicReflectance,_MATRIXNAME_,metallicReflectance,_INFONAME_,MetallicReflectanceInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,REFLECTANCE,_VARYINGNAME_,Reflectance,_MATRIXNAME_,reflectance,_INFONAME_,ReflectanceInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_MATRIXNAME_,bump,_INFONAME_,BumpInfos.x)\n#ifdef CLEARCOAT\n#include<samplerVertexImplementation>(_DEFINENAME_,CLEARCOAT_TEXTURE,_VARYINGNAME_,ClearCoat,_MATRIXNAME_,clearCoat,_INFONAME_,ClearCoatInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,CLEARCOAT_TEXTURE_ROUGHNESS,_VARYINGNAME_,ClearCoatRoughness,_MATRIXNAME_,clearCoatRoughness,_INFONAME_,ClearCoatInfos.z)\n#include<samplerVertexImplementation>(_DEFINENAME_,CLEARCOAT_BUMP,_VARYINGNAME_,ClearCoatBump,_MATRIXNAME_,clearCoatBump,_INFONAME_,ClearCoatBumpInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,CLEARCOAT_TINT_TEXTURE,_VARYINGNAME_,ClearCoatTint,_MATRIXNAME_,clearCoatTint,_INFONAME_,ClearCoatTintInfos.x)\n#endif\n#ifdef SHEEN\n#include<samplerVertexImplementation>(_DEFINENAME_,SHEEN_TEXTURE,_VARYINGNAME_,Sheen,_MATRIXNAME_,sheen,_INFONAME_,SheenInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,SHEEN_TEXTURE_ROUGHNESS,_VARYINGNAME_,SheenRoughness,_MATRIXNAME_,sheen,_INFONAME_,SheenInfos.z)\n#endif\n#ifdef ANISOTROPIC\n#include<samplerVertexImplementation>(_DEFINENAME_,ANISOTROPIC_TEXTURE,_VARYINGNAME_,Anisotropy,_MATRIXNAME_,anisotropy,_INFONAME_,AnisotropyInfos.x)\n#endif\n#ifdef SUBSURFACE\n#include<samplerVertexImplementation>(_DEFINENAME_,SS_THICKNESSANDMASK_TEXTURE,_VARYINGNAME_,Thickness,_MATRIXNAME_,thickness,_INFONAME_,ThicknessInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,SS_REFRACTIONINTENSITY_TEXTURE,_VARYINGNAME_,RefractionIntensity,_MATRIXNAME_,refractionIntensity,_INFONAME_,RefractionIntensityInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,SS_TRANSLUCENCYINTENSITY_TEXTURE,_VARYINGNAME_,TranslucencyIntensity,_MATRIXNAME_,translucencyIntensity,_INFONAME_,TranslucencyIntensityInfos.x)\n#endif\n#include<bumpVertex>\n#include<clipPlaneVertex>\n#include<fogVertex>\n#include<shadowsVertex>[0..maxSimultaneousLights]\n#ifdef VERTEXCOLOR\nvColor=color;\n#elif INSTANCESCOLOR\nvColor=instanceColor;\n#endif\n#if defined(POINTSIZE) && !defined(WEBGPU)\ngl_PointSize=pointSize;\n#endif\n#include<logDepthVertex>\n#define CUSTOM_VERTEX_MAIN_END\n}";
36
+ var shader = "precision highp float;\n#include<__decl__pbrVertex>\n#define CUSTOM_VERTEX_BEGIN\nattribute vec3 position;\n#ifdef NORMAL\nattribute vec3 normal;\n#endif\n#ifdef TANGENT\nattribute vec4 tangent;\n#endif\n#ifdef UV1\nattribute vec2 uv;\n#endif\n#include<uvAttributeDeclaration>[2..7]\n#include<mainUVVaryingDeclaration>[1..7]\n#ifdef VERTEXCOLOR\nattribute vec4 color;\n#endif\n#include<helperFunctions>\n#include<bonesDeclaration>\n#include<bakedVertexAnimationDeclaration>\n#include<instancesDeclaration>\n#include<prePassVertexDeclaration>\n#include<samplerVertexDeclaration>(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo)\n#include<samplerVertexDeclaration>(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail)\n#include<samplerVertexDeclaration>(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient)\n#include<samplerVertexDeclaration>(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity)\n#include<samplerVertexDeclaration>(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive)\n#include<samplerVertexDeclaration>(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap)\n#include<samplerVertexDeclaration>(_DEFINENAME_,REFLECTIVITY,_VARYINGNAME_,Reflectivity)\n#include<samplerVertexDeclaration>(_DEFINENAME_,MICROSURFACEMAP,_VARYINGNAME_,MicroSurfaceSampler)\n#include<samplerVertexDeclaration>(_DEFINENAME_,METALLIC_REFLECTANCE,_VARYINGNAME_,MetallicReflectance)\n#include<samplerVertexDeclaration>(_DEFINENAME_,REFLECTANCE,_VARYINGNAME_,Reflectance)\n#include<samplerVertexDeclaration>(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump)\n#ifdef CLEARCOAT\n#include<samplerVertexDeclaration>(_DEFINENAME_,CLEARCOAT_TEXTURE,_VARYINGNAME_,ClearCoat)\n#include<samplerVertexDeclaration>(_DEFINENAME_,CLEARCOAT_TEXTURE_ROUGHNESS,_VARYINGNAME_,ClearCoatRoughness)\n#include<samplerVertexDeclaration>(_DEFINENAME_,CLEARCOAT_BUMP,_VARYINGNAME_,ClearCoatBump)\n#include<samplerVertexDeclaration>(_DEFINENAME_,CLEARCOAT_TINT_TEXTURE,_VARYINGNAME_,ClearCoatTint)\n#endif\n#ifdef SHEEN\n#include<samplerVertexDeclaration>(_DEFINENAME_,SHEEN_TEXTURE,_VARYINGNAME_,Sheen)\n#include<samplerVertexDeclaration>(_DEFINENAME_,SHEEN_TEXTURE_ROUGHNESS,_VARYINGNAME_,SheenRoughness)\n#endif\n#ifdef ANISOTROPIC\n#include<samplerVertexDeclaration>(_DEFINENAME_,ANISOTROPIC_TEXTURE,_VARYINGNAME_,Anisotropy)\n#endif\n#ifdef SUBSURFACE\n#include<samplerVertexDeclaration>(_DEFINENAME_,SS_THICKNESSANDMASK_TEXTURE,_VARYINGNAME_,Thickness)\n#include<samplerVertexDeclaration>(_DEFINENAME_,SS_REFRACTIONINTENSITY_TEXTURE,_VARYINGNAME_,RefractionIntensity)\n#include<samplerVertexDeclaration>(_DEFINENAME_,SS_TRANSLUCENCYINTENSITY_TEXTURE,_VARYINGNAME_,TranslucencyIntensity)\n#endif\nvarying vec3 vPositionW;\n#if DEBUGMODE>0\nvarying vec4 vClipSpacePosition;\n#endif\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\nvarying vec3 vEnvironmentIrradiance;\n#include<harmonicsFunctions>\n#endif\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR)\nvarying vec4 vColor;\n#endif\n#include<bumpVertexDeclaration>\n#include<clipPlaneVertexDeclaration>\n#include<fogVertexDeclaration>\n#include<__decl__lightVxFragment>[0..maxSimultaneousLights]\n#include<morphTargetsVertexGlobalDeclaration>\n#include<morphTargetsVertexDeclaration>[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvarying vec3 vPositionUVW;\n#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvarying vec3 vDirectionW;\n#endif\n#include<logDepthDeclaration>\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvec3 positionUpdated=position;\n#ifdef NORMAL\nvec3 normalUpdated=normal;\n#endif\n#ifdef TANGENT\nvec4 tangentUpdated=tangent;\n#endif\n#ifdef UV1\nvec2 uvUpdated=uv;\n#endif\n#include<morphTargetsVertexGlobal>\n#include<morphTargetsVertex>[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvPositionUVW=positionUpdated;\n#endif\n#define CUSTOM_VERTEX_UPDATE_POSITION\n#define CUSTOM_VERTEX_UPDATE_NORMAL\n#include<instancesVertex>\n#if defined(PREPASS) && defined(PREPASS_VELOCITY) && !defined(BONES_VELOCITY_ENABLED)\nvCurrentPosition=viewProjection*finalWorld*vec4(positionUpdated,1.0);\nvPreviousPosition=previousViewProjection*finalPreviousWorld*vec4(positionUpdated,1.0);\n#endif\n#include<bonesVertex>\n#include<bakedVertexAnimation>\nvec4 worldPos=finalWorld*vec4(positionUpdated,1.0);\nvPositionW=vec3(worldPos);\n#include<prePassVertex>\n#ifdef NORMAL\nmat3 normalWorld=mat3(finalWorld);\n#if defined(INSTANCES) && defined(THIN_INSTANCES)\nvNormalW=normalUpdated/vec3(dot(normalWorld[0],normalWorld[0]),dot(normalWorld[1],normalWorld[1]),dot(normalWorld[2],normalWorld[2]));\nvNormalW=normalize(normalWorld*vNormalW);\n#else\n#ifdef NONUNIFORMSCALING\nnormalWorld=transposeMat3(inverseMat3(normalWorld));\n#endif\nvNormalW=normalize(normalWorld*normalUpdated);\n#endif\n#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\nvec3 reflectionVector=vec3(reflectionMatrix*vec4(vNormalW,0)).xyz;\n#ifdef REFLECTIONMAP_OPPOSITEZ\nreflectionVector.z*=-1.0;\n#endif\nvEnvironmentIrradiance=computeEnvironmentIrradiance(reflectionVector);\n#endif\n#endif\n#define CUSTOM_VERTEX_UPDATE_WORLDPOS\n#ifdef MULTIVIEW\nif (gl_ViewID_OVR==0u) {\ngl_Position=viewProjection*worldPos;\n} else {\ngl_Position=viewProjectionR*worldPos;\n}\n#else\ngl_Position=viewProjection*worldPos;\n#endif\n#if DEBUGMODE>0\nvClipSpacePosition=gl_Position;\n#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvDirectionW=normalize(vec3(finalWorld*vec4(positionUpdated,0.0)));\n#endif\n#ifndef UV1\nvec2 uvUpdated=vec2(0.,0.);\n#endif\n#ifdef MAINUV1\nvMainUV1=uvUpdated;\n#endif\n#include<uvVariableDeclaration>[2..7]\n#include<samplerVertexImplementation>(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo,_MATRIXNAME_,albedo,_INFONAME_,AlbedoInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_MATRIXNAME_,detail,_INFONAME_,DetailInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_MATRIXNAME_,ambient,_INFONAME_,AmbientInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_MATRIXNAME_,opacity,_INFONAME_,OpacityInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_MATRIXNAME_,emissive,_INFONAME_,EmissiveInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_MATRIXNAME_,lightmap,_INFONAME_,LightmapInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,REFLECTIVITY,_VARYINGNAME_,Reflectivity,_MATRIXNAME_,reflectivity,_INFONAME_,ReflectivityInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,MICROSURFACEMAP,_VARYINGNAME_,MicroSurfaceSampler,_MATRIXNAME_,microSurfaceSampler,_INFONAME_,MicroSurfaceSamplerInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,METALLIC_REFLECTANCE,_VARYINGNAME_,MetallicReflectance,_MATRIXNAME_,metallicReflectance,_INFONAME_,MetallicReflectanceInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,REFLECTANCE,_VARYINGNAME_,Reflectance,_MATRIXNAME_,reflectance,_INFONAME_,ReflectanceInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_MATRIXNAME_,bump,_INFONAME_,BumpInfos.x)\n#ifdef CLEARCOAT\n#include<samplerVertexImplementation>(_DEFINENAME_,CLEARCOAT_TEXTURE,_VARYINGNAME_,ClearCoat,_MATRIXNAME_,clearCoat,_INFONAME_,ClearCoatInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,CLEARCOAT_TEXTURE_ROUGHNESS,_VARYINGNAME_,ClearCoatRoughness,_MATRIXNAME_,clearCoatRoughness,_INFONAME_,ClearCoatInfos.z)\n#include<samplerVertexImplementation>(_DEFINENAME_,CLEARCOAT_BUMP,_VARYINGNAME_,ClearCoatBump,_MATRIXNAME_,clearCoatBump,_INFONAME_,ClearCoatBumpInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,CLEARCOAT_TINT_TEXTURE,_VARYINGNAME_,ClearCoatTint,_MATRIXNAME_,clearCoatTint,_INFONAME_,ClearCoatTintInfos.x)\n#endif\n#ifdef IRIDESCENCE\n#include<samplerVertexImplementation>(_DEFINENAME_,IRIDESCENCE_TEXTURE,_VARYINGNAME_,Iridescence,_MATRIXNAME_,iridescence,_INFONAME_,IridescenceInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,IRIDESCENCE_THICKNESS_TEXTURE,_VARYINGNAME_,IridescenceThickness,_MATRIXNAME_,iridescenceThickness,_INFONAME_,IridescenceInfos.z)\n#endif\n#ifdef SHEEN\n#include<samplerVertexImplementation>(_DEFINENAME_,SHEEN_TEXTURE,_VARYINGNAME_,Sheen,_MATRIXNAME_,sheen,_INFONAME_,SheenInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,SHEEN_TEXTURE_ROUGHNESS,_VARYINGNAME_,SheenRoughness,_MATRIXNAME_,sheen,_INFONAME_,SheenInfos.z)\n#endif\n#ifdef ANISOTROPIC\n#include<samplerVertexImplementation>(_DEFINENAME_,ANISOTROPIC_TEXTURE,_VARYINGNAME_,Anisotropy,_MATRIXNAME_,anisotropy,_INFONAME_,AnisotropyInfos.x)\n#endif\n#ifdef SUBSURFACE\n#include<samplerVertexImplementation>(_DEFINENAME_,SS_THICKNESSANDMASK_TEXTURE,_VARYINGNAME_,Thickness,_MATRIXNAME_,thickness,_INFONAME_,ThicknessInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,SS_REFRACTIONINTENSITY_TEXTURE,_VARYINGNAME_,RefractionIntensity,_MATRIXNAME_,refractionIntensity,_INFONAME_,RefractionIntensityInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,SS_TRANSLUCENCYINTENSITY_TEXTURE,_VARYINGNAME_,TranslucencyIntensity,_MATRIXNAME_,translucencyIntensity,_INFONAME_,TranslucencyIntensityInfos.x)\n#endif\n#include<bumpVertex>\n#include<clipPlaneVertex>\n#include<fogVertex>\n#include<shadowsVertex>[0..maxSimultaneousLights]\n#ifdef VERTEXCOLOR\nvColor=color;\n#elif INSTANCESCOLOR\nvColor=instanceColor;\n#endif\n#if defined(POINTSIZE) && !defined(WEBGPU)\ngl_PointSize=pointSize;\n#endif\n#include<logDepthVertex>\n#define CUSTOM_VERTEX_MAIN_END\n}";
37
37
  // Sideeffect
38
38
  ShaderStore.ShadersStore[name] = shader;
39
39
  /** @hidden */
@@ -1 +1 @@
1
- {"version":3,"file":"pbr.vertex.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Shaders/pbr.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,uCAAuC,CAAC;AAC/C,OAAO,oCAAoC,CAAC;AAC5C,OAAO,yCAAyC,CAAC;AACjD,OAAO,2CAA2C,CAAC;AACnD,OAAO,kCAAkC,CAAC;AAC1C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,kDAAkD,CAAC;AAC1D,OAAO,uCAAuC,CAAC;AAC/C,OAAO,2CAA2C,CAAC;AACnD,OAAO,2CAA2C,CAAC;AACnD,OAAO,qCAAqC,CAAC;AAC7C,OAAO,wCAAwC,CAAC;AAChD,OAAO,6CAA6C,CAAC;AACrD,OAAO,uCAAuC,CAAC;AAC/C,OAAO,6CAA6C,CAAC;AACrD,OAAO,wCAAwC,CAAC;AAChD,OAAO,sDAAsD,CAAC;AAC9D,OAAO,gDAAgD,CAAC;AACxD,OAAO,sCAAsC,CAAC;AAC9C,OAAO,2CAA2C,CAAC;AACnD,OAAO,qCAAqC,CAAC;AAC7C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,8BAA8B,CAAC;AACtC,OAAO,uCAAuC,CAAC;AAC/C,OAAO,gCAAgC,CAAC;AACxC,OAAO,wCAAwC,CAAC;AAChD,OAAO,8CAA8C,CAAC;AACtD,OAAO,6BAA6B,CAAC;AACrC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,4BAA4B,CAAC;AACpC,OAAO,gCAAgC,CAAC;AACxC,OAAO,iCAAiC,CAAC;AAEzC,IAAM,IAAI,GAAG,iBAAiB,CAAC;AAC/B,IAAM,MAAM,GAAG,+pSAkMb,CAAC;AACH,aAAa;AACb,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACxC,cAAc;AACd,MAAM,CAAC,IAAM,eAAe,GAAG,EAAE,IAAI,MAAA,EAAE,MAAM,QAAA,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\nimport \"./ShadersInclude/pbrVertexDeclaration\";\nimport \"./ShadersInclude/pbrUboDeclaration\";\nimport \"./ShadersInclude/uvAttributeDeclaration\";\nimport \"./ShadersInclude/mainUVVaryingDeclaration\";\nimport \"./ShadersInclude/helperFunctions\";\nimport \"./ShadersInclude/bonesDeclaration\";\nimport \"./ShadersInclude/bakedVertexAnimationDeclaration\";\nimport \"./ShadersInclude/instancesDeclaration\";\nimport \"./ShadersInclude/prePassVertexDeclaration\";\nimport \"./ShadersInclude/samplerVertexDeclaration\";\nimport \"./ShadersInclude/harmonicsFunctions\";\nimport \"./ShadersInclude/bumpVertexDeclaration\";\nimport \"./ShadersInclude/clipPlaneVertexDeclaration\";\nimport \"./ShadersInclude/fogVertexDeclaration\";\nimport \"./ShadersInclude/lightVxFragmentDeclaration\";\nimport \"./ShadersInclude/lightVxUboDeclaration\";\nimport \"./ShadersInclude/morphTargetsVertexGlobalDeclaration\";\nimport \"./ShadersInclude/morphTargetsVertexDeclaration\";\nimport \"./ShadersInclude/logDepthDeclaration\";\nimport \"./ShadersInclude/morphTargetsVertexGlobal\";\nimport \"./ShadersInclude/morphTargetsVertex\";\nimport \"./ShadersInclude/instancesVertex\";\nimport \"./ShadersInclude/bonesVertex\";\nimport \"./ShadersInclude/bakedVertexAnimation\";\nimport \"./ShadersInclude/prePassVertex\";\nimport \"./ShadersInclude/uvVariableDeclaration\";\nimport \"./ShadersInclude/samplerVertexImplementation\";\nimport \"./ShadersInclude/bumpVertex\";\nimport \"./ShadersInclude/clipPlaneVertex\";\nimport \"./ShadersInclude/fogVertex\";\nimport \"./ShadersInclude/shadowsVertex\";\nimport \"./ShadersInclude/logDepthVertex\";\n\nconst name = \"pbrVertexShader\";\nconst shader = `precision highp float;\r#include<__decl__pbrVertex>\n#define CUSTOM_VERTEX_BEGIN\nattribute vec3 position;\r#ifdef NORMAL\nattribute vec3 normal;\r#endif\n#ifdef TANGENT\nattribute vec4 tangent;\r#endif\n#ifdef UV1\nattribute vec2 uv;\r#endif\n#include<uvAttributeDeclaration>[2..7]\n#include<mainUVVaryingDeclaration>[1..7]\n#ifdef VERTEXCOLOR\nattribute vec4 color;\r#endif\n#include<helperFunctions>\n#include<bonesDeclaration>\n#include<bakedVertexAnimationDeclaration>\n#include<instancesDeclaration>\n#include<prePassVertexDeclaration>\n#include<samplerVertexDeclaration>(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo)\n#include<samplerVertexDeclaration>(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail)\n#include<samplerVertexDeclaration>(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient)\n#include<samplerVertexDeclaration>(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity)\n#include<samplerVertexDeclaration>(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive)\n#include<samplerVertexDeclaration>(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap)\n#include<samplerVertexDeclaration>(_DEFINENAME_,REFLECTIVITY,_VARYINGNAME_,Reflectivity)\n#include<samplerVertexDeclaration>(_DEFINENAME_,MICROSURFACEMAP,_VARYINGNAME_,MicroSurfaceSampler)\n#include<samplerVertexDeclaration>(_DEFINENAME_,METALLIC_REFLECTANCE,_VARYINGNAME_,MetallicReflectance)\n#include<samplerVertexDeclaration>(_DEFINENAME_,REFLECTANCE,_VARYINGNAME_,Reflectance)\n#include<samplerVertexDeclaration>(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump)\n#ifdef CLEARCOAT\n#include<samplerVertexDeclaration>(_DEFINENAME_,CLEARCOAT_TEXTURE,_VARYINGNAME_,ClearCoat)\n#include<samplerVertexDeclaration>(_DEFINENAME_,CLEARCOAT_TEXTURE_ROUGHNESS,_VARYINGNAME_,ClearCoatRoughness)\n#include<samplerVertexDeclaration>(_DEFINENAME_,CLEARCOAT_BUMP,_VARYINGNAME_,ClearCoatBump)\n#include<samplerVertexDeclaration>(_DEFINENAME_,CLEARCOAT_TINT_TEXTURE,_VARYINGNAME_,ClearCoatTint)\n#endif\n#ifdef SHEEN\n#include<samplerVertexDeclaration>(_DEFINENAME_,SHEEN_TEXTURE,_VARYINGNAME_,Sheen)\n#include<samplerVertexDeclaration>(_DEFINENAME_,SHEEN_TEXTURE_ROUGHNESS,_VARYINGNAME_,SheenRoughness)\n#endif\n#ifdef ANISOTROPIC\n#include<samplerVertexDeclaration>(_DEFINENAME_,ANISOTROPIC_TEXTURE,_VARYINGNAME_,Anisotropy)\n#endif\n#ifdef SUBSURFACE\n#include<samplerVertexDeclaration>(_DEFINENAME_,SS_THICKNESSANDMASK_TEXTURE,_VARYINGNAME_,Thickness)\n#include<samplerVertexDeclaration>(_DEFINENAME_,SS_REFRACTIONINTENSITY_TEXTURE,_VARYINGNAME_,RefractionIntensity)\n#include<samplerVertexDeclaration>(_DEFINENAME_,SS_TRANSLUCENCYINTENSITY_TEXTURE,_VARYINGNAME_,TranslucencyIntensity)\n#endif\nvarying vec3 vPositionW;\r#if DEBUGMODE>0\nvarying vec4 vClipSpacePosition;\r#endif\n#ifdef NORMAL\nvarying vec3 vNormalW;\r#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\nvarying vec3 vEnvironmentIrradiance;\r#include<harmonicsFunctions>\n#endif\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR)\nvarying vec4 vColor;\r#endif\n#include<bumpVertexDeclaration>\n#include<clipPlaneVertexDeclaration>\n#include<fogVertexDeclaration>\n#include<__decl__lightVxFragment>[0..maxSimultaneousLights]\n#include<morphTargetsVertexGlobalDeclaration>\n#include<morphTargetsVertexDeclaration>[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvarying vec3 vPositionUVW;\r#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvarying vec3 vDirectionW;\r#endif\n#include<logDepthDeclaration>\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\r#define CUSTOM_VERTEX_MAIN_BEGIN\nvec3 positionUpdated=position;\r#ifdef NORMAL\nvec3 normalUpdated=normal;\r#endif\n#ifdef TANGENT\nvec4 tangentUpdated=tangent;\r#endif\n#ifdef UV1\nvec2 uvUpdated=uv;\r#endif\n#include<morphTargetsVertexGlobal>\n#include<morphTargetsVertex>[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvPositionUVW=positionUpdated;\r#endif\n#define CUSTOM_VERTEX_UPDATE_POSITION\n#define CUSTOM_VERTEX_UPDATE_NORMAL\n#include<instancesVertex>\n#if defined(PREPASS) && defined(PREPASS_VELOCITY) && !defined(BONES_VELOCITY_ENABLED)\nvCurrentPosition=viewProjection*finalWorld*vec4(positionUpdated,1.0);\rvPreviousPosition=previousViewProjection*finalPreviousWorld*vec4(positionUpdated,1.0);\r#endif\n#include<bonesVertex>\n#include<bakedVertexAnimation>\nvec4 worldPos=finalWorld*vec4(positionUpdated,1.0);\rvPositionW=vec3(worldPos);\r#include<prePassVertex>\n#ifdef NORMAL\nmat3 normalWorld=mat3(finalWorld);\r#if defined(INSTANCES) && defined(THIN_INSTANCES)\nvNormalW=normalUpdated/vec3(dot(normalWorld[0],normalWorld[0]),dot(normalWorld[1],normalWorld[1]),dot(normalWorld[2],normalWorld[2]));\rvNormalW=normalize(normalWorld*vNormalW);\r#else\n#ifdef NONUNIFORMSCALING\nnormalWorld=transposeMat3(inverseMat3(normalWorld));\r#endif\nvNormalW=normalize(normalWorld*normalUpdated);\r#endif\n#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\nvec3 reflectionVector=vec3(reflectionMatrix*vec4(vNormalW,0)).xyz;\r#ifdef REFLECTIONMAP_OPPOSITEZ\nreflectionVector.z*=-1.0;\r#endif\nvEnvironmentIrradiance=computeEnvironmentIrradiance(reflectionVector);\r#endif\n#endif\n#define CUSTOM_VERTEX_UPDATE_WORLDPOS\n#ifdef MULTIVIEW\nif (gl_ViewID_OVR==0u) {\rgl_Position=viewProjection*worldPos;\r} else {\rgl_Position=viewProjectionR*worldPos;\r}\r#else\ngl_Position=viewProjection*worldPos;\r#endif\n#if DEBUGMODE>0\nvClipSpacePosition=gl_Position;\r#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvDirectionW=normalize(vec3(finalWorld*vec4(positionUpdated,0.0)));\r#endif\n#ifndef UV1\nvec2 uvUpdated=vec2(0.,0.);\r#endif\n#ifdef MAINUV1\nvMainUV1=uvUpdated;\r#endif\n#include<uvVariableDeclaration>[2..7]\n#include<samplerVertexImplementation>(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo,_MATRIXNAME_,albedo,_INFONAME_,AlbedoInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_MATRIXNAME_,detail,_INFONAME_,DetailInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_MATRIXNAME_,ambient,_INFONAME_,AmbientInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_MATRIXNAME_,opacity,_INFONAME_,OpacityInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_MATRIXNAME_,emissive,_INFONAME_,EmissiveInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_MATRIXNAME_,lightmap,_INFONAME_,LightmapInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,REFLECTIVITY,_VARYINGNAME_,Reflectivity,_MATRIXNAME_,reflectivity,_INFONAME_,ReflectivityInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,MICROSURFACEMAP,_VARYINGNAME_,MicroSurfaceSampler,_MATRIXNAME_,microSurfaceSampler,_INFONAME_,MicroSurfaceSamplerInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,METALLIC_REFLECTANCE,_VARYINGNAME_,MetallicReflectance,_MATRIXNAME_,metallicReflectance,_INFONAME_,MetallicReflectanceInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,REFLECTANCE,_VARYINGNAME_,Reflectance,_MATRIXNAME_,reflectance,_INFONAME_,ReflectanceInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_MATRIXNAME_,bump,_INFONAME_,BumpInfos.x)\n#ifdef CLEARCOAT\n#include<samplerVertexImplementation>(_DEFINENAME_,CLEARCOAT_TEXTURE,_VARYINGNAME_,ClearCoat,_MATRIXNAME_,clearCoat,_INFONAME_,ClearCoatInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,CLEARCOAT_TEXTURE_ROUGHNESS,_VARYINGNAME_,ClearCoatRoughness,_MATRIXNAME_,clearCoatRoughness,_INFONAME_,ClearCoatInfos.z)\n#include<samplerVertexImplementation>(_DEFINENAME_,CLEARCOAT_BUMP,_VARYINGNAME_,ClearCoatBump,_MATRIXNAME_,clearCoatBump,_INFONAME_,ClearCoatBumpInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,CLEARCOAT_TINT_TEXTURE,_VARYINGNAME_,ClearCoatTint,_MATRIXNAME_,clearCoatTint,_INFONAME_,ClearCoatTintInfos.x)\n#endif\n#ifdef SHEEN\n#include<samplerVertexImplementation>(_DEFINENAME_,SHEEN_TEXTURE,_VARYINGNAME_,Sheen,_MATRIXNAME_,sheen,_INFONAME_,SheenInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,SHEEN_TEXTURE_ROUGHNESS,_VARYINGNAME_,SheenRoughness,_MATRIXNAME_,sheen,_INFONAME_,SheenInfos.z)\n#endif\n#ifdef ANISOTROPIC\n#include<samplerVertexImplementation>(_DEFINENAME_,ANISOTROPIC_TEXTURE,_VARYINGNAME_,Anisotropy,_MATRIXNAME_,anisotropy,_INFONAME_,AnisotropyInfos.x)\n#endif\n#ifdef SUBSURFACE\n#include<samplerVertexImplementation>(_DEFINENAME_,SS_THICKNESSANDMASK_TEXTURE,_VARYINGNAME_,Thickness,_MATRIXNAME_,thickness,_INFONAME_,ThicknessInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,SS_REFRACTIONINTENSITY_TEXTURE,_VARYINGNAME_,RefractionIntensity,_MATRIXNAME_,refractionIntensity,_INFONAME_,RefractionIntensityInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,SS_TRANSLUCENCYINTENSITY_TEXTURE,_VARYINGNAME_,TranslucencyIntensity,_MATRIXNAME_,translucencyIntensity,_INFONAME_,TranslucencyIntensityInfos.x)\n#endif\n#include<bumpVertex>\n#include<clipPlaneVertex>\n#include<fogVertex>\n#include<shadowsVertex>[0..maxSimultaneousLights]\n#ifdef VERTEXCOLOR\nvColor=color;\r#elif INSTANCESCOLOR\nvColor=instanceColor;\r#endif\n#if defined(POINTSIZE) && !defined(WEBGPU)\ngl_PointSize=pointSize;\r#endif\n#include<logDepthVertex>\n#define CUSTOM_VERTEX_MAIN_END\n}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @hidden */\nexport const pbrVertexShader = { name, shader };\n"]}
1
+ {"version":3,"file":"pbr.vertex.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Shaders/pbr.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,uCAAuC,CAAC;AAC/C,OAAO,oCAAoC,CAAC;AAC5C,OAAO,yCAAyC,CAAC;AACjD,OAAO,2CAA2C,CAAC;AACnD,OAAO,kCAAkC,CAAC;AAC1C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,kDAAkD,CAAC;AAC1D,OAAO,uCAAuC,CAAC;AAC/C,OAAO,2CAA2C,CAAC;AACnD,OAAO,2CAA2C,CAAC;AACnD,OAAO,qCAAqC,CAAC;AAC7C,OAAO,wCAAwC,CAAC;AAChD,OAAO,6CAA6C,CAAC;AACrD,OAAO,uCAAuC,CAAC;AAC/C,OAAO,6CAA6C,CAAC;AACrD,OAAO,wCAAwC,CAAC;AAChD,OAAO,sDAAsD,CAAC;AAC9D,OAAO,gDAAgD,CAAC;AACxD,OAAO,sCAAsC,CAAC;AAC9C,OAAO,2CAA2C,CAAC;AACnD,OAAO,qCAAqC,CAAC;AAC7C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,8BAA8B,CAAC;AACtC,OAAO,uCAAuC,CAAC;AAC/C,OAAO,gCAAgC,CAAC;AACxC,OAAO,wCAAwC,CAAC;AAChD,OAAO,8CAA8C,CAAC;AACtD,OAAO,6BAA6B,CAAC;AACrC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,4BAA4B,CAAC;AACpC,OAAO,gCAAgC,CAAC;AACxC,OAAO,iCAAiC,CAAC;AAEzC,IAAM,IAAI,GAAG,iBAAiB,CAAC;AAC/B,IAAM,MAAM,GAAG,2gTAsMb,CAAC;AACH,aAAa;AACb,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACxC,cAAc;AACd,MAAM,CAAC,IAAM,eAAe,GAAG,EAAE,IAAI,MAAA,EAAE,MAAM,QAAA,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\nimport \"./ShadersInclude/pbrVertexDeclaration\";\nimport \"./ShadersInclude/pbrUboDeclaration\";\nimport \"./ShadersInclude/uvAttributeDeclaration\";\nimport \"./ShadersInclude/mainUVVaryingDeclaration\";\nimport \"./ShadersInclude/helperFunctions\";\nimport \"./ShadersInclude/bonesDeclaration\";\nimport \"./ShadersInclude/bakedVertexAnimationDeclaration\";\nimport \"./ShadersInclude/instancesDeclaration\";\nimport \"./ShadersInclude/prePassVertexDeclaration\";\nimport \"./ShadersInclude/samplerVertexDeclaration\";\nimport \"./ShadersInclude/harmonicsFunctions\";\nimport \"./ShadersInclude/bumpVertexDeclaration\";\nimport \"./ShadersInclude/clipPlaneVertexDeclaration\";\nimport \"./ShadersInclude/fogVertexDeclaration\";\nimport \"./ShadersInclude/lightVxFragmentDeclaration\";\nimport \"./ShadersInclude/lightVxUboDeclaration\";\nimport \"./ShadersInclude/morphTargetsVertexGlobalDeclaration\";\nimport \"./ShadersInclude/morphTargetsVertexDeclaration\";\nimport \"./ShadersInclude/logDepthDeclaration\";\nimport \"./ShadersInclude/morphTargetsVertexGlobal\";\nimport \"./ShadersInclude/morphTargetsVertex\";\nimport \"./ShadersInclude/instancesVertex\";\nimport \"./ShadersInclude/bonesVertex\";\nimport \"./ShadersInclude/bakedVertexAnimation\";\nimport \"./ShadersInclude/prePassVertex\";\nimport \"./ShadersInclude/uvVariableDeclaration\";\nimport \"./ShadersInclude/samplerVertexImplementation\";\nimport \"./ShadersInclude/bumpVertex\";\nimport \"./ShadersInclude/clipPlaneVertex\";\nimport \"./ShadersInclude/fogVertex\";\nimport \"./ShadersInclude/shadowsVertex\";\nimport \"./ShadersInclude/logDepthVertex\";\n\nconst name = \"pbrVertexShader\";\nconst shader = `precision highp float;\r#include<__decl__pbrVertex>\n#define CUSTOM_VERTEX_BEGIN\nattribute vec3 position;\r#ifdef NORMAL\nattribute vec3 normal;\r#endif\n#ifdef TANGENT\nattribute vec4 tangent;\r#endif\n#ifdef UV1\nattribute vec2 uv;\r#endif\n#include<uvAttributeDeclaration>[2..7]\n#include<mainUVVaryingDeclaration>[1..7]\n#ifdef VERTEXCOLOR\nattribute vec4 color;\r#endif\n#include<helperFunctions>\n#include<bonesDeclaration>\n#include<bakedVertexAnimationDeclaration>\n#include<instancesDeclaration>\n#include<prePassVertexDeclaration>\n#include<samplerVertexDeclaration>(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo)\n#include<samplerVertexDeclaration>(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail)\n#include<samplerVertexDeclaration>(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient)\n#include<samplerVertexDeclaration>(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity)\n#include<samplerVertexDeclaration>(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive)\n#include<samplerVertexDeclaration>(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap)\n#include<samplerVertexDeclaration>(_DEFINENAME_,REFLECTIVITY,_VARYINGNAME_,Reflectivity)\n#include<samplerVertexDeclaration>(_DEFINENAME_,MICROSURFACEMAP,_VARYINGNAME_,MicroSurfaceSampler)\n#include<samplerVertexDeclaration>(_DEFINENAME_,METALLIC_REFLECTANCE,_VARYINGNAME_,MetallicReflectance)\n#include<samplerVertexDeclaration>(_DEFINENAME_,REFLECTANCE,_VARYINGNAME_,Reflectance)\n#include<samplerVertexDeclaration>(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump)\n#ifdef CLEARCOAT\n#include<samplerVertexDeclaration>(_DEFINENAME_,CLEARCOAT_TEXTURE,_VARYINGNAME_,ClearCoat)\n#include<samplerVertexDeclaration>(_DEFINENAME_,CLEARCOAT_TEXTURE_ROUGHNESS,_VARYINGNAME_,ClearCoatRoughness)\n#include<samplerVertexDeclaration>(_DEFINENAME_,CLEARCOAT_BUMP,_VARYINGNAME_,ClearCoatBump)\n#include<samplerVertexDeclaration>(_DEFINENAME_,CLEARCOAT_TINT_TEXTURE,_VARYINGNAME_,ClearCoatTint)\n#endif\n#ifdef SHEEN\n#include<samplerVertexDeclaration>(_DEFINENAME_,SHEEN_TEXTURE,_VARYINGNAME_,Sheen)\n#include<samplerVertexDeclaration>(_DEFINENAME_,SHEEN_TEXTURE_ROUGHNESS,_VARYINGNAME_,SheenRoughness)\n#endif\n#ifdef ANISOTROPIC\n#include<samplerVertexDeclaration>(_DEFINENAME_,ANISOTROPIC_TEXTURE,_VARYINGNAME_,Anisotropy)\n#endif\n#ifdef SUBSURFACE\n#include<samplerVertexDeclaration>(_DEFINENAME_,SS_THICKNESSANDMASK_TEXTURE,_VARYINGNAME_,Thickness)\n#include<samplerVertexDeclaration>(_DEFINENAME_,SS_REFRACTIONINTENSITY_TEXTURE,_VARYINGNAME_,RefractionIntensity)\n#include<samplerVertexDeclaration>(_DEFINENAME_,SS_TRANSLUCENCYINTENSITY_TEXTURE,_VARYINGNAME_,TranslucencyIntensity)\n#endif\nvarying vec3 vPositionW;\r#if DEBUGMODE>0\nvarying vec4 vClipSpacePosition;\r#endif\n#ifdef NORMAL\nvarying vec3 vNormalW;\r#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\nvarying vec3 vEnvironmentIrradiance;\r#include<harmonicsFunctions>\n#endif\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR)\nvarying vec4 vColor;\r#endif\n#include<bumpVertexDeclaration>\n#include<clipPlaneVertexDeclaration>\n#include<fogVertexDeclaration>\n#include<__decl__lightVxFragment>[0..maxSimultaneousLights]\n#include<morphTargetsVertexGlobalDeclaration>\n#include<morphTargetsVertexDeclaration>[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvarying vec3 vPositionUVW;\r#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvarying vec3 vDirectionW;\r#endif\n#include<logDepthDeclaration>\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\r#define CUSTOM_VERTEX_MAIN_BEGIN\nvec3 positionUpdated=position;\r#ifdef NORMAL\nvec3 normalUpdated=normal;\r#endif\n#ifdef TANGENT\nvec4 tangentUpdated=tangent;\r#endif\n#ifdef UV1\nvec2 uvUpdated=uv;\r#endif\n#include<morphTargetsVertexGlobal>\n#include<morphTargetsVertex>[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvPositionUVW=positionUpdated;\r#endif\n#define CUSTOM_VERTEX_UPDATE_POSITION\n#define CUSTOM_VERTEX_UPDATE_NORMAL\n#include<instancesVertex>\n#if defined(PREPASS) && defined(PREPASS_VELOCITY) && !defined(BONES_VELOCITY_ENABLED)\nvCurrentPosition=viewProjection*finalWorld*vec4(positionUpdated,1.0);\rvPreviousPosition=previousViewProjection*finalPreviousWorld*vec4(positionUpdated,1.0);\r#endif\n#include<bonesVertex>\n#include<bakedVertexAnimation>\nvec4 worldPos=finalWorld*vec4(positionUpdated,1.0);\rvPositionW=vec3(worldPos);\r#include<prePassVertex>\n#ifdef NORMAL\nmat3 normalWorld=mat3(finalWorld);\r#if defined(INSTANCES) && defined(THIN_INSTANCES)\nvNormalW=normalUpdated/vec3(dot(normalWorld[0],normalWorld[0]),dot(normalWorld[1],normalWorld[1]),dot(normalWorld[2],normalWorld[2]));\rvNormalW=normalize(normalWorld*vNormalW);\r#else\n#ifdef NONUNIFORMSCALING\nnormalWorld=transposeMat3(inverseMat3(normalWorld));\r#endif\nvNormalW=normalize(normalWorld*normalUpdated);\r#endif\n#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\nvec3 reflectionVector=vec3(reflectionMatrix*vec4(vNormalW,0)).xyz;\r#ifdef REFLECTIONMAP_OPPOSITEZ\nreflectionVector.z*=-1.0;\r#endif\nvEnvironmentIrradiance=computeEnvironmentIrradiance(reflectionVector);\r#endif\n#endif\n#define CUSTOM_VERTEX_UPDATE_WORLDPOS\n#ifdef MULTIVIEW\nif (gl_ViewID_OVR==0u) {\rgl_Position=viewProjection*worldPos;\r} else {\rgl_Position=viewProjectionR*worldPos;\r}\r#else\ngl_Position=viewProjection*worldPos;\r#endif\n#if DEBUGMODE>0\nvClipSpacePosition=gl_Position;\r#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvDirectionW=normalize(vec3(finalWorld*vec4(positionUpdated,0.0)));\r#endif\n#ifndef UV1\nvec2 uvUpdated=vec2(0.,0.);\r#endif\n#ifdef MAINUV1\nvMainUV1=uvUpdated;\r#endif\n#include<uvVariableDeclaration>[2..7]\n#include<samplerVertexImplementation>(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo,_MATRIXNAME_,albedo,_INFONAME_,AlbedoInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_MATRIXNAME_,detail,_INFONAME_,DetailInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_MATRIXNAME_,ambient,_INFONAME_,AmbientInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_MATRIXNAME_,opacity,_INFONAME_,OpacityInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_MATRIXNAME_,emissive,_INFONAME_,EmissiveInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_MATRIXNAME_,lightmap,_INFONAME_,LightmapInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,REFLECTIVITY,_VARYINGNAME_,Reflectivity,_MATRIXNAME_,reflectivity,_INFONAME_,ReflectivityInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,MICROSURFACEMAP,_VARYINGNAME_,MicroSurfaceSampler,_MATRIXNAME_,microSurfaceSampler,_INFONAME_,MicroSurfaceSamplerInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,METALLIC_REFLECTANCE,_VARYINGNAME_,MetallicReflectance,_MATRIXNAME_,metallicReflectance,_INFONAME_,MetallicReflectanceInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,REFLECTANCE,_VARYINGNAME_,Reflectance,_MATRIXNAME_,reflectance,_INFONAME_,ReflectanceInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_MATRIXNAME_,bump,_INFONAME_,BumpInfos.x)\n#ifdef CLEARCOAT\n#include<samplerVertexImplementation>(_DEFINENAME_,CLEARCOAT_TEXTURE,_VARYINGNAME_,ClearCoat,_MATRIXNAME_,clearCoat,_INFONAME_,ClearCoatInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,CLEARCOAT_TEXTURE_ROUGHNESS,_VARYINGNAME_,ClearCoatRoughness,_MATRIXNAME_,clearCoatRoughness,_INFONAME_,ClearCoatInfos.z)\n#include<samplerVertexImplementation>(_DEFINENAME_,CLEARCOAT_BUMP,_VARYINGNAME_,ClearCoatBump,_MATRIXNAME_,clearCoatBump,_INFONAME_,ClearCoatBumpInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,CLEARCOAT_TINT_TEXTURE,_VARYINGNAME_,ClearCoatTint,_MATRIXNAME_,clearCoatTint,_INFONAME_,ClearCoatTintInfos.x)\n#endif\n#ifdef IRIDESCENCE\n#include<samplerVertexImplementation>(_DEFINENAME_,IRIDESCENCE_TEXTURE,_VARYINGNAME_,Iridescence,_MATRIXNAME_,iridescence,_INFONAME_,IridescenceInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,IRIDESCENCE_THICKNESS_TEXTURE,_VARYINGNAME_,IridescenceThickness,_MATRIXNAME_,iridescenceThickness,_INFONAME_,IridescenceInfos.z)\n#endif\n#ifdef SHEEN\n#include<samplerVertexImplementation>(_DEFINENAME_,SHEEN_TEXTURE,_VARYINGNAME_,Sheen,_MATRIXNAME_,sheen,_INFONAME_,SheenInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,SHEEN_TEXTURE_ROUGHNESS,_VARYINGNAME_,SheenRoughness,_MATRIXNAME_,sheen,_INFONAME_,SheenInfos.z)\n#endif\n#ifdef ANISOTROPIC\n#include<samplerVertexImplementation>(_DEFINENAME_,ANISOTROPIC_TEXTURE,_VARYINGNAME_,Anisotropy,_MATRIXNAME_,anisotropy,_INFONAME_,AnisotropyInfos.x)\n#endif\n#ifdef SUBSURFACE\n#include<samplerVertexImplementation>(_DEFINENAME_,SS_THICKNESSANDMASK_TEXTURE,_VARYINGNAME_,Thickness,_MATRIXNAME_,thickness,_INFONAME_,ThicknessInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,SS_REFRACTIONINTENSITY_TEXTURE,_VARYINGNAME_,RefractionIntensity,_MATRIXNAME_,refractionIntensity,_INFONAME_,RefractionIntensityInfos.x)\n#include<samplerVertexImplementation>(_DEFINENAME_,SS_TRANSLUCENCYINTENSITY_TEXTURE,_VARYINGNAME_,TranslucencyIntensity,_MATRIXNAME_,translucencyIntensity,_INFONAME_,TranslucencyIntensityInfos.x)\n#endif\n#include<bumpVertex>\n#include<clipPlaneVertex>\n#include<fogVertex>\n#include<shadowsVertex>[0..maxSimultaneousLights]\n#ifdef VERTEXCOLOR\nvColor=color;\r#elif INSTANCESCOLOR\nvColor=instanceColor;\r#endif\n#if defined(POINTSIZE) && !defined(WEBGPU)\ngl_PointSize=pointSize;\r#endif\n#include<logDepthVertex>\n#define CUSTOM_VERTEX_MAIN_END\n}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @hidden */\nexport const pbrVertexShader = { name, shader };\n"]}
@@ -453,7 +453,7 @@ var WebXRHandTracking = /** @class */ (function (_super) {
453
453
  riggedMeshes[handedness] = handMesh;
454
454
  // single change for left handed systems
455
455
  if (!handsDefined && !scene.useRightHandedSystem) {
456
- handGLB.transformNodes[0].rotate(Axis.Y, Math.PI);
456
+ handGLB.meshes[1].rotate(Axis.Y, Math.PI);
457
457
  }
458
458
  });
459
459
  handShader.dispose();
@@ -1 +1 @@
1
- {"version":3,"file":"WebXRHandTracking.js","sourceRoot":"","sources":["../../../../../../lts/core/generated/XR/features/WebXRHandTracking.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { WebXRInput } from \"../webXRInput\";\r\nimport type { WebXRInputSource } from \"../webXRInputSource\";\r\nimport { Matrix, Quaternion } from \"../../Maths/math.vector\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { PhysicsImpostor } from \"../../Physics/physicsImpostor\";\r\n\r\nimport type { IDisposable, Scene } from \"../../scene\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { InstancedMesh } from \"../../Meshes/instancedMesh\";\r\nimport type { ISceneLoaderAsyncResult } from \"../../Loading/sceneLoader\";\r\nimport { SceneLoader } from \"../../Loading/sceneLoader\";\r\nimport { Color3 } from \"../../Maths/math.color\";\r\nimport { NodeMaterial } from \"../../Materials/Node/nodeMaterial\";\r\nimport type { InputBlock } from \"../../Materials/Node/Blocks/Input/inputBlock\";\r\nimport { Material } from \"../../Materials/material\";\r\nimport { CreateIcoSphere } from \"../../Meshes/Builders/icoSphereBuilder\";\r\nimport { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Axis } from \"../../Maths/math.axis\";\r\nimport { EngineStore } from \"../../Engines/engineStore\";\r\nimport { Constants } from \"../../Engines/constants\";\r\n\r\ndeclare const XRHand: XRHand;\r\n\r\n/**\r\n * Configuration interface for the hand tracking feature\r\n */\r\nexport interface IWebXRHandTrackingOptions {\r\n /**\r\n * The xrInput that will be used as source for new hands\r\n */\r\n xrInput: WebXRInput;\r\n\r\n /**\r\n * Configuration object for the joint meshes.\r\n */\r\n jointMeshes?: {\r\n /**\r\n * Should the meshes created be invisible (defaults to false).\r\n */\r\n invisible?: boolean;\r\n /**\r\n * A source mesh to be used to create instances. Defaults to an icosphere with two subdivisions and smooth lighting.\r\n * This mesh will be the source for all other (25) meshes.\r\n * It should have the general size of a single unit, as the instances will be scaled according to the provided radius.\r\n */\r\n sourceMesh?: Mesh;\r\n /**\r\n * This function will be called after a mesh was created for a specific joint.\r\n * Using this function you can either manipulate the instance or return a new mesh.\r\n * When returning a new mesh the instance created before will be disposed.\r\n * @param meshInstance An instance of the original joint mesh being used for the joint.\r\n * @param jointId The joint's index, see https://immersive-web.github.io/webxr-hand-input/#skeleton-joints-section for more info.\r\n * @param hand Which hand (\"left\", \"right\") the joint will be on.\r\n */\r\n onHandJointMeshGenerated?: (meshInstance: InstancedMesh, jointId: number, hand: XRHandedness) => AbstractMesh | undefined;\r\n /**\r\n * Should the source mesh stay visible (defaults to false).\r\n */\r\n keepOriginalVisible?: boolean;\r\n /**\r\n * Should each instance have its own physics impostor\r\n */\r\n enablePhysics?: boolean;\r\n /**\r\n * If enabled, override default physics properties\r\n */\r\n physicsProps?: { friction?: number; restitution?: number; impostorType?: number };\r\n /**\r\n * Scale factor for all joint meshes (defaults to 1)\r\n */\r\n scaleFactor?: number;\r\n };\r\n\r\n /**\r\n * Configuration object for the hand meshes.\r\n */\r\n handMeshes?: {\r\n /**\r\n * Should the default hand mesh be disabled. In this case, the spheres will be visible (unless set invisible).\r\n */\r\n disableDefaultMeshes?: boolean;\r\n /**\r\n * Rigged hand meshes that will be tracked to the user's hands. This will override the default hand mesh.\r\n */\r\n customMeshes?: {\r\n right: AbstractMesh;\r\n left: AbstractMesh;\r\n };\r\n /**\r\n * Are the meshes prepared for a left-handed system. Default hand meshes are right-handed.\r\n */\r\n meshesUseLeftHandedCoordinates?: boolean;\r\n /**\r\n * If a hand mesh was provided, this array will define what axis will update which node. This will override the default hand mesh\r\n */\r\n customRigMappings?: {\r\n right: XRHandMeshRigMapping;\r\n left: XRHandMeshRigMapping;\r\n };\r\n\r\n /**\r\n * Override the colors of the hand meshes.\r\n */\r\n customColors?: {\r\n base?: Color3;\r\n fresnel?: Color3;\r\n fingerColor?: Color3;\r\n tipFresnel?: Color3;\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Parts of the hands divided to writs and finger names\r\n */\r\nexport const enum HandPart {\r\n /**\r\n * HandPart - Wrist\r\n */\r\n WRIST = \"wrist\",\r\n /**\r\n * HandPart - The thumb\r\n */\r\n THUMB = \"thumb\",\r\n /**\r\n * HandPart - Index finger\r\n */\r\n INDEX = \"index\",\r\n /**\r\n * HandPart - Middle finger\r\n */\r\n MIDDLE = \"middle\",\r\n /**\r\n * HandPart - Ring finger\r\n */\r\n RING = \"ring\",\r\n /**\r\n * HandPart - Little finger\r\n */\r\n LITTLE = \"little\",\r\n}\r\n\r\n/**\r\n * Joints of the hand as defined by the WebXR specification.\r\n * https://immersive-web.github.io/webxr-hand-input/#skeleton-joints-section\r\n */\r\nexport const enum XRHandJoint {\r\n /** Wrist */\r\n WRIST = \"wrist\",\r\n\r\n /** Thumb near wrist */\r\n THUMB_METACARPAL = \"thumb-metacarpal\",\r\n /** Thumb first knuckle */\r\n THUMB_PHALANX_PROXIMAL = \"thumb-phalanx-proximal\",\r\n /** Thumb second knuckle */\r\n THUMB_PHALANX_DISTAL = \"thumb-phalanx-distal\",\r\n /** Thumb tip */\r\n THUMB_TIP = \"thumb-tip\",\r\n\r\n /** Index finger near wrist */\r\n INDEX_FINGER_METACARPAL = \"index-finger-metacarpal\",\r\n /** Index finger first knuckle */\r\n INDEX_FINGER_PHALANX_PROXIMAL = \"index-finger-phalanx-proximal\",\r\n /** Index finger second knuckle */\r\n INDEX_FINGER_PHALANX_INTERMEDIATE = \"index-finger-phalanx-intermediate\",\r\n /** Index finger third knuckle */\r\n INDEX_FINGER_PHALANX_DISTAL = \"index-finger-phalanx-distal\",\r\n /** Index finger tip */\r\n INDEX_FINGER_TIP = \"index-finger-tip\",\r\n\r\n /** Middle finger near wrist */\r\n MIDDLE_FINGER_METACARPAL = \"middle-finger-metacarpal\",\r\n /** Middle finger first knuckle */\r\n MIDDLE_FINGER_PHALANX_PROXIMAL = \"middle-finger-phalanx-proximal\",\r\n /** Middle finger second knuckle */\r\n MIDDLE_FINGER_PHALANX_INTERMEDIATE = \"middle-finger-phalanx-intermediate\",\r\n /** Middle finger third knuckle */\r\n MIDDLE_FINGER_PHALANX_DISTAL = \"middle-finger-phalanx-distal\",\r\n /** Middle finger tip */\r\n MIDDLE_FINGER_TIP = \"middle-finger-tip\",\r\n\r\n /** Ring finger near wrist */\r\n RING_FINGER_METACARPAL = \"ring-finger-metacarpal\",\r\n /** Ring finger first knuckle */\r\n RING_FINGER_PHALANX_PROXIMAL = \"ring-finger-phalanx-proximal\",\r\n /** Ring finger second knuckle */\r\n RING_FINGER_PHALANX_INTERMEDIATE = \"ring-finger-phalanx-intermediate\",\r\n /** Ring finger third knuckle */\r\n RING_FINGER_PHALANX_DISTAL = \"ring-finger-phalanx-distal\",\r\n /** Ring finger tip */\r\n RING_FINGER_TIP = \"ring-finger-tip\",\r\n\r\n /** Pinky finger near wrist */\r\n PINKY_FINGER_METACARPAL = \"pinky-finger-metacarpal\",\r\n /** Pinky finger first knuckle */\r\n PINKY_FINGER_PHALANX_PROXIMAL = \"pinky-finger-phalanx-proximal\",\r\n /** Pinky finger second knuckle */\r\n PINKY_FINGER_PHALANX_INTERMEDIATE = \"pinky-finger-phalanx-intermediate\",\r\n /** Pinky finger third knuckle */\r\n PINKY_FINGER_PHALANX_DISTAL = \"pinky-finger-phalanx-distal\",\r\n /** Pinky finger tip */\r\n PINKY_FINGER_TIP = \"pinky-finger-tip\",\r\n}\r\n\r\n/** A type encapsulating a dictionary mapping WebXR joints to bone names in a rigged hand mesh. */\r\nexport type XRHandMeshRigMapping = { [webXRJointName in XRHandJoint]: string };\r\n\r\nconst handJointReferenceArray: XRHandJoint[] = [\r\n XRHandJoint.WRIST,\r\n XRHandJoint.THUMB_METACARPAL,\r\n XRHandJoint.THUMB_PHALANX_PROXIMAL,\r\n XRHandJoint.THUMB_PHALANX_DISTAL,\r\n XRHandJoint.THUMB_TIP,\r\n XRHandJoint.INDEX_FINGER_METACARPAL,\r\n XRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL,\r\n XRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE,\r\n XRHandJoint.INDEX_FINGER_PHALANX_DISTAL,\r\n XRHandJoint.INDEX_FINGER_TIP,\r\n XRHandJoint.MIDDLE_FINGER_METACARPAL,\r\n XRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL,\r\n XRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE,\r\n XRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL,\r\n XRHandJoint.MIDDLE_FINGER_TIP,\r\n XRHandJoint.RING_FINGER_METACARPAL,\r\n XRHandJoint.RING_FINGER_PHALANX_PROXIMAL,\r\n XRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE,\r\n XRHandJoint.RING_FINGER_PHALANX_DISTAL,\r\n XRHandJoint.RING_FINGER_TIP,\r\n XRHandJoint.PINKY_FINGER_METACARPAL,\r\n XRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL,\r\n XRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE,\r\n XRHandJoint.PINKY_FINGER_PHALANX_DISTAL,\r\n XRHandJoint.PINKY_FINGER_TIP,\r\n];\r\n\r\nconst handPartsDefinition: { [key in HandPart]: XRHandJoint[] } = {\r\n [HandPart.WRIST]: [XRHandJoint.WRIST],\r\n [HandPart.THUMB]: [XRHandJoint.THUMB_METACARPAL, XRHandJoint.THUMB_PHALANX_PROXIMAL, XRHandJoint.THUMB_PHALANX_DISTAL, XRHandJoint.THUMB_TIP],\r\n [HandPart.INDEX]: [\r\n XRHandJoint.INDEX_FINGER_METACARPAL,\r\n XRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL,\r\n XRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE,\r\n XRHandJoint.INDEX_FINGER_PHALANX_DISTAL,\r\n XRHandJoint.INDEX_FINGER_TIP,\r\n ],\r\n [HandPart.MIDDLE]: [\r\n XRHandJoint.MIDDLE_FINGER_METACARPAL,\r\n XRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL,\r\n XRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE,\r\n XRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL,\r\n XRHandJoint.MIDDLE_FINGER_TIP,\r\n ],\r\n [HandPart.RING]: [\r\n XRHandJoint.RING_FINGER_METACARPAL,\r\n XRHandJoint.RING_FINGER_PHALANX_PROXIMAL,\r\n XRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE,\r\n XRHandJoint.RING_FINGER_PHALANX_DISTAL,\r\n XRHandJoint.RING_FINGER_TIP,\r\n ],\r\n [HandPart.LITTLE]: [\r\n XRHandJoint.PINKY_FINGER_METACARPAL,\r\n XRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL,\r\n XRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE,\r\n XRHandJoint.PINKY_FINGER_PHALANX_DISTAL,\r\n XRHandJoint.PINKY_FINGER_TIP,\r\n ],\r\n};\r\n\r\n/**\r\n * Representing a single hand (with its corresponding native XRHand object)\r\n */\r\nexport class WebXRHand implements IDisposable {\r\n private _scene: Scene;\r\n\r\n /**\r\n * Transform nodes that will directly receive the transforms from the WebXR matrix data.\r\n */\r\n private _jointTransforms = new Array<TransformNode>(handJointReferenceArray.length);\r\n\r\n /**\r\n * The float array that will directly receive the transform matrix data from WebXR.\r\n */\r\n private _jointTransformMatrices = new Float32Array(handJointReferenceArray.length * 16);\r\n\r\n private _tempJointMatrix = new Matrix();\r\n\r\n /**\r\n * The float array that will directly receive the joint radii from WebXR.\r\n */\r\n private _jointRadii = new Float32Array(handJointReferenceArray.length);\r\n\r\n /**\r\n * Get the hand mesh.\r\n */\r\n public get handMesh(): Nullable<AbstractMesh> {\r\n return this._handMesh;\r\n }\r\n\r\n /**\r\n * Get meshes of part of the hand.\r\n * @param part The part of hand to get.\r\n * @returns An array of meshes that correlate to the hand part requested.\r\n */\r\n public getHandPartMeshes(part: HandPart): AbstractMesh[] {\r\n return handPartsDefinition[part].map((name) => this._jointMeshes[handJointReferenceArray.indexOf(name)]!);\r\n }\r\n\r\n /**\r\n * Retrieves a mesh linked to a named joint in the hand.\r\n * @param jointName The name of the joint.\r\n * @returns An AbstractMesh whose position corresponds with the joint position.\r\n */\r\n public getJointMesh(jointName: XRHandJoint): AbstractMesh {\r\n return this._jointMeshes[handJointReferenceArray.indexOf(jointName)!];\r\n }\r\n\r\n /**\r\n * Construct a new hand object\r\n * @param xrController The controller to which the hand correlates.\r\n * @param _jointMeshes The meshes to be used to track the hand joints.\r\n * @param _handMesh An optional hand mesh.\r\n * @param rigMapping An optional rig mapping for the hand mesh.\r\n * If not provided (but a hand mesh is provided),\r\n * it will be assumed that the hand mesh's bones are named\r\n * directly after the WebXR bone names.\r\n * @param _leftHandedMeshes Are the hand meshes left-handed-system meshes\r\n * @param _jointsInvisible Are the tracked joint meshes visible\r\n * @param _jointScaleFactor Scale factor for all joint meshes\r\n */\r\n constructor(\r\n /** The controller to which the hand correlates. */\r\n public readonly xrController: WebXRInputSource,\r\n private readonly _jointMeshes: AbstractMesh[],\r\n private _handMesh: Nullable<AbstractMesh>,\r\n /** An optional rig mapping for the hand mesh. If not provided (but a hand mesh is provided),\r\n * it will be assumed that the hand mesh's bones are named directly after the WebXR bone names. */\r\n readonly rigMapping: Nullable<XRHandMeshRigMapping>,\r\n private readonly _leftHandedMeshes: boolean = false,\r\n private readonly _jointsInvisible: boolean = false,\r\n private readonly _jointScaleFactor: number = 1\r\n ) {\r\n this._scene = _jointMeshes[0].getScene();\r\n\r\n // Initialize the joint transform quaternions and link the transforms to the bones.\r\n for (let jointIdx = 0; jointIdx < this._jointTransforms.length; jointIdx++) {\r\n const jointTransform = (this._jointTransforms[jointIdx] = new TransformNode(handJointReferenceArray[jointIdx], this._scene));\r\n jointTransform.rotationQuaternion = new Quaternion();\r\n\r\n // Set the rotation quaternion so we can use it later for tracking.\r\n _jointMeshes[jointIdx].rotationQuaternion = new Quaternion();\r\n }\r\n\r\n if (_handMesh) {\r\n // Note that this logic needs to happen after we initialize the joint tracking transform nodes.\r\n this.setHandMesh(_handMesh, rigMapping);\r\n }\r\n\r\n // hide the motion controller, if available/loaded\r\n if (this.xrController.motionController) {\r\n if (this.xrController.motionController.rootMesh) {\r\n this.xrController.motionController.rootMesh.setEnabled(false);\r\n } else {\r\n this.xrController.motionController.onModelLoadedObservable.add((controller) => {\r\n if (controller.rootMesh) {\r\n controller.rootMesh.setEnabled(false);\r\n }\r\n });\r\n }\r\n }\r\n\r\n this.xrController.onMotionControllerInitObservable.add((motionController) => {\r\n motionController.onModelLoadedObservable.add((controller) => {\r\n if (controller.rootMesh) {\r\n controller.rootMesh.setEnabled(false);\r\n }\r\n });\r\n if (motionController.rootMesh) {\r\n motionController.rootMesh.setEnabled(false);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Sets the current hand mesh to render for the WebXRHand.\r\n * @param handMesh The rigged hand mesh that will be tracked to the user's hand.\r\n * @param rigMapping The mapping from XRHandJoint to bone names to use with the mesh.\r\n */\r\n public setHandMesh(handMesh: AbstractMesh, rigMapping: Nullable<XRHandMeshRigMapping>) {\r\n this._handMesh = handMesh;\r\n\r\n // Avoid any strange frustum culling. We will manually control visibility via attach and detach.\r\n handMesh.alwaysSelectAsActiveMesh = true;\r\n handMesh.getChildMeshes().forEach((mesh) => (mesh.alwaysSelectAsActiveMesh = true));\r\n\r\n // Link the bones in the hand mesh to the transform nodes that will be bound to the WebXR tracked joints.\r\n if (this._handMesh.skeleton) {\r\n const handMeshSkeleton = this._handMesh.skeleton;\r\n handJointReferenceArray.forEach((jointName, jointIdx) => {\r\n const jointBoneIdx = handMeshSkeleton.getBoneIndexByName(rigMapping ? rigMapping[jointName] : jointName);\r\n if (jointBoneIdx !== -1) {\r\n handMeshSkeleton.bones[jointBoneIdx].linkTransformNode(this._jointTransforms[jointIdx]);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Update this hand from the latest xr frame.\r\n * @param xrFrame The latest frame received from WebXR.\r\n * @param referenceSpace The current viewer reference space.\r\n */\r\n public updateFromXRFrame(xrFrame: XRFrame, referenceSpace: XRReferenceSpace) {\r\n const hand = this.xrController.inputSource.hand;\r\n if (!hand) {\r\n return;\r\n }\r\n\r\n // TODO: Modify webxr.d.ts to better match WebXR IDL so we don't need this any cast.\r\n const anyHand: any = hand;\r\n const jointSpaces: XRJointSpace[] = handJointReferenceArray.map((jointName) => anyHand[jointName] || hand.get(jointName));\r\n let trackingSuccessful = false;\r\n\r\n if (xrFrame.fillPoses && xrFrame.fillJointRadii) {\r\n trackingSuccessful = xrFrame.fillPoses(jointSpaces, referenceSpace, this._jointTransformMatrices) && xrFrame.fillJointRadii(jointSpaces, this._jointRadii);\r\n } else if (xrFrame.getJointPose) {\r\n trackingSuccessful = true;\r\n // Warning: This codepath is slow by comparison, only here for compat.\r\n for (let jointIdx = 0; jointIdx < jointSpaces.length; jointIdx++) {\r\n const jointPose = xrFrame.getJointPose(jointSpaces[jointIdx], referenceSpace);\r\n if (jointPose) {\r\n this._jointTransformMatrices.set(jointPose.transform.matrix, jointIdx * 16);\r\n this._jointRadii[jointIdx] = jointPose.radius || 0.008;\r\n } else {\r\n trackingSuccessful = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!trackingSuccessful) {\r\n return;\r\n }\r\n\r\n handJointReferenceArray.forEach((_jointName, jointIdx) => {\r\n const jointTransform = this._jointTransforms[jointIdx];\r\n Matrix.FromArrayToRef(this._jointTransformMatrices, jointIdx * 16, this._tempJointMatrix);\r\n this._tempJointMatrix.decompose(undefined, jointTransform.rotationQuaternion!, jointTransform.position);\r\n\r\n // The radius we need to make the joint in order for it to roughly cover the joints of the user's real hand.\r\n const scaledJointRadius = this._jointRadii[jointIdx] * this._jointScaleFactor;\r\n\r\n const jointMesh = this._jointMeshes[jointIdx];\r\n jointMesh.isVisible = !this._handMesh && !this._jointsInvisible;\r\n jointMesh.position.copyFrom(jointTransform.position);\r\n jointMesh.rotationQuaternion!.copyFrom(jointTransform.rotationQuaternion!);\r\n jointMesh.scaling.setAll(scaledJointRadius);\r\n\r\n // The WebXR data comes as right-handed, so we might need to do some conversions.\r\n if (!this._scene.useRightHandedSystem) {\r\n jointMesh.position.z *= -1;\r\n jointMesh.rotationQuaternion!.z *= -1;\r\n jointMesh.rotationQuaternion!.w *= -1;\r\n\r\n if (this._leftHandedMeshes && this._handMesh) {\r\n jointTransform.position.z *= -1;\r\n jointTransform.rotationQuaternion!.z *= -1;\r\n jointTransform.rotationQuaternion!.w *= -1;\r\n }\r\n }\r\n });\r\n\r\n if (this._handMesh) {\r\n this._handMesh.isVisible = true;\r\n }\r\n }\r\n\r\n /**\r\n * Dispose this Hand object\r\n */\r\n public dispose() {\r\n if (this._handMesh) {\r\n this._handMesh.isVisible = false;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * WebXR Hand Joint tracking feature, available for selected browsers and devices\r\n */\r\nexport class WebXRHandTracking extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.HAND_TRACKING;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /** The base URL for the default hand model. */\r\n public static DEFAULT_HAND_MODEL_BASE_URL = \"https://assets.babylonjs.com/meshes/HandMeshes/\";\r\n /** The filename to use for the default right hand model. */\r\n public static DEFAULT_HAND_MODEL_RIGHT_FILENAME = \"r_hand_rhs.glb\";\r\n /** The filename to use for the default left hand model. */\r\n public static DEFAULT_HAND_MODEL_LEFT_FILENAME = \"l_hand_rhs.glb\";\r\n /** The URL pointing to the default hand model NodeMaterial shader. */\r\n public static DEFAULT_HAND_MODEL_SHADER_URL = \"https://assets.babylonjs.com/meshes/HandMeshes/handsShader.json\";\r\n\r\n // We want to use lightweight models, diameter will initially be 1 but scaled to the values returned from WebXR.\r\n private static readonly _ICOSPHERE_PARAMS = { radius: 0.5, flat: false, subdivisions: 2 };\r\n\r\n private static _RightHandGLB: Nullable<ISceneLoaderAsyncResult> = null;\r\n private static _LeftHandGLB: Nullable<ISceneLoaderAsyncResult> = null;\r\n\r\n private static _GenerateTrackedJointMeshes(featureOptions: IWebXRHandTrackingOptions): { left: AbstractMesh[]; right: AbstractMesh[] } {\r\n const meshes: { [handedness: string]: AbstractMesh[] } = {};\r\n [\"left\" as XRHandedness, \"right\" as XRHandedness].map((handedness) => {\r\n const trackedMeshes = [];\r\n const originalMesh = featureOptions.jointMeshes?.sourceMesh || CreateIcoSphere(\"jointParent\", WebXRHandTracking._ICOSPHERE_PARAMS);\r\n originalMesh.isVisible = !!featureOptions.jointMeshes?.keepOriginalVisible;\r\n for (let i = 0; i < handJointReferenceArray.length; ++i) {\r\n let newInstance: AbstractMesh = originalMesh.createInstance(`${handedness}-handJoint-${i}`);\r\n if (featureOptions.jointMeshes?.onHandJointMeshGenerated) {\r\n const returnedMesh = featureOptions.jointMeshes.onHandJointMeshGenerated(newInstance as InstancedMesh, i, handedness);\r\n if (returnedMesh) {\r\n if (returnedMesh !== newInstance) {\r\n newInstance.dispose();\r\n newInstance = returnedMesh;\r\n }\r\n }\r\n }\r\n newInstance.isPickable = false;\r\n if (featureOptions.jointMeshes?.enablePhysics) {\r\n const props = featureOptions.jointMeshes?.physicsProps || {};\r\n // downscale the instances so that physics will be initialized correctly\r\n newInstance.scaling.setAll(0.02);\r\n const type = props.impostorType !== undefined ? props.impostorType : PhysicsImpostor.SphereImpostor;\r\n newInstance.physicsImpostor = new PhysicsImpostor(newInstance, type, { mass: 0, ...props });\r\n }\r\n newInstance.rotationQuaternion = new Quaternion();\r\n newInstance.isVisible = false;\r\n trackedMeshes.push(newInstance);\r\n }\r\n\r\n meshes[handedness] = trackedMeshes;\r\n });\r\n return { left: meshes.left, right: meshes.right };\r\n }\r\n\r\n private static _GenerateDefaultHandMeshesAsync(scene: Scene, options?: IWebXRHandTrackingOptions): Promise<{ left: AbstractMesh; right: AbstractMesh }> {\r\n // eslint-disable-next-line no-async-promise-executor\r\n return new Promise(async (resolve) => {\r\n const riggedMeshes: { [handedness: string]: AbstractMesh } = {};\r\n // check the cache, defensive\r\n if (WebXRHandTracking._RightHandGLB?.meshes[1]?.isDisposed()) {\r\n WebXRHandTracking._RightHandGLB = null;\r\n }\r\n if (WebXRHandTracking._LeftHandGLB?.meshes[1]?.isDisposed()) {\r\n WebXRHandTracking._LeftHandGLB = null;\r\n }\r\n\r\n const handsDefined = !!(WebXRHandTracking._RightHandGLB && WebXRHandTracking._LeftHandGLB);\r\n // load them in parallel\r\n const handGLBs = await Promise.all([\r\n WebXRHandTracking._RightHandGLB ||\r\n SceneLoader.ImportMeshAsync(\"\", WebXRHandTracking.DEFAULT_HAND_MODEL_BASE_URL, WebXRHandTracking.DEFAULT_HAND_MODEL_RIGHT_FILENAME, scene),\r\n WebXRHandTracking._LeftHandGLB ||\r\n SceneLoader.ImportMeshAsync(\"\", WebXRHandTracking.DEFAULT_HAND_MODEL_BASE_URL, WebXRHandTracking.DEFAULT_HAND_MODEL_LEFT_FILENAME, scene),\r\n ]);\r\n WebXRHandTracking._RightHandGLB = handGLBs[0];\r\n WebXRHandTracking._LeftHandGLB = handGLBs[1];\r\n\r\n const handShader = new NodeMaterial(\"handShader\", scene, { emitComments: false });\r\n await handShader.loadAsync(WebXRHandTracking.DEFAULT_HAND_MODEL_SHADER_URL);\r\n\r\n // depth prepass and alpha mode\r\n handShader.needDepthPrePass = true;\r\n handShader.transparencyMode = Material.MATERIAL_ALPHABLEND;\r\n handShader.alphaMode = Constants.ALPHA_COMBINE;\r\n\r\n // build node materials\r\n handShader.build(false);\r\n\r\n // shader\r\n const handColors = {\r\n base: Color3.FromInts(116, 63, 203),\r\n fresnel: Color3.FromInts(149, 102, 229),\r\n fingerColor: Color3.FromInts(177, 130, 255),\r\n tipFresnel: Color3.FromInts(220, 200, 255),\r\n ...options?.handMeshes?.customColors,\r\n };\r\n\r\n const handNodes = {\r\n base: handShader.getBlockByName(\"baseColor\") as InputBlock,\r\n fresnel: handShader.getBlockByName(\"fresnelColor\") as InputBlock,\r\n fingerColor: handShader.getBlockByName(\"fingerColor\") as InputBlock,\r\n tipFresnel: handShader.getBlockByName(\"tipFresnelColor\") as InputBlock,\r\n };\r\n\r\n handNodes.base.value = handColors.base;\r\n handNodes.fresnel.value = handColors.fresnel;\r\n handNodes.fingerColor.value = handColors.fingerColor;\r\n handNodes.tipFresnel.value = handColors.tipFresnel;\r\n\r\n [\"left\", \"right\"].forEach((handedness) => {\r\n const handGLB = handedness == \"left\" ? WebXRHandTracking._LeftHandGLB : WebXRHandTracking._RightHandGLB;\r\n if (!handGLB) {\r\n // this should never happen!\r\n throw new Error(\"Could not load hand model\");\r\n }\r\n const handMesh = handGLB.meshes[1];\r\n handMesh._internalAbstractMeshDataInfo._computeBonesUsingShaders = true;\r\n handMesh.material = handShader.clone(`${handedness}HandShaderClone`, true);\r\n handMesh.isVisible = false;\r\n\r\n riggedMeshes[handedness] = handMesh;\r\n\r\n // single change for left handed systems\r\n if (!handsDefined && !scene.useRightHandedSystem) {\r\n handGLB.transformNodes[0].rotate(Axis.Y, Math.PI);\r\n }\r\n });\r\n\r\n handShader.dispose();\r\n resolve({ left: riggedMeshes.left, right: riggedMeshes.right });\r\n });\r\n }\r\n\r\n /**\r\n * Generates a mapping from XRHandJoint to bone name for the default hand mesh.\r\n * @param handedness The handedness being mapped for.\r\n */\r\n private static _GenerateDefaultHandMeshRigMapping(handedness: XRHandedness): XRHandMeshRigMapping {\r\n const H = handedness == \"right\" ? \"R\" : \"L\";\r\n return {\r\n [XRHandJoint.WRIST]: `wrist_${H}`,\r\n [XRHandJoint.THUMB_METACARPAL]: `thumb_metacarpal_${H}`,\r\n [XRHandJoint.THUMB_PHALANX_PROXIMAL]: `thumb_proxPhalanx_${H}`,\r\n [XRHandJoint.THUMB_PHALANX_DISTAL]: `thumb_distPhalanx_${H}`,\r\n [XRHandJoint.THUMB_TIP]: `thumb_tip_${H}`,\r\n [XRHandJoint.INDEX_FINGER_METACARPAL]: `index_metacarpal_${H}`,\r\n [XRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL]: `index_proxPhalanx_${H}`,\r\n [XRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE]: `index_intPhalanx_${H}`,\r\n [XRHandJoint.INDEX_FINGER_PHALANX_DISTAL]: `index_distPhalanx_${H}`,\r\n [XRHandJoint.INDEX_FINGER_TIP]: `index_tip_${H}`,\r\n [XRHandJoint.MIDDLE_FINGER_METACARPAL]: `middle_metacarpal_${H}`,\r\n [XRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL]: `middle_proxPhalanx_${H}`,\r\n [XRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE]: `middle_intPhalanx_${H}`,\r\n [XRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL]: `middle_distPhalanx_${H}`,\r\n [XRHandJoint.MIDDLE_FINGER_TIP]: `middle_tip_${H}`,\r\n [XRHandJoint.RING_FINGER_METACARPAL]: `ring_metacarpal_${H}`,\r\n [XRHandJoint.RING_FINGER_PHALANX_PROXIMAL]: `ring_proxPhalanx_${H}`,\r\n [XRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE]: `ring_intPhalanx_${H}`,\r\n [XRHandJoint.RING_FINGER_PHALANX_DISTAL]: `ring_distPhalanx_${H}`,\r\n [XRHandJoint.RING_FINGER_TIP]: `ring_tip_${H}`,\r\n [XRHandJoint.PINKY_FINGER_METACARPAL]: `little_metacarpal_${H}`,\r\n [XRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL]: `little_proxPhalanx_${H}`,\r\n [XRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE]: `little_intPhalanx_${H}`,\r\n [XRHandJoint.PINKY_FINGER_PHALANX_DISTAL]: `little_distPhalanx_${H}`,\r\n [XRHandJoint.PINKY_FINGER_TIP]: `little_tip_${H}`,\r\n };\r\n }\r\n\r\n private _attachedHands: {\r\n [uniqueId: string]: WebXRHand;\r\n } = {};\r\n\r\n private _trackingHands: {\r\n left: Nullable<WebXRHand>;\r\n right: Nullable<WebXRHand>;\r\n } = { left: null, right: null };\r\n\r\n private _handResources: {\r\n jointMeshes: Nullable<{ left: AbstractMesh[]; right: AbstractMesh[] }>;\r\n handMeshes: Nullable<{ left: AbstractMesh; right: AbstractMesh }>;\r\n rigMappings: Nullable<{ left: XRHandMeshRigMapping; right: XRHandMeshRigMapping }>;\r\n } = { jointMeshes: null, handMeshes: null, rigMappings: null };\r\n\r\n /**\r\n * This observable will notify registered observers when a new hand object was added and initialized\r\n */\r\n public onHandAddedObservable: Observable<WebXRHand> = new Observable();\r\n /**\r\n * This observable will notify its observers right before the hand object is disposed\r\n */\r\n public onHandRemovedObservable: Observable<WebXRHand> = new Observable();\r\n\r\n /**\r\n * Check if the needed objects are defined.\r\n * This does not mean that the feature is enabled, but that the objects needed are well defined.\r\n */\r\n public isCompatible(): boolean {\r\n return typeof XRHand !== \"undefined\";\r\n }\r\n\r\n /**\r\n * Get the hand object according to the controller id\r\n * @param controllerId the controller id to which we want to get the hand\r\n * @returns null if not found or the WebXRHand object if found\r\n */\r\n public getHandByControllerId(controllerId: string): Nullable<WebXRHand> {\r\n return this._attachedHands[controllerId];\r\n }\r\n\r\n /**\r\n * Get a hand object according to the requested handedness\r\n * @param handedness the handedness to request\r\n * @returns null if not found or the WebXRHand object if found\r\n */\r\n public getHandByHandedness(handedness: XRHandedness): Nullable<WebXRHand> {\r\n if (handedness == \"none\") {\r\n return null;\r\n }\r\n return this._trackingHands[handedness];\r\n }\r\n\r\n /**\r\n * Creates a new instance of the XR hand tracking feature.\r\n * @param _xrSessionManager An instance of WebXRSessionManager.\r\n * @param options Options to use when constructing this feature.\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /** Options to use when constructing this feature. */\r\n public readonly options: IWebXRHandTrackingOptions\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"hand-tracking\";\r\n\r\n // Support legacy versions of the options object by copying over joint mesh properties\r\n const anyOptions = options as any;\r\n const anyJointMeshOptions = anyOptions.jointMeshes;\r\n if (anyJointMeshOptions) {\r\n if (typeof anyJointMeshOptions.disableDefaultHandMesh !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n options.handMeshes.disableDefaultMeshes = anyJointMeshOptions.disableDefaultHandMesh;\r\n }\r\n if (typeof anyJointMeshOptions.handMeshes !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n options.handMeshes.customMeshes = anyJointMeshOptions.handMeshes;\r\n }\r\n if (typeof anyJointMeshOptions.leftHandedSystemMeshes !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n options.handMeshes.meshesUseLeftHandedCoordinates = anyJointMeshOptions.leftHandedSystemMeshes;\r\n }\r\n if (typeof anyJointMeshOptions.rigMapping !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n const leftRigMapping = {};\r\n const rightRigMapping = {};\r\n [\r\n [anyJointMeshOptions.rigMapping.left, leftRigMapping],\r\n [anyJointMeshOptions.rigMapping.right, rightRigMapping],\r\n ].forEach((rigMappingTuple) => {\r\n const legacyRigMapping = rigMappingTuple[0] as string[];\r\n const rigMapping = rigMappingTuple[1] as XRHandMeshRigMapping;\r\n legacyRigMapping.forEach((modelJointName, index) => {\r\n rigMapping[handJointReferenceArray[index]] = modelJointName;\r\n });\r\n });\r\n options.handMeshes.customRigMappings = {\r\n left: leftRigMapping as XRHandMeshRigMapping,\r\n right: rightRigMapping as XRHandMeshRigMapping,\r\n };\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Attach this feature.\r\n * Will usually be called by the features manager.\r\n *\r\n * @returns true if successful.\r\n */\r\n public attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n this._handResources = {\r\n jointMeshes: WebXRHandTracking._GenerateTrackedJointMeshes(this.options),\r\n handMeshes: this.options.handMeshes?.customMeshes || null,\r\n rigMappings: this.options.handMeshes?.customRigMappings || null,\r\n };\r\n\r\n // If they didn't supply custom meshes and are not disabling the default meshes...\r\n if (!this.options.handMeshes?.customMeshes && !this.options.handMeshes?.disableDefaultMeshes) {\r\n WebXRHandTracking._GenerateDefaultHandMeshesAsync(EngineStore.LastCreatedScene!, this.options).then((defaultHandMeshes) => {\r\n this._handResources.handMeshes = defaultHandMeshes;\r\n this._handResources.rigMappings = {\r\n left: WebXRHandTracking._GenerateDefaultHandMeshRigMapping(\"left\"),\r\n right: WebXRHandTracking._GenerateDefaultHandMeshRigMapping(\"right\"),\r\n };\r\n\r\n // Apply meshes to existing hands if already tracking.\r\n this._trackingHands.left?.setHandMesh(this._handResources.handMeshes.left, this._handResources.rigMappings.left);\r\n this._trackingHands.right?.setHandMesh(this._handResources.handMeshes.right, this._handResources.rigMappings.right);\r\n });\r\n }\r\n\r\n this.options.xrInput.controllers.forEach(this._attachHand);\r\n this._addNewAttachObserver(this.options.xrInput.onControllerAddedObservable, this._attachHand);\r\n this._addNewAttachObserver(this.options.xrInput.onControllerRemovedObservable, this._detachHand);\r\n\r\n return true;\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n this._trackingHands.left?.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace);\r\n this._trackingHands.right?.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace);\r\n }\r\n\r\n private _attachHand = (xrController: WebXRInputSource) => {\r\n if (!xrController.inputSource.hand || xrController.inputSource.handedness == \"none\" || !this._handResources.jointMeshes) {\r\n return;\r\n }\r\n\r\n const handedness = xrController.inputSource.handedness;\r\n const webxrHand = new WebXRHand(\r\n xrController,\r\n this._handResources.jointMeshes[handedness],\r\n this._handResources.handMeshes && this._handResources.handMeshes[handedness],\r\n this._handResources.rigMappings && this._handResources.rigMappings[handedness],\r\n this.options.handMeshes?.meshesUseLeftHandedCoordinates,\r\n this.options.jointMeshes?.invisible,\r\n this.options.jointMeshes?.scaleFactor\r\n );\r\n\r\n this._attachedHands[xrController.uniqueId] = webxrHand;\r\n this._trackingHands[handedness] = webxrHand;\r\n\r\n this.onHandAddedObservable.notifyObservers(webxrHand);\r\n };\r\n\r\n private _detachHandById(controllerId: string) {\r\n const hand = this.getHandByControllerId(controllerId);\r\n if (hand) {\r\n const handedness = hand.xrController.inputSource.handedness == \"left\" ? \"left\" : \"right\";\r\n if (this._trackingHands[handedness]?.xrController.uniqueId === controllerId) {\r\n this._trackingHands[handedness] = null;\r\n }\r\n this.onHandRemovedObservable.notifyObservers(hand);\r\n hand.dispose();\r\n delete this._attachedHands[controllerId];\r\n }\r\n }\r\n\r\n private _detachHand = (xrController: WebXRInputSource) => {\r\n this._detachHandById(xrController.uniqueId);\r\n };\r\n\r\n /**\r\n * Detach this feature.\r\n * Will usually be called by the features manager.\r\n *\r\n * @returns true if successful.\r\n */\r\n public detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n Object.keys(this._attachedHands).forEach((uniqueId) => this._detachHandById(uniqueId));\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached.\r\n */\r\n public dispose(): void {\r\n super.dispose();\r\n this.onHandAddedObservable.clear();\r\n this.onHandRemovedObservable.clear();\r\n\r\n if (this._handResources.handMeshes && !this.options.handMeshes?.customMeshes) {\r\n // this will dispose the cached meshes\r\n this._handResources.handMeshes.left.dispose();\r\n this._handResources.handMeshes.right.dispose();\r\n // remove the cached meshes\r\n WebXRHandTracking._RightHandGLB = null;\r\n WebXRHandTracking._LeftHandGLB = null;\r\n }\r\n\r\n if (this._handResources.jointMeshes) {\r\n this._handResources.jointMeshes.left.forEach((trackedMesh) => trackedMesh.dispose());\r\n this._handResources.jointMeshes.right.forEach((trackedMesh) => trackedMesh.dispose());\r\n }\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRHandTracking.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRHandTracking(xrSessionManager, options);\r\n },\r\n WebXRHandTracking.Version,\r\n false\r\n);\r\n"]}
1
+ {"version":3,"file":"WebXRHandTracking.js","sourceRoot":"","sources":["../../../../../../lts/core/generated/XR/features/WebXRHandTracking.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { WebXRInput } from \"../webXRInput\";\r\nimport type { WebXRInputSource } from \"../webXRInputSource\";\r\nimport { Matrix, Quaternion } from \"../../Maths/math.vector\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { PhysicsImpostor } from \"../../Physics/physicsImpostor\";\r\n\r\nimport type { IDisposable, Scene } from \"../../scene\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { InstancedMesh } from \"../../Meshes/instancedMesh\";\r\nimport type { ISceneLoaderAsyncResult } from \"../../Loading/sceneLoader\";\r\nimport { SceneLoader } from \"../../Loading/sceneLoader\";\r\nimport { Color3 } from \"../../Maths/math.color\";\r\nimport { NodeMaterial } from \"../../Materials/Node/nodeMaterial\";\r\nimport type { InputBlock } from \"../../Materials/Node/Blocks/Input/inputBlock\";\r\nimport { Material } from \"../../Materials/material\";\r\nimport { CreateIcoSphere } from \"../../Meshes/Builders/icoSphereBuilder\";\r\nimport { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Axis } from \"../../Maths/math.axis\";\r\nimport { EngineStore } from \"../../Engines/engineStore\";\r\nimport { Constants } from \"../../Engines/constants\";\r\n\r\ndeclare const XRHand: XRHand;\r\n\r\n/**\r\n * Configuration interface for the hand tracking feature\r\n */\r\nexport interface IWebXRHandTrackingOptions {\r\n /**\r\n * The xrInput that will be used as source for new hands\r\n */\r\n xrInput: WebXRInput;\r\n\r\n /**\r\n * Configuration object for the joint meshes.\r\n */\r\n jointMeshes?: {\r\n /**\r\n * Should the meshes created be invisible (defaults to false).\r\n */\r\n invisible?: boolean;\r\n /**\r\n * A source mesh to be used to create instances. Defaults to an icosphere with two subdivisions and smooth lighting.\r\n * This mesh will be the source for all other (25) meshes.\r\n * It should have the general size of a single unit, as the instances will be scaled according to the provided radius.\r\n */\r\n sourceMesh?: Mesh;\r\n /**\r\n * This function will be called after a mesh was created for a specific joint.\r\n * Using this function you can either manipulate the instance or return a new mesh.\r\n * When returning a new mesh the instance created before will be disposed.\r\n * @param meshInstance An instance of the original joint mesh being used for the joint.\r\n * @param jointId The joint's index, see https://immersive-web.github.io/webxr-hand-input/#skeleton-joints-section for more info.\r\n * @param hand Which hand (\"left\", \"right\") the joint will be on.\r\n */\r\n onHandJointMeshGenerated?: (meshInstance: InstancedMesh, jointId: number, hand: XRHandedness) => AbstractMesh | undefined;\r\n /**\r\n * Should the source mesh stay visible (defaults to false).\r\n */\r\n keepOriginalVisible?: boolean;\r\n /**\r\n * Should each instance have its own physics impostor\r\n */\r\n enablePhysics?: boolean;\r\n /**\r\n * If enabled, override default physics properties\r\n */\r\n physicsProps?: { friction?: number; restitution?: number; impostorType?: number };\r\n /**\r\n * Scale factor for all joint meshes (defaults to 1)\r\n */\r\n scaleFactor?: number;\r\n };\r\n\r\n /**\r\n * Configuration object for the hand meshes.\r\n */\r\n handMeshes?: {\r\n /**\r\n * Should the default hand mesh be disabled. In this case, the spheres will be visible (unless set invisible).\r\n */\r\n disableDefaultMeshes?: boolean;\r\n /**\r\n * Rigged hand meshes that will be tracked to the user's hands. This will override the default hand mesh.\r\n */\r\n customMeshes?: {\r\n right: AbstractMesh;\r\n left: AbstractMesh;\r\n };\r\n /**\r\n * Are the meshes prepared for a left-handed system. Default hand meshes are right-handed.\r\n */\r\n meshesUseLeftHandedCoordinates?: boolean;\r\n /**\r\n * If a hand mesh was provided, this array will define what axis will update which node. This will override the default hand mesh\r\n */\r\n customRigMappings?: {\r\n right: XRHandMeshRigMapping;\r\n left: XRHandMeshRigMapping;\r\n };\r\n\r\n /**\r\n * Override the colors of the hand meshes.\r\n */\r\n customColors?: {\r\n base?: Color3;\r\n fresnel?: Color3;\r\n fingerColor?: Color3;\r\n tipFresnel?: Color3;\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Parts of the hands divided to writs and finger names\r\n */\r\nexport const enum HandPart {\r\n /**\r\n * HandPart - Wrist\r\n */\r\n WRIST = \"wrist\",\r\n /**\r\n * HandPart - The thumb\r\n */\r\n THUMB = \"thumb\",\r\n /**\r\n * HandPart - Index finger\r\n */\r\n INDEX = \"index\",\r\n /**\r\n * HandPart - Middle finger\r\n */\r\n MIDDLE = \"middle\",\r\n /**\r\n * HandPart - Ring finger\r\n */\r\n RING = \"ring\",\r\n /**\r\n * HandPart - Little finger\r\n */\r\n LITTLE = \"little\",\r\n}\r\n\r\n/**\r\n * Joints of the hand as defined by the WebXR specification.\r\n * https://immersive-web.github.io/webxr-hand-input/#skeleton-joints-section\r\n */\r\nexport const enum XRHandJoint {\r\n /** Wrist */\r\n WRIST = \"wrist\",\r\n\r\n /** Thumb near wrist */\r\n THUMB_METACARPAL = \"thumb-metacarpal\",\r\n /** Thumb first knuckle */\r\n THUMB_PHALANX_PROXIMAL = \"thumb-phalanx-proximal\",\r\n /** Thumb second knuckle */\r\n THUMB_PHALANX_DISTAL = \"thumb-phalanx-distal\",\r\n /** Thumb tip */\r\n THUMB_TIP = \"thumb-tip\",\r\n\r\n /** Index finger near wrist */\r\n INDEX_FINGER_METACARPAL = \"index-finger-metacarpal\",\r\n /** Index finger first knuckle */\r\n INDEX_FINGER_PHALANX_PROXIMAL = \"index-finger-phalanx-proximal\",\r\n /** Index finger second knuckle */\r\n INDEX_FINGER_PHALANX_INTERMEDIATE = \"index-finger-phalanx-intermediate\",\r\n /** Index finger third knuckle */\r\n INDEX_FINGER_PHALANX_DISTAL = \"index-finger-phalanx-distal\",\r\n /** Index finger tip */\r\n INDEX_FINGER_TIP = \"index-finger-tip\",\r\n\r\n /** Middle finger near wrist */\r\n MIDDLE_FINGER_METACARPAL = \"middle-finger-metacarpal\",\r\n /** Middle finger first knuckle */\r\n MIDDLE_FINGER_PHALANX_PROXIMAL = \"middle-finger-phalanx-proximal\",\r\n /** Middle finger second knuckle */\r\n MIDDLE_FINGER_PHALANX_INTERMEDIATE = \"middle-finger-phalanx-intermediate\",\r\n /** Middle finger third knuckle */\r\n MIDDLE_FINGER_PHALANX_DISTAL = \"middle-finger-phalanx-distal\",\r\n /** Middle finger tip */\r\n MIDDLE_FINGER_TIP = \"middle-finger-tip\",\r\n\r\n /** Ring finger near wrist */\r\n RING_FINGER_METACARPAL = \"ring-finger-metacarpal\",\r\n /** Ring finger first knuckle */\r\n RING_FINGER_PHALANX_PROXIMAL = \"ring-finger-phalanx-proximal\",\r\n /** Ring finger second knuckle */\r\n RING_FINGER_PHALANX_INTERMEDIATE = \"ring-finger-phalanx-intermediate\",\r\n /** Ring finger third knuckle */\r\n RING_FINGER_PHALANX_DISTAL = \"ring-finger-phalanx-distal\",\r\n /** Ring finger tip */\r\n RING_FINGER_TIP = \"ring-finger-tip\",\r\n\r\n /** Pinky finger near wrist */\r\n PINKY_FINGER_METACARPAL = \"pinky-finger-metacarpal\",\r\n /** Pinky finger first knuckle */\r\n PINKY_FINGER_PHALANX_PROXIMAL = \"pinky-finger-phalanx-proximal\",\r\n /** Pinky finger second knuckle */\r\n PINKY_FINGER_PHALANX_INTERMEDIATE = \"pinky-finger-phalanx-intermediate\",\r\n /** Pinky finger third knuckle */\r\n PINKY_FINGER_PHALANX_DISTAL = \"pinky-finger-phalanx-distal\",\r\n /** Pinky finger tip */\r\n PINKY_FINGER_TIP = \"pinky-finger-tip\",\r\n}\r\n\r\n/** A type encapsulating a dictionary mapping WebXR joints to bone names in a rigged hand mesh. */\r\nexport type XRHandMeshRigMapping = { [webXRJointName in XRHandJoint]: string };\r\n\r\nconst handJointReferenceArray: XRHandJoint[] = [\r\n XRHandJoint.WRIST,\r\n XRHandJoint.THUMB_METACARPAL,\r\n XRHandJoint.THUMB_PHALANX_PROXIMAL,\r\n XRHandJoint.THUMB_PHALANX_DISTAL,\r\n XRHandJoint.THUMB_TIP,\r\n XRHandJoint.INDEX_FINGER_METACARPAL,\r\n XRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL,\r\n XRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE,\r\n XRHandJoint.INDEX_FINGER_PHALANX_DISTAL,\r\n XRHandJoint.INDEX_FINGER_TIP,\r\n XRHandJoint.MIDDLE_FINGER_METACARPAL,\r\n XRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL,\r\n XRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE,\r\n XRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL,\r\n XRHandJoint.MIDDLE_FINGER_TIP,\r\n XRHandJoint.RING_FINGER_METACARPAL,\r\n XRHandJoint.RING_FINGER_PHALANX_PROXIMAL,\r\n XRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE,\r\n XRHandJoint.RING_FINGER_PHALANX_DISTAL,\r\n XRHandJoint.RING_FINGER_TIP,\r\n XRHandJoint.PINKY_FINGER_METACARPAL,\r\n XRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL,\r\n XRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE,\r\n XRHandJoint.PINKY_FINGER_PHALANX_DISTAL,\r\n XRHandJoint.PINKY_FINGER_TIP,\r\n];\r\n\r\nconst handPartsDefinition: { [key in HandPart]: XRHandJoint[] } = {\r\n [HandPart.WRIST]: [XRHandJoint.WRIST],\r\n [HandPart.THUMB]: [XRHandJoint.THUMB_METACARPAL, XRHandJoint.THUMB_PHALANX_PROXIMAL, XRHandJoint.THUMB_PHALANX_DISTAL, XRHandJoint.THUMB_TIP],\r\n [HandPart.INDEX]: [\r\n XRHandJoint.INDEX_FINGER_METACARPAL,\r\n XRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL,\r\n XRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE,\r\n XRHandJoint.INDEX_FINGER_PHALANX_DISTAL,\r\n XRHandJoint.INDEX_FINGER_TIP,\r\n ],\r\n [HandPart.MIDDLE]: [\r\n XRHandJoint.MIDDLE_FINGER_METACARPAL,\r\n XRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL,\r\n XRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE,\r\n XRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL,\r\n XRHandJoint.MIDDLE_FINGER_TIP,\r\n ],\r\n [HandPart.RING]: [\r\n XRHandJoint.RING_FINGER_METACARPAL,\r\n XRHandJoint.RING_FINGER_PHALANX_PROXIMAL,\r\n XRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE,\r\n XRHandJoint.RING_FINGER_PHALANX_DISTAL,\r\n XRHandJoint.RING_FINGER_TIP,\r\n ],\r\n [HandPart.LITTLE]: [\r\n XRHandJoint.PINKY_FINGER_METACARPAL,\r\n XRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL,\r\n XRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE,\r\n XRHandJoint.PINKY_FINGER_PHALANX_DISTAL,\r\n XRHandJoint.PINKY_FINGER_TIP,\r\n ],\r\n};\r\n\r\n/**\r\n * Representing a single hand (with its corresponding native XRHand object)\r\n */\r\nexport class WebXRHand implements IDisposable {\r\n private _scene: Scene;\r\n\r\n /**\r\n * Transform nodes that will directly receive the transforms from the WebXR matrix data.\r\n */\r\n private _jointTransforms = new Array<TransformNode>(handJointReferenceArray.length);\r\n\r\n /**\r\n * The float array that will directly receive the transform matrix data from WebXR.\r\n */\r\n private _jointTransformMatrices = new Float32Array(handJointReferenceArray.length * 16);\r\n\r\n private _tempJointMatrix = new Matrix();\r\n\r\n /**\r\n * The float array that will directly receive the joint radii from WebXR.\r\n */\r\n private _jointRadii = new Float32Array(handJointReferenceArray.length);\r\n\r\n /**\r\n * Get the hand mesh.\r\n */\r\n public get handMesh(): Nullable<AbstractMesh> {\r\n return this._handMesh;\r\n }\r\n\r\n /**\r\n * Get meshes of part of the hand.\r\n * @param part The part of hand to get.\r\n * @returns An array of meshes that correlate to the hand part requested.\r\n */\r\n public getHandPartMeshes(part: HandPart): AbstractMesh[] {\r\n return handPartsDefinition[part].map((name) => this._jointMeshes[handJointReferenceArray.indexOf(name)]!);\r\n }\r\n\r\n /**\r\n * Retrieves a mesh linked to a named joint in the hand.\r\n * @param jointName The name of the joint.\r\n * @returns An AbstractMesh whose position corresponds with the joint position.\r\n */\r\n public getJointMesh(jointName: XRHandJoint): AbstractMesh {\r\n return this._jointMeshes[handJointReferenceArray.indexOf(jointName)!];\r\n }\r\n\r\n /**\r\n * Construct a new hand object\r\n * @param xrController The controller to which the hand correlates.\r\n * @param _jointMeshes The meshes to be used to track the hand joints.\r\n * @param _handMesh An optional hand mesh.\r\n * @param rigMapping An optional rig mapping for the hand mesh.\r\n * If not provided (but a hand mesh is provided),\r\n * it will be assumed that the hand mesh's bones are named\r\n * directly after the WebXR bone names.\r\n * @param _leftHandedMeshes Are the hand meshes left-handed-system meshes\r\n * @param _jointsInvisible Are the tracked joint meshes visible\r\n * @param _jointScaleFactor Scale factor for all joint meshes\r\n */\r\n constructor(\r\n /** The controller to which the hand correlates. */\r\n public readonly xrController: WebXRInputSource,\r\n private readonly _jointMeshes: AbstractMesh[],\r\n private _handMesh: Nullable<AbstractMesh>,\r\n /** An optional rig mapping for the hand mesh. If not provided (but a hand mesh is provided),\r\n * it will be assumed that the hand mesh's bones are named directly after the WebXR bone names. */\r\n readonly rigMapping: Nullable<XRHandMeshRigMapping>,\r\n private readonly _leftHandedMeshes: boolean = false,\r\n private readonly _jointsInvisible: boolean = false,\r\n private readonly _jointScaleFactor: number = 1\r\n ) {\r\n this._scene = _jointMeshes[0].getScene();\r\n\r\n // Initialize the joint transform quaternions and link the transforms to the bones.\r\n for (let jointIdx = 0; jointIdx < this._jointTransforms.length; jointIdx++) {\r\n const jointTransform = (this._jointTransforms[jointIdx] = new TransformNode(handJointReferenceArray[jointIdx], this._scene));\r\n jointTransform.rotationQuaternion = new Quaternion();\r\n\r\n // Set the rotation quaternion so we can use it later for tracking.\r\n _jointMeshes[jointIdx].rotationQuaternion = new Quaternion();\r\n }\r\n\r\n if (_handMesh) {\r\n // Note that this logic needs to happen after we initialize the joint tracking transform nodes.\r\n this.setHandMesh(_handMesh, rigMapping);\r\n }\r\n\r\n // hide the motion controller, if available/loaded\r\n if (this.xrController.motionController) {\r\n if (this.xrController.motionController.rootMesh) {\r\n this.xrController.motionController.rootMesh.setEnabled(false);\r\n } else {\r\n this.xrController.motionController.onModelLoadedObservable.add((controller) => {\r\n if (controller.rootMesh) {\r\n controller.rootMesh.setEnabled(false);\r\n }\r\n });\r\n }\r\n }\r\n\r\n this.xrController.onMotionControllerInitObservable.add((motionController) => {\r\n motionController.onModelLoadedObservable.add((controller) => {\r\n if (controller.rootMesh) {\r\n controller.rootMesh.setEnabled(false);\r\n }\r\n });\r\n if (motionController.rootMesh) {\r\n motionController.rootMesh.setEnabled(false);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Sets the current hand mesh to render for the WebXRHand.\r\n * @param handMesh The rigged hand mesh that will be tracked to the user's hand.\r\n * @param rigMapping The mapping from XRHandJoint to bone names to use with the mesh.\r\n */\r\n public setHandMesh(handMesh: AbstractMesh, rigMapping: Nullable<XRHandMeshRigMapping>) {\r\n this._handMesh = handMesh;\r\n\r\n // Avoid any strange frustum culling. We will manually control visibility via attach and detach.\r\n handMesh.alwaysSelectAsActiveMesh = true;\r\n handMesh.getChildMeshes().forEach((mesh) => (mesh.alwaysSelectAsActiveMesh = true));\r\n\r\n // Link the bones in the hand mesh to the transform nodes that will be bound to the WebXR tracked joints.\r\n if (this._handMesh.skeleton) {\r\n const handMeshSkeleton = this._handMesh.skeleton;\r\n handJointReferenceArray.forEach((jointName, jointIdx) => {\r\n const jointBoneIdx = handMeshSkeleton.getBoneIndexByName(rigMapping ? rigMapping[jointName] : jointName);\r\n if (jointBoneIdx !== -1) {\r\n handMeshSkeleton.bones[jointBoneIdx].linkTransformNode(this._jointTransforms[jointIdx]);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Update this hand from the latest xr frame.\r\n * @param xrFrame The latest frame received from WebXR.\r\n * @param referenceSpace The current viewer reference space.\r\n */\r\n public updateFromXRFrame(xrFrame: XRFrame, referenceSpace: XRReferenceSpace) {\r\n const hand = this.xrController.inputSource.hand;\r\n if (!hand) {\r\n return;\r\n }\r\n\r\n // TODO: Modify webxr.d.ts to better match WebXR IDL so we don't need this any cast.\r\n const anyHand: any = hand;\r\n const jointSpaces: XRJointSpace[] = handJointReferenceArray.map((jointName) => anyHand[jointName] || hand.get(jointName));\r\n let trackingSuccessful = false;\r\n\r\n if (xrFrame.fillPoses && xrFrame.fillJointRadii) {\r\n trackingSuccessful = xrFrame.fillPoses(jointSpaces, referenceSpace, this._jointTransformMatrices) && xrFrame.fillJointRadii(jointSpaces, this._jointRadii);\r\n } else if (xrFrame.getJointPose) {\r\n trackingSuccessful = true;\r\n // Warning: This codepath is slow by comparison, only here for compat.\r\n for (let jointIdx = 0; jointIdx < jointSpaces.length; jointIdx++) {\r\n const jointPose = xrFrame.getJointPose(jointSpaces[jointIdx], referenceSpace);\r\n if (jointPose) {\r\n this._jointTransformMatrices.set(jointPose.transform.matrix, jointIdx * 16);\r\n this._jointRadii[jointIdx] = jointPose.radius || 0.008;\r\n } else {\r\n trackingSuccessful = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!trackingSuccessful) {\r\n return;\r\n }\r\n\r\n handJointReferenceArray.forEach((_jointName, jointIdx) => {\r\n const jointTransform = this._jointTransforms[jointIdx];\r\n Matrix.FromArrayToRef(this._jointTransformMatrices, jointIdx * 16, this._tempJointMatrix);\r\n this._tempJointMatrix.decompose(undefined, jointTransform.rotationQuaternion!, jointTransform.position);\r\n\r\n // The radius we need to make the joint in order for it to roughly cover the joints of the user's real hand.\r\n const scaledJointRadius = this._jointRadii[jointIdx] * this._jointScaleFactor;\r\n\r\n const jointMesh = this._jointMeshes[jointIdx];\r\n jointMesh.isVisible = !this._handMesh && !this._jointsInvisible;\r\n jointMesh.position.copyFrom(jointTransform.position);\r\n jointMesh.rotationQuaternion!.copyFrom(jointTransform.rotationQuaternion!);\r\n jointMesh.scaling.setAll(scaledJointRadius);\r\n\r\n // The WebXR data comes as right-handed, so we might need to do some conversions.\r\n if (!this._scene.useRightHandedSystem) {\r\n jointMesh.position.z *= -1;\r\n jointMesh.rotationQuaternion!.z *= -1;\r\n jointMesh.rotationQuaternion!.w *= -1;\r\n\r\n if (this._leftHandedMeshes && this._handMesh) {\r\n jointTransform.position.z *= -1;\r\n jointTransform.rotationQuaternion!.z *= -1;\r\n jointTransform.rotationQuaternion!.w *= -1;\r\n }\r\n }\r\n });\r\n\r\n if (this._handMesh) {\r\n this._handMesh.isVisible = true;\r\n }\r\n }\r\n\r\n /**\r\n * Dispose this Hand object\r\n */\r\n public dispose() {\r\n if (this._handMesh) {\r\n this._handMesh.isVisible = false;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * WebXR Hand Joint tracking feature, available for selected browsers and devices\r\n */\r\nexport class WebXRHandTracking extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.HAND_TRACKING;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /** The base URL for the default hand model. */\r\n public static DEFAULT_HAND_MODEL_BASE_URL = \"https://assets.babylonjs.com/meshes/HandMeshes/\";\r\n /** The filename to use for the default right hand model. */\r\n public static DEFAULT_HAND_MODEL_RIGHT_FILENAME = \"r_hand_rhs.glb\";\r\n /** The filename to use for the default left hand model. */\r\n public static DEFAULT_HAND_MODEL_LEFT_FILENAME = \"l_hand_rhs.glb\";\r\n /** The URL pointing to the default hand model NodeMaterial shader. */\r\n public static DEFAULT_HAND_MODEL_SHADER_URL = \"https://assets.babylonjs.com/meshes/HandMeshes/handsShader.json\";\r\n\r\n // We want to use lightweight models, diameter will initially be 1 but scaled to the values returned from WebXR.\r\n private static readonly _ICOSPHERE_PARAMS = { radius: 0.5, flat: false, subdivisions: 2 };\r\n\r\n private static _RightHandGLB: Nullable<ISceneLoaderAsyncResult> = null;\r\n private static _LeftHandGLB: Nullable<ISceneLoaderAsyncResult> = null;\r\n\r\n private static _GenerateTrackedJointMeshes(featureOptions: IWebXRHandTrackingOptions): { left: AbstractMesh[]; right: AbstractMesh[] } {\r\n const meshes: { [handedness: string]: AbstractMesh[] } = {};\r\n [\"left\" as XRHandedness, \"right\" as XRHandedness].map((handedness) => {\r\n const trackedMeshes = [];\r\n const originalMesh = featureOptions.jointMeshes?.sourceMesh || CreateIcoSphere(\"jointParent\", WebXRHandTracking._ICOSPHERE_PARAMS);\r\n originalMesh.isVisible = !!featureOptions.jointMeshes?.keepOriginalVisible;\r\n for (let i = 0; i < handJointReferenceArray.length; ++i) {\r\n let newInstance: AbstractMesh = originalMesh.createInstance(`${handedness}-handJoint-${i}`);\r\n if (featureOptions.jointMeshes?.onHandJointMeshGenerated) {\r\n const returnedMesh = featureOptions.jointMeshes.onHandJointMeshGenerated(newInstance as InstancedMesh, i, handedness);\r\n if (returnedMesh) {\r\n if (returnedMesh !== newInstance) {\r\n newInstance.dispose();\r\n newInstance = returnedMesh;\r\n }\r\n }\r\n }\r\n newInstance.isPickable = false;\r\n if (featureOptions.jointMeshes?.enablePhysics) {\r\n const props = featureOptions.jointMeshes?.physicsProps || {};\r\n // downscale the instances so that physics will be initialized correctly\r\n newInstance.scaling.setAll(0.02);\r\n const type = props.impostorType !== undefined ? props.impostorType : PhysicsImpostor.SphereImpostor;\r\n newInstance.physicsImpostor = new PhysicsImpostor(newInstance, type, { mass: 0, ...props });\r\n }\r\n newInstance.rotationQuaternion = new Quaternion();\r\n newInstance.isVisible = false;\r\n trackedMeshes.push(newInstance);\r\n }\r\n\r\n meshes[handedness] = trackedMeshes;\r\n });\r\n return { left: meshes.left, right: meshes.right };\r\n }\r\n\r\n private static _GenerateDefaultHandMeshesAsync(scene: Scene, options?: IWebXRHandTrackingOptions): Promise<{ left: AbstractMesh; right: AbstractMesh }> {\r\n // eslint-disable-next-line no-async-promise-executor\r\n return new Promise(async (resolve) => {\r\n const riggedMeshes: { [handedness: string]: AbstractMesh } = {};\r\n // check the cache, defensive\r\n if (WebXRHandTracking._RightHandGLB?.meshes[1]?.isDisposed()) {\r\n WebXRHandTracking._RightHandGLB = null;\r\n }\r\n if (WebXRHandTracking._LeftHandGLB?.meshes[1]?.isDisposed()) {\r\n WebXRHandTracking._LeftHandGLB = null;\r\n }\r\n\r\n const handsDefined = !!(WebXRHandTracking._RightHandGLB && WebXRHandTracking._LeftHandGLB);\r\n // load them in parallel\r\n const handGLBs = await Promise.all([\r\n WebXRHandTracking._RightHandGLB ||\r\n SceneLoader.ImportMeshAsync(\"\", WebXRHandTracking.DEFAULT_HAND_MODEL_BASE_URL, WebXRHandTracking.DEFAULT_HAND_MODEL_RIGHT_FILENAME, scene),\r\n WebXRHandTracking._LeftHandGLB ||\r\n SceneLoader.ImportMeshAsync(\"\", WebXRHandTracking.DEFAULT_HAND_MODEL_BASE_URL, WebXRHandTracking.DEFAULT_HAND_MODEL_LEFT_FILENAME, scene),\r\n ]);\r\n WebXRHandTracking._RightHandGLB = handGLBs[0];\r\n WebXRHandTracking._LeftHandGLB = handGLBs[1];\r\n\r\n const handShader = new NodeMaterial(\"handShader\", scene, { emitComments: false });\r\n await handShader.loadAsync(WebXRHandTracking.DEFAULT_HAND_MODEL_SHADER_URL);\r\n\r\n // depth prepass and alpha mode\r\n handShader.needDepthPrePass = true;\r\n handShader.transparencyMode = Material.MATERIAL_ALPHABLEND;\r\n handShader.alphaMode = Constants.ALPHA_COMBINE;\r\n\r\n // build node materials\r\n handShader.build(false);\r\n\r\n // shader\r\n const handColors = {\r\n base: Color3.FromInts(116, 63, 203),\r\n fresnel: Color3.FromInts(149, 102, 229),\r\n fingerColor: Color3.FromInts(177, 130, 255),\r\n tipFresnel: Color3.FromInts(220, 200, 255),\r\n ...options?.handMeshes?.customColors,\r\n };\r\n\r\n const handNodes = {\r\n base: handShader.getBlockByName(\"baseColor\") as InputBlock,\r\n fresnel: handShader.getBlockByName(\"fresnelColor\") as InputBlock,\r\n fingerColor: handShader.getBlockByName(\"fingerColor\") as InputBlock,\r\n tipFresnel: handShader.getBlockByName(\"tipFresnelColor\") as InputBlock,\r\n };\r\n\r\n handNodes.base.value = handColors.base;\r\n handNodes.fresnel.value = handColors.fresnel;\r\n handNodes.fingerColor.value = handColors.fingerColor;\r\n handNodes.tipFresnel.value = handColors.tipFresnel;\r\n\r\n [\"left\", \"right\"].forEach((handedness) => {\r\n const handGLB = handedness == \"left\" ? WebXRHandTracking._LeftHandGLB : WebXRHandTracking._RightHandGLB;\r\n if (!handGLB) {\r\n // this should never happen!\r\n throw new Error(\"Could not load hand model\");\r\n }\r\n const handMesh = handGLB.meshes[1];\r\n handMesh._internalAbstractMeshDataInfo._computeBonesUsingShaders = true;\r\n handMesh.material = handShader.clone(`${handedness}HandShaderClone`, true);\r\n handMesh.isVisible = false;\r\n\r\n riggedMeshes[handedness] = handMesh;\r\n\r\n // single change for left handed systems\r\n if (!handsDefined && !scene.useRightHandedSystem) {\r\n handGLB.meshes[1].rotate(Axis.Y, Math.PI);\r\n }\r\n });\r\n\r\n handShader.dispose();\r\n resolve({ left: riggedMeshes.left, right: riggedMeshes.right });\r\n });\r\n }\r\n\r\n /**\r\n * Generates a mapping from XRHandJoint to bone name for the default hand mesh.\r\n * @param handedness The handedness being mapped for.\r\n */\r\n private static _GenerateDefaultHandMeshRigMapping(handedness: XRHandedness): XRHandMeshRigMapping {\r\n const H = handedness == \"right\" ? \"R\" : \"L\";\r\n return {\r\n [XRHandJoint.WRIST]: `wrist_${H}`,\r\n [XRHandJoint.THUMB_METACARPAL]: `thumb_metacarpal_${H}`,\r\n [XRHandJoint.THUMB_PHALANX_PROXIMAL]: `thumb_proxPhalanx_${H}`,\r\n [XRHandJoint.THUMB_PHALANX_DISTAL]: `thumb_distPhalanx_${H}`,\r\n [XRHandJoint.THUMB_TIP]: `thumb_tip_${H}`,\r\n [XRHandJoint.INDEX_FINGER_METACARPAL]: `index_metacarpal_${H}`,\r\n [XRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL]: `index_proxPhalanx_${H}`,\r\n [XRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE]: `index_intPhalanx_${H}`,\r\n [XRHandJoint.INDEX_FINGER_PHALANX_DISTAL]: `index_distPhalanx_${H}`,\r\n [XRHandJoint.INDEX_FINGER_TIP]: `index_tip_${H}`,\r\n [XRHandJoint.MIDDLE_FINGER_METACARPAL]: `middle_metacarpal_${H}`,\r\n [XRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL]: `middle_proxPhalanx_${H}`,\r\n [XRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE]: `middle_intPhalanx_${H}`,\r\n [XRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL]: `middle_distPhalanx_${H}`,\r\n [XRHandJoint.MIDDLE_FINGER_TIP]: `middle_tip_${H}`,\r\n [XRHandJoint.RING_FINGER_METACARPAL]: `ring_metacarpal_${H}`,\r\n [XRHandJoint.RING_FINGER_PHALANX_PROXIMAL]: `ring_proxPhalanx_${H}`,\r\n [XRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE]: `ring_intPhalanx_${H}`,\r\n [XRHandJoint.RING_FINGER_PHALANX_DISTAL]: `ring_distPhalanx_${H}`,\r\n [XRHandJoint.RING_FINGER_TIP]: `ring_tip_${H}`,\r\n [XRHandJoint.PINKY_FINGER_METACARPAL]: `little_metacarpal_${H}`,\r\n [XRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL]: `little_proxPhalanx_${H}`,\r\n [XRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE]: `little_intPhalanx_${H}`,\r\n [XRHandJoint.PINKY_FINGER_PHALANX_DISTAL]: `little_distPhalanx_${H}`,\r\n [XRHandJoint.PINKY_FINGER_TIP]: `little_tip_${H}`,\r\n };\r\n }\r\n\r\n private _attachedHands: {\r\n [uniqueId: string]: WebXRHand;\r\n } = {};\r\n\r\n private _trackingHands: {\r\n left: Nullable<WebXRHand>;\r\n right: Nullable<WebXRHand>;\r\n } = { left: null, right: null };\r\n\r\n private _handResources: {\r\n jointMeshes: Nullable<{ left: AbstractMesh[]; right: AbstractMesh[] }>;\r\n handMeshes: Nullable<{ left: AbstractMesh; right: AbstractMesh }>;\r\n rigMappings: Nullable<{ left: XRHandMeshRigMapping; right: XRHandMeshRigMapping }>;\r\n } = { jointMeshes: null, handMeshes: null, rigMappings: null };\r\n\r\n /**\r\n * This observable will notify registered observers when a new hand object was added and initialized\r\n */\r\n public onHandAddedObservable: Observable<WebXRHand> = new Observable();\r\n /**\r\n * This observable will notify its observers right before the hand object is disposed\r\n */\r\n public onHandRemovedObservable: Observable<WebXRHand> = new Observable();\r\n\r\n /**\r\n * Check if the needed objects are defined.\r\n * This does not mean that the feature is enabled, but that the objects needed are well defined.\r\n */\r\n public isCompatible(): boolean {\r\n return typeof XRHand !== \"undefined\";\r\n }\r\n\r\n /**\r\n * Get the hand object according to the controller id\r\n * @param controllerId the controller id to which we want to get the hand\r\n * @returns null if not found or the WebXRHand object if found\r\n */\r\n public getHandByControllerId(controllerId: string): Nullable<WebXRHand> {\r\n return this._attachedHands[controllerId];\r\n }\r\n\r\n /**\r\n * Get a hand object according to the requested handedness\r\n * @param handedness the handedness to request\r\n * @returns null if not found or the WebXRHand object if found\r\n */\r\n public getHandByHandedness(handedness: XRHandedness): Nullable<WebXRHand> {\r\n if (handedness == \"none\") {\r\n return null;\r\n }\r\n return this._trackingHands[handedness];\r\n }\r\n\r\n /**\r\n * Creates a new instance of the XR hand tracking feature.\r\n * @param _xrSessionManager An instance of WebXRSessionManager.\r\n * @param options Options to use when constructing this feature.\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /** Options to use when constructing this feature. */\r\n public readonly options: IWebXRHandTrackingOptions\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"hand-tracking\";\r\n\r\n // Support legacy versions of the options object by copying over joint mesh properties\r\n const anyOptions = options as any;\r\n const anyJointMeshOptions = anyOptions.jointMeshes;\r\n if (anyJointMeshOptions) {\r\n if (typeof anyJointMeshOptions.disableDefaultHandMesh !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n options.handMeshes.disableDefaultMeshes = anyJointMeshOptions.disableDefaultHandMesh;\r\n }\r\n if (typeof anyJointMeshOptions.handMeshes !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n options.handMeshes.customMeshes = anyJointMeshOptions.handMeshes;\r\n }\r\n if (typeof anyJointMeshOptions.leftHandedSystemMeshes !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n options.handMeshes.meshesUseLeftHandedCoordinates = anyJointMeshOptions.leftHandedSystemMeshes;\r\n }\r\n if (typeof anyJointMeshOptions.rigMapping !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n const leftRigMapping = {};\r\n const rightRigMapping = {};\r\n [\r\n [anyJointMeshOptions.rigMapping.left, leftRigMapping],\r\n [anyJointMeshOptions.rigMapping.right, rightRigMapping],\r\n ].forEach((rigMappingTuple) => {\r\n const legacyRigMapping = rigMappingTuple[0] as string[];\r\n const rigMapping = rigMappingTuple[1] as XRHandMeshRigMapping;\r\n legacyRigMapping.forEach((modelJointName, index) => {\r\n rigMapping[handJointReferenceArray[index]] = modelJointName;\r\n });\r\n });\r\n options.handMeshes.customRigMappings = {\r\n left: leftRigMapping as XRHandMeshRigMapping,\r\n right: rightRigMapping as XRHandMeshRigMapping,\r\n };\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Attach this feature.\r\n * Will usually be called by the features manager.\r\n *\r\n * @returns true if successful.\r\n */\r\n public attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n this._handResources = {\r\n jointMeshes: WebXRHandTracking._GenerateTrackedJointMeshes(this.options),\r\n handMeshes: this.options.handMeshes?.customMeshes || null,\r\n rigMappings: this.options.handMeshes?.customRigMappings || null,\r\n };\r\n\r\n // If they didn't supply custom meshes and are not disabling the default meshes...\r\n if (!this.options.handMeshes?.customMeshes && !this.options.handMeshes?.disableDefaultMeshes) {\r\n WebXRHandTracking._GenerateDefaultHandMeshesAsync(EngineStore.LastCreatedScene!, this.options).then((defaultHandMeshes) => {\r\n this._handResources.handMeshes = defaultHandMeshes;\r\n this._handResources.rigMappings = {\r\n left: WebXRHandTracking._GenerateDefaultHandMeshRigMapping(\"left\"),\r\n right: WebXRHandTracking._GenerateDefaultHandMeshRigMapping(\"right\"),\r\n };\r\n\r\n // Apply meshes to existing hands if already tracking.\r\n this._trackingHands.left?.setHandMesh(this._handResources.handMeshes.left, this._handResources.rigMappings.left);\r\n this._trackingHands.right?.setHandMesh(this._handResources.handMeshes.right, this._handResources.rigMappings.right);\r\n });\r\n }\r\n\r\n this.options.xrInput.controllers.forEach(this._attachHand);\r\n this._addNewAttachObserver(this.options.xrInput.onControllerAddedObservable, this._attachHand);\r\n this._addNewAttachObserver(this.options.xrInput.onControllerRemovedObservable, this._detachHand);\r\n\r\n return true;\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n this._trackingHands.left?.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace);\r\n this._trackingHands.right?.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace);\r\n }\r\n\r\n private _attachHand = (xrController: WebXRInputSource) => {\r\n if (!xrController.inputSource.hand || xrController.inputSource.handedness == \"none\" || !this._handResources.jointMeshes) {\r\n return;\r\n }\r\n\r\n const handedness = xrController.inputSource.handedness;\r\n const webxrHand = new WebXRHand(\r\n xrController,\r\n this._handResources.jointMeshes[handedness],\r\n this._handResources.handMeshes && this._handResources.handMeshes[handedness],\r\n this._handResources.rigMappings && this._handResources.rigMappings[handedness],\r\n this.options.handMeshes?.meshesUseLeftHandedCoordinates,\r\n this.options.jointMeshes?.invisible,\r\n this.options.jointMeshes?.scaleFactor\r\n );\r\n\r\n this._attachedHands[xrController.uniqueId] = webxrHand;\r\n this._trackingHands[handedness] = webxrHand;\r\n\r\n this.onHandAddedObservable.notifyObservers(webxrHand);\r\n };\r\n\r\n private _detachHandById(controllerId: string) {\r\n const hand = this.getHandByControllerId(controllerId);\r\n if (hand) {\r\n const handedness = hand.xrController.inputSource.handedness == \"left\" ? \"left\" : \"right\";\r\n if (this._trackingHands[handedness]?.xrController.uniqueId === controllerId) {\r\n this._trackingHands[handedness] = null;\r\n }\r\n this.onHandRemovedObservable.notifyObservers(hand);\r\n hand.dispose();\r\n delete this._attachedHands[controllerId];\r\n }\r\n }\r\n\r\n private _detachHand = (xrController: WebXRInputSource) => {\r\n this._detachHandById(xrController.uniqueId);\r\n };\r\n\r\n /**\r\n * Detach this feature.\r\n * Will usually be called by the features manager.\r\n *\r\n * @returns true if successful.\r\n */\r\n public detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n Object.keys(this._attachedHands).forEach((uniqueId) => this._detachHandById(uniqueId));\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached.\r\n */\r\n public dispose(): void {\r\n super.dispose();\r\n this.onHandAddedObservable.clear();\r\n this.onHandRemovedObservable.clear();\r\n\r\n if (this._handResources.handMeshes && !this.options.handMeshes?.customMeshes) {\r\n // this will dispose the cached meshes\r\n this._handResources.handMeshes.left.dispose();\r\n this._handResources.handMeshes.right.dispose();\r\n // remove the cached meshes\r\n WebXRHandTracking._RightHandGLB = null;\r\n WebXRHandTracking._LeftHandGLB = null;\r\n }\r\n\r\n if (this._handResources.jointMeshes) {\r\n this._handResources.jointMeshes.left.forEach((trackedMesh) => trackedMesh.dispose());\r\n this._handResources.jointMeshes.right.forEach((trackedMesh) => trackedMesh.dispose());\r\n }\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRHandTracking.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRHandTracking(xrSessionManager, options);\r\n },\r\n WebXRHandTracking.Version,\r\n false\r\n);\r\n"]}
@@ -113,11 +113,6 @@ export declare class WebXRImageTracking extends WebXRAbstractFeature {
113
113
  * @returns true if successful.
114
114
  */
115
115
  detach(): boolean;
116
- /**
117
- * Check if the needed objects are defined.
118
- * This does not mean that the feature is enabled, but that the objects needed are well defined.
119
- */
120
- isCompatible(): boolean;
121
116
  /**
122
117
  * Get a tracked image by its ID.
123
118
  *
@@ -70,13 +70,6 @@ var WebXRImageTracking = /** @class */ (function (_super) {
70
70
  WebXRImageTracking.prototype.detach = function () {
71
71
  return _super.prototype.detach.call(this);
72
72
  };
73
- /**
74
- * Check if the needed objects are defined.
75
- * This does not mean that the feature is enabled, but that the objects needed are well defined.
76
- */
77
- WebXRImageTracking.prototype.isCompatible = function () {
78
- return typeof XRImageTrackingResult !== "undefined";
79
- };
80
73
  /**
81
74
  * Get a tracked image by its ID.
82
75
  *
@@ -115,7 +108,7 @@ var WebXRImageTracking = /** @class */ (function (_super) {
115
108
  }
116
109
  promises = this.options.images.map(function (image) {
117
110
  if (typeof image.src === "string") {
118
- return _this._xrSessionManager.scene.getEngine().createImageBitmapFromSource(image.src);
111
+ return _this._xrSessionManager.scene.getEngine()._createImageBitmapFromSource(image.src);
119
112
  }
120
113
  else {
121
114
  return Promise.resolve(image.src); // resolve is probably unneeded
@@ -204,6 +197,10 @@ var WebXRImageTracking = /** @class */ (function (_super) {
204
197
  return [4 /*yield*/, this._xrSessionManager.session.getTrackedImageScores()];
205
198
  case 1:
206
199
  imageScores = _a.sent();
200
+ if (!imageScores || imageScores.length === 0) {
201
+ this._trackableScoreStatus = ImageTrackingScoreStatus.NotReceived;
202
+ return [2 /*return*/];
203
+ }
207
204
  // check the scores for all
208
205
  for (idx = 0; idx < imageScores.length; ++idx) {
209
206
  if (imageScores[idx] == "untrackable") {
@@ -1 +1 @@
1
- {"version":3,"file":"WebXRImageTracking.js","sourceRoot":"","sources":["../../../../../../lts/core/generated/XR/features/WebXRImageTracking.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { Matrix } from \"../../Maths/math.vector\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Tools } from \"../../Misc/tools\";\r\n\r\ndeclare const XRImageTrackingResult: XRImageTrackingResult;\r\n\r\n/**\r\n * Options interface for the background remover plugin\r\n */\r\nexport interface IWebXRImageTrackingOptions {\r\n /**\r\n * A required array with images to track\r\n */\r\n images: {\r\n /**\r\n * The source of the image. can be a URL or an image bitmap\r\n */\r\n src: string | ImageBitmap;\r\n /**\r\n * The estimated width in the real world (in meters)\r\n */\r\n estimatedRealWorldWidth: number; // In meters!\r\n }[];\r\n}\r\n\r\n/**\r\n * An object representing an image tracked by the system\r\n */\r\nexport interface IWebXRTrackedImage {\r\n /**\r\n * The ID of this image (which is the same as the position in the array that was used to initialize the feature)\r\n */\r\n id: number;\r\n /**\r\n * Is the transformation provided emulated. If it is, the system \"guesses\" its real position. Otherwise it can be considered as exact position.\r\n */\r\n emulated?: boolean;\r\n /**\r\n * Just in case it is needed - the image bitmap that is being tracked\r\n */\r\n originalBitmap: ImageBitmap;\r\n /**\r\n * The native XR result image tracking result, untouched\r\n */\r\n xrTrackingResult?: XRImageTrackingResult;\r\n /**\r\n * Width in real world (meters)\r\n */\r\n realWorldWidth?: number;\r\n /**\r\n * A transformation matrix of this current image in the current reference space.\r\n */\r\n transformationMatrix: Matrix;\r\n /**\r\n * The width/height ratio of this image. can be used to calculate the size of the detected object/image\r\n */\r\n ratio?: number;\r\n}\r\n\r\n/**\r\n * Enum that describes the state of the image trackability score status for this session.\r\n */\r\nenum ImageTrackingScoreStatus {\r\n // AR Session has not yet assessed image trackability scores.\r\n NotReceived,\r\n // A request to retrieve trackability scores has been sent, but no response has been received.\r\n Waiting,\r\n // Image trackability scores have been received for this session\r\n Received,\r\n}\r\n\r\n/**\r\n * Image tracking for immersive AR sessions.\r\n * Providing a list of images and their estimated widths will enable tracking those images in the real world.\r\n */\r\nexport class WebXRImageTracking extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.IMAGE_TRACKING;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /**\r\n * This will be triggered if the underlying system deems an image untrackable.\r\n * The index is the index of the image from the array used to initialize the feature.\r\n */\r\n public onUntrackableImageFoundObservable: Observable<number> = new Observable();\r\n /**\r\n * An image was deemed trackable, and the system will start tracking it.\r\n */\r\n public onTrackableImageFoundObservable: Observable<IWebXRTrackedImage> = new Observable();\r\n /**\r\n * The image was found and its state was updated.\r\n */\r\n public onTrackedImageUpdatedObservable: Observable<IWebXRTrackedImage> = new Observable();\r\n\r\n private _trackableScoreStatus: ImageTrackingScoreStatus = ImageTrackingScoreStatus.NotReceived;\r\n private _trackedImages: IWebXRTrackedImage[] = [];\r\n\r\n private _originalTrackingRequest: XRTrackedImageInit[];\r\n\r\n /**\r\n * constructs the image tracking feature\r\n * @param _xrSessionManager the session manager for this module\r\n * @param options read-only options to be used in this module\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /**\r\n * read-only options to be used in this module\r\n */\r\n public readonly options: IWebXRImageTrackingOptions\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"image-tracking\";\r\n }\r\n\r\n /**\r\n * attach this feature\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public attach(): boolean {\r\n return super.attach();\r\n }\r\n\r\n /**\r\n * detach this feature.\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public detach(): boolean {\r\n return super.detach();\r\n }\r\n\r\n /**\r\n * Check if the needed objects are defined.\r\n * This does not mean that the feature is enabled, but that the objects needed are well defined.\r\n */\r\n public isCompatible(): boolean {\r\n return typeof XRImageTrackingResult !== \"undefined\";\r\n }\r\n\r\n /**\r\n * Get a tracked image by its ID.\r\n *\r\n * @param id the id of the image to load (position in the init array)\r\n * @returns a trackable image, if exists in this location\r\n */\r\n public getTrackedImageById(id: number): Nullable<IWebXRTrackedImage> {\r\n return this._trackedImages[id] || null;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public dispose(): void {\r\n super.dispose();\r\n this._trackedImages.forEach((trackedImage) => {\r\n trackedImage.originalBitmap.close();\r\n });\r\n this._trackedImages.length = 0;\r\n this.onTrackableImageFoundObservable.clear();\r\n this.onUntrackableImageFoundObservable.clear();\r\n this.onTrackedImageUpdatedObservable.clear();\r\n }\r\n\r\n /**\r\n * Extends the session init object if needed\r\n * @returns augmentation object fo the xr session init object.\r\n */\r\n public async getXRSessionInitExtension(): Promise<Partial<XRSessionInit>> {\r\n if (!this.options.images || !this.options.images.length) {\r\n return {};\r\n }\r\n const promises = this.options.images.map((image) => {\r\n if (typeof image.src === \"string\") {\r\n return this._xrSessionManager.scene.getEngine().createImageBitmapFromSource(image.src);\r\n } else {\r\n return Promise.resolve(image.src); // resolve is probably unneeded\r\n }\r\n });\r\n\r\n try {\r\n const images = await Promise.all(promises);\r\n\r\n this._originalTrackingRequest = images.map((image, idx) => {\r\n return {\r\n image,\r\n widthInMeters: this.options.images[idx].estimatedRealWorldWidth,\r\n };\r\n });\r\n\r\n return {\r\n trackedImages: this._originalTrackingRequest,\r\n };\r\n } catch (ex) {\r\n Tools.Error(\"Error loading images for tracking, WebXRImageTracking disabled for this session.\");\r\n return {};\r\n }\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame) {\r\n if (!_xrFrame.getImageTrackingResults || this._trackableScoreStatus === ImageTrackingScoreStatus.Waiting) {\r\n return;\r\n }\r\n\r\n // Image tracking scores may be generated a few frames after the XR Session initializes.\r\n // If we haven't received scores yet, then kick off the task to check scores and return immediately.\r\n if (this._trackableScoreStatus === ImageTrackingScoreStatus.NotReceived) {\r\n this._checkScoresAsync();\r\n return;\r\n }\r\n\r\n const imageTrackedResults = _xrFrame.getImageTrackingResults();\r\n for (const result of imageTrackedResults) {\r\n let changed = false;\r\n const imageIndex = result.index;\r\n\r\n const imageObject = this._trackedImages[imageIndex];\r\n if (!imageObject) {\r\n // something went wrong!\r\n continue;\r\n }\r\n\r\n imageObject.xrTrackingResult = result;\r\n if (imageObject.realWorldWidth !== result.measuredWidthInMeters) {\r\n imageObject.realWorldWidth = result.measuredWidthInMeters;\r\n changed = true;\r\n }\r\n\r\n // Get the pose of the image relative to a reference space.\r\n const pose = _xrFrame.getPose(result.imageSpace, this._xrSessionManager.referenceSpace);\r\n\r\n if (pose) {\r\n const mat = imageObject.transformationMatrix;\r\n Matrix.FromArrayToRef(pose.transform.matrix, 0, mat);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n mat.toggleModelMatrixHandInPlace();\r\n }\r\n changed = true;\r\n }\r\n\r\n const state = result.trackingState;\r\n const emulated = state === \"emulated\";\r\n\r\n if (imageObject.emulated !== emulated) {\r\n imageObject.emulated = emulated;\r\n changed = true;\r\n }\r\n if (changed) {\r\n this.onTrackedImageUpdatedObservable.notifyObservers(imageObject);\r\n }\r\n }\r\n }\r\n\r\n private async _checkScoresAsync(): Promise<void> {\r\n if (!this._xrSessionManager.session.getTrackedImageScores || this._trackableScoreStatus !== ImageTrackingScoreStatus.NotReceived) {\r\n return;\r\n }\r\n\r\n this._trackableScoreStatus = ImageTrackingScoreStatus.Waiting;\r\n const imageScores = await this._xrSessionManager.session.getTrackedImageScores();\r\n\r\n // check the scores for all\r\n for (let idx = 0; idx < imageScores.length; ++idx) {\r\n if (imageScores[idx] == \"untrackable\") {\r\n this.onUntrackableImageFoundObservable.notifyObservers(idx);\r\n } else {\r\n const originalBitmap = this._originalTrackingRequest[idx].image;\r\n const imageObject: IWebXRTrackedImage = {\r\n id: idx,\r\n originalBitmap,\r\n transformationMatrix: new Matrix(),\r\n ratio: originalBitmap.width / originalBitmap.height,\r\n };\r\n this._trackedImages[idx] = imageObject;\r\n this.onTrackableImageFoundObservable.notifyObservers(imageObject);\r\n }\r\n }\r\n\r\n this._trackableScoreStatus = imageScores.length > 0 ? ImageTrackingScoreStatus.Received : ImageTrackingScoreStatus.NotReceived;\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRImageTracking.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRImageTracking(xrSessionManager, options);\r\n },\r\n WebXRImageTracking.Version,\r\n false\r\n);\r\n"]}
1
+ {"version":3,"file":"WebXRImageTracking.js","sourceRoot":"","sources":["../../../../../../lts/core/generated/XR/features/WebXRImageTracking.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { Matrix } from \"../../Maths/math.vector\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Tools } from \"../../Misc/tools\";\r\n\r\n/**\r\n * Options interface for the background remover plugin\r\n */\r\nexport interface IWebXRImageTrackingOptions {\r\n /**\r\n * A required array with images to track\r\n */\r\n images: {\r\n /**\r\n * The source of the image. can be a URL or an image bitmap\r\n */\r\n src: string | ImageBitmap;\r\n /**\r\n * The estimated width in the real world (in meters)\r\n */\r\n estimatedRealWorldWidth: number; // In meters!\r\n }[];\r\n}\r\n\r\n/**\r\n * An object representing an image tracked by the system\r\n */\r\nexport interface IWebXRTrackedImage {\r\n /**\r\n * The ID of this image (which is the same as the position in the array that was used to initialize the feature)\r\n */\r\n id: number;\r\n /**\r\n * Is the transformation provided emulated. If it is, the system \"guesses\" its real position. Otherwise it can be considered as exact position.\r\n */\r\n emulated?: boolean;\r\n /**\r\n * Just in case it is needed - the image bitmap that is being tracked\r\n */\r\n originalBitmap: ImageBitmap;\r\n /**\r\n * The native XR result image tracking result, untouched\r\n */\r\n xrTrackingResult?: XRImageTrackingResult;\r\n /**\r\n * Width in real world (meters)\r\n */\r\n realWorldWidth?: number;\r\n /**\r\n * A transformation matrix of this current image in the current reference space.\r\n */\r\n transformationMatrix: Matrix;\r\n /**\r\n * The width/height ratio of this image. can be used to calculate the size of the detected object/image\r\n */\r\n ratio?: number;\r\n}\r\n\r\n/**\r\n * Enum that describes the state of the image trackability score status for this session.\r\n */\r\nenum ImageTrackingScoreStatus {\r\n // AR Session has not yet assessed image trackability scores.\r\n NotReceived,\r\n // A request to retrieve trackability scores has been sent, but no response has been received.\r\n Waiting,\r\n // Image trackability scores have been received for this session\r\n Received,\r\n}\r\n\r\n/**\r\n * Image tracking for immersive AR sessions.\r\n * Providing a list of images and their estimated widths will enable tracking those images in the real world.\r\n */\r\nexport class WebXRImageTracking extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.IMAGE_TRACKING;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /**\r\n * This will be triggered if the underlying system deems an image untrackable.\r\n * The index is the index of the image from the array used to initialize the feature.\r\n */\r\n public onUntrackableImageFoundObservable: Observable<number> = new Observable();\r\n /**\r\n * An image was deemed trackable, and the system will start tracking it.\r\n */\r\n public onTrackableImageFoundObservable: Observable<IWebXRTrackedImage> = new Observable();\r\n /**\r\n * The image was found and its state was updated.\r\n */\r\n public onTrackedImageUpdatedObservable: Observable<IWebXRTrackedImage> = new Observable();\r\n\r\n private _trackableScoreStatus: ImageTrackingScoreStatus = ImageTrackingScoreStatus.NotReceived;\r\n private _trackedImages: IWebXRTrackedImage[] = [];\r\n\r\n private _originalTrackingRequest: XRTrackedImageInit[];\r\n\r\n /**\r\n * constructs the image tracking feature\r\n * @param _xrSessionManager the session manager for this module\r\n * @param options read-only options to be used in this module\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /**\r\n * read-only options to be used in this module\r\n */\r\n public readonly options: IWebXRImageTrackingOptions\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"image-tracking\";\r\n }\r\n\r\n /**\r\n * attach this feature\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public attach(): boolean {\r\n return super.attach();\r\n }\r\n\r\n /**\r\n * detach this feature.\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public detach(): boolean {\r\n return super.detach();\r\n }\r\n\r\n /**\r\n * Get a tracked image by its ID.\r\n *\r\n * @param id the id of the image to load (position in the init array)\r\n * @returns a trackable image, if exists in this location\r\n */\r\n public getTrackedImageById(id: number): Nullable<IWebXRTrackedImage> {\r\n return this._trackedImages[id] || null;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public dispose(): void {\r\n super.dispose();\r\n this._trackedImages.forEach((trackedImage) => {\r\n trackedImage.originalBitmap.close();\r\n });\r\n this._trackedImages.length = 0;\r\n this.onTrackableImageFoundObservable.clear();\r\n this.onUntrackableImageFoundObservable.clear();\r\n this.onTrackedImageUpdatedObservable.clear();\r\n }\r\n\r\n /**\r\n * Extends the session init object if needed\r\n * @returns augmentation object fo the xr session init object.\r\n */\r\n public async getXRSessionInitExtension(): Promise<Partial<XRSessionInit>> {\r\n if (!this.options.images || !this.options.images.length) {\r\n return {};\r\n }\r\n const promises = this.options.images.map((image) => {\r\n if (typeof image.src === \"string\") {\r\n return this._xrSessionManager.scene.getEngine()._createImageBitmapFromSource(image.src);\r\n } else {\r\n return Promise.resolve(image.src); // resolve is probably unneeded\r\n }\r\n });\r\n\r\n try {\r\n const images = await Promise.all(promises);\r\n\r\n this._originalTrackingRequest = images.map((image, idx) => {\r\n return {\r\n image,\r\n widthInMeters: this.options.images[idx].estimatedRealWorldWidth,\r\n };\r\n });\r\n\r\n return {\r\n trackedImages: this._originalTrackingRequest,\r\n };\r\n } catch (ex) {\r\n Tools.Error(\"Error loading images for tracking, WebXRImageTracking disabled for this session.\");\r\n return {};\r\n }\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame) {\r\n if (!_xrFrame.getImageTrackingResults || this._trackableScoreStatus === ImageTrackingScoreStatus.Waiting) {\r\n return;\r\n }\r\n\r\n // Image tracking scores may be generated a few frames after the XR Session initializes.\r\n // If we haven't received scores yet, then kick off the task to check scores and return immediately.\r\n if (this._trackableScoreStatus === ImageTrackingScoreStatus.NotReceived) {\r\n this._checkScoresAsync();\r\n return;\r\n }\r\n\r\n const imageTrackedResults = _xrFrame.getImageTrackingResults();\r\n for (const result of imageTrackedResults) {\r\n let changed = false;\r\n const imageIndex = result.index;\r\n\r\n const imageObject = this._trackedImages[imageIndex];\r\n if (!imageObject) {\r\n // something went wrong!\r\n continue;\r\n }\r\n\r\n imageObject.xrTrackingResult = result;\r\n if (imageObject.realWorldWidth !== result.measuredWidthInMeters) {\r\n imageObject.realWorldWidth = result.measuredWidthInMeters;\r\n changed = true;\r\n }\r\n\r\n // Get the pose of the image relative to a reference space.\r\n const pose = _xrFrame.getPose(result.imageSpace, this._xrSessionManager.referenceSpace);\r\n\r\n if (pose) {\r\n const mat = imageObject.transformationMatrix;\r\n Matrix.FromArrayToRef(pose.transform.matrix, 0, mat);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n mat.toggleModelMatrixHandInPlace();\r\n }\r\n changed = true;\r\n }\r\n\r\n const state = result.trackingState;\r\n const emulated = state === \"emulated\";\r\n\r\n if (imageObject.emulated !== emulated) {\r\n imageObject.emulated = emulated;\r\n changed = true;\r\n }\r\n if (changed) {\r\n this.onTrackedImageUpdatedObservable.notifyObservers(imageObject);\r\n }\r\n }\r\n }\r\n\r\n private async _checkScoresAsync(): Promise<void> {\r\n if (!this._xrSessionManager.session.getTrackedImageScores || this._trackableScoreStatus !== ImageTrackingScoreStatus.NotReceived) {\r\n return;\r\n }\r\n\r\n this._trackableScoreStatus = ImageTrackingScoreStatus.Waiting;\r\n const imageScores = await this._xrSessionManager.session.getTrackedImageScores();\r\n if (!imageScores || imageScores.length === 0) {\r\n this._trackableScoreStatus = ImageTrackingScoreStatus.NotReceived;\r\n return;\r\n }\r\n\r\n // check the scores for all\r\n for (let idx = 0; idx < imageScores.length; ++idx) {\r\n if (imageScores[idx] == \"untrackable\") {\r\n this.onUntrackableImageFoundObservable.notifyObservers(idx);\r\n } else {\r\n const originalBitmap = this._originalTrackingRequest[idx].image;\r\n const imageObject: IWebXRTrackedImage = {\r\n id: idx,\r\n originalBitmap,\r\n transformationMatrix: new Matrix(),\r\n ratio: originalBitmap.width / originalBitmap.height,\r\n };\r\n this._trackedImages[idx] = imageObject;\r\n this.onTrackableImageFoundObservable.notifyObservers(imageObject);\r\n }\r\n }\r\n\r\n this._trackableScoreStatus = imageScores.length > 0 ? ImageTrackingScoreStatus.Received : ImageTrackingScoreStatus.NotReceived;\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRImageTracking.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRImageTracking(xrSessionManager, options);\r\n },\r\n WebXRImageTracking.Version,\r\n false\r\n);\r\n"]}
@@ -1,6 +1,7 @@
1
1
  /** @hidden */
2
2
  interface INativeXRFrame extends XRFrame {
3
3
  getPoseData: (space: XRSpace, baseSpace: XRReferenceSpace, vectorBuffer: ArrayBuffer, matrixBuffer: ArrayBuffer) => XRPose;
4
+ _imageTrackingResults?: XRImageTrackingResult[];
4
5
  }
5
6
  /** @hidden */
6
7
  export declare class NativeXRFrame implements XRFrame {
@@ -23,6 +24,6 @@ export declare class NativeXRFrame implements XRFrame {
23
24
  readonly fillJointRadii: any;
24
25
  readonly getLightEstimate: () => never;
25
26
  get featurePointCloud(): number[] | undefined;
26
- readonly getImageTrackingResults: any;
27
+ readonly getImageTrackingResults: () => XRImageTrackingResult[];
27
28
  }
28
29
  export {};
@@ -2,6 +2,7 @@ import { RegisterNativeTypeAsync } from "../../Engines/nativeEngine.js";
2
2
  /** @hidden */
3
3
  var NativeXRFrame = /** @class */ (function () {
4
4
  function NativeXRFrame(_nativeImpl) {
5
+ var _this = this;
5
6
  this._nativeImpl = _nativeImpl;
6
7
  this._xrTransform = new XRRigidTransform();
7
8
  this._xrPose = {
@@ -22,7 +23,10 @@ var NativeXRFrame = /** @class */ (function () {
22
23
  this.getLightEstimate = function () {
23
24
  throw new Error("XRFrame.getLightEstimate not supported on native.");
24
25
  };
25
- this.getImageTrackingResults = this._nativeImpl.getImageTrackingResults.bind(this._nativeImpl);
26
+ this.getImageTrackingResults = function () {
27
+ var _a;
28
+ return (_a = _this._nativeImpl._imageTrackingResults) !== null && _a !== void 0 ? _a : [];
29
+ };
26
30
  }
27
31
  Object.defineProperty(NativeXRFrame.prototype, "session", {
28
32
  get: function () {