@babylonjs/viewer 7.41.0 → 7.41.1-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/photoStudio.env +0 -0
- package/dist/babylon-viewer.esm.js +2 -0
- package/dist/babylon-viewer.esm.js.map +1 -0
- package/dist/babylon-viewer.esm.min.js +2 -0
- package/dist/babylon-viewer.esm.min.js.map +1 -0
- package/dist/chunks/EXT_lights_ies-BS2USlck.esm.min.js +2 -0
- package/dist/chunks/EXT_lights_ies-BS2USlck.esm.min.js.map +1 -0
- package/dist/chunks/EXT_lights_ies-C-joQ5O4.esm.js +84 -0
- package/dist/chunks/EXT_lights_ies-C-joQ5O4.esm.js.map +1 -0
- package/dist/chunks/EXT_lights_image_based-C3wbbb5Z.esm.js +171 -0
- package/dist/chunks/EXT_lights_image_based-C3wbbb5Z.esm.js.map +1 -0
- package/dist/chunks/EXT_lights_image_based-DDdRDnM2.esm.min.js +2 -0
- package/dist/chunks/EXT_lights_image_based-DDdRDnM2.esm.min.js.map +1 -0
- package/dist/chunks/EXT_mesh_gpu_instancing-AXAnRQN7.esm.js +86 -0
- package/dist/chunks/EXT_mesh_gpu_instancing-AXAnRQN7.esm.js.map +1 -0
- package/dist/chunks/EXT_mesh_gpu_instancing-BcjPo6uC.esm.min.js +2 -0
- package/dist/chunks/EXT_mesh_gpu_instancing-BcjPo6uC.esm.min.js.map +1 -0
- package/dist/chunks/EXT_meshopt_compression-DlUkQB2P.esm.js +134 -0
- package/dist/chunks/EXT_meshopt_compression-DlUkQB2P.esm.js.map +1 -0
- package/dist/chunks/EXT_meshopt_compression-yJ4OpORd.esm.min.js +2 -0
- package/dist/chunks/EXT_meshopt_compression-yJ4OpORd.esm.min.js.map +1 -0
- package/dist/chunks/EXT_texture_avif-BQWbvJfK.esm.min.js +2 -0
- package/dist/chunks/EXT_texture_avif-BQWbvJfK.esm.min.js.map +1 -0
- package/dist/chunks/EXT_texture_avif-C0pGpnGv.esm.js +44 -0
- package/dist/chunks/EXT_texture_avif-C0pGpnGv.esm.js.map +1 -0
- package/dist/chunks/EXT_texture_webp-Dd7Uqtmh.esm.min.js +2 -0
- package/dist/chunks/EXT_texture_webp-Dd7Uqtmh.esm.min.js.map +1 -0
- package/dist/chunks/EXT_texture_webp-DehlrnW-.esm.js +43 -0
- package/dist/chunks/EXT_texture_webp-DehlrnW-.esm.js.map +1 -0
- package/dist/chunks/ExtrasAsMetadata-C5NMuDj4.esm.js +64 -0
- package/dist/chunks/ExtrasAsMetadata-C5NMuDj4.esm.js.map +1 -0
- package/dist/chunks/ExtrasAsMetadata-Cp3LHdoG.esm.min.js +2 -0
- package/dist/chunks/ExtrasAsMetadata-Cp3LHdoG.esm.min.js.map +1 -0
- package/dist/chunks/KHR_animation_pointer-DEBOwDXh.esm.min.js +2 -0
- package/dist/chunks/KHR_animation_pointer-DEBOwDXh.esm.min.js.map +1 -0
- package/dist/chunks/KHR_animation_pointer-Dx1OeG2b.esm.js +352 -0
- package/dist/chunks/KHR_animation_pointer-Dx1OeG2b.esm.js.map +1 -0
- package/dist/chunks/KHR_draco_mesh_compression-Ch0QOlBL.esm.min.js +2 -0
- package/dist/chunks/KHR_draco_mesh_compression-Ch0QOlBL.esm.min.js.map +1 -0
- package/dist/chunks/KHR_draco_mesh_compression-D59SFLyo.esm.js +610 -0
- package/dist/chunks/KHR_draco_mesh_compression-D59SFLyo.esm.js.map +1 -0
- package/dist/chunks/KHR_interactivity-Blj_9jts.esm.min.js +2 -0
- package/dist/chunks/KHR_interactivity-Blj_9jts.esm.min.js.map +1 -0
- package/dist/chunks/KHR_interactivity-CR0LYUa7.esm.js +4033 -0
- package/dist/chunks/KHR_interactivity-CR0LYUa7.esm.js.map +1 -0
- package/dist/chunks/KHR_lights_punctual--w0a62AP.esm.js +581 -0
- package/dist/chunks/KHR_lights_punctual--w0a62AP.esm.js.map +1 -0
- package/dist/chunks/KHR_lights_punctual-BojffBbG.esm.min.js +2 -0
- package/dist/chunks/KHR_lights_punctual-BojffBbG.esm.min.js.map +1 -0
- package/dist/chunks/KHR_materials_anisotropy-BPtHWkOQ.esm.js +65 -0
- package/dist/chunks/KHR_materials_anisotropy-BPtHWkOQ.esm.js.map +1 -0
- package/dist/chunks/KHR_materials_anisotropy-DU5_bnCL.esm.min.js +2 -0
- package/dist/chunks/KHR_materials_anisotropy-DU5_bnCL.esm.min.js.map +1 -0
- package/dist/chunks/KHR_materials_clearcoat-BBuRlPhc.esm.min.js +2 -0
- package/dist/chunks/KHR_materials_clearcoat-BBuRlPhc.esm.min.js.map +1 -0
- package/dist/chunks/KHR_materials_clearcoat-Eg0xbuWN.esm.js +96 -0
- package/dist/chunks/KHR_materials_clearcoat-Eg0xbuWN.esm.js.map +1 -0
- package/dist/chunks/KHR_materials_diffuse_transmission-Bkzk60Y5.esm.min.js +2 -0
- package/dist/chunks/KHR_materials_diffuse_transmission-Bkzk60Y5.esm.min.js.map +1 -0
- package/dist/chunks/KHR_materials_diffuse_transmission-C3DaLgRY.esm.js +97 -0
- package/dist/chunks/KHR_materials_diffuse_transmission-C3DaLgRY.esm.js.map +1 -0
- package/dist/chunks/KHR_materials_dispersion-DL_XFhxj.esm.js +62 -0
- package/dist/chunks/KHR_materials_dispersion-DL_XFhxj.esm.js.map +1 -0
- package/dist/chunks/KHR_materials_dispersion-DbMQPBgM.esm.min.js +2 -0
- package/dist/chunks/KHR_materials_dispersion-DbMQPBgM.esm.min.js.map +1 -0
- package/dist/chunks/KHR_materials_emissive_strength-BuHyjtBD.esm.js +55 -0
- package/dist/chunks/KHR_materials_emissive_strength-BuHyjtBD.esm.js.map +1 -0
- package/dist/chunks/KHR_materials_emissive_strength-Djlr_ul3.esm.min.js +2 -0
- package/dist/chunks/KHR_materials_emissive_strength-Djlr_ul3.esm.min.js.map +1 -0
- package/dist/chunks/KHR_materials_ior-BIe6qBOo.esm.js +64 -0
- package/dist/chunks/KHR_materials_ior-BIe6qBOo.esm.js.map +1 -0
- package/dist/chunks/KHR_materials_ior-DOfaAmNY.esm.min.js +2 -0
- package/dist/chunks/KHR_materials_ior-DOfaAmNY.esm.min.js.map +1 -0
- package/dist/chunks/KHR_materials_iridescence-BgElZgUu.esm.js +72 -0
- package/dist/chunks/KHR_materials_iridescence-BgElZgUu.esm.js.map +1 -0
- package/dist/chunks/KHR_materials_iridescence-lUeo07SZ.esm.min.js +2 -0
- package/dist/chunks/KHR_materials_iridescence-lUeo07SZ.esm.min.js.map +1 -0
- package/dist/chunks/KHR_materials_pbrSpecularGlossiness-9ShQyhJ6.esm.min.js +2 -0
- package/dist/chunks/KHR_materials_pbrSpecularGlossiness-9ShQyhJ6.esm.min.js.map +1 -0
- package/dist/chunks/KHR_materials_pbrSpecularGlossiness-DE5LjLg6.esm.js +81 -0
- package/dist/chunks/KHR_materials_pbrSpecularGlossiness-DE5LjLg6.esm.js.map +1 -0
- package/dist/chunks/KHR_materials_sheen-BfZe6ZFu.esm.js +85 -0
- package/dist/chunks/KHR_materials_sheen-BfZe6ZFu.esm.js.map +1 -0
- package/dist/chunks/KHR_materials_sheen-OWjuK2V4.esm.min.js +2 -0
- package/dist/chunks/KHR_materials_sheen-OWjuK2V4.esm.min.js.map +1 -0
- package/dist/chunks/KHR_materials_specular-dowPxbW3.esm.js +75 -0
- package/dist/chunks/KHR_materials_specular-dowPxbW3.esm.js.map +1 -0
- package/dist/chunks/KHR_materials_specular-nWeBZu0R.esm.min.js +2 -0
- package/dist/chunks/KHR_materials_specular-nWeBZu0R.esm.min.js.map +1 -0
- package/dist/chunks/KHR_materials_transmission-BPNQkK0O.esm.min.js +2 -0
- package/dist/chunks/KHR_materials_transmission-BPNQkK0O.esm.min.js.map +1 -0
- package/dist/chunks/KHR_materials_transmission-CHr_yLLX.esm.js +307 -0
- package/dist/chunks/KHR_materials_transmission-CHr_yLLX.esm.js.map +1 -0
- package/dist/chunks/KHR_materials_unlit-BYXpcsdj.esm.min.js +2 -0
- package/dist/chunks/KHR_materials_unlit-BYXpcsdj.esm.min.js.map +1 -0
- package/dist/chunks/KHR_materials_unlit-Cr7YsDHT.esm.js +74 -0
- package/dist/chunks/KHR_materials_unlit-Cr7YsDHT.esm.js.map +1 -0
- package/dist/chunks/KHR_materials_variants-BCVX3sJa.esm.js +262 -0
- package/dist/chunks/KHR_materials_variants-BCVX3sJa.esm.js.map +1 -0
- package/dist/chunks/KHR_materials_variants-BXzl6KpJ.esm.min.js +2 -0
- package/dist/chunks/KHR_materials_variants-BXzl6KpJ.esm.min.js.map +1 -0
- package/dist/chunks/KHR_materials_volume-BD9KEaJz.esm.min.js +2 -0
- package/dist/chunks/KHR_materials_volume-BD9KEaJz.esm.min.js.map +1 -0
- package/dist/chunks/KHR_materials_volume-DrqGUGW6.esm.js +87 -0
- package/dist/chunks/KHR_materials_volume-DrqGUGW6.esm.js.map +1 -0
- package/dist/chunks/KHR_mesh_quantization-Dg22auJA.esm.min.js +2 -0
- package/dist/chunks/KHR_mesh_quantization-Dg22auJA.esm.min.js.map +1 -0
- package/dist/chunks/KHR_mesh_quantization-hvxpvTbe.esm.js +26 -0
- package/dist/chunks/KHR_mesh_quantization-hvxpvTbe.esm.js.map +1 -0
- package/dist/chunks/KHR_node_hoverability-BDiqFmBB.esm.js +39 -0
- package/dist/chunks/KHR_node_hoverability-BDiqFmBB.esm.js.map +1 -0
- package/dist/chunks/KHR_node_hoverability-CumkOtZM.esm.min.js +2 -0
- package/dist/chunks/KHR_node_hoverability-CumkOtZM.esm.min.js.map +1 -0
- package/dist/chunks/KHR_node_visibility-BKEa-Yfj.esm.min.js +2 -0
- package/dist/chunks/KHR_node_visibility-BKEa-Yfj.esm.min.js.map +1 -0
- package/dist/chunks/KHR_node_visibility-K0fsD4Vv.esm.js +46 -0
- package/dist/chunks/KHR_node_visibility-K0fsD4Vv.esm.js.map +1 -0
- package/dist/chunks/KHR_texture_basisu-8YVY1pKo.esm.js +43 -0
- package/dist/chunks/KHR_texture_basisu-8YVY1pKo.esm.js.map +1 -0
- package/dist/chunks/KHR_texture_basisu-BM__NeSW.esm.min.js +2 -0
- package/dist/chunks/KHR_texture_basisu-BM__NeSW.esm.min.js.map +1 -0
- package/dist/chunks/KHR_texture_transform--qxpdvRw.esm.js +63 -0
- package/dist/chunks/KHR_texture_transform--qxpdvRw.esm.js.map +1 -0
- package/dist/chunks/KHR_texture_transform-C0MO-oJp.esm.min.js +2 -0
- package/dist/chunks/KHR_texture_transform-C0MO-oJp.esm.min.js.map +1 -0
- package/dist/chunks/KHR_xmp_json_ld-D9FpHvJo.esm.js +51 -0
- package/dist/chunks/KHR_xmp_json_ld-D9FpHvJo.esm.js.map +1 -0
- package/dist/chunks/KHR_xmp_json_ld-DeXPWWQE.esm.min.js +2 -0
- package/dist/chunks/KHR_xmp_json_ld-DeXPWWQE.esm.min.js.map +1 -0
- package/dist/chunks/MSFT_audio_emitter-BbICSwFH.esm.min.js +2 -0
- package/dist/chunks/MSFT_audio_emitter-BbICSwFH.esm.min.js.map +1 -0
- package/dist/chunks/MSFT_audio_emitter-Dd5lbfUc.esm.js +2201 -0
- package/dist/chunks/MSFT_audio_emitter-Dd5lbfUc.esm.js.map +1 -0
- package/dist/chunks/MSFT_lod-B0zrRF3s.esm.js +337 -0
- package/dist/chunks/MSFT_lod-B0zrRF3s.esm.js.map +1 -0
- package/dist/chunks/MSFT_lod-Bd4znUfD.esm.min.js +2 -0
- package/dist/chunks/MSFT_lod-Bd4znUfD.esm.min.js.map +1 -0
- package/dist/chunks/MSFT_minecraftMesh-CdIpMgsb.esm.min.js +2 -0
- package/dist/chunks/MSFT_minecraftMesh-CdIpMgsb.esm.min.js.map +1 -0
- package/dist/chunks/MSFT_minecraftMesh-WFc8m_Ka.esm.js +46 -0
- package/dist/chunks/MSFT_minecraftMesh-WFc8m_Ka.esm.js.map +1 -0
- package/dist/chunks/MSFT_sRGBFactors-CTbtGna8.esm.js +47 -0
- package/dist/chunks/MSFT_sRGBFactors-CTbtGna8.esm.js.map +1 -0
- package/dist/chunks/MSFT_sRGBFactors-yTSoBQJx.esm.min.js +2 -0
- package/dist/chunks/MSFT_sRGBFactors-yTSoBQJx.esm.min.js.map +1 -0
- package/dist/chunks/animationGroup-8TJDgymS.esm.js +2482 -0
- package/dist/chunks/animationGroup-8TJDgymS.esm.js.map +1 -0
- package/dist/chunks/animationGroup-toXtd3a1.esm.min.js +2 -0
- package/dist/chunks/animationGroup-toXtd3a1.esm.min.js.map +1 -0
- package/dist/chunks/assetContainer-7pMDUaac.esm.min.js +2 -0
- package/dist/chunks/assetContainer-7pMDUaac.esm.min.js.map +1 -0
- package/dist/chunks/assetContainer-DYzO0AbX.esm.js +1720 -0
- package/dist/chunks/assetContainer-DYzO0AbX.esm.js.map +1 -0
- package/dist/chunks/audioEngine-Kz4HSEXd.esm.min.js +2 -0
- package/dist/chunks/audioEngine-Kz4HSEXd.esm.min.js.map +1 -0
- package/dist/chunks/audioEngine-peiGqjr6.esm.js +305 -0
- package/dist/chunks/audioEngine-peiGqjr6.esm.js.map +1 -0
- package/dist/chunks/bakedVertexAnimation-BZvcL01J.esm.min.js +2 -0
- package/dist/chunks/bakedVertexAnimation-BZvcL01J.esm.min.js.map +1 -0
- package/dist/chunks/bakedVertexAnimation-CPflSjER.esm.js +114 -0
- package/dist/chunks/bakedVertexAnimation-CPflSjER.esm.js.map +1 -0
- package/dist/chunks/basisTextureLoader-CR0XhSAg.esm.js +600 -0
- package/dist/chunks/basisTextureLoader-CR0XhSAg.esm.js.map +1 -0
- package/dist/chunks/basisTextureLoader-DVJdcB62.esm.min.js +2 -0
- package/dist/chunks/basisTextureLoader-DVJdcB62.esm.min.js.map +1 -0
- package/dist/chunks/dds-6EdM5O6M.esm.js +540 -0
- package/dist/chunks/dds-6EdM5O6M.esm.js.map +1 -0
- package/dist/chunks/dds-DVX_K9B3.esm.min.js +2 -0
- package/dist/chunks/dds-DVX_K9B3.esm.min.js.map +1 -0
- package/dist/chunks/ddsTextureLoader-BAK7Ib2Z.esm.min.js +2 -0
- package/dist/chunks/ddsTextureLoader-BAK7Ib2Z.esm.min.js.map +1 -0
- package/dist/chunks/ddsTextureLoader-_nktVxwZ.esm.js +88 -0
- package/dist/chunks/ddsTextureLoader-_nktVxwZ.esm.js.map +1 -0
- package/dist/chunks/decalFragment-C_Cews3-.esm.js +18 -0
- package/dist/chunks/decalFragment-C_Cews3-.esm.js.map +1 -0
- package/dist/chunks/decalFragment-Dmj88EX9.esm.min.js +2 -0
- package/dist/chunks/decalFragment-Dmj88EX9.esm.min.js.map +1 -0
- package/dist/chunks/default.fragment-Bv_nR7po.esm.min.js +2 -0
- package/dist/chunks/default.fragment-Bv_nR7po.esm.min.js.map +1 -0
- package/dist/chunks/default.fragment-CkZQyJVM.esm.min.js +2 -0
- package/dist/chunks/default.fragment-CkZQyJVM.esm.min.js.map +1 -0
- package/dist/chunks/default.fragment-CyFHDykY.esm.js +446 -0
- package/dist/chunks/default.fragment-CyFHDykY.esm.js.map +1 -0
- package/dist/chunks/default.fragment-ej-2z5tS.esm.js +515 -0
- package/dist/chunks/default.fragment-ej-2z5tS.esm.js.map +1 -0
- package/dist/chunks/default.vertex-16mVOFgT.esm.js +211 -0
- package/dist/chunks/default.vertex-16mVOFgT.esm.js.map +1 -0
- package/dist/chunks/default.vertex-D--q2At3.esm.min.js +2 -0
- package/dist/chunks/default.vertex-D--q2At3.esm.min.js.map +1 -0
- package/dist/chunks/default.vertex-DDlgZTrR.esm.js +190 -0
- package/dist/chunks/default.vertex-DDlgZTrR.esm.js.map +1 -0
- package/dist/chunks/default.vertex-_jqs3KiZ.esm.min.js +2 -0
- package/dist/chunks/default.vertex-_jqs3KiZ.esm.min.js.map +1 -0
- package/dist/chunks/defaultUboDeclaration-8YG0iNg8.esm.js +15 -0
- package/dist/chunks/defaultUboDeclaration-8YG0iNg8.esm.js.map +1 -0
- package/dist/chunks/defaultUboDeclaration-BoBSRTbi.esm.js +13 -0
- package/dist/chunks/defaultUboDeclaration-BoBSRTbi.esm.js.map +1 -0
- package/dist/chunks/defaultUboDeclaration-Dt_5vo1d.esm.min.js +2 -0
- package/dist/chunks/defaultUboDeclaration-Dt_5vo1d.esm.min.js.map +1 -0
- package/dist/chunks/defaultUboDeclaration-R6gGjkAM.esm.min.js +2 -0
- package/dist/chunks/defaultUboDeclaration-R6gGjkAM.esm.min.js.map +1 -0
- package/dist/chunks/drawWrapper.functions-CKg3_9x4.esm.js +11 -0
- package/dist/chunks/drawWrapper.functions-CKg3_9x4.esm.js.map +1 -0
- package/dist/chunks/drawWrapper.functions-ng7lvueZ.esm.min.js +2 -0
- package/dist/chunks/drawWrapper.functions-ng7lvueZ.esm.min.js.map +1 -0
- package/dist/chunks/dumpTools-Bhux0wvM.esm.js +200 -0
- package/dist/chunks/dumpTools-Bhux0wvM.esm.js.map +1 -0
- package/dist/chunks/dumpTools-CHCb2UkY.esm.min.js +2 -0
- package/dist/chunks/dumpTools-CHCb2UkY.esm.min.js.map +1 -0
- package/dist/chunks/engine-DF_zE4qj.esm.js +2213 -0
- package/dist/chunks/engine-DF_zE4qj.esm.js.map +1 -0
- package/dist/chunks/engine-DVmdDcyP.esm.min.js +2 -0
- package/dist/chunks/engine-DVmdDcyP.esm.min.js.map +1 -0
- package/dist/chunks/engine.common-CvOmoKru.esm.js +1162 -0
- package/dist/chunks/engine.common-CvOmoKru.esm.js.map +1 -0
- package/dist/chunks/engine.common-DpTzktQJ.esm.min.js +2 -0
- package/dist/chunks/engine.common-DpTzktQJ.esm.min.js.map +1 -0
- package/dist/chunks/envTextureLoader-4YxGm-Px.esm.js +64 -0
- package/dist/chunks/envTextureLoader-4YxGm-Px.esm.js.map +1 -0
- package/dist/chunks/envTextureLoader-DMQui088.esm.min.js +2 -0
- package/dist/chunks/envTextureLoader-DMQui088.esm.min.js.map +1 -0
- package/dist/chunks/environmentTextureTools-BPGrTBPI.esm.min.js +2 -0
- package/dist/chunks/environmentTextureTools-BPGrTBPI.esm.min.js.map +1 -0
- package/dist/chunks/environmentTextureTools-DvkpsqkN.esm.js +382 -0
- package/dist/chunks/environmentTextureTools-DvkpsqkN.esm.js.map +1 -0
- package/dist/chunks/exrTextureLoader-BRkB54sO.esm.js +1683 -0
- package/dist/chunks/exrTextureLoader-BRkB54sO.esm.js.map +1 -0
- package/dist/chunks/exrTextureLoader-BtN7_zst.esm.min.js +2 -0
- package/dist/chunks/exrTextureLoader-BtN7_zst.esm.min.js.map +1 -0
- package/dist/chunks/fogFragment-BrGGFaiu.esm.js +101 -0
- package/dist/chunks/fogFragment-BrGGFaiu.esm.js.map +1 -0
- package/dist/chunks/fogFragment-ByOwwQur.esm.min.js +2 -0
- package/dist/chunks/fogFragment-ByOwwQur.esm.min.js.map +1 -0
- package/dist/chunks/fogFragment-Chod24nu.esm.min.js +2 -0
- package/dist/chunks/fogFragment-Chod24nu.esm.min.js.map +1 -0
- package/dist/chunks/fogFragment-gZfybCpt.esm.js +102 -0
- package/dist/chunks/fogFragment-gZfybCpt.esm.js.map +1 -0
- package/dist/chunks/fresnelFunction-BdEia8ob.esm.min.js +2 -0
- package/dist/chunks/fresnelFunction-BdEia8ob.esm.min.js.map +1 -0
- package/dist/chunks/fresnelFunction-DBlxfmri.esm.js +12 -0
- package/dist/chunks/fresnelFunction-DBlxfmri.esm.js.map +1 -0
- package/dist/chunks/glTFLoader-D4C1IGb3.esm.min.js +2 -0
- package/dist/chunks/glTFLoader-D4C1IGb3.esm.min.js.map +1 -0
- package/dist/chunks/glTFLoader-fUFiWvYb.esm.js +7693 -0
- package/dist/chunks/glTFLoader-fUFiWvYb.esm.js.map +1 -0
- package/dist/chunks/glTFLoaderAnimation-BB_Vw079.esm.min.js +2 -0
- package/dist/chunks/glTFLoaderAnimation-BB_Vw079.esm.min.js.map +1 -0
- package/dist/chunks/glTFLoaderAnimation-CttmY50U.esm.js +77 -0
- package/dist/chunks/glTFLoaderAnimation-CttmY50U.esm.js.map +1 -0
- package/dist/chunks/gltfPathToObjectConverter-Dyt_Y9jE.esm.min.js +2 -0
- package/dist/chunks/gltfPathToObjectConverter-Dyt_Y9jE.esm.min.js.map +1 -0
- package/dist/chunks/gltfPathToObjectConverter-GcUmfOyo.esm.js +67 -0
- package/dist/chunks/gltfPathToObjectConverter-GcUmfOyo.esm.js.map +1 -0
- package/dist/chunks/harmonicsFunctions-B0Rp1hEo.esm.min.js +2 -0
- package/dist/chunks/harmonicsFunctions-B0Rp1hEo.esm.min.js.map +1 -0
- package/dist/chunks/harmonicsFunctions-Cca_z552.esm.js +34 -0
- package/dist/chunks/harmonicsFunctions-Cca_z552.esm.js.map +1 -0
- package/dist/chunks/harmonicsFunctions-D4ID83NC.esm.min.js +2 -0
- package/dist/chunks/harmonicsFunctions-D4ID83NC.esm.min.js.map +1 -0
- package/dist/chunks/harmonicsFunctions-HJ5dbl0w.esm.js +35 -0
- package/dist/chunks/harmonicsFunctions-HJ5dbl0w.esm.js.map +1 -0
- package/dist/chunks/hdrTextureLoader-C3kqy6YV.esm.js +253 -0
- package/dist/chunks/hdrTextureLoader-C3kqy6YV.esm.js.map +1 -0
- package/dist/chunks/hdrTextureLoader-Dhlluz4z.esm.min.js +2 -0
- package/dist/chunks/hdrTextureLoader-Dhlluz4z.esm.min.js.map +1 -0
- package/dist/chunks/helperFunctions-BJotVqUd.esm.min.js +2 -0
- package/dist/chunks/helperFunctions-BJotVqUd.esm.min.js.map +1 -0
- package/dist/chunks/helperFunctions-C66wRWtu.esm.js +110 -0
- package/dist/chunks/helperFunctions-C66wRWtu.esm.js.map +1 -0
- package/dist/chunks/helperFunctions-DwEZ9rqh.esm.min.js +2 -0
- package/dist/chunks/helperFunctions-DwEZ9rqh.esm.min.js.map +1 -0
- package/dist/chunks/helperFunctions-gnki_9Kj.esm.js +83 -0
- package/dist/chunks/helperFunctions-gnki_9Kj.esm.js.map +1 -0
- package/dist/chunks/iesTextureLoader-QDs2Cwy5.esm.js +189 -0
- package/dist/chunks/iesTextureLoader-QDs2Cwy5.esm.js.map +1 -0
- package/dist/chunks/iesTextureLoader-pwA6Q4HK.esm.min.js +2 -0
- package/dist/chunks/iesTextureLoader-pwA6Q4HK.esm.min.js.map +1 -0
- package/dist/chunks/index-C6hXZyZb.esm.js +74889 -0
- package/dist/chunks/index-C6hXZyZb.esm.js.map +1 -0
- package/dist/chunks/index-rZVkfTE6.esm.min.js +57 -0
- package/dist/chunks/index-rZVkfTE6.esm.min.js.map +1 -0
- package/dist/chunks/ktxTextureLoader-jVu-Sj-0.esm.js +814 -0
- package/dist/chunks/ktxTextureLoader-jVu-Sj-0.esm.js.map +1 -0
- package/dist/chunks/ktxTextureLoader-zG9azrZF.esm.min.js +2 -0
- package/dist/chunks/ktxTextureLoader-zG9azrZF.esm.min.js.map +1 -0
- package/dist/chunks/logDepthDeclaration-0cA1pTvQ.esm.min.js +2 -0
- package/dist/chunks/logDepthDeclaration-0cA1pTvQ.esm.min.js.map +1 -0
- package/dist/chunks/logDepthDeclaration-CYxYhXIS.esm.js +11 -0
- package/dist/chunks/logDepthDeclaration-CYxYhXIS.esm.js.map +1 -0
- package/dist/chunks/logDepthDeclaration-D4KGxdX-.esm.min.js +2 -0
- package/dist/chunks/logDepthDeclaration-D4KGxdX-.esm.min.js.map +1 -0
- package/dist/chunks/logDepthDeclaration-DJlt2-H5.esm.js +35 -0
- package/dist/chunks/logDepthDeclaration-DJlt2-H5.esm.js.map +1 -0
- package/dist/chunks/logDepthVertex-BS2JEtXA.esm.min.js +2 -0
- package/dist/chunks/logDepthVertex-BS2JEtXA.esm.min.js.map +1 -0
- package/dist/chunks/logDepthVertex-DKPfA10X.esm.js +81 -0
- package/dist/chunks/logDepthVertex-DKPfA10X.esm.js.map +1 -0
- package/dist/chunks/logDepthVertex-ojTShW5I.esm.js +77 -0
- package/dist/chunks/logDepthVertex-ojTShW5I.esm.js.map +1 -0
- package/dist/chunks/logDepthVertex-v-0pHNc-.esm.min.js +2 -0
- package/dist/chunks/logDepthVertex-v-0pHNc-.esm.min.js.map +1 -0
- package/dist/chunks/mainUVVaryingDeclaration-BAzmbS0W.esm.min.js +2 -0
- package/dist/chunks/mainUVVaryingDeclaration-BAzmbS0W.esm.min.js.map +1 -0
- package/dist/chunks/mainUVVaryingDeclaration-Cnux1jkK.esm.js +11 -0
- package/dist/chunks/mainUVVaryingDeclaration-Cnux1jkK.esm.js.map +1 -0
- package/dist/chunks/mainUVVaryingDeclaration-CwS0hUUZ.esm.min.js +2 -0
- package/dist/chunks/mainUVVaryingDeclaration-CwS0hUUZ.esm.min.js.map +1 -0
- package/dist/chunks/mainUVVaryingDeclaration-DCawby1A.esm.js +11 -0
- package/dist/chunks/mainUVVaryingDeclaration-DCawby1A.esm.js.map +1 -0
- package/dist/chunks/mesh.vertexData.functions-B_pMCAzZ.esm.js +119 -0
- package/dist/chunks/mesh.vertexData.functions-B_pMCAzZ.esm.js.map +1 -0
- package/dist/chunks/mesh.vertexData.functions-Bo7e6Of9.esm.min.js +2 -0
- package/dist/chunks/mesh.vertexData.functions-Bo7e6Of9.esm.min.js.map +1 -0
- package/dist/chunks/meshUboDeclaration-QvH0RgeZ.esm.js +26 -0
- package/dist/chunks/meshUboDeclaration-QvH0RgeZ.esm.js.map +1 -0
- package/dist/chunks/meshUboDeclaration-g2s_cYI1.esm.min.js +2 -0
- package/dist/chunks/meshUboDeclaration-g2s_cYI1.esm.min.js.map +1 -0
- package/dist/chunks/objFileLoader-BOutXdVR.esm.min.js +2 -0
- package/dist/chunks/objFileLoader-BOutXdVR.esm.min.js.map +1 -0
- package/dist/chunks/objFileLoader-BPwrX8RK.esm.js +1338 -0
- package/dist/chunks/objFileLoader-BPwrX8RK.esm.js.map +1 -0
- package/dist/chunks/oitFragment-CmcWUhsZ.esm.js +1240 -0
- package/dist/chunks/oitFragment-CmcWUhsZ.esm.js.map +1 -0
- package/dist/chunks/oitFragment-D8XBQ6Wa.esm.js +1078 -0
- package/dist/chunks/oitFragment-D8XBQ6Wa.esm.js.map +1 -0
- package/dist/chunks/oitFragment-DgAlmoHs.esm.min.js +2 -0
- package/dist/chunks/oitFragment-DgAlmoHs.esm.min.js.map +1 -0
- package/dist/chunks/oitFragment-DpJ5xGhy.esm.min.js +2 -0
- package/dist/chunks/oitFragment-DpJ5xGhy.esm.min.js.map +1 -0
- package/dist/chunks/pass.fragment--XRaXRhU.esm.js +15 -0
- package/dist/chunks/pass.fragment--XRaXRhU.esm.js.map +1 -0
- package/dist/chunks/pass.fragment-5Q3qXxDe.esm.min.js +2 -0
- package/dist/chunks/pass.fragment-5Q3qXxDe.esm.min.js.map +1 -0
- package/dist/chunks/pass.fragment-BBLiyU_i.esm.min.js +2 -0
- package/dist/chunks/pass.fragment-BBLiyU_i.esm.min.js.map +1 -0
- package/dist/chunks/pass.fragment-DI4ZYZJe.esm.js +15 -0
- package/dist/chunks/pass.fragment-DI4ZYZJe.esm.js.map +1 -0
- package/dist/chunks/pbr.fragment-C7xQS4ZJ.esm.js +3269 -0
- package/dist/chunks/pbr.fragment-C7xQS4ZJ.esm.js.map +1 -0
- package/dist/chunks/pbr.fragment-Ddxaik8T.esm.min.js +2 -0
- package/dist/chunks/pbr.fragment-Ddxaik8T.esm.min.js.map +1 -0
- package/dist/chunks/pbr.fragment-fky04gH_.esm.js +3222 -0
- package/dist/chunks/pbr.fragment-fky04gH_.esm.js.map +1 -0
- package/dist/chunks/pbr.fragment-ya1zai4w.esm.min.js +2 -0
- package/dist/chunks/pbr.fragment-ya1zai4w.esm.min.js.map +1 -0
- package/dist/chunks/pbr.vertex-BPEYHoRM.esm.js +223 -0
- package/dist/chunks/pbr.vertex-BPEYHoRM.esm.js.map +1 -0
- package/dist/chunks/pbr.vertex-BXcMYADF.esm.js +348 -0
- package/dist/chunks/pbr.vertex-BXcMYADF.esm.js.map +1 -0
- package/dist/chunks/pbr.vertex-BjA08auU.esm.min.js +2 -0
- package/dist/chunks/pbr.vertex-BjA08auU.esm.min.js.map +1 -0
- package/dist/chunks/pbr.vertex-Cx2V3lNf.esm.min.js +2 -0
- package/dist/chunks/pbr.vertex-Cx2V3lNf.esm.min.js.map +1 -0
- package/dist/chunks/postprocess.vertex-BHpQrNSx.esm.min.js +2 -0
- package/dist/chunks/postprocess.vertex-BHpQrNSx.esm.min.js.map +1 -0
- package/dist/chunks/postprocess.vertex-DnDbk0tq.esm.js +20 -0
- package/dist/chunks/postprocess.vertex-DnDbk0tq.esm.js.map +1 -0
- package/dist/chunks/rawTexture-CWiRIto8.esm.js +191 -0
- package/dist/chunks/rawTexture-CWiRIto8.esm.js.map +1 -0
- package/dist/chunks/rawTexture-DX8V9PEj.esm.min.js +2 -0
- package/dist/chunks/rawTexture-DX8V9PEj.esm.min.js.map +1 -0
- package/dist/chunks/ray-ix7SqYNQ.esm.min.js +2 -0
- package/dist/chunks/ray-ix7SqYNQ.esm.min.js.map +1 -0
- package/dist/chunks/ray-nTZBkOil.esm.js +946 -0
- package/dist/chunks/ray-nTZBkOil.esm.js.map +1 -0
- package/dist/chunks/rgbdDecode.fragment-Be3ofvlt.esm.min.js +2 -0
- package/dist/chunks/rgbdDecode.fragment-Be3ofvlt.esm.min.js.map +1 -0
- package/dist/chunks/rgbdDecode.fragment-C05QJpT2.esm.js +13 -0
- package/dist/chunks/rgbdDecode.fragment-C05QJpT2.esm.js.map +1 -0
- package/dist/chunks/rgbdDecode.fragment-D3SYBclQ.esm.min.js +2 -0
- package/dist/chunks/rgbdDecode.fragment-D3SYBclQ.esm.min.js.map +1 -0
- package/dist/chunks/rgbdDecode.fragment-DBG6KfKF.esm.js +13 -0
- package/dist/chunks/rgbdDecode.fragment-DBG6KfKF.esm.js.map +1 -0
- package/dist/chunks/rgbdEncode.fragment-BlhtohrO.esm.js +13 -0
- package/dist/chunks/rgbdEncode.fragment-BlhtohrO.esm.js.map +1 -0
- package/dist/chunks/rgbdEncode.fragment-BmJKYw6A.esm.min.js +2 -0
- package/dist/chunks/rgbdEncode.fragment-BmJKYw6A.esm.min.js.map +1 -0
- package/dist/chunks/rgbdEncode.fragment-dr2kGjSO.esm.js +13 -0
- package/dist/chunks/rgbdEncode.fragment-dr2kGjSO.esm.js.map +1 -0
- package/dist/chunks/rgbdEncode.fragment-hXPzg1p5.esm.min.js +2 -0
- package/dist/chunks/rgbdEncode.fragment-hXPzg1p5.esm.min.js.map +1 -0
- package/dist/chunks/splatFileLoader-Bs42LtsP.esm.min.js +2 -0
- package/dist/chunks/splatFileLoader-Bs42LtsP.esm.min.js.map +1 -0
- package/dist/chunks/splatFileLoader-Dp33YOem.esm.js +3379 -0
- package/dist/chunks/splatFileLoader-Dp33YOem.esm.js.map +1 -0
- package/dist/chunks/spotLight-C0NmKeem.esm.js +701 -0
- package/dist/chunks/spotLight-C0NmKeem.esm.js.map +1 -0
- package/dist/chunks/spotLight-CcuCNdES.esm.min.js +2 -0
- package/dist/chunks/spotLight-CcuCNdES.esm.min.js.map +1 -0
- package/dist/chunks/standardMaterial-C1E5n_4w.esm.min.js +2 -0
- package/dist/chunks/standardMaterial-C1E5n_4w.esm.min.js.map +1 -0
- package/dist/chunks/standardMaterial-v_D8QA4q.esm.js +1807 -0
- package/dist/chunks/standardMaterial-v_D8QA4q.esm.js.map +1 -0
- package/dist/chunks/stlFileLoader-DC2IRQDj.esm.min.js +2 -0
- package/dist/chunks/stlFileLoader-DC2IRQDj.esm.min.js.map +1 -0
- package/dist/chunks/stlFileLoader-LRHEIFfU.esm.js +238 -0
- package/dist/chunks/stlFileLoader-LRHEIFfU.esm.js.map +1 -0
- package/dist/chunks/tgaTextureLoader-2ekJC0En.esm.js +349 -0
- package/dist/chunks/tgaTextureLoader-2ekJC0En.esm.js.map +1 -0
- package/dist/chunks/tgaTextureLoader-Clj6zUK-.esm.min.js +2 -0
- package/dist/chunks/tgaTextureLoader-Clj6zUK-.esm.min.js.map +1 -0
- package/dist/chunks/thinEngine-DksimP2U.esm.js +3848 -0
- package/dist/chunks/thinEngine-DksimP2U.esm.js.map +1 -0
- package/dist/chunks/thinEngine-tsALaFYH.esm.min.js +2 -0
- package/dist/chunks/thinEngine-tsALaFYH.esm.min.js.map +1 -0
- package/dist/chunks/thinInstanceMesh-B8AW0Oa2.esm.js +314 -0
- package/dist/chunks/thinInstanceMesh-B8AW0Oa2.esm.js.map +1 -0
- package/dist/chunks/thinInstanceMesh-kCGEJ0-e.esm.min.js +2 -0
- package/dist/chunks/thinInstanceMesh-kCGEJ0-e.esm.min.js.map +1 -0
- package/dist/chunks/vertexColorMixing-Bjijk3lU.esm.min.js +2 -0
- package/dist/chunks/vertexColorMixing-Bjijk3lU.esm.min.js.map +1 -0
- package/dist/chunks/vertexColorMixing-D9917nJN.esm.js +428 -0
- package/dist/chunks/vertexColorMixing-D9917nJN.esm.js.map +1 -0
- package/dist/chunks/vertexColorMixing-DgthWrKf.esm.min.js +2 -0
- package/dist/chunks/vertexColorMixing-DgthWrKf.esm.min.js.map +1 -0
- package/dist/chunks/vertexColorMixing-U1SA6UK3.esm.js +538 -0
- package/dist/chunks/vertexColorMixing-U1SA6UK3.esm.js.map +1 -0
- package/dist/chunks/webgpuEngine-BOGR1D8F.esm.min.js +2 -0
- package/dist/chunks/webgpuEngine-BOGR1D8F.esm.min.js.map +1 -0
- package/dist/chunks/webgpuEngine-BrzOpZ-2.esm.js +11533 -0
- package/dist/chunks/webgpuEngine-BrzOpZ-2.esm.js.map +1 -0
- package/dist/chunks/workerPool-BUOov2K1.esm.js +122 -0
- package/dist/chunks/workerPool-BUOov2K1.esm.js.map +1 -0
- package/dist/chunks/workerPool-BWHiDmEZ.esm.min.js +2 -0
- package/dist/chunks/workerPool-BWHiDmEZ.esm.min.js.map +1 -0
- package/lib/index.d.ts +591 -0
- package/lib/index.js +2165 -0
- package/lib/index.js.map +1 -0
- package/package.json +19 -28
- package/readme.md +28 -28
- package/configuration/configuration.d.ts +0 -107
- package/configuration/configuration.js +0 -16
- package/configuration/configuration.js.map +0 -1
- package/configuration/configurationCompatibility.d.ts +0 -8
- package/configuration/configurationCompatibility.js +0 -66
- package/configuration/configurationCompatibility.js.map +0 -1
- package/configuration/configurationContainer.d.ts +0 -10
- package/configuration/configurationContainer.js +0 -10
- package/configuration/configurationContainer.js.map +0 -1
- package/configuration/globals.d.ts +0 -6
- package/configuration/globals.js +0 -18
- package/configuration/globals.js.map +0 -1
- package/configuration/index.d.ts +0 -2
- package/configuration/index.js +0 -4
- package/configuration/index.js.map +0 -1
- package/configuration/interfaces/cameraConfiguration.d.ts +0 -31
- package/configuration/interfaces/cameraConfiguration.js +0 -2
- package/configuration/interfaces/cameraConfiguration.js.map +0 -1
- package/configuration/interfaces/colorGradingConfiguration.d.ts +0 -81
- package/configuration/interfaces/colorGradingConfiguration.js +0 -2
- package/configuration/interfaces/colorGradingConfiguration.js.map +0 -1
- package/configuration/interfaces/defaultRenderingPipelineConfiguration.d.ts +0 -20
- package/configuration/interfaces/defaultRenderingPipelineConfiguration.js +0 -2
- package/configuration/interfaces/defaultRenderingPipelineConfiguration.js.map +0 -1
- package/configuration/interfaces/environmentMapConfiguration.d.ts +0 -22
- package/configuration/interfaces/environmentMapConfiguration.js +0 -2
- package/configuration/interfaces/environmentMapConfiguration.js.map +0 -1
- package/configuration/interfaces/groundConfiguration.d.ts +0 -24
- package/configuration/interfaces/groundConfiguration.js +0 -2
- package/configuration/interfaces/groundConfiguration.js.map +0 -1
- package/configuration/interfaces/imageProcessingConfiguration.d.ts +0 -45
- package/configuration/interfaces/imageProcessingConfiguration.js +0 -2
- package/configuration/interfaces/imageProcessingConfiguration.js.map +0 -1
- package/configuration/interfaces/index.d.ts +0 -15
- package/configuration/interfaces/index.js +0 -16
- package/configuration/interfaces/index.js.map +0 -1
- package/configuration/interfaces/lightConfiguration.d.ts +0 -60
- package/configuration/interfaces/lightConfiguration.js +0 -2
- package/configuration/interfaces/lightConfiguration.js.map +0 -1
- package/configuration/interfaces/modelAnimationConfiguration.d.ts +0 -26
- package/configuration/interfaces/modelAnimationConfiguration.js +0 -2
- package/configuration/interfaces/modelAnimationConfiguration.js.map +0 -1
- package/configuration/interfaces/modelConfiguration.d.ts +0 -65
- package/configuration/interfaces/modelConfiguration.js +0 -2
- package/configuration/interfaces/modelConfiguration.js.map +0 -1
- package/configuration/interfaces/observersConfiguration.d.ts +0 -5
- package/configuration/interfaces/observersConfiguration.js +0 -2
- package/configuration/interfaces/observersConfiguration.js.map +0 -1
- package/configuration/interfaces/sceneConfiguration.d.ts +0 -48
- package/configuration/interfaces/sceneConfiguration.js +0 -2
- package/configuration/interfaces/sceneConfiguration.js.map +0 -1
- package/configuration/interfaces/sceneOptimizerConfiguration.d.ts +0 -23
- package/configuration/interfaces/sceneOptimizerConfiguration.js +0 -2
- package/configuration/interfaces/sceneOptimizerConfiguration.js.map +0 -1
- package/configuration/interfaces/skyboxConfiguration.d.ts +0 -21
- package/configuration/interfaces/skyboxConfiguration.js +0 -2
- package/configuration/interfaces/skyboxConfiguration.js.map +0 -1
- package/configuration/interfaces/templateConfiguration.d.ts +0 -67
- package/configuration/interfaces/templateConfiguration.js +0 -2
- package/configuration/interfaces/templateConfiguration.js.map +0 -1
- package/configuration/interfaces/vrConfiguration.d.ts +0 -16
- package/configuration/interfaces/vrConfiguration.js +0 -2
- package/configuration/interfaces/vrConfiguration.js.map +0 -1
- package/configuration/loader.d.ts +0 -4
- package/configuration/loader.js +0 -17
- package/configuration/loader.js.map +0 -1
- package/configuration/mappers.d.ts +0 -43
- package/configuration/mappers.js +0 -193
- package/configuration/mappers.js.map +0 -1
- package/configuration/renderOnlyLoader.d.ts +0 -33
- package/configuration/renderOnlyLoader.js +0 -162
- package/configuration/renderOnlyLoader.js.map +0 -1
- package/configuration/types/default.d.ts +0 -6
- package/configuration/types/default.js +0 -121
- package/configuration/types/default.js.map +0 -1
- package/configuration/types/environmentMap.d.ts +0 -5
- package/configuration/types/environmentMap.js +0 -14
- package/configuration/types/environmentMap.js.map +0 -1
- package/configuration/types/extended.d.ts +0 -6
- package/configuration/types/extended.js +0 -317
- package/configuration/types/extended.js.map +0 -1
- package/configuration/types/index.d.ts +0 -14
- package/configuration/types/index.js +0 -51
- package/configuration/types/index.js.map +0 -1
- package/configuration/types/minimal.d.ts +0 -6
- package/configuration/types/minimal.js +0 -43
- package/configuration/types/minimal.js.map +0 -1
- package/configuration/types/renderOnlyDefault.d.ts +0 -30
- package/configuration/types/renderOnlyDefault.js +0 -31
- package/configuration/types/renderOnlyDefault.js.map +0 -1
- package/configuration/types/shadowLight.d.ts +0 -9
- package/configuration/types/shadowLight.js +0 -64
- package/configuration/types/shadowLight.js.map +0 -1
- package/helper/index.d.ts +0 -29
- package/helper/index.js +0 -66
- package/helper/index.js.map +0 -1
- package/index.d.ts +0 -30
- package/index.js +0 -46
- package/index.js.map +0 -1
- package/initializer.d.ts +0 -11
- package/initializer.js +0 -35
- package/initializer.js.map +0 -1
- package/interfaces.d.ts +0 -5
- package/interfaces.js +0 -7
- package/interfaces.js.map +0 -1
- package/labs/environmentSerializer.d.ts +0 -126
- package/labs/environmentSerializer.js +0 -191
- package/labs/environmentSerializer.js.map +0 -1
- package/labs/texture.d.ts +0 -183
- package/labs/texture.js +0 -351
- package/labs/texture.js.map +0 -1
- package/labs/viewerLabs.d.ts +0 -51
- package/labs/viewerLabs.js +0 -134
- package/labs/viewerLabs.js.map +0 -1
- package/loader/modelLoader.d.ts +0 -56
- package/loader/modelLoader.js +0 -202
- package/loader/modelLoader.js.map +0 -1
- package/loader/plugins/applyMaterialConfig.d.ts +0 -12
- package/loader/plugins/applyMaterialConfig.js +0 -16
- package/loader/plugins/applyMaterialConfig.js.map +0 -1
- package/loader/plugins/extendedMaterialLoaderPlugin.d.ts +0 -9
- package/loader/plugins/extendedMaterialLoaderPlugin.js +0 -16
- package/loader/plugins/extendedMaterialLoaderPlugin.js.map +0 -1
- package/loader/plugins/index.d.ts +0 -19
- package/loader/plugins/index.js +0 -44
- package/loader/plugins/index.js.map +0 -1
- package/loader/plugins/loaderPlugin.d.ts +0 -24
- package/loader/plugins/loaderPlugin.js +0 -2
- package/loader/plugins/loaderPlugin.js.map +0 -1
- package/loader/plugins/msftLodLoaderPlugin.d.ts +0 -12
- package/loader/plugins/msftLodLoaderPlugin.js +0 -21
- package/loader/plugins/msftLodLoaderPlugin.js.map +0 -1
- package/loader/plugins/telemetryLoaderPlugin.d.ts +0 -12
- package/loader/plugins/telemetryLoaderPlugin.js +0 -36
- package/loader/plugins/telemetryLoaderPlugin.js.map +0 -1
- package/managers/observablesManager.d.ts +0 -66
- package/managers/observablesManager.js +0 -35
- package/managers/observablesManager.js.map +0 -1
- package/managers/sceneManager.d.ts +0 -245
- package/managers/sceneManager.js +0 -1375
- package/managers/sceneManager.js.map +0 -1
- package/managers/telemetryManager.d.ts +0 -78
- package/managers/telemetryManager.js +0 -117
- package/managers/telemetryManager.js.map +0 -1
- package/model/modelAnimation.d.ts +0 -215
- package/model/modelAnimation.js +0 -237
- package/model/modelAnimation.js.map +0 -1
- package/model/viewerModel.d.ts +0 -233
- package/model/viewerModel.js +0 -673
- package/model/viewerModel.js.map +0 -1
- package/optimizer/custom/extended.d.ts +0 -13
- package/optimizer/custom/extended.js +0 -101
- package/optimizer/custom/extended.js.map +0 -1
- package/optimizer/custom/index.d.ts +0 -9
- package/optimizer/custom/index.js +0 -26
- package/optimizer/custom/index.js.map +0 -1
- package/renderOnlyIndex.d.ts +0 -11
- package/renderOnlyIndex.js +0 -18
- package/renderOnlyIndex.js.map +0 -1
- package/templating/eventManager.d.ts +0 -35
- package/templating/eventManager.js +0 -66
- package/templating/eventManager.js.map +0 -1
- package/templating/plugins/hdButtonPlugin.d.ts +0 -9
- package/templating/plugins/hdButtonPlugin.js +0 -22
- package/templating/plugins/hdButtonPlugin.js.map +0 -1
- package/templating/plugins/printButton.d.ts +0 -9
- package/templating/plugins/printButton.js +0 -41
- package/templating/plugins/printButton.js.map +0 -1
- package/templating/templateManager.d.ts +0 -197
- package/templating/templateManager.js +0 -561
- package/templating/templateManager.js.map +0 -1
- package/templating/viewerTemplatePlugin.d.ts +0 -21
- package/templating/viewerTemplatePlugin.js +0 -69
- package/templating/viewerTemplatePlugin.js.map +0 -1
- package/viewer/defaultViewer.d.ts +0 -130
- package/viewer/defaultViewer.js +0 -672
- package/viewer/defaultViewer.js.map +0 -1
- package/viewer/renderOnlyViewer.d.ts +0 -9
- package/viewer/renderOnlyViewer.js +0 -46
- package/viewer/renderOnlyViewer.js.map +0 -1
- package/viewer/viewer.d.ts +0 -258
- package/viewer/viewer.js +0 -783
- package/viewer/viewer.js.map +0 -1
- package/viewer/viewerManager.d.ts +0 -58
- package/viewer/viewerManager.js +0 -91
- package/viewer/viewerManager.js.map +0 -1
- package/viewer/viewerWithTemplate.d.ts +0 -9
- package/viewer/viewerWithTemplate.js +0 -20
- package/viewer/viewerWithTemplate.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glTFLoader-D4C1IGb3.esm.min.js","sources":["../../../../../dev/core/dist/Cameras/Inputs/freeCameraKeyboardMoveInput.js","../../../../../dev/core/dist/Cameras/Inputs/freeCameraMouseInput.js","../../../../../dev/core/dist/Cameras/Inputs/BaseCameraMouseWheelInput.js","../../../../../dev/core/dist/Cameras/Inputs/freeCameraMouseWheelInput.js","../../../../../dev/loaders/dist/glTF/glTFFileLoader.js","../../../../../dev/core/dist/Cameras/Inputs/freeCameraTouchInput.js","../../../../../dev/core/dist/Cameras/freeCameraInputsManager.js","../../../../../dev/core/dist/Cameras/freeCamera.js","../../../../../dev/core/dist/Bones/bone.js","../../../../../dev/core/dist/Bones/skeleton.js","../../../../../dev/core/dist/Morph/morphTarget.js","../../../../../dev/core/dist/Materials/Textures/rawTexture2DArray.js","../../../../../dev/core/dist/Morph/morphTargetManager.js","../../../../../dev/core/dist/Misc/dataReader.js","../../../../../dev/loaders/dist/glTF/glTFValidation.js","../../../../../dev/loaders/dist/glTF/2.0/glTFLoader.js"],"sourcesContent":["import { __decorate } from \"tslib\";\nimport { serialize } from \"../../Misc/decorators\";\nimport { CameraInputTypes } from \"../../Cameras/cameraInputsManager\";\nimport { KeyboardEventTypes } from \"../../Events/keyboardEvents\";\nimport { Vector3 } from \"../../Maths/math.vector\";\nimport { Tools } from \"../../Misc/tools\";\n/**\n * Manage the keyboard inputs to control the movement of a free camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/customizingCameraInputs\n */\nexport class FreeCameraKeyboardMoveInput {\n constructor() {\n /**\n * Gets or Set the list of keyboard keys used to control the forward move of the camera.\n */\n this.keysUp = [38];\n /**\n * Gets or Set the list of keyboard keys used to control the upward move of the camera.\n */\n this.keysUpward = [33];\n /**\n * Gets or Set the list of keyboard keys used to control the backward move of the camera.\n */\n this.keysDown = [40];\n /**\n * Gets or Set the list of keyboard keys used to control the downward move of the camera.\n */\n this.keysDownward = [34];\n /**\n * Gets or Set the list of keyboard keys used to control the left strafe move of the camera.\n */\n this.keysLeft = [37];\n /**\n * Gets or Set the list of keyboard keys used to control the right strafe move of the camera.\n */\n this.keysRight = [39];\n /**\n * Defines the pointer angular sensibility along the X and Y axis or how fast is the camera rotating.\n */\n this.rotationSpeed = 0.5;\n /**\n * Gets or Set the list of keyboard keys used to control the left rotation move of the camera.\n */\n this.keysRotateLeft = [];\n /**\n * Gets or Set the list of keyboard keys used to control the right rotation move of the camera.\n */\n this.keysRotateRight = [];\n /**\n * Gets or Set the list of keyboard keys used to control the up rotation move of the camera.\n */\n this.keysRotateUp = [];\n /**\n * Gets or Set the list of keyboard keys used to control the down rotation move of the camera.\n */\n this.keysRotateDown = [];\n this._keys = new Array();\n }\n /**\n * Attach the input controls to a specific dom element to get the input from.\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\n */\n attachControl(noPreventDefault) {\n // eslint-disable-next-line prefer-rest-params\n noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);\n if (this._onCanvasBlurObserver) {\n return;\n }\n this._scene = this.camera.getScene();\n this._engine = this._scene.getEngine();\n this._onCanvasBlurObserver = this._engine.onCanvasBlurObservable.add(() => {\n this._keys.length = 0;\n });\n this._onKeyboardObserver = this._scene.onKeyboardObservable.add((info) => {\n const evt = info.event;\n if (!evt.metaKey) {\n if (info.type === KeyboardEventTypes.KEYDOWN) {\n if (this.keysUp.indexOf(evt.keyCode) !== -1 ||\n this.keysDown.indexOf(evt.keyCode) !== -1 ||\n this.keysLeft.indexOf(evt.keyCode) !== -1 ||\n this.keysRight.indexOf(evt.keyCode) !== -1 ||\n this.keysUpward.indexOf(evt.keyCode) !== -1 ||\n this.keysDownward.indexOf(evt.keyCode) !== -1 ||\n this.keysRotateLeft.indexOf(evt.keyCode) !== -1 ||\n this.keysRotateRight.indexOf(evt.keyCode) !== -1 ||\n this.keysRotateUp.indexOf(evt.keyCode) !== -1 ||\n this.keysRotateDown.indexOf(evt.keyCode) !== -1) {\n const index = this._keys.indexOf(evt.keyCode);\n if (index === -1) {\n this._keys.push(evt.keyCode);\n }\n if (!noPreventDefault) {\n evt.preventDefault();\n }\n }\n }\n else {\n if (this.keysUp.indexOf(evt.keyCode) !== -1 ||\n this.keysDown.indexOf(evt.keyCode) !== -1 ||\n this.keysLeft.indexOf(evt.keyCode) !== -1 ||\n this.keysRight.indexOf(evt.keyCode) !== -1 ||\n this.keysUpward.indexOf(evt.keyCode) !== -1 ||\n this.keysDownward.indexOf(evt.keyCode) !== -1 ||\n this.keysRotateLeft.indexOf(evt.keyCode) !== -1 ||\n this.keysRotateRight.indexOf(evt.keyCode) !== -1 ||\n this.keysRotateUp.indexOf(evt.keyCode) !== -1 ||\n this.keysRotateDown.indexOf(evt.keyCode) !== -1) {\n const index = this._keys.indexOf(evt.keyCode);\n if (index >= 0) {\n this._keys.splice(index, 1);\n }\n if (!noPreventDefault) {\n evt.preventDefault();\n }\n }\n }\n }\n });\n }\n /**\n * Detach the current controls from the specified dom element.\n */\n detachControl() {\n if (this._scene) {\n if (this._onKeyboardObserver) {\n this._scene.onKeyboardObservable.remove(this._onKeyboardObserver);\n }\n if (this._onCanvasBlurObserver) {\n this._engine.onCanvasBlurObservable.remove(this._onCanvasBlurObserver);\n }\n this._onKeyboardObserver = null;\n this._onCanvasBlurObserver = null;\n }\n this._keys.length = 0;\n }\n /**\n * Update the current camera state depending on the inputs that have been used this frame.\n * This is a dynamically created lambda to avoid the performance penalty of looping for inputs in the render loop.\n */\n checkInputs() {\n if (this._onKeyboardObserver) {\n const camera = this.camera;\n // Keyboard\n for (let index = 0; index < this._keys.length; index++) {\n const keyCode = this._keys[index];\n const speed = camera._computeLocalCameraSpeed();\n if (this.keysLeft.indexOf(keyCode) !== -1) {\n camera._localDirection.copyFromFloats(-speed, 0, 0);\n }\n else if (this.keysUp.indexOf(keyCode) !== -1) {\n camera._localDirection.copyFromFloats(0, 0, speed);\n }\n else if (this.keysRight.indexOf(keyCode) !== -1) {\n camera._localDirection.copyFromFloats(speed, 0, 0);\n }\n else if (this.keysDown.indexOf(keyCode) !== -1) {\n camera._localDirection.copyFromFloats(0, 0, -speed);\n }\n else if (this.keysUpward.indexOf(keyCode) !== -1) {\n camera._localDirection.copyFromFloats(0, speed, 0);\n }\n else if (this.keysDownward.indexOf(keyCode) !== -1) {\n camera._localDirection.copyFromFloats(0, -speed, 0);\n }\n else if (this.keysRotateLeft.indexOf(keyCode) !== -1) {\n camera._localDirection.copyFromFloats(0, 0, 0);\n camera.cameraRotation.y -= this._getLocalRotation();\n }\n else if (this.keysRotateRight.indexOf(keyCode) !== -1) {\n camera._localDirection.copyFromFloats(0, 0, 0);\n camera.cameraRotation.y += this._getLocalRotation();\n }\n else if (this.keysRotateUp.indexOf(keyCode) !== -1) {\n camera._localDirection.copyFromFloats(0, 0, 0);\n camera.cameraRotation.x -= this._getLocalRotation();\n }\n else if (this.keysRotateDown.indexOf(keyCode) !== -1) {\n camera._localDirection.copyFromFloats(0, 0, 0);\n camera.cameraRotation.x += this._getLocalRotation();\n }\n if (camera.getScene().useRightHandedSystem) {\n camera._localDirection.z *= -1;\n }\n camera.getViewMatrix().invertToRef(camera._cameraTransformMatrix);\n Vector3.TransformNormalToRef(camera._localDirection, camera._cameraTransformMatrix, camera._transformedDirection);\n camera.cameraDirection.addInPlace(camera._transformedDirection);\n }\n }\n }\n /**\n * Gets the class name of the current input.\n * @returns the class name\n */\n getClassName() {\n return \"FreeCameraKeyboardMoveInput\";\n }\n /** @internal */\n _onLostFocus() {\n this._keys.length = 0;\n }\n /**\n * Get the friendly name associated with the input class.\n * @returns the input friendly name\n */\n getSimpleName() {\n return \"keyboard\";\n }\n _getLocalRotation() {\n const handednessMultiplier = this.camera._calculateHandednessMultiplier();\n const rotation = ((this.rotationSpeed * this._engine.getDeltaTime()) / 1000) * handednessMultiplier;\n return rotation;\n }\n}\n__decorate([\n serialize()\n], FreeCameraKeyboardMoveInput.prototype, \"keysUp\", void 0);\n__decorate([\n serialize()\n], FreeCameraKeyboardMoveInput.prototype, \"keysUpward\", void 0);\n__decorate([\n serialize()\n], FreeCameraKeyboardMoveInput.prototype, \"keysDown\", void 0);\n__decorate([\n serialize()\n], FreeCameraKeyboardMoveInput.prototype, \"keysDownward\", void 0);\n__decorate([\n serialize()\n], FreeCameraKeyboardMoveInput.prototype, \"keysLeft\", void 0);\n__decorate([\n serialize()\n], FreeCameraKeyboardMoveInput.prototype, \"keysRight\", void 0);\n__decorate([\n serialize()\n], FreeCameraKeyboardMoveInput.prototype, \"rotationSpeed\", void 0);\n__decorate([\n serialize()\n], FreeCameraKeyboardMoveInput.prototype, \"keysRotateLeft\", void 0);\n__decorate([\n serialize()\n], FreeCameraKeyboardMoveInput.prototype, \"keysRotateRight\", void 0);\n__decorate([\n serialize()\n], FreeCameraKeyboardMoveInput.prototype, \"keysRotateUp\", void 0);\n__decorate([\n serialize()\n], FreeCameraKeyboardMoveInput.prototype, \"keysRotateDown\", void 0);\nCameraInputTypes[\"FreeCameraKeyboardMoveInput\"] = FreeCameraKeyboardMoveInput;\n//# sourceMappingURL=freeCameraKeyboardMoveInput.js.map","import { __decorate } from \"tslib\";\nimport { Observable } from \"../../Misc/observable\";\nimport { serialize } from \"../../Misc/decorators\";\nimport { CameraInputTypes } from \"../../Cameras/cameraInputsManager\";\nimport { PointerEventTypes } from \"../../Events/pointerEvents\";\nimport { Tools } from \"../../Misc/tools\";\n/**\n * Manage the mouse inputs to control the movement of a free camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/customizingCameraInputs\n */\nexport class FreeCameraMouseInput {\n /**\n * Manage the mouse inputs to control the movement of a free camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/customizingCameraInputs\n * @param touchEnabled Defines if touch is enabled or not\n */\n constructor(\n /**\n * [true] Define if touch is enabled in the mouse input\n */\n touchEnabled = true) {\n this.touchEnabled = touchEnabled;\n /**\n * Defines the buttons associated with the input to handle camera move.\n */\n this.buttons = [0, 1, 2];\n /**\n * Defines the pointer angular sensibility along the X and Y axis or how fast is the camera rotating.\n */\n this.angularSensibility = 2000.0;\n this._previousPosition = null;\n /**\n * Observable for when a pointer move event occurs containing the move offset\n */\n this.onPointerMovedObservable = new Observable();\n /**\n * @internal\n * If the camera should be rotated automatically based on pointer movement\n */\n this._allowCameraRotation = true;\n this._currentActiveButton = -1;\n this._activePointerId = -1;\n }\n /**\n * Attach the input controls to a specific dom element to get the input from.\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\n */\n attachControl(noPreventDefault) {\n // eslint-disable-next-line prefer-rest-params\n noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);\n const engine = this.camera.getEngine();\n const element = engine.getInputElement();\n if (!this._pointerInput) {\n this._pointerInput = (p) => {\n const evt = p.event;\n const isTouch = evt.pointerType === \"touch\";\n if (!this.touchEnabled && isTouch) {\n return;\n }\n if (p.type !== PointerEventTypes.POINTERMOVE && this.buttons.indexOf(evt.button) === -1) {\n return;\n }\n const srcElement = evt.target;\n if (p.type === PointerEventTypes.POINTERDOWN) {\n // If the input is touch with more than one touch OR if the input is mouse and there is already an active button, return\n if ((isTouch && this._activePointerId !== -1) || (!isTouch && this._currentActiveButton !== -1)) {\n return;\n }\n this._activePointerId = evt.pointerId;\n try {\n srcElement?.setPointerCapture(evt.pointerId);\n }\n catch (e) {\n //Nothing to do with the error. Execution will continue.\n }\n if (this._currentActiveButton === -1) {\n this._currentActiveButton = evt.button;\n }\n this._previousPosition = {\n x: evt.clientX,\n y: evt.clientY,\n };\n if (!noPreventDefault) {\n evt.preventDefault();\n element && element.focus();\n }\n // This is required to move while pointer button is down\n if (engine.isPointerLock && this._onMouseMove) {\n this._onMouseMove(p.event);\n }\n }\n else if (p.type === PointerEventTypes.POINTERUP) {\n // If input is touch with a different touch id OR if input is mouse with a different button, return\n if ((isTouch && this._activePointerId !== evt.pointerId) || (!isTouch && this._currentActiveButton !== evt.button)) {\n return;\n }\n try {\n srcElement?.releasePointerCapture(evt.pointerId);\n }\n catch (e) {\n //Nothing to do with the error.\n }\n this._currentActiveButton = -1;\n this._previousPosition = null;\n if (!noPreventDefault) {\n evt.preventDefault();\n }\n this._activePointerId = -1;\n }\n else if (p.type === PointerEventTypes.POINTERMOVE && (this._activePointerId === evt.pointerId || !isTouch)) {\n if (engine.isPointerLock && this._onMouseMove) {\n this._onMouseMove(p.event);\n }\n else if (this._previousPosition) {\n const handednessMultiplier = this.camera._calculateHandednessMultiplier();\n const offsetX = (evt.clientX - this._previousPosition.x) * handednessMultiplier;\n const offsetY = evt.clientY - this._previousPosition.y;\n if (this._allowCameraRotation) {\n this.camera.cameraRotation.y += offsetX / this.angularSensibility;\n this.camera.cameraRotation.x += offsetY / this.angularSensibility;\n }\n this.onPointerMovedObservable.notifyObservers({ offsetX: offsetX, offsetY: offsetY });\n this._previousPosition = {\n x: evt.clientX,\n y: evt.clientY,\n };\n if (!noPreventDefault) {\n evt.preventDefault();\n }\n }\n }\n };\n }\n this._onMouseMove = (evt) => {\n if (!engine.isPointerLock) {\n return;\n }\n const handednessMultiplier = this.camera._calculateHandednessMultiplier();\n const offsetX = evt.movementX * handednessMultiplier;\n this.camera.cameraRotation.y += offsetX / this.angularSensibility;\n const offsetY = evt.movementY;\n this.camera.cameraRotation.x += offsetY / this.angularSensibility;\n this._previousPosition = null;\n if (!noPreventDefault) {\n evt.preventDefault();\n }\n };\n this._observer = this.camera\n .getScene()\n ._inputManager._addCameraPointerObserver(this._pointerInput, PointerEventTypes.POINTERDOWN | PointerEventTypes.POINTERUP | PointerEventTypes.POINTERMOVE);\n if (element) {\n this._contextMenuBind = (evt) => this.onContextMenu(evt);\n element.addEventListener(\"contextmenu\", this._contextMenuBind, false); // TODO: We need to figure out how to handle this for Native\n }\n }\n /**\n * Called on JS contextmenu event.\n * Override this method to provide functionality.\n * @param evt the context menu event\n */\n onContextMenu(evt) {\n evt.preventDefault();\n }\n /**\n * Detach the current controls from the specified dom element.\n */\n detachControl() {\n if (this._observer) {\n this.camera.getScene()._inputManager._removeCameraPointerObserver(this._observer);\n if (this._contextMenuBind) {\n const engine = this.camera.getEngine();\n const element = engine.getInputElement();\n element && element.removeEventListener(\"contextmenu\", this._contextMenuBind);\n }\n if (this.onPointerMovedObservable) {\n this.onPointerMovedObservable.clear();\n }\n this._observer = null;\n this._onMouseMove = null;\n this._previousPosition = null;\n }\n this._activePointerId = -1;\n this._currentActiveButton = -1;\n }\n /**\n * Gets the class name of the current input.\n * @returns the class name\n */\n getClassName() {\n return \"FreeCameraMouseInput\";\n }\n /**\n * Get the friendly name associated with the input class.\n * @returns the input friendly name\n */\n getSimpleName() {\n return \"mouse\";\n }\n}\n__decorate([\n serialize()\n], FreeCameraMouseInput.prototype, \"buttons\", void 0);\n__decorate([\n serialize()\n], FreeCameraMouseInput.prototype, \"angularSensibility\", void 0);\nCameraInputTypes[\"FreeCameraMouseInput\"] = FreeCameraMouseInput;\n//# sourceMappingURL=freeCameraMouseInput.js.map","import { __decorate } from \"tslib\";\nimport { serialize } from \"../../Misc/decorators\";\nimport { Observable } from \"../../Misc/observable\";\nimport { PointerEventTypes } from \"../../Events/pointerEvents\";\nimport { EventConstants } from \"../../Events/deviceInputEvents\";\nimport { Tools } from \"../../Misc/tools\";\n/**\n * Base class for mouse wheel input..\n * See FollowCameraMouseWheelInput in src/Cameras/Inputs/freeCameraMouseWheelInput.ts\n * for example usage.\n */\nexport class BaseCameraMouseWheelInput {\n constructor() {\n /**\n * How fast is the camera moves in relation to X axis mouseWheel events.\n * Use negative value to reverse direction.\n */\n this.wheelPrecisionX = 3.0;\n /**\n * How fast is the camera moves in relation to Y axis mouseWheel events.\n * Use negative value to reverse direction.\n */\n this.wheelPrecisionY = 3.0;\n /**\n * How fast is the camera moves in relation to Z axis mouseWheel events.\n * Use negative value to reverse direction.\n */\n this.wheelPrecisionZ = 3.0;\n /**\n * Observable for when a mouse wheel move event occurs.\n */\n this.onChangedObservable = new Observable();\n /**\n * Incremental value of multiple mouse wheel movements of the X axis.\n * Should be zero-ed when read.\n */\n this._wheelDeltaX = 0;\n /**\n * Incremental value of multiple mouse wheel movements of the Y axis.\n * Should be zero-ed when read.\n */\n this._wheelDeltaY = 0;\n /**\n * Incremental value of multiple mouse wheel movements of the Z axis.\n * Should be zero-ed when read.\n */\n this._wheelDeltaZ = 0;\n /**\n * Firefox uses a different scheme to report scroll distances to other\n * browsers. Rather than use complicated methods to calculate the exact\n * multiple we need to apply, let's just cheat and use a constant.\n * https://developer.mozilla.org/en-US/docs/Web/API/WheelEvent/deltaMode\n * https://stackoverflow.com/questions/20110224/what-is-the-height-of-a-line-in-a-wheel-event-deltamode-dom-delta-line\n */\n this._ffMultiplier = 12;\n /**\n * Different event attributes for wheel data fall into a few set ranges.\n * Some relevant but dated date here:\n * https://stackoverflow.com/questions/5527601/normalizing-mousewheel-speed-across-browsers\n */\n this._normalize = 120;\n }\n /**\n * Attach the input controls to a specific dom element to get the input from.\n * @param noPreventDefault Defines whether event caught by the controls\n * should call preventdefault().\n * (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\n */\n attachControl(noPreventDefault) {\n noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);\n this._wheel = (pointer) => {\n // sanity check - this should be a PointerWheel event.\n if (pointer.type !== PointerEventTypes.POINTERWHEEL) {\n return;\n }\n const event = pointer.event;\n const platformScale = event.deltaMode === EventConstants.DOM_DELTA_LINE ? this._ffMultiplier : 1; // If this happens to be set to DOM_DELTA_LINE, adjust accordingly\n this._wheelDeltaX += (this.wheelPrecisionX * platformScale * event.deltaX) / this._normalize;\n this._wheelDeltaY -= (this.wheelPrecisionY * platformScale * event.deltaY) / this._normalize;\n this._wheelDeltaZ += (this.wheelPrecisionZ * platformScale * event.deltaZ) / this._normalize;\n if (event.preventDefault) {\n if (!noPreventDefault) {\n event.preventDefault();\n }\n }\n };\n this._observer = this.camera.getScene()._inputManager._addCameraPointerObserver(this._wheel, PointerEventTypes.POINTERWHEEL);\n }\n /**\n * Detach the current controls from the specified dom element.\n */\n detachControl() {\n if (this._observer) {\n this.camera.getScene()._inputManager._removeCameraPointerObserver(this._observer);\n this._observer = null;\n this._wheel = null;\n }\n if (this.onChangedObservable) {\n this.onChangedObservable.clear();\n }\n }\n /**\n * Called for each rendered frame.\n */\n checkInputs() {\n this.onChangedObservable.notifyObservers({\n wheelDeltaX: this._wheelDeltaX,\n wheelDeltaY: this._wheelDeltaY,\n wheelDeltaZ: this._wheelDeltaZ,\n });\n // Clear deltas.\n this._wheelDeltaX = 0;\n this._wheelDeltaY = 0;\n this._wheelDeltaZ = 0;\n }\n /**\n * Gets the class name of the current input.\n * @returns the class name\n */\n getClassName() {\n return \"BaseCameraMouseWheelInput\";\n }\n /**\n * Get the friendly name associated with the input class.\n * @returns the input friendly name\n */\n getSimpleName() {\n return \"mousewheel\";\n }\n}\n__decorate([\n serialize()\n], BaseCameraMouseWheelInput.prototype, \"wheelPrecisionX\", void 0);\n__decorate([\n serialize()\n], BaseCameraMouseWheelInput.prototype, \"wheelPrecisionY\", void 0);\n__decorate([\n serialize()\n], BaseCameraMouseWheelInput.prototype, \"wheelPrecisionZ\", void 0);\n//# sourceMappingURL=BaseCameraMouseWheelInput.js.map","import { __decorate } from \"tslib\";\nimport { serialize } from \"../../Misc/decorators\";\nimport { CameraInputTypes } from \"../../Cameras/cameraInputsManager\";\nimport { BaseCameraMouseWheelInput } from \"../../Cameras/Inputs/BaseCameraMouseWheelInput\";\nimport { Matrix, Vector3 } from \"../../Maths/math.vector\";\n// eslint-disable-next-line @typescript-eslint/naming-convention\nvar _CameraProperty;\n(function (_CameraProperty) {\n _CameraProperty[_CameraProperty[\"MoveRelative\"] = 0] = \"MoveRelative\";\n _CameraProperty[_CameraProperty[\"RotateRelative\"] = 1] = \"RotateRelative\";\n _CameraProperty[_CameraProperty[\"MoveScene\"] = 2] = \"MoveScene\";\n})(_CameraProperty || (_CameraProperty = {}));\n/**\n * Manage the mouse wheel inputs to control a free camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/customizingCameraInputs\n */\nexport class FreeCameraMouseWheelInput extends BaseCameraMouseWheelInput {\n constructor() {\n super(...arguments);\n this._moveRelative = Vector3.Zero();\n this._rotateRelative = Vector3.Zero();\n this._moveScene = Vector3.Zero();\n /**\n * These are set to the desired default behaviour.\n */\n this._wheelXAction = _CameraProperty.MoveRelative;\n this._wheelXActionCoordinate = 0 /* Coordinate.X */;\n this._wheelYAction = _CameraProperty.MoveRelative;\n this._wheelYActionCoordinate = 2 /* Coordinate.Z */;\n this._wheelZAction = null;\n this._wheelZActionCoordinate = null;\n }\n /**\n * Gets the class name of the current input.\n * @returns the class name\n */\n getClassName() {\n return \"FreeCameraMouseWheelInput\";\n }\n /**\n * Set which movement axis (relative to camera's orientation) the mouse\n * wheel's X axis controls.\n * @param axis The axis to be moved. Set null to clear.\n */\n set wheelXMoveRelative(axis) {\n if (axis === null && this._wheelXAction !== _CameraProperty.MoveRelative) {\n // Attempting to clear different _wheelXAction.\n return;\n }\n this._wheelXAction = _CameraProperty.MoveRelative;\n this._wheelXActionCoordinate = axis;\n }\n /**\n * Get the configured movement axis (relative to camera's orientation) the\n * mouse wheel's X axis controls.\n * @returns The configured axis or null if none.\n */\n get wheelXMoveRelative() {\n if (this._wheelXAction !== _CameraProperty.MoveRelative) {\n return null;\n }\n return this._wheelXActionCoordinate;\n }\n /**\n * Set which movement axis (relative to camera's orientation) the mouse\n * wheel's Y axis controls.\n * @param axis The axis to be moved. Set null to clear.\n */\n set wheelYMoveRelative(axis) {\n if (axis === null && this._wheelYAction !== _CameraProperty.MoveRelative) {\n // Attempting to clear different _wheelYAction.\n return;\n }\n this._wheelYAction = _CameraProperty.MoveRelative;\n this._wheelYActionCoordinate = axis;\n }\n /**\n * Get the configured movement axis (relative to camera's orientation) the\n * mouse wheel's Y axis controls.\n * @returns The configured axis or null if none.\n */\n get wheelYMoveRelative() {\n if (this._wheelYAction !== _CameraProperty.MoveRelative) {\n return null;\n }\n return this._wheelYActionCoordinate;\n }\n /**\n * Set which movement axis (relative to camera's orientation) the mouse\n * wheel's Z axis controls.\n * @param axis The axis to be moved. Set null to clear.\n */\n set wheelZMoveRelative(axis) {\n if (axis === null && this._wheelZAction !== _CameraProperty.MoveRelative) {\n // Attempting to clear different _wheelZAction.\n return;\n }\n this._wheelZAction = _CameraProperty.MoveRelative;\n this._wheelZActionCoordinate = axis;\n }\n /**\n * Get the configured movement axis (relative to camera's orientation) the\n * mouse wheel's Z axis controls.\n * @returns The configured axis or null if none.\n */\n get wheelZMoveRelative() {\n if (this._wheelZAction !== _CameraProperty.MoveRelative) {\n return null;\n }\n return this._wheelZActionCoordinate;\n }\n /**\n * Set which rotation axis (relative to camera's orientation) the mouse\n * wheel's X axis controls.\n * @param axis The axis to be moved. Set null to clear.\n */\n set wheelXRotateRelative(axis) {\n if (axis === null && this._wheelXAction !== _CameraProperty.RotateRelative) {\n // Attempting to clear different _wheelXAction.\n return;\n }\n this._wheelXAction = _CameraProperty.RotateRelative;\n this._wheelXActionCoordinate = axis;\n }\n /**\n * Get the configured rotation axis (relative to camera's orientation) the\n * mouse wheel's X axis controls.\n * @returns The configured axis or null if none.\n */\n get wheelXRotateRelative() {\n if (this._wheelXAction !== _CameraProperty.RotateRelative) {\n return null;\n }\n return this._wheelXActionCoordinate;\n }\n /**\n * Set which rotation axis (relative to camera's orientation) the mouse\n * wheel's Y axis controls.\n * @param axis The axis to be moved. Set null to clear.\n */\n set wheelYRotateRelative(axis) {\n if (axis === null && this._wheelYAction !== _CameraProperty.RotateRelative) {\n // Attempting to clear different _wheelYAction.\n return;\n }\n this._wheelYAction = _CameraProperty.RotateRelative;\n this._wheelYActionCoordinate = axis;\n }\n /**\n * Get the configured rotation axis (relative to camera's orientation) the\n * mouse wheel's Y axis controls.\n * @returns The configured axis or null if none.\n */\n get wheelYRotateRelative() {\n if (this._wheelYAction !== _CameraProperty.RotateRelative) {\n return null;\n }\n return this._wheelYActionCoordinate;\n }\n /**\n * Set which rotation axis (relative to camera's orientation) the mouse\n * wheel's Z axis controls.\n * @param axis The axis to be moved. Set null to clear.\n */\n set wheelZRotateRelative(axis) {\n if (axis === null && this._wheelZAction !== _CameraProperty.RotateRelative) {\n // Attempting to clear different _wheelZAction.\n return;\n }\n this._wheelZAction = _CameraProperty.RotateRelative;\n this._wheelZActionCoordinate = axis;\n }\n /**\n * Get the configured rotation axis (relative to camera's orientation) the\n * mouse wheel's Z axis controls.\n * @returns The configured axis or null if none.\n */\n get wheelZRotateRelative() {\n if (this._wheelZAction !== _CameraProperty.RotateRelative) {\n return null;\n }\n return this._wheelZActionCoordinate;\n }\n /**\n * Set which movement axis (relative to the scene) the mouse wheel's X axis\n * controls.\n * @param axis The axis to be moved. Set null to clear.\n */\n set wheelXMoveScene(axis) {\n if (axis === null && this._wheelXAction !== _CameraProperty.MoveScene) {\n // Attempting to clear different _wheelXAction.\n return;\n }\n this._wheelXAction = _CameraProperty.MoveScene;\n this._wheelXActionCoordinate = axis;\n }\n /**\n * Get the configured movement axis (relative to the scene) the mouse wheel's\n * X axis controls.\n * @returns The configured axis or null if none.\n */\n get wheelXMoveScene() {\n if (this._wheelXAction !== _CameraProperty.MoveScene) {\n return null;\n }\n return this._wheelXActionCoordinate;\n }\n /**\n * Set which movement axis (relative to the scene) the mouse wheel's Y axis\n * controls.\n * @param axis The axis to be moved. Set null to clear.\n */\n set wheelYMoveScene(axis) {\n if (axis === null && this._wheelYAction !== _CameraProperty.MoveScene) {\n // Attempting to clear different _wheelYAction.\n return;\n }\n this._wheelYAction = _CameraProperty.MoveScene;\n this._wheelYActionCoordinate = axis;\n }\n /**\n * Get the configured movement axis (relative to the scene) the mouse wheel's\n * Y axis controls.\n * @returns The configured axis or null if none.\n */\n get wheelYMoveScene() {\n if (this._wheelYAction !== _CameraProperty.MoveScene) {\n return null;\n }\n return this._wheelYActionCoordinate;\n }\n /**\n * Set which movement axis (relative to the scene) the mouse wheel's Z axis\n * controls.\n * @param axis The axis to be moved. Set null to clear.\n */\n set wheelZMoveScene(axis) {\n if (axis === null && this._wheelZAction !== _CameraProperty.MoveScene) {\n // Attempting to clear different _wheelZAction.\n return;\n }\n this._wheelZAction = _CameraProperty.MoveScene;\n this._wheelZActionCoordinate = axis;\n }\n /**\n * Get the configured movement axis (relative to the scene) the mouse wheel's\n * Z axis controls.\n * @returns The configured axis or null if none.\n */\n get wheelZMoveScene() {\n if (this._wheelZAction !== _CameraProperty.MoveScene) {\n return null;\n }\n return this._wheelZActionCoordinate;\n }\n /**\n * Called for each rendered frame.\n */\n checkInputs() {\n if (this._wheelDeltaX === 0 && this._wheelDeltaY === 0 && this._wheelDeltaZ == 0) {\n return;\n }\n // Clear the camera properties that we might be updating.\n this._moveRelative.setAll(0);\n this._rotateRelative.setAll(0);\n this._moveScene.setAll(0);\n // Set the camera properties that are to be updated.\n this._updateCamera();\n if (this.camera.getScene().useRightHandedSystem) {\n // TODO: Does this need done for worldUpdate too?\n this._moveRelative.z *= -1;\n }\n // Convert updates relative to camera to world position update.\n const cameraTransformMatrix = Matrix.Zero();\n this.camera.getViewMatrix().invertToRef(cameraTransformMatrix);\n const transformedDirection = Vector3.Zero();\n Vector3.TransformNormalToRef(this._moveRelative, cameraTransformMatrix, transformedDirection);\n // Apply updates to camera position.\n this.camera.cameraRotation.x += this._rotateRelative.x / 200;\n this.camera.cameraRotation.y += this._rotateRelative.y / 200;\n this.camera.cameraDirection.addInPlace(transformedDirection);\n this.camera.cameraDirection.addInPlace(this._moveScene);\n // Call the base class implementation to handle observers and do cleanup.\n super.checkInputs();\n }\n /**\n * Update the camera according to any configured properties for the 3\n * mouse-wheel axis.\n */\n _updateCamera() {\n // Do the camera updates for each of the 3 touch-wheel axis.\n this._updateCameraProperty(this._wheelDeltaX, this._wheelXAction, this._wheelXActionCoordinate);\n this._updateCameraProperty(this._wheelDeltaY, this._wheelYAction, this._wheelYActionCoordinate);\n this._updateCameraProperty(this._wheelDeltaZ, this._wheelZAction, this._wheelZActionCoordinate);\n }\n /**\n * Update one property of the camera.\n * @param value\n * @param cameraProperty\n * @param coordinate\n */\n _updateCameraProperty(\n /* Mouse-wheel delta. */\n value, \n /* Camera property to be changed. */\n cameraProperty, \n /* Axis of Camera property to be changed. */\n coordinate) {\n if (value === 0) {\n // Mouse wheel has not moved.\n return;\n }\n if (cameraProperty === null || coordinate === null) {\n // Mouse wheel axis not configured.\n return;\n }\n let action = null;\n switch (cameraProperty) {\n case _CameraProperty.MoveRelative:\n action = this._moveRelative;\n break;\n case _CameraProperty.RotateRelative:\n action = this._rotateRelative;\n break;\n case _CameraProperty.MoveScene:\n action = this._moveScene;\n break;\n }\n switch (coordinate) {\n case 0 /* Coordinate.X */:\n action.set(value, 0, 0);\n break;\n case 1 /* Coordinate.Y */:\n action.set(0, value, 0);\n break;\n case 2 /* Coordinate.Z */:\n action.set(0, 0, value);\n break;\n }\n }\n}\n__decorate([\n serialize()\n], FreeCameraMouseWheelInput.prototype, \"wheelXMoveRelative\", null);\n__decorate([\n serialize()\n], FreeCameraMouseWheelInput.prototype, \"wheelYMoveRelative\", null);\n__decorate([\n serialize()\n], FreeCameraMouseWheelInput.prototype, \"wheelZMoveRelative\", null);\n__decorate([\n serialize()\n], FreeCameraMouseWheelInput.prototype, \"wheelXRotateRelative\", null);\n__decorate([\n serialize()\n], FreeCameraMouseWheelInput.prototype, \"wheelYRotateRelative\", null);\n__decorate([\n serialize()\n], FreeCameraMouseWheelInput.prototype, \"wheelZRotateRelative\", null);\n__decorate([\n serialize()\n], FreeCameraMouseWheelInput.prototype, \"wheelXMoveScene\", null);\n__decorate([\n serialize()\n], FreeCameraMouseWheelInput.prototype, \"wheelYMoveScene\", null);\n__decorate([\n serialize()\n], FreeCameraMouseWheelInput.prototype, \"wheelZMoveScene\", null);\nCameraInputTypes[\"FreeCameraMouseWheelInput\"] = FreeCameraMouseWheelInput;\n//# sourceMappingURL=freeCameraMouseWheelInput.js.map","import { Observable } from \"core/Misc/observable\";\nimport { Tools } from \"core/Misc/tools\";\nimport { registerSceneLoaderPlugin } from \"core/Loading/sceneLoader\";\nimport { AssetContainer } from \"core/assetContainer\";\nimport { Logger } from \"core/Misc/logger\";\nimport { DataReader } from \"core/Misc/dataReader\";\nimport { GLTFValidation } from \"./glTFValidation\";\nimport { GLTFFileLoaderMetadata, GLTFMagicBase64Encoded } from \"./glTFFileLoader.metadata\";\nimport { DecodeBase64UrlToBinary } from \"core/Misc/fileTools\";\nimport { RuntimeError, ErrorCodes } from \"core/Misc/error\";\nfunction readAsync(arrayBuffer, byteOffset, byteLength) {\n try {\n return Promise.resolve(new Uint8Array(arrayBuffer, byteOffset, byteLength));\n }\n catch (e) {\n return Promise.reject(e);\n }\n}\nfunction readViewAsync(arrayBufferView, byteOffset, byteLength) {\n try {\n if (byteOffset < 0 || byteOffset >= arrayBufferView.byteLength) {\n throw new RangeError(\"Offset is out of range.\");\n }\n if (byteOffset + byteLength > arrayBufferView.byteLength) {\n throw new RangeError(\"Length is out of range.\");\n }\n return Promise.resolve(new Uint8Array(arrayBufferView.buffer, arrayBufferView.byteOffset + byteOffset, byteLength));\n }\n catch (e) {\n return Promise.reject(e);\n }\n}\n/**\n * Mode that determines the coordinate system to use.\n */\nexport var GLTFLoaderCoordinateSystemMode;\n(function (GLTFLoaderCoordinateSystemMode) {\n /**\n * Automatically convert the glTF right-handed data to the appropriate system based on the current coordinate system mode of the scene.\n */\n GLTFLoaderCoordinateSystemMode[GLTFLoaderCoordinateSystemMode[\"AUTO\"] = 0] = \"AUTO\";\n /**\n * Sets the useRightHandedSystem flag on the scene.\n */\n GLTFLoaderCoordinateSystemMode[GLTFLoaderCoordinateSystemMode[\"FORCE_RIGHT_HANDED\"] = 1] = \"FORCE_RIGHT_HANDED\";\n})(GLTFLoaderCoordinateSystemMode || (GLTFLoaderCoordinateSystemMode = {}));\n/**\n * Mode that determines what animations will start.\n */\nexport var GLTFLoaderAnimationStartMode;\n(function (GLTFLoaderAnimationStartMode) {\n /**\n * No animation will start.\n */\n GLTFLoaderAnimationStartMode[GLTFLoaderAnimationStartMode[\"NONE\"] = 0] = \"NONE\";\n /**\n * The first animation will start.\n */\n GLTFLoaderAnimationStartMode[GLTFLoaderAnimationStartMode[\"FIRST\"] = 1] = \"FIRST\";\n /**\n * All animations will start.\n */\n GLTFLoaderAnimationStartMode[GLTFLoaderAnimationStartMode[\"ALL\"] = 2] = \"ALL\";\n})(GLTFLoaderAnimationStartMode || (GLTFLoaderAnimationStartMode = {}));\n/**\n * Loader state.\n */\nexport var GLTFLoaderState;\n(function (GLTFLoaderState) {\n /**\n * The asset is loading.\n */\n GLTFLoaderState[GLTFLoaderState[\"LOADING\"] = 0] = \"LOADING\";\n /**\n * The asset is ready for rendering.\n */\n GLTFLoaderState[GLTFLoaderState[\"READY\"] = 1] = \"READY\";\n /**\n * The asset is completely loaded.\n */\n GLTFLoaderState[GLTFLoaderState[\"COMPLETE\"] = 2] = \"COMPLETE\";\n})(GLTFLoaderState || (GLTFLoaderState = {}));\nclass GLTFLoaderOptions {\n constructor() {\n // ----------\n // V2 options\n // ----------\n /**\n * The coordinate system mode. Defaults to AUTO.\n */\n this.coordinateSystemMode = GLTFLoaderCoordinateSystemMode.AUTO;\n /**\n * The animation start mode. Defaults to FIRST.\n */\n this.animationStartMode = GLTFLoaderAnimationStartMode.FIRST;\n /**\n * Defines if the loader should load node animations. Defaults to true.\n * NOTE: The animation of this node will still load if the node is also a joint of a skin and `loadSkins` is true.\n */\n this.loadNodeAnimations = true;\n /**\n * Defines if the loader should load skins. Defaults to true.\n */\n this.loadSkins = true;\n /**\n * Defines if the loader should load morph targets. Defaults to true.\n */\n this.loadMorphTargets = true;\n /**\n * Defines if the loader should compile materials before raising the success callback. Defaults to false.\n */\n this.compileMaterials = false;\n /**\n * Defines if the loader should also compile materials with clip planes. Defaults to false.\n */\n this.useClipPlane = false;\n /**\n * Defines if the loader should compile shadow generators before raising the success callback. Defaults to false.\n */\n this.compileShadowGenerators = false;\n /**\n * Defines if the Alpha blended materials are only applied as coverage.\n * If false, (default) The luminance of each pixel will reduce its opacity to simulate the behaviour of most physical materials.\n * If true, no extra effects are applied to transparent pixels.\n */\n this.transparencyAsCoverage = false;\n /**\n * Defines if the loader should use range requests when load binary glTF files from HTTP.\n * Enabling will disable offline support and glTF validator.\n * Defaults to false.\n */\n this.useRangeRequests = false;\n /**\n * Defines if the loader should create instances when multiple glTF nodes point to the same glTF mesh. Defaults to true.\n */\n this.createInstances = true;\n /**\n * Defines if the loader should always compute the bounding boxes of meshes and not use the min/max values from the position accessor. Defaults to false.\n */\n this.alwaysComputeBoundingBox = false;\n /**\n * If true, load all materials defined in the file, even if not used by any mesh. Defaults to false.\n */\n this.loadAllMaterials = false;\n /**\n * If true, load only the materials defined in the file. Defaults to false.\n */\n this.loadOnlyMaterials = false;\n /**\n * If true, do not load any materials defined in the file. Defaults to false.\n */\n this.skipMaterials = false;\n /**\n * If true, load the color (gamma encoded) textures into sRGB buffers (if supported by the GPU), which will yield more accurate results when sampling the texture. Defaults to true.\n */\n this.useSRGBBuffers = true;\n /**\n * When loading glTF animations, which are defined in seconds, target them to this FPS. Defaults to 60.\n */\n this.targetFps = 60;\n /**\n * Defines if the loader should always compute the nearest common ancestor of the skeleton joints instead of using `skin.skeleton`. Defaults to false.\n * Set this to true if loading assets with invalid `skin.skeleton` values.\n */\n this.alwaysComputeSkeletonRootNode = false;\n /**\n * If true, the loader will derive the name for Babylon textures from the glTF texture name, image name, or image url. Defaults to false.\n * Note that it is possible for multiple Babylon textures to share the same name when the Babylon textures load from the same glTF texture or image.\n */\n this.useGltfTextureNames = false;\n /**\n * Function called before loading a url referenced by the asset.\n * @param url url referenced by the asset\n * @returns Async url to load\n */\n this.preprocessUrlAsync = (url) => Promise.resolve(url);\n /**\n * Defines options for glTF extensions.\n */\n this.extensionOptions = {};\n }\n // eslint-disable-next-line babylonjs/available\n copyFrom(options) {\n if (options) {\n this.onParsed = options.onParsed;\n this.coordinateSystemMode = options.coordinateSystemMode ?? this.coordinateSystemMode;\n this.animationStartMode = options.animationStartMode ?? this.animationStartMode;\n this.loadNodeAnimations = options.loadNodeAnimations ?? this.loadNodeAnimations;\n this.loadSkins = options.loadSkins ?? this.loadSkins;\n this.loadMorphTargets = options.loadMorphTargets ?? this.loadMorphTargets;\n this.compileMaterials = options.compileMaterials ?? this.compileMaterials;\n this.useClipPlane = options.useClipPlane ?? this.useClipPlane;\n this.compileShadowGenerators = options.compileShadowGenerators ?? this.compileShadowGenerators;\n this.transparencyAsCoverage = options.transparencyAsCoverage ?? this.transparencyAsCoverage;\n this.useRangeRequests = options.useRangeRequests ?? this.useRangeRequests;\n this.createInstances = options.createInstances ?? this.createInstances;\n this.alwaysComputeBoundingBox = options.alwaysComputeBoundingBox ?? this.alwaysComputeBoundingBox;\n this.loadAllMaterials = options.loadAllMaterials ?? this.loadAllMaterials;\n this.loadOnlyMaterials = options.loadOnlyMaterials ?? this.loadOnlyMaterials;\n this.skipMaterials = options.skipMaterials ?? this.skipMaterials;\n this.useSRGBBuffers = options.useSRGBBuffers ?? this.useSRGBBuffers;\n this.targetFps = options.targetFps ?? this.targetFps;\n this.alwaysComputeSkeletonRootNode = options.alwaysComputeSkeletonRootNode ?? this.alwaysComputeSkeletonRootNode;\n this.useGltfTextureNames = options.useGltfTextureNames ?? this.useGltfTextureNames;\n this.preprocessUrlAsync = options.preprocessUrlAsync ?? this.preprocessUrlAsync;\n this.customRootNode = options.customRootNode;\n this.onMeshLoaded = options.onMeshLoaded;\n this.onSkinLoaded = options.onSkinLoaded;\n this.onTextureLoaded = options.onTextureLoaded;\n this.onMaterialLoaded = options.onMaterialLoaded;\n this.onCameraLoaded = options.onCameraLoaded;\n this.extensionOptions = options.extensionOptions ?? this.extensionOptions;\n }\n }\n}\n/**\n * File loader for loading glTF files into a scene.\n */\nexport class GLTFFileLoader extends GLTFLoaderOptions {\n /**\n * Creates a new glTF file loader.\n * @param options The options for the loader\n */\n constructor(options) {\n super();\n // --------------------\n // Begin Common options\n // --------------------\n /**\n * Raised when the asset has been parsed\n */\n this.onParsedObservable = new Observable();\n // --------------\n // End V1 options\n // --------------\n /**\n * Observable raised when the loader creates a mesh after parsing the glTF properties of the mesh.\n * Note that the observable is raised as soon as the mesh object is created, meaning some data may not have been setup yet for this mesh (vertex data, morph targets, material, ...)\n */\n this.onMeshLoadedObservable = new Observable();\n /**\n * Observable raised when the loader creates a skin after parsing the glTF properties of the skin node.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/importers/glTF/glTFSkinning#ignoring-the-transform-of-the-skinned-mesh\n * @param node - the transform node that corresponds to the original glTF skin node used for animations\n * @param skinnedNode - the transform node that is the skinned mesh itself or the parent of the skinned meshes\n */\n this.onSkinLoadedObservable = new Observable();\n /**\n * Observable raised when the loader creates a texture after parsing the glTF properties of the texture.\n */\n this.onTextureLoadedObservable = new Observable();\n /**\n * Observable raised when the loader creates a material after parsing the glTF properties of the material.\n */\n this.onMaterialLoadedObservable = new Observable();\n /**\n * Observable raised when the loader creates a camera after parsing the glTF properties of the camera.\n */\n this.onCameraLoadedObservable = new Observable();\n /**\n * Observable raised when the asset is completely loaded, immediately before the loader is disposed.\n * For assets with LODs, raised when all of the LODs are complete.\n * For assets without LODs, raised when the model is complete, immediately after the loader resolves the returned promise.\n */\n this.onCompleteObservable = new Observable();\n /**\n * Observable raised when an error occurs.\n */\n this.onErrorObservable = new Observable();\n /**\n * Observable raised after the loader is disposed.\n */\n this.onDisposeObservable = new Observable();\n /**\n * Observable raised after a loader extension is created.\n * Set additional options for a loader extension in this event.\n */\n this.onExtensionLoadedObservable = new Observable();\n /**\n * Defines if the loader should validate the asset.\n */\n this.validate = false;\n /**\n * Observable raised after validation when validate is set to true. The event data is the result of the validation.\n */\n this.onValidatedObservable = new Observable();\n this._loader = null;\n this._state = null;\n this._requests = new Array();\n /**\n * Name of the loader (\"gltf\")\n */\n this.name = GLTFFileLoaderMetadata.name;\n /** @internal */\n this.extensions = GLTFFileLoaderMetadata.extensions;\n /**\n * Observable raised when the loader state changes.\n */\n this.onLoaderStateChangedObservable = new Observable();\n this._logIndentLevel = 0;\n this._loggingEnabled = false;\n /** @internal */\n this._log = this._logDisabled;\n this._capturePerformanceCounters = false;\n /** @internal */\n this._startPerformanceCounter = this._startPerformanceCounterDisabled;\n /** @internal */\n this._endPerformanceCounter = this._endPerformanceCounterDisabled;\n this.copyFrom(options);\n }\n /**\n * Raised when the asset has been parsed\n */\n set onParsed(callback) {\n if (this._onParsedObserver) {\n this.onParsedObservable.remove(this._onParsedObserver);\n }\n if (callback) {\n this._onParsedObserver = this.onParsedObservable.add(callback);\n }\n }\n /**\n * Callback raised when the loader creates a mesh after parsing the glTF properties of the mesh.\n * Note that the callback is called as soon as the mesh object is created, meaning some data may not have been setup yet for this mesh (vertex data, morph targets, material, ...)\n */\n set onMeshLoaded(callback) {\n if (this._onMeshLoadedObserver) {\n this.onMeshLoadedObservable.remove(this._onMeshLoadedObserver);\n }\n if (callback) {\n this._onMeshLoadedObserver = this.onMeshLoadedObservable.add(callback);\n }\n }\n /**\n * Callback raised when the loader creates a skin after parsing the glTF properties of the skin node.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/importers/glTF/glTFSkinning#ignoring-the-transform-of-the-skinned-mesh\n */\n set onSkinLoaded(callback) {\n if (this._onSkinLoadedObserver) {\n this.onSkinLoadedObservable.remove(this._onSkinLoadedObserver);\n }\n if (callback) {\n this._onSkinLoadedObserver = this.onSkinLoadedObservable.add((data) => callback(data.node, data.skinnedNode));\n }\n }\n /**\n * Callback raised when the loader creates a texture after parsing the glTF properties of the texture.\n */\n set onTextureLoaded(callback) {\n if (this._onTextureLoadedObserver) {\n this.onTextureLoadedObservable.remove(this._onTextureLoadedObserver);\n }\n if (callback) {\n this._onTextureLoadedObserver = this.onTextureLoadedObservable.add(callback);\n }\n }\n /**\n * Callback raised when the loader creates a material after parsing the glTF properties of the material.\n */\n set onMaterialLoaded(callback) {\n if (this._onMaterialLoadedObserver) {\n this.onMaterialLoadedObservable.remove(this._onMaterialLoadedObserver);\n }\n if (callback) {\n this._onMaterialLoadedObserver = this.onMaterialLoadedObservable.add(callback);\n }\n }\n /**\n * Callback raised when the loader creates a camera after parsing the glTF properties of the camera.\n */\n set onCameraLoaded(callback) {\n if (this._onCameraLoadedObserver) {\n this.onCameraLoadedObservable.remove(this._onCameraLoadedObserver);\n }\n if (callback) {\n this._onCameraLoadedObserver = this.onCameraLoadedObservable.add(callback);\n }\n }\n /**\n * Callback raised when the asset is completely loaded, immediately before the loader is disposed.\n * For assets with LODs, raised when all of the LODs are complete.\n * For assets without LODs, raised when the model is complete, immediately after the loader resolves the returned promise.\n */\n set onComplete(callback) {\n if (this._onCompleteObserver) {\n this.onCompleteObservable.remove(this._onCompleteObserver);\n }\n this._onCompleteObserver = this.onCompleteObservable.add(callback);\n }\n /**\n * Callback raised when an error occurs.\n */\n set onError(callback) {\n if (this._onErrorObserver) {\n this.onErrorObservable.remove(this._onErrorObserver);\n }\n this._onErrorObserver = this.onErrorObservable.add(callback);\n }\n /**\n * Callback raised after the loader is disposed.\n */\n set onDispose(callback) {\n if (this._onDisposeObserver) {\n this.onDisposeObservable.remove(this._onDisposeObserver);\n }\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\n }\n /**\n * Callback raised after a loader extension is created.\n */\n set onExtensionLoaded(callback) {\n if (this._onExtensionLoadedObserver) {\n this.onExtensionLoadedObservable.remove(this._onExtensionLoadedObserver);\n }\n this._onExtensionLoadedObserver = this.onExtensionLoadedObservable.add(callback);\n }\n /**\n * Defines if the loader logging is enabled.\n */\n get loggingEnabled() {\n return this._loggingEnabled;\n }\n set loggingEnabled(value) {\n if (this._loggingEnabled === value) {\n return;\n }\n this._loggingEnabled = value;\n if (this._loggingEnabled) {\n this._log = this._logEnabled;\n }\n else {\n this._log = this._logDisabled;\n }\n }\n /**\n * Defines if the loader should capture performance counters.\n */\n get capturePerformanceCounters() {\n return this._capturePerformanceCounters;\n }\n set capturePerformanceCounters(value) {\n if (this._capturePerformanceCounters === value) {\n return;\n }\n this._capturePerformanceCounters = value;\n if (this._capturePerformanceCounters) {\n this._startPerformanceCounter = this._startPerformanceCounterEnabled;\n this._endPerformanceCounter = this._endPerformanceCounterEnabled;\n }\n else {\n this._startPerformanceCounter = this._startPerformanceCounterDisabled;\n this._endPerformanceCounter = this._endPerformanceCounterDisabled;\n }\n }\n /**\n * Callback raised after a loader extension is created.\n */\n set onValidated(callback) {\n if (this._onValidatedObserver) {\n this.onValidatedObservable.remove(this._onValidatedObserver);\n }\n this._onValidatedObserver = this.onValidatedObservable.add(callback);\n }\n /**\n * Disposes the loader, releases resources during load, and cancels any outstanding requests.\n */\n dispose() {\n if (this._loader) {\n this._loader.dispose();\n this._loader = null;\n }\n for (const request of this._requests) {\n request.abort();\n }\n this._requests.length = 0;\n delete this._progressCallback;\n this.preprocessUrlAsync = (url) => Promise.resolve(url);\n this.onMeshLoadedObservable.clear();\n this.onSkinLoadedObservable.clear();\n this.onTextureLoadedObservable.clear();\n this.onMaterialLoadedObservable.clear();\n this.onCameraLoadedObservable.clear();\n this.onCompleteObservable.clear();\n this.onExtensionLoadedObservable.clear();\n this.onDisposeObservable.notifyObservers(undefined);\n this.onDisposeObservable.clear();\n }\n /**\n * @internal\n */\n loadFile(scene, fileOrUrl, rootUrl, onSuccess, onProgress, useArrayBuffer, onError, name) {\n if (ArrayBuffer.isView(fileOrUrl)) {\n this._loadBinary(scene, fileOrUrl, rootUrl, onSuccess, onError, name);\n return null;\n }\n this._progressCallback = onProgress;\n const fileName = fileOrUrl.name || Tools.GetFilename(fileOrUrl);\n if (useArrayBuffer) {\n if (this.useRangeRequests) {\n if (this.validate) {\n Logger.Warn(\"glTF validation is not supported when range requests are enabled\");\n }\n const fileRequest = {\n abort: () => { },\n onCompleteObservable: new Observable(),\n };\n const dataBuffer = {\n readAsync: (byteOffset, byteLength) => {\n return new Promise((resolve, reject) => {\n this._loadFile(scene, fileOrUrl, (data) => {\n resolve(new Uint8Array(data));\n }, true, (error) => {\n reject(error);\n }, (webRequest) => {\n webRequest.setRequestHeader(\"Range\", `bytes=${byteOffset}-${byteOffset + byteLength - 1}`);\n });\n });\n },\n byteLength: 0,\n };\n this._unpackBinaryAsync(new DataReader(dataBuffer)).then((loaderData) => {\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\n onSuccess(loaderData);\n }, onError ? (error) => onError(undefined, error) : undefined);\n return fileRequest;\n }\n return this._loadFile(scene, fileOrUrl, (data) => {\n this._validate(scene, new Uint8Array(data, 0, data.byteLength), rootUrl, fileName);\n this._unpackBinaryAsync(new DataReader({\n readAsync: (byteOffset, byteLength) => readAsync(data, byteOffset, byteLength),\n byteLength: data.byteLength,\n })).then((loaderData) => {\n onSuccess(loaderData);\n }, onError ? (error) => onError(undefined, error) : undefined);\n }, true, onError);\n }\n else {\n return this._loadFile(scene, fileOrUrl, (data) => {\n try {\n this._validate(scene, data, rootUrl, fileName);\n onSuccess({ json: this._parseJson(data) });\n }\n catch {\n if (onError) {\n onError();\n }\n }\n }, false, onError);\n }\n }\n _loadBinary(scene, data, rootUrl, onSuccess, onError, fileName) {\n this._validate(scene, new Uint8Array(data.buffer, data.byteOffset, data.byteLength), rootUrl, fileName);\n this._unpackBinaryAsync(new DataReader({\n readAsync: (byteOffset, byteLength) => readViewAsync(data, byteOffset, byteLength),\n byteLength: data.byteLength,\n })).then((loaderData) => {\n onSuccess(loaderData);\n }, onError ? (error) => onError(undefined, error) : undefined);\n }\n /**\n * @internal\n */\n importMeshAsync(meshesNames, scene, data, rootUrl, onProgress, fileName) {\n return Promise.resolve().then(() => {\n this.onParsedObservable.notifyObservers(data);\n this.onParsedObservable.clear();\n this._log(`Loading ${fileName || \"\"}`);\n this._loader = this._getLoader(data);\n return this._loader.importMeshAsync(meshesNames, scene, null, data, rootUrl, onProgress, fileName);\n });\n }\n /**\n * @internal\n */\n loadAsync(scene, data, rootUrl, onProgress, fileName) {\n return Promise.resolve().then(() => {\n this.onParsedObservable.notifyObservers(data);\n this.onParsedObservable.clear();\n this._log(`Loading ${fileName || \"\"}`);\n this._loader = this._getLoader(data);\n return this._loader.loadAsync(scene, data, rootUrl, onProgress, fileName);\n });\n }\n /**\n * @internal\n */\n loadAssetContainerAsync(scene, data, rootUrl, onProgress, fileName) {\n return Promise.resolve().then(() => {\n this.onParsedObservable.notifyObservers(data);\n this.onParsedObservable.clear();\n this._log(`Loading ${fileName || \"\"}`);\n this._loader = this._getLoader(data);\n // Prepare the asset container.\n const container = new AssetContainer(scene);\n // Get materials/textures when loading to add to container\n const materials = [];\n this.onMaterialLoadedObservable.add((material) => {\n materials.push(material);\n });\n const textures = [];\n this.onTextureLoadedObservable.add((texture) => {\n textures.push(texture);\n });\n const cameras = [];\n this.onCameraLoadedObservable.add((camera) => {\n cameras.push(camera);\n });\n const morphTargetManagers = [];\n this.onMeshLoadedObservable.add((mesh) => {\n if (mesh.morphTargetManager) {\n morphTargetManagers.push(mesh.morphTargetManager);\n }\n });\n return this._loader.importMeshAsync(null, scene, container, data, rootUrl, onProgress, fileName).then((result) => {\n Array.prototype.push.apply(container.geometries, result.geometries);\n Array.prototype.push.apply(container.meshes, result.meshes);\n Array.prototype.push.apply(container.particleSystems, result.particleSystems);\n Array.prototype.push.apply(container.skeletons, result.skeletons);\n Array.prototype.push.apply(container.animationGroups, result.animationGroups);\n Array.prototype.push.apply(container.materials, materials);\n Array.prototype.push.apply(container.textures, textures);\n Array.prototype.push.apply(container.lights, result.lights);\n Array.prototype.push.apply(container.transformNodes, result.transformNodes);\n Array.prototype.push.apply(container.cameras, cameras);\n Array.prototype.push.apply(container.morphTargetManagers, morphTargetManagers);\n return container;\n });\n });\n }\n /**\n * @internal\n */\n canDirectLoad(data) {\n return GLTFFileLoaderMetadata.canDirectLoad(data);\n }\n /**\n * @internal\n */\n directLoad(scene, data) {\n if (data.startsWith(\"base64,\" + GLTFMagicBase64Encoded) || // this is technically incorrect, but will continue to support for backcompat.\n data.startsWith(\";base64,\" + GLTFMagicBase64Encoded) ||\n data.startsWith(\"application/octet-stream;base64,\" + GLTFMagicBase64Encoded) ||\n data.startsWith(\"model/gltf-binary;base64,\" + GLTFMagicBase64Encoded)) {\n const arrayBuffer = DecodeBase64UrlToBinary(data);\n this._validate(scene, new Uint8Array(arrayBuffer, 0, arrayBuffer.byteLength));\n return this._unpackBinaryAsync(new DataReader({\n readAsync: (byteOffset, byteLength) => readAsync(arrayBuffer, byteOffset, byteLength),\n byteLength: arrayBuffer.byteLength,\n }));\n }\n this._validate(scene, data);\n return Promise.resolve({ json: this._parseJson(data) });\n }\n /** @internal */\n createPlugin(options) {\n return new GLTFFileLoader(options[GLTFFileLoaderMetadata.name]);\n }\n /**\n * The loader state or null if the loader is not active.\n */\n get loaderState() {\n return this._state;\n }\n /**\n * Returns a promise that resolves when the asset is completely loaded.\n * @returns a promise that resolves when the asset is completely loaded.\n */\n whenCompleteAsync() {\n return new Promise((resolve, reject) => {\n this.onCompleteObservable.addOnce(() => {\n resolve();\n });\n this.onErrorObservable.addOnce((reason) => {\n reject(reason);\n });\n });\n }\n /**\n * @internal\n */\n _setState(state) {\n if (this._state === state) {\n return;\n }\n this._state = state;\n this.onLoaderStateChangedObservable.notifyObservers(this._state);\n this._log(GLTFLoaderState[this._state]);\n }\n /**\n * @internal\n */\n _loadFile(scene, fileOrUrl, onSuccess, useArrayBuffer, onError, onOpened) {\n const request = scene._loadFile(fileOrUrl, onSuccess, (event) => {\n this._onProgress(event, request);\n }, true, useArrayBuffer, onError, onOpened);\n request.onCompleteObservable.add(() => {\n // Force the length computable to be true since we can guarantee the data is loaded.\n request._lengthComputable = true;\n request._total = request._loaded;\n });\n this._requests.push(request);\n return request;\n }\n _onProgress(event, request) {\n if (!this._progressCallback) {\n return;\n }\n request._lengthComputable = event.lengthComputable;\n request._loaded = event.loaded;\n request._total = event.total;\n let lengthComputable = true;\n let loaded = 0;\n let total = 0;\n for (const request of this._requests) {\n if (request._lengthComputable === undefined || request._loaded === undefined || request._total === undefined) {\n return;\n }\n lengthComputable = lengthComputable && request._lengthComputable;\n loaded += request._loaded;\n total += request._total;\n }\n this._progressCallback({\n lengthComputable: lengthComputable,\n loaded: loaded,\n total: lengthComputable ? total : 0,\n });\n }\n _validate(scene, data, rootUrl = \"\", fileName = \"\") {\n if (!this.validate) {\n return;\n }\n this._startPerformanceCounter(\"Validate JSON\");\n GLTFValidation.ValidateAsync(data, rootUrl, fileName, (uri) => {\n return this.preprocessUrlAsync(rootUrl + uri).then((url) => {\n return scene._loadFileAsync(url, undefined, true, true).then((data) => {\n return new Uint8Array(data, 0, data.byteLength);\n });\n });\n }).then((result) => {\n this._endPerformanceCounter(\"Validate JSON\");\n this.onValidatedObservable.notifyObservers(result);\n this.onValidatedObservable.clear();\n }, (reason) => {\n this._endPerformanceCounter(\"Validate JSON\");\n Tools.Warn(`Failed to validate: ${reason.message}`);\n this.onValidatedObservable.clear();\n });\n }\n _getLoader(loaderData) {\n const asset = loaderData.json.asset || {};\n this._log(`Asset version: ${asset.version}`);\n asset.minVersion && this._log(`Asset minimum version: ${asset.minVersion}`);\n asset.generator && this._log(`Asset generator: ${asset.generator}`);\n const version = GLTFFileLoader._parseVersion(asset.version);\n if (!version) {\n throw new Error(\"Invalid version: \" + asset.version);\n }\n if (asset.minVersion !== undefined) {\n const minVersion = GLTFFileLoader._parseVersion(asset.minVersion);\n if (!minVersion) {\n throw new Error(\"Invalid minimum version: \" + asset.minVersion);\n }\n if (GLTFFileLoader._compareVersion(minVersion, { major: 2, minor: 0 }) > 0) {\n throw new Error(\"Incompatible minimum version: \" + asset.minVersion);\n }\n }\n const createLoaders = {\n 1: GLTFFileLoader._CreateGLTF1Loader,\n 2: GLTFFileLoader._CreateGLTF2Loader,\n };\n const createLoader = createLoaders[version.major];\n if (!createLoader) {\n throw new Error(\"Unsupported version: \" + asset.version);\n }\n return createLoader(this);\n }\n _parseJson(json) {\n this._startPerformanceCounter(\"Parse JSON\");\n this._log(`JSON length: ${json.length}`);\n const parsed = JSON.parse(json);\n this._endPerformanceCounter(\"Parse JSON\");\n return parsed;\n }\n _unpackBinaryAsync(dataReader) {\n this._startPerformanceCounter(\"Unpack Binary\");\n // Read magic + version + length + json length + json format\n return dataReader.loadAsync(20).then(() => {\n const Binary = {\n Magic: 0x46546c67,\n };\n const magic = dataReader.readUint32();\n if (magic !== Binary.Magic) {\n throw new RuntimeError(\"Unexpected magic: \" + magic, ErrorCodes.GLTFLoaderUnexpectedMagicError);\n }\n const version = dataReader.readUint32();\n if (this.loggingEnabled) {\n this._log(`Binary version: ${version}`);\n }\n const length = dataReader.readUint32();\n if (!this.useRangeRequests && length !== dataReader.buffer.byteLength) {\n Logger.Warn(`Length in header does not match actual data length: ${length} != ${dataReader.buffer.byteLength}`);\n }\n let unpacked;\n switch (version) {\n case 1: {\n unpacked = this._unpackBinaryV1Async(dataReader, length);\n break;\n }\n case 2: {\n unpacked = this._unpackBinaryV2Async(dataReader, length);\n break;\n }\n default: {\n throw new Error(\"Unsupported version: \" + version);\n }\n }\n this._endPerformanceCounter(\"Unpack Binary\");\n return unpacked;\n });\n }\n _unpackBinaryV1Async(dataReader, length) {\n const ContentFormat = {\n JSON: 0,\n };\n const contentLength = dataReader.readUint32();\n const contentFormat = dataReader.readUint32();\n if (contentFormat !== ContentFormat.JSON) {\n throw new Error(`Unexpected content format: ${contentFormat}`);\n }\n const bodyLength = length - dataReader.byteOffset;\n const data = { json: this._parseJson(dataReader.readString(contentLength)), bin: null };\n if (bodyLength !== 0) {\n const startByteOffset = dataReader.byteOffset;\n data.bin = {\n readAsync: (byteOffset, byteLength) => dataReader.buffer.readAsync(startByteOffset + byteOffset, byteLength),\n byteLength: bodyLength,\n };\n }\n return Promise.resolve(data);\n }\n _unpackBinaryV2Async(dataReader, length) {\n const ChunkFormat = {\n JSON: 0x4e4f534a,\n BIN: 0x004e4942,\n };\n // Read the JSON chunk header.\n const chunkLength = dataReader.readUint32();\n const chunkFormat = dataReader.readUint32();\n if (chunkFormat !== ChunkFormat.JSON) {\n throw new Error(\"First chunk format is not JSON\");\n }\n // Bail if there are no other chunks.\n if (dataReader.byteOffset + chunkLength === length) {\n return dataReader.loadAsync(chunkLength).then(() => {\n return { json: this._parseJson(dataReader.readString(chunkLength)), bin: null };\n });\n }\n // Read the JSON chunk and the length and type of the next chunk.\n return dataReader.loadAsync(chunkLength + 8).then(() => {\n const data = { json: this._parseJson(dataReader.readString(chunkLength)), bin: null };\n const readAsync = () => {\n const chunkLength = dataReader.readUint32();\n const chunkFormat = dataReader.readUint32();\n switch (chunkFormat) {\n case ChunkFormat.JSON: {\n throw new Error(\"Unexpected JSON chunk\");\n }\n case ChunkFormat.BIN: {\n const startByteOffset = dataReader.byteOffset;\n data.bin = {\n readAsync: (byteOffset, byteLength) => dataReader.buffer.readAsync(startByteOffset + byteOffset, byteLength),\n byteLength: chunkLength,\n };\n dataReader.skipBytes(chunkLength);\n break;\n }\n default: {\n // ignore unrecognized chunkFormat\n dataReader.skipBytes(chunkLength);\n break;\n }\n }\n if (dataReader.byteOffset !== length) {\n return dataReader.loadAsync(8).then(readAsync);\n }\n return Promise.resolve(data);\n };\n return readAsync();\n });\n }\n static _parseVersion(version) {\n if (version === \"1.0\" || version === \"1.0.1\") {\n return {\n major: 1,\n minor: 0,\n };\n }\n const match = (version + \"\").match(/^(\\d+)\\.(\\d+)/);\n if (!match) {\n return null;\n }\n return {\n major: parseInt(match[1]),\n minor: parseInt(match[2]),\n };\n }\n static _compareVersion(a, b) {\n if (a.major > b.major) {\n return 1;\n }\n if (a.major < b.major) {\n return -1;\n }\n if (a.minor > b.minor) {\n return 1;\n }\n if (a.minor < b.minor) {\n return -1;\n }\n return 0;\n }\n /**\n * @internal\n */\n _logOpen(message) {\n this._log(message);\n this._logIndentLevel++;\n }\n /** @internal */\n _logClose() {\n --this._logIndentLevel;\n }\n _logEnabled(message) {\n const spaces = GLTFFileLoader._logSpaces.substring(0, this._logIndentLevel * 2);\n Logger.Log(`${spaces}${message}`);\n }\n _logDisabled(message) { }\n _startPerformanceCounterEnabled(counterName) {\n Tools.StartPerformanceCounter(counterName);\n }\n _startPerformanceCounterDisabled(counterName) { }\n _endPerformanceCounterEnabled(counterName) {\n Tools.EndPerformanceCounter(counterName);\n }\n _endPerformanceCounterDisabled(counterName) { }\n}\n// ------------------\n// End Common options\n// ------------------\n// ----------------\n// Begin V1 options\n// ----------------\n/**\n * Set this property to false to disable incremental loading which delays the loader from calling the success callback until after loading the meshes and shaders.\n * Textures always loads asynchronously. For example, the success callback can compute the bounding information of the loaded meshes when incremental loading is disabled.\n * Defaults to true.\n * @internal\n */\nGLTFFileLoader.IncrementalLoading = true;\n/**\n * Set this property to true in order to work with homogeneous coordinates, available with some converters and exporters.\n * Defaults to false. See https://en.wikipedia.org/wiki/Homogeneous_coordinates.\n * @internal\n */\nGLTFFileLoader.HomogeneousCoordinates = false;\nGLTFFileLoader._logSpaces = \" \";\nregisterSceneLoaderPlugin(new GLTFFileLoader());\n//# sourceMappingURL=glTFFileLoader.js.map","import { __decorate } from \"tslib\";\nimport { serialize } from \"../../Misc/decorators\";\nimport { CameraInputTypes } from \"../../Cameras/cameraInputsManager\";\nimport { PointerEventTypes } from \"../../Events/pointerEvents\";\nimport { Matrix, Vector3 } from \"../../Maths/math.vector\";\nimport { Tools } from \"../../Misc/tools\";\n/**\n * Manage the touch inputs to control the movement of a free camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/customizingCameraInputs\n */\nexport class FreeCameraTouchInput {\n /**\n * Manage the touch inputs to control the movement of a free camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/customizingCameraInputs\n * @param allowMouse Defines if mouse events can be treated as touch events\n */\n constructor(\n /**\n * [false] Define if mouse events can be treated as touch events\n */\n allowMouse = false) {\n this.allowMouse = allowMouse;\n /**\n * Defines the touch sensibility for rotation.\n * The lower the faster.\n */\n this.touchAngularSensibility = 200000.0;\n /**\n * Defines the touch sensibility for move.\n * The lower the faster.\n */\n this.touchMoveSensibility = 250.0;\n /**\n * Swap touch actions so that one touch is used for rotation and multiple for movement\n */\n this.singleFingerRotate = false;\n this._offsetX = null;\n this._offsetY = null;\n this._pointerPressed = new Array();\n this._isSafari = Tools.IsSafari();\n }\n /**\n * Attach the input controls to a specific dom element to get the input from.\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\n */\n attachControl(noPreventDefault) {\n // eslint-disable-next-line prefer-rest-params\n noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);\n let previousPosition = null;\n if (this._pointerInput === undefined) {\n this._onLostFocus = () => {\n this._offsetX = null;\n this._offsetY = null;\n };\n this._pointerInput = (p) => {\n const evt = p.event;\n const isMouseEvent = evt.pointerType === \"mouse\" || (this._isSafari && typeof evt.pointerType === \"undefined\");\n if (!this.allowMouse && isMouseEvent) {\n return;\n }\n if (p.type === PointerEventTypes.POINTERDOWN) {\n if (!noPreventDefault) {\n evt.preventDefault();\n }\n this._pointerPressed.push(evt.pointerId);\n if (this._pointerPressed.length !== 1) {\n return;\n }\n previousPosition = {\n x: evt.clientX,\n y: evt.clientY,\n };\n }\n else if (p.type === PointerEventTypes.POINTERUP) {\n if (!noPreventDefault) {\n evt.preventDefault();\n }\n const index = this._pointerPressed.indexOf(evt.pointerId);\n if (index === -1) {\n return;\n }\n this._pointerPressed.splice(index, 1);\n if (index != 0) {\n return;\n }\n previousPosition = null;\n this._offsetX = null;\n this._offsetY = null;\n }\n else if (p.type === PointerEventTypes.POINTERMOVE) {\n if (!noPreventDefault) {\n evt.preventDefault();\n }\n if (!previousPosition) {\n return;\n }\n const index = this._pointerPressed.indexOf(evt.pointerId);\n if (index != 0) {\n return;\n }\n this._offsetX = evt.clientX - previousPosition.x;\n this._offsetY = -(evt.clientY - previousPosition.y);\n }\n };\n }\n this._observer = this.camera\n .getScene()\n ._inputManager._addCameraPointerObserver(this._pointerInput, PointerEventTypes.POINTERDOWN | PointerEventTypes.POINTERUP | PointerEventTypes.POINTERMOVE);\n if (this._onLostFocus) {\n const engine = this.camera.getEngine();\n const element = engine.getInputElement();\n element && element.addEventListener(\"blur\", this._onLostFocus);\n }\n }\n /**\n * Detach the current controls from the specified dom element.\n */\n detachControl() {\n if (this._pointerInput) {\n if (this._observer) {\n this.camera.getScene()._inputManager._removeCameraPointerObserver(this._observer);\n this._observer = null;\n }\n if (this._onLostFocus) {\n const engine = this.camera.getEngine();\n const element = engine.getInputElement();\n element && element.removeEventListener(\"blur\", this._onLostFocus);\n this._onLostFocus = null;\n }\n this._pointerPressed.length = 0;\n this._offsetX = null;\n this._offsetY = null;\n }\n }\n /**\n * Update the current camera state depending on the inputs that have been used this frame.\n * This is a dynamically created lambda to avoid the performance penalty of looping for inputs in the render loop.\n */\n checkInputs() {\n if (this._offsetX === null || this._offsetY === null) {\n return;\n }\n if (this._offsetX === 0 && this._offsetY === 0) {\n return;\n }\n const camera = this.camera;\n const handednessMultiplier = camera._calculateHandednessMultiplier();\n camera.cameraRotation.y = (handednessMultiplier * this._offsetX) / this.touchAngularSensibility;\n const rotateCamera = (this.singleFingerRotate && this._pointerPressed.length === 1) || (!this.singleFingerRotate && this._pointerPressed.length > 1);\n if (rotateCamera) {\n camera.cameraRotation.x = -this._offsetY / this.touchAngularSensibility;\n }\n else {\n const speed = camera._computeLocalCameraSpeed();\n const direction = new Vector3(0, 0, this.touchMoveSensibility !== 0 ? (speed * this._offsetY) / this.touchMoveSensibility : 0);\n Matrix.RotationYawPitchRollToRef(camera.rotation.y, camera.rotation.x, 0, camera._cameraRotationMatrix);\n camera.cameraDirection.addInPlace(Vector3.TransformCoordinates(direction, camera._cameraRotationMatrix));\n }\n }\n /**\n * Gets the class name of the current input.\n * @returns the class name\n */\n getClassName() {\n return \"FreeCameraTouchInput\";\n }\n /**\n * Get the friendly name associated with the input class.\n * @returns the input friendly name\n */\n getSimpleName() {\n return \"touch\";\n }\n}\n__decorate([\n serialize()\n], FreeCameraTouchInput.prototype, \"touchAngularSensibility\", void 0);\n__decorate([\n serialize()\n], FreeCameraTouchInput.prototype, \"touchMoveSensibility\", void 0);\nCameraInputTypes[\"FreeCameraTouchInput\"] = FreeCameraTouchInput;\n//# sourceMappingURL=freeCameraTouchInput.js.map","import { CameraInputsManager } from \"./cameraInputsManager\";\nimport { FreeCameraKeyboardMoveInput } from \"../Cameras/Inputs/freeCameraKeyboardMoveInput\";\nimport { FreeCameraMouseInput } from \"../Cameras/Inputs/freeCameraMouseInput\";\nimport { FreeCameraMouseWheelInput } from \"../Cameras/Inputs/freeCameraMouseWheelInput\";\nimport { FreeCameraTouchInput } from \"../Cameras/Inputs/freeCameraTouchInput\";\n/**\n * Default Inputs manager for the FreeCamera.\n * It groups all the default supported inputs for ease of use.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/customizingCameraInputs\n */\nexport class FreeCameraInputsManager extends CameraInputsManager {\n /**\n * Instantiates a new FreeCameraInputsManager.\n * @param camera Defines the camera the inputs belong to\n */\n constructor(camera) {\n super(camera);\n /**\n * @internal\n */\n this._mouseInput = null;\n /**\n * @internal\n */\n this._mouseWheelInput = null;\n }\n /**\n * Add keyboard input support to the input manager.\n * @returns the current input manager\n */\n addKeyboard() {\n this.add(new FreeCameraKeyboardMoveInput());\n return this;\n }\n /**\n * Add mouse input support to the input manager.\n * @param touchEnabled if the FreeCameraMouseInput should support touch (default: true)\n * @returns the current input manager\n */\n addMouse(touchEnabled = true) {\n if (!this._mouseInput) {\n this._mouseInput = new FreeCameraMouseInput(touchEnabled);\n this.add(this._mouseInput);\n }\n return this;\n }\n /**\n * Removes the mouse input support from the manager\n * @returns the current input manager\n */\n removeMouse() {\n if (this._mouseInput) {\n this.remove(this._mouseInput);\n }\n return this;\n }\n /**\n * Add mouse wheel input support to the input manager.\n * @returns the current input manager\n */\n addMouseWheel() {\n if (!this._mouseWheelInput) {\n this._mouseWheelInput = new FreeCameraMouseWheelInput();\n this.add(this._mouseWheelInput);\n }\n return this;\n }\n /**\n * Removes the mouse wheel input support from the manager\n * @returns the current input manager\n */\n removeMouseWheel() {\n if (this._mouseWheelInput) {\n this.remove(this._mouseWheelInput);\n }\n return this;\n }\n /**\n * Add touch input support to the input manager.\n * @returns the current input manager\n */\n addTouch() {\n this.add(new FreeCameraTouchInput());\n return this;\n }\n /**\n * Remove all attached input methods from a camera\n */\n clear() {\n super.clear();\n this._mouseInput = null;\n }\n}\n//# sourceMappingURL=freeCameraInputsManager.js.map","import { __decorate } from \"tslib\";\nimport { serializeAsVector3, serialize } from \"../Misc/decorators\";\nimport { Vector3, Vector2 } from \"../Maths/math.vector\";\nimport { TargetCamera } from \"./targetCamera\";\nimport { FreeCameraInputsManager } from \"./freeCameraInputsManager\";\nimport { Tools } from \"../Misc/tools\";\nimport { RegisterClass } from \"../Misc/typeStore\";\nimport { AbstractEngine } from \"core/Engines/abstractEngine\";\n/**\n * This represents a free type of camera. It can be useful in First Person Shooter game for instance.\n * Please consider using the new UniversalCamera instead as it adds more functionality like the gamepad.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_introduction#universal-camera\n */\nexport class FreeCamera extends TargetCamera {\n /**\n * Gets the input sensibility for a mouse input. (default is 2000.0)\n * Higher values reduce sensitivity.\n */\n get angularSensibility() {\n const mouse = this.inputs.attached[\"mouse\"];\n if (mouse) {\n return mouse.angularSensibility;\n }\n return 0;\n }\n /**\n * Sets the input sensibility for a mouse input. (default is 2000.0)\n * Higher values reduce sensitivity.\n */\n set angularSensibility(value) {\n const mouse = this.inputs.attached[\"mouse\"];\n if (mouse) {\n mouse.angularSensibility = value;\n }\n }\n /**\n * Gets or Set the list of keyboard keys used to control the forward move of the camera.\n */\n get keysUp() {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n return keyboard.keysUp;\n }\n return [];\n }\n set keysUp(value) {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n keyboard.keysUp = value;\n }\n }\n /**\n * Gets or Set the list of keyboard keys used to control the upward move of the camera.\n */\n get keysUpward() {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n return keyboard.keysUpward;\n }\n return [];\n }\n set keysUpward(value) {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n keyboard.keysUpward = value;\n }\n }\n /**\n * Gets or Set the list of keyboard keys used to control the backward move of the camera.\n */\n get keysDown() {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n return keyboard.keysDown;\n }\n return [];\n }\n set keysDown(value) {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n keyboard.keysDown = value;\n }\n }\n /**\n * Gets or Set the list of keyboard keys used to control the downward move of the camera.\n */\n get keysDownward() {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n return keyboard.keysDownward;\n }\n return [];\n }\n set keysDownward(value) {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n keyboard.keysDownward = value;\n }\n }\n /**\n * Gets or Set the list of keyboard keys used to control the left strafe move of the camera.\n */\n get keysLeft() {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n return keyboard.keysLeft;\n }\n return [];\n }\n set keysLeft(value) {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n keyboard.keysLeft = value;\n }\n }\n /**\n * Gets or Set the list of keyboard keys used to control the right strafe move of the camera.\n */\n get keysRight() {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n return keyboard.keysRight;\n }\n return [];\n }\n set keysRight(value) {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n keyboard.keysRight = value;\n }\n }\n /**\n * Gets or Set the list of keyboard keys used to control the left rotation move of the camera.\n */\n get keysRotateLeft() {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n return keyboard.keysRotateLeft;\n }\n return [];\n }\n set keysRotateLeft(value) {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n keyboard.keysRotateLeft = value;\n }\n }\n /**\n * Gets or Set the list of keyboard keys used to control the right rotation move of the camera.\n */\n get keysRotateRight() {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n return keyboard.keysRotateRight;\n }\n return [];\n }\n set keysRotateRight(value) {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n keyboard.keysRotateRight = value;\n }\n }\n /**\n * Gets or Set the list of keyboard keys used to control the up rotation move of the camera.\n */\n get keysRotateUp() {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n return keyboard.keysRotateUp;\n }\n return [];\n }\n set keysRotateUp(value) {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n keyboard.keysRotateUp = value;\n }\n }\n /**\n * Gets or Set the list of keyboard keys used to control the down rotation move of the camera.\n */\n get keysRotateDown() {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n return keyboard.keysRotateDown;\n }\n return [];\n }\n set keysRotateDown(value) {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n keyboard.keysRotateDown = value;\n }\n }\n /**\n * Instantiates a Free Camera.\n * This represents a free type of camera. It can be useful in First Person Shooter game for instance.\n * Please consider using the new UniversalCamera instead as it adds more functionality like touch to this camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_introduction#universal-camera\n * @param name Define the name of the camera in the scene\n * @param position Define the start position of the camera in the scene\n * @param scene Define the scene the camera belongs to\n * @param setActiveOnSceneIfNoneActive Defines whether the camera should be marked as active if not other active cameras have been defined\n */\n constructor(name, position, scene, setActiveOnSceneIfNoneActive = true) {\n super(name, position, scene, setActiveOnSceneIfNoneActive);\n /**\n * Define the collision ellipsoid of the camera.\n * This is helpful to simulate a camera body like the player body around the camera\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions#arcrotatecamera\n */\n this.ellipsoid = new Vector3(0.5, 1, 0.5);\n /**\n * Define an offset for the position of the ellipsoid around the camera.\n * This can be helpful to determine the center of the body near the gravity center of the body\n * instead of its head.\n */\n this.ellipsoidOffset = new Vector3(0, 0, 0);\n /**\n * Enable or disable collisions of the camera with the rest of the scene objects.\n */\n this.checkCollisions = false;\n /**\n * Enable or disable gravity on the camera.\n */\n this.applyGravity = false;\n this._needMoveForGravity = false;\n this._oldPosition = Vector3.Zero();\n this._diffPosition = Vector3.Zero();\n this._newPosition = Vector3.Zero();\n // Collisions\n this._collisionMask = -1;\n this._onCollisionPositionChange = (collisionId, newPosition, collidedMesh = null) => {\n this._newPosition.copyFrom(newPosition);\n this._newPosition.subtractToRef(this._oldPosition, this._diffPosition);\n if (this._diffPosition.length() > AbstractEngine.CollisionsEpsilon) {\n this.position.addToRef(this._diffPosition, this._deferredPositionUpdate);\n if (!this._deferOnly) {\n this.position.copyFrom(this._deferredPositionUpdate);\n }\n else {\n this._deferredUpdated = true;\n }\n // call onCollide, if defined. Note that in case of deferred update, the actual position change might happen in the next frame.\n if (this.onCollide && collidedMesh) {\n this.onCollide(collidedMesh);\n }\n }\n };\n this.inputs = new FreeCameraInputsManager(this);\n this.inputs.addKeyboard().addMouse();\n }\n /**\n * Attached controls to the current camera.\n * @param ignored defines an ignored parameter kept for backward compatibility.\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\n */\n attachControl(ignored, noPreventDefault) {\n // eslint-disable-next-line prefer-rest-params\n noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);\n this.inputs.attachElement(noPreventDefault);\n }\n /**\n * Detach the current controls from the specified dom element.\n */\n detachControl() {\n this.inputs.detachElement();\n this.cameraDirection = new Vector3(0, 0, 0);\n this.cameraRotation = new Vector2(0, 0);\n }\n /**\n * Define a collision mask to limit the list of object the camera can collide with\n */\n get collisionMask() {\n return this._collisionMask;\n }\n set collisionMask(mask) {\n this._collisionMask = !isNaN(mask) ? mask : -1;\n }\n /**\n * @internal\n */\n _collideWithWorld(displacement) {\n let globalPosition;\n if (this.parent) {\n globalPosition = Vector3.TransformCoordinates(this.position, this.parent.getWorldMatrix());\n }\n else {\n globalPosition = this.position;\n }\n globalPosition.subtractFromFloatsToRef(0, this.ellipsoid.y, 0, this._oldPosition);\n this._oldPosition.addInPlace(this.ellipsoidOffset);\n const coordinator = this.getScene().collisionCoordinator;\n if (!this._collider) {\n this._collider = coordinator.createCollider();\n }\n this._collider._radius = this.ellipsoid;\n this._collider.collisionMask = this._collisionMask;\n //no need for clone, as long as gravity is not on.\n let actualDisplacement = displacement;\n //add gravity to the direction to prevent the dual-collision checking\n if (this.applyGravity) {\n //this prevents mending with cameraDirection, a global variable of the free camera class.\n actualDisplacement = displacement.add(this.getScene().gravity);\n }\n coordinator.getNewPosition(this._oldPosition, actualDisplacement, this._collider, 3, null, this._onCollisionPositionChange, this.uniqueId);\n }\n /** @internal */\n _checkInputs() {\n if (!this._localDirection) {\n this._localDirection = Vector3.Zero();\n this._transformedDirection = Vector3.Zero();\n }\n this.inputs.checkInputs();\n super._checkInputs();\n }\n /**\n * Enable movement without a user input. This allows gravity to always be applied.\n */\n set needMoveForGravity(value) {\n this._needMoveForGravity = value;\n }\n /**\n * When true, gravity is applied whether there is user input or not.\n */\n get needMoveForGravity() {\n return this._needMoveForGravity;\n }\n /** @internal */\n _decideIfNeedsToMove() {\n return this._needMoveForGravity || Math.abs(this.cameraDirection.x) > 0 || Math.abs(this.cameraDirection.y) > 0 || Math.abs(this.cameraDirection.z) > 0;\n }\n /** @internal */\n _updatePosition() {\n if (this.checkCollisions && this.getScene().collisionsEnabled) {\n this._collideWithWorld(this.cameraDirection);\n }\n else {\n super._updatePosition();\n }\n }\n /**\n * Destroy the camera and release the current resources hold by it.\n */\n dispose() {\n this.inputs.clear();\n super.dispose();\n }\n /**\n * Gets the current object class name.\n * @returns the class name\n */\n getClassName() {\n return \"FreeCamera\";\n }\n}\n__decorate([\n serializeAsVector3()\n], FreeCamera.prototype, \"ellipsoid\", void 0);\n__decorate([\n serializeAsVector3()\n], FreeCamera.prototype, \"ellipsoidOffset\", void 0);\n__decorate([\n serialize()\n], FreeCamera.prototype, \"checkCollisions\", void 0);\n__decorate([\n serialize()\n], FreeCamera.prototype, \"applyGravity\", void 0);\n// Register Class Name\nRegisterClass(\"BABYLON.FreeCamera\", FreeCamera);\n//# sourceMappingURL=freeCamera.js.map","import { Vector3, Quaternion, Matrix, TmpVectors } from \"../Maths/math.vector\";\nimport { BuildArray } from \"../Misc/arrayTools\";\nimport { Node } from \"../node\";\n/**\n * Class used to store bone information\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/bonesSkeletons\n */\nexport class Bone extends Node {\n /** @internal */\n get _matrix() {\n this._compose();\n return this._localMatrix;\n }\n /** @internal */\n set _matrix(value) {\n // skip if the matrices are the same\n if (value.updateFlag === this._localMatrix.updateFlag && !this._needToCompose) {\n return;\n }\n this._needToCompose = false; // in case there was a pending compose\n this._localMatrix.copyFrom(value);\n this._markAsDirtyAndDecompose();\n }\n /**\n * Create a new bone\n * @param name defines the bone name\n * @param skeleton defines the parent skeleton\n * @param parentBone defines the parent (can be null if the bone is the root)\n * @param localMatrix defines the local matrix (default: identity)\n * @param restMatrix defines the rest matrix (default: localMatrix)\n * @param bindMatrix defines the bind matrix (default: localMatrix)\n * @param index defines index of the bone in the hierarchy (default: null)\n */\n constructor(\n /**\n * defines the bone name\n */\n name, skeleton, parentBone = null, localMatrix = null, restMatrix = null, bindMatrix = null, index = null) {\n super(name, skeleton.getScene(), false);\n this.name = name;\n /**\n * Gets the list of child bones\n */\n this.children = [];\n /** Gets the animations associated with this bone */\n this.animations = [];\n /**\n * @internal Internal only\n * Set this value to map this bone to a different index in the transform matrices\n * Set this value to -1 to exclude the bone from the transform matrices\n */\n this._index = null;\n this._scalingDeterminant = 1;\n this._needToDecompose = true;\n this._needToCompose = false;\n /** @internal */\n this._linkedTransformNode = null;\n /** @internal */\n this._waitingTransformNodeId = null;\n this._skeleton = skeleton;\n this._localMatrix = localMatrix?.clone() ?? Matrix.Identity();\n this._restMatrix = restMatrix ?? this._localMatrix.clone();\n this._bindMatrix = bindMatrix ?? this._localMatrix.clone();\n this._index = index;\n this._absoluteMatrix = new Matrix();\n this._absoluteBindMatrix = new Matrix();\n this._absoluteInverseBindMatrix = new Matrix();\n this._finalMatrix = new Matrix();\n skeleton.bones.push(this);\n this.setParent(parentBone, false);\n this._updateAbsoluteBindMatrices();\n }\n /**\n * Gets the current object class name.\n * @returns the class name\n */\n getClassName() {\n return \"Bone\";\n }\n // Members\n /**\n * Gets the parent skeleton\n * @returns a skeleton\n */\n getSkeleton() {\n return this._skeleton;\n }\n get parent() {\n return this._parentNode;\n }\n /**\n * Gets parent bone\n * @returns a bone or null if the bone is the root of the bone hierarchy\n */\n getParent() {\n return this.parent;\n }\n /**\n * Returns an array containing the children of the bone\n * @returns an array containing the children of the bone (can be empty if the bone has no children)\n */\n getChildren() {\n return this.children;\n }\n /**\n * Gets the node index in matrix array generated for rendering\n * @returns the node index\n */\n getIndex() {\n return this._index === null ? this.getSkeleton().bones.indexOf(this) : this._index;\n }\n set parent(newParent) {\n this.setParent(newParent);\n }\n /**\n * Sets the parent bone\n * @param parent defines the parent (can be null if the bone is the root)\n * @param updateAbsoluteBindMatrices defines if the absolute bind and absolute inverse bind matrices must be updated\n */\n setParent(parent, updateAbsoluteBindMatrices = true) {\n if (this.parent === parent) {\n return;\n }\n if (this.parent) {\n const index = this.parent.children.indexOf(this);\n if (index !== -1) {\n this.parent.children.splice(index, 1);\n }\n }\n this._parentNode = parent;\n if (this.parent) {\n this.parent.children.push(this);\n }\n if (updateAbsoluteBindMatrices) {\n this._updateAbsoluteBindMatrices();\n }\n this.markAsDirty();\n }\n /**\n * Gets the local matrix\n * @returns the local matrix\n */\n getLocalMatrix() {\n this._compose();\n return this._localMatrix;\n }\n /**\n * Gets the bind matrix\n * @returns the bind matrix\n */\n getBindMatrix() {\n return this._bindMatrix;\n }\n /**\n * Gets the bind matrix.\n * @returns the bind matrix\n * @deprecated Please use getBindMatrix instead\n */\n getBaseMatrix() {\n return this.getBindMatrix();\n }\n /**\n * Gets the rest matrix\n * @returns the rest matrix\n */\n getRestMatrix() {\n return this._restMatrix;\n }\n /**\n * Gets the rest matrix\n * @returns the rest matrix\n * @deprecated Please use getRestMatrix instead\n */\n getRestPose() {\n return this.getRestMatrix();\n }\n /**\n * Sets the rest matrix\n * @param matrix the local-space rest matrix to set for this bone\n */\n setRestMatrix(matrix) {\n this._restMatrix.copyFrom(matrix);\n }\n /**\n * Sets the rest matrix\n * @param matrix the local-space rest to set for this bone\n * @deprecated Please use setRestMatrix instead\n */\n setRestPose(matrix) {\n this.setRestMatrix(matrix);\n }\n /**\n * Gets the bind matrix\n * @returns the bind matrix\n * @deprecated Please use getBindMatrix instead\n */\n getBindPose() {\n return this.getBindMatrix();\n }\n /**\n * Sets the bind matrix\n * This will trigger a recomputation of the absolute bind and absolute inverse bind matrices for this bone and its children\n * Note that the local matrix will also be set with the matrix passed in parameter!\n * @param matrix the local-space bind matrix to set for this bone\n */\n setBindMatrix(matrix) {\n this.updateMatrix(matrix);\n }\n /**\n * Sets the bind matrix\n * @param matrix the local-space bind to set for this bone\n * @deprecated Please use setBindMatrix instead\n */\n setBindPose(matrix) {\n this.setBindMatrix(matrix);\n }\n /**\n * Gets the matrix used to store the final world transformation of the bone (ie. the matrix sent to shaders)\n * @returns the final world matrix\n */\n getFinalMatrix() {\n return this._finalMatrix;\n }\n /**\n * Gets the matrix used to store the final world transformation of the bone (ie. the matrix sent to shaders)\n * @deprecated Please use getFinalMatrix instead\n * @returns the final world matrix\n */\n getWorldMatrix() {\n return this.getFinalMatrix();\n }\n /**\n * Sets the local matrix to the rest matrix\n */\n returnToRest() {\n if (this._linkedTransformNode) {\n const localScaling = TmpVectors.Vector3[0];\n const localRotation = TmpVectors.Quaternion[0];\n const localPosition = TmpVectors.Vector3[1];\n this.getRestMatrix().decompose(localScaling, localRotation, localPosition);\n this._linkedTransformNode.position.copyFrom(localPosition);\n this._linkedTransformNode.rotationQuaternion = this._linkedTransformNode.rotationQuaternion ?? Quaternion.Identity();\n this._linkedTransformNode.rotationQuaternion.copyFrom(localRotation);\n this._linkedTransformNode.scaling.copyFrom(localScaling);\n }\n else {\n this._matrix = this._restMatrix;\n }\n }\n /**\n * Gets the inverse of the bind matrix, in world space (relative to the skeleton root)\n * @returns the inverse bind matrix, in world space\n */\n getAbsoluteInverseBindMatrix() {\n return this._absoluteInverseBindMatrix;\n }\n /**\n * Gets the inverse of the bind matrix, in world space (relative to the skeleton root)\n * @returns the inverse bind matrix, in world space\n * @deprecated Please use getAbsoluteInverseBindMatrix instead\n */\n getInvertedAbsoluteTransform() {\n return this.getAbsoluteInverseBindMatrix();\n }\n /**\n * Gets the bone matrix, in world space (relative to the skeleton root)\n * @returns the bone matrix, in world space\n */\n getAbsoluteMatrix() {\n return this._absoluteMatrix;\n }\n /**\n * Gets the bone matrix, in world space (relative to the skeleton root)\n * @returns the bone matrix, in world space\n * @deprecated Please use getAbsoluteMatrix instead\n */\n getAbsoluteTransform() {\n return this._absoluteMatrix;\n }\n /**\n * Links with the given transform node.\n * The local matrix of this bone is overwritten by the transform of the node every frame.\n * @param transformNode defines the transform node to link to\n */\n linkTransformNode(transformNode) {\n if (this._linkedTransformNode) {\n this._skeleton._numBonesWithLinkedTransformNode--;\n }\n this._linkedTransformNode = transformNode;\n if (this._linkedTransformNode) {\n this._skeleton._numBonesWithLinkedTransformNode++;\n }\n }\n // Properties (matches TransformNode properties)\n /**\n * Gets the node used to drive the bone's transformation\n * @returns a transform node or null\n */\n getTransformNode() {\n return this._linkedTransformNode;\n }\n /** Gets or sets current position (in local space) */\n get position() {\n this._decompose();\n return this._localPosition;\n }\n set position(newPosition) {\n this._decompose();\n this._localPosition.copyFrom(newPosition);\n this._markAsDirtyAndCompose();\n }\n /** Gets or sets current rotation (in local space) */\n get rotation() {\n return this.getRotation();\n }\n set rotation(newRotation) {\n this.setRotation(newRotation);\n }\n /** Gets or sets current rotation quaternion (in local space) */\n get rotationQuaternion() {\n this._decompose();\n return this._localRotation;\n }\n set rotationQuaternion(newRotation) {\n this.setRotationQuaternion(newRotation);\n }\n /** Gets or sets current scaling (in local space) */\n get scaling() {\n return this.getScale();\n }\n set scaling(newScaling) {\n this.setScale(newScaling);\n }\n /**\n * Gets the animation properties override\n */\n get animationPropertiesOverride() {\n return this._skeleton.animationPropertiesOverride;\n }\n // Methods\n _decompose() {\n if (!this._needToDecompose) {\n return;\n }\n this._needToDecompose = false;\n if (!this._localScaling) {\n this._localScaling = Vector3.Zero();\n this._localRotation = Quaternion.Zero();\n this._localPosition = Vector3.Zero();\n }\n this._localMatrix.decompose(this._localScaling, this._localRotation, this._localPosition);\n }\n _compose() {\n if (!this._needToCompose) {\n return;\n }\n if (!this._localScaling) {\n this._needToCompose = false;\n return;\n }\n this._needToCompose = false;\n Matrix.ComposeToRef(this._localScaling, this._localRotation, this._localPosition, this._localMatrix);\n }\n /**\n * Update the bind (and optionally the local) matrix\n * @param bindMatrix defines the new matrix to set to the bind/local matrix, in local space\n * @param updateAbsoluteBindMatrices defines if the absolute bind and absolute inverse bind matrices must be recomputed (default: true)\n * @param updateLocalMatrix defines if the local matrix should also be updated with the matrix passed in parameter (default: true)\n */\n updateMatrix(bindMatrix, updateAbsoluteBindMatrices = true, updateLocalMatrix = true) {\n this._bindMatrix.copyFrom(bindMatrix);\n if (updateAbsoluteBindMatrices) {\n this._updateAbsoluteBindMatrices();\n }\n if (updateLocalMatrix) {\n this._matrix = bindMatrix;\n }\n else {\n this.markAsDirty();\n }\n }\n /**\n * @internal\n */\n _updateAbsoluteBindMatrices(bindMatrix, updateChildren = true) {\n if (!bindMatrix) {\n bindMatrix = this._bindMatrix;\n }\n if (this.parent) {\n bindMatrix.multiplyToRef(this.parent._absoluteBindMatrix, this._absoluteBindMatrix);\n }\n else {\n this._absoluteBindMatrix.copyFrom(bindMatrix);\n }\n this._absoluteBindMatrix.invertToRef(this._absoluteInverseBindMatrix);\n if (updateChildren) {\n for (let index = 0; index < this.children.length; index++) {\n this.children[index]._updateAbsoluteBindMatrices();\n }\n }\n this._scalingDeterminant = this._absoluteBindMatrix.determinant() < 0 ? -1 : 1;\n }\n /**\n * Flag the bone as dirty (Forcing it to update everything)\n * @returns this bone\n */\n markAsDirty() {\n this._currentRenderId++;\n this._childUpdateId++;\n this._skeleton._markAsDirty();\n return this;\n }\n /** @internal */\n _markAsDirtyAndCompose() {\n this.markAsDirty();\n this._needToCompose = true;\n }\n _markAsDirtyAndDecompose() {\n this.markAsDirty();\n this._needToDecompose = true;\n }\n _updatePosition(vec, space = 0 /* Space.LOCAL */, tNode, translationMode = true) {\n const lm = this.getLocalMatrix();\n if (space == 0 /* Space.LOCAL */) {\n if (translationMode) {\n lm.addAtIndex(12, vec.x);\n lm.addAtIndex(13, vec.y);\n lm.addAtIndex(14, vec.z);\n }\n else {\n lm.setTranslationFromFloats(vec.x, vec.y, vec.z);\n }\n }\n else {\n let wm = null;\n //tNode.getWorldMatrix() needs to be called before skeleton.computeAbsoluteMatrices()\n if (tNode) {\n wm = tNode.getWorldMatrix();\n }\n this._skeleton.computeAbsoluteMatrices();\n const tmat = Bone._TmpMats[0];\n const tvec = Bone._TmpVecs[0];\n if (this.parent) {\n if (tNode && wm) {\n tmat.copyFrom(this.parent.getAbsoluteMatrix());\n tmat.multiplyToRef(wm, tmat);\n }\n else {\n tmat.copyFrom(this.parent.getAbsoluteMatrix());\n }\n }\n else {\n Matrix.IdentityToRef(tmat);\n }\n if (translationMode) {\n tmat.setTranslationFromFloats(0, 0, 0);\n }\n tmat.invert();\n Vector3.TransformCoordinatesToRef(vec, tmat, tvec);\n if (translationMode) {\n lm.addAtIndex(12, tvec.x);\n lm.addAtIndex(13, tvec.y);\n lm.addAtIndex(14, tvec.z);\n }\n else {\n lm.setTranslationFromFloats(tvec.x, tvec.y, tvec.z);\n }\n }\n this._markAsDirtyAndDecompose();\n }\n /**\n * Translate the bone in local or world space\n * @param vec The amount to translate the bone\n * @param space The space that the translation is in (default: Space.LOCAL)\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n translate(vec, space = 0 /* Space.LOCAL */, tNode) {\n this._updatePosition(vec, space, tNode, true);\n }\n /**\n * Set the position of the bone in local or world space\n * @param position The position to set the bone\n * @param space The space that the position is in (default: Space.LOCAL)\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setPosition(position, space = 0 /* Space.LOCAL */, tNode) {\n this._updatePosition(position, space, tNode, false);\n }\n /**\n * Set the absolute position of the bone (world space)\n * @param position The position to set the bone\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setAbsolutePosition(position, tNode) {\n this.setPosition(position, 1 /* Space.WORLD */, tNode);\n }\n /**\n * Scale the bone on the x, y and z axes (in local space)\n * @param x The amount to scale the bone on the x axis\n * @param y The amount to scale the bone on the y axis\n * @param z The amount to scale the bone on the z axis\n * @param scaleChildren sets this to true if children of the bone should be scaled as well (false by default)\n */\n scale(x, y, z, scaleChildren = false) {\n const locMat = this.getLocalMatrix();\n // Apply new scaling on top of current local matrix\n const scaleMat = Bone._TmpMats[0];\n Matrix.ScalingToRef(x, y, z, scaleMat);\n scaleMat.multiplyToRef(locMat, locMat);\n // Invert scaling matrix and apply the inverse to all children\n scaleMat.invert();\n for (const child of this.children) {\n const cm = child.getLocalMatrix();\n cm.multiplyToRef(scaleMat, cm);\n cm.multiplyAtIndex(12, x);\n cm.multiplyAtIndex(13, y);\n cm.multiplyAtIndex(14, z);\n child._markAsDirtyAndDecompose();\n }\n this._markAsDirtyAndDecompose();\n if (scaleChildren) {\n for (const child of this.children) {\n child.scale(x, y, z, scaleChildren);\n }\n }\n }\n /**\n * Set the bone scaling in local space\n * @param scale defines the scaling vector\n */\n setScale(scale) {\n this._decompose();\n this._localScaling.copyFrom(scale);\n this._markAsDirtyAndCompose();\n }\n /**\n * Gets the current scaling in local space\n * @returns the current scaling vector\n */\n getScale() {\n this._decompose();\n return this._localScaling;\n }\n /**\n * Gets the current scaling in local space and stores it in a target vector\n * @param result defines the target vector\n */\n getScaleToRef(result) {\n this._decompose();\n result.copyFrom(this._localScaling);\n }\n /**\n * Set the yaw, pitch, and roll of the bone in local or world space\n * @param yaw The rotation of the bone on the y axis\n * @param pitch The rotation of the bone on the x axis\n * @param roll The rotation of the bone on the z axis\n * @param space The space that the axes of rotation are in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setYawPitchRoll(yaw, pitch, roll, space = 0 /* Space.LOCAL */, tNode) {\n if (space === 0 /* Space.LOCAL */) {\n const quat = Bone._TmpQuat;\n Quaternion.RotationYawPitchRollToRef(yaw, pitch, roll, quat);\n this.setRotationQuaternion(quat, space, tNode);\n return;\n }\n const rotMatInv = Bone._TmpMats[0];\n if (!this._getAbsoluteInverseMatrixUnscaledToRef(rotMatInv, tNode)) {\n return;\n }\n const rotMat = Bone._TmpMats[1];\n Matrix.RotationYawPitchRollToRef(yaw, pitch, roll, rotMat);\n rotMatInv.multiplyToRef(rotMat, rotMat);\n this._rotateWithMatrix(rotMat, space, tNode);\n }\n /**\n * Add a rotation to the bone on an axis in local or world space\n * @param axis The axis to rotate the bone on\n * @param amount The amount to rotate the bone\n * @param space The space that the axis is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n rotate(axis, amount, space = 0 /* Space.LOCAL */, tNode) {\n const rmat = Bone._TmpMats[0];\n rmat.setTranslationFromFloats(0, 0, 0);\n Matrix.RotationAxisToRef(axis, amount, rmat);\n this._rotateWithMatrix(rmat, space, tNode);\n }\n /**\n * Set the rotation of the bone to a particular axis angle in local or world space\n * @param axis The axis to rotate the bone on\n * @param angle The angle that the bone should be rotated to\n * @param space The space that the axis is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setAxisAngle(axis, angle, space = 0 /* Space.LOCAL */, tNode) {\n if (space === 0 /* Space.LOCAL */) {\n const quat = Bone._TmpQuat;\n Quaternion.RotationAxisToRef(axis, angle, quat);\n this.setRotationQuaternion(quat, space, tNode);\n return;\n }\n const rotMatInv = Bone._TmpMats[0];\n if (!this._getAbsoluteInverseMatrixUnscaledToRef(rotMatInv, tNode)) {\n return;\n }\n const rotMat = Bone._TmpMats[1];\n Matrix.RotationAxisToRef(axis, angle, rotMat);\n rotMatInv.multiplyToRef(rotMat, rotMat);\n this._rotateWithMatrix(rotMat, space, tNode);\n }\n /**\n * Set the euler rotation of the bone in local or world space\n * @param rotation The euler rotation that the bone should be set to\n * @param space The space that the rotation is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setRotation(rotation, space = 0 /* Space.LOCAL */, tNode) {\n this.setYawPitchRoll(rotation.y, rotation.x, rotation.z, space, tNode);\n }\n /**\n * Set the quaternion rotation of the bone in local or world space\n * @param quat The quaternion rotation that the bone should be set to\n * @param space The space that the rotation is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setRotationQuaternion(quat, space = 0 /* Space.LOCAL */, tNode) {\n if (space === 0 /* Space.LOCAL */) {\n this._decompose();\n this._localRotation.copyFrom(quat);\n this._markAsDirtyAndCompose();\n return;\n }\n const rotMatInv = Bone._TmpMats[0];\n if (!this._getAbsoluteInverseMatrixUnscaledToRef(rotMatInv, tNode)) {\n return;\n }\n const rotMat = Bone._TmpMats[1];\n Matrix.FromQuaternionToRef(quat, rotMat);\n rotMatInv.multiplyToRef(rotMat, rotMat);\n this._rotateWithMatrix(rotMat, space, tNode);\n }\n /**\n * Set the rotation matrix of the bone in local or world space\n * @param rotMat The rotation matrix that the bone should be set to\n * @param space The space that the rotation is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setRotationMatrix(rotMat, space = 0 /* Space.LOCAL */, tNode) {\n if (space === 0 /* Space.LOCAL */) {\n const quat = Bone._TmpQuat;\n Quaternion.FromRotationMatrixToRef(rotMat, quat);\n this.setRotationQuaternion(quat, space, tNode);\n return;\n }\n const rotMatInv = Bone._TmpMats[0];\n if (!this._getAbsoluteInverseMatrixUnscaledToRef(rotMatInv, tNode)) {\n return;\n }\n const rotMat2 = Bone._TmpMats[1];\n rotMat2.copyFrom(rotMat);\n rotMatInv.multiplyToRef(rotMat, rotMat2);\n this._rotateWithMatrix(rotMat2, space, tNode);\n }\n _rotateWithMatrix(rmat, space = 0 /* Space.LOCAL */, tNode) {\n const lmat = this.getLocalMatrix();\n const lx = lmat.m[12];\n const ly = lmat.m[13];\n const lz = lmat.m[14];\n const parent = this.getParent();\n const parentScale = Bone._TmpMats[3];\n const parentScaleInv = Bone._TmpMats[4];\n if (parent && space == 1 /* Space.WORLD */) {\n if (tNode) {\n parentScale.copyFrom(tNode.getWorldMatrix());\n parent.getAbsoluteMatrix().multiplyToRef(parentScale, parentScale);\n }\n else {\n parentScale.copyFrom(parent.getAbsoluteMatrix());\n }\n parentScaleInv.copyFrom(parentScale);\n parentScaleInv.invert();\n lmat.multiplyToRef(parentScale, lmat);\n lmat.multiplyToRef(rmat, lmat);\n lmat.multiplyToRef(parentScaleInv, lmat);\n }\n else {\n if (space == 1 /* Space.WORLD */ && tNode) {\n parentScale.copyFrom(tNode.getWorldMatrix());\n parentScaleInv.copyFrom(parentScale);\n parentScaleInv.invert();\n lmat.multiplyToRef(parentScale, lmat);\n lmat.multiplyToRef(rmat, lmat);\n lmat.multiplyToRef(parentScaleInv, lmat);\n }\n else {\n lmat.multiplyToRef(rmat, lmat);\n }\n }\n lmat.setTranslationFromFloats(lx, ly, lz);\n this.computeAbsoluteMatrices();\n this._markAsDirtyAndDecompose();\n }\n _getAbsoluteInverseMatrixUnscaledToRef(rotMatInv, tNode) {\n const scaleMatrix = Bone._TmpMats[2];\n rotMatInv.copyFrom(this.getAbsoluteMatrix());\n if (tNode) {\n rotMatInv.multiplyToRef(tNode.getWorldMatrix(), rotMatInv);\n Matrix.ScalingToRef(tNode.scaling.x, tNode.scaling.y, tNode.scaling.z, scaleMatrix);\n }\n else {\n Matrix.IdentityToRef(scaleMatrix);\n }\n rotMatInv.invert();\n if (isNaN(rotMatInv.m[0])) {\n // Matrix failed to invert.\n // This can happen if scale is zero for example.\n return false;\n }\n scaleMatrix.multiplyAtIndex(0, this._scalingDeterminant);\n rotMatInv.multiplyToRef(scaleMatrix, rotMatInv);\n return true;\n }\n /**\n * Get the position of the bone in local or world space\n * @param space The space that the returned position is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The position of the bone\n */\n getPosition(space = 0 /* Space.LOCAL */, tNode = null) {\n const pos = Vector3.Zero();\n this.getPositionToRef(space, tNode, pos);\n return pos;\n }\n /**\n * Copy the position of the bone to a vector3 in local or world space\n * @param space The space that the returned position is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The vector3 to copy the position to\n */\n getPositionToRef(space = 0 /* Space.LOCAL */, tNode, result) {\n if (space == 0 /* Space.LOCAL */) {\n const lm = this.getLocalMatrix();\n result.x = lm.m[12];\n result.y = lm.m[13];\n result.z = lm.m[14];\n }\n else {\n let wm = null;\n //tNode.getWorldMatrix() needs to be called before skeleton.computeAbsoluteMatrices()\n if (tNode) {\n wm = tNode.getWorldMatrix();\n }\n this._skeleton.computeAbsoluteMatrices();\n let tmat = Bone._TmpMats[0];\n if (tNode && wm) {\n tmat.copyFrom(this.getAbsoluteMatrix());\n tmat.multiplyToRef(wm, tmat);\n }\n else {\n tmat = this.getAbsoluteMatrix();\n }\n result.x = tmat.m[12];\n result.y = tmat.m[13];\n result.z = tmat.m[14];\n }\n }\n /**\n * Get the absolute position of the bone (world space)\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The absolute position of the bone\n */\n getAbsolutePosition(tNode = null) {\n const pos = Vector3.Zero();\n this.getPositionToRef(1 /* Space.WORLD */, tNode, pos);\n return pos;\n }\n /**\n * Copy the absolute position of the bone (world space) to the result param\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The vector3 to copy the absolute position to\n */\n getAbsolutePositionToRef(tNode, result) {\n this.getPositionToRef(1 /* Space.WORLD */, tNode, result);\n }\n /**\n * Compute the absolute matrices of this bone and its children\n */\n computeAbsoluteMatrices() {\n this._compose();\n if (this.parent) {\n this._localMatrix.multiplyToRef(this.parent._absoluteMatrix, this._absoluteMatrix);\n }\n else {\n this._absoluteMatrix.copyFrom(this._localMatrix);\n const poseMatrix = this._skeleton.getPoseMatrix();\n if (poseMatrix) {\n this._absoluteMatrix.multiplyToRef(poseMatrix, this._absoluteMatrix);\n }\n }\n const children = this.children;\n const len = children.length;\n for (let i = 0; i < len; i++) {\n children[i].computeAbsoluteMatrices();\n }\n }\n /**\n * Compute the absolute matrices of this bone and its children\n * @deprecated Please use computeAbsoluteMatrices instead\n */\n computeAbsoluteTransforms() {\n this.computeAbsoluteMatrices();\n }\n /**\n * Get the world direction from an axis that is in the local space of the bone\n * @param localAxis The local direction that is used to compute the world direction\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The world direction\n */\n getDirection(localAxis, tNode = null) {\n const result = Vector3.Zero();\n this.getDirectionToRef(localAxis, tNode, result);\n return result;\n }\n /**\n * Copy the world direction to a vector3 from an axis that is in the local space of the bone\n * @param localAxis The local direction that is used to compute the world direction\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The vector3 that the world direction will be copied to\n */\n getDirectionToRef(localAxis, tNode = null, result) {\n let wm = null;\n //tNode.getWorldMatrix() needs to be called before skeleton.computeAbsoluteMatrices()\n if (tNode) {\n wm = tNode.getWorldMatrix();\n }\n this._skeleton.computeAbsoluteMatrices();\n const mat = Bone._TmpMats[0];\n mat.copyFrom(this.getAbsoluteMatrix());\n if (tNode && wm) {\n mat.multiplyToRef(wm, mat);\n }\n Vector3.TransformNormalToRef(localAxis, mat, result);\n result.normalize();\n }\n /**\n * Get the euler rotation of the bone in local or world space\n * @param space The space that the rotation should be in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The euler rotation\n */\n getRotation(space = 0 /* Space.LOCAL */, tNode = null) {\n const result = Vector3.Zero();\n this.getRotationToRef(space, tNode, result);\n return result;\n }\n /**\n * Copy the euler rotation of the bone to a vector3. The rotation can be in either local or world space\n * @param space The space that the rotation should be in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The vector3 that the rotation should be copied to\n */\n getRotationToRef(space = 0 /* Space.LOCAL */, tNode = null, result) {\n const quat = Bone._TmpQuat;\n this.getRotationQuaternionToRef(space, tNode, quat);\n quat.toEulerAnglesToRef(result);\n }\n /**\n * Get the quaternion rotation of the bone in either local or world space\n * @param space The space that the rotation should be in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The quaternion rotation\n */\n getRotationQuaternion(space = 0 /* Space.LOCAL */, tNode = null) {\n const result = Quaternion.Identity();\n this.getRotationQuaternionToRef(space, tNode, result);\n return result;\n }\n /**\n * Copy the quaternion rotation of the bone to a quaternion. The rotation can be in either local or world space\n * @param space The space that the rotation should be in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The quaternion that the rotation should be copied to\n */\n getRotationQuaternionToRef(space = 0 /* Space.LOCAL */, tNode = null, result) {\n if (space == 0 /* Space.LOCAL */) {\n this._decompose();\n result.copyFrom(this._localRotation);\n }\n else {\n const mat = Bone._TmpMats[0];\n const amat = this.getAbsoluteMatrix();\n if (tNode) {\n amat.multiplyToRef(tNode.getWorldMatrix(), mat);\n }\n else {\n mat.copyFrom(amat);\n }\n mat.multiplyAtIndex(0, this._scalingDeterminant);\n mat.multiplyAtIndex(1, this._scalingDeterminant);\n mat.multiplyAtIndex(2, this._scalingDeterminant);\n mat.decompose(undefined, result, undefined);\n }\n }\n /**\n * Get the rotation matrix of the bone in local or world space\n * @param space The space that the rotation should be in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The rotation matrix\n */\n getRotationMatrix(space = 0 /* Space.LOCAL */, tNode) {\n const result = Matrix.Identity();\n this.getRotationMatrixToRef(space, tNode, result);\n return result;\n }\n /**\n * Copy the rotation matrix of the bone to a matrix. The rotation can be in either local or world space\n * @param space The space that the rotation should be in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The quaternion that the rotation should be copied to\n */\n getRotationMatrixToRef(space = 0 /* Space.LOCAL */, tNode, result) {\n if (space == 0 /* Space.LOCAL */) {\n this.getLocalMatrix().getRotationMatrixToRef(result);\n }\n else {\n const mat = Bone._TmpMats[0];\n const amat = this.getAbsoluteMatrix();\n if (tNode) {\n amat.multiplyToRef(tNode.getWorldMatrix(), mat);\n }\n else {\n mat.copyFrom(amat);\n }\n mat.multiplyAtIndex(0, this._scalingDeterminant);\n mat.multiplyAtIndex(1, this._scalingDeterminant);\n mat.multiplyAtIndex(2, this._scalingDeterminant);\n mat.getRotationMatrixToRef(result);\n }\n }\n /**\n * Get the world position of a point that is in the local space of the bone\n * @param position The local position\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The world position\n */\n getAbsolutePositionFromLocal(position, tNode = null) {\n const result = Vector3.Zero();\n this.getAbsolutePositionFromLocalToRef(position, tNode, result);\n return result;\n }\n /**\n * Get the world position of a point that is in the local space of the bone and copy it to the result param\n * @param position The local position\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The vector3 that the world position should be copied to\n */\n getAbsolutePositionFromLocalToRef(position, tNode = null, result) {\n let wm = null;\n //tNode.getWorldMatrix() needs to be called before skeleton.computeAbsoluteMatrices()\n if (tNode) {\n wm = tNode.getWorldMatrix();\n }\n this._skeleton.computeAbsoluteMatrices();\n const tmat = Bone._TmpMats[0];\n tmat.copyFrom(this.getAbsoluteMatrix());\n if (tNode && wm) {\n tmat.multiplyToRef(wm, tmat);\n }\n Vector3.TransformCoordinatesToRef(position, tmat, result);\n }\n /**\n * Get the local position of a point that is in world space\n * @param position The world position\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The local position\n */\n getLocalPositionFromAbsolute(position, tNode = null) {\n const result = Vector3.Zero();\n this.getLocalPositionFromAbsoluteToRef(position, tNode, result);\n return result;\n }\n /**\n * Get the local position of a point that is in world space and copy it to the result param\n * @param position The world position\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The vector3 that the local position should be copied to\n */\n getLocalPositionFromAbsoluteToRef(position, tNode = null, result) {\n let wm = null;\n //tNode.getWorldMatrix() needs to be called before skeleton.computeAbsoluteMatrices()\n if (tNode) {\n wm = tNode.getWorldMatrix();\n }\n this._skeleton.computeAbsoluteMatrices();\n const tmat = Bone._TmpMats[0];\n tmat.copyFrom(this.getAbsoluteMatrix());\n if (tNode && wm) {\n tmat.multiplyToRef(wm, tmat);\n }\n tmat.invert();\n Vector3.TransformCoordinatesToRef(position, tmat, result);\n }\n /**\n * Set the current local matrix as the restMatrix for this bone.\n */\n setCurrentPoseAsRest() {\n this.setRestMatrix(this.getLocalMatrix());\n }\n /**\n * Releases associated resources\n */\n dispose() {\n this._linkedTransformNode = null;\n const index = this._skeleton.bones.indexOf(this);\n if (index !== -1) {\n this._skeleton.bones.splice(index, 1);\n }\n if (this._parentNode && this._parentNode.children) {\n const children = this._parentNode.children;\n const index = children.indexOf(this);\n if (index !== -1) {\n children.splice(index, 1);\n }\n }\n super.dispose();\n }\n}\nBone._TmpVecs = BuildArray(2, Vector3.Zero);\nBone._TmpQuat = Quaternion.Identity();\nBone._TmpMats = BuildArray(5, Matrix.Identity);\n//# sourceMappingURL=bone.js.map","import { Bone } from \"./bone\";\nimport { Observable } from \"../Misc/observable\";\nimport { Vector3, Matrix, TmpVectors } from \"../Maths/math.vector\";\nimport { RawTexture } from \"../Materials/Textures/rawTexture\";\nimport { Animation } from \"../Animations/animation\";\nimport { AnimationRange } from \"../Animations/animationRange\";\nimport { EngineStore } from \"../Engines/engineStore\";\nimport { Constants } from \"../Engines/constants\";\nimport { Logger } from \"../Misc/logger\";\nimport { DeepCopier } from \"../Misc/deepCopier\";\n/**\n * Class used to handle skinning animations\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/bonesSkeletons\n */\nexport class Skeleton {\n /**\n * Gets or sets a boolean indicating that bone matrices should be stored as a texture instead of using shader uniforms (default is true).\n * Please note that this option is not available if the hardware does not support it\n */\n get useTextureToStoreBoneMatrices() {\n return this._useTextureToStoreBoneMatrices;\n }\n set useTextureToStoreBoneMatrices(value) {\n this._useTextureToStoreBoneMatrices = value;\n this._markAsDirty();\n }\n /**\n * Gets or sets the animation properties override\n */\n get animationPropertiesOverride() {\n if (!this._animationPropertiesOverride) {\n return this._scene.animationPropertiesOverride;\n }\n return this._animationPropertiesOverride;\n }\n set animationPropertiesOverride(value) {\n this._animationPropertiesOverride = value;\n }\n /**\n * Gets a boolean indicating that the skeleton effectively stores matrices into a texture\n */\n get isUsingTextureForMatrices() {\n return this.useTextureToStoreBoneMatrices && this._canUseTextureForBones;\n }\n /**\n * Gets the unique ID of this skeleton\n */\n get uniqueId() {\n return this._uniqueId;\n }\n /**\n * Creates a new skeleton\n * @param name defines the skeleton name\n * @param id defines the skeleton Id\n * @param scene defines the hosting scene\n */\n constructor(\n /** defines the skeleton name */\n name, \n /** defines the skeleton Id */\n id, scene) {\n this.name = name;\n this.id = id;\n /**\n * Defines the list of child bones\n */\n this.bones = [];\n /**\n * Defines a boolean indicating if the root matrix is provided by meshes or by the current skeleton (this is the default value)\n */\n this.needInitialSkinMatrix = false;\n this._isDirty = true;\n this._meshesWithPoseMatrix = new Array();\n this._identity = Matrix.Identity();\n this._currentRenderId = -1;\n this._ranges = {};\n this._absoluteTransformIsDirty = true;\n this._canUseTextureForBones = false;\n this._uniqueId = 0;\n /** @internal */\n this._numBonesWithLinkedTransformNode = 0;\n /** @internal */\n this._hasWaitingData = null;\n /** @internal */\n this._parentContainer = null;\n /**\n * Specifies if the skeleton should be serialized\n */\n this.doNotSerialize = false;\n this._useTextureToStoreBoneMatrices = true;\n this._animationPropertiesOverride = null;\n // Events\n /**\n * An observable triggered before computing the skeleton's matrices\n */\n this.onBeforeComputeObservable = new Observable();\n this.bones = [];\n this._scene = scene || EngineStore.LastCreatedScene;\n this._uniqueId = this._scene.getUniqueId();\n this._scene.addSkeleton(this);\n //make sure it will recalculate the matrix next time prepare is called.\n this._isDirty = true;\n const engineCaps = this._scene.getEngine().getCaps();\n this._canUseTextureForBones = engineCaps.textureFloat && engineCaps.maxVertexTextureImageUnits > 0;\n }\n /**\n * Gets the current object class name.\n * @returns the class name\n */\n getClassName() {\n return \"Skeleton\";\n }\n /**\n * Returns an array containing the root bones\n * @returns an array containing the root bones\n */\n getChildren() {\n return this.bones.filter((b) => !b.getParent());\n }\n // Members\n /**\n * Gets the list of transform matrices to send to shaders (one matrix per bone)\n * @param mesh defines the mesh to use to get the root matrix (if needInitialSkinMatrix === true)\n * @returns a Float32Array containing matrices data\n */\n getTransformMatrices(mesh) {\n if (this.needInitialSkinMatrix) {\n if (!mesh) {\n throw new Error(\"getTransformMatrices: When using the needInitialSkinMatrix flag, a mesh must be provided\");\n }\n if (!mesh._bonesTransformMatrices) {\n this.prepare(true);\n }\n return mesh._bonesTransformMatrices;\n }\n if (!this._transformMatrices || this._isDirty) {\n this.prepare(!this._transformMatrices);\n }\n return this._transformMatrices;\n }\n /**\n * Gets the list of transform matrices to send to shaders inside a texture (one matrix per bone)\n * @param mesh defines the mesh to use to get the root matrix (if needInitialSkinMatrix === true)\n * @returns a raw texture containing the data\n */\n getTransformMatrixTexture(mesh) {\n if (this.needInitialSkinMatrix && mesh._transformMatrixTexture) {\n return mesh._transformMatrixTexture;\n }\n return this._transformMatrixTexture;\n }\n /**\n * Gets the current hosting scene\n * @returns a scene object\n */\n getScene() {\n return this._scene;\n }\n // Methods\n /**\n * Gets a string representing the current skeleton data\n * @param fullDetails defines a boolean indicating if we want a verbose version\n * @returns a string representing the current skeleton data\n */\n toString(fullDetails) {\n let ret = `Name: ${this.name}, nBones: ${this.bones.length}`;\n ret += `, nAnimationRanges: ${this._ranges ? Object.keys(this._ranges).length : \"none\"}`;\n if (fullDetails) {\n ret += \", Ranges: {\";\n let first = true;\n for (const name in this._ranges) {\n if (first) {\n ret += \", \";\n first = false;\n }\n ret += name;\n }\n ret += \"}\";\n }\n return ret;\n }\n /**\n * Get bone's index searching by name\n * @param name defines bone's name to search for\n * @returns the indice of the bone. Returns -1 if not found\n */\n getBoneIndexByName(name) {\n for (let boneIndex = 0, cache = this.bones.length; boneIndex < cache; boneIndex++) {\n if (this.bones[boneIndex].name === name) {\n return boneIndex;\n }\n }\n return -1;\n }\n /**\n * Create a new animation range\n * @param name defines the name of the range\n * @param from defines the start key\n * @param to defines the end key\n */\n createAnimationRange(name, from, to) {\n // check name not already in use\n if (!this._ranges[name]) {\n this._ranges[name] = new AnimationRange(name, from, to);\n for (let i = 0, nBones = this.bones.length; i < nBones; i++) {\n if (this.bones[i].animations[0]) {\n this.bones[i].animations[0].createRange(name, from, to);\n }\n }\n }\n }\n /**\n * Delete a specific animation range\n * @param name defines the name of the range\n * @param deleteFrames defines if frames must be removed as well\n */\n deleteAnimationRange(name, deleteFrames = true) {\n for (let i = 0, nBones = this.bones.length; i < nBones; i++) {\n if (this.bones[i].animations[0]) {\n this.bones[i].animations[0].deleteRange(name, deleteFrames);\n }\n }\n this._ranges[name] = null; // said much faster than 'delete this._range[name]'\n }\n /**\n * Gets a specific animation range\n * @param name defines the name of the range to look for\n * @returns the requested animation range or null if not found\n */\n getAnimationRange(name) {\n return this._ranges[name] || null;\n }\n /**\n * Gets the list of all animation ranges defined on this skeleton\n * @returns an array\n */\n getAnimationRanges() {\n const animationRanges = [];\n let name;\n for (name in this._ranges) {\n animationRanges.push(this._ranges[name]);\n }\n return animationRanges;\n }\n /**\n * Copy animation range from a source skeleton.\n * This is not for a complete retargeting, only between very similar skeleton's with only possible bone length differences\n * @param source defines the source skeleton\n * @param name defines the name of the range to copy\n * @param rescaleAsRequired defines if rescaling must be applied if required\n * @returns true if operation was successful\n */\n copyAnimationRange(source, name, rescaleAsRequired = false) {\n if (this._ranges[name] || !source.getAnimationRange(name)) {\n return false;\n }\n let ret = true;\n const frameOffset = this._getHighestAnimationFrame() + 1;\n // make a dictionary of source skeleton's bones, so exact same order or doubly nested loop is not required\n const boneDict = {};\n const sourceBones = source.bones;\n let nBones;\n let i;\n for (i = 0, nBones = sourceBones.length; i < nBones; i++) {\n boneDict[sourceBones[i].name] = sourceBones[i];\n }\n if (this.bones.length !== sourceBones.length) {\n Logger.Warn(`copyAnimationRange: this rig has ${this.bones.length} bones, while source as ${sourceBones.length}`);\n ret = false;\n }\n const skelDimensionsRatio = rescaleAsRequired && this.dimensionsAtRest && source.dimensionsAtRest ? this.dimensionsAtRest.divide(source.dimensionsAtRest) : null;\n for (i = 0, nBones = this.bones.length; i < nBones; i++) {\n const boneName = this.bones[i].name;\n const sourceBone = boneDict[boneName];\n if (sourceBone) {\n ret = ret && this.bones[i].copyAnimationRange(sourceBone, name, frameOffset, rescaleAsRequired, skelDimensionsRatio);\n }\n else {\n Logger.Warn(\"copyAnimationRange: not same rig, missing source bone \" + boneName);\n ret = false;\n }\n }\n // do not call createAnimationRange(), since it also is done to bones, which was already done\n const range = source.getAnimationRange(name);\n if (range) {\n this._ranges[name] = new AnimationRange(name, range.from + frameOffset, range.to + frameOffset);\n }\n return ret;\n }\n /**\n * Forces the skeleton to go to rest pose\n */\n returnToRest() {\n for (const bone of this.bones) {\n if (bone._index !== -1) {\n bone.returnToRest();\n }\n }\n }\n _getHighestAnimationFrame() {\n let ret = 0;\n for (let i = 0, nBones = this.bones.length; i < nBones; i++) {\n if (this.bones[i].animations[0]) {\n const highest = this.bones[i].animations[0].getHighestFrame();\n if (ret < highest) {\n ret = highest;\n }\n }\n }\n return ret;\n }\n /**\n * Begin a specific animation range\n * @param name defines the name of the range to start\n * @param loop defines if looping must be turned on (false by default)\n * @param speedRatio defines the speed ratio to apply (1 by default)\n * @param onAnimationEnd defines a callback which will be called when animation will end\n * @returns a new animatable\n */\n beginAnimation(name, loop, speedRatio, onAnimationEnd) {\n const range = this.getAnimationRange(name);\n if (!range) {\n return null;\n }\n return this._scene.beginAnimation(this, range.from, range.to, loop, speedRatio, onAnimationEnd);\n }\n /**\n * Convert the keyframes for a range of animation on a skeleton to be relative to a given reference frame.\n * @param skeleton defines the Skeleton containing the animation range to convert\n * @param referenceFrame defines the frame that keyframes in the range will be relative to\n * @param range defines the name of the AnimationRange belonging to the Skeleton to convert\n * @returns the original skeleton\n */\n static MakeAnimationAdditive(skeleton, referenceFrame = 0, range) {\n const rangeValue = skeleton.getAnimationRange(range);\n // We can't make a range additive if it doesn't exist\n if (!rangeValue) {\n return null;\n }\n // Find any current scene-level animatable belonging to the target that matches the range\n const sceneAnimatables = skeleton._scene.getAllAnimatablesByTarget(skeleton);\n let rangeAnimatable = null;\n for (let index = 0; index < sceneAnimatables.length; index++) {\n const sceneAnimatable = sceneAnimatables[index];\n if (sceneAnimatable.fromFrame === rangeValue?.from && sceneAnimatable.toFrame === rangeValue?.to) {\n rangeAnimatable = sceneAnimatable;\n break;\n }\n }\n // Convert the animations belonging to the skeleton to additive keyframes\n const animatables = skeleton.getAnimatables();\n for (let index = 0; index < animatables.length; index++) {\n const animatable = animatables[index];\n const animations = animatable.animations;\n if (!animations) {\n continue;\n }\n for (let animIndex = 0; animIndex < animations.length; animIndex++) {\n Animation.MakeAnimationAdditive(animations[animIndex], referenceFrame, range);\n }\n }\n // Mark the scene-level animatable as additive\n if (rangeAnimatable) {\n rangeAnimatable.isAdditive = true;\n }\n return skeleton;\n }\n /** @internal */\n _markAsDirty() {\n this._isDirty = true;\n this._absoluteTransformIsDirty = true;\n }\n /**\n * @internal\n */\n _registerMeshWithPoseMatrix(mesh) {\n this._meshesWithPoseMatrix.push(mesh);\n }\n /**\n * @internal\n */\n _unregisterMeshWithPoseMatrix(mesh) {\n const index = this._meshesWithPoseMatrix.indexOf(mesh);\n if (index > -1) {\n this._meshesWithPoseMatrix.splice(index, 1);\n }\n }\n _computeTransformMatrices(targetMatrix, initialSkinMatrix) {\n this.onBeforeComputeObservable.notifyObservers(this);\n for (let index = 0; index < this.bones.length; index++) {\n const bone = this.bones[index];\n bone._childUpdateId++;\n const parentBone = bone.getParent();\n if (parentBone) {\n bone.getLocalMatrix().multiplyToRef(parentBone.getFinalMatrix(), bone.getFinalMatrix());\n }\n else {\n if (initialSkinMatrix) {\n bone.getLocalMatrix().multiplyToRef(initialSkinMatrix, bone.getFinalMatrix());\n }\n else {\n bone.getFinalMatrix().copyFrom(bone.getLocalMatrix());\n }\n }\n if (bone._index !== -1) {\n const mappedIndex = bone._index === null ? index : bone._index;\n bone.getAbsoluteInverseBindMatrix().multiplyToArray(bone.getFinalMatrix(), targetMatrix, mappedIndex * 16);\n }\n }\n this._identity.copyToArray(targetMatrix, this.bones.length * 16);\n }\n /**\n * Build all resources required to render a skeleton\n * @param dontCheckFrameId defines a boolean indicating if prepare should be run without checking first the current frame id (default: false)\n */\n prepare(dontCheckFrameId = false) {\n if (!dontCheckFrameId) {\n const currentRenderId = this.getScene().getRenderId();\n if (this._currentRenderId === currentRenderId) {\n return;\n }\n this._currentRenderId = currentRenderId;\n }\n // Update the local matrix of bones with linked transform nodes.\n if (this._numBonesWithLinkedTransformNode > 0) {\n for (const bone of this.bones) {\n if (bone._linkedTransformNode) {\n const node = bone._linkedTransformNode;\n bone.position = node.position;\n if (node.rotationQuaternion) {\n bone.rotationQuaternion = node.rotationQuaternion;\n }\n else {\n bone.rotation = node.rotation;\n }\n bone.scaling = node.scaling;\n }\n }\n }\n if (this.needInitialSkinMatrix) {\n for (const mesh of this._meshesWithPoseMatrix) {\n const poseMatrix = mesh.getPoseMatrix();\n let needsUpdate = this._isDirty;\n if (!mesh._bonesTransformMatrices || mesh._bonesTransformMatrices.length !== 16 * (this.bones.length + 1)) {\n mesh._bonesTransformMatrices = new Float32Array(16 * (this.bones.length + 1));\n needsUpdate = true;\n }\n if (!needsUpdate) {\n continue;\n }\n if (this._synchronizedWithMesh !== mesh) {\n this._synchronizedWithMesh = mesh;\n // Prepare bones\n for (const bone of this.bones) {\n if (!bone.getParent()) {\n const matrix = bone.getBindMatrix();\n matrix.multiplyToRef(poseMatrix, TmpVectors.Matrix[1]);\n bone._updateAbsoluteBindMatrices(TmpVectors.Matrix[1]);\n }\n }\n if (this.isUsingTextureForMatrices) {\n const textureWidth = (this.bones.length + 1) * 4;\n if (!mesh._transformMatrixTexture || mesh._transformMatrixTexture.getSize().width !== textureWidth) {\n if (mesh._transformMatrixTexture) {\n mesh._transformMatrixTexture.dispose();\n }\n mesh._transformMatrixTexture = RawTexture.CreateRGBATexture(mesh._bonesTransformMatrices, (this.bones.length + 1) * 4, 1, this._scene, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE, Constants.TEXTURETYPE_FLOAT);\n }\n }\n }\n this._computeTransformMatrices(mesh._bonesTransformMatrices, poseMatrix);\n if (this.isUsingTextureForMatrices && mesh._transformMatrixTexture) {\n mesh._transformMatrixTexture.update(mesh._bonesTransformMatrices);\n }\n }\n }\n else {\n if (!this._isDirty) {\n return;\n }\n if (!this._transformMatrices || this._transformMatrices.length !== 16 * (this.bones.length + 1)) {\n this._transformMatrices = new Float32Array(16 * (this.bones.length + 1));\n if (this.isUsingTextureForMatrices) {\n if (this._transformMatrixTexture) {\n this._transformMatrixTexture.dispose();\n }\n this._transformMatrixTexture = RawTexture.CreateRGBATexture(this._transformMatrices, (this.bones.length + 1) * 4, 1, this._scene, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE, Constants.TEXTURETYPE_FLOAT);\n }\n }\n this._computeTransformMatrices(this._transformMatrices, null);\n if (this.isUsingTextureForMatrices && this._transformMatrixTexture) {\n this._transformMatrixTexture.update(this._transformMatrices);\n }\n }\n this._isDirty = false;\n }\n /**\n * Gets the list of animatables currently running for this skeleton\n * @returns an array of animatables\n */\n getAnimatables() {\n if (!this._animatables || this._animatables.length !== this.bones.length) {\n this._animatables = [];\n for (let index = 0; index < this.bones.length; index++) {\n this._animatables.push(this.bones[index]);\n }\n }\n return this._animatables;\n }\n /**\n * Clone the current skeleton\n * @param name defines the name of the new skeleton\n * @param id defines the id of the new skeleton\n * @returns the new skeleton\n */\n clone(name, id) {\n const result = new Skeleton(name, id || name, this._scene);\n result.needInitialSkinMatrix = this.needInitialSkinMatrix;\n for (let index = 0; index < this.bones.length; index++) {\n const source = this.bones[index];\n let parentBone = null;\n const parent = source.getParent();\n if (parent) {\n const parentIndex = this.bones.indexOf(parent);\n parentBone = result.bones[parentIndex];\n }\n const bone = new Bone(source.name, result, parentBone, source.getBindMatrix().clone(), source.getRestMatrix().clone());\n bone._index = source._index;\n if (source._linkedTransformNode) {\n bone.linkTransformNode(source._linkedTransformNode);\n }\n DeepCopier.DeepCopy(source.animations, bone.animations);\n }\n if (this._ranges) {\n result._ranges = {};\n for (const rangeName in this._ranges) {\n const range = this._ranges[rangeName];\n if (range) {\n result._ranges[rangeName] = range.clone();\n }\n }\n }\n this._isDirty = true;\n result.prepare(true);\n return result;\n }\n /**\n * Enable animation blending for this skeleton\n * @param blendingSpeed defines the blending speed to apply\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#animation-blending\n */\n enableBlending(blendingSpeed = 0.01) {\n this.bones.forEach((bone) => {\n bone.animations.forEach((animation) => {\n animation.enableBlending = true;\n animation.blendingSpeed = blendingSpeed;\n });\n });\n }\n /**\n * Releases all resources associated with the current skeleton\n */\n dispose() {\n this._meshesWithPoseMatrix.length = 0;\n // Animations\n this.getScene().stopAnimation(this);\n // Remove from scene\n this.getScene().removeSkeleton(this);\n if (this._parentContainer) {\n const index = this._parentContainer.skeletons.indexOf(this);\n if (index > -1) {\n this._parentContainer.skeletons.splice(index, 1);\n }\n this._parentContainer = null;\n }\n if (this._transformMatrixTexture) {\n this._transformMatrixTexture.dispose();\n this._transformMatrixTexture = null;\n }\n }\n /**\n * Serialize the skeleton in a JSON object\n * @returns a JSON object\n */\n serialize() {\n const serializationObject = {};\n serializationObject.name = this.name;\n serializationObject.id = this.id;\n if (this.dimensionsAtRest) {\n serializationObject.dimensionsAtRest = this.dimensionsAtRest.asArray();\n }\n serializationObject.bones = [];\n serializationObject.needInitialSkinMatrix = this.needInitialSkinMatrix;\n for (let index = 0; index < this.bones.length; index++) {\n const bone = this.bones[index];\n const parent = bone.getParent();\n const serializedBone = {\n parentBoneIndex: parent ? this.bones.indexOf(parent) : -1,\n index: bone.getIndex(),\n name: bone.name,\n id: bone.id,\n matrix: bone.getBindMatrix().asArray(),\n rest: bone.getRestMatrix().asArray(),\n linkedTransformNodeId: bone.getTransformNode()?.id,\n };\n serializationObject.bones.push(serializedBone);\n if (bone.length) {\n serializedBone.length = bone.length;\n }\n if (bone.metadata) {\n serializedBone.metadata = bone.metadata;\n }\n if (bone.animations && bone.animations.length > 0) {\n serializedBone.animation = bone.animations[0].serialize();\n }\n serializationObject.ranges = [];\n for (const name in this._ranges) {\n const source = this._ranges[name];\n if (!source) {\n continue;\n }\n const range = {};\n range.name = name;\n range.from = source.from;\n range.to = source.to;\n serializationObject.ranges.push(range);\n }\n }\n return serializationObject;\n }\n /**\n * Creates a new skeleton from serialized data\n * @param parsedSkeleton defines the serialized data\n * @param scene defines the hosting scene\n * @returns a new skeleton\n */\n static Parse(parsedSkeleton, scene) {\n const skeleton = new Skeleton(parsedSkeleton.name, parsedSkeleton.id, scene);\n if (parsedSkeleton.dimensionsAtRest) {\n skeleton.dimensionsAtRest = Vector3.FromArray(parsedSkeleton.dimensionsAtRest);\n }\n skeleton.needInitialSkinMatrix = parsedSkeleton.needInitialSkinMatrix;\n let index;\n for (index = 0; index < parsedSkeleton.bones.length; index++) {\n const parsedBone = parsedSkeleton.bones[index];\n const parsedBoneIndex = parsedSkeleton.bones[index].index;\n let parentBone = null;\n if (parsedBone.parentBoneIndex > -1) {\n parentBone = skeleton.bones[parsedBone.parentBoneIndex];\n }\n const rest = parsedBone.rest ? Matrix.FromArray(parsedBone.rest) : null;\n const bone = new Bone(parsedBone.name, skeleton, parentBone, Matrix.FromArray(parsedBone.matrix), rest, null, parsedBoneIndex);\n if (parsedBone.id !== undefined && parsedBone.id !== null) {\n bone.id = parsedBone.id;\n }\n if (parsedBone.length) {\n bone.length = parsedBone.length;\n }\n if (parsedBone.metadata) {\n bone.metadata = parsedBone.metadata;\n }\n if (parsedBone.animation) {\n bone.animations.push(Animation.Parse(parsedBone.animation));\n }\n if (parsedBone.linkedTransformNodeId !== undefined && parsedBone.linkedTransformNodeId !== null) {\n skeleton._hasWaitingData = true;\n bone._waitingTransformNodeId = parsedBone.linkedTransformNodeId;\n }\n }\n // placed after bones, so createAnimationRange can cascade down\n if (parsedSkeleton.ranges) {\n for (index = 0; index < parsedSkeleton.ranges.length; index++) {\n const data = parsedSkeleton.ranges[index];\n skeleton.createAnimationRange(data.name, data.from, data.to);\n }\n }\n return skeleton;\n }\n /**\n * Compute all node absolute matrices\n * @param forceUpdate defines if computation must be done even if cache is up to date\n */\n computeAbsoluteMatrices(forceUpdate = false) {\n if (this._absoluteTransformIsDirty || forceUpdate) {\n this.bones[0].computeAbsoluteMatrices();\n this._absoluteTransformIsDirty = false;\n }\n }\n /**\n * Compute all node absolute matrices\n * @param forceUpdate defines if computation must be done even if cache is up to date\n * @deprecated Please use computeAbsoluteMatrices instead\n */\n computeAbsoluteTransforms(forceUpdate = false) {\n this.computeAbsoluteMatrices(forceUpdate);\n }\n /**\n * Gets the root pose matrix\n * @returns a matrix\n */\n getPoseMatrix() {\n let poseMatrix = null;\n if (this._meshesWithPoseMatrix.length > 0) {\n poseMatrix = this._meshesWithPoseMatrix[0].getPoseMatrix();\n }\n return poseMatrix;\n }\n /**\n * Sorts bones per internal index\n */\n sortBones() {\n const bones = [];\n const visited = new Array(this.bones.length);\n for (let index = 0; index < this.bones.length; index++) {\n this._sortBones(index, bones, visited);\n }\n this.bones = bones;\n }\n _sortBones(index, bones, visited) {\n if (visited[index]) {\n return;\n }\n visited[index] = true;\n const bone = this.bones[index];\n if (!bone)\n return;\n if (bone._index === undefined) {\n bone._index = index;\n }\n const parentBone = bone.getParent();\n if (parentBone) {\n this._sortBones(this.bones.indexOf(parentBone), bones, visited);\n }\n bones.push(bone);\n }\n /**\n * Set the current local matrix as the restPose for all bones in the skeleton.\n */\n setCurrentPoseAsRest() {\n this.bones.forEach((b) => {\n b.setCurrentPoseAsRest();\n });\n }\n}\n//# sourceMappingURL=skeleton.js.map","import { __decorate } from \"tslib\";\nimport { Observable } from \"../Misc/observable\";\nimport { EngineStore } from \"../Engines/engineStore\";\nimport { VertexBuffer } from \"../Buffers/buffer\";\nimport { serialize } from \"../Misc/decorators\";\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\nimport { GetClass } from \"../Misc/typeStore\";\n/**\n * Defines a target to use with MorphTargetManager\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/morphTargets\n */\nexport class MorphTarget {\n /**\n * Gets or sets the influence of this target (ie. its weight in the overall morphing)\n */\n get influence() {\n return this._influence;\n }\n set influence(influence) {\n if (this._influence === influence) {\n return;\n }\n const previous = this._influence;\n this._influence = influence;\n if (this.onInfluenceChanged.hasObservers()) {\n this.onInfluenceChanged.notifyObservers(previous === 0 || influence === 0);\n }\n }\n /**\n * Gets or sets the animation properties override\n */\n get animationPropertiesOverride() {\n if (!this._animationPropertiesOverride && this._scene) {\n return this._scene.animationPropertiesOverride;\n }\n return this._animationPropertiesOverride;\n }\n set animationPropertiesOverride(value) {\n this._animationPropertiesOverride = value;\n }\n /**\n * Creates a new MorphTarget\n * @param name defines the name of the target\n * @param influence defines the influence to use\n * @param scene defines the scene the morphtarget belongs to\n */\n constructor(\n /** defines the name of the target */\n name, influence = 0, scene = null) {\n this.name = name;\n /**\n * Gets or sets the list of animations\n */\n this.animations = [];\n this._positions = null;\n this._normals = null;\n this._tangents = null;\n this._uvs = null;\n this._uv2s = null;\n this._uniqueId = 0;\n /**\n * Observable raised when the influence changes\n */\n this.onInfluenceChanged = new Observable();\n /** @internal */\n this._onDataLayoutChanged = new Observable();\n this._animationPropertiesOverride = null;\n this.id = name;\n this._scene = scene || EngineStore.LastCreatedScene;\n this.influence = influence;\n if (this._scene) {\n this._uniqueId = this._scene.getUniqueId();\n }\n }\n /**\n * Gets the unique ID of this manager\n */\n get uniqueId() {\n return this._uniqueId;\n }\n /**\n * Gets a boolean defining if the target contains position data\n */\n get hasPositions() {\n return !!this._positions;\n }\n /**\n * Gets a boolean defining if the target contains normal data\n */\n get hasNormals() {\n return !!this._normals;\n }\n /**\n * Gets a boolean defining if the target contains tangent data\n */\n get hasTangents() {\n return !!this._tangents;\n }\n /**\n * Gets a boolean defining if the target contains texture coordinates data\n */\n get hasUVs() {\n return !!this._uvs;\n }\n /**\n * Gets a boolean defining if the target contains texture coordinates 2 data\n */\n get hasUV2s() {\n return !!this._uv2s;\n }\n /**\n * Gets the number of vertices stored in this target\n */\n get vertexCount() {\n return this._positions\n ? this._positions.length / 3\n : this._normals\n ? this._normals.length / 3\n : this._tangents\n ? this._tangents.length / 3\n : this._uvs\n ? this._uvs.length / 2\n : this._uv2s\n ? this._uv2s.length / 2\n : 0;\n }\n /**\n * Affects position data to this target\n * @param data defines the position data to use\n */\n setPositions(data) {\n const hadPositions = this.hasPositions;\n this._positions = data;\n if (hadPositions !== this.hasPositions) {\n this._onDataLayoutChanged.notifyObservers(undefined);\n }\n }\n /**\n * Gets the position data stored in this target\n * @returns a FloatArray containing the position data (or null if not present)\n */\n getPositions() {\n return this._positions;\n }\n /**\n * Affects normal data to this target\n * @param data defines the normal data to use\n */\n setNormals(data) {\n const hadNormals = this.hasNormals;\n this._normals = data;\n if (hadNormals !== this.hasNormals) {\n this._onDataLayoutChanged.notifyObservers(undefined);\n }\n }\n /**\n * Gets the normal data stored in this target\n * @returns a FloatArray containing the normal data (or null if not present)\n */\n getNormals() {\n return this._normals;\n }\n /**\n * Affects tangent data to this target\n * @param data defines the tangent data to use\n */\n setTangents(data) {\n const hadTangents = this.hasTangents;\n this._tangents = data;\n if (hadTangents !== this.hasTangents) {\n this._onDataLayoutChanged.notifyObservers(undefined);\n }\n }\n /**\n * Gets the tangent data stored in this target\n * @returns a FloatArray containing the tangent data (or null if not present)\n */\n getTangents() {\n return this._tangents;\n }\n /**\n * Affects texture coordinates data to this target\n * @param data defines the texture coordinates data to use\n */\n setUVs(data) {\n const hadUVs = this.hasUVs;\n this._uvs = data;\n if (hadUVs !== this.hasUVs) {\n this._onDataLayoutChanged.notifyObservers(undefined);\n }\n }\n /**\n * Gets the texture coordinates data stored in this target\n * @returns a FloatArray containing the texture coordinates data (or null if not present)\n */\n getUVs() {\n return this._uvs;\n }\n /**\n * Affects texture coordinates 2 data to this target\n * @param data defines the texture coordinates 2 data to use\n */\n setUV2s(data) {\n const hadUV2s = this.hasUV2s;\n this._uv2s = data;\n if (hadUV2s !== this.hasUV2s) {\n this._onDataLayoutChanged.notifyObservers(undefined);\n }\n }\n /**\n * Gets the texture coordinates 2 data stored in this target\n * @returns a FloatArray containing the texture coordinates 2 data (or null if not present)\n */\n getUV2s() {\n return this._uv2s;\n }\n /**\n * Clone the current target\n * @returns a new MorphTarget\n */\n clone() {\n const newOne = SerializationHelper.Clone(() => new MorphTarget(this.name, this.influence, this._scene), this);\n newOne._positions = this._positions;\n newOne._normals = this._normals;\n newOne._tangents = this._tangents;\n newOne._uvs = this._uvs;\n newOne._uv2s = this._uv2s;\n return newOne;\n }\n /**\n * Serializes the current target into a Serialization object\n * @returns the serialized object\n */\n serialize() {\n const serializationObject = {};\n serializationObject.name = this.name;\n serializationObject.influence = this.influence;\n serializationObject.positions = Array.prototype.slice.call(this.getPositions());\n if (this.id != null) {\n serializationObject.id = this.id;\n }\n if (this.hasNormals) {\n serializationObject.normals = Array.prototype.slice.call(this.getNormals());\n }\n if (this.hasTangents) {\n serializationObject.tangents = Array.prototype.slice.call(this.getTangents());\n }\n if (this.hasUVs) {\n serializationObject.uvs = Array.prototype.slice.call(this.getUVs());\n }\n if (this.hasUV2s) {\n serializationObject.uv2s = Array.prototype.slice.call(this.getUV2s());\n }\n // Animations\n SerializationHelper.AppendSerializedAnimations(this, serializationObject);\n return serializationObject;\n }\n /**\n * Returns the string \"MorphTarget\"\n * @returns \"MorphTarget\"\n */\n getClassName() {\n return \"MorphTarget\";\n }\n // Statics\n /**\n * Creates a new target from serialized data\n * @param serializationObject defines the serialized data to use\n * @param scene defines the hosting scene\n * @returns a new MorphTarget\n */\n static Parse(serializationObject, scene) {\n const result = new MorphTarget(serializationObject.name, serializationObject.influence);\n result.setPositions(serializationObject.positions);\n if (serializationObject.id != null) {\n result.id = serializationObject.id;\n }\n if (serializationObject.normals) {\n result.setNormals(serializationObject.normals);\n }\n if (serializationObject.tangents) {\n result.setTangents(serializationObject.tangents);\n }\n if (serializationObject.uvs) {\n result.setUVs(serializationObject.uvs);\n }\n if (serializationObject.uv2s) {\n result.setUV2s(serializationObject.uv2s);\n }\n // Animations\n if (serializationObject.animations) {\n for (let animationIndex = 0; animationIndex < serializationObject.animations.length; animationIndex++) {\n const parsedAnimation = serializationObject.animations[animationIndex];\n const internalClass = GetClass(\"BABYLON.Animation\");\n if (internalClass) {\n result.animations.push(internalClass.Parse(parsedAnimation));\n }\n }\n if (serializationObject.autoAnimate && scene) {\n scene.beginAnimation(result, serializationObject.autoAnimateFrom, serializationObject.autoAnimateTo, serializationObject.autoAnimateLoop, serializationObject.autoAnimateSpeed || 1.0);\n }\n }\n return result;\n }\n /**\n * Creates a MorphTarget from mesh data\n * @param mesh defines the source mesh\n * @param name defines the name to use for the new target\n * @param influence defines the influence to attach to the target\n * @returns a new MorphTarget\n */\n static FromMesh(mesh, name, influence) {\n if (!name) {\n name = mesh.name;\n }\n const result = new MorphTarget(name, influence, mesh.getScene());\n result.setPositions(mesh.getVerticesData(VertexBuffer.PositionKind));\n if (mesh.isVerticesDataPresent(VertexBuffer.NormalKind)) {\n result.setNormals(mesh.getVerticesData(VertexBuffer.NormalKind));\n }\n if (mesh.isVerticesDataPresent(VertexBuffer.TangentKind)) {\n result.setTangents(mesh.getVerticesData(VertexBuffer.TangentKind));\n }\n if (mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {\n result.setUVs(mesh.getVerticesData(VertexBuffer.UVKind));\n }\n if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind)) {\n result.setUV2s(mesh.getVerticesData(VertexBuffer.UV2Kind));\n }\n return result;\n }\n}\n__decorate([\n serialize()\n], MorphTarget.prototype, \"id\", void 0);\n//# sourceMappingURL=morphTarget.js.map","import { Texture } from \"./texture\";\nimport { Constants } from \"../../Engines/constants\";\n/**\n * Class used to store 2D array textures containing user data\n */\nexport class RawTexture2DArray extends Texture {\n /**\n * Gets the number of layers of the texture\n */\n get depth() {\n return this._depth;\n }\n /**\n * Create a new RawTexture2DArray\n * @param data defines the data of the texture\n * @param width defines the width of the texture\n * @param height defines the height of the texture\n * @param depth defines the number of layers of the texture\n * @param format defines the texture format to use\n * @param scene defines the hosting scene\n * @param generateMipMaps defines a boolean indicating if mip levels should be generated (true by default)\n * @param invertY defines if texture must be stored with Y axis inverted\n * @param samplingMode defines the sampling mode to use (Texture.TRILINEAR_SAMPLINGMODE by default)\n * @param textureType defines the texture Type (Engine.TEXTURETYPE_UNSIGNED_BYTE, Engine.TEXTURETYPE_FLOAT...)\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\n */\n constructor(data, width, height, depth, \n /** Gets or sets the texture format to use */\n format, scene, generateMipMaps = true, invertY = false, samplingMode = Texture.TRILINEAR_SAMPLINGMODE, textureType = Constants.TEXTURETYPE_UNSIGNED_BYTE, creationFlags) {\n super(null, scene, !generateMipMaps, invertY);\n this.format = format;\n this._texture = scene.getEngine().createRawTexture2DArray(data, width, height, depth, format, generateMipMaps, invertY, samplingMode, null, textureType, creationFlags);\n this._depth = depth;\n this.is2DArray = true;\n }\n /**\n * Update the texture with new data\n * @param data defines the data to store in the texture\n */\n update(data) {\n if (!this._texture) {\n return;\n }\n this._getEngine().updateRawTexture2DArray(this._texture, data, this._texture.format, this._texture.invertY, null, this._texture.type);\n }\n /**\n * Creates a RGBA texture from some data.\n * @param data Define the texture data\n * @param width Define the width of the texture\n * @param height Define the height of the texture\n * @param depth defines the number of layers of the texture\n * @param scene defines the scene the texture will belong to\n * @param generateMipMaps Define whether or not to create mip maps for the texture\n * @param invertY define if the data should be flipped on Y when uploaded to the GPU\n * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)\n * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)\n * @returns the RGBA texture\n */\n static CreateRGBATexture(data, width, height, depth, scene, generateMipMaps = true, invertY = false, samplingMode = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE, type = Constants.TEXTURETYPE_UNSIGNED_BYTE) {\n return new RawTexture2DArray(data, width, height, depth, Constants.TEXTUREFORMAT_RGBA, scene, generateMipMaps, invertY, samplingMode, type);\n }\n}\n//# sourceMappingURL=rawTexture2DArray.js.map","import { SmartArray } from \"../Misc/smartArray\";\nimport { Logger } from \"../Misc/logger\";\nimport { EngineStore } from \"../Engines/engineStore\";\nimport { MorphTarget } from \"./morphTarget\";\nimport { Constants } from \"../Engines/constants\";\nimport { RawTexture2DArray } from \"../Materials/Textures/rawTexture2DArray\";\n/**\n * This class is used to deform meshes using morphing between different targets\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/morphTargets\n */\nexport class MorphTargetManager {\n /**\n * Sets a boolean indicating that adding new target or updating an existing target will not update the underlying data buffers\n */\n set areUpdatesFrozen(block) {\n if (block) {\n this._blockCounter++;\n }\n else {\n this._blockCounter--;\n if (this._blockCounter <= 0) {\n this._blockCounter = 0;\n this._mustSynchronize = true;\n this._syncActiveTargets();\n }\n }\n }\n get areUpdatesFrozen() {\n return this._blockCounter > 0;\n }\n /**\n * Creates a new MorphTargetManager\n * @param scene defines the current scene\n */\n constructor(scene = null) {\n this._targets = new Array();\n this._targetInfluenceChangedObservers = new Array();\n this._targetDataLayoutChangedObservers = new Array();\n this._activeTargets = new SmartArray(16);\n this._supportsPositions = false;\n this._supportsNormals = false;\n this._supportsTangents = false;\n this._supportsUVs = false;\n this._supportsUV2s = false;\n this._vertexCount = 0;\n this._uniqueId = 0;\n this._tempInfluences = new Array();\n this._canUseTextureForTargets = false;\n this._blockCounter = 0;\n this._mustSynchronize = true;\n /** @internal */\n this._textureVertexStride = 0;\n /** @internal */\n this._textureWidth = 0;\n /** @internal */\n this._textureHeight = 1;\n /** @internal */\n this._parentContainer = null;\n /**\n * Gets or sets a boolean indicating if influencers must be optimized (eg. recompiling the shader if less influencers are used)\n */\n this.optimizeInfluencers = true;\n /**\n * Gets or sets a boolean indicating if positions must be morphed\n */\n this.enablePositionMorphing = true;\n /**\n * Gets or sets a boolean indicating if normals must be morphed\n */\n this.enableNormalMorphing = true;\n /**\n * Gets or sets a boolean indicating if tangents must be morphed\n */\n this.enableTangentMorphing = true;\n /**\n * Gets or sets a boolean indicating if UV must be morphed\n */\n this.enableUVMorphing = true;\n /**\n * Gets or sets a boolean indicating if UV2 must be morphed\n */\n this.enableUV2Morphing = true;\n this._numMaxInfluencers = 0;\n this._useTextureToStoreTargets = true;\n if (!scene) {\n scene = EngineStore.LastCreatedScene;\n }\n this._scene = scene;\n if (this._scene) {\n this._scene.addMorphTargetManager(this);\n this._uniqueId = this._scene.getUniqueId();\n const engineCaps = this._scene.getEngine().getCaps();\n this._canUseTextureForTargets =\n engineCaps.canUseGLVertexID && engineCaps.textureFloat && engineCaps.maxVertexTextureImageUnits > 0 && engineCaps.texture2DArrayMaxLayerCount > 1;\n }\n }\n /**\n * Gets or sets the maximum number of influencers (targets) (default value: 0).\n * Setting a value for this property can lead to a smoother experience, as only one shader will be compiled, which will use this value as the maximum number of influencers.\n * If you leave the value at 0 (default), a new shader will be compiled every time the number of active influencers changes. This can cause problems, as compiling a shader takes time.\n * If you assign a non-zero value to this property, you need to ensure that this value is greater than the maximum number of (active) influencers you'll need for this morph manager.\n * Otherwise, the number of active influencers will be truncated at the value you set for this property, which can lead to unexpected results.\n * Note that this property has no effect if \"useTextureToStoreTargets\" is false.\n */\n get numMaxInfluencers() {\n return this._numMaxInfluencers;\n }\n set numMaxInfluencers(value) {\n if (this._numMaxInfluencers === value) {\n return;\n }\n this._numMaxInfluencers = value;\n this._mustSynchronize = true;\n this._syncActiveTargets();\n }\n /**\n * Gets the unique ID of this manager\n */\n get uniqueId() {\n return this._uniqueId;\n }\n /**\n * Gets the number of vertices handled by this manager\n */\n get vertexCount() {\n return this._vertexCount;\n }\n /**\n * Gets a boolean indicating if this manager supports morphing of positions\n */\n get supportsPositions() {\n return this._supportsPositions && this.enablePositionMorphing;\n }\n /**\n * Gets a boolean indicating if this manager supports morphing of normals\n */\n get supportsNormals() {\n return this._supportsNormals && this.enableNormalMorphing;\n }\n /**\n * Gets a boolean indicating if this manager supports morphing of tangents\n */\n get supportsTangents() {\n return this._supportsTangents && this.enableTangentMorphing;\n }\n /**\n * Gets a boolean indicating if this manager supports morphing of texture coordinates\n */\n get supportsUVs() {\n return this._supportsUVs && this.enableUVMorphing;\n }\n /**\n * Gets a boolean indicating if this manager supports morphing of texture coordinates 2\n */\n get supportsUV2s() {\n return this._supportsUV2s && this.enableUV2Morphing;\n }\n /**\n * Gets the number of targets stored in this manager\n */\n get numTargets() {\n return this._targets.length;\n }\n /**\n * Gets the number of influencers (ie. the number of targets with influences > 0)\n */\n get numInfluencers() {\n return this._activeTargets.length;\n }\n /**\n * Gets the list of influences (one per target)\n */\n get influences() {\n return this._influences;\n }\n /**\n * Gets or sets a boolean indicating that targets should be stored as a texture instead of using vertex attributes (default is true).\n * Please note that this option is not available if the hardware does not support it\n */\n get useTextureToStoreTargets() {\n return this._useTextureToStoreTargets;\n }\n set useTextureToStoreTargets(value) {\n if (this._useTextureToStoreTargets === value) {\n return;\n }\n this._useTextureToStoreTargets = value;\n this._mustSynchronize = true;\n this._syncActiveTargets();\n }\n /**\n * Gets a boolean indicating that the targets are stored into a texture (instead of as attributes)\n */\n get isUsingTextureForTargets() {\n return (MorphTargetManager.EnableTextureStorage &&\n this.useTextureToStoreTargets &&\n this._canUseTextureForTargets &&\n !this._scene?.getEngine().getCaps().disableMorphTargetTexture);\n }\n /**\n * Gets the active target at specified index. An active target is a target with an influence > 0\n * @param index defines the index to check\n * @returns the requested target\n */\n getActiveTarget(index) {\n return this._activeTargets.data[index];\n }\n /**\n * Gets the target at specified index\n * @param index defines the index to check\n * @returns the requested target\n */\n getTarget(index) {\n return this._targets[index];\n }\n /**\n * Gets the first target with the specified name\n * @param name defines the name to check\n * @returns the requested target\n */\n getTargetByName(name) {\n for (const target of this._targets) {\n if (target.name === name) {\n return target;\n }\n }\n return null;\n }\n /**\n * Add a new target to this manager\n * @param target defines the target to add\n */\n addTarget(target) {\n this._targets.push(target);\n this._targetInfluenceChangedObservers.push(target.onInfluenceChanged.add((needUpdate) => {\n this._syncActiveTargets(needUpdate);\n }));\n this._targetDataLayoutChangedObservers.push(target._onDataLayoutChanged.add(() => {\n this._mustSynchronize = true;\n this._syncActiveTargets();\n }));\n this._mustSynchronize = true;\n this._syncActiveTargets();\n }\n /**\n * Removes a target from the manager\n * @param target defines the target to remove\n */\n removeTarget(target) {\n const index = this._targets.indexOf(target);\n if (index >= 0) {\n this._targets.splice(index, 1);\n target.onInfluenceChanged.remove(this._targetInfluenceChangedObservers.splice(index, 1)[0]);\n target._onDataLayoutChanged.remove(this._targetDataLayoutChangedObservers.splice(index, 1)[0]);\n this._mustSynchronize = true;\n this._syncActiveTargets();\n }\n if (this._scene) {\n this._scene.stopAnimation(target);\n }\n }\n /**\n * @internal\n */\n _bind(effect) {\n effect.setFloat3(\"morphTargetTextureInfo\", this._textureVertexStride, this._textureWidth, this._textureHeight);\n effect.setFloatArray(\"morphTargetTextureIndices\", this._morphTargetTextureIndices);\n effect.setTexture(\"morphTargets\", this._targetStoreTexture);\n effect.setInt(\"morphTargetCount\", this.numInfluencers);\n }\n /**\n * Clone the current manager\n * @returns a new MorphTargetManager\n */\n clone() {\n const copy = new MorphTargetManager(this._scene);\n for (const target of this._targets) {\n copy.addTarget(target.clone());\n }\n copy.enableNormalMorphing = this.enableNormalMorphing;\n copy.enableTangentMorphing = this.enableTangentMorphing;\n copy.enableUVMorphing = this.enableUVMorphing;\n copy.enableUV2Morphing = this.enableUV2Morphing;\n return copy;\n }\n /**\n * Serializes the current manager into a Serialization object\n * @returns the serialized object\n */\n serialize() {\n const serializationObject = {};\n serializationObject.id = this.uniqueId;\n serializationObject.targets = [];\n for (const target of this._targets) {\n serializationObject.targets.push(target.serialize());\n }\n return serializationObject;\n }\n _syncActiveTargets(needUpdate = false) {\n if (this.areUpdatesFrozen) {\n return;\n }\n const wasUsingTextureForTargets = !!this._targetStoreTexture;\n const isUsingTextureForTargets = this.isUsingTextureForTargets;\n if (this._mustSynchronize || wasUsingTextureForTargets !== isUsingTextureForTargets) {\n this._mustSynchronize = false;\n this.synchronize();\n }\n let influenceCount = 0;\n this._activeTargets.reset();\n if (!this._morphTargetTextureIndices || this._morphTargetTextureIndices.length !== this._targets.length) {\n this._morphTargetTextureIndices = new Float32Array(this._targets.length);\n }\n let targetIndex = -1;\n for (const target of this._targets) {\n targetIndex++;\n if (target.influence === 0 && this.optimizeInfluencers) {\n continue;\n }\n if (this._activeTargets.length >= MorphTargetManager.MaxActiveMorphTargetsInVertexAttributeMode && !this.isUsingTextureForTargets) {\n break;\n }\n this._activeTargets.push(target);\n this._morphTargetTextureIndices[influenceCount] = targetIndex;\n this._tempInfluences[influenceCount++] = target.influence;\n }\n if (this._morphTargetTextureIndices.length !== influenceCount) {\n this._morphTargetTextureIndices = this._morphTargetTextureIndices.slice(0, influenceCount);\n }\n if (!this._influences || this._influences.length !== influenceCount) {\n this._influences = new Float32Array(influenceCount);\n }\n for (let index = 0; index < influenceCount; index++) {\n this._influences[index] = this._tempInfluences[index];\n }\n if (needUpdate && this._scene) {\n for (const mesh of this._scene.meshes) {\n if (mesh.morphTargetManager === this) {\n if (isUsingTextureForTargets) {\n mesh._markSubMeshesAsAttributesDirty();\n }\n else {\n mesh._syncGeometryWithMorphTargetManager();\n }\n }\n }\n }\n }\n /**\n * Synchronize the targets with all the meshes using this morph target manager\n */\n synchronize() {\n if (!this._scene || this.areUpdatesFrozen) {\n return;\n }\n const engine = this._scene.getEngine();\n this._supportsPositions = true;\n this._supportsNormals = true;\n this._supportsTangents = true;\n this._supportsUVs = true;\n this._supportsUV2s = true;\n this._vertexCount = 0;\n this._targetStoreTexture?.dispose();\n this._targetStoreTexture = null;\n if (this.isUsingTextureForTargets && this._targets.length > engine.getCaps().texture2DArrayMaxLayerCount) {\n this.useTextureToStoreTargets = false;\n }\n for (const target of this._targets) {\n this._supportsPositions = this._supportsPositions && target.hasPositions;\n this._supportsNormals = this._supportsNormals && target.hasNormals;\n this._supportsTangents = this._supportsTangents && target.hasTangents;\n this._supportsUVs = this._supportsUVs && target.hasUVs;\n this._supportsUV2s = this._supportsUV2s && target.hasUV2s;\n const vertexCount = target.vertexCount;\n if (this._vertexCount === 0) {\n this._vertexCount = vertexCount;\n }\n else if (this._vertexCount !== vertexCount) {\n Logger.Error(`Incompatible target. Targets must all have the same vertices count. Current vertex count: ${this._vertexCount}, vertex count for target \"${target.name}\": ${vertexCount}`);\n return;\n }\n }\n if (this.isUsingTextureForTargets) {\n this._textureVertexStride = 0;\n this._supportsPositions && this._textureVertexStride++;\n this._supportsNormals && this._textureVertexStride++;\n this._supportsTangents && this._textureVertexStride++;\n this._supportsUVs && this._textureVertexStride++;\n this.supportsUV2s && this._textureVertexStride++;\n this._textureWidth = this._vertexCount * this._textureVertexStride || 1;\n this._textureHeight = 1;\n const maxTextureSize = engine.getCaps().maxTextureSize;\n if (this._textureWidth > maxTextureSize) {\n this._textureHeight = Math.ceil(this._textureWidth / maxTextureSize);\n this._textureWidth = maxTextureSize;\n }\n const targetCount = this._targets.length;\n const data = new Float32Array(targetCount * this._textureWidth * this._textureHeight * 4);\n let offset = 0;\n for (let index = 0; index < targetCount; index++) {\n const target = this._targets[index];\n const positions = target.getPositions();\n const normals = target.getNormals();\n const uvs = target.getUVs();\n const tangents = target.getTangents();\n const uv2s = target.getUV2s();\n offset = index * this._textureWidth * this._textureHeight * 4;\n for (let vertex = 0; vertex < this._vertexCount; vertex++) {\n if (this._supportsPositions && positions) {\n data[offset] = positions[vertex * 3];\n data[offset + 1] = positions[vertex * 3 + 1];\n data[offset + 2] = positions[vertex * 3 + 2];\n offset += 4;\n }\n if (this._supportsNormals && normals) {\n data[offset] = normals[vertex * 3];\n data[offset + 1] = normals[vertex * 3 + 1];\n data[offset + 2] = normals[vertex * 3 + 2];\n offset += 4;\n }\n if (this._supportsUVs && uvs) {\n data[offset] = uvs[vertex * 2];\n data[offset + 1] = uvs[vertex * 2 + 1];\n offset += 4;\n }\n if (this._supportsTangents && tangents) {\n data[offset] = tangents[vertex * 3];\n data[offset + 1] = tangents[vertex * 3 + 1];\n data[offset + 2] = tangents[vertex * 3 + 2];\n offset += 4;\n }\n if (this._supportsUV2s && uv2s) {\n data[offset] = uv2s[vertex * 2];\n data[offset + 1] = uv2s[vertex * 2 + 1];\n offset += 4;\n }\n }\n }\n this._targetStoreTexture = RawTexture2DArray.CreateRGBATexture(data, this._textureWidth, this._textureHeight, targetCount, this._scene, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE, Constants.TEXTURETYPE_FLOAT);\n this._targetStoreTexture.name = `Morph texture_${this.uniqueId}`;\n }\n // Flag meshes as dirty to resync with the active targets\n for (const mesh of this._scene.meshes) {\n if (mesh.morphTargetManager === this) {\n mesh._syncGeometryWithMorphTargetManager();\n }\n }\n }\n /**\n * Release all resources\n */\n dispose() {\n if (this._targetStoreTexture) {\n this._targetStoreTexture.dispose();\n }\n this._targetStoreTexture = null;\n // Remove from scene\n if (this._scene) {\n this._scene.removeMorphTargetManager(this);\n if (this._parentContainer) {\n const index = this._parentContainer.morphTargetManagers.indexOf(this);\n if (index > -1) {\n this._parentContainer.morphTargetManagers.splice(index, 1);\n }\n this._parentContainer = null;\n }\n for (const morph of this._targets) {\n this._scene.stopAnimation(morph);\n }\n }\n }\n // Statics\n /**\n * Creates a new MorphTargetManager from serialized data\n * @param serializationObject defines the serialized data\n * @param scene defines the hosting scene\n * @returns the new MorphTargetManager\n */\n static Parse(serializationObject, scene) {\n const result = new MorphTargetManager(scene);\n for (const targetData of serializationObject.targets) {\n result.addTarget(MorphTarget.Parse(targetData, scene));\n }\n return result;\n }\n}\n/** Enable storing morph target data into textures when set to true (true by default) */\nMorphTargetManager.EnableTextureStorage = true;\n/** Maximum number of active morph targets supported in the \"vertex attribute\" mode (i.e., not the \"texture\" mode) */\nMorphTargetManager.MaxActiveMorphTargetsInVertexAttributeMode = 8;\n//# sourceMappingURL=morphTargetManager.js.map","import { Decode } from \"./stringTools\";\n/**\n * Utility class for reading from a data buffer\n */\nexport class DataReader {\n /**\n * Constructor\n * @param buffer The buffer to read\n */\n constructor(buffer) {\n /**\n * The current byte offset from the beginning of the data buffer.\n */\n this.byteOffset = 0;\n this.buffer = buffer;\n }\n /**\n * Loads the given byte length.\n * @param byteLength The byte length to load\n * @returns A promise that resolves when the load is complete\n */\n loadAsync(byteLength) {\n return this.buffer.readAsync(this.byteOffset, byteLength).then((data) => {\n this._dataView = new DataView(data.buffer, data.byteOffset, data.byteLength);\n this._dataByteOffset = 0;\n });\n }\n /**\n * Read a unsigned 32-bit integer from the currently loaded data range.\n * @returns The 32-bit integer read\n */\n readUint32() {\n const value = this._dataView.getUint32(this._dataByteOffset, true);\n this._dataByteOffset += 4;\n this.byteOffset += 4;\n return value;\n }\n /**\n * Read a byte array from the currently loaded data range.\n * @param byteLength The byte length to read\n * @returns The byte array read\n */\n readUint8Array(byteLength) {\n const value = new Uint8Array(this._dataView.buffer, this._dataView.byteOffset + this._dataByteOffset, byteLength);\n this._dataByteOffset += byteLength;\n this.byteOffset += byteLength;\n return value;\n }\n /**\n * Read a string from the currently loaded data range.\n * @param byteLength The byte length to read\n * @returns The string read\n */\n readString(byteLength) {\n return Decode(this.readUint8Array(byteLength));\n }\n /**\n * Skips the given byte length the currently loaded data range.\n * @param byteLength The byte length to skip\n */\n skipBytes(byteLength) {\n this._dataByteOffset += byteLength;\n this.byteOffset += byteLength;\n }\n}\n//# sourceMappingURL=dataReader.js.map","import { Tools } from \"core/Misc/tools\";\nfunction validateAsync(data, rootUrl, fileName, getExternalResource) {\n const options = {\n externalResourceFunction: getExternalResource,\n };\n if (fileName) {\n options.uri = rootUrl === \"file:\" ? fileName : rootUrl + fileName;\n }\n return ArrayBuffer.isView(data) ? GLTFValidator.validateBytes(data, options) : GLTFValidator.validateString(data, options);\n}\n/**\n * The worker function that gets converted to a blob url to pass into a worker.\n */\nfunction workerFunc() {\n const pendingExternalResources = [];\n onmessage = (message) => {\n const data = message.data;\n switch (data.id) {\n case \"init\": {\n importScripts(data.url);\n break;\n }\n case \"validate\": {\n validateAsync(data.data, data.rootUrl, data.fileName, (uri) => new Promise((resolve, reject) => {\n const index = pendingExternalResources.length;\n pendingExternalResources.push({ resolve, reject });\n postMessage({ id: \"getExternalResource\", index: index, uri: uri });\n })).then((value) => {\n postMessage({ id: \"validate.resolve\", value: value });\n }, (reason) => {\n postMessage({ id: \"validate.reject\", reason: reason });\n });\n break;\n }\n case \"getExternalResource.resolve\": {\n pendingExternalResources[data.index].resolve(data.value);\n break;\n }\n case \"getExternalResource.reject\": {\n pendingExternalResources[data.index].reject(data.reason);\n break;\n }\n }\n };\n}\n/**\n * glTF validation\n */\nexport class GLTFValidation {\n /**\n * Validate a glTF asset using the glTF-Validator.\n * @param data The JSON of a glTF or the array buffer of a binary glTF\n * @param rootUrl The root url for the glTF\n * @param fileName The file name for the glTF\n * @param getExternalResource The callback to get external resources for the glTF validator\n * @returns A promise that resolves with the glTF validation results once complete\n */\n static ValidateAsync(data, rootUrl, fileName, getExternalResource) {\n if (typeof Worker === \"function\") {\n return new Promise((resolve, reject) => {\n const workerContent = `${validateAsync}(${workerFunc})()`;\n const workerBlobUrl = URL.createObjectURL(new Blob([workerContent], { type: \"application/javascript\" }));\n const worker = new Worker(workerBlobUrl);\n const onError = (error) => {\n worker.removeEventListener(\"error\", onError);\n worker.removeEventListener(\"message\", onMessage);\n reject(error);\n };\n const onMessage = (message) => {\n const data = message.data;\n switch (data.id) {\n case \"getExternalResource\": {\n getExternalResource(data.uri).then((value) => {\n worker.postMessage({ id: \"getExternalResource.resolve\", index: data.index, value: value }, [value.buffer]);\n }, (reason) => {\n worker.postMessage({ id: \"getExternalResource.reject\", index: data.index, reason: reason });\n });\n break;\n }\n case \"validate.resolve\": {\n worker.removeEventListener(\"error\", onError);\n worker.removeEventListener(\"message\", onMessage);\n resolve(data.value);\n worker.terminate();\n break;\n }\n case \"validate.reject\": {\n worker.removeEventListener(\"error\", onError);\n worker.removeEventListener(\"message\", onMessage);\n reject(data.reason);\n worker.terminate();\n }\n }\n };\n worker.addEventListener(\"error\", onError);\n worker.addEventListener(\"message\", onMessage);\n worker.postMessage({ id: \"init\", url: Tools.GetBabylonScriptURL(this.Configuration.url) });\n if (ArrayBuffer.isView(data)) {\n // Slice the data to avoid copying the whole array buffer.\n const slicedData = data.slice();\n worker.postMessage({ id: \"validate\", data: slicedData, rootUrl: rootUrl, fileName: fileName }, [slicedData.buffer]);\n }\n else {\n worker.postMessage({ id: \"validate\", data: data, rootUrl: rootUrl, fileName: fileName });\n }\n });\n }\n else {\n if (!this._LoadScriptPromise) {\n this._LoadScriptPromise = Tools.LoadBabylonScriptAsync(this.Configuration.url);\n }\n return this._LoadScriptPromise.then(() => {\n return validateAsync(data, rootUrl, fileName, getExternalResource);\n });\n }\n }\n}\n/**\n * The configuration. Defaults to `{ url: \"https://cdn.babylonjs.com/gltf_validator.js\" }`.\n */\nGLTFValidation.Configuration = {\n url: `${Tools._DefaultCdnUrl}/gltf_validator.js`,\n};\n//# sourceMappingURL=glTFValidation.js.map","import { Deferred } from \"core/Misc/deferred\";\nimport { Quaternion, Vector3, Matrix, TmpVectors } from \"core/Maths/math.vector\";\nimport { Color3 } from \"core/Maths/math.color\";\nimport { Tools } from \"core/Misc/tools\";\nimport { Camera } from \"core/Cameras/camera\";\nimport { FreeCamera } from \"core/Cameras/freeCamera\";\nimport { Bone } from \"core/Bones/bone\";\nimport { Skeleton } from \"core/Bones/skeleton\";\nimport { Material } from \"core/Materials/material\";\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\nimport { Texture } from \"core/Materials/Textures/texture\";\nimport { TransformNode } from \"core/Meshes/transformNode\";\nimport { Buffer, VertexBuffer } from \"core/Buffers/buffer\";\nimport { Geometry } from \"core/Meshes/geometry\";\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\nimport { Mesh } from \"core/Meshes/mesh\";\nimport { MorphTarget } from \"core/Morph/morphTarget\";\nimport { MorphTargetManager } from \"core/Morph/morphTargetManager\";\nimport { GLTFFileLoader, GLTFLoaderState, GLTFLoaderCoordinateSystemMode, GLTFLoaderAnimationStartMode } from \"../glTFFileLoader\";\nimport { DecodeBase64UrlToBinary, IsBase64DataUrl, LoadFileError } from \"core/Misc/fileTools\";\nimport { Logger } from \"core/Misc/logger\";\nimport { BoundingInfo } from \"core/Culling/boundingInfo\";\nimport { nodeAnimationData } from \"./glTFLoaderAnimation\";\nimport { registeredGLTFExtensions, registerGLTFExtension, unregisterGLTFExtension } from \"./glTFLoaderExtensionRegistry\";\nimport { deepMerge } from \"core/Misc/deepMerger\";\nexport { GLTFFileLoader };\n/**\n * Helper class for working with arrays when loading the glTF asset\n */\nexport class ArrayItem {\n /**\n * Gets an item from the given array.\n * @param context The context when loading the asset\n * @param array The array to get the item from\n * @param index The index to the array\n * @returns The array item\n */\n static Get(context, array, index) {\n if (!array || index == undefined || !array[index]) {\n throw new Error(`${context}: Failed to find index (${index})`);\n }\n return array[index];\n }\n /**\n * Gets an item from the given array or returns null if not available.\n * @param array The array to get the item from\n * @param index The index to the array\n * @returns The array item or null\n */\n static TryGet(array, index) {\n if (!array || index == undefined || !array[index]) {\n return null;\n }\n return array[index];\n }\n /**\n * Assign an `index` field to each item of the given array.\n * @param array The array of items\n */\n static Assign(array) {\n if (array) {\n for (let index = 0; index < array.length; index++) {\n array[index].index = index;\n }\n }\n }\n}\n/** @internal */\nexport function LoadBoundingInfoFromPositionAccessor(accessor) {\n if (accessor.min && accessor.max) {\n const minArray = accessor.min;\n const maxArray = accessor.max;\n const minVector = TmpVectors.Vector3[0].copyFromFloats(minArray[0], minArray[1], minArray[2]);\n const maxVector = TmpVectors.Vector3[1].copyFromFloats(maxArray[0], maxArray[1], maxArray[2]);\n if (accessor.normalized && accessor.componentType !== 5126 /* AccessorComponentType.FLOAT */) {\n let divider = 1;\n switch (accessor.componentType) {\n case 5120 /* AccessorComponentType.BYTE */:\n divider = 127.0;\n break;\n case 5121 /* AccessorComponentType.UNSIGNED_BYTE */:\n divider = 255.0;\n break;\n case 5122 /* AccessorComponentType.SHORT */:\n divider = 32767.0;\n break;\n case 5123 /* AccessorComponentType.UNSIGNED_SHORT */:\n divider = 65535.0;\n break;\n }\n const oneOverDivider = 1 / divider;\n minVector.scaleInPlace(oneOverDivider);\n maxVector.scaleInPlace(oneOverDivider);\n }\n return new BoundingInfo(minVector, maxVector);\n }\n return null;\n}\n/**\n * The glTF 2.0 loader\n */\nexport class GLTFLoader {\n /**\n * Registers a loader extension.\n * @param name The name of the loader extension.\n * @param factory The factory function that creates the loader extension.\n * @deprecated Please use registerGLTFExtension instead.\n */\n static RegisterExtension(name, factory) {\n registerGLTFExtension(name, false, factory);\n }\n /**\n * Unregisters a loader extension.\n * @param name The name of the loader extension.\n * @returns A boolean indicating whether the extension has been unregistered\n * @deprecated Please use unregisterGLTFExtension instead.\n */\n static UnregisterExtension(name) {\n return unregisterGLTFExtension(name);\n }\n /**\n * The object that represents the glTF JSON.\n */\n get gltf() {\n if (!this._gltf) {\n throw new Error(\"glTF JSON is not available\");\n }\n return this._gltf;\n }\n /**\n * The BIN chunk of a binary glTF.\n */\n get bin() {\n return this._bin;\n }\n /**\n * The parent file loader.\n */\n get parent() {\n return this._parent;\n }\n /**\n * The Babylon scene when loading the asset.\n */\n get babylonScene() {\n if (!this._babylonScene) {\n throw new Error(\"Scene is not available\");\n }\n return this._babylonScene;\n }\n /**\n * The root Babylon node when loading the asset.\n */\n get rootBabylonMesh() {\n return this._rootBabylonMesh;\n }\n /**\n * The root url when loading the asset.\n */\n get rootUrl() {\n return this._rootUrl;\n }\n /**\n * @internal\n */\n constructor(parent) {\n /** @internal */\n this._completePromises = new Array();\n /** @internal */\n this._assetContainer = null;\n /** Storage */\n this._babylonLights = [];\n /** @internal */\n this._disableInstancedMesh = 0;\n /** @internal */\n this._allMaterialsDirtyRequired = false;\n this._extensions = new Array();\n this._disposed = false;\n this._rootUrl = null;\n this._fileName = null;\n this._uniqueRootUrl = null;\n this._bin = null;\n this._rootBabylonMesh = null;\n this._defaultBabylonMaterialData = {};\n this._postSceneLoadActions = new Array();\n this._parent = parent;\n }\n /** @internal */\n dispose() {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._completePromises.length = 0;\n this._extensions.forEach((extension) => extension.dispose && extension.dispose());\n this._extensions.length = 0;\n this._gltf = null; // TODO\n this._bin = null;\n this._babylonScene = null; // TODO\n this._rootBabylonMesh = null;\n this._defaultBabylonMaterialData = {};\n this._postSceneLoadActions.length = 0;\n this._parent.dispose();\n }\n /**\n * @internal\n */\n importMeshAsync(meshesNames, scene, container, data, rootUrl, onProgress, fileName = \"\") {\n return Promise.resolve().then(() => {\n this._babylonScene = scene;\n this._assetContainer = container;\n this._loadData(data);\n let nodes = null;\n if (meshesNames) {\n const nodeMap = {};\n if (this._gltf.nodes) {\n for (const node of this._gltf.nodes) {\n if (node.name) {\n nodeMap[node.name] = node.index;\n }\n }\n }\n const names = meshesNames instanceof Array ? meshesNames : [meshesNames];\n nodes = names.map((name) => {\n const node = nodeMap[name];\n if (node === undefined) {\n throw new Error(`Failed to find node '${name}'`);\n }\n return node;\n });\n }\n return this._loadAsync(rootUrl, fileName, nodes, () => {\n return {\n meshes: this._getMeshes(),\n particleSystems: [],\n skeletons: this._getSkeletons(),\n animationGroups: this._getAnimationGroups(),\n lights: this._babylonLights,\n transformNodes: this._getTransformNodes(),\n geometries: this._getGeometries(),\n spriteManagers: [],\n };\n });\n });\n }\n /**\n * @internal\n */\n loadAsync(scene, data, rootUrl, onProgress, fileName = \"\") {\n return Promise.resolve().then(() => {\n this._babylonScene = scene;\n this._loadData(data);\n return this._loadAsync(rootUrl, fileName, null, () => undefined);\n });\n }\n _loadAsync(rootUrl, fileName, nodes, resultFunc) {\n return Promise.resolve()\n .then(async () => {\n this._rootUrl = rootUrl;\n this._uniqueRootUrl = !rootUrl.startsWith(\"file:\") && fileName ? rootUrl : `${rootUrl}${Date.now()}/`;\n this._fileName = fileName;\n this._allMaterialsDirtyRequired = false;\n await this._loadExtensionsAsync();\n const loadingToReadyCounterName = `${GLTFLoaderState[GLTFLoaderState.LOADING]} => ${GLTFLoaderState[GLTFLoaderState.READY]}`;\n const loadingToCompleteCounterName = `${GLTFLoaderState[GLTFLoaderState.LOADING]} => ${GLTFLoaderState[GLTFLoaderState.COMPLETE]}`;\n this._parent._startPerformanceCounter(loadingToReadyCounterName);\n this._parent._startPerformanceCounter(loadingToCompleteCounterName);\n this._parent._setState(GLTFLoaderState.LOADING);\n this._extensionsOnLoading();\n const promises = new Array();\n // Block the marking of materials dirty until the scene is loaded.\n const oldBlockMaterialDirtyMechanism = this._babylonScene.blockMaterialDirtyMechanism;\n this._babylonScene.blockMaterialDirtyMechanism = true;\n if (!this.parent.loadOnlyMaterials) {\n if (nodes) {\n promises.push(this.loadSceneAsync(\"/nodes\", { nodes: nodes, index: -1 }));\n }\n else if (this._gltf.scene != undefined || (this._gltf.scenes && this._gltf.scenes[0])) {\n const scene = ArrayItem.Get(`/scene`, this._gltf.scenes, this._gltf.scene || 0);\n promises.push(this.loadSceneAsync(`/scenes/${scene.index}`, scene));\n }\n }\n if (!this.parent.skipMaterials && this.parent.loadAllMaterials && this._gltf.materials) {\n for (let m = 0; m < this._gltf.materials.length; ++m) {\n const material = this._gltf.materials[m];\n const context = \"/materials/\" + m;\n const babylonDrawMode = Material.TriangleFillMode;\n promises.push(this._loadMaterialAsync(context, material, null, babylonDrawMode, () => { }));\n }\n }\n // Restore the blocking of material dirty.\n if (this._allMaterialsDirtyRequired) {\n // This can happen if we add a light for instance as it will impact the whole scene.\n // This automatically resets everything if needed.\n this._babylonScene.blockMaterialDirtyMechanism = oldBlockMaterialDirtyMechanism;\n }\n else {\n // By default a newly created material is dirty so there is no need to flag the full scene as dirty.\n // For perf reasons, we then bypass blockMaterialDirtyMechanism as this would \"dirty\" the entire scene.\n this._babylonScene._forceBlockMaterialDirtyMechanism(oldBlockMaterialDirtyMechanism);\n }\n if (this._parent.compileMaterials) {\n promises.push(this._compileMaterialsAsync());\n }\n if (this._parent.compileShadowGenerators) {\n promises.push(this._compileShadowGeneratorsAsync());\n }\n const resultPromise = Promise.all(promises).then(() => {\n if (this._rootBabylonMesh && this._rootBabylonMesh !== this._parent.customRootNode) {\n this._rootBabylonMesh.setEnabled(true);\n }\n this._extensionsOnReady();\n this._parent._setState(GLTFLoaderState.READY);\n this._startAnimations();\n return resultFunc();\n });\n return resultPromise.then((result) => {\n this._parent._endPerformanceCounter(loadingToReadyCounterName);\n Tools.SetImmediate(() => {\n if (!this._disposed) {\n Promise.all(this._completePromises).then(() => {\n this._parent._endPerformanceCounter(loadingToCompleteCounterName);\n this._parent._setState(GLTFLoaderState.COMPLETE);\n this._parent.onCompleteObservable.notifyObservers(undefined);\n this._parent.onCompleteObservable.clear();\n this.dispose();\n }, (error) => {\n this._parent.onErrorObservable.notifyObservers(error);\n this._parent.onErrorObservable.clear();\n this.dispose();\n });\n }\n });\n return result;\n });\n })\n .catch((error) => {\n if (!this._disposed) {\n this._parent.onErrorObservable.notifyObservers(error);\n this._parent.onErrorObservable.clear();\n this.dispose();\n }\n throw error;\n });\n }\n _loadData(data) {\n this._gltf = data.json;\n this._setupData();\n if (data.bin) {\n const buffers = this._gltf.buffers;\n if (buffers && buffers[0] && !buffers[0].uri) {\n const binaryBuffer = buffers[0];\n if (binaryBuffer.byteLength < data.bin.byteLength - 3 || binaryBuffer.byteLength > data.bin.byteLength) {\n Logger.Warn(`Binary buffer length (${binaryBuffer.byteLength}) from JSON does not match chunk length (${data.bin.byteLength})`);\n }\n this._bin = data.bin;\n }\n else {\n Logger.Warn(\"Unexpected BIN chunk\");\n }\n }\n }\n _setupData() {\n ArrayItem.Assign(this._gltf.accessors);\n ArrayItem.Assign(this._gltf.animations);\n ArrayItem.Assign(this._gltf.buffers);\n ArrayItem.Assign(this._gltf.bufferViews);\n ArrayItem.Assign(this._gltf.cameras);\n ArrayItem.Assign(this._gltf.images);\n ArrayItem.Assign(this._gltf.materials);\n ArrayItem.Assign(this._gltf.meshes);\n ArrayItem.Assign(this._gltf.nodes);\n ArrayItem.Assign(this._gltf.samplers);\n ArrayItem.Assign(this._gltf.scenes);\n ArrayItem.Assign(this._gltf.skins);\n ArrayItem.Assign(this._gltf.textures);\n if (this._gltf.nodes) {\n const nodeParents = {};\n for (const node of this._gltf.nodes) {\n if (node.children) {\n for (const index of node.children) {\n nodeParents[index] = node.index;\n }\n }\n }\n const rootNode = this._createRootNode();\n for (const node of this._gltf.nodes) {\n const parentIndex = nodeParents[node.index];\n node.parent = parentIndex === undefined ? rootNode : this._gltf.nodes[parentIndex];\n }\n }\n }\n async _loadExtensionsAsync() {\n const extensionPromises = [];\n registeredGLTFExtensions.forEach((registeredExtension, name) => {\n // Don't load explicitly disabled extensions.\n if (this.parent.extensionOptions[name]?.enabled === false) {\n // But warn if the disabled extension is used by the model.\n if (registeredExtension.isGLTFExtension && this.isExtensionUsed(name)) {\n Logger.Warn(`Extension ${name} is used but has been explicitly disabled.`);\n }\n }\n // Load loader extensions that are not a glTF extension, as well as extensions that are glTF extensions and are used by the model.\n else if (!registeredExtension.isGLTFExtension || this.isExtensionUsed(name)) {\n extensionPromises.push((async () => {\n const extension = await registeredExtension.factory(this);\n if (extension.name !== name) {\n Logger.Warn(`The name of the glTF loader extension instance does not match the registered name: ${extension.name} !== ${name}`);\n }\n this._parent.onExtensionLoadedObservable.notifyObservers(extension);\n return extension;\n })());\n }\n });\n this._extensions.push(...(await Promise.all(extensionPromises)));\n this._extensions.sort((a, b) => (a.order || Number.MAX_VALUE) - (b.order || Number.MAX_VALUE));\n this._parent.onExtensionLoadedObservable.clear();\n if (this._gltf.extensionsRequired) {\n for (const name of this._gltf.extensionsRequired) {\n const available = this._extensions.some((extension) => extension.name === name && extension.enabled);\n if (!available) {\n if (this.parent.extensionOptions[name]?.enabled === false) {\n throw new Error(`Required extension ${name} is disabled`);\n }\n throw new Error(`Required extension ${name} is not available`);\n }\n }\n }\n }\n _createRootNode() {\n if (this._parent.customRootNode !== undefined) {\n this._rootBabylonMesh = this._parent.customRootNode;\n return {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n _babylonTransformNode: this._rootBabylonMesh === null ? undefined : this._rootBabylonMesh,\n index: -1,\n };\n }\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const rootMesh = new Mesh(\"__root__\", this._babylonScene);\n this._rootBabylonMesh = rootMesh;\n this._rootBabylonMesh._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n this._rootBabylonMesh.setEnabled(false);\n const rootNode = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n _babylonTransformNode: this._rootBabylonMesh,\n index: -1,\n };\n switch (this._parent.coordinateSystemMode) {\n case GLTFLoaderCoordinateSystemMode.AUTO: {\n if (!this._babylonScene.useRightHandedSystem) {\n rootNode.rotation = [0, 1, 0, 0];\n rootNode.scale = [1, 1, -1];\n GLTFLoader._LoadTransform(rootNode, this._rootBabylonMesh);\n }\n break;\n }\n case GLTFLoaderCoordinateSystemMode.FORCE_RIGHT_HANDED: {\n this._babylonScene.useRightHandedSystem = true;\n break;\n }\n default: {\n throw new Error(`Invalid coordinate system mode (${this._parent.coordinateSystemMode})`);\n }\n }\n this._parent.onMeshLoadedObservable.notifyObservers(rootMesh);\n return rootNode;\n }\n /**\n * Loads a glTF scene.\n * @param context The context when loading the asset\n * @param scene The glTF scene property\n * @returns A promise that resolves when the load is complete\n */\n loadSceneAsync(context, scene) {\n const extensionPromise = this._extensionsLoadSceneAsync(context, scene);\n if (extensionPromise) {\n return extensionPromise;\n }\n const promises = new Array();\n this.logOpen(`${context} ${scene.name || \"\"}`);\n if (scene.nodes) {\n for (const index of scene.nodes) {\n const node = ArrayItem.Get(`${context}/nodes/${index}`, this._gltf.nodes, index);\n promises.push(this.loadNodeAsync(`/nodes/${node.index}`, node, (babylonMesh) => {\n babylonMesh.parent = this._rootBabylonMesh;\n }));\n }\n }\n for (const action of this._postSceneLoadActions) {\n action();\n }\n promises.push(this._loadAnimationsAsync());\n this.logClose();\n return Promise.all(promises).then(() => { });\n }\n _forEachPrimitive(node, callback) {\n if (node._primitiveBabylonMeshes) {\n for (const babylonMesh of node._primitiveBabylonMeshes) {\n callback(babylonMesh);\n }\n }\n }\n _getGeometries() {\n const geometries = [];\n const nodes = this._gltf.nodes;\n if (nodes) {\n for (const node of nodes) {\n this._forEachPrimitive(node, (babylonMesh) => {\n const geometry = babylonMesh.geometry;\n if (geometry && geometries.indexOf(geometry) === -1) {\n geometries.push(geometry);\n }\n });\n }\n }\n return geometries;\n }\n _getMeshes() {\n const meshes = [];\n // Root mesh is always first, if available.\n if (this._rootBabylonMesh instanceof AbstractMesh) {\n meshes.push(this._rootBabylonMesh);\n }\n const nodes = this._gltf.nodes;\n if (nodes) {\n for (const node of nodes) {\n this._forEachPrimitive(node, (babylonMesh) => {\n meshes.push(babylonMesh);\n });\n }\n }\n return meshes;\n }\n _getTransformNodes() {\n const transformNodes = [];\n const nodes = this._gltf.nodes;\n if (nodes) {\n for (const node of nodes) {\n if (node._babylonTransformNode && node._babylonTransformNode.getClassName() === \"TransformNode\") {\n transformNodes.push(node._babylonTransformNode);\n }\n if (node._babylonTransformNodeForSkin) {\n transformNodes.push(node._babylonTransformNodeForSkin);\n }\n }\n }\n return transformNodes;\n }\n _getSkeletons() {\n const skeletons = [];\n const skins = this._gltf.skins;\n if (skins) {\n for (const skin of skins) {\n if (skin._data) {\n skeletons.push(skin._data.babylonSkeleton);\n }\n }\n }\n return skeletons;\n }\n _getAnimationGroups() {\n const animationGroups = [];\n const animations = this._gltf.animations;\n if (animations) {\n for (const animation of animations) {\n if (animation._babylonAnimationGroup) {\n animationGroups.push(animation._babylonAnimationGroup);\n }\n }\n }\n return animationGroups;\n }\n _startAnimations() {\n switch (this._parent.animationStartMode) {\n case GLTFLoaderAnimationStartMode.NONE: {\n // do nothing\n break;\n }\n case GLTFLoaderAnimationStartMode.FIRST: {\n const babylonAnimationGroups = this._getAnimationGroups();\n if (babylonAnimationGroups.length !== 0) {\n babylonAnimationGroups[0].start(true);\n }\n break;\n }\n case GLTFLoaderAnimationStartMode.ALL: {\n const babylonAnimationGroups = this._getAnimationGroups();\n for (const babylonAnimationGroup of babylonAnimationGroups) {\n babylonAnimationGroup.start(true);\n }\n break;\n }\n default: {\n Logger.Error(`Invalid animation start mode (${this._parent.animationStartMode})`);\n return;\n }\n }\n }\n /**\n * Loads a glTF node.\n * @param context The context when loading the asset\n * @param node The glTF node property\n * @param assign A function called synchronously after parsing the glTF properties\n * @returns A promise that resolves with the loaded Babylon mesh when the load is complete\n */\n loadNodeAsync(context, node, assign = () => { }) {\n const extensionPromise = this._extensionsLoadNodeAsync(context, node, assign);\n if (extensionPromise) {\n return extensionPromise;\n }\n if (node._babylonTransformNode) {\n throw new Error(`${context}: Invalid recursive node hierarchy`);\n }\n const promises = new Array();\n this.logOpen(`${context} ${node.name || \"\"}`);\n const loadNode = (babylonTransformNode) => {\n GLTFLoader.AddPointerMetadata(babylonTransformNode, context);\n GLTFLoader._LoadTransform(node, babylonTransformNode);\n if (node.camera != undefined) {\n const camera = ArrayItem.Get(`${context}/camera`, this._gltf.cameras, node.camera);\n promises.push(this.loadCameraAsync(`/cameras/${camera.index}`, camera, (babylonCamera) => {\n babylonCamera.parent = babylonTransformNode;\n }));\n }\n if (node.children) {\n for (const index of node.children) {\n const childNode = ArrayItem.Get(`${context}/children/${index}`, this._gltf.nodes, index);\n promises.push(this.loadNodeAsync(`/nodes/${childNode.index}`, childNode, (childBabylonMesh) => {\n childBabylonMesh.parent = babylonTransformNode;\n }));\n }\n }\n assign(babylonTransformNode);\n };\n const hasMesh = node.mesh != undefined;\n const hasSkin = this._parent.loadSkins && node.skin != undefined;\n if (!hasMesh || hasSkin) {\n const nodeName = node.name || `node${node.index}`;\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const transformNode = new TransformNode(nodeName, this._babylonScene);\n transformNode._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n if (node.mesh == undefined) {\n node._babylonTransformNode = transformNode;\n }\n else {\n node._babylonTransformNodeForSkin = transformNode;\n }\n loadNode(transformNode);\n }\n if (hasMesh) {\n if (hasSkin) {\n // See https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins (second implementation note)\n // This code path will place the skinned mesh as a sibling of the skeleton root node without loading the\n // transform, which effectively ignores the transform of the skinned mesh, as per spec.\n const mesh = ArrayItem.Get(`${context}/mesh`, this._gltf.meshes, node.mesh);\n promises.push(this._loadMeshAsync(`/meshes/${mesh.index}`, node, mesh, (babylonTransformNode) => {\n const babylonTransformNodeForSkin = node._babylonTransformNodeForSkin;\n // Merge the metadata from the skin node to the skinned mesh in case a loader extension added metadata.\n babylonTransformNode.metadata = deepMerge(babylonTransformNodeForSkin.metadata, babylonTransformNode.metadata || {});\n const skin = ArrayItem.Get(`${context}/skin`, this._gltf.skins, node.skin);\n promises.push(this._loadSkinAsync(`/skins/${skin.index}`, node, skin, (babylonSkeleton) => {\n this._forEachPrimitive(node, (babylonMesh) => {\n babylonMesh.skeleton = babylonSkeleton;\n });\n // Wait until all the nodes are parented before parenting the skinned mesh.\n this._postSceneLoadActions.push(() => {\n if (skin.skeleton != undefined) {\n // Place the skinned mesh node as a sibling of the skeleton root node.\n // Handle special case when the parent of the skeleton root is the skinned mesh.\n const parentNode = ArrayItem.Get(`/skins/${skin.index}/skeleton`, this._gltf.nodes, skin.skeleton).parent;\n if (node.index === parentNode.index) {\n babylonTransformNode.parent = babylonTransformNodeForSkin.parent;\n }\n else {\n babylonTransformNode.parent = parentNode._babylonTransformNode;\n }\n }\n else {\n babylonTransformNode.parent = this._rootBabylonMesh;\n }\n this._parent.onSkinLoadedObservable.notifyObservers({ node: babylonTransformNodeForSkin, skinnedNode: babylonTransformNode });\n });\n }));\n }));\n }\n else {\n const mesh = ArrayItem.Get(`${context}/mesh`, this._gltf.meshes, node.mesh);\n promises.push(this._loadMeshAsync(`/meshes/${mesh.index}`, node, mesh, loadNode));\n }\n }\n this.logClose();\n return Promise.all(promises).then(() => {\n this._forEachPrimitive(node, (babylonMesh) => {\n if (babylonMesh.geometry && babylonMesh.geometry.useBoundingInfoFromGeometry) {\n // simply apply the world matrices to the bounding info - the extends are already ok\n babylonMesh._updateBoundingInfo();\n }\n else {\n babylonMesh.refreshBoundingInfo(true, true);\n }\n });\n return node._babylonTransformNode;\n });\n }\n _loadMeshAsync(context, node, mesh, assign) {\n const primitives = mesh.primitives;\n if (!primitives || !primitives.length) {\n throw new Error(`${context}: Primitives are missing`);\n }\n if (primitives[0].index == undefined) {\n ArrayItem.Assign(primitives);\n }\n const promises = new Array();\n this.logOpen(`${context} ${mesh.name || \"\"}`);\n const name = node.name || `node${node.index}`;\n if (primitives.length === 1) {\n const primitive = mesh.primitives[0];\n promises.push(this._loadMeshPrimitiveAsync(`${context}/primitives/${primitive.index}`, name, node, mesh, primitive, (babylonMesh) => {\n node._babylonTransformNode = babylonMesh;\n node._primitiveBabylonMeshes = [babylonMesh];\n }));\n }\n else {\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n node._babylonTransformNode = new TransformNode(name, this._babylonScene);\n node._babylonTransformNode._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n node._primitiveBabylonMeshes = [];\n for (const primitive of primitives) {\n promises.push(this._loadMeshPrimitiveAsync(`${context}/primitives/${primitive.index}`, `${name}_primitive${primitive.index}`, node, mesh, primitive, (babylonMesh) => {\n babylonMesh.parent = node._babylonTransformNode;\n node._primitiveBabylonMeshes.push(babylonMesh);\n }));\n }\n }\n assign(node._babylonTransformNode);\n this.logClose();\n return Promise.all(promises).then(() => {\n return node._babylonTransformNode;\n });\n }\n /**\n * @internal Define this method to modify the default behavior when loading data for mesh primitives.\n * @param context The context when loading the asset\n * @param name The mesh name when loading the asset\n * @param node The glTF node when loading the asset\n * @param mesh The glTF mesh when loading the asset\n * @param primitive The glTF mesh primitive property\n * @param assign A function called synchronously after parsing the glTF properties\n * @returns A promise that resolves with the loaded mesh when the load is complete or null if not handled\n */\n _loadMeshPrimitiveAsync(context, name, node, mesh, primitive, assign) {\n const extensionPromise = this._extensionsLoadMeshPrimitiveAsync(context, name, node, mesh, primitive, assign);\n if (extensionPromise) {\n return extensionPromise;\n }\n this.logOpen(`${context}`);\n const shouldInstance = this._disableInstancedMesh === 0 && this._parent.createInstances && node.skin == undefined && !mesh.primitives[0].targets;\n let babylonAbstractMesh;\n let promise;\n if (shouldInstance && primitive._instanceData) {\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n babylonAbstractMesh = primitive._instanceData.babylonSourceMesh.createInstance(name);\n babylonAbstractMesh._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n promise = primitive._instanceData.promise;\n }\n else {\n const promises = new Array();\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const babylonMesh = new Mesh(name, this._babylonScene);\n babylonMesh._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n babylonMesh.sideOrientation = this._babylonScene.useRightHandedSystem ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation;\n this._createMorphTargets(context, node, mesh, primitive, babylonMesh);\n promises.push(this._loadVertexDataAsync(context, primitive, babylonMesh).then((babylonGeometry) => {\n return this._loadMorphTargetsAsync(context, primitive, babylonMesh, babylonGeometry).then(() => {\n if (this._disposed) {\n return;\n }\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n babylonGeometry.applyToMesh(babylonMesh);\n babylonGeometry._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n });\n }));\n const babylonDrawMode = GLTFLoader._GetDrawMode(context, primitive.mode);\n if (primitive.material == undefined) {\n let babylonMaterial = this._defaultBabylonMaterialData[babylonDrawMode];\n if (!babylonMaterial) {\n babylonMaterial = this._createDefaultMaterial(\"__GLTFLoader._default\", babylonDrawMode);\n this._parent.onMaterialLoadedObservable.notifyObservers(babylonMaterial);\n this._defaultBabylonMaterialData[babylonDrawMode] = babylonMaterial;\n }\n babylonMesh.material = babylonMaterial;\n }\n else if (!this.parent.skipMaterials) {\n const material = ArrayItem.Get(`${context}/material`, this._gltf.materials, primitive.material);\n promises.push(this._loadMaterialAsync(`/materials/${material.index}`, material, babylonMesh, babylonDrawMode, (babylonMaterial) => {\n babylonMesh.material = babylonMaterial;\n }));\n }\n promise = Promise.all(promises);\n if (shouldInstance) {\n primitive._instanceData = {\n babylonSourceMesh: babylonMesh,\n promise: promise,\n };\n }\n babylonAbstractMesh = babylonMesh;\n }\n GLTFLoader.AddPointerMetadata(babylonAbstractMesh, context);\n this._parent.onMeshLoadedObservable.notifyObservers(babylonAbstractMesh);\n assign(babylonAbstractMesh);\n this.logClose();\n return promise.then(() => {\n return babylonAbstractMesh;\n });\n }\n _loadVertexDataAsync(context, primitive, babylonMesh) {\n const extensionPromise = this._extensionsLoadVertexDataAsync(context, primitive, babylonMesh);\n if (extensionPromise) {\n return extensionPromise;\n }\n const attributes = primitive.attributes;\n if (!attributes) {\n throw new Error(`${context}: Attributes are missing`);\n }\n const promises = new Array();\n const babylonGeometry = new Geometry(babylonMesh.name, this._babylonScene);\n if (primitive.indices == undefined) {\n babylonMesh.isUnIndexed = true;\n }\n else {\n const accessor = ArrayItem.Get(`${context}/indices`, this._gltf.accessors, primitive.indices);\n promises.push(this._loadIndicesAccessorAsync(`/accessors/${accessor.index}`, accessor).then((data) => {\n babylonGeometry.setIndices(data);\n }));\n }\n const loadAttribute = (name, kind, callback) => {\n if (attributes[name] == undefined) {\n return;\n }\n babylonMesh._delayInfo = babylonMesh._delayInfo || [];\n if (babylonMesh._delayInfo.indexOf(kind) === -1) {\n babylonMesh._delayInfo.push(kind);\n }\n const accessor = ArrayItem.Get(`${context}/attributes/${name}`, this._gltf.accessors, attributes[name]);\n promises.push(this._loadVertexAccessorAsync(`/accessors/${accessor.index}`, accessor, kind).then((babylonVertexBuffer) => {\n if (babylonVertexBuffer.getKind() === VertexBuffer.PositionKind && !this.parent.alwaysComputeBoundingBox && !babylonMesh.skeleton) {\n const babylonBoundingInfo = LoadBoundingInfoFromPositionAccessor(accessor);\n if (babylonBoundingInfo) {\n babylonGeometry._boundingInfo = babylonBoundingInfo;\n babylonGeometry.useBoundingInfoFromGeometry = true;\n }\n }\n babylonGeometry.setVerticesBuffer(babylonVertexBuffer, accessor.count);\n }));\n if (kind == VertexBuffer.MatricesIndicesExtraKind) {\n babylonMesh.numBoneInfluencers = 8;\n }\n if (callback) {\n callback(accessor);\n }\n };\n loadAttribute(\"POSITION\", VertexBuffer.PositionKind);\n loadAttribute(\"NORMAL\", VertexBuffer.NormalKind);\n loadAttribute(\"TANGENT\", VertexBuffer.TangentKind);\n loadAttribute(\"TEXCOORD_0\", VertexBuffer.UVKind);\n loadAttribute(\"TEXCOORD_1\", VertexBuffer.UV2Kind);\n loadAttribute(\"TEXCOORD_2\", VertexBuffer.UV3Kind);\n loadAttribute(\"TEXCOORD_3\", VertexBuffer.UV4Kind);\n loadAttribute(\"TEXCOORD_4\", VertexBuffer.UV5Kind);\n loadAttribute(\"TEXCOORD_5\", VertexBuffer.UV6Kind);\n loadAttribute(\"JOINTS_0\", VertexBuffer.MatricesIndicesKind);\n loadAttribute(\"WEIGHTS_0\", VertexBuffer.MatricesWeightsKind);\n loadAttribute(\"JOINTS_1\", VertexBuffer.MatricesIndicesExtraKind);\n loadAttribute(\"WEIGHTS_1\", VertexBuffer.MatricesWeightsExtraKind);\n loadAttribute(\"COLOR_0\", VertexBuffer.ColorKind, (accessor) => {\n if (accessor.type === \"VEC4\" /* AccessorType.VEC4 */) {\n babylonMesh.hasVertexAlpha = true;\n }\n });\n return Promise.all(promises).then(() => {\n return babylonGeometry;\n });\n }\n _createMorphTargets(context, node, mesh, primitive, babylonMesh) {\n if (!primitive.targets || !this._parent.loadMorphTargets) {\n return;\n }\n if (node._numMorphTargets == undefined) {\n node._numMorphTargets = primitive.targets.length;\n }\n else if (primitive.targets.length !== node._numMorphTargets) {\n throw new Error(`${context}: Primitives do not have the same number of targets`);\n }\n const targetNames = mesh.extras ? mesh.extras.targetNames : null;\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n babylonMesh.morphTargetManager = new MorphTargetManager(this._babylonScene);\n babylonMesh.morphTargetManager._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n babylonMesh.morphTargetManager.areUpdatesFrozen = true;\n for (let index = 0; index < primitive.targets.length; index++) {\n const weight = node.weights ? node.weights[index] : mesh.weights ? mesh.weights[index] : 0;\n const name = targetNames ? targetNames[index] : `morphTarget${index}`;\n babylonMesh.morphTargetManager.addTarget(new MorphTarget(name, weight, babylonMesh.getScene()));\n // TODO: tell the target whether it has positions, normals, tangents\n }\n }\n _loadMorphTargetsAsync(context, primitive, babylonMesh, babylonGeometry) {\n if (!primitive.targets || !this._parent.loadMorphTargets) {\n return Promise.resolve();\n }\n const promises = new Array();\n const morphTargetManager = babylonMesh.morphTargetManager;\n for (let index = 0; index < morphTargetManager.numTargets; index++) {\n const babylonMorphTarget = morphTargetManager.getTarget(index);\n promises.push(this._loadMorphTargetVertexDataAsync(`${context}/targets/${index}`, babylonGeometry, primitive.targets[index], babylonMorphTarget));\n }\n return Promise.all(promises).then(() => {\n morphTargetManager.areUpdatesFrozen = false;\n });\n }\n _loadMorphTargetVertexDataAsync(context, babylonGeometry, attributes, babylonMorphTarget) {\n const promises = new Array();\n const loadAttribute = (attribute, kind, setData) => {\n if (attributes[attribute] == undefined) {\n return;\n }\n const babylonVertexBuffer = babylonGeometry.getVertexBuffer(kind);\n if (!babylonVertexBuffer) {\n return;\n }\n const accessor = ArrayItem.Get(`${context}/${attribute}`, this._gltf.accessors, attributes[attribute]);\n promises.push(this._loadFloatAccessorAsync(`/accessors/${accessor.index}`, accessor).then((data) => {\n setData(babylonVertexBuffer, data);\n }));\n };\n loadAttribute(\"POSITION\", VertexBuffer.PositionKind, (babylonVertexBuffer, data) => {\n const positions = new Float32Array(data.length);\n babylonVertexBuffer.forEach(data.length, (value, index) => {\n positions[index] = data[index] + value;\n });\n babylonMorphTarget.setPositions(positions);\n });\n loadAttribute(\"NORMAL\", VertexBuffer.NormalKind, (babylonVertexBuffer, data) => {\n const normals = new Float32Array(data.length);\n babylonVertexBuffer.forEach(normals.length, (value, index) => {\n normals[index] = data[index] + value;\n });\n babylonMorphTarget.setNormals(normals);\n });\n loadAttribute(\"TANGENT\", VertexBuffer.TangentKind, (babylonVertexBuffer, data) => {\n const tangents = new Float32Array((data.length / 3) * 4);\n let dataIndex = 0;\n babylonVertexBuffer.forEach((data.length / 3) * 4, (value, index) => {\n // Tangent data for morph targets is stored as xyz delta.\n // The vertexData.tangent is stored as xyzw.\n // So we need to skip every fourth vertexData.tangent.\n if ((index + 1) % 4 !== 0) {\n tangents[dataIndex] = data[dataIndex] + value;\n dataIndex++;\n }\n });\n babylonMorphTarget.setTangents(tangents);\n });\n loadAttribute(\"TEXCOORD_0\", VertexBuffer.UVKind, (babylonVertexBuffer, data) => {\n const uvs = new Float32Array(data.length);\n babylonVertexBuffer.forEach(data.length, (value, index) => {\n uvs[index] = data[index] + value;\n });\n babylonMorphTarget.setUVs(uvs);\n });\n loadAttribute(\"TEXCOORD_1\", VertexBuffer.UV2Kind, (babylonVertexBuffer, data) => {\n const uvs = new Float32Array(data.length);\n babylonVertexBuffer.forEach(data.length, (value, index) => {\n uvs[index] = data[index] + value;\n });\n babylonMorphTarget.setUV2s(uvs);\n });\n return Promise.all(promises).then(() => { });\n }\n static _LoadTransform(node, babylonNode) {\n // Ignore the TRS of skinned nodes.\n // See https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins (second implementation note)\n if (node.skin != undefined) {\n return;\n }\n let position = Vector3.Zero();\n let rotation = Quaternion.Identity();\n let scaling = Vector3.One();\n if (node.matrix) {\n const matrix = Matrix.FromArray(node.matrix);\n matrix.decompose(scaling, rotation, position);\n }\n else {\n if (node.translation) {\n position = Vector3.FromArray(node.translation);\n }\n if (node.rotation) {\n rotation = Quaternion.FromArray(node.rotation);\n }\n if (node.scale) {\n scaling = Vector3.FromArray(node.scale);\n }\n }\n babylonNode.position = position;\n babylonNode.rotationQuaternion = rotation;\n babylonNode.scaling = scaling;\n }\n _loadSkinAsync(context, node, skin, assign) {\n if (!this._parent.loadSkins) {\n return Promise.resolve();\n }\n const extensionPromise = this._extensionsLoadSkinAsync(context, node, skin);\n if (extensionPromise) {\n return extensionPromise;\n }\n if (skin._data) {\n assign(skin._data.babylonSkeleton);\n return skin._data.promise;\n }\n const skeletonId = `skeleton${skin.index}`;\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const babylonSkeleton = new Skeleton(skin.name || skeletonId, skeletonId, this._babylonScene);\n babylonSkeleton._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n this._loadBones(context, skin, babylonSkeleton);\n const promise = this._loadSkinInverseBindMatricesDataAsync(context, skin).then((inverseBindMatricesData) => {\n this._updateBoneMatrices(babylonSkeleton, inverseBindMatricesData);\n });\n skin._data = {\n babylonSkeleton: babylonSkeleton,\n promise: promise,\n };\n assign(babylonSkeleton);\n return promise;\n }\n _loadBones(context, skin, babylonSkeleton) {\n if (skin.skeleton == undefined || this._parent.alwaysComputeSkeletonRootNode) {\n const rootNode = this._findSkeletonRootNode(`${context}/joints`, skin.joints);\n if (rootNode) {\n if (skin.skeleton === undefined) {\n skin.skeleton = rootNode.index;\n }\n else {\n const isParent = (a, b) => {\n for (; b.parent; b = b.parent) {\n if (b.parent === a) {\n return true;\n }\n }\n return false;\n };\n const skeletonNode = ArrayItem.Get(`${context}/skeleton`, this._gltf.nodes, skin.skeleton);\n if (skeletonNode !== rootNode && !isParent(skeletonNode, rootNode)) {\n Logger.Warn(`${context}/skeleton: Overriding with nearest common ancestor as skeleton node is not a common root`);\n skin.skeleton = rootNode.index;\n }\n }\n }\n else {\n Logger.Warn(`${context}: Failed to find common root`);\n }\n }\n const babylonBones = {};\n for (const index of skin.joints) {\n const node = ArrayItem.Get(`${context}/joints/${index}`, this._gltf.nodes, index);\n this._loadBone(node, skin, babylonSkeleton, babylonBones);\n }\n }\n _findSkeletonRootNode(context, joints) {\n if (joints.length === 0) {\n return null;\n }\n const paths = {};\n for (const index of joints) {\n const path = [];\n let node = ArrayItem.Get(`${context}/${index}`, this._gltf.nodes, index);\n while (node.index !== -1) {\n path.unshift(node);\n node = node.parent;\n }\n paths[index] = path;\n }\n let rootNode = null;\n for (let i = 0;; ++i) {\n let path = paths[joints[0]];\n if (i >= path.length) {\n return rootNode;\n }\n const node = path[i];\n for (let j = 1; j < joints.length; ++j) {\n path = paths[joints[j]];\n if (i >= path.length || node !== path[i]) {\n return rootNode;\n }\n }\n rootNode = node;\n }\n }\n _loadBone(node, skin, babylonSkeleton, babylonBones) {\n node._isJoint = true;\n let babylonBone = babylonBones[node.index];\n if (babylonBone) {\n return babylonBone;\n }\n let parentBabylonBone = null;\n if (node.index !== skin.skeleton) {\n if (node.parent && node.parent.index !== -1) {\n parentBabylonBone = this._loadBone(node.parent, skin, babylonSkeleton, babylonBones);\n }\n else if (skin.skeleton !== undefined) {\n Logger.Warn(`/skins/${skin.index}/skeleton: Skeleton node is not a common root`);\n }\n }\n const boneIndex = skin.joints.indexOf(node.index);\n babylonBone = new Bone(node.name || `joint${node.index}`, babylonSkeleton, parentBabylonBone, this._getNodeMatrix(node), null, null, boneIndex);\n babylonBones[node.index] = babylonBone;\n // Wait until the scene is loaded to ensure the transform nodes are loaded.\n this._postSceneLoadActions.push(() => {\n // Link the Babylon bone with the corresponding Babylon transform node.\n // A glTF joint is a pointer to a glTF node in the glTF node hierarchy similar to Unity3D.\n babylonBone.linkTransformNode(node._babylonTransformNode);\n });\n return babylonBone;\n }\n _loadSkinInverseBindMatricesDataAsync(context, skin) {\n if (skin.inverseBindMatrices == undefined) {\n return Promise.resolve(null);\n }\n const accessor = ArrayItem.Get(`${context}/inverseBindMatrices`, this._gltf.accessors, skin.inverseBindMatrices);\n return this._loadFloatAccessorAsync(`/accessors/${accessor.index}`, accessor);\n }\n _updateBoneMatrices(babylonSkeleton, inverseBindMatricesData) {\n for (const babylonBone of babylonSkeleton.bones) {\n const baseMatrix = Matrix.Identity();\n const boneIndex = babylonBone._index;\n if (inverseBindMatricesData && boneIndex !== -1) {\n Matrix.FromArrayToRef(inverseBindMatricesData, boneIndex * 16, baseMatrix);\n baseMatrix.invertToRef(baseMatrix);\n }\n const babylonParentBone = babylonBone.getParent();\n if (babylonParentBone) {\n baseMatrix.multiplyToRef(babylonParentBone.getAbsoluteInverseBindMatrix(), baseMatrix);\n }\n babylonBone.updateMatrix(baseMatrix, false, false);\n babylonBone._updateAbsoluteBindMatrices(undefined, false);\n }\n }\n _getNodeMatrix(node) {\n return node.matrix\n ? Matrix.FromArray(node.matrix)\n : Matrix.Compose(node.scale ? Vector3.FromArray(node.scale) : Vector3.One(), node.rotation ? Quaternion.FromArray(node.rotation) : Quaternion.Identity(), node.translation ? Vector3.FromArray(node.translation) : Vector3.Zero());\n }\n /**\n * Loads a glTF camera.\n * @param context The context when loading the asset\n * @param camera The glTF camera property\n * @param assign A function called synchronously after parsing the glTF properties\n * @returns A promise that resolves with the loaded Babylon camera when the load is complete\n */\n loadCameraAsync(context, camera, assign = () => { }) {\n const extensionPromise = this._extensionsLoadCameraAsync(context, camera, assign);\n if (extensionPromise) {\n return extensionPromise;\n }\n const promises = new Array();\n this.logOpen(`${context} ${camera.name || \"\"}`);\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const babylonCamera = new FreeCamera(camera.name || `camera${camera.index}`, Vector3.Zero(), this._babylonScene, false);\n babylonCamera._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n babylonCamera.ignoreParentScaling = true;\n camera._babylonCamera = babylonCamera;\n // Rotation by 180 as glTF has a different convention than Babylon.\n babylonCamera.rotation.set(0, Math.PI, 0);\n switch (camera.type) {\n case \"perspective\" /* CameraType.PERSPECTIVE */: {\n const perspective = camera.perspective;\n if (!perspective) {\n throw new Error(`${context}: Camera perspective properties are missing`);\n }\n babylonCamera.fov = perspective.yfov;\n babylonCamera.minZ = perspective.znear;\n babylonCamera.maxZ = perspective.zfar || 0;\n break;\n }\n case \"orthographic\" /* CameraType.ORTHOGRAPHIC */: {\n if (!camera.orthographic) {\n throw new Error(`${context}: Camera orthographic properties are missing`);\n }\n babylonCamera.mode = Camera.ORTHOGRAPHIC_CAMERA;\n babylonCamera.orthoLeft = -camera.orthographic.xmag;\n babylonCamera.orthoRight = camera.orthographic.xmag;\n babylonCamera.orthoBottom = -camera.orthographic.ymag;\n babylonCamera.orthoTop = camera.orthographic.ymag;\n babylonCamera.minZ = camera.orthographic.znear;\n babylonCamera.maxZ = camera.orthographic.zfar;\n break;\n }\n default: {\n throw new Error(`${context}: Invalid camera type (${camera.type})`);\n }\n }\n GLTFLoader.AddPointerMetadata(babylonCamera, context);\n this._parent.onCameraLoadedObservable.notifyObservers(babylonCamera);\n assign(babylonCamera);\n this.logClose();\n return Promise.all(promises).then(() => {\n return babylonCamera;\n });\n }\n _loadAnimationsAsync() {\n const animations = this._gltf.animations;\n if (!animations) {\n return Promise.resolve();\n }\n const promises = new Array();\n for (let index = 0; index < animations.length; index++) {\n const animation = animations[index];\n promises.push(this.loadAnimationAsync(`/animations/${animation.index}`, animation).then((animationGroup) => {\n // Delete the animation group if it ended up not having any animations in it.\n if (animationGroup.targetedAnimations.length === 0) {\n animationGroup.dispose();\n }\n }));\n }\n return Promise.all(promises).then(() => { });\n }\n /**\n * Loads a glTF animation.\n * @param context The context when loading the asset\n * @param animation The glTF animation property\n * @returns A promise that resolves with the loaded Babylon animation group when the load is complete\n */\n loadAnimationAsync(context, animation) {\n const promise = this._extensionsLoadAnimationAsync(context, animation);\n if (promise) {\n return promise;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n return import(\"core/Animations/animationGroup\").then(({ AnimationGroup }) => {\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const babylonAnimationGroup = new AnimationGroup(animation.name || `animation${animation.index}`, this._babylonScene);\n babylonAnimationGroup._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n animation._babylonAnimationGroup = babylonAnimationGroup;\n const promises = new Array();\n ArrayItem.Assign(animation.channels);\n ArrayItem.Assign(animation.samplers);\n for (const channel of animation.channels) {\n promises.push(this._loadAnimationChannelAsync(`${context}/channels/${channel.index}`, context, animation, channel, (babylonTarget, babylonAnimation) => {\n babylonTarget.animations = babylonTarget.animations || [];\n babylonTarget.animations.push(babylonAnimation);\n babylonAnimationGroup.addTargetedAnimation(babylonAnimation, babylonTarget);\n }));\n }\n return Promise.all(promises).then(() => {\n babylonAnimationGroup.normalize(0);\n return babylonAnimationGroup;\n });\n });\n }\n /**\n * @hidden\n * Loads a glTF animation channel.\n * @param context The context when loading the asset\n * @param animationContext The context of the animation when loading the asset\n * @param animation The glTF animation property\n * @param channel The glTF animation channel property\n * @param onLoad Called for each animation loaded\n * @returns A void promise that resolves when the load is complete\n */\n _loadAnimationChannelAsync(context, animationContext, animation, channel, onLoad) {\n const promise = this._extensionsLoadAnimationChannelAsync(context, animationContext, animation, channel, onLoad);\n if (promise) {\n return promise;\n }\n if (channel.target.node == undefined) {\n return Promise.resolve();\n }\n const targetNode = ArrayItem.Get(`${context}/target/node`, this._gltf.nodes, channel.target.node);\n const channelTargetPath = channel.target.path;\n const pathIsWeights = channelTargetPath === \"weights\" /* AnimationChannelTargetPath.WEIGHTS */;\n // Ignore animations that have no animation targets.\n if ((pathIsWeights && !targetNode._numMorphTargets) || (!pathIsWeights && !targetNode._babylonTransformNode)) {\n return Promise.resolve();\n }\n // Don't load node animations if disabled.\n if (!this._parent.loadNodeAnimations && !pathIsWeights && !targetNode._isJoint) {\n return Promise.resolve();\n }\n let properties;\n switch (channelTargetPath) {\n case \"translation\" /* AnimationChannelTargetPath.TRANSLATION */: {\n properties = nodeAnimationData.translation;\n break;\n }\n case \"rotation\" /* AnimationChannelTargetPath.ROTATION */: {\n properties = nodeAnimationData.rotation;\n break;\n }\n case \"scale\" /* AnimationChannelTargetPath.SCALE */: {\n properties = nodeAnimationData.scale;\n break;\n }\n case \"weights\" /* AnimationChannelTargetPath.WEIGHTS */: {\n properties = nodeAnimationData.weights;\n break;\n }\n default: {\n throw new Error(`${context}/target/path: Invalid value (${channel.target.path})`);\n }\n }\n const targetInfo = {\n object: targetNode,\n info: properties,\n };\n return this._loadAnimationChannelFromTargetInfoAsync(context, animationContext, animation, channel, targetInfo, onLoad);\n }\n /**\n * @hidden\n * Loads a glTF animation channel.\n * @param context The context when loading the asset\n * @param animationContext The context of the animation when loading the asset\n * @param animation The glTF animation property\n * @param channel The glTF animation channel property\n * @param targetInfo The glTF target and properties\n * @param onLoad Called for each animation loaded\n * @returns A void promise that resolves when the load is complete\n */\n _loadAnimationChannelFromTargetInfoAsync(context, animationContext, animation, channel, targetInfo, onLoad) {\n const fps = this.parent.targetFps;\n const invfps = 1 / fps;\n const sampler = ArrayItem.Get(`${context}/sampler`, animation.samplers, channel.sampler);\n return this._loadAnimationSamplerAsync(`${animationContext}/samplers/${channel.sampler}`, sampler).then((data) => {\n let numAnimations = 0;\n const target = targetInfo.object;\n const propertyInfos = targetInfo.info;\n // Extract the corresponding values from the read value.\n // GLTF values may be dispatched to several Babylon properties.\n // For example, baseColorFactor [`r`, `g`, `b`, `a`] is dispatched to\n // - albedoColor as Color3(`r`, `g`, `b`)\n // - alpha as `a`\n for (const propertyInfo of propertyInfos) {\n const stride = propertyInfo.getStride(target);\n const input = data.input;\n const output = data.output;\n const keys = new Array(input.length);\n let outputOffset = 0;\n switch (data.interpolation) {\n case \"STEP\" /* AnimationSamplerInterpolation.STEP */: {\n for (let index = 0; index < input.length; index++) {\n const value = propertyInfo.getValue(target, output, outputOffset, 1);\n outputOffset += stride;\n keys[index] = {\n frame: input[index] * fps,\n value: value,\n interpolation: 1 /* AnimationKeyInterpolation.STEP */,\n };\n }\n break;\n }\n case \"CUBICSPLINE\" /* AnimationSamplerInterpolation.CUBICSPLINE */: {\n for (let index = 0; index < input.length; index++) {\n const inTangent = propertyInfo.getValue(target, output, outputOffset, invfps);\n outputOffset += stride;\n const value = propertyInfo.getValue(target, output, outputOffset, 1);\n outputOffset += stride;\n const outTangent = propertyInfo.getValue(target, output, outputOffset, invfps);\n outputOffset += stride;\n keys[index] = {\n frame: input[index] * fps,\n inTangent: inTangent,\n value: value,\n outTangent: outTangent,\n };\n }\n break;\n }\n case \"LINEAR\" /* AnimationSamplerInterpolation.LINEAR */: {\n for (let index = 0; index < input.length; index++) {\n const value = propertyInfo.getValue(target, output, outputOffset, 1);\n outputOffset += stride;\n keys[index] = {\n frame: input[index] * fps,\n value: value,\n };\n }\n break;\n }\n }\n if (outputOffset > 0) {\n const name = `${animation.name || `animation${animation.index}`}_channel${channel.index}_${numAnimations}`;\n propertyInfo.buildAnimations(target, name, fps, keys, (babylonAnimatable, babylonAnimation) => {\n ++numAnimations;\n onLoad(babylonAnimatable, babylonAnimation);\n });\n }\n }\n });\n }\n _loadAnimationSamplerAsync(context, sampler) {\n if (sampler._data) {\n return sampler._data;\n }\n const interpolation = sampler.interpolation || \"LINEAR\" /* AnimationSamplerInterpolation.LINEAR */;\n switch (interpolation) {\n case \"STEP\" /* AnimationSamplerInterpolation.STEP */:\n case \"LINEAR\" /* AnimationSamplerInterpolation.LINEAR */:\n case \"CUBICSPLINE\" /* AnimationSamplerInterpolation.CUBICSPLINE */: {\n break;\n }\n default: {\n throw new Error(`${context}/interpolation: Invalid value (${sampler.interpolation})`);\n }\n }\n const inputAccessor = ArrayItem.Get(`${context}/input`, this._gltf.accessors, sampler.input);\n const outputAccessor = ArrayItem.Get(`${context}/output`, this._gltf.accessors, sampler.output);\n sampler._data = Promise.all([\n this._loadFloatAccessorAsync(`/accessors/${inputAccessor.index}`, inputAccessor),\n this._loadFloatAccessorAsync(`/accessors/${outputAccessor.index}`, outputAccessor),\n ]).then(([inputData, outputData]) => {\n return {\n input: inputData,\n interpolation: interpolation,\n output: outputData,\n };\n });\n return sampler._data;\n }\n /**\n * Loads a glTF buffer.\n * @param context The context when loading the asset\n * @param buffer The glTF buffer property\n * @param byteOffset The byte offset to use\n * @param byteLength The byte length to use\n * @returns A promise that resolves with the loaded data when the load is complete\n */\n loadBufferAsync(context, buffer, byteOffset, byteLength) {\n const extensionPromise = this._extensionsLoadBufferAsync(context, buffer, byteOffset, byteLength);\n if (extensionPromise) {\n return extensionPromise;\n }\n if (!buffer._data) {\n if (buffer.uri) {\n buffer._data = this.loadUriAsync(`${context}/uri`, buffer, buffer.uri);\n }\n else {\n if (!this._bin) {\n throw new Error(`${context}: Uri is missing or the binary glTF is missing its binary chunk`);\n }\n buffer._data = this._bin.readAsync(0, buffer.byteLength);\n }\n }\n return buffer._data.then((data) => {\n try {\n return new Uint8Array(data.buffer, data.byteOffset + byteOffset, byteLength);\n }\n catch (e) {\n throw new Error(`${context}: ${e.message}`);\n }\n });\n }\n /**\n * Loads a glTF buffer view.\n * @param context The context when loading the asset\n * @param bufferView The glTF buffer view property\n * @returns A promise that resolves with the loaded data when the load is complete\n */\n loadBufferViewAsync(context, bufferView) {\n const extensionPromise = this._extensionsLoadBufferViewAsync(context, bufferView);\n if (extensionPromise) {\n return extensionPromise;\n }\n if (bufferView._data) {\n return bufferView._data;\n }\n const buffer = ArrayItem.Get(`${context}/buffer`, this._gltf.buffers, bufferView.buffer);\n bufferView._data = this.loadBufferAsync(`/buffers/${buffer.index}`, buffer, bufferView.byteOffset || 0, bufferView.byteLength);\n return bufferView._data;\n }\n _loadAccessorAsync(context, accessor, constructor) {\n if (accessor._data) {\n return accessor._data;\n }\n const numComponents = GLTFLoader._GetNumComponents(context, accessor.type);\n const byteStride = numComponents * VertexBuffer.GetTypeByteLength(accessor.componentType);\n const length = numComponents * accessor.count;\n if (accessor.bufferView == undefined) {\n accessor._data = Promise.resolve(new constructor(length));\n }\n else {\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, accessor.bufferView);\n accessor._data = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView).then((data) => {\n if (accessor.componentType === 5126 /* AccessorComponentType.FLOAT */ && !accessor.normalized && (!bufferView.byteStride || bufferView.byteStride === byteStride)) {\n return GLTFLoader._GetTypedArray(context, accessor.componentType, data, accessor.byteOffset, length);\n }\n else {\n const typedArray = new constructor(length);\n VertexBuffer.ForEach(data, accessor.byteOffset || 0, bufferView.byteStride || byteStride, numComponents, accessor.componentType, typedArray.length, accessor.normalized || false, (value, index) => {\n typedArray[index] = value;\n });\n return typedArray;\n }\n });\n }\n if (accessor.sparse) {\n const sparse = accessor.sparse;\n accessor._data = accessor._data.then((data) => {\n const typedArray = data;\n const indicesBufferView = ArrayItem.Get(`${context}/sparse/indices/bufferView`, this._gltf.bufferViews, sparse.indices.bufferView);\n const valuesBufferView = ArrayItem.Get(`${context}/sparse/values/bufferView`, this._gltf.bufferViews, sparse.values.bufferView);\n return Promise.all([\n this.loadBufferViewAsync(`/bufferViews/${indicesBufferView.index}`, indicesBufferView),\n this.loadBufferViewAsync(`/bufferViews/${valuesBufferView.index}`, valuesBufferView),\n ]).then(([indicesData, valuesData]) => {\n const indices = GLTFLoader._GetTypedArray(`${context}/sparse/indices`, sparse.indices.componentType, indicesData, sparse.indices.byteOffset, sparse.count);\n const sparseLength = numComponents * sparse.count;\n let values;\n if (accessor.componentType === 5126 /* AccessorComponentType.FLOAT */ && !accessor.normalized) {\n values = GLTFLoader._GetTypedArray(`${context}/sparse/values`, accessor.componentType, valuesData, sparse.values.byteOffset, sparseLength);\n }\n else {\n const sparseData = GLTFLoader._GetTypedArray(`${context}/sparse/values`, accessor.componentType, valuesData, sparse.values.byteOffset, sparseLength);\n values = new constructor(sparseLength);\n VertexBuffer.ForEach(sparseData, 0, byteStride, numComponents, accessor.componentType, values.length, accessor.normalized || false, (value, index) => {\n values[index] = value;\n });\n }\n let valuesIndex = 0;\n for (let indicesIndex = 0; indicesIndex < indices.length; indicesIndex++) {\n let dataIndex = indices[indicesIndex] * numComponents;\n for (let componentIndex = 0; componentIndex < numComponents; componentIndex++) {\n typedArray[dataIndex++] = values[valuesIndex++];\n }\n }\n return typedArray;\n });\n });\n }\n return accessor._data;\n }\n /**\n * @internal\n */\n _loadFloatAccessorAsync(context, accessor) {\n return this._loadAccessorAsync(context, accessor, Float32Array);\n }\n /**\n * @internal\n */\n _loadIndicesAccessorAsync(context, accessor) {\n if (accessor.type !== \"SCALAR\" /* AccessorType.SCALAR */) {\n throw new Error(`${context}/type: Invalid value ${accessor.type}`);\n }\n if (accessor.componentType !== 5121 /* AccessorComponentType.UNSIGNED_BYTE */ &&\n accessor.componentType !== 5123 /* AccessorComponentType.UNSIGNED_SHORT */ &&\n accessor.componentType !== 5125 /* AccessorComponentType.UNSIGNED_INT */) {\n throw new Error(`${context}/componentType: Invalid value ${accessor.componentType}`);\n }\n if (accessor._data) {\n return accessor._data;\n }\n if (accessor.sparse) {\n const constructor = GLTFLoader._GetTypedArrayConstructor(`${context}/componentType`, accessor.componentType);\n accessor._data = this._loadAccessorAsync(context, accessor, constructor);\n }\n else {\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, accessor.bufferView);\n accessor._data = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView).then((data) => {\n return GLTFLoader._GetTypedArray(context, accessor.componentType, data, accessor.byteOffset, accessor.count);\n });\n }\n return accessor._data;\n }\n /**\n * @internal\n */\n _loadVertexBufferViewAsync(bufferView) {\n if (bufferView._babylonBuffer) {\n return bufferView._babylonBuffer;\n }\n const engine = this._babylonScene.getEngine();\n bufferView._babylonBuffer = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView).then((data) => {\n return new Buffer(engine, data, false);\n });\n return bufferView._babylonBuffer;\n }\n /**\n * @internal\n */\n _loadVertexAccessorAsync(context, accessor, kind) {\n if (accessor._babylonVertexBuffer?.[kind]) {\n return accessor._babylonVertexBuffer[kind];\n }\n if (!accessor._babylonVertexBuffer) {\n accessor._babylonVertexBuffer = {};\n }\n const engine = this._babylonScene.getEngine();\n if (accessor.sparse || accessor.bufferView == undefined) {\n accessor._babylonVertexBuffer[kind] = this._loadFloatAccessorAsync(context, accessor).then((data) => {\n return new VertexBuffer(engine, data, kind, false);\n });\n }\n else {\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, accessor.bufferView);\n accessor._babylonVertexBuffer[kind] = this._loadVertexBufferViewAsync(bufferView).then((babylonBuffer) => {\n const numComponents = GLTFLoader._GetNumComponents(context, accessor.type);\n return new VertexBuffer(engine, babylonBuffer, kind, false, undefined, bufferView.byteStride, undefined, accessor.byteOffset, numComponents, accessor.componentType, accessor.normalized, true, undefined, true);\n });\n }\n return accessor._babylonVertexBuffer[kind];\n }\n _loadMaterialMetallicRoughnessPropertiesAsync(context, properties, babylonMaterial) {\n if (!(babylonMaterial instanceof PBRMaterial)) {\n throw new Error(`${context}: Material type not supported`);\n }\n const promises = new Array();\n if (properties) {\n if (properties.baseColorFactor) {\n babylonMaterial.albedoColor = Color3.FromArray(properties.baseColorFactor);\n babylonMaterial.alpha = properties.baseColorFactor[3];\n }\n else {\n babylonMaterial.albedoColor = Color3.White();\n }\n babylonMaterial.metallic = properties.metallicFactor == undefined ? 1 : properties.metallicFactor;\n babylonMaterial.roughness = properties.roughnessFactor == undefined ? 1 : properties.roughnessFactor;\n if (properties.baseColorTexture) {\n promises.push(this.loadTextureInfoAsync(`${context}/baseColorTexture`, properties.baseColorTexture, (texture) => {\n texture.name = `${babylonMaterial.name} (Base Color)`;\n babylonMaterial.albedoTexture = texture;\n }));\n }\n if (properties.metallicRoughnessTexture) {\n properties.metallicRoughnessTexture.nonColorData = true;\n promises.push(this.loadTextureInfoAsync(`${context}/metallicRoughnessTexture`, properties.metallicRoughnessTexture, (texture) => {\n texture.name = `${babylonMaterial.name} (Metallic Roughness)`;\n babylonMaterial.metallicTexture = texture;\n }));\n babylonMaterial.useMetallnessFromMetallicTextureBlue = true;\n babylonMaterial.useRoughnessFromMetallicTextureGreen = true;\n babylonMaterial.useRoughnessFromMetallicTextureAlpha = false;\n }\n }\n return Promise.all(promises).then(() => { });\n }\n /**\n * @internal\n */\n _loadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign = () => { }) {\n const extensionPromise = this._extensionsLoadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign);\n if (extensionPromise) {\n return extensionPromise;\n }\n material._data = material._data || {};\n let babylonData = material._data[babylonDrawMode];\n if (!babylonData) {\n this.logOpen(`${context} ${material.name || \"\"}`);\n const babylonMaterial = this.createMaterial(context, material, babylonDrawMode);\n babylonData = {\n babylonMaterial: babylonMaterial,\n babylonMeshes: [],\n promise: this.loadMaterialPropertiesAsync(context, material, babylonMaterial),\n };\n material._data[babylonDrawMode] = babylonData;\n GLTFLoader.AddPointerMetadata(babylonMaterial, context);\n this._parent.onMaterialLoadedObservable.notifyObservers(babylonMaterial);\n this.logClose();\n }\n if (babylonMesh) {\n babylonData.babylonMeshes.push(babylonMesh);\n babylonMesh.onDisposeObservable.addOnce(() => {\n const index = babylonData.babylonMeshes.indexOf(babylonMesh);\n if (index !== -1) {\n babylonData.babylonMeshes.splice(index, 1);\n }\n });\n }\n assign(babylonData.babylonMaterial);\n return babylonData.promise.then(() => {\n return babylonData.babylonMaterial;\n });\n }\n _createDefaultMaterial(name, babylonDrawMode) {\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const babylonMaterial = new PBRMaterial(name, this._babylonScene);\n babylonMaterial._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n // Moved to mesh so user can change materials on gltf meshes: babylonMaterial.sideOrientation = this._babylonScene.useRightHandedSystem ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation;\n babylonMaterial.fillMode = babylonDrawMode;\n babylonMaterial.enableSpecularAntiAliasing = true;\n babylonMaterial.useRadianceOverAlpha = !this._parent.transparencyAsCoverage;\n babylonMaterial.useSpecularOverAlpha = !this._parent.transparencyAsCoverage;\n babylonMaterial.transparencyMode = PBRMaterial.PBRMATERIAL_OPAQUE;\n babylonMaterial.metallic = 1;\n babylonMaterial.roughness = 1;\n return babylonMaterial;\n }\n /**\n * Creates a Babylon material from a glTF material.\n * @param context The context when loading the asset\n * @param material The glTF material property\n * @param babylonDrawMode The draw mode for the Babylon material\n * @returns The Babylon material\n */\n createMaterial(context, material, babylonDrawMode) {\n const extensionPromise = this._extensionsCreateMaterial(context, material, babylonDrawMode);\n if (extensionPromise) {\n return extensionPromise;\n }\n const name = material.name || `material${material.index}`;\n const babylonMaterial = this._createDefaultMaterial(name, babylonDrawMode);\n return babylonMaterial;\n }\n /**\n * Loads properties from a glTF material into a Babylon material.\n * @param context The context when loading the asset\n * @param material The glTF material property\n * @param babylonMaterial The Babylon material\n * @returns A promise that resolves when the load is complete\n */\n loadMaterialPropertiesAsync(context, material, babylonMaterial) {\n const extensionPromise = this._extensionsLoadMaterialPropertiesAsync(context, material, babylonMaterial);\n if (extensionPromise) {\n return extensionPromise;\n }\n const promises = new Array();\n promises.push(this.loadMaterialBasePropertiesAsync(context, material, babylonMaterial));\n if (material.pbrMetallicRoughness) {\n promises.push(this._loadMaterialMetallicRoughnessPropertiesAsync(`${context}/pbrMetallicRoughness`, material.pbrMetallicRoughness, babylonMaterial));\n }\n this.loadMaterialAlphaProperties(context, material, babylonMaterial);\n return Promise.all(promises).then(() => { });\n }\n /**\n * Loads the normal, occlusion, and emissive properties from a glTF material into a Babylon material.\n * @param context The context when loading the asset\n * @param material The glTF material property\n * @param babylonMaterial The Babylon material\n * @returns A promise that resolves when the load is complete\n */\n loadMaterialBasePropertiesAsync(context, material, babylonMaterial) {\n if (!(babylonMaterial instanceof PBRMaterial)) {\n throw new Error(`${context}: Material type not supported`);\n }\n const promises = new Array();\n babylonMaterial.emissiveColor = material.emissiveFactor ? Color3.FromArray(material.emissiveFactor) : new Color3(0, 0, 0);\n if (material.doubleSided) {\n babylonMaterial.backFaceCulling = false;\n babylonMaterial.twoSidedLighting = true;\n }\n if (material.normalTexture) {\n material.normalTexture.nonColorData = true;\n promises.push(this.loadTextureInfoAsync(`${context}/normalTexture`, material.normalTexture, (texture) => {\n texture.name = `${babylonMaterial.name} (Normal)`;\n babylonMaterial.bumpTexture = texture;\n }));\n babylonMaterial.invertNormalMapX = !this._babylonScene.useRightHandedSystem;\n babylonMaterial.invertNormalMapY = this._babylonScene.useRightHandedSystem;\n if (material.normalTexture.scale != undefined && babylonMaterial.bumpTexture) {\n babylonMaterial.bumpTexture.level = material.normalTexture.scale;\n }\n babylonMaterial.forceIrradianceInFragment = true;\n }\n if (material.occlusionTexture) {\n material.occlusionTexture.nonColorData = true;\n promises.push(this.loadTextureInfoAsync(`${context}/occlusionTexture`, material.occlusionTexture, (texture) => {\n texture.name = `${babylonMaterial.name} (Occlusion)`;\n babylonMaterial.ambientTexture = texture;\n }));\n babylonMaterial.useAmbientInGrayScale = true;\n if (material.occlusionTexture.strength != undefined) {\n babylonMaterial.ambientTextureStrength = material.occlusionTexture.strength;\n }\n }\n if (material.emissiveTexture) {\n promises.push(this.loadTextureInfoAsync(`${context}/emissiveTexture`, material.emissiveTexture, (texture) => {\n texture.name = `${babylonMaterial.name} (Emissive)`;\n babylonMaterial.emissiveTexture = texture;\n }));\n }\n return Promise.all(promises).then(() => { });\n }\n /**\n * Loads the alpha properties from a glTF material into a Babylon material.\n * Must be called after the setting the albedo texture of the Babylon material when the material has an albedo texture.\n * @param context The context when loading the asset\n * @param material The glTF material property\n * @param babylonMaterial The Babylon material\n */\n loadMaterialAlphaProperties(context, material, babylonMaterial) {\n if (!(babylonMaterial instanceof PBRMaterial)) {\n throw new Error(`${context}: Material type not supported`);\n }\n const alphaMode = material.alphaMode || \"OPAQUE\" /* MaterialAlphaMode.OPAQUE */;\n switch (alphaMode) {\n case \"OPAQUE\" /* MaterialAlphaMode.OPAQUE */: {\n babylonMaterial.transparencyMode = PBRMaterial.PBRMATERIAL_OPAQUE;\n babylonMaterial.alpha = 1.0; // Force alpha to 1.0 for opaque mode.\n break;\n }\n case \"MASK\" /* MaterialAlphaMode.MASK */: {\n babylonMaterial.transparencyMode = PBRMaterial.PBRMATERIAL_ALPHATEST;\n babylonMaterial.alphaCutOff = material.alphaCutoff == undefined ? 0.5 : material.alphaCutoff;\n if (babylonMaterial.albedoTexture) {\n babylonMaterial.albedoTexture.hasAlpha = true;\n }\n break;\n }\n case \"BLEND\" /* MaterialAlphaMode.BLEND */: {\n babylonMaterial.transparencyMode = PBRMaterial.PBRMATERIAL_ALPHABLEND;\n if (babylonMaterial.albedoTexture) {\n babylonMaterial.albedoTexture.hasAlpha = true;\n babylonMaterial.useAlphaFromAlbedoTexture = true;\n }\n break;\n }\n default: {\n throw new Error(`${context}/alphaMode: Invalid value (${material.alphaMode})`);\n }\n }\n }\n /**\n * Loads a glTF texture info.\n * @param context The context when loading the asset\n * @param textureInfo The glTF texture info property\n * @param assign A function called synchronously after parsing the glTF properties\n * @returns A promise that resolves with the loaded Babylon texture when the load is complete\n */\n loadTextureInfoAsync(context, textureInfo, assign = () => { }) {\n const extensionPromise = this._extensionsLoadTextureInfoAsync(context, textureInfo, assign);\n if (extensionPromise) {\n return extensionPromise;\n }\n this.logOpen(`${context}`);\n if (textureInfo.texCoord >= 6) {\n throw new Error(`${context}/texCoord: Invalid value (${textureInfo.texCoord})`);\n }\n const texture = ArrayItem.Get(`${context}/index`, this._gltf.textures, textureInfo.index);\n texture._textureInfo = textureInfo;\n const promise = this._loadTextureAsync(`/textures/${textureInfo.index}`, texture, (babylonTexture) => {\n babylonTexture.coordinatesIndex = textureInfo.texCoord || 0;\n GLTFLoader.AddPointerMetadata(babylonTexture, context);\n this._parent.onTextureLoadedObservable.notifyObservers(babylonTexture);\n assign(babylonTexture);\n });\n this.logClose();\n return promise;\n }\n /**\n * @internal\n */\n _loadTextureAsync(context, texture, assign = () => { }) {\n const extensionPromise = this._extensionsLoadTextureAsync(context, texture, assign);\n if (extensionPromise) {\n return extensionPromise;\n }\n this.logOpen(`${context} ${texture.name || \"\"}`);\n const sampler = texture.sampler == undefined ? GLTFLoader.DefaultSampler : ArrayItem.Get(`${context}/sampler`, this._gltf.samplers, texture.sampler);\n const image = ArrayItem.Get(`${context}/source`, this._gltf.images, texture.source);\n const promise = this._createTextureAsync(context, sampler, image, assign, undefined, !texture._textureInfo.nonColorData);\n this.logClose();\n return promise;\n }\n /**\n * @internal\n */\n _createTextureAsync(context, sampler, image, assign = () => { }, textureLoaderOptions, useSRGBBuffer) {\n const samplerData = this._loadSampler(`/samplers/${sampler.index}`, sampler);\n const promises = new Array();\n const deferred = new Deferred();\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const textureCreationOptions = {\n noMipmap: samplerData.noMipMaps,\n invertY: false,\n samplingMode: samplerData.samplingMode,\n onLoad: () => {\n if (!this._disposed) {\n deferred.resolve();\n }\n },\n onError: (message, exception) => {\n if (!this._disposed) {\n deferred.reject(new Error(`${context}: ${exception && exception.message ? exception.message : message || \"Failed to load texture\"}`));\n }\n },\n mimeType: image.mimeType,\n loaderOptions: textureLoaderOptions,\n useSRGBBuffer: !!useSRGBBuffer && this._parent.useSRGBBuffers,\n };\n const babylonTexture = new Texture(null, this._babylonScene, textureCreationOptions);\n babylonTexture._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n promises.push(deferred.promise);\n promises.push(this.loadImageAsync(`/images/${image.index}`, image).then((data) => {\n const name = image.uri || `${this._fileName}#image${image.index}`;\n const dataUrl = `data:${this._uniqueRootUrl}${name}`;\n babylonTexture.updateURL(dataUrl, data);\n // Set the internal texture label.\n const internalTexture = babylonTexture.getInternalTexture();\n if (internalTexture) {\n internalTexture.label = image.name;\n }\n }));\n babylonTexture.wrapU = samplerData.wrapU;\n babylonTexture.wrapV = samplerData.wrapV;\n assign(babylonTexture);\n if (this._parent.useGltfTextureNames) {\n babylonTexture.name = image.name || image.uri || `image${image.index}`;\n }\n return Promise.all(promises).then(() => {\n return babylonTexture;\n });\n }\n _loadSampler(context, sampler) {\n if (!sampler._data) {\n sampler._data = {\n noMipMaps: sampler.minFilter === 9728 /* TextureMinFilter.NEAREST */ || sampler.minFilter === 9729 /* TextureMinFilter.LINEAR */,\n samplingMode: GLTFLoader._GetTextureSamplingMode(context, sampler),\n wrapU: GLTFLoader._GetTextureWrapMode(`${context}/wrapS`, sampler.wrapS),\n wrapV: GLTFLoader._GetTextureWrapMode(`${context}/wrapT`, sampler.wrapT),\n };\n }\n return sampler._data;\n }\n /**\n * Loads a glTF image.\n * @param context The context when loading the asset\n * @param image The glTF image property\n * @returns A promise that resolves with the loaded data when the load is complete\n */\n loadImageAsync(context, image) {\n if (!image._data) {\n this.logOpen(`${context} ${image.name || \"\"}`);\n if (image.uri) {\n image._data = this.loadUriAsync(`${context}/uri`, image, image.uri);\n }\n else {\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, image.bufferView);\n image._data = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView);\n }\n this.logClose();\n }\n return image._data;\n }\n /**\n * Loads a glTF uri.\n * @param context The context when loading the asset\n * @param property The glTF property associated with the uri\n * @param uri The base64 or relative uri\n * @returns A promise that resolves with the loaded data when the load is complete\n */\n loadUriAsync(context, property, uri) {\n const extensionPromise = this._extensionsLoadUriAsync(context, property, uri);\n if (extensionPromise) {\n return extensionPromise;\n }\n if (!GLTFLoader._ValidateUri(uri)) {\n throw new Error(`${context}: '${uri}' is invalid`);\n }\n if (IsBase64DataUrl(uri)) {\n const data = new Uint8Array(DecodeBase64UrlToBinary(uri));\n this.log(`${context}: Decoded ${uri.substring(0, 64)}... (${data.length} bytes)`);\n return Promise.resolve(data);\n }\n this.log(`${context}: Loading ${uri}`);\n return this._parent.preprocessUrlAsync(this._rootUrl + uri).then((url) => {\n return new Promise((resolve, reject) => {\n this._parent._loadFile(this._babylonScene, url, (data) => {\n if (!this._disposed) {\n this.log(`${context}: Loaded ${uri} (${data.byteLength} bytes)`);\n resolve(new Uint8Array(data));\n }\n }, true, (request) => {\n reject(new LoadFileError(`${context}: Failed to load '${uri}'${request ? \": \" + request.status + \" \" + request.statusText : \"\"}`, request));\n });\n });\n });\n }\n /**\n * Adds a JSON pointer to the _internalMetadata of the Babylon object at `<object>._internalMetadata.gltf.pointers`.\n * @param babylonObject the Babylon object with _internalMetadata\n * @param pointer the JSON pointer\n */\n static AddPointerMetadata(babylonObject, pointer) {\n babylonObject.metadata = babylonObject.metadata || {};\n const metadata = (babylonObject._internalMetadata = babylonObject._internalMetadata || {});\n const gltf = (metadata.gltf = metadata.gltf || {});\n const pointers = (gltf.pointers = gltf.pointers || []);\n pointers.push(pointer);\n }\n static _GetTextureWrapMode(context, mode) {\n // Set defaults if undefined\n mode = mode == undefined ? 10497 /* TextureWrapMode.REPEAT */ : mode;\n switch (mode) {\n case 33071 /* TextureWrapMode.CLAMP_TO_EDGE */:\n return Texture.CLAMP_ADDRESSMODE;\n case 33648 /* TextureWrapMode.MIRRORED_REPEAT */:\n return Texture.MIRROR_ADDRESSMODE;\n case 10497 /* TextureWrapMode.REPEAT */:\n return Texture.WRAP_ADDRESSMODE;\n default:\n Logger.Warn(`${context}: Invalid value (${mode})`);\n return Texture.WRAP_ADDRESSMODE;\n }\n }\n static _GetTextureSamplingMode(context, sampler) {\n // Set defaults if undefined\n const magFilter = sampler.magFilter == undefined ? 9729 /* TextureMagFilter.LINEAR */ : sampler.magFilter;\n const minFilter = sampler.minFilter == undefined ? 9987 /* TextureMinFilter.LINEAR_MIPMAP_LINEAR */ : sampler.minFilter;\n if (magFilter === 9729 /* TextureMagFilter.LINEAR */) {\n switch (minFilter) {\n case 9728 /* TextureMinFilter.NEAREST */:\n return Texture.LINEAR_NEAREST;\n case 9729 /* TextureMinFilter.LINEAR */:\n return Texture.LINEAR_LINEAR;\n case 9984 /* TextureMinFilter.NEAREST_MIPMAP_NEAREST */:\n return Texture.LINEAR_NEAREST_MIPNEAREST;\n case 9985 /* TextureMinFilter.LINEAR_MIPMAP_NEAREST */:\n return Texture.LINEAR_LINEAR_MIPNEAREST;\n case 9986 /* TextureMinFilter.NEAREST_MIPMAP_LINEAR */:\n return Texture.LINEAR_NEAREST_MIPLINEAR;\n case 9987 /* TextureMinFilter.LINEAR_MIPMAP_LINEAR */:\n return Texture.LINEAR_LINEAR_MIPLINEAR;\n default:\n Logger.Warn(`${context}/minFilter: Invalid value (${minFilter})`);\n return Texture.LINEAR_LINEAR_MIPLINEAR;\n }\n }\n else {\n if (magFilter !== 9728 /* TextureMagFilter.NEAREST */) {\n Logger.Warn(`${context}/magFilter: Invalid value (${magFilter})`);\n }\n switch (minFilter) {\n case 9728 /* TextureMinFilter.NEAREST */:\n return Texture.NEAREST_NEAREST;\n case 9729 /* TextureMinFilter.LINEAR */:\n return Texture.NEAREST_LINEAR;\n case 9984 /* TextureMinFilter.NEAREST_MIPMAP_NEAREST */:\n return Texture.NEAREST_NEAREST_MIPNEAREST;\n case 9985 /* TextureMinFilter.LINEAR_MIPMAP_NEAREST */:\n return Texture.NEAREST_LINEAR_MIPNEAREST;\n case 9986 /* TextureMinFilter.NEAREST_MIPMAP_LINEAR */:\n return Texture.NEAREST_NEAREST_MIPLINEAR;\n case 9987 /* TextureMinFilter.LINEAR_MIPMAP_LINEAR */:\n return Texture.NEAREST_LINEAR_MIPLINEAR;\n default:\n Logger.Warn(`${context}/minFilter: Invalid value (${minFilter})`);\n return Texture.NEAREST_NEAREST_MIPNEAREST;\n }\n }\n }\n static _GetTypedArrayConstructor(context, componentType) {\n switch (componentType) {\n case 5120 /* AccessorComponentType.BYTE */:\n return Int8Array;\n case 5121 /* AccessorComponentType.UNSIGNED_BYTE */:\n return Uint8Array;\n case 5122 /* AccessorComponentType.SHORT */:\n return Int16Array;\n case 5123 /* AccessorComponentType.UNSIGNED_SHORT */:\n return Uint16Array;\n case 5125 /* AccessorComponentType.UNSIGNED_INT */:\n return Uint32Array;\n case 5126 /* AccessorComponentType.FLOAT */:\n return Float32Array;\n default:\n throw new Error(`${context}: Invalid component type ${componentType}`);\n }\n }\n static _GetTypedArray(context, componentType, bufferView, byteOffset, length) {\n const buffer = bufferView.buffer;\n byteOffset = bufferView.byteOffset + (byteOffset || 0);\n const constructor = GLTFLoader._GetTypedArrayConstructor(`${context}/componentType`, componentType);\n const componentTypeLength = VertexBuffer.GetTypeByteLength(componentType);\n if (byteOffset % componentTypeLength !== 0) {\n // HACK: Copy the buffer if byte offset is not a multiple of component type byte length.\n Logger.Warn(`${context}: Copying buffer as byte offset (${byteOffset}) is not a multiple of component type byte length (${componentTypeLength})`);\n return new constructor(buffer.slice(byteOffset, byteOffset + length * componentTypeLength), 0);\n }\n return new constructor(buffer, byteOffset, length);\n }\n static _GetNumComponents(context, type) {\n switch (type) {\n case \"SCALAR\":\n return 1;\n case \"VEC2\":\n return 2;\n case \"VEC3\":\n return 3;\n case \"VEC4\":\n return 4;\n case \"MAT2\":\n return 4;\n case \"MAT3\":\n return 9;\n case \"MAT4\":\n return 16;\n }\n throw new Error(`${context}: Invalid type (${type})`);\n }\n static _ValidateUri(uri) {\n return Tools.IsBase64(uri) || uri.indexOf(\"..\") === -1;\n }\n /**\n * @internal\n */\n static _GetDrawMode(context, mode) {\n if (mode == undefined) {\n mode = 4 /* MeshPrimitiveMode.TRIANGLES */;\n }\n switch (mode) {\n case 0 /* MeshPrimitiveMode.POINTS */:\n return Material.PointListDrawMode;\n case 1 /* MeshPrimitiveMode.LINES */:\n return Material.LineListDrawMode;\n case 2 /* MeshPrimitiveMode.LINE_LOOP */:\n return Material.LineLoopDrawMode;\n case 3 /* MeshPrimitiveMode.LINE_STRIP */:\n return Material.LineStripDrawMode;\n case 4 /* MeshPrimitiveMode.TRIANGLES */:\n return Material.TriangleFillMode;\n case 5 /* MeshPrimitiveMode.TRIANGLE_STRIP */:\n return Material.TriangleStripDrawMode;\n case 6 /* MeshPrimitiveMode.TRIANGLE_FAN */:\n return Material.TriangleFanDrawMode;\n }\n throw new Error(`${context}: Invalid mesh primitive mode (${mode})`);\n }\n _compileMaterialsAsync() {\n this._parent._startPerformanceCounter(\"Compile materials\");\n const promises = new Array();\n if (this._gltf.materials) {\n for (const material of this._gltf.materials) {\n if (material._data) {\n for (const babylonDrawMode in material._data) {\n const babylonData = material._data[babylonDrawMode];\n for (const babylonMesh of babylonData.babylonMeshes) {\n // Ensure nonUniformScaling is set if necessary.\n babylonMesh.computeWorldMatrix(true);\n const babylonMaterial = babylonData.babylonMaterial;\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh));\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, { useInstances: true }));\n if (this._parent.useClipPlane) {\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, { clipPlane: true }));\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, { clipPlane: true, useInstances: true }));\n }\n }\n }\n }\n }\n }\n return Promise.all(promises).then(() => {\n this._parent._endPerformanceCounter(\"Compile materials\");\n });\n }\n _compileShadowGeneratorsAsync() {\n this._parent._startPerformanceCounter(\"Compile shadow generators\");\n const promises = new Array();\n const lights = this._babylonScene.lights;\n for (const light of lights) {\n const generator = light.getShadowGenerator();\n if (generator) {\n promises.push(generator.forceCompilationAsync());\n }\n }\n return Promise.all(promises).then(() => {\n this._parent._endPerformanceCounter(\"Compile shadow generators\");\n });\n }\n _forEachExtensions(action) {\n for (const extension of this._extensions) {\n if (extension.enabled) {\n action(extension);\n }\n }\n }\n _applyExtensions(property, functionName, actionAsync) {\n for (const extension of this._extensions) {\n if (extension.enabled) {\n const id = `${extension.name}.${functionName}`;\n const loaderProperty = property;\n loaderProperty._activeLoaderExtensionFunctions = loaderProperty._activeLoaderExtensionFunctions || {};\n const activeLoaderExtensionFunctions = loaderProperty._activeLoaderExtensionFunctions;\n if (!activeLoaderExtensionFunctions[id]) {\n activeLoaderExtensionFunctions[id] = true;\n try {\n const result = actionAsync(extension);\n if (result) {\n return result;\n }\n }\n finally {\n delete activeLoaderExtensionFunctions[id];\n }\n }\n }\n }\n return null;\n }\n _extensionsOnLoading() {\n this._forEachExtensions((extension) => extension.onLoading && extension.onLoading());\n }\n _extensionsOnReady() {\n this._forEachExtensions((extension) => extension.onReady && extension.onReady());\n }\n _extensionsLoadSceneAsync(context, scene) {\n return this._applyExtensions(scene, \"loadScene\", (extension) => extension.loadSceneAsync && extension.loadSceneAsync(context, scene));\n }\n _extensionsLoadNodeAsync(context, node, assign) {\n return this._applyExtensions(node, \"loadNode\", (extension) => extension.loadNodeAsync && extension.loadNodeAsync(context, node, assign));\n }\n _extensionsLoadCameraAsync(context, camera, assign) {\n return this._applyExtensions(camera, \"loadCamera\", (extension) => extension.loadCameraAsync && extension.loadCameraAsync(context, camera, assign));\n }\n _extensionsLoadVertexDataAsync(context, primitive, babylonMesh) {\n return this._applyExtensions(primitive, \"loadVertexData\", (extension) => extension._loadVertexDataAsync && extension._loadVertexDataAsync(context, primitive, babylonMesh));\n }\n _extensionsLoadMeshPrimitiveAsync(context, name, node, mesh, primitive, assign) {\n return this._applyExtensions(primitive, \"loadMeshPrimitive\", (extension) => extension._loadMeshPrimitiveAsync && extension._loadMeshPrimitiveAsync(context, name, node, mesh, primitive, assign));\n }\n _extensionsLoadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign) {\n return this._applyExtensions(material, \"loadMaterial\", (extension) => extension._loadMaterialAsync && extension._loadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign));\n }\n _extensionsCreateMaterial(context, material, babylonDrawMode) {\n return this._applyExtensions(material, \"createMaterial\", (extension) => extension.createMaterial && extension.createMaterial(context, material, babylonDrawMode));\n }\n _extensionsLoadMaterialPropertiesAsync(context, material, babylonMaterial) {\n return this._applyExtensions(material, \"loadMaterialProperties\", (extension) => extension.loadMaterialPropertiesAsync && extension.loadMaterialPropertiesAsync(context, material, babylonMaterial));\n }\n _extensionsLoadTextureInfoAsync(context, textureInfo, assign) {\n return this._applyExtensions(textureInfo, \"loadTextureInfo\", (extension) => extension.loadTextureInfoAsync && extension.loadTextureInfoAsync(context, textureInfo, assign));\n }\n _extensionsLoadTextureAsync(context, texture, assign) {\n return this._applyExtensions(texture, \"loadTexture\", (extension) => extension._loadTextureAsync && extension._loadTextureAsync(context, texture, assign));\n }\n _extensionsLoadAnimationAsync(context, animation) {\n return this._applyExtensions(animation, \"loadAnimation\", (extension) => extension.loadAnimationAsync && extension.loadAnimationAsync(context, animation));\n }\n _extensionsLoadAnimationChannelAsync(context, animationContext, animation, channel, onLoad) {\n return this._applyExtensions(animation, \"loadAnimationChannel\", (extension) => extension._loadAnimationChannelAsync && extension._loadAnimationChannelAsync(context, animationContext, animation, channel, onLoad));\n }\n _extensionsLoadSkinAsync(context, node, skin) {\n return this._applyExtensions(skin, \"loadSkin\", (extension) => extension._loadSkinAsync && extension._loadSkinAsync(context, node, skin));\n }\n _extensionsLoadUriAsync(context, property, uri) {\n return this._applyExtensions(property, \"loadUri\", (extension) => extension._loadUriAsync && extension._loadUriAsync(context, property, uri));\n }\n _extensionsLoadBufferViewAsync(context, bufferView) {\n return this._applyExtensions(bufferView, \"loadBufferView\", (extension) => extension.loadBufferViewAsync && extension.loadBufferViewAsync(context, bufferView));\n }\n _extensionsLoadBufferAsync(context, buffer, byteOffset, byteLength) {\n return this._applyExtensions(buffer, \"loadBuffer\", (extension) => extension.loadBufferAsync && extension.loadBufferAsync(context, buffer, byteOffset, byteLength));\n }\n /**\n * Helper method called by a loader extension to load an glTF extension.\n * @param context The context when loading the asset\n * @param property The glTF property to load the extension from\n * @param extensionName The name of the extension to load\n * @param actionAsync The action to run\n * @returns The promise returned by actionAsync or null if the extension does not exist\n */\n static LoadExtensionAsync(context, property, extensionName, actionAsync) {\n if (!property.extensions) {\n return null;\n }\n const extensions = property.extensions;\n const extension = extensions[extensionName];\n if (!extension) {\n return null;\n }\n return actionAsync(`${context}/extensions/${extensionName}`, extension);\n }\n /**\n * Helper method called by a loader extension to load a glTF extra.\n * @param context The context when loading the asset\n * @param property The glTF property to load the extra from\n * @param extensionName The name of the extension to load\n * @param actionAsync The action to run\n * @returns The promise returned by actionAsync or null if the extra does not exist\n */\n static LoadExtraAsync(context, property, extensionName, actionAsync) {\n if (!property.extras) {\n return null;\n }\n const extras = property.extras;\n const extra = extras[extensionName];\n if (!extra) {\n return null;\n }\n return actionAsync(`${context}/extras/${extensionName}`, extra);\n }\n /**\n * Checks for presence of an extension.\n * @param name The name of the extension to check\n * @returns A boolean indicating the presence of the given extension name in `extensionsUsed`\n */\n isExtensionUsed(name) {\n return !!this._gltf.extensionsUsed && this._gltf.extensionsUsed.indexOf(name) !== -1;\n }\n /**\n * Increments the indentation level and logs a message.\n * @param message The message to log\n */\n logOpen(message) {\n this._parent._logOpen(message);\n }\n /**\n * Decrements the indentation level.\n */\n logClose() {\n this._parent._logClose();\n }\n /**\n * Logs a message\n * @param message The message to log\n */\n log(message) {\n this._parent._log(message);\n }\n /**\n * Starts a performance counter.\n * @param counterName The name of the performance counter\n */\n startPerformanceCounter(counterName) {\n this._parent._startPerformanceCounter(counterName);\n }\n /**\n * Ends a performance counter.\n * @param counterName The name of the performance counter\n */\n endPerformanceCounter(counterName) {\n this._parent._endPerformanceCounter(counterName);\n }\n}\n/**\n * The default glTF sampler.\n */\nGLTFLoader.DefaultSampler = { index: -1 };\nGLTFFileLoader._CreateGLTF2Loader = (parent) => new GLTFLoader(parent);\n//# sourceMappingURL=glTFLoader.js.map"],"names":["FreeCameraKeyboardMoveInput","constructor","this","keysUp","keysUpward","keysDown","keysDownward","keysLeft","keysRight","rotationSpeed","keysRotateLeft","keysRotateRight","keysRotateUp","keysRotateDown","_keys","Array","attachControl","noPreventDefault","Tools","BackCompatCameraNoPreventDefault","arguments","_onCanvasBlurObserver","_scene","camera","getScene","_engine","getEngine","onCanvasBlurObservable","add","length","_onKeyboardObserver","onKeyboardObservable","info","evt","event","metaKey","type","KeyboardEventTypes","KEYDOWN","indexOf","keyCode","push","preventDefault","index","splice","detachControl","remove","checkInputs","speed","_computeLocalCameraSpeed","_localDirection","copyFromFloats","cameraRotation","y","_getLocalRotation","x","useRightHandedSystem","z","getViewMatrix","invertToRef","_cameraTransformMatrix","Vector3","TransformNormalToRef","_transformedDirection","cameraDirection","addInPlace","getClassName","_onLostFocus","getSimpleName","handednessMultiplier","_calculateHandednessMultiplier","getDeltaTime","__decorate","serialize","prototype","CameraInputTypes","FreeCameraMouseInput","touchEnabled","buttons","angularSensibility","_previousPosition","onPointerMovedObservable","Observable","_allowCameraRotation","_currentActiveButton","_activePointerId","engine","element","getInputElement","_pointerInput","p","isTouch","pointerType","PointerEventTypes","POINTERMOVE","button","srcElement","target","POINTERDOWN","pointerId","setPointerCapture","e","clientX","clientY","focus","isPointerLock","_onMouseMove","POINTERUP","releasePointerCapture","offsetX","offsetY","notifyObservers","movementX","movementY","_observer","_inputManager","_addCameraPointerObserver","_contextMenuBind","onContextMenu","addEventListener","_removeCameraPointerObserver","removeEventListener","clear","BaseCameraMouseWheelInput","wheelPrecisionX","wheelPrecisionY","wheelPrecisionZ","onChangedObservable","_wheelDeltaX","_wheelDeltaY","_wheelDeltaZ","_ffMultiplier","_normalize","_wheel","pointer","POINTERWHEEL","platformScale","deltaMode","EventConstants","DOM_DELTA_LINE","deltaX","deltaY","deltaZ","wheelDeltaX","wheelDeltaY","wheelDeltaZ","_CameraProperty","GLTFLoaderCoordinateSystemMode","GLTFLoaderAnimationStartMode","GLTFLoaderState","FreeCameraMouseWheelInput","super","_moveRelative","Zero","_rotateRelative","_moveScene","_wheelXAction","MoveRelative","_wheelXActionCoordinate","_wheelYAction","_wheelYActionCoordinate","_wheelZAction","_wheelZActionCoordinate","wheelXMoveRelative","axis","wheelYMoveRelative","wheelZMoveRelative","wheelXRotateRelative","RotateRelative","wheelYRotateRelative","wheelZRotateRelative","wheelXMoveScene","MoveScene","wheelYMoveScene","wheelZMoveScene","setAll","_updateCamera","cameraTransformMatrix","Matrix","transformedDirection","_updateCameraProperty","value","cameraProperty","coordinate","action","set","FreeCameraTouchInput","allowMouse","touchAngularSensibility","touchMoveSensibility","singleFingerRotate","_offsetX","_offsetY","_pointerPressed","_isSafari","IsSafari","previousPosition","undefined","isMouseEvent","direction","RotationYawPitchRollToRef","rotation","_cameraRotationMatrix","TransformCoordinates","FreeCameraInputsManager","CameraInputsManager","_mouseInput","_mouseWheelInput","addKeyboard","addMouse","removeMouse","addMouseWheel","removeMouseWheel","addTouch","FreeCamera","TargetCamera","mouse","inputs","attached","keyboard","name","position","scene","setActiveOnSceneIfNoneActive","ellipsoid","ellipsoidOffset","checkCollisions","applyGravity","_needMoveForGravity","_oldPosition","_diffPosition","_newPosition","_collisionMask","_onCollisionPositionChange","collisionId","newPosition","collidedMesh","copyFrom","subtractToRef","AbstractEngine","CollisionsEpsilon","addToRef","_deferredPositionUpdate","_deferOnly","_deferredUpdated","onCollide","ignored","attachElement","detachElement","Vector2","collisionMask","mask","isNaN","_collideWithWorld","displacement","globalPosition","parent","getWorldMatrix","subtractFromFloatsToRef","coordinator","collisionCoordinator","_collider","createCollider","_radius","actualDisplacement","gravity","getNewPosition","uniqueId","_checkInputs","needMoveForGravity","_decideIfNeedsToMove","Math","abs","_updatePosition","collisionsEnabled","dispose","serializeAsVector3","RegisterClass","Bone","Node","_matrix","_compose","_localMatrix","updateFlag","_needToCompose","_markAsDirtyAndDecompose","skeleton","parentBone","localMatrix","restMatrix","bindMatrix","children","animations","_index","_scalingDeterminant","_needToDecompose","_linkedTransformNode","_waitingTransformNodeId","_skeleton","clone","Identity","_restMatrix","_bindMatrix","_absoluteMatrix","_absoluteBindMatrix","_absoluteInverseBindMatrix","_finalMatrix","bones","setParent","_updateAbsoluteBindMatrices","getSkeleton","_parentNode","getParent","getChildren","getIndex","newParent","updateAbsoluteBindMatrices","markAsDirty","getLocalMatrix","getBindMatrix","getBaseMatrix","getRestMatrix","getRestPose","setRestMatrix","matrix","setRestPose","getBindPose","setBindMatrix","updateMatrix","setBindPose","getFinalMatrix","returnToRest","localScaling","TmpVectors","localRotation","Quaternion","localPosition","decompose","rotationQuaternion","scaling","getAbsoluteInverseBindMatrix","getInvertedAbsoluteTransform","getAbsoluteMatrix","getAbsoluteTransform","linkTransformNode","transformNode","_numBonesWithLinkedTransformNode","getTransformNode","_decompose","_localPosition","_markAsDirtyAndCompose","getRotation","newRotation","setRotation","_localRotation","setRotationQuaternion","getScale","newScaling","setScale","animationPropertiesOverride","_localScaling","ComposeToRef","updateLocalMatrix","updateChildren","multiplyToRef","determinant","_currentRenderId","_childUpdateId","_markAsDirty","vec","space","tNode","translationMode","lm","addAtIndex","setTranslationFromFloats","wm","computeAbsoluteMatrices","tmat","_TmpMats","tvec","_TmpVecs","IdentityToRef","invert","TransformCoordinatesToRef","translate","setPosition","setAbsolutePosition","scale","scaleChildren","locMat","scaleMat","ScalingToRef","child","cm","multiplyAtIndex","getScaleToRef","result","setYawPitchRoll","yaw","pitch","roll","quat","_TmpQuat","rotMatInv","_getAbsoluteInverseMatrixUnscaledToRef","rotMat","_rotateWithMatrix","rotate","amount","rmat","RotationAxisToRef","setAxisAngle","angle","FromQuaternionToRef","setRotationMatrix","FromRotationMatrixToRef","rotMat2","lmat","lx","m","ly","lz","parentScale","parentScaleInv","scaleMatrix","getPosition","pos","getPositionToRef","getAbsolutePosition","getAbsolutePositionToRef","poseMatrix","getPoseMatrix","len","i","computeAbsoluteTransforms","getDirection","localAxis","getDirectionToRef","mat","normalize","getRotationToRef","getRotationQuaternionToRef","toEulerAnglesToRef","getRotationQuaternion","amat","getRotationMatrix","getRotationMatrixToRef","getAbsolutePositionFromLocal","getAbsolutePositionFromLocalToRef","getLocalPositionFromAbsolute","getLocalPositionFromAbsoluteToRef","setCurrentPoseAsRest","BuildArray","Skeleton","useTextureToStoreBoneMatrices","_useTextureToStoreBoneMatrices","_animationPropertiesOverride","isUsingTextureForMatrices","_canUseTextureForBones","_uniqueId","id","needInitialSkinMatrix","_isDirty","_meshesWithPoseMatrix","_identity","_ranges","_absoluteTransformIsDirty","_hasWaitingData","_parentContainer","doNotSerialize","onBeforeComputeObservable","EngineStore","LastCreatedScene","getUniqueId","addSkeleton","engineCaps","getCaps","textureFloat","maxVertexTextureImageUnits","filter","b","getTransformMatrices","mesh","Error","_bonesTransformMatrices","prepare","_transformMatrices","getTransformMatrixTexture","_transformMatrixTexture","toString","fullDetails","ret","Object","keys","first","getBoneIndexByName","boneIndex","cache","createAnimationRange","from","to","AnimationRange","nBones","createRange","deleteAnimationRange","deleteFrames","deleteRange","getAnimationRange","getAnimationRanges","animationRanges","copyAnimationRange","source","rescaleAsRequired","frameOffset","_getHighestAnimationFrame","boneDict","sourceBones","Logger","Warn","skelDimensionsRatio","dimensionsAtRest","divide","boneName","sourceBone","range","bone","highest","getHighestFrame","beginAnimation","loop","speedRatio","onAnimationEnd","MakeAnimationAdditive","referenceFrame","rangeValue","sceneAnimatables","getAllAnimatablesByTarget","rangeAnimatable","sceneAnimatable","fromFrame","toFrame","animatables","getAnimatables","animIndex","Animation","isAdditive","_registerMeshWithPoseMatrix","_unregisterMeshWithPoseMatrix","_computeTransformMatrices","targetMatrix","initialSkinMatrix","mappedIndex","multiplyToArray","copyToArray","dontCheckFrameId","currentRenderId","getRenderId","node","needsUpdate","Float32Array","_synchronizedWithMesh","textureWidth","getSize","width","RawTexture","CreateRGBATexture","Constants","TEXTURE_NEAREST_SAMPLINGMODE","TEXTURETYPE_FLOAT","update","_animatables","parentIndex","DeepCopier","DeepCopy","rangeName","enableBlending","blendingSpeed","forEach","animation","stopAnimation","removeSkeleton","skeletons","serializationObject","asArray","serializedBone","parentBoneIndex","rest","linkedTransformNodeId","metadata","ranges","Parse","parsedSkeleton","FromArray","parsedBone","parsedBoneIndex","data","forceUpdate","sortBones","visited","_sortBones","MorphTarget","influence","_influence","previous","onInfluenceChanged","hasObservers","_positions","_normals","_tangents","_uvs","_uv2s","_onDataLayoutChanged","hasPositions","hasNormals","hasTangents","hasUVs","hasUV2s","vertexCount","setPositions","hadPositions","getPositions","setNormals","hadNormals","getNormals","setTangents","hadTangents","getTangents","setUVs","hadUVs","getUVs","setUV2s","hadUV2s","getUV2s","newOne","SerializationHelper","Clone","positions","slice","call","normals","tangents","uvs","uv2s","AppendSerializedAnimations","animationIndex","parsedAnimation","internalClass","GetClass","autoAnimate","autoAnimateFrom","autoAnimateTo","autoAnimateLoop","autoAnimateSpeed","FromMesh","getVerticesData","VertexBuffer","PositionKind","isVerticesDataPresent","NormalKind","TangentKind","UVKind","UV2Kind","RawTexture2DArray","Texture","depth","_depth","height","format","generateMipMaps","invertY","samplingMode","TRILINEAR_SAMPLINGMODE","textureType","TEXTURETYPE_UNSIGNED_BYTE","creationFlags","_texture","createRawTexture2DArray","is2DArray","_getEngine","updateRawTexture2DArray","TEXTURE_TRILINEAR_SAMPLINGMODE","TEXTUREFORMAT_RGBA","MorphTargetManager","areUpdatesFrozen","block","_blockCounter","_mustSynchronize","_syncActiveTargets","_targets","_targetInfluenceChangedObservers","_targetDataLayoutChangedObservers","_activeTargets","SmartArray","_supportsPositions","_supportsNormals","_supportsTangents","_supportsUVs","_supportsUV2s","_vertexCount","_tempInfluences","_canUseTextureForTargets","_textureVertexStride","_textureWidth","_textureHeight","optimizeInfluencers","enablePositionMorphing","enableNormalMorphing","enableTangentMorphing","enableUVMorphing","enableUV2Morphing","_numMaxInfluencers","_useTextureToStoreTargets","addMorphTargetManager","canUseGLVertexID","texture2DArrayMaxLayerCount","numMaxInfluencers","supportsPositions","supportsNormals","supportsTangents","supportsUVs","supportsUV2s","numTargets","numInfluencers","influences","_influences","useTextureToStoreTargets","isUsingTextureForTargets","EnableTextureStorage","disableMorphTargetTexture","getActiveTarget","getTarget","getTargetByName","addTarget","needUpdate","removeTarget","_bind","effect","setFloat3","setFloatArray","_morphTargetTextureIndices","setTexture","_targetStoreTexture","setInt","copy","targets","wasUsingTextureForTargets","synchronize","influenceCount","reset","targetIndex","MaxActiveMorphTargetsInVertexAttributeMode","meshes","morphTargetManager","_markSubMeshesAsAttributesDirty","_syncGeometryWithMorphTargetManager","maxTextureSize","ceil","targetCount","offset","vertex","removeMorphTargetManager","morphTargetManagers","morph","targetData","DataReader","buffer","byteOffset","loadAsync","byteLength","readAsync","then","_dataView","DataView","_dataByteOffset","readUint32","getUint32","readUint8Array","Uint8Array","readString","Decode","skipBytes","validateAsync","rootUrl","fileName","getExternalResource","options","externalResourceFunction","uri","ArrayBuffer","isView","GLTFValidator","validateBytes","validateString","workerFunc","pendingExternalResources","onmessage","message","importScripts","url","Promise","resolve","reject","postMessage","reason","GLTFValidation","ValidateAsync","Worker","workerContent","workerBlobUrl","URL","createObjectURL","Blob","worker","onError","error","onMessage","terminate","GetBabylonScriptURL","Configuration","slicedData","_LoadScriptPromise","LoadBabylonScriptAsync","arrayBuffer","_DefaultCdnUrl","GLTFLoaderOptions","coordinateSystemMode","AUTO","animationStartMode","FIRST","loadNodeAnimations","loadSkins","loadMorphTargets","compileMaterials","useClipPlane","compileShadowGenerators","transparencyAsCoverage","useRangeRequests","createInstances","alwaysComputeBoundingBox","loadAllMaterials","loadOnlyMaterials","skipMaterials","useSRGBBuffers","targetFps","alwaysComputeSkeletonRootNode","useGltfTextureNames","preprocessUrlAsync","extensionOptions","onParsed","customRootNode","onMeshLoaded","onSkinLoaded","onTextureLoaded","onMaterialLoaded","onCameraLoaded","GLTFFileLoader","onParsedObservable","onMeshLoadedObservable","onSkinLoadedObservable","onTextureLoadedObservable","onMaterialLoadedObservable","onCameraLoadedObservable","onCompleteObservable","onErrorObservable","onDisposeObservable","onExtensionLoadedObservable","validate","onValidatedObservable","_loader","_state","_requests","GLTFFileLoaderMetadata","extensions","onLoaderStateChangedObservable","_logIndentLevel","_loggingEnabled","_log","_logDisabled","_capturePerformanceCounters","_startPerformanceCounter","_startPerformanceCounterDisabled","_endPerformanceCounter","_endPerformanceCounterDisabled","callback","_onParsedObserver","_onMeshLoadedObserver","_onSkinLoadedObserver","skinnedNode","_onTextureLoadedObserver","_onMaterialLoadedObserver","_onCameraLoadedObserver","onComplete","_onCompleteObserver","_onErrorObserver","onDispose","_onDisposeObserver","onExtensionLoaded","_onExtensionLoadedObserver","loggingEnabled","_logEnabled","capturePerformanceCounters","_startPerformanceCounterEnabled","_endPerformanceCounterEnabled","onValidated","_onValidatedObserver","request","abort","_progressCallback","loadFile","fileOrUrl","onSuccess","onProgress","useArrayBuffer","_loadBinary","GetFilename","fileRequest","dataBuffer","_loadFile","webRequest","setRequestHeader","_unpackBinaryAsync","loaderData","_validate","json","_parseJson","arrayBufferView","RangeError","readViewAsync","importMeshAsync","meshesNames","_getLoader","loadAssetContainerAsync","container","AssetContainer","materials","material","textures","texture","cameras","apply","geometries","particleSystems","animationGroups","lights","transformNodes","canDirectLoad","directLoad","startsWith","GLTFMagicBase64Encoded","DecodeBase64UrlToBinary","createPlugin","loaderState","whenCompleteAsync","addOnce","_setState","state","onOpened","_onProgress","_lengthComputable","_total","_loaded","lengthComputable","loaded","total","_loadFileAsync","asset","version","minVersion","generator","_parseVersion","_compareVersion","major","minor","createLoader","_CreateGLTF1Loader","_CreateGLTF2Loader","parsed","JSON","parse","dataReader","magic","RuntimeError","ErrorCodes","GLTFLoaderUnexpectedMagicError","unpacked","_unpackBinaryV1Async","_unpackBinaryV2Async","contentLength","contentFormat","bodyLength","bin","startByteOffset","ChunkFormat","chunkLength","match","parseInt","a","_logOpen","_logClose","spaces","_logSpaces","substring","Log","counterName","StartPerformanceCounter","EndPerformanceCounter","IncrementalLoading","HomogeneousCoordinates","registerSceneLoaderPlugin","ArrayItem","Get","context","array","TryGet","Assign","LoadBoundingInfoFromPositionAccessor","accessor","min","max","minArray","maxArray","minVector","maxVector","normalized","componentType","divider","oneOverDivider","scaleInPlace","BoundingInfo","GLTFLoader","RegisterExtension","factory","registerGLTFExtension","UnregisterExtension","unregisterGLTFExtension","gltf","_gltf","_bin","_parent","babylonScene","_babylonScene","rootBabylonMesh","_rootBabylonMesh","_rootUrl","_completePromises","_assetContainer","_babylonLights","_disableInstancedMesh","_allMaterialsDirtyRequired","_extensions","_disposed","_fileName","_uniqueRootUrl","_defaultBabylonMaterialData","_postSceneLoadActions","extension","_loadData","nodes","nodeMap","map","_loadAsync","_getMeshes","_getSkeletons","_getAnimationGroups","_getTransformNodes","_getGeometries","spriteManagers","resultFunc","async","Date","now","_loadExtensionsAsync","loadingToReadyCounterName","LOADING","READY","loadingToCompleteCounterName","COMPLETE","_extensionsOnLoading","promises","oldBlockMaterialDirtyMechanism","blockMaterialDirtyMechanism","loadSceneAsync","scenes","babylonDrawMode","Material","TriangleFillMode","_loadMaterialAsync","_forceBlockMaterialDirtyMechanism","_compileMaterialsAsync","_compileShadowGeneratorsAsync","all","setEnabled","_extensionsOnReady","_startAnimations","SetImmediate","catch","_setupData","buffers","binaryBuffer","accessors","bufferViews","images","samplers","skins","nodeParents","rootNode","_createRootNode","extensionPromises","registeredGLTFExtensions","registeredExtension","enabled","isGLTFExtension","isExtensionUsed","sort","order","Number","MAX_VALUE","extensionsRequired","some","_babylonTransformNode","_blockEntityCollection","rootMesh","Mesh","_LoadTransform","FORCE_RIGHT_HANDED","extensionPromise","_extensionsLoadSceneAsync","logOpen","loadNodeAsync","babylonMesh","_loadAnimationsAsync","logClose","_forEachPrimitive","_primitiveBabylonMeshes","geometry","AbstractMesh","_babylonTransformNodeForSkin","skin","_data","babylonSkeleton","_babylonAnimationGroup","NONE","babylonAnimationGroups","start","ALL","babylonAnimationGroup","assign","_extensionsLoadNodeAsync","loadNode","babylonTransformNode","AddPointerMetadata","loadCameraAsync","babylonCamera","childNode","childBabylonMesh","hasMesh","hasSkin","nodeName","TransformNode","_loadMeshAsync","babylonTransformNodeForSkin","deepMerge","_loadSkinAsync","parentNode","useBoundingInfoFromGeometry","_updateBoundingInfo","refreshBoundingInfo","primitives","primitive","_loadMeshPrimitiveAsync","_extensionsLoadMeshPrimitiveAsync","shouldInstance","babylonAbstractMesh","promise","_instanceData","babylonSourceMesh","createInstance","sideOrientation","CounterClockWiseSideOrientation","ClockWiseSideOrientation","_createMorphTargets","_loadVertexDataAsync","babylonGeometry","_loadMorphTargetsAsync","applyToMesh","_GetDrawMode","mode","babylonMaterial","_createDefaultMaterial","_extensionsLoadVertexDataAsync","attributes","Geometry","indices","isUnIndexed","_loadIndicesAccessorAsync","setIndices","loadAttribute","kind","_delayInfo","_loadVertexAccessorAsync","babylonVertexBuffer","getKind","babylonBoundingInfo","_boundingInfo","setVerticesBuffer","count","MatricesIndicesExtraKind","numBoneInfluencers","UV3Kind","UV4Kind","UV5Kind","UV6Kind","MatricesIndicesKind","MatricesWeightsKind","MatricesWeightsExtraKind","ColorKind","hasVertexAlpha","_numMorphTargets","targetNames","extras","weight","weights","babylonMorphTarget","_loadMorphTargetVertexDataAsync","attribute","setData","getVertexBuffer","_loadFloatAccessorAsync","dataIndex","babylonNode","One","translation","_extensionsLoadSkinAsync","skeletonId","_loadBones","_loadSkinInverseBindMatricesDataAsync","inverseBindMatricesData","_updateBoneMatrices","_findSkeletonRootNode","joints","isParent","skeletonNode","babylonBones","_loadBone","paths","path","unshift","j","_isJoint","babylonBone","parentBabylonBone","_getNodeMatrix","inverseBindMatrices","baseMatrix","FromArrayToRef","babylonParentBone","Compose","_extensionsLoadCameraAsync","ignoreParentScaling","_babylonCamera","PI","perspective","fov","yfov","minZ","znear","maxZ","zfar","orthographic","Camera","ORTHOGRAPHIC_CAMERA","orthoLeft","xmag","orthoRight","orthoBottom","ymag","orthoTop","loadAnimationAsync","animationGroup","targetedAnimations","_extensionsLoadAnimationAsync","import","AnimationGroup","channels","channel","_loadAnimationChannelAsync","babylonTarget","babylonAnimation","addTargetedAnimation","animationContext","onLoad","_extensionsLoadAnimationChannelAsync","targetNode","channelTargetPath","pathIsWeights","properties","nodeAnimationData","targetInfo","object","_loadAnimationChannelFromTargetInfoAsync","fps","invfps","sampler","_loadAnimationSamplerAsync","numAnimations","propertyInfos","propertyInfo","stride","getStride","input","output","outputOffset","interpolation","getValue","frame","inTangent","outTangent","buildAnimations","babylonAnimatable","inputAccessor","outputAccessor","inputData","outputData","loadBufferAsync","_extensionsLoadBufferAsync","loadUriAsync","loadBufferViewAsync","bufferView","_extensionsLoadBufferViewAsync","_loadAccessorAsync","numComponents","_GetNumComponents","byteStride","GetTypeByteLength","typedArray","ForEach","_GetTypedArray","sparse","indicesBufferView","valuesBufferView","values","indicesData","valuesData","sparseLength","sparseData","valuesIndex","indicesIndex","componentIndex","_GetTypedArrayConstructor","_loadVertexBufferViewAsync","_babylonBuffer","Buffer","_babylonVertexBuffer","babylonBuffer","_loadMaterialMetallicRoughnessPropertiesAsync","PBRMaterial","baseColorFactor","albedoColor","Color3","alpha","White","metallic","metallicFactor","roughness","roughnessFactor","baseColorTexture","loadTextureInfoAsync","albedoTexture","metallicRoughnessTexture","nonColorData","metallicTexture","useMetallnessFromMetallicTextureBlue","useRoughnessFromMetallicTextureGreen","useRoughnessFromMetallicTextureAlpha","_extensionsLoadMaterialAsync","babylonData","createMaterial","babylonMeshes","loadMaterialPropertiesAsync","fillMode","enableSpecularAntiAliasing","useRadianceOverAlpha","useSpecularOverAlpha","transparencyMode","PBRMATERIAL_OPAQUE","_extensionsCreateMaterial","_extensionsLoadMaterialPropertiesAsync","loadMaterialBasePropertiesAsync","pbrMetallicRoughness","loadMaterialAlphaProperties","emissiveColor","emissiveFactor","doubleSided","backFaceCulling","twoSidedLighting","normalTexture","bumpTexture","invertNormalMapX","invertNormalMapY","level","forceIrradianceInFragment","occlusionTexture","ambientTexture","useAmbientInGrayScale","strength","ambientTextureStrength","emissiveTexture","alphaMode","PBRMATERIAL_ALPHATEST","alphaCutOff","alphaCutoff","hasAlpha","PBRMATERIAL_ALPHABLEND","useAlphaFromAlbedoTexture","textureInfo","_extensionsLoadTextureInfoAsync","texCoord","_textureInfo","_loadTextureAsync","babylonTexture","coordinatesIndex","_extensionsLoadTextureAsync","DefaultSampler","image","_createTextureAsync","textureLoaderOptions","useSRGBBuffer","samplerData","_loadSampler","deferred","Deferred","textureCreationOptions","noMipmap","noMipMaps","exception","mimeType","loaderOptions","loadImageAsync","dataUrl","updateURL","internalTexture","getInternalTexture","label","wrapU","wrapV","minFilter","_GetTextureSamplingMode","_GetTextureWrapMode","wrapS","wrapT","property","_extensionsLoadUriAsync","_ValidateUri","IsBase64DataUrl","log","LoadFileError","status","statusText","babylonObject","_internalMetadata","pointers","CLAMP_ADDRESSMODE","MIRROR_ADDRESSMODE","WRAP_ADDRESSMODE","magFilter","LINEAR_NEAREST","LINEAR_LINEAR","LINEAR_NEAREST_MIPNEAREST","LINEAR_LINEAR_MIPNEAREST","LINEAR_NEAREST_MIPLINEAR","LINEAR_LINEAR_MIPLINEAR","NEAREST_NEAREST","NEAREST_LINEAR","NEAREST_NEAREST_MIPNEAREST","NEAREST_LINEAR_MIPNEAREST","NEAREST_NEAREST_MIPLINEAR","NEAREST_LINEAR_MIPLINEAR","Int8Array","Int16Array","Uint16Array","Uint32Array","componentTypeLength","IsBase64","PointListDrawMode","LineListDrawMode","LineLoopDrawMode","LineStripDrawMode","TriangleStripDrawMode","TriangleFanDrawMode","computeWorldMatrix","forceCompilationAsync","useInstances","clipPlane","light","getShadowGenerator","_forEachExtensions","_applyExtensions","functionName","actionAsync","loaderProperty","_activeLoaderExtensionFunctions","activeLoaderExtensionFunctions","onLoading","onReady","_loadUriAsync","LoadExtensionAsync","extensionName","LoadExtraAsync","extra","extensionsUsed","startPerformanceCounter","endPerformanceCounter"],"mappings":"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"}
|