@babylonjs/loaders 8.28.1 → 8.28.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/OBJ/solidParser.d.ts +8 -7
  2. package/OBJ/solidParser.js +95 -53
  3. package/OBJ/solidParser.js.map +1 -1
  4. package/glTF/2.0/Extensions/KHR_materials_anisotropy.d.ts +1 -1
  5. package/glTF/2.0/Extensions/KHR_materials_anisotropy.js +15 -10
  6. package/glTF/2.0/Extensions/KHR_materials_anisotropy.js.map +1 -1
  7. package/glTF/2.0/Extensions/KHR_materials_clearcoat.js +44 -28
  8. package/glTF/2.0/Extensions/KHR_materials_clearcoat.js.map +1 -1
  9. package/glTF/2.0/Extensions/KHR_materials_clearcoat_anisotropy.d.ts +42 -0
  10. package/glTF/2.0/Extensions/KHR_materials_clearcoat_anisotropy.js +66 -0
  11. package/glTF/2.0/Extensions/KHR_materials_clearcoat_anisotropy.js.map +1 -0
  12. package/glTF/2.0/Extensions/KHR_materials_clearcoat_color.d.ts +42 -0
  13. package/glTF/2.0/Extensions/KHR_materials_clearcoat_color.js +62 -0
  14. package/glTF/2.0/Extensions/KHR_materials_clearcoat_color.js.map +1 -0
  15. package/glTF/2.0/Extensions/KHR_materials_clearcoat_darkening.d.ts +43 -0
  16. package/glTF/2.0/Extensions/KHR_materials_clearcoat_darkening.js +62 -0
  17. package/glTF/2.0/Extensions/KHR_materials_clearcoat_darkening.js.map +1 -0
  18. package/glTF/2.0/Extensions/{EXT_materials_diffuse_roughness.d.ts → KHR_materials_diffuse_roughness.d.ts} +5 -5
  19. package/glTF/2.0/Extensions/{EXT_materials_diffuse_roughness.js → KHR_materials_diffuse_roughness.js} +8 -18
  20. package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.js.map +1 -0
  21. package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.js +6 -31
  22. package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.js.map +1 -1
  23. package/glTF/2.0/Extensions/KHR_materials_dispersion.js +3 -7
  24. package/glTF/2.0/Extensions/KHR_materials_dispersion.js.map +1 -1
  25. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js +5 -9
  26. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js.map +1 -1
  27. package/glTF/2.0/Extensions/KHR_materials_ior.js +3 -10
  28. package/glTF/2.0/Extensions/KHR_materials_ior.js.map +1 -1
  29. package/glTF/2.0/Extensions/KHR_materials_iridescence.js +13 -11
  30. package/glTF/2.0/Extensions/KHR_materials_iridescence.js.map +1 -1
  31. package/glTF/2.0/Extensions/KHR_materials_sheen.js +11 -22
  32. package/glTF/2.0/Extensions/KHR_materials_sheen.js.map +1 -1
  33. package/glTF/2.0/Extensions/KHR_materials_specular.js +9 -17
  34. package/glTF/2.0/Extensions/KHR_materials_specular.js.map +1 -1
  35. package/glTF/2.0/Extensions/KHR_materials_transmission.js +21 -32
  36. package/glTF/2.0/Extensions/KHR_materials_transmission.js.map +1 -1
  37. package/glTF/2.0/Extensions/KHR_materials_unlit.js +7 -13
  38. package/glTF/2.0/Extensions/KHR_materials_unlit.js.map +1 -1
  39. package/glTF/2.0/Extensions/KHR_materials_volume.js +13 -22
  40. package/glTF/2.0/Extensions/KHR_materials_volume.js.map +1 -1
  41. package/glTF/2.0/Extensions/MSFT_minecraftMesh.js +1 -2
  42. package/glTF/2.0/Extensions/MSFT_minecraftMesh.js.map +1 -1
  43. package/glTF/2.0/Extensions/MSFT_sRGBFactors.js +5 -8
  44. package/glTF/2.0/Extensions/MSFT_sRGBFactors.js.map +1 -1
  45. package/glTF/2.0/Extensions/dynamic.js +3 -3
  46. package/glTF/2.0/Extensions/dynamic.js.map +1 -1
  47. package/glTF/2.0/Extensions/index.d.ts +4 -1
  48. package/glTF/2.0/Extensions/index.js +4 -1
  49. package/glTF/2.0/Extensions/index.js.map +1 -1
  50. package/glTF/2.0/glTFLoader.d.ts +17 -0
  51. package/glTF/2.0/glTFLoader.js +104 -50
  52. package/glTF/2.0/glTFLoader.js.map +1 -1
  53. package/glTF/2.0/index.d.ts +2 -0
  54. package/glTF/2.0/index.js +2 -0
  55. package/glTF/2.0/index.js.map +1 -1
  56. package/glTF/2.0/materialLoadingAdapter.d.ts +314 -0
  57. package/glTF/2.0/materialLoadingAdapter.js +2 -0
  58. package/glTF/2.0/materialLoadingAdapter.js.map +1 -0
  59. package/glTF/2.0/openPbrMaterialLoadingAdapter.d.ts +594 -0
  60. package/glTF/2.0/openPbrMaterialLoadingAdapter.js +902 -0
  61. package/glTF/2.0/openPbrMaterialLoadingAdapter.js.map +1 -0
  62. package/glTF/2.0/pbrMaterialLoadingAdapter.d.ts +612 -0
  63. package/glTF/2.0/pbrMaterialLoadingAdapter.js +973 -0
  64. package/glTF/2.0/pbrMaterialLoadingAdapter.js.map +1 -0
  65. package/glTF/glTFFileLoader.d.ts +5 -0
  66. package/glTF/glTFFileLoader.js +6 -0
  67. package/glTF/glTFFileLoader.js.map +1 -1
  68. package/package.json +3 -3
  69. package/glTF/2.0/Extensions/EXT_materials_diffuse_roughness.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pbrMaterialLoadingAdapter.js","sourceRoot":"","sources":["../../../../../dev/loaders/src/glTF/2.0/pbrMaterialLoadingAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { IMaterialLoadingAdapter } from \"./materialLoadingAdapter\";\r\n\r\n/**\r\n * Material Loading Adapter for PBR materials that provides a unified OpenPBR-like interface.\r\n */\r\nexport class PBRMaterialLoadingAdapter implements IMaterialLoadingAdapter {\r\n private _material: PBRMaterial;\r\n\r\n /**\r\n * Creates a new instance of the PBRMaterialLoadingAdapter.\r\n * @param material - The PBR material to adapt.\r\n */\r\n constructor(material: Material) {\r\n this._material = material as PBRMaterial;\r\n this._material.enableSpecularAntiAliasing = true;\r\n }\r\n\r\n /**\r\n * Gets the underlying material\r\n */\r\n public get material(): PBRMaterial {\r\n return this._material;\r\n }\r\n\r\n /**\r\n * Whether the material should be treated as unlit\r\n */\r\n public get isUnlit(): boolean {\r\n return this._material.unlit;\r\n }\r\n\r\n /**\r\n * Sets whether the material should be treated as unlit\r\n */\r\n public set isUnlit(value: boolean) {\r\n this._material.unlit = value;\r\n }\r\n\r\n // ========================================\r\n // CULLING PROPERTIES\r\n // ========================================\r\n\r\n /**\r\n * Sets whether back face culling is enabled.\r\n * @param value True to enable back face culling\r\n */\r\n public set backFaceCulling(value: boolean) {\r\n this._material.backFaceCulling = value;\r\n }\r\n\r\n /**\r\n * Gets whether back face culling is enabled.\r\n * @returns True if back face culling is enabled\r\n */\r\n public get backFaceCulling(): boolean {\r\n return this._material.backFaceCulling;\r\n }\r\n\r\n /**\r\n * Sets whether two-sided lighting is enabled.\r\n * @param value True to enable two-sided lighting\r\n */\r\n public set twoSidedLighting(value: boolean) {\r\n this._material.twoSidedLighting = value;\r\n }\r\n\r\n /**\r\n * Gets whether two-sided lighting is enabled.\r\n * @returns True if two-sided lighting is enabled\r\n */\r\n public get twoSidedLighting(): boolean {\r\n return this._material.twoSidedLighting;\r\n }\r\n\r\n // ========================================\r\n // ALPHA PROPERTIES\r\n // ========================================\r\n\r\n /**\r\n * Sets the alpha cutoff value for alpha testing.\r\n * @param value The alpha cutoff threshold (0-1)\r\n */\r\n public set alphaCutOff(value: number) {\r\n this._material.alphaCutOff = value;\r\n }\r\n\r\n /**\r\n * Gets the alpha cutoff value.\r\n * @returns The alpha cutoff threshold (0-1)\r\n */\r\n public get alphaCutOff(): number {\r\n return this._material.alphaCutOff;\r\n }\r\n\r\n /**\r\n * Sets whether to use alpha from the albedo texture.\r\n * @param value True to use alpha from albedo texture\r\n */\r\n public set useAlphaFromBaseColorTexture(value: boolean) {\r\n this._material.useAlphaFromAlbedoTexture = value;\r\n }\r\n\r\n /**\r\n * Gets whether alpha is used from the albedo texture.\r\n * @returns True if using alpha from albedo texture\r\n */\r\n public get useAlphaFromBaseColorTexture(): boolean {\r\n return this._material.useAlphaFromAlbedoTexture;\r\n }\r\n\r\n /**\r\n * Gets whether the transparency is treated as alpha coverage.\r\n */\r\n public get transparencyAsAlphaCoverage(): boolean {\r\n return this._material.useRadianceOverAlpha || this._material.useSpecularOverAlpha;\r\n }\r\n\r\n /**\r\n * Sets/Gets whether the transparency is treated as alpha coverage\r\n */\r\n public set transparencyAsAlphaCoverage(value: boolean) {\r\n this._material.useRadianceOverAlpha = !value;\r\n this._material.useSpecularOverAlpha = !value;\r\n }\r\n\r\n // ========================================\r\n // BASE PARAMETERS\r\n // ========================================\r\n\r\n /**\r\n * Sets the base color of the material (mapped to PBR albedoColor).\r\n * @param value The base color as a Color3\r\n */\r\n public set baseColor(value: Color3) {\r\n this._material.albedoColor = value;\r\n }\r\n\r\n /**\r\n * Gets the base color of the material.\r\n * @returns The base color as a Color3\r\n */\r\n public get baseColor(): Color3 {\r\n return this._material.albedoColor;\r\n }\r\n\r\n /**\r\n * Sets the base color texture of the material (mapped to PBR albedoTexture).\r\n * @param value The base color texture or null\r\n */\r\n public set baseColorTexture(value: Nullable<BaseTexture>) {\r\n this._material.albedoTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the base color texture of the material.\r\n * @returns The base color texture or null\r\n */\r\n public get baseColorTexture(): Nullable<BaseTexture> {\r\n return this._material.albedoTexture;\r\n }\r\n\r\n /**\r\n * Sets the base diffuse roughness of the material.\r\n * @param value The diffuse roughness value (0-1)\r\n */\r\n public set baseDiffuseRoughness(value: number) {\r\n this._material.baseDiffuseRoughness = value;\r\n if (value > 0) {\r\n this._material.brdf.baseDiffuseModel = Constants.MATERIAL_DIFFUSE_MODEL_E_OREN_NAYAR;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the base diffuse roughness of the material.\r\n * @returns The diffuse roughness value (0-1), defaults to 0 if not set\r\n */\r\n public get baseDiffuseRoughness(): number {\r\n return this._material.baseDiffuseRoughness ?? 0;\r\n }\r\n\r\n /**\r\n * Sets the base diffuse roughness texture of the material.\r\n * @param value The diffuse roughness texture or null\r\n */\r\n public set baseDiffuseRoughnessTexture(value: Nullable<BaseTexture>) {\r\n this._material.baseDiffuseRoughnessTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the base diffuse roughness texture of the material.\r\n * @returns The diffuse roughness texture or null\r\n */\r\n public get baseDiffuseRoughnessTexture(): Nullable<BaseTexture> {\r\n return this._material.baseDiffuseRoughnessTexture;\r\n }\r\n\r\n /**\r\n * Sets the base metalness value of the material (mapped to PBR metallic).\r\n * @param value The metalness value (0-1)\r\n */\r\n public set baseMetalness(value: number) {\r\n this._material.metallic = value;\r\n }\r\n\r\n /**\r\n * Gets the base metalness value of the material.\r\n * @returns The metalness value (0-1), defaults to 1 if not set\r\n */\r\n public get baseMetalness(): number {\r\n return this._material.metallic ?? 1;\r\n }\r\n\r\n /**\r\n * Sets the base metalness texture of the material (mapped to PBR metallicTexture).\r\n * @param value The metalness texture or null\r\n */\r\n public set baseMetalnessTexture(value: Nullable<BaseTexture>) {\r\n this._material.metallicTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the base metalness texture of the material.\r\n * @returns The metalness texture or null\r\n */\r\n public get baseMetalnessTexture(): Nullable<BaseTexture> {\r\n return this._material.metallicTexture;\r\n }\r\n\r\n /**\r\n * Sets whether to use roughness from the metallic texture's green channel.\r\n * Also disables using roughness from the alpha channel when enabled.\r\n * @param value True to use green channel for roughness\r\n */\r\n public set useRoughnessFromMetallicTextureGreen(value: boolean) {\r\n this._material.useRoughnessFromMetallicTextureGreen = value;\r\n this._material.useRoughnessFromMetallicTextureAlpha = !value;\r\n }\r\n\r\n /**\r\n * Sets whether to use metalness from the metallic texture's blue channel.\r\n * @param value True to use blue channel for metalness\r\n */\r\n public set useMetallicFromMetallicTextureBlue(value: boolean) {\r\n this._material.useMetallnessFromMetallicTextureBlue = value;\r\n }\r\n\r\n // ========================================\r\n // SPECULAR PARAMETERS\r\n // ========================================\r\n\r\n /**\r\n * Configures specular properties and optionally enables OpenPBR BRDF model for edge color support.\r\n * @param enableEdgeColor Whether to enable OpenPBR BRDF models for edge color support\r\n */\r\n public enableSpecularEdgeColor(enableEdgeColor: boolean = false): void {\r\n if (enableEdgeColor) {\r\n this._material.brdf.dielectricSpecularModel = Constants.MATERIAL_DIELECTRIC_SPECULAR_MODEL_OPENPBR;\r\n this._material.brdf.conductorSpecularModel = Constants.MATERIAL_CONDUCTOR_SPECULAR_MODEL_OPENPBR;\r\n }\r\n }\r\n\r\n /**\r\n * Sets the specular weight (mapped to PBR metallicF0Factor).\r\n * @param value The specular weight value\r\n */\r\n public set specularWeight(value: number) {\r\n this._material.metallicF0Factor = value;\r\n }\r\n\r\n /**\r\n * Gets the specular weight.\r\n * @returns The specular weight value, defaults to 1 if not set\r\n */\r\n public get specularWeight(): number {\r\n return this._material.metallicF0Factor ?? 1;\r\n }\r\n\r\n /**\r\n * Sets the specular weight texture (mapped to PBR metallicReflectanceTexture).\r\n * Configures the material to use only metalness from this texture when set.\r\n * @param value The specular weight texture or null\r\n */\r\n public set specularWeightTexture(value: Nullable<BaseTexture>) {\r\n if (value) {\r\n this._material.metallicReflectanceTexture = value;\r\n this._material.useOnlyMetallicFromMetallicReflectanceTexture = true;\r\n } else {\r\n this._material.metallicReflectanceTexture = null;\r\n this._material.useOnlyMetallicFromMetallicReflectanceTexture = false;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the specular weight texture.\r\n * @returns The specular weight texture or null\r\n */\r\n public get specularWeightTexture(): Nullable<BaseTexture> {\r\n return this._material.metallicReflectanceTexture;\r\n }\r\n\r\n /**\r\n * Sets the specular color (mapped to PBR metallicReflectanceColor).\r\n * @param value The specular color as a Color3\r\n */\r\n public set specularColor(value: Color3) {\r\n this._material.metallicReflectanceColor = value;\r\n }\r\n\r\n /**\r\n * Gets the specular color.\r\n * @returns The specular color as a Color3\r\n */\r\n public get specularColor(): Color3 {\r\n return this._material.metallicReflectanceColor;\r\n }\r\n\r\n /**\r\n * Sets the specular color texture (mapped to PBR reflectanceTexture).\r\n * @param value The specular color texture or null\r\n */\r\n public set specularColorTexture(value: Nullable<BaseTexture>) {\r\n this._material.reflectanceTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the specular color texture.\r\n * @returns The specular color texture or null\r\n */\r\n public get specularColorTexture(): Nullable<BaseTexture> {\r\n return this._material.reflectanceTexture;\r\n }\r\n\r\n /**\r\n * Sets the specular roughness (mapped to PBR roughness).\r\n * @param value The roughness value (0-1)\r\n */\r\n public set specularRoughness(value: number) {\r\n this._material.roughness = value;\r\n }\r\n\r\n /**\r\n * Gets the specular roughness.\r\n * @returns The roughness value (0-1), defaults to 1 if not set\r\n */\r\n public get specularRoughness(): number {\r\n return this._material.roughness ?? 1;\r\n }\r\n\r\n /**\r\n * Sets the specular roughness texture.\r\n * Note: PBR uses the same texture for both metallic and roughness,\r\n * so this only sets the texture if no base metalness texture exists.\r\n * @param value The roughness texture or null\r\n */\r\n public set specularRoughnessTexture(value: Nullable<BaseTexture>) {\r\n // PBR uses the same texture for both metallic and roughness\r\n if (!this.baseMetalnessTexture) {\r\n this._material.metallicTexture = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the specular roughness texture.\r\n * @returns The roughness texture (same as metallic texture for PBR) or null\r\n */\r\n public get specularRoughnessTexture(): Nullable<BaseTexture> {\r\n return this._material.metallicTexture;\r\n }\r\n\r\n /**\r\n * Sets the specular index of refraction (mapped to PBR indexOfRefraction).\r\n * @param value The IOR value\r\n */\r\n public set specularIor(value: number) {\r\n this._material.indexOfRefraction = value;\r\n }\r\n\r\n /**\r\n * Gets the specular index of refraction.\r\n * @returns The IOR value\r\n */\r\n public get specularIor(): number {\r\n return this._material.indexOfRefraction;\r\n }\r\n\r\n // ========================================\r\n // EMISSION PARAMETERS\r\n // ========================================\r\n\r\n /**\r\n * Sets the emission color (mapped to PBR emissiveColor).\r\n * @param value The emission color as a Color3\r\n */\r\n public set emissionColor(value: Color3) {\r\n this._material.emissiveColor = value;\r\n }\r\n\r\n /**\r\n * Gets the emission color.\r\n * @returns The emission color as a Color3\r\n */\r\n public get emissionColor(): Color3 {\r\n return this._material.emissiveColor;\r\n }\r\n\r\n /**\r\n * Sets the emission luminance/intensity (mapped to PBR emissiveIntensity).\r\n * @param value The emission intensity value\r\n */\r\n public set emissionLuminance(value: number) {\r\n this._material.emissiveIntensity = value;\r\n }\r\n\r\n /**\r\n * Gets the emission luminance/intensity.\r\n * @returns The emission intensity value\r\n */\r\n public get emissionLuminance(): number {\r\n return this._material.emissiveIntensity;\r\n }\r\n\r\n /**\r\n * Sets the emission color texture (mapped to PBR emissiveTexture).\r\n * @param value The emission texture or null\r\n */\r\n public set emissionColorTexture(value: Nullable<BaseTexture>) {\r\n this._material.emissiveTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the emission color texture.\r\n * @returns The emission texture or null\r\n */\r\n public get emissionColorTexture(): Nullable<BaseTexture> {\r\n return this._material.emissiveTexture;\r\n }\r\n\r\n // ========================================\r\n // AMBIENT OCCLUSION\r\n // ========================================\r\n\r\n /**\r\n * Sets the ambient occlusion texture (mapped to PBR ambientTexture).\r\n * Automatically enables grayscale mode when set.\r\n * @param value The ambient occlusion texture or null\r\n */\r\n public set ambientOcclusionTexture(value: Nullable<BaseTexture>) {\r\n this._material.ambientTexture = value;\r\n if (value) {\r\n this._material.useAmbientInGrayScale = true;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the ambient occlusion texture.\r\n * @returns The ambient occlusion texture or null\r\n */\r\n public get ambientOcclusionTexture(): Nullable<BaseTexture> {\r\n return this._material.ambientTexture;\r\n }\r\n\r\n /**\r\n * Sets the ambient occlusion texture strength.\r\n * @param value The strength value (typically 0-1)\r\n */\r\n public set ambientOcclusionTextureStrength(value: number) {\r\n this._material.ambientTextureStrength = value;\r\n }\r\n\r\n /**\r\n * Gets the ambient occlusion texture strength.\r\n * @returns The strength value, defaults to 1.0 if not set\r\n */\r\n public get ambientOcclusionTextureStrength(): number {\r\n return this._material.ambientTextureStrength ?? 1.0;\r\n }\r\n\r\n // ========================================\r\n // COAT PARAMETERS\r\n // ========================================\r\n\r\n /**\r\n * Configures clear coat for PBR material.\r\n * Enables clear coat and sets up proper configuration.\r\n */\r\n public configureCoat(): void {\r\n this._material.clearCoat.isEnabled = true;\r\n this._material.clearCoat.useRoughnessFromMainTexture = false;\r\n this._material.clearCoat.remapF0OnInterfaceChange = false;\r\n }\r\n\r\n /**\r\n * Sets the coat weight (mapped to PBR clearCoat.intensity).\r\n * Automatically enables clear coat.\r\n * @param value The coat weight value (0-1)\r\n */\r\n public set coatWeight(value: number) {\r\n this._material.clearCoat.isEnabled = true;\r\n this._material.clearCoat.intensity = value;\r\n }\r\n\r\n /**\r\n * Gets the coat weight.\r\n * @returns The coat weight value\r\n */\r\n public get coatWeight(): number {\r\n return this._material.clearCoat.intensity;\r\n }\r\n\r\n /**\r\n * Sets the coat weight texture (mapped to PBR clearCoat.texture).\r\n * Automatically enables clear coat.\r\n * @param value The coat weight texture or null\r\n */\r\n public set coatWeightTexture(value: Nullable<BaseTexture>) {\r\n this._material.clearCoat.isEnabled = true;\r\n this._material.clearCoat.texture = value;\r\n }\r\n\r\n /**\r\n * Gets the coat weight texture.\r\n * @returns The coat weight texture or null\r\n */\r\n public get coatWeightTexture(): Nullable<BaseTexture> {\r\n return this._material.clearCoat.texture;\r\n }\r\n\r\n /**\r\n * Sets the coat color (mapped to PBR clearCoat.tintColor).\r\n * @param value The coat tint color as a Color3\r\n */\r\n public set coatColor(value: Color3) {\r\n this._material.clearCoat.isTintEnabled = value != Color3.White();\r\n this._material.clearCoat.tintColor = value;\r\n }\r\n\r\n /**\r\n * Sets the coat color texture (mapped to PBR clearCoat.tintTexture).\r\n * @param value The coat color texture or null\r\n */\r\n public set coatColorTexture(value: Nullable<BaseTexture>) {\r\n this._material.clearCoat.tintTexture = value;\r\n }\r\n\r\n /**\r\n * Sets the coat roughness (mapped to PBR clearCoat.roughness).\r\n * Automatically enables clear coat.\r\n * @param value The coat roughness value (0-1)\r\n */\r\n public set coatRoughness(value: number) {\r\n this._material.clearCoat.isEnabled = true;\r\n this._material.clearCoat.roughness = value;\r\n }\r\n\r\n /**\r\n * Gets the coat roughness.\r\n * @returns The coat roughness value, defaults to 0 if not set\r\n */\r\n public get coatRoughness(): number {\r\n return this._material.clearCoat.roughness ?? 0;\r\n }\r\n\r\n /**\r\n * Sets the coat roughness texture (mapped to PBR clearCoat.textureRoughness).\r\n * Automatically enables clear coat and disables using roughness from main texture.\r\n * @param value The coat roughness texture or null\r\n */\r\n public set coatRoughnessTexture(value: Nullable<BaseTexture>) {\r\n this._material.clearCoat.isEnabled = true;\r\n this._material.clearCoat.useRoughnessFromMainTexture = false;\r\n this._material.clearCoat.textureRoughness = value;\r\n }\r\n\r\n /**\r\n * Gets the coat roughness texture.\r\n * @returns The coat roughness texture or null\r\n */\r\n public get coatRoughnessTexture(): Nullable<BaseTexture> {\r\n return this._material.clearCoat.textureRoughness;\r\n }\r\n\r\n /**\r\n * Sets the coat darkening value.\r\n * Note: PBR doesn't have a direct coat darkening property, so this is a no-op.\r\n * @param value The coat darkening value (ignored for PBR)\r\n */\r\n public set coatDarkening(value: number) {\r\n // PBR doesn't have a coat darkening property\r\n }\r\n\r\n /**\r\n * Sets the coat darkening texture\r\n * @param value The coat darkening texture or null\r\n */\r\n public set coatDarkeningTexture(value: Nullable<BaseTexture>) {\r\n // PBR doesn't have a coat darkening property\r\n }\r\n\r\n /**\r\n * Sets the coat roughness anisotropy.\r\n * Note: PBR clearCoat doesn't support anisotropy yet, so this is a placeholder.\r\n * @param value The coat anisotropy intensity value (currently ignored)\r\n */\r\n public set coatRoughnessAnisotropy(value: number) {\r\n // TODO: Implement when PBR clearCoat anisotropy becomes available\r\n // this._material.clearCoat.anisotropy = value;\r\n }\r\n\r\n /**\r\n * Gets the coat roughness anisotropy.\r\n * Note: PBR clearCoat doesn't support anisotropy yet, so this returns 0.\r\n * @returns Currently returns 0 as clearCoat anisotropy is not yet available\r\n */\r\n public get coatRoughnessAnisotropy(): number {\r\n // TODO: Implement when PBR clearCoat anisotropy becomes available\r\n // return this._material.clearCoat.anisotropy ?? 0;\r\n return 0;\r\n }\r\n\r\n /**\r\n * Sets the coat tangent angle for anisotropy.\r\n * Note: PBR clearCoat doesn't support anisotropy yet, so this is a placeholder.\r\n * @param value The coat anisotropy rotation angle in radians (currently ignored)\r\n */\r\n public set geometryCoatTangentAngle(value: number) {\r\n // TODO: Implement when PBR clearCoat anisotropy becomes available\r\n // this._material.clearCoat.anisotropyAngle = value;\r\n }\r\n\r\n /**\r\n * Sets the coat tangent texture for anisotropy.\r\n * Note: PBR clearCoat doesn't support anisotropy textures yet, so this is a placeholder.\r\n * @param value The coat anisotropy texture (currently ignored)\r\n */\r\n public set geometryCoatTangentTexture(value: Nullable<BaseTexture>) {\r\n // TODO: Implement when PBR clearCoat anisotropy becomes available\r\n // this._material.clearCoat.anisotropyTangentTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the coat tangent texture for anisotropy.\r\n * Note: PBR clearCoat doesn't support anisotropy textures yet, so this returns null.\r\n * @returns Currently returns null as clearCoat anisotropy is not yet available\r\n */\r\n public get geometryCoatTangentTexture(): Nullable<BaseTexture> {\r\n // TODO: Implement when PBR clearCoat anisotropy becomes available\r\n // return this._material.clearCoat.anisotropyTangentTexture;\r\n return null;\r\n }\r\n\r\n // ========================================\r\n // TRANSMISSION LAYER\r\n // ========================================\r\n\r\n /**\r\n * Sets the transmission weight (mapped to PBR subSurface.refractionIntensity).\r\n * Enables refraction when value \\> 0.\r\n * @param value The transmission weight value (0-1)\r\n */\r\n public set transmissionWeight(value: number) {\r\n this._material.subSurface.isRefractionEnabled = value > 0;\r\n this._material.subSurface.refractionIntensity = value;\r\n }\r\n\r\n /**\r\n * Gets the transmission weight.\r\n * @returns The transmission weight value\r\n */\r\n public get transmissionWeight(): number {\r\n return this._material.subSurface.refractionIntensity;\r\n }\r\n\r\n /**\r\n * Sets the transmission weight texture (mapped to PBR subSurface.refractionIntensityTexture).\r\n * Automatically enables refraction and glTF-style textures.\r\n * @param value The transmission weight texture or null\r\n */\r\n public set transmissionWeightTexture(value: Nullable<BaseTexture>) {\r\n this._material.subSurface.isRefractionEnabled = true;\r\n this._material.subSurface.refractionIntensityTexture = value;\r\n this._material.subSurface.useGltfStyleTextures = true;\r\n }\r\n\r\n /**\r\n * Sets the attenuation distance for volume scattering.\r\n * @param value The attenuation distance value\r\n */\r\n public set transmissionDepth(value: number) {\r\n this._material.subSurface.tintColorAtDistance = value;\r\n }\r\n\r\n /**\r\n * Sets the attenuation color (mapped to PBR subSurface.tintColor).\r\n * @param value The attenuation color as a Color3\r\n */\r\n public set transmissionColor(value: Color3) {\r\n this._material.subSurface.tintColor = value;\r\n }\r\n\r\n /**\r\n * Gets the transmission dispersion Abbe number.\r\n * @param value The Abbe number value\r\n */\r\n public set transmissionDispersionAbbeNumber(value: number) {\r\n if (value > 0) {\r\n this._material.subSurface.isDispersionEnabled = true;\r\n this._material.subSurface.dispersion = 20.0 / value;\r\n } else {\r\n this._material.subSurface.isDispersionEnabled = false;\r\n this._material.subSurface.dispersion = 0;\r\n }\r\n }\r\n\r\n /**\r\n * Configures transmission for thin-surface transmission (KHR_materials_transmission).\r\n * Sets up the material for proper thin-surface transmission behavior.\r\n */\r\n public configureTransmission(): void {\r\n // Since this extension models thin-surface transmission only, we must make IOR = 1.0\r\n this._material.subSurface.volumeIndexOfRefraction = 1.0;\r\n // Albedo colour will tint transmission.\r\n this._material.subSurface.useAlbedoToTintRefraction = true;\r\n this._material.subSurface.minimumThickness = 0.0;\r\n this._material.subSurface.maximumThickness = 0.0;\r\n }\r\n\r\n // ========================================\r\n // VOLUME PROPERTIES\r\n // ========================================\r\n\r\n /**\r\n * Sets the thickness texture (mapped to PBR subSurface.thicknessTexture).\r\n * Automatically enables refraction.\r\n * @param value The thickness texture or null\r\n */\r\n public set volumeThicknessTexture(value: Nullable<BaseTexture>) {\r\n this._material.subSurface.thicknessTexture = value;\r\n this._material.subSurface.useGltfStyleTextures = true;\r\n }\r\n\r\n /**\r\n * Sets the thickness factor (mapped to PBR subSurface.maximumThickness).\r\n * Automatically enables refraction.\r\n * @param value The thickness value\r\n */\r\n public set volumeThickness(value: number) {\r\n this._material.subSurface.minimumThickness = 0.0;\r\n this._material.subSurface.maximumThickness = value;\r\n this._material.subSurface.useThicknessAsDepth = true;\r\n if (value > 0) {\r\n this._material.subSurface.volumeIndexOfRefraction = this._material.indexOfRefraction;\r\n }\r\n }\r\n\r\n // ========================================\r\n // SUBSURFACE PROPERTIES (Subsurface Scattering)\r\n // ========================================\r\n\r\n /**\r\n * Configures subsurface properties for PBR material\r\n */\r\n public configureSubsurface(): void {\r\n this._material.subSurface.useGltfStyleTextures = true;\r\n\r\n // Since this extension models thin-surface transmission only, we must make the\r\n // internal IOR == 1.0 and set the thickness to 0.\r\n this._material.subSurface.volumeIndexOfRefraction = 1.0;\r\n this._material.subSurface.minimumThickness = 0.0;\r\n this._material.subSurface.maximumThickness = 0.0;\r\n\r\n // Tint color will be used for transmission.\r\n this._material.subSurface.useAlbedoToTintTranslucency = false;\r\n }\r\n\r\n /**\r\n * Sets the subsurface weight\r\n */\r\n public set subsurfaceWeight(value: number) {\r\n this._material.subSurface.isTranslucencyEnabled = value > 0;\r\n this._material.subSurface.translucencyIntensity = value;\r\n }\r\n\r\n /**\r\n * Gets the subsurface weight\r\n * @returns The subsurface weight value\r\n */\r\n public get subsurfaceWeight(): number {\r\n return this._material.subSurface.isTranslucencyEnabled ? this._material.subSurface.translucencyIntensity : 0;\r\n }\r\n\r\n /**\r\n * Sets the subsurface weight texture\r\n */\r\n public set subsurfaceWeightTexture(value: Nullable<BaseTexture>) {\r\n this._material.subSurface.translucencyIntensityTexture = value;\r\n }\r\n\r\n /**\r\n * Sets the subsurface color.\r\n * @param value The subsurface tint color as a Color3\r\n */\r\n public set subsurfaceColor(value: Color3) {\r\n this._material.subSurface.tintColor = value;\r\n }\r\n\r\n /**\r\n * Sets the subsurface color texture.\r\n * @param value The subsurface tint texture or null\r\n */\r\n public set subsurfaceColorTexture(value: Nullable<BaseTexture>) {\r\n this._material.subSurface.translucencyColorTexture = value;\r\n }\r\n\r\n // ========================================\r\n // FUZZ LAYER (Sheen)\r\n // ========================================\r\n\r\n /**\r\n * Configures sheen for PBR material.\r\n * Enables sheen and sets up proper configuration.\r\n */\r\n public configureFuzz(): void {\r\n this._material.sheen.isEnabled = true;\r\n this._material.sheen.useRoughnessFromMainTexture = false;\r\n this._material.sheen.albedoScaling = true;\r\n }\r\n\r\n /**\r\n * Sets the sheen weight (mapped to PBR sheen.intensity).\r\n * Automatically enables sheen.\r\n * @param value The sheen weight value\r\n */\r\n public set fuzzWeight(value: number) {\r\n this._material.sheen.isEnabled = true;\r\n this._material.sheen.intensity = value;\r\n }\r\n\r\n /**\r\n * Sets the sheen color (mapped to PBR sheen.color).\r\n * Automatically enables sheen.\r\n * @param value The sheen color as a Color3\r\n */\r\n public set fuzzColor(value: Color3) {\r\n this._material.sheen.isEnabled = true;\r\n this._material.sheen.color = value;\r\n }\r\n\r\n /**\r\n * Sets the sheen color texture (mapped to PBR sheen.texture).\r\n * Automatically enables sheen.\r\n * @param value The sheen color texture or null\r\n */\r\n public set fuzzColorTexture(value: Nullable<BaseTexture>) {\r\n this._material.sheen.isEnabled = true;\r\n this._material.sheen.texture = value;\r\n }\r\n\r\n /**\r\n * Sets the sheen roughness (mapped to PBR sheen.roughness).\r\n * Automatically enables sheen.\r\n * @param value The sheen roughness value (0-1)\r\n */\r\n public set fuzzRoughness(value: number) {\r\n this._material.sheen.isEnabled = true;\r\n this._material.sheen.roughness = value;\r\n }\r\n\r\n /**\r\n * Sets the sheen roughness texture (mapped to PBR sheen.textureRoughness).\r\n * Automatically enables sheen.\r\n * @param value The sheen roughness texture or null\r\n */\r\n public set fuzzRoughnessTexture(value: Nullable<BaseTexture>) {\r\n this._material.sheen.isEnabled = true;\r\n this._material.sheen.textureRoughness = value;\r\n }\r\n\r\n // ========================================\r\n // ANISOTROPY\r\n // ========================================\r\n\r\n /**\r\n * Sets the specular roughness anisotropy (mapped to PBR anisotropy.intensity).\r\n * Automatically enables anisotropy.\r\n * @param value The anisotropy intensity value\r\n */\r\n public set specularRoughnessAnisotropy(value: number) {\r\n this._material.anisotropy.isEnabled = true;\r\n this._material.anisotropy.intensity = value;\r\n }\r\n\r\n /**\r\n * Gets the specular roughness anisotropy.\r\n * @returns The anisotropy intensity value\r\n */\r\n public get specularRoughnessAnisotropy(): number {\r\n return this._material.anisotropy.intensity;\r\n }\r\n\r\n /**\r\n * Sets the anisotropy rotation (mapped to PBR anisotropy.angle).\r\n * Automatically enables anisotropy.\r\n * @param value The anisotropy rotation angle in radians\r\n */\r\n public set geometryTangentAngle(value: number) {\r\n this._material.anisotropy.isEnabled = true;\r\n this._material.anisotropy.angle = value;\r\n }\r\n\r\n /**\r\n * Sets the geometry tangent texture (mapped to PBR anisotropy.texture).\r\n * Automatically enables anisotropy.\r\n * @param value The anisotropy texture or null\r\n */\r\n public set geometryTangentTexture(value: Nullable<BaseTexture>) {\r\n this._material.anisotropy.isEnabled = true;\r\n this._material.anisotropy.texture = value;\r\n }\r\n\r\n /**\r\n * Gets the geometry tangent texture.\r\n * @returns The anisotropy texture or null\r\n */\r\n public get geometryTangentTexture(): Nullable<BaseTexture> {\r\n return this._material.anisotropy.texture;\r\n }\r\n\r\n /**\r\n * Configures glTF-style anisotropy for the material.\r\n * Note: PBR materials don't need this configuration, so this is a no-op.\r\n * @param useGltfStyle Whether to use glTF-style anisotropy (ignored for PBR)\r\n */\r\n public configureGltfStyleAnisotropy(useGltfStyle: boolean = true): void {\r\n // PBR materials don't need this configuration\r\n }\r\n\r\n // ========================================\r\n // THIN FILM IRIDESCENCE\r\n // ========================================\r\n\r\n /**\r\n * Sets the iridescence weight (mapped to PBR iridescence.intensity).\r\n * Automatically enables iridescence.\r\n * @param value The iridescence intensity value\r\n */\r\n public set iridescenceWeight(value: number) {\r\n this._material.iridescence.isEnabled = true;\r\n this._material.iridescence.intensity = value;\r\n }\r\n\r\n /**\r\n * Sets the iridescence IOR (mapped to PBR iridescence.indexOfRefraction).\r\n * Automatically enables iridescence.\r\n * @param value The iridescence IOR value\r\n */\r\n public set iridescenceIor(value: number) {\r\n this._material.iridescence.isEnabled = true;\r\n this._material.iridescence.indexOfRefraction = value;\r\n }\r\n\r\n /**\r\n * Sets the iridescence thickness minimum (mapped to PBR iridescence.minimumThickness).\r\n * Automatically enables iridescence.\r\n * @param value The minimum thickness value in nanometers\r\n */\r\n public set iridescenceThicknessMinimum(value: number) {\r\n this._material.iridescence.isEnabled = true;\r\n this._material.iridescence.minimumThickness = value;\r\n }\r\n\r\n /**\r\n * Sets the iridescence thickness maximum (mapped to PBR iridescence.maximumThickness).\r\n * Automatically enables iridescence.\r\n * @param value The maximum thickness value in nanometers\r\n */\r\n public set iridescenceThicknessMaximum(value: number) {\r\n this._material.iridescence.isEnabled = true;\r\n this._material.iridescence.maximumThickness = value;\r\n }\r\n\r\n /**\r\n * Sets the iridescence texture (mapped to PBR iridescence.texture).\r\n * Automatically enables iridescence.\r\n * @param value The iridescence intensity texture or null\r\n */\r\n public set iridescenceTexture(value: Nullable<BaseTexture>) {\r\n this._material.iridescence.isEnabled = true;\r\n this._material.iridescence.texture = value;\r\n }\r\n\r\n /**\r\n * Sets the iridescence thickness texture (mapped to PBR iridescence.thicknessTexture).\r\n * Automatically enables iridescence.\r\n * @param value The iridescence thickness texture or null\r\n */\r\n public set iridescenceThicknessTexture(value: Nullable<BaseTexture>) {\r\n this._material.iridescence.isEnabled = true;\r\n this._material.iridescence.thicknessTexture = value;\r\n }\r\n\r\n // ========================================\r\n // DISPERSION\r\n // ========================================\r\n\r\n /**\r\n * Sets the transmission dispersion value.\r\n * Note: PBR doesn't have direct dispersion support, so this stores it as metadata.\r\n * @param value The dispersion value (stored as metadata)\r\n */\r\n public set transmissionDispersion(value: number) {\r\n // PBR doesn't have a direct dispersion property, this would need custom shader modification\r\n // For now, we'll store it as metadata\r\n (this._material as any)._dispersion = value;\r\n }\r\n\r\n // ========================================\r\n // UNLIT MATERIALS\r\n // ========================================\r\n\r\n /**\r\n * Sets whether the material is unlit.\r\n * @param value True to make the material unlit\r\n */\r\n public set unlit(value: boolean) {\r\n this._material.unlit = value;\r\n }\r\n\r\n // ========================================\r\n // GEOMETRY PARAMETERS\r\n // ========================================\r\n\r\n /**\r\n * Sets the geometry opacity (mapped to PBR alpha).\r\n * @param value The opacity value (0-1)\r\n */\r\n public set geometryOpacity(value: number) {\r\n this._material.alpha = value;\r\n }\r\n\r\n /**\r\n * Gets the geometry opacity.\r\n * @returns The opacity value (0-1)\r\n */\r\n public get geometryOpacity(): number {\r\n return this._material.alpha;\r\n }\r\n\r\n /**\r\n * Sets the geometry normal texture (mapped to PBR bumpTexture).\r\n * Also forces irradiance computation in fragment shader for better lighting.\r\n * @param value The normal texture or null\r\n */\r\n public set geometryNormalTexture(value: Nullable<BaseTexture>) {\r\n this._material.bumpTexture = value;\r\n this._material.forceIrradianceInFragment = true;\r\n }\r\n\r\n /**\r\n * Gets the geometry normal texture.\r\n * @returns The normal texture or null\r\n */\r\n public get geometryNormalTexture(): Nullable<BaseTexture> {\r\n return this._material.bumpTexture;\r\n }\r\n\r\n /**\r\n * Sets the normal map inversions for the material.\r\n * @param invertX Whether to invert the normal map on the X axis\r\n * @param invertY Whether to invert the normal map on the Y axis\r\n */\r\n public setNormalMapInversions(invertX: boolean, invertY: boolean): void {\r\n this._material.invertNormalMapX = invertX;\r\n this._material.invertNormalMapY = invertY;\r\n }\r\n\r\n /**\r\n * Sets the geometry coat normal texture (mapped to PBR clearCoat.bumpTexture).\r\n * Automatically enables clear coat.\r\n * @param value The coat normal texture or null\r\n */\r\n public set geometryCoatNormalTexture(value: Nullable<BaseTexture>) {\r\n this._material.clearCoat.isEnabled = true;\r\n this._material.clearCoat.bumpTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the geometry coat normal texture.\r\n * @returns The coat normal texture or null\r\n */\r\n public get geometryCoatNormalTexture(): Nullable<BaseTexture> {\r\n return this._material.clearCoat.bumpTexture;\r\n }\r\n\r\n /**\r\n * Sets the geometry coat normal texture scale.\r\n * @param value The scale value for the coat normal texture\r\n */\r\n public set geometryCoatNormalTextureScale(value: number) {\r\n if (this._material.clearCoat.bumpTexture) {\r\n this._material.clearCoat.bumpTexture.level = value;\r\n }\r\n }\r\n}\r\n"]}
@@ -215,6 +215,11 @@ declare class GLTFLoaderBaseOptions {
215
215
  * Defines if the loader should validate the asset.
216
216
  */
217
217
  validate: boolean;
218
+ /**
219
+ * Load the glTF files using the OpenPBR material.
220
+ * @experimental
221
+ */
222
+ useOpenPBR: boolean;
218
223
  }
219
224
  /**
220
225
  * The default GLTF loader options.
@@ -177,6 +177,11 @@ class GLTFLoaderBaseOptions {
177
177
  * Defines if the loader should validate the asset.
178
178
  */
179
179
  this.validate = false;
180
+ /**
181
+ * Load the glTF files using the OpenPBR material.
182
+ * @experimental
183
+ */
184
+ this.useOpenPBR = false;
180
185
  }
181
186
  }
182
187
  /**
@@ -231,6 +236,7 @@ class GLTFLoaderOptions extends GLTFLoaderBaseOptions {
231
236
  this.transparencyAsCoverage = options.transparencyAsCoverage ?? this.transparencyAsCoverage;
232
237
  this.useClipPlane = options.useClipPlane ?? this.useClipPlane;
233
238
  this.useGltfTextureNames = options.useGltfTextureNames ?? this.useGltfTextureNames;
239
+ this.useOpenPBR = options.useOpenPBR ?? this.useOpenPBR;
234
240
  this.useRangeRequests = options.useRangeRequests ?? this.useRangeRequests;
235
241
  this.useSRGBBuffers = options.useSRGBBuffers ?? this.useSRGBBuffers;
236
242
  this.validate = options.validate ?? this.validate;
@@ -1 +1 @@
1
- {"version":3,"file":"glTFFileLoader.js","sourceRoot":"","sources":["../../../../dev/loaders/src/glTF/glTFFileLoader.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable github/no-then */\r\n/* eslint-disable @typescript-eslint/no-floating-promises */\r\n/* eslint-disable @typescript-eslint/prefer-promise-reject-errors */\r\n/* eslint-disable no-restricted-syntax */\r\n/* eslint-disable @typescript-eslint/promise-function-async */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type * as GLTF2 from \"babylonjs-gltf2interface\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport type { ISceneLoaderPluginFactory, ISceneLoaderPluginAsync, ISceneLoaderProgressEvent, ISceneLoaderAsyncResult, SceneLoaderPluginOptions } from \"core/Loading/sceneLoader\";\r\nimport { RegisterSceneLoaderPlugin } from \"core/Loading/sceneLoader\";\r\nimport { AssetContainer } from \"core/assetContainer\";\r\nimport type { Scene, IDisposable } from \"core/scene\";\r\nimport type { WebRequest } from \"core/Misc/webRequest\";\r\nimport type { IFileRequest } from \"core/Misc/fileRequest\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport type { IDataBuffer } from \"core/Misc/dataReader\";\r\nimport { DataReader } from \"core/Misc/dataReader\";\r\nimport { GLTFValidation } from \"./glTFValidation\";\r\nimport { GLTFFileLoaderMetadata, GLTFMagicBase64Encoded } from \"./glTFFileLoader.metadata\";\r\nimport type { LoadFileError } from \"core/Misc/fileTools\";\r\nimport { DecodeBase64UrlToBinary } from \"core/Misc/fileTools\";\r\nimport { RuntimeError, ErrorCodes } from \"core/Misc/error\";\r\nimport type { TransformNode } from \"core/Meshes/transformNode\";\r\nimport type { MorphTargetManager } from \"core/Morph/morphTargetManager\";\r\n\r\n/**\r\n * Defines options for glTF loader extensions. This interface is extended by specific extensions.\r\n */\r\nexport interface GLTFLoaderExtensionOptions extends Record<string, Record<string, unknown> | undefined> {}\r\n\r\ndeclare module \"core/Loading/sceneLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc\r\n export interface SceneLoaderPluginOptions {\r\n /**\r\n * Defines options for the glTF loader.\r\n */\r\n [GLTFFileLoaderMetadata.name]: Partial<GLTFLoaderOptions>;\r\n }\r\n}\r\n\r\ninterface IFileRequestInfo extends IFileRequest {\r\n _lengthComputable?: boolean;\r\n _loaded?: number;\r\n _total?: number;\r\n}\r\n\r\nfunction readAsync(arrayBuffer: ArrayBuffer, byteOffset: number, byteLength: number): Promise<Uint8Array> {\r\n try {\r\n return Promise.resolve(new Uint8Array(arrayBuffer, byteOffset, byteLength));\r\n } catch (e) {\r\n return Promise.reject(e);\r\n }\r\n}\r\n\r\nfunction readViewAsync(arrayBufferView: ArrayBufferView, byteOffset: number, byteLength: number): Promise<Uint8Array> {\r\n try {\r\n if (byteOffset < 0 || byteOffset >= arrayBufferView.byteLength) {\r\n throw new RangeError(\"Offset is out of range.\");\r\n }\r\n\r\n if (byteOffset + byteLength > arrayBufferView.byteLength) {\r\n throw new RangeError(\"Length is out of range.\");\r\n }\r\n\r\n return Promise.resolve(new Uint8Array(arrayBufferView.buffer, arrayBufferView.byteOffset + byteOffset, byteLength));\r\n } catch (e) {\r\n return Promise.reject(e);\r\n }\r\n}\r\n\r\n/**\r\n * Mode that determines the coordinate system to use.\r\n */\r\nexport enum GLTFLoaderCoordinateSystemMode {\r\n /**\r\n * Automatically convert the glTF right-handed data to the appropriate system based on the current coordinate system mode of the scene.\r\n */\r\n AUTO,\r\n\r\n /**\r\n * Sets the useRightHandedSystem flag on the scene.\r\n */\r\n FORCE_RIGHT_HANDED,\r\n}\r\n\r\n/**\r\n * Mode that determines what animations will start.\r\n */\r\nexport enum GLTFLoaderAnimationStartMode {\r\n /**\r\n * No animation will start.\r\n */\r\n NONE,\r\n\r\n /**\r\n * The first animation will start.\r\n */\r\n FIRST,\r\n\r\n /**\r\n * All animations will start.\r\n */\r\n ALL,\r\n}\r\n\r\n/**\r\n * Interface that contains the data for the glTF asset.\r\n */\r\nexport interface IGLTFLoaderData {\r\n /**\r\n * The object that represents the glTF JSON.\r\n */\r\n json: object;\r\n\r\n /**\r\n * The BIN chunk of a binary glTF.\r\n */\r\n bin: Nullable<IDataBuffer>;\r\n}\r\n\r\n/**\r\n * Interface for extending the loader.\r\n */\r\nexport interface IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n readonly name: string;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n enabled: boolean;\r\n\r\n /**\r\n * Defines the order of this extension.\r\n * The loader sorts the extensions using these values when loading.\r\n */\r\n order?: number;\r\n}\r\n\r\n/**\r\n * Loader state.\r\n */\r\nexport enum GLTFLoaderState {\r\n /**\r\n * The asset is loading.\r\n */\r\n LOADING,\r\n\r\n /**\r\n * The asset is ready for rendering.\r\n */\r\n READY,\r\n\r\n /**\r\n * The asset is completely loaded.\r\n */\r\n COMPLETE,\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFLoader extends IDisposable {\r\n importMeshAsync: (\r\n meshesNames: string | readonly string[] | null | undefined,\r\n scene: Scene,\r\n container: Nullable<AssetContainer>,\r\n data: IGLTFLoaderData,\r\n rootUrl: string,\r\n onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n fileName?: string\r\n ) => Promise<ISceneLoaderAsyncResult>;\r\n loadAsync: (scene: Scene, data: IGLTFLoaderData, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string) => Promise<void>;\r\n}\r\n\r\n/**\r\n * Adds default/implicit options to extension specific options.\r\n */\r\ntype DefaultExtensionOptions<BaseExtensionOptions> = {\r\n /**\r\n * Defines if the extension is enabled\r\n */\r\n enabled?: boolean;\r\n} & BaseExtensionOptions;\r\n\r\n/**\r\n * This class contains all the concrete (not abstract) glTF options, excluding callbacks.\r\n * The purpose of this class is to make it easy to provide a way to mutate the default\r\n * loader options (see the GLTFLoaderDefaultOptions instance below) without duplicating\r\n * all the options in yet another object. Since this class is instantiated for the default\r\n * options object, abstract properties and callbacks are not included, it's more just\r\n * flag-type options.\r\n */\r\nclass GLTFLoaderBaseOptions {\r\n /**\r\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.\r\n */\r\n public alwaysComputeBoundingBox = false;\r\n\r\n /**\r\n * Defines if the loader should always compute the nearest common ancestor of the skeleton joints instead of using `skin.skeleton`. Defaults to false.\r\n * Set this to true if loading assets with invalid `skin.skeleton` values.\r\n */\r\n public alwaysComputeSkeletonRootNode = false;\r\n\r\n /**\r\n * The animation start mode. Defaults to FIRST.\r\n */\r\n public animationStartMode = GLTFLoaderAnimationStartMode.FIRST;\r\n\r\n /**\r\n * Defines if the loader should compile materials before raising the success callback. Defaults to false.\r\n */\r\n public compileMaterials = false;\r\n\r\n /**\r\n * Defines if the loader should compile shadow generators before raising the success callback. Defaults to false.\r\n */\r\n public compileShadowGenerators = false;\r\n\r\n /**\r\n * The coordinate system mode. Defaults to AUTO.\r\n */\r\n public coordinateSystemMode = GLTFLoaderCoordinateSystemMode.AUTO;\r\n\r\n /**\r\n * Defines if the loader should create instances when multiple glTF nodes point to the same glTF mesh. Defaults to true.\r\n */\r\n public createInstances = true;\r\n\r\n /**\r\n * If true, load all materials defined in the file, even if not used by any mesh. Defaults to false.\r\n */\r\n public loadAllMaterials = false;\r\n\r\n /**\r\n * Defines if the loader should load morph targets. Defaults to true.\r\n */\r\n public loadMorphTargets = true;\r\n\r\n /**\r\n * Defines if the loader should load node animations. Defaults to true.\r\n * NOTE: The animation of this node will still load if the node is also a joint of a skin and `loadSkins` is true.\r\n */\r\n public loadNodeAnimations = true;\r\n\r\n /**\r\n * If true, load only the materials defined in the file. Defaults to false.\r\n */\r\n public loadOnlyMaterials = false;\r\n\r\n /**\r\n * Defines if the loader should load skins. Defaults to true.\r\n */\r\n public loadSkins = true;\r\n\r\n /**\r\n * If true, do not load any materials defined in the file. Defaults to false.\r\n */\r\n public skipMaterials = false;\r\n\r\n /**\r\n * When loading glTF animations, which are defined in seconds, target them to this FPS. Defaults to 60.\r\n */\r\n public targetFps = 60;\r\n\r\n /**\r\n * Defines if the Alpha blended materials are only applied as coverage.\r\n * If false, (default) The luminance of each pixel will reduce its opacity to simulate the behaviour of most physical materials.\r\n * If true, no extra effects are applied to transparent pixels.\r\n */\r\n public transparencyAsCoverage = false;\r\n\r\n /**\r\n * Defines if the loader should also compile materials with clip planes. Defaults to false.\r\n */\r\n public useClipPlane = false;\r\n\r\n /**\r\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.\r\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.\r\n */\r\n public useGltfTextureNames = false;\r\n\r\n /**\r\n * Defines if the loader should use range requests when load binary glTF files from HTTP.\r\n * Enabling will disable offline support and glTF validator.\r\n * Defaults to false.\r\n */\r\n public useRangeRequests = false;\r\n\r\n /**\r\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.\r\n */\r\n public useSRGBBuffers = true;\r\n\r\n /**\r\n * Defines if the loader should validate the asset.\r\n */\r\n public validate = false;\r\n}\r\n\r\n/**\r\n * The default GLTF loader options.\r\n * Override the properties of this object to globally change the default loader options.\r\n * To specify options for a specific load call, pass those options into the associated load function.\r\n */\r\nexport const GLTFLoaderDefaultOptions = new GLTFLoaderBaseOptions();\r\n\r\nabstract class GLTFLoaderOptions extends GLTFLoaderBaseOptions {\r\n // eslint-disable-next-line babylonjs/available\r\n protected copyFrom(options?: Partial<Readonly<GLTFLoaderOptions>>) {\r\n if (options) {\r\n this.alwaysComputeBoundingBox = options.alwaysComputeBoundingBox ?? this.alwaysComputeBoundingBox;\r\n this.alwaysComputeSkeletonRootNode = options.alwaysComputeSkeletonRootNode ?? this.alwaysComputeSkeletonRootNode;\r\n this.animationStartMode = options.animationStartMode ?? this.animationStartMode;\r\n this.capturePerformanceCounters = options.capturePerformanceCounters ?? this.capturePerformanceCounters;\r\n this.compileMaterials = options.compileMaterials ?? this.compileMaterials;\r\n this.compileShadowGenerators = options.compileShadowGenerators ?? this.compileShadowGenerators;\r\n this.coordinateSystemMode = options.coordinateSystemMode ?? this.coordinateSystemMode;\r\n this.createInstances = options.createInstances ?? this.createInstances;\r\n this.customRootNode = options.customRootNode;\r\n this.extensionOptions = options.extensionOptions ?? this.extensionOptions;\r\n this.loadAllMaterials = options.loadAllMaterials ?? this.loadAllMaterials;\r\n this.loadMorphTargets = options.loadMorphTargets ?? this.loadMorphTargets;\r\n this.loadNodeAnimations = options.loadNodeAnimations ?? this.loadNodeAnimations;\r\n this.loadOnlyMaterials = options.loadOnlyMaterials ?? this.loadOnlyMaterials;\r\n this.loadSkins = options.loadSkins ?? this.loadSkins;\r\n this.loggingEnabled = options.loggingEnabled ?? this.loggingEnabled;\r\n this.onCameraLoaded = options.onCameraLoaded;\r\n this.onMaterialLoaded = options.onMaterialLoaded;\r\n this.onMeshLoaded = options.onMeshLoaded;\r\n this.onParsed = options.onParsed;\r\n this.onSkinLoaded = options.onSkinLoaded;\r\n this.onTextureLoaded = options.onTextureLoaded;\r\n this.onValidated = options.onValidated;\r\n this.preprocessUrlAsync = options.preprocessUrlAsync ?? this.preprocessUrlAsync;\r\n this.skipMaterials = options.skipMaterials ?? this.skipMaterials;\r\n this.targetFps = options.targetFps ?? this.targetFps;\r\n this.transparencyAsCoverage = options.transparencyAsCoverage ?? this.transparencyAsCoverage;\r\n this.useClipPlane = options.useClipPlane ?? this.useClipPlane;\r\n this.useGltfTextureNames = options.useGltfTextureNames ?? this.useGltfTextureNames;\r\n this.useRangeRequests = options.useRangeRequests ?? this.useRangeRequests;\r\n this.useSRGBBuffers = options.useSRGBBuffers ?? this.useSRGBBuffers;\r\n this.validate = options.validate ?? this.validate;\r\n }\r\n }\r\n\r\n // --------------\r\n // Common options\r\n // --------------\r\n\r\n /**\r\n * Raised when the asset has been parsed\r\n */\r\n public abstract onParsed?: ((loaderData: IGLTFLoaderData) => void) | undefined;\r\n\r\n // ----------\r\n // V2 options\r\n // ----------\r\n\r\n /**\r\n * Defines if the loader should capture performance counters.\r\n */\r\n public abstract capturePerformanceCounters: boolean;\r\n\r\n /**\r\n * Defines the node to use as the root of the hierarchy when loading the scene (default: undefined). If not defined, a root node will be automatically created.\r\n * You can also pass null if you don't want a root node to be created.\r\n */\r\n public customRootNode?: Nullable<TransformNode>;\r\n\r\n /**\r\n * Defines options for glTF extensions.\r\n */\r\n public extensionOptions: {\r\n // NOTE: This type is doing two things:\r\n // 1. Adding an implicit 'enabled' property to the options for each extension.\r\n // 2. Creating a mapped type of all the options of all the extensions to make it just look like a consolidated plain object in intellisense for the user.\r\n [Extension in keyof GLTFLoaderExtensionOptions]?: {\r\n [Option in keyof DefaultExtensionOptions<GLTFLoaderExtensionOptions[Extension]>]: DefaultExtensionOptions<GLTFLoaderExtensionOptions[Extension]>[Option];\r\n };\r\n } = {};\r\n\r\n /**\r\n * If true, enable logging for the loader. Defaults to false.\r\n */\r\n public abstract loggingEnabled: boolean;\r\n\r\n /**\r\n * Callback raised when the loader creates a camera after parsing the glTF properties of the camera.\r\n */\r\n public abstract onCameraLoaded?: (camera: Camera) => void;\r\n\r\n /**\r\n * Callback raised when the loader creates a material after parsing the glTF properties of the material.\r\n */\r\n public abstract onMaterialLoaded?: (material: Material) => void;\r\n\r\n /**\r\n * Callback raised when the loader creates a mesh after parsing the glTF properties of the mesh.\r\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, ...)\r\n */\r\n public abstract onMeshLoaded?: (mesh: AbstractMesh) => void;\r\n\r\n /**\r\n * Callback raised when the loader creates a skin after parsing the glTF properties of the skin node.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/importers/glTF/glTFSkinning#ignoring-the-transform-of-the-skinned-mesh\r\n */\r\n public abstract onSkinLoaded?: (node: TransformNode, skinnedNode: TransformNode) => void;\r\n\r\n /**\r\n * Callback raised when the loader creates a texture after parsing the glTF properties of the texture.\r\n */\r\n public abstract onTextureLoaded?: (texture: BaseTexture) => void;\r\n\r\n /**\r\n * Callback raised after the asset is validated.\r\n */\r\n public abstract onValidated?: (results: GLTF2.IGLTFValidationResults) => void;\r\n\r\n /**\r\n * Function called before loading a url referenced by the asset.\r\n * @param url url referenced by the asset\r\n * @returns Async url to load\r\n */\r\n public preprocessUrlAsync = (url: string) => Promise.resolve(url);\r\n}\r\n\r\n/**\r\n * File loader for loading glTF files into a scene.\r\n */\r\nexport class GLTFFileLoader extends GLTFLoaderOptions implements IDisposable, ISceneLoaderPluginAsync, ISceneLoaderPluginFactory {\r\n /** @internal */\r\n public static _CreateGLTF1Loader: (parent: GLTFFileLoader) => IGLTFLoader;\r\n\r\n /** @internal */\r\n public static _CreateGLTF2Loader: (parent: GLTFFileLoader) => IGLTFLoader;\r\n\r\n /**\r\n * Creates a new glTF file loader.\r\n * @param options The options for the loader\r\n */\r\n public constructor(options?: Partial<Readonly<GLTFLoaderOptions>>) {\r\n super();\r\n this.copyFrom(Object.assign({ ...GLTFLoaderDefaultOptions }, options));\r\n }\r\n\r\n // --------------------\r\n // Begin Common options\r\n // --------------------\r\n\r\n /**\r\n * Raised when the asset has been parsed\r\n */\r\n public onParsedObservable = new Observable<IGLTFLoaderData>();\r\n\r\n private _onParsedObserver: Nullable<Observer<IGLTFLoaderData>>;\r\n\r\n /**\r\n * Raised when the asset has been parsed\r\n */\r\n public set onParsed(callback: ((loaderData: IGLTFLoaderData) => void) | undefined) {\r\n if (this._onParsedObserver) {\r\n this.onParsedObservable.remove(this._onParsedObserver);\r\n }\r\n if (callback) {\r\n this._onParsedObserver = this.onParsedObservable.add(callback);\r\n }\r\n }\r\n\r\n // ------------------\r\n // End Common options\r\n // ------------------\r\n\r\n // ----------------\r\n // Begin V1 options\r\n // ----------------\r\n\r\n /**\r\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.\r\n * Textures always loads asynchronously. For example, the success callback can compute the bounding information of the loaded meshes when incremental loading is disabled.\r\n * Defaults to true.\r\n * @internal\r\n */\r\n public static IncrementalLoading = true;\r\n\r\n /**\r\n * Set this property to true in order to work with homogeneous coordinates, available with some converters and exporters.\r\n * Defaults to false. See https://en.wikipedia.org/wiki/Homogeneous_coordinates.\r\n * @internal\r\n */\r\n public static HomogeneousCoordinates = false;\r\n\r\n // --------------\r\n // End V1 options\r\n // --------------\r\n\r\n /**\r\n * Observable raised when the loader creates a mesh after parsing the glTF properties of the mesh.\r\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, ...)\r\n */\r\n public readonly onMeshLoadedObservable = new Observable<AbstractMesh>();\r\n\r\n private _onMeshLoadedObserver: Nullable<Observer<AbstractMesh>>;\r\n\r\n /**\r\n * Callback raised when the loader creates a mesh after parsing the glTF properties of the mesh.\r\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, ...)\r\n */\r\n public set onMeshLoaded(callback: ((mesh: AbstractMesh) => void) | undefined) {\r\n if (this._onMeshLoadedObserver) {\r\n this.onMeshLoadedObservable.remove(this._onMeshLoadedObserver);\r\n }\r\n if (callback) {\r\n this._onMeshLoadedObserver = this.onMeshLoadedObservable.add(callback);\r\n }\r\n }\r\n\r\n /**\r\n * Observable raised when the loader creates a skin after parsing the glTF properties of the skin node.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/importers/glTF/glTFSkinning#ignoring-the-transform-of-the-skinned-mesh\r\n * @param node - the transform node that corresponds to the original glTF skin node used for animations\r\n * @param skinnedNode - the transform node that is the skinned mesh itself or the parent of the skinned meshes\r\n */\r\n public readonly onSkinLoadedObservable = new Observable<{ node: TransformNode; skinnedNode: TransformNode }>();\r\n\r\n private _onSkinLoadedObserver: Nullable<Observer<{ node: TransformNode; skinnedNode: TransformNode }>>;\r\n\r\n /**\r\n * Callback raised when the loader creates a skin after parsing the glTF properties of the skin node.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/importers/glTF/glTFSkinning#ignoring-the-transform-of-the-skinned-mesh\r\n */\r\n public set onSkinLoaded(callback: ((node: TransformNode, skinnedNode: TransformNode) => void) | undefined) {\r\n if (this._onSkinLoadedObserver) {\r\n this.onSkinLoadedObservable.remove(this._onSkinLoadedObserver);\r\n }\r\n if (callback) {\r\n this._onSkinLoadedObserver = this.onSkinLoadedObservable.add((data) => callback(data.node, data.skinnedNode));\r\n }\r\n }\r\n\r\n /**\r\n * Observable raised when the loader creates a texture after parsing the glTF properties of the texture.\r\n */\r\n public readonly onTextureLoadedObservable = new Observable<BaseTexture>();\r\n\r\n private _onTextureLoadedObserver: Nullable<Observer<BaseTexture>>;\r\n\r\n /**\r\n * Callback raised when the loader creates a texture after parsing the glTF properties of the texture.\r\n */\r\n public set onTextureLoaded(callback: ((texture: BaseTexture) => void) | undefined) {\r\n if (this._onTextureLoadedObserver) {\r\n this.onTextureLoadedObservable.remove(this._onTextureLoadedObserver);\r\n }\r\n if (callback) {\r\n this._onTextureLoadedObserver = this.onTextureLoadedObservable.add(callback);\r\n }\r\n }\r\n\r\n /**\r\n * Observable raised when the loader creates a material after parsing the glTF properties of the material.\r\n */\r\n public readonly onMaterialLoadedObservable = new Observable<Material>();\r\n\r\n private _onMaterialLoadedObserver: Nullable<Observer<Material>>;\r\n\r\n /**\r\n * Callback raised when the loader creates a material after parsing the glTF properties of the material.\r\n */\r\n public set onMaterialLoaded(callback: ((material: Material) => void) | undefined) {\r\n if (this._onMaterialLoadedObserver) {\r\n this.onMaterialLoadedObservable.remove(this._onMaterialLoadedObserver);\r\n }\r\n if (callback) {\r\n this._onMaterialLoadedObserver = this.onMaterialLoadedObservable.add(callback);\r\n }\r\n }\r\n\r\n /**\r\n * Observable raised when the loader creates a camera after parsing the glTF properties of the camera.\r\n */\r\n public readonly onCameraLoadedObservable = new Observable<Camera>();\r\n\r\n private _onCameraLoadedObserver: Nullable<Observer<Camera>>;\r\n\r\n /**\r\n * Callback raised when the loader creates a camera after parsing the glTF properties of the camera.\r\n */\r\n public set onCameraLoaded(callback: ((camera: Camera) => void) | undefined) {\r\n if (this._onCameraLoadedObserver) {\r\n this.onCameraLoadedObservable.remove(this._onCameraLoadedObserver);\r\n }\r\n if (callback) {\r\n this._onCameraLoadedObserver = this.onCameraLoadedObservable.add(callback);\r\n }\r\n }\r\n\r\n /**\r\n * Observable raised when the asset is completely loaded, immediately before the loader is disposed.\r\n * For assets with LODs, raised when all of the LODs are complete.\r\n * For assets without LODs, raised when the model is complete, immediately after the loader resolves the returned promise.\r\n */\r\n public readonly onCompleteObservable = new Observable<void>();\r\n\r\n private _onCompleteObserver: Nullable<Observer<void>>;\r\n\r\n /**\r\n * Callback raised when the asset is completely loaded, immediately before the loader is disposed.\r\n * For assets with LODs, raised when all of the LODs are complete.\r\n * For assets without LODs, raised when the model is complete, immediately after the loader resolves the returned promise.\r\n */\r\n public set onComplete(callback: () => void) {\r\n if (this._onCompleteObserver) {\r\n this.onCompleteObservable.remove(this._onCompleteObserver);\r\n }\r\n this._onCompleteObserver = this.onCompleteObservable.add(callback);\r\n }\r\n\r\n /**\r\n * Observable raised when an error occurs.\r\n */\r\n public readonly onErrorObservable = new Observable<any>();\r\n\r\n private _onErrorObserver: Nullable<Observer<any>>;\r\n\r\n /**\r\n * Callback raised when an error occurs.\r\n */\r\n public set onError(callback: (reason: any) => void) {\r\n if (this._onErrorObserver) {\r\n this.onErrorObservable.remove(this._onErrorObserver);\r\n }\r\n this._onErrorObserver = this.onErrorObservable.add(callback);\r\n }\r\n\r\n /**\r\n * Observable raised after the loader is disposed.\r\n */\r\n public readonly onDisposeObservable = new Observable<void>();\r\n\r\n private _onDisposeObserver: Nullable<Observer<void>>;\r\n\r\n /**\r\n * Callback raised after the loader is disposed.\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n /**\r\n * Observable raised after a loader extension is created.\r\n * Set additional options for a loader extension in this event.\r\n */\r\n public readonly onExtensionLoadedObservable = new Observable<IGLTFLoaderExtension>();\r\n\r\n private _onExtensionLoadedObserver: Nullable<Observer<IGLTFLoaderExtension>>;\r\n\r\n /**\r\n * Callback raised after a loader extension is created.\r\n */\r\n public set onExtensionLoaded(callback: (extension: IGLTFLoaderExtension) => void) {\r\n if (this._onExtensionLoadedObserver) {\r\n this.onExtensionLoadedObservable.remove(this._onExtensionLoadedObserver);\r\n }\r\n this._onExtensionLoadedObserver = this.onExtensionLoadedObservable.add(callback);\r\n }\r\n\r\n /**\r\n * Defines if the loader logging is enabled.\r\n */\r\n public get loggingEnabled(): boolean {\r\n return this._loggingEnabled;\r\n }\r\n\r\n public set loggingEnabled(value: boolean) {\r\n if (this._loggingEnabled === value) {\r\n return;\r\n }\r\n\r\n this._loggingEnabled = value;\r\n\r\n if (this._loggingEnabled) {\r\n this._log = this._logEnabled;\r\n } else {\r\n this._log = this._logDisabled;\r\n }\r\n }\r\n\r\n /**\r\n * Defines if the loader should capture performance counters.\r\n */\r\n public get capturePerformanceCounters(): boolean {\r\n return this._capturePerformanceCounters;\r\n }\r\n\r\n public set capturePerformanceCounters(value: boolean) {\r\n if (this._capturePerformanceCounters === value) {\r\n return;\r\n }\r\n\r\n this._capturePerformanceCounters = value;\r\n\r\n if (this._capturePerformanceCounters) {\r\n this._startPerformanceCounter = this._startPerformanceCounterEnabled;\r\n this._endPerformanceCounter = this._endPerformanceCounterEnabled;\r\n } else {\r\n this._startPerformanceCounter = this._startPerformanceCounterDisabled;\r\n this._endPerformanceCounter = this._endPerformanceCounterDisabled;\r\n }\r\n }\r\n\r\n /**\r\n * Observable raised after validation when validate is set to true. The event data is the result of the validation.\r\n */\r\n public readonly onValidatedObservable = new Observable<GLTF2.IGLTFValidationResults>();\r\n\r\n private _onValidatedObserver: Nullable<Observer<GLTF2.IGLTFValidationResults>>;\r\n\r\n /**\r\n * Callback raised after the asset is validated.\r\n */\r\n public set onValidated(callback: (results: GLTF2.IGLTFValidationResults) => void) {\r\n if (this._onValidatedObserver) {\r\n this.onValidatedObservable.remove(this._onValidatedObserver);\r\n }\r\n this._onValidatedObserver = this.onValidatedObservable.add(callback);\r\n }\r\n\r\n private _loader: Nullable<IGLTFLoader> = null;\r\n private _state: Nullable<GLTFLoaderState> = null;\r\n private _progressCallback?: (event: ISceneLoaderProgressEvent) => void;\r\n private _requests = new Array<IFileRequestInfo>();\r\n\r\n /**\r\n * Name of the loader (\"gltf\")\r\n */\r\n public readonly name = GLTFFileLoaderMetadata.name;\r\n\r\n /** @internal */\r\n public readonly extensions = GLTFFileLoaderMetadata.extensions;\r\n\r\n /**\r\n * Disposes the loader, releases resources during load, and cancels any outstanding requests.\r\n */\r\n public dispose(): void {\r\n if (this._loader) {\r\n this._loader.dispose();\r\n this._loader = null;\r\n }\r\n\r\n for (const request of this._requests) {\r\n request.abort();\r\n }\r\n\r\n this._requests.length = 0;\r\n\r\n delete this._progressCallback;\r\n\r\n this.preprocessUrlAsync = (url) => Promise.resolve(url);\r\n\r\n this.onMeshLoadedObservable.clear();\r\n this.onSkinLoadedObservable.clear();\r\n this.onTextureLoadedObservable.clear();\r\n this.onMaterialLoadedObservable.clear();\r\n this.onCameraLoadedObservable.clear();\r\n this.onCompleteObservable.clear();\r\n this.onExtensionLoadedObservable.clear();\r\n\r\n this.onDisposeObservable.notifyObservers(undefined);\r\n this.onDisposeObservable.clear();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public loadFile(\r\n scene: Scene,\r\n fileOrUrl: File | string | ArrayBufferView,\r\n rootUrl: string,\r\n onSuccess: (data: unknown, responseURL?: string) => void,\r\n onProgress?: (ev: ISceneLoaderProgressEvent) => void,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void,\r\n name?: string\r\n ): Nullable<IFileRequest> {\r\n if (ArrayBuffer.isView(fileOrUrl)) {\r\n this._loadBinary(scene, fileOrUrl, rootUrl, onSuccess, onError, name);\r\n return null;\r\n }\r\n\r\n this._progressCallback = onProgress;\r\n\r\n const fileName = (fileOrUrl as File).name || Tools.GetFilename(fileOrUrl as string);\r\n\r\n if (useArrayBuffer) {\r\n if (this.useRangeRequests) {\r\n if (this.validate) {\r\n Logger.Warn(\"glTF validation is not supported when range requests are enabled\");\r\n }\r\n\r\n const fileRequest: IFileRequest = {\r\n abort: () => {},\r\n onCompleteObservable: new Observable<IFileRequest>(),\r\n };\r\n\r\n const dataBuffer = {\r\n readAsync: (byteOffset: number, byteLength: number) => {\r\n return new Promise<ArrayBufferView>((resolve, reject) => {\r\n this._loadFile(\r\n scene,\r\n fileOrUrl,\r\n (data) => {\r\n resolve(new Uint8Array(data as ArrayBuffer));\r\n },\r\n true,\r\n (error) => {\r\n reject(error);\r\n },\r\n (webRequest) => {\r\n webRequest.setRequestHeader(\"Range\", `bytes=${byteOffset}-${byteOffset + byteLength - 1}`);\r\n }\r\n );\r\n });\r\n },\r\n byteLength: 0,\r\n };\r\n\r\n this._unpackBinaryAsync(new DataReader(dataBuffer)).then(\r\n (loaderData) => {\r\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\r\n onSuccess(loaderData);\r\n },\r\n onError ? (error) => onError(undefined, error) : undefined\r\n );\r\n\r\n return fileRequest;\r\n }\r\n\r\n return this._loadFile(\r\n scene,\r\n fileOrUrl,\r\n (data) => {\r\n this._validate(scene, new Uint8Array(data as ArrayBuffer, 0, (data as ArrayBuffer).byteLength), rootUrl, fileName);\r\n this._unpackBinaryAsync(\r\n new DataReader({\r\n readAsync: (byteOffset, byteLength) => readAsync(data as ArrayBuffer, byteOffset, byteLength),\r\n byteLength: (data as ArrayBuffer).byteLength,\r\n })\r\n ).then(\r\n (loaderData) => {\r\n onSuccess(loaderData);\r\n },\r\n onError ? (error) => onError(undefined, error) : undefined\r\n );\r\n },\r\n true,\r\n onError\r\n );\r\n } else {\r\n return this._loadFile(\r\n scene,\r\n fileOrUrl,\r\n (data) => {\r\n try {\r\n this._validate(scene, data as string, rootUrl, fileName);\r\n onSuccess({ json: this._parseJson(data as string) });\r\n } catch {\r\n if (onError) {\r\n onError();\r\n }\r\n }\r\n },\r\n false,\r\n onError\r\n );\r\n }\r\n }\r\n\r\n private _loadBinary(\r\n scene: Scene,\r\n data: ArrayBufferView,\r\n rootUrl: string,\r\n onSuccess: (data: unknown, responseURL?: string) => void,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void,\r\n fileName?: string\r\n ): void {\r\n this._validate(scene, new Uint8Array(data.buffer, data.byteOffset, data.byteLength), rootUrl, fileName);\r\n this._unpackBinaryAsync(\r\n new DataReader({\r\n readAsync: (byteOffset, byteLength) => readViewAsync(data, byteOffset, byteLength),\r\n byteLength: data.byteLength,\r\n })\r\n ).then(\r\n (loaderData) => {\r\n onSuccess(loaderData);\r\n },\r\n onError ? (error) => onError(undefined, error) : undefined\r\n );\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public importMeshAsync(\r\n meshesNames: string | readonly string[] | null | undefined,\r\n scene: Scene,\r\n data: IGLTFLoaderData,\r\n rootUrl: string,\r\n onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n fileName?: string\r\n ): Promise<ISceneLoaderAsyncResult> {\r\n return Promise.resolve().then(() => {\r\n this.onParsedObservable.notifyObservers(data);\r\n this.onParsedObservable.clear();\r\n\r\n this._log(`Loading ${fileName || \"\"}`);\r\n this._loader = this._getLoader(data);\r\n return this._loader.importMeshAsync(meshesNames, scene, null, data, rootUrl, onProgress, fileName);\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public loadAsync(scene: Scene, data: IGLTFLoaderData, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string): Promise<void> {\r\n return Promise.resolve().then(() => {\r\n this.onParsedObservable.notifyObservers(data);\r\n this.onParsedObservable.clear();\r\n\r\n this._log(`Loading ${fileName || \"\"}`);\r\n this._loader = this._getLoader(data);\r\n return this._loader.loadAsync(scene, data, rootUrl, onProgress, fileName);\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public loadAssetContainerAsync(\r\n scene: Scene,\r\n data: IGLTFLoaderData,\r\n rootUrl: string,\r\n onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n fileName?: string\r\n ): Promise<AssetContainer> {\r\n return Promise.resolve().then(() => {\r\n this.onParsedObservable.notifyObservers(data);\r\n this.onParsedObservable.clear();\r\n\r\n this._log(`Loading ${fileName || \"\"}`);\r\n this._loader = this._getLoader(data);\r\n\r\n // Prepare the asset container.\r\n const container = new AssetContainer(scene);\r\n\r\n // Get materials/textures when loading to add to container\r\n const materials: Array<Material> = [];\r\n this.onMaterialLoadedObservable.add((material) => {\r\n materials.push(material);\r\n });\r\n const textures: Array<BaseTexture> = [];\r\n this.onTextureLoadedObservable.add((texture) => {\r\n textures.push(texture);\r\n });\r\n const cameras: Array<Camera> = [];\r\n this.onCameraLoadedObservable.add((camera) => {\r\n cameras.push(camera);\r\n });\r\n\r\n const morphTargetManagers: Array<MorphTargetManager> = [];\r\n this.onMeshLoadedObservable.add((mesh) => {\r\n if (mesh.morphTargetManager) {\r\n morphTargetManagers.push(mesh.morphTargetManager);\r\n }\r\n });\r\n\r\n return this._loader.importMeshAsync(null, scene, container, data, rootUrl, onProgress, fileName).then((result) => {\r\n Array.prototype.push.apply(container.geometries, result.geometries);\r\n Array.prototype.push.apply(container.meshes, result.meshes);\r\n Array.prototype.push.apply(container.particleSystems, result.particleSystems);\r\n Array.prototype.push.apply(container.skeletons, result.skeletons);\r\n Array.prototype.push.apply(container.animationGroups, result.animationGroups);\r\n Array.prototype.push.apply(container.materials, materials);\r\n Array.prototype.push.apply(container.textures, textures);\r\n Array.prototype.push.apply(container.lights, result.lights);\r\n Array.prototype.push.apply(container.transformNodes, result.transformNodes);\r\n Array.prototype.push.apply(container.cameras, cameras);\r\n Array.prototype.push.apply(container.morphTargetManagers, morphTargetManagers);\r\n return container;\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public canDirectLoad(data: string): boolean {\r\n return GLTFFileLoaderMetadata.canDirectLoad(data);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public directLoad(scene: Scene, data: string): Promise<object> {\r\n if (\r\n data.startsWith(\"base64,\" + GLTFMagicBase64Encoded) || // this is technically incorrect, but will continue to support for backcompat.\r\n data.startsWith(\";base64,\" + GLTFMagicBase64Encoded) ||\r\n data.startsWith(\"application/octet-stream;base64,\" + GLTFMagicBase64Encoded) ||\r\n data.startsWith(\"model/gltf-binary;base64,\" + GLTFMagicBase64Encoded)\r\n ) {\r\n const arrayBuffer = DecodeBase64UrlToBinary(data);\r\n\r\n this._validate(scene, new Uint8Array(arrayBuffer, 0, arrayBuffer.byteLength));\r\n return this._unpackBinaryAsync(\r\n new DataReader({\r\n readAsync: (byteOffset, byteLength) => readAsync(arrayBuffer, byteOffset, byteLength),\r\n byteLength: arrayBuffer.byteLength,\r\n })\r\n );\r\n }\r\n\r\n this._validate(scene, data);\r\n return Promise.resolve({ json: this._parseJson(data) });\r\n }\r\n\r\n /**\r\n * The callback that allows custom handling of the root url based on the response url.\r\n * @param rootUrl the original root url\r\n * @param responseURL the response url if available\r\n * @returns the new root url\r\n */\r\n public rewriteRootURL?(rootUrl: string, responseURL?: string): string;\r\n\r\n /** @internal */\r\n public createPlugin(options: SceneLoaderPluginOptions): ISceneLoaderPluginAsync {\r\n return new GLTFFileLoader(options[GLTFFileLoaderMetadata.name]);\r\n }\r\n\r\n /**\r\n * The loader state or null if the loader is not active.\r\n */\r\n public get loaderState(): Nullable<GLTFLoaderState> {\r\n return this._state;\r\n }\r\n\r\n /**\r\n * Observable raised when the loader state changes.\r\n */\r\n public onLoaderStateChangedObservable = new Observable<Nullable<GLTFLoaderState>>();\r\n\r\n /**\r\n * Returns a promise that resolves when the asset is completely loaded.\r\n * @returns a promise that resolves when the asset is completely loaded.\r\n */\r\n public whenCompleteAsync(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n this.onCompleteObservable.addOnce(() => {\r\n resolve();\r\n });\r\n this.onErrorObservable.addOnce((reason) => {\r\n reject(reason);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setState(state: GLTFLoaderState): void {\r\n if (this._state === state) {\r\n return;\r\n }\r\n\r\n this._state = state;\r\n this.onLoaderStateChangedObservable.notifyObservers(this._state);\r\n this._log(GLTFLoaderState[this._state]);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _loadFile(\r\n scene: Scene,\r\n fileOrUrl: File | string,\r\n onSuccess: (data: string | ArrayBuffer) => void,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest) => void,\r\n onOpened?: (request: WebRequest) => void\r\n ): IFileRequest {\r\n const request = scene._loadFile(\r\n fileOrUrl,\r\n onSuccess,\r\n (event) => {\r\n this._onProgress(event, request);\r\n },\r\n true,\r\n useArrayBuffer,\r\n onError,\r\n onOpened\r\n ) as IFileRequestInfo;\r\n request.onCompleteObservable.add(() => {\r\n // Force the length computable to be true since we can guarantee the data is loaded.\r\n request._lengthComputable = true;\r\n request._total = request._loaded;\r\n });\r\n this._requests.push(request);\r\n return request;\r\n }\r\n\r\n private _onProgress(event: ProgressEvent, request: IFileRequestInfo): void {\r\n if (!this._progressCallback) {\r\n return;\r\n }\r\n\r\n request._lengthComputable = event.lengthComputable;\r\n request._loaded = event.loaded;\r\n request._total = event.total;\r\n\r\n let lengthComputable = true;\r\n let loaded = 0;\r\n let total = 0;\r\n for (const request of this._requests) {\r\n if (request._lengthComputable === undefined || request._loaded === undefined || request._total === undefined) {\r\n return;\r\n }\r\n\r\n lengthComputable = lengthComputable && request._lengthComputable;\r\n loaded += request._loaded;\r\n total += request._total;\r\n }\r\n\r\n this._progressCallback({\r\n lengthComputable: lengthComputable,\r\n loaded: loaded,\r\n total: lengthComputable ? total : 0,\r\n });\r\n }\r\n\r\n private _validate(scene: Scene, data: string | Uint8Array, rootUrl = \"\", fileName = \"\"): void {\r\n if (!this.validate) {\r\n return;\r\n }\r\n\r\n this._startPerformanceCounter(\"Validate JSON\");\r\n GLTFValidation.ValidateAsync(data, rootUrl, fileName, (uri) => {\r\n return this.preprocessUrlAsync(rootUrl + uri).then((url) => {\r\n return scene._loadFileAsync(url, undefined, true, true).then((data) => {\r\n return new Uint8Array(data, 0, data.byteLength);\r\n });\r\n });\r\n }).then(\r\n (result) => {\r\n this._endPerformanceCounter(\"Validate JSON\");\r\n this.onValidatedObservable.notifyObservers(result);\r\n this.onValidatedObservable.clear();\r\n },\r\n (reason) => {\r\n this._endPerformanceCounter(\"Validate JSON\");\r\n Tools.Warn(`Failed to validate: ${reason.message}`);\r\n this.onValidatedObservable.clear();\r\n }\r\n );\r\n }\r\n\r\n private _getLoader(loaderData: IGLTFLoaderData): IGLTFLoader {\r\n const asset = (<any>loaderData.json).asset || {};\r\n\r\n this._log(`Asset version: ${asset.version}`);\r\n asset.minVersion && this._log(`Asset minimum version: ${asset.minVersion}`);\r\n asset.generator && this._log(`Asset generator: ${asset.generator}`);\r\n\r\n const version = GLTFFileLoader._parseVersion(asset.version);\r\n if (!version) {\r\n throw new Error(\"Invalid version: \" + asset.version);\r\n }\r\n\r\n if (asset.minVersion !== undefined) {\r\n const minVersion = GLTFFileLoader._parseVersion(asset.minVersion);\r\n if (!minVersion) {\r\n throw new Error(\"Invalid minimum version: \" + asset.minVersion);\r\n }\r\n\r\n if (GLTFFileLoader._compareVersion(minVersion, { major: 2, minor: 0 }) > 0) {\r\n throw new Error(\"Incompatible minimum version: \" + asset.minVersion);\r\n }\r\n }\r\n\r\n const createLoaders: { [key: number]: (parent: GLTFFileLoader) => IGLTFLoader } = {\r\n 1: GLTFFileLoader._CreateGLTF1Loader,\r\n 2: GLTFFileLoader._CreateGLTF2Loader,\r\n };\r\n\r\n const createLoader = createLoaders[version.major];\r\n if (!createLoader) {\r\n throw new Error(\"Unsupported version: \" + asset.version);\r\n }\r\n\r\n return createLoader(this);\r\n }\r\n\r\n private _parseJson(json: string): object {\r\n this._startPerformanceCounter(\"Parse JSON\");\r\n this._log(`JSON length: ${json.length}`);\r\n const parsed = JSON.parse(json);\r\n this._endPerformanceCounter(\"Parse JSON\");\r\n return parsed;\r\n }\r\n\r\n private _unpackBinaryAsync(dataReader: DataReader): Promise<IGLTFLoaderData> {\r\n this._startPerformanceCounter(\"Unpack Binary\");\r\n\r\n // Read magic + version + length + json length + json format\r\n return dataReader.loadAsync(20).then(() => {\r\n const Binary = {\r\n Magic: 0x46546c67,\r\n };\r\n\r\n const magic = dataReader.readUint32();\r\n if (magic !== Binary.Magic) {\r\n throw new RuntimeError(\"Unexpected magic: \" + magic, ErrorCodes.GLTFLoaderUnexpectedMagicError);\r\n }\r\n\r\n const version = dataReader.readUint32();\r\n\r\n if (this.loggingEnabled) {\r\n this._log(`Binary version: ${version}`);\r\n }\r\n\r\n const length = dataReader.readUint32();\r\n if (!this.useRangeRequests && length !== dataReader.buffer.byteLength) {\r\n Logger.Warn(`Length in header does not match actual data length: ${length} != ${dataReader.buffer.byteLength}`);\r\n }\r\n\r\n let unpacked: Promise<IGLTFLoaderData>;\r\n switch (version) {\r\n case 1: {\r\n unpacked = this._unpackBinaryV1Async(dataReader, length);\r\n break;\r\n }\r\n case 2: {\r\n unpacked = this._unpackBinaryV2Async(dataReader, length);\r\n break;\r\n }\r\n default: {\r\n throw new Error(\"Unsupported version: \" + version);\r\n }\r\n }\r\n\r\n this._endPerformanceCounter(\"Unpack Binary\");\r\n\r\n return unpacked;\r\n });\r\n }\r\n\r\n private _unpackBinaryV1Async(dataReader: DataReader, length: number): Promise<IGLTFLoaderData> {\r\n const ContentFormat = {\r\n JSON: 0,\r\n };\r\n\r\n const contentLength = dataReader.readUint32();\r\n const contentFormat = dataReader.readUint32();\r\n\r\n if (contentFormat !== ContentFormat.JSON) {\r\n throw new Error(`Unexpected content format: ${contentFormat}`);\r\n }\r\n\r\n const bodyLength = length - dataReader.byteOffset;\r\n\r\n const data: IGLTFLoaderData = { json: this._parseJson(dataReader.readString(contentLength)), bin: null };\r\n if (bodyLength !== 0) {\r\n const startByteOffset = dataReader.byteOffset;\r\n data.bin = {\r\n readAsync: (byteOffset, byteLength) => dataReader.buffer.readAsync(startByteOffset + byteOffset, byteLength),\r\n byteLength: bodyLength,\r\n };\r\n }\r\n\r\n return Promise.resolve(data);\r\n }\r\n\r\n private _unpackBinaryV2Async(dataReader: DataReader, length: number): Promise<IGLTFLoaderData> {\r\n const ChunkFormat = {\r\n JSON: 0x4e4f534a,\r\n BIN: 0x004e4942,\r\n };\r\n\r\n // Read the JSON chunk header.\r\n const chunkLength = dataReader.readUint32();\r\n const chunkFormat = dataReader.readUint32();\r\n if (chunkFormat !== ChunkFormat.JSON) {\r\n throw new Error(\"First chunk format is not JSON\");\r\n }\r\n\r\n // Bail if there are no other chunks.\r\n if (dataReader.byteOffset + chunkLength === length) {\r\n return dataReader.loadAsync(chunkLength).then(() => {\r\n return { json: this._parseJson(dataReader.readString(chunkLength)), bin: null };\r\n });\r\n }\r\n\r\n // Read the JSON chunk and the length and type of the next chunk.\r\n return dataReader.loadAsync(chunkLength + 8).then(() => {\r\n const data: IGLTFLoaderData = { json: this._parseJson(dataReader.readString(chunkLength)), bin: null };\r\n\r\n const readAsync = (): Promise<IGLTFLoaderData> => {\r\n const chunkLength = dataReader.readUint32();\r\n const chunkFormat = dataReader.readUint32();\r\n\r\n switch (chunkFormat) {\r\n case ChunkFormat.JSON: {\r\n throw new Error(\"Unexpected JSON chunk\");\r\n }\r\n case ChunkFormat.BIN: {\r\n const startByteOffset = dataReader.byteOffset;\r\n data.bin = {\r\n readAsync: (byteOffset, byteLength) => dataReader.buffer.readAsync(startByteOffset + byteOffset, byteLength),\r\n byteLength: chunkLength,\r\n };\r\n dataReader.skipBytes(chunkLength);\r\n break;\r\n }\r\n default: {\r\n // ignore unrecognized chunkFormat\r\n dataReader.skipBytes(chunkLength);\r\n break;\r\n }\r\n }\r\n\r\n if (dataReader.byteOffset !== length) {\r\n return dataReader.loadAsync(8).then(readAsync);\r\n }\r\n\r\n return Promise.resolve(data);\r\n };\r\n\r\n return readAsync();\r\n });\r\n }\r\n\r\n private static _parseVersion(version: string): Nullable<{ major: number; minor: number }> {\r\n if (version === \"1.0\" || version === \"1.0.1\") {\r\n return {\r\n major: 1,\r\n minor: 0,\r\n };\r\n }\r\n\r\n const match = (version + \"\").match(/^(\\d+)\\.(\\d+)/);\r\n if (!match) {\r\n return null;\r\n }\r\n\r\n return {\r\n major: parseInt(match[1]),\r\n minor: parseInt(match[2]),\r\n };\r\n }\r\n\r\n private static _compareVersion(a: { major: number; minor: number }, b: { major: number; minor: number }): number {\r\n if (a.major > b.major) {\r\n return 1;\r\n }\r\n if (a.major < b.major) {\r\n return -1;\r\n }\r\n if (a.minor > b.minor) {\r\n return 1;\r\n }\r\n if (a.minor < b.minor) {\r\n return -1;\r\n }\r\n return 0;\r\n }\r\n\r\n private static readonly _logSpaces = \" \";\r\n private _logIndentLevel = 0;\r\n private _loggingEnabled = false;\r\n\r\n /** @internal */\r\n public _log = this._logDisabled;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _logOpen(message: string): void {\r\n this._log(message);\r\n this._logIndentLevel++;\r\n }\r\n\r\n /** @internal */\r\n public _logClose(): void {\r\n --this._logIndentLevel;\r\n }\r\n\r\n private _logEnabled(message: string): void {\r\n const spaces = GLTFFileLoader._logSpaces.substring(0, this._logIndentLevel * 2);\r\n Logger.Log(`${spaces}${message}`);\r\n }\r\n\r\n private _logDisabled(message: string): void {}\r\n\r\n private _capturePerformanceCounters = false;\r\n\r\n /** @internal */\r\n public _startPerformanceCounter = this._startPerformanceCounterDisabled;\r\n\r\n /** @internal */\r\n public _endPerformanceCounter = this._endPerformanceCounterDisabled;\r\n\r\n private _startPerformanceCounterEnabled(counterName: string): void {\r\n Tools.StartPerformanceCounter(counterName);\r\n }\r\n\r\n private _startPerformanceCounterDisabled(counterName: string): void {}\r\n\r\n private _endPerformanceCounterEnabled(counterName: string): void {\r\n Tools.EndPerformanceCounter(counterName);\r\n }\r\n\r\n private _endPerformanceCounterDisabled(counterName: string): void {}\r\n}\r\n\r\nRegisterSceneLoaderPlugin(new GLTFFileLoader());\r\n"]}
1
+ {"version":3,"file":"glTFFileLoader.js","sourceRoot":"","sources":["../../../../dev/loaders/src/glTF/glTFFileLoader.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable github/no-then */\r\n/* eslint-disable @typescript-eslint/no-floating-promises */\r\n/* eslint-disable @typescript-eslint/prefer-promise-reject-errors */\r\n/* eslint-disable no-restricted-syntax */\r\n/* eslint-disable @typescript-eslint/promise-function-async */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type * as GLTF2 from \"babylonjs-gltf2interface\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport type { ISceneLoaderPluginFactory, ISceneLoaderPluginAsync, ISceneLoaderProgressEvent, ISceneLoaderAsyncResult, SceneLoaderPluginOptions } from \"core/Loading/sceneLoader\";\r\nimport { RegisterSceneLoaderPlugin } from \"core/Loading/sceneLoader\";\r\nimport { AssetContainer } from \"core/assetContainer\";\r\nimport type { Scene, IDisposable } from \"core/scene\";\r\nimport type { WebRequest } from \"core/Misc/webRequest\";\r\nimport type { IFileRequest } from \"core/Misc/fileRequest\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport type { IDataBuffer } from \"core/Misc/dataReader\";\r\nimport { DataReader } from \"core/Misc/dataReader\";\r\nimport { GLTFValidation } from \"./glTFValidation\";\r\nimport { GLTFFileLoaderMetadata, GLTFMagicBase64Encoded } from \"./glTFFileLoader.metadata\";\r\nimport type { LoadFileError } from \"core/Misc/fileTools\";\r\nimport { DecodeBase64UrlToBinary } from \"core/Misc/fileTools\";\r\nimport { RuntimeError, ErrorCodes } from \"core/Misc/error\";\r\nimport type { TransformNode } from \"core/Meshes/transformNode\";\r\nimport type { MorphTargetManager } from \"core/Morph/morphTargetManager\";\r\n\r\n/**\r\n * Defines options for glTF loader extensions. This interface is extended by specific extensions.\r\n */\r\nexport interface GLTFLoaderExtensionOptions extends Record<string, Record<string, unknown> | undefined> {}\r\n\r\ndeclare module \"core/Loading/sceneLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc\r\n export interface SceneLoaderPluginOptions {\r\n /**\r\n * Defines options for the glTF loader.\r\n */\r\n [GLTFFileLoaderMetadata.name]: Partial<GLTFLoaderOptions>;\r\n }\r\n}\r\n\r\ninterface IFileRequestInfo extends IFileRequest {\r\n _lengthComputable?: boolean;\r\n _loaded?: number;\r\n _total?: number;\r\n}\r\n\r\nfunction readAsync(arrayBuffer: ArrayBuffer, byteOffset: number, byteLength: number): Promise<Uint8Array> {\r\n try {\r\n return Promise.resolve(new Uint8Array(arrayBuffer, byteOffset, byteLength));\r\n } catch (e) {\r\n return Promise.reject(e);\r\n }\r\n}\r\n\r\nfunction readViewAsync(arrayBufferView: ArrayBufferView, byteOffset: number, byteLength: number): Promise<Uint8Array> {\r\n try {\r\n if (byteOffset < 0 || byteOffset >= arrayBufferView.byteLength) {\r\n throw new RangeError(\"Offset is out of range.\");\r\n }\r\n\r\n if (byteOffset + byteLength > arrayBufferView.byteLength) {\r\n throw new RangeError(\"Length is out of range.\");\r\n }\r\n\r\n return Promise.resolve(new Uint8Array(arrayBufferView.buffer, arrayBufferView.byteOffset + byteOffset, byteLength));\r\n } catch (e) {\r\n return Promise.reject(e);\r\n }\r\n}\r\n\r\n/**\r\n * Mode that determines the coordinate system to use.\r\n */\r\nexport enum GLTFLoaderCoordinateSystemMode {\r\n /**\r\n * Automatically convert the glTF right-handed data to the appropriate system based on the current coordinate system mode of the scene.\r\n */\r\n AUTO,\r\n\r\n /**\r\n * Sets the useRightHandedSystem flag on the scene.\r\n */\r\n FORCE_RIGHT_HANDED,\r\n}\r\n\r\n/**\r\n * Mode that determines what animations will start.\r\n */\r\nexport enum GLTFLoaderAnimationStartMode {\r\n /**\r\n * No animation will start.\r\n */\r\n NONE,\r\n\r\n /**\r\n * The first animation will start.\r\n */\r\n FIRST,\r\n\r\n /**\r\n * All animations will start.\r\n */\r\n ALL,\r\n}\r\n\r\n/**\r\n * Interface that contains the data for the glTF asset.\r\n */\r\nexport interface IGLTFLoaderData {\r\n /**\r\n * The object that represents the glTF JSON.\r\n */\r\n json: object;\r\n\r\n /**\r\n * The BIN chunk of a binary glTF.\r\n */\r\n bin: Nullable<IDataBuffer>;\r\n}\r\n\r\n/**\r\n * Interface for extending the loader.\r\n */\r\nexport interface IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n readonly name: string;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n enabled: boolean;\r\n\r\n /**\r\n * Defines the order of this extension.\r\n * The loader sorts the extensions using these values when loading.\r\n */\r\n order?: number;\r\n}\r\n\r\n/**\r\n * Loader state.\r\n */\r\nexport enum GLTFLoaderState {\r\n /**\r\n * The asset is loading.\r\n */\r\n LOADING,\r\n\r\n /**\r\n * The asset is ready for rendering.\r\n */\r\n READY,\r\n\r\n /**\r\n * The asset is completely loaded.\r\n */\r\n COMPLETE,\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFLoader extends IDisposable {\r\n importMeshAsync: (\r\n meshesNames: string | readonly string[] | null | undefined,\r\n scene: Scene,\r\n container: Nullable<AssetContainer>,\r\n data: IGLTFLoaderData,\r\n rootUrl: string,\r\n onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n fileName?: string\r\n ) => Promise<ISceneLoaderAsyncResult>;\r\n loadAsync: (scene: Scene, data: IGLTFLoaderData, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string) => Promise<void>;\r\n}\r\n\r\n/**\r\n * Adds default/implicit options to extension specific options.\r\n */\r\ntype DefaultExtensionOptions<BaseExtensionOptions> = {\r\n /**\r\n * Defines if the extension is enabled\r\n */\r\n enabled?: boolean;\r\n} & BaseExtensionOptions;\r\n\r\n/**\r\n * This class contains all the concrete (not abstract) glTF options, excluding callbacks.\r\n * The purpose of this class is to make it easy to provide a way to mutate the default\r\n * loader options (see the GLTFLoaderDefaultOptions instance below) without duplicating\r\n * all the options in yet another object. Since this class is instantiated for the default\r\n * options object, abstract properties and callbacks are not included, it's more just\r\n * flag-type options.\r\n */\r\nclass GLTFLoaderBaseOptions {\r\n /**\r\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.\r\n */\r\n public alwaysComputeBoundingBox = false;\r\n\r\n /**\r\n * Defines if the loader should always compute the nearest common ancestor of the skeleton joints instead of using `skin.skeleton`. Defaults to false.\r\n * Set this to true if loading assets with invalid `skin.skeleton` values.\r\n */\r\n public alwaysComputeSkeletonRootNode = false;\r\n\r\n /**\r\n * The animation start mode. Defaults to FIRST.\r\n */\r\n public animationStartMode = GLTFLoaderAnimationStartMode.FIRST;\r\n\r\n /**\r\n * Defines if the loader should compile materials before raising the success callback. Defaults to false.\r\n */\r\n public compileMaterials = false;\r\n\r\n /**\r\n * Defines if the loader should compile shadow generators before raising the success callback. Defaults to false.\r\n */\r\n public compileShadowGenerators = false;\r\n\r\n /**\r\n * The coordinate system mode. Defaults to AUTO.\r\n */\r\n public coordinateSystemMode = GLTFLoaderCoordinateSystemMode.AUTO;\r\n\r\n /**\r\n * Defines if the loader should create instances when multiple glTF nodes point to the same glTF mesh. Defaults to true.\r\n */\r\n public createInstances = true;\r\n\r\n /**\r\n * If true, load all materials defined in the file, even if not used by any mesh. Defaults to false.\r\n */\r\n public loadAllMaterials = false;\r\n\r\n /**\r\n * Defines if the loader should load morph targets. Defaults to true.\r\n */\r\n public loadMorphTargets = true;\r\n\r\n /**\r\n * Defines if the loader should load node animations. Defaults to true.\r\n * NOTE: The animation of this node will still load if the node is also a joint of a skin and `loadSkins` is true.\r\n */\r\n public loadNodeAnimations = true;\r\n\r\n /**\r\n * If true, load only the materials defined in the file. Defaults to false.\r\n */\r\n public loadOnlyMaterials = false;\r\n\r\n /**\r\n * Defines if the loader should load skins. Defaults to true.\r\n */\r\n public loadSkins = true;\r\n\r\n /**\r\n * If true, do not load any materials defined in the file. Defaults to false.\r\n */\r\n public skipMaterials = false;\r\n\r\n /**\r\n * When loading glTF animations, which are defined in seconds, target them to this FPS. Defaults to 60.\r\n */\r\n public targetFps = 60;\r\n\r\n /**\r\n * Defines if the Alpha blended materials are only applied as coverage.\r\n * If false, (default) The luminance of each pixel will reduce its opacity to simulate the behaviour of most physical materials.\r\n * If true, no extra effects are applied to transparent pixels.\r\n */\r\n public transparencyAsCoverage = false;\r\n\r\n /**\r\n * Defines if the loader should also compile materials with clip planes. Defaults to false.\r\n */\r\n public useClipPlane = false;\r\n\r\n /**\r\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.\r\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.\r\n */\r\n public useGltfTextureNames = false;\r\n\r\n /**\r\n * Defines if the loader should use range requests when load binary glTF files from HTTP.\r\n * Enabling will disable offline support and glTF validator.\r\n * Defaults to false.\r\n */\r\n public useRangeRequests = false;\r\n\r\n /**\r\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.\r\n */\r\n public useSRGBBuffers = true;\r\n\r\n /**\r\n * Defines if the loader should validate the asset.\r\n */\r\n public validate = false;\r\n\r\n /**\r\n * Load the glTF files using the OpenPBR material.\r\n * @experimental\r\n */\r\n public useOpenPBR = false;\r\n}\r\n\r\n/**\r\n * The default GLTF loader options.\r\n * Override the properties of this object to globally change the default loader options.\r\n * To specify options for a specific load call, pass those options into the associated load function.\r\n */\r\nexport const GLTFLoaderDefaultOptions = new GLTFLoaderBaseOptions();\r\n\r\nabstract class GLTFLoaderOptions extends GLTFLoaderBaseOptions {\r\n // eslint-disable-next-line babylonjs/available\r\n protected copyFrom(options?: Partial<Readonly<GLTFLoaderOptions>>) {\r\n if (options) {\r\n this.alwaysComputeBoundingBox = options.alwaysComputeBoundingBox ?? this.alwaysComputeBoundingBox;\r\n this.alwaysComputeSkeletonRootNode = options.alwaysComputeSkeletonRootNode ?? this.alwaysComputeSkeletonRootNode;\r\n this.animationStartMode = options.animationStartMode ?? this.animationStartMode;\r\n this.capturePerformanceCounters = options.capturePerformanceCounters ?? this.capturePerformanceCounters;\r\n this.compileMaterials = options.compileMaterials ?? this.compileMaterials;\r\n this.compileShadowGenerators = options.compileShadowGenerators ?? this.compileShadowGenerators;\r\n this.coordinateSystemMode = options.coordinateSystemMode ?? this.coordinateSystemMode;\r\n this.createInstances = options.createInstances ?? this.createInstances;\r\n this.customRootNode = options.customRootNode;\r\n this.extensionOptions = options.extensionOptions ?? this.extensionOptions;\r\n this.loadAllMaterials = options.loadAllMaterials ?? this.loadAllMaterials;\r\n this.loadMorphTargets = options.loadMorphTargets ?? this.loadMorphTargets;\r\n this.loadNodeAnimations = options.loadNodeAnimations ?? this.loadNodeAnimations;\r\n this.loadOnlyMaterials = options.loadOnlyMaterials ?? this.loadOnlyMaterials;\r\n this.loadSkins = options.loadSkins ?? this.loadSkins;\r\n this.loggingEnabled = options.loggingEnabled ?? this.loggingEnabled;\r\n this.onCameraLoaded = options.onCameraLoaded;\r\n this.onMaterialLoaded = options.onMaterialLoaded;\r\n this.onMeshLoaded = options.onMeshLoaded;\r\n this.onParsed = options.onParsed;\r\n this.onSkinLoaded = options.onSkinLoaded;\r\n this.onTextureLoaded = options.onTextureLoaded;\r\n this.onValidated = options.onValidated;\r\n this.preprocessUrlAsync = options.preprocessUrlAsync ?? this.preprocessUrlAsync;\r\n this.skipMaterials = options.skipMaterials ?? this.skipMaterials;\r\n this.targetFps = options.targetFps ?? this.targetFps;\r\n this.transparencyAsCoverage = options.transparencyAsCoverage ?? this.transparencyAsCoverage;\r\n this.useClipPlane = options.useClipPlane ?? this.useClipPlane;\r\n this.useGltfTextureNames = options.useGltfTextureNames ?? this.useGltfTextureNames;\r\n this.useOpenPBR = options.useOpenPBR ?? this.useOpenPBR;\r\n this.useRangeRequests = options.useRangeRequests ?? this.useRangeRequests;\r\n this.useSRGBBuffers = options.useSRGBBuffers ?? this.useSRGBBuffers;\r\n this.validate = options.validate ?? this.validate;\r\n }\r\n }\r\n\r\n // --------------\r\n // Common options\r\n // --------------\r\n\r\n /**\r\n * Raised when the asset has been parsed\r\n */\r\n public abstract onParsed?: ((loaderData: IGLTFLoaderData) => void) | undefined;\r\n\r\n // ----------\r\n // V2 options\r\n // ----------\r\n\r\n /**\r\n * Defines if the loader should capture performance counters.\r\n */\r\n public abstract capturePerformanceCounters: boolean;\r\n\r\n /**\r\n * Defines the node to use as the root of the hierarchy when loading the scene (default: undefined). If not defined, a root node will be automatically created.\r\n * You can also pass null if you don't want a root node to be created.\r\n */\r\n public customRootNode?: Nullable<TransformNode>;\r\n\r\n /**\r\n * Defines options for glTF extensions.\r\n */\r\n public extensionOptions: {\r\n // NOTE: This type is doing two things:\r\n // 1. Adding an implicit 'enabled' property to the options for each extension.\r\n // 2. Creating a mapped type of all the options of all the extensions to make it just look like a consolidated plain object in intellisense for the user.\r\n [Extension in keyof GLTFLoaderExtensionOptions]?: {\r\n [Option in keyof DefaultExtensionOptions<GLTFLoaderExtensionOptions[Extension]>]: DefaultExtensionOptions<GLTFLoaderExtensionOptions[Extension]>[Option];\r\n };\r\n } = {};\r\n\r\n /**\r\n * If true, enable logging for the loader. Defaults to false.\r\n */\r\n public abstract loggingEnabled: boolean;\r\n\r\n /**\r\n * Callback raised when the loader creates a camera after parsing the glTF properties of the camera.\r\n */\r\n public abstract onCameraLoaded?: (camera: Camera) => void;\r\n\r\n /**\r\n * Callback raised when the loader creates a material after parsing the glTF properties of the material.\r\n */\r\n public abstract onMaterialLoaded?: (material: Material) => void;\r\n\r\n /**\r\n * Callback raised when the loader creates a mesh after parsing the glTF properties of the mesh.\r\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, ...)\r\n */\r\n public abstract onMeshLoaded?: (mesh: AbstractMesh) => void;\r\n\r\n /**\r\n * Callback raised when the loader creates a skin after parsing the glTF properties of the skin node.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/importers/glTF/glTFSkinning#ignoring-the-transform-of-the-skinned-mesh\r\n */\r\n public abstract onSkinLoaded?: (node: TransformNode, skinnedNode: TransformNode) => void;\r\n\r\n /**\r\n * Callback raised when the loader creates a texture after parsing the glTF properties of the texture.\r\n */\r\n public abstract onTextureLoaded?: (texture: BaseTexture) => void;\r\n\r\n /**\r\n * Callback raised after the asset is validated.\r\n */\r\n public abstract onValidated?: (results: GLTF2.IGLTFValidationResults) => void;\r\n\r\n /**\r\n * Function called before loading a url referenced by the asset.\r\n * @param url url referenced by the asset\r\n * @returns Async url to load\r\n */\r\n public preprocessUrlAsync = (url: string) => Promise.resolve(url);\r\n}\r\n\r\n/**\r\n * File loader for loading glTF files into a scene.\r\n */\r\nexport class GLTFFileLoader extends GLTFLoaderOptions implements IDisposable, ISceneLoaderPluginAsync, ISceneLoaderPluginFactory {\r\n /** @internal */\r\n public static _CreateGLTF1Loader: (parent: GLTFFileLoader) => IGLTFLoader;\r\n\r\n /** @internal */\r\n public static _CreateGLTF2Loader: (parent: GLTFFileLoader) => IGLTFLoader;\r\n\r\n /**\r\n * Creates a new glTF file loader.\r\n * @param options The options for the loader\r\n */\r\n public constructor(options?: Partial<Readonly<GLTFLoaderOptions>>) {\r\n super();\r\n this.copyFrom(Object.assign({ ...GLTFLoaderDefaultOptions }, options));\r\n }\r\n\r\n // --------------------\r\n // Begin Common options\r\n // --------------------\r\n\r\n /**\r\n * Raised when the asset has been parsed\r\n */\r\n public onParsedObservable = new Observable<IGLTFLoaderData>();\r\n\r\n private _onParsedObserver: Nullable<Observer<IGLTFLoaderData>>;\r\n\r\n /**\r\n * Raised when the asset has been parsed\r\n */\r\n public set onParsed(callback: ((loaderData: IGLTFLoaderData) => void) | undefined) {\r\n if (this._onParsedObserver) {\r\n this.onParsedObservable.remove(this._onParsedObserver);\r\n }\r\n if (callback) {\r\n this._onParsedObserver = this.onParsedObservable.add(callback);\r\n }\r\n }\r\n\r\n // ------------------\r\n // End Common options\r\n // ------------------\r\n\r\n // ----------------\r\n // Begin V1 options\r\n // ----------------\r\n\r\n /**\r\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.\r\n * Textures always loads asynchronously. For example, the success callback can compute the bounding information of the loaded meshes when incremental loading is disabled.\r\n * Defaults to true.\r\n * @internal\r\n */\r\n public static IncrementalLoading = true;\r\n\r\n /**\r\n * Set this property to true in order to work with homogeneous coordinates, available with some converters and exporters.\r\n * Defaults to false. See https://en.wikipedia.org/wiki/Homogeneous_coordinates.\r\n * @internal\r\n */\r\n public static HomogeneousCoordinates = false;\r\n\r\n // --------------\r\n // End V1 options\r\n // --------------\r\n\r\n /**\r\n * Observable raised when the loader creates a mesh after parsing the glTF properties of the mesh.\r\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, ...)\r\n */\r\n public readonly onMeshLoadedObservable = new Observable<AbstractMesh>();\r\n\r\n private _onMeshLoadedObserver: Nullable<Observer<AbstractMesh>>;\r\n\r\n /**\r\n * Callback raised when the loader creates a mesh after parsing the glTF properties of the mesh.\r\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, ...)\r\n */\r\n public set onMeshLoaded(callback: ((mesh: AbstractMesh) => void) | undefined) {\r\n if (this._onMeshLoadedObserver) {\r\n this.onMeshLoadedObservable.remove(this._onMeshLoadedObserver);\r\n }\r\n if (callback) {\r\n this._onMeshLoadedObserver = this.onMeshLoadedObservable.add(callback);\r\n }\r\n }\r\n\r\n /**\r\n * Observable raised when the loader creates a skin after parsing the glTF properties of the skin node.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/importers/glTF/glTFSkinning#ignoring-the-transform-of-the-skinned-mesh\r\n * @param node - the transform node that corresponds to the original glTF skin node used for animations\r\n * @param skinnedNode - the transform node that is the skinned mesh itself or the parent of the skinned meshes\r\n */\r\n public readonly onSkinLoadedObservable = new Observable<{ node: TransformNode; skinnedNode: TransformNode }>();\r\n\r\n private _onSkinLoadedObserver: Nullable<Observer<{ node: TransformNode; skinnedNode: TransformNode }>>;\r\n\r\n /**\r\n * Callback raised when the loader creates a skin after parsing the glTF properties of the skin node.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/importers/glTF/glTFSkinning#ignoring-the-transform-of-the-skinned-mesh\r\n */\r\n public set onSkinLoaded(callback: ((node: TransformNode, skinnedNode: TransformNode) => void) | undefined) {\r\n if (this._onSkinLoadedObserver) {\r\n this.onSkinLoadedObservable.remove(this._onSkinLoadedObserver);\r\n }\r\n if (callback) {\r\n this._onSkinLoadedObserver = this.onSkinLoadedObservable.add((data) => callback(data.node, data.skinnedNode));\r\n }\r\n }\r\n\r\n /**\r\n * Observable raised when the loader creates a texture after parsing the glTF properties of the texture.\r\n */\r\n public readonly onTextureLoadedObservable = new Observable<BaseTexture>();\r\n\r\n private _onTextureLoadedObserver: Nullable<Observer<BaseTexture>>;\r\n\r\n /**\r\n * Callback raised when the loader creates a texture after parsing the glTF properties of the texture.\r\n */\r\n public set onTextureLoaded(callback: ((texture: BaseTexture) => void) | undefined) {\r\n if (this._onTextureLoadedObserver) {\r\n this.onTextureLoadedObservable.remove(this._onTextureLoadedObserver);\r\n }\r\n if (callback) {\r\n this._onTextureLoadedObserver = this.onTextureLoadedObservable.add(callback);\r\n }\r\n }\r\n\r\n /**\r\n * Observable raised when the loader creates a material after parsing the glTF properties of the material.\r\n */\r\n public readonly onMaterialLoadedObservable = new Observable<Material>();\r\n\r\n private _onMaterialLoadedObserver: Nullable<Observer<Material>>;\r\n\r\n /**\r\n * Callback raised when the loader creates a material after parsing the glTF properties of the material.\r\n */\r\n public set onMaterialLoaded(callback: ((material: Material) => void) | undefined) {\r\n if (this._onMaterialLoadedObserver) {\r\n this.onMaterialLoadedObservable.remove(this._onMaterialLoadedObserver);\r\n }\r\n if (callback) {\r\n this._onMaterialLoadedObserver = this.onMaterialLoadedObservable.add(callback);\r\n }\r\n }\r\n\r\n /**\r\n * Observable raised when the loader creates a camera after parsing the glTF properties of the camera.\r\n */\r\n public readonly onCameraLoadedObservable = new Observable<Camera>();\r\n\r\n private _onCameraLoadedObserver: Nullable<Observer<Camera>>;\r\n\r\n /**\r\n * Callback raised when the loader creates a camera after parsing the glTF properties of the camera.\r\n */\r\n public set onCameraLoaded(callback: ((camera: Camera) => void) | undefined) {\r\n if (this._onCameraLoadedObserver) {\r\n this.onCameraLoadedObservable.remove(this._onCameraLoadedObserver);\r\n }\r\n if (callback) {\r\n this._onCameraLoadedObserver = this.onCameraLoadedObservable.add(callback);\r\n }\r\n }\r\n\r\n /**\r\n * Observable raised when the asset is completely loaded, immediately before the loader is disposed.\r\n * For assets with LODs, raised when all of the LODs are complete.\r\n * For assets without LODs, raised when the model is complete, immediately after the loader resolves the returned promise.\r\n */\r\n public readonly onCompleteObservable = new Observable<void>();\r\n\r\n private _onCompleteObserver: Nullable<Observer<void>>;\r\n\r\n /**\r\n * Callback raised when the asset is completely loaded, immediately before the loader is disposed.\r\n * For assets with LODs, raised when all of the LODs are complete.\r\n * For assets without LODs, raised when the model is complete, immediately after the loader resolves the returned promise.\r\n */\r\n public set onComplete(callback: () => void) {\r\n if (this._onCompleteObserver) {\r\n this.onCompleteObservable.remove(this._onCompleteObserver);\r\n }\r\n this._onCompleteObserver = this.onCompleteObservable.add(callback);\r\n }\r\n\r\n /**\r\n * Observable raised when an error occurs.\r\n */\r\n public readonly onErrorObservable = new Observable<any>();\r\n\r\n private _onErrorObserver: Nullable<Observer<any>>;\r\n\r\n /**\r\n * Callback raised when an error occurs.\r\n */\r\n public set onError(callback: (reason: any) => void) {\r\n if (this._onErrorObserver) {\r\n this.onErrorObservable.remove(this._onErrorObserver);\r\n }\r\n this._onErrorObserver = this.onErrorObservable.add(callback);\r\n }\r\n\r\n /**\r\n * Observable raised after the loader is disposed.\r\n */\r\n public readonly onDisposeObservable = new Observable<void>();\r\n\r\n private _onDisposeObserver: Nullable<Observer<void>>;\r\n\r\n /**\r\n * Callback raised after the loader is disposed.\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n /**\r\n * Observable raised after a loader extension is created.\r\n * Set additional options for a loader extension in this event.\r\n */\r\n public readonly onExtensionLoadedObservable = new Observable<IGLTFLoaderExtension>();\r\n\r\n private _onExtensionLoadedObserver: Nullable<Observer<IGLTFLoaderExtension>>;\r\n\r\n /**\r\n * Callback raised after a loader extension is created.\r\n */\r\n public set onExtensionLoaded(callback: (extension: IGLTFLoaderExtension) => void) {\r\n if (this._onExtensionLoadedObserver) {\r\n this.onExtensionLoadedObservable.remove(this._onExtensionLoadedObserver);\r\n }\r\n this._onExtensionLoadedObserver = this.onExtensionLoadedObservable.add(callback);\r\n }\r\n\r\n /**\r\n * Defines if the loader logging is enabled.\r\n */\r\n public get loggingEnabled(): boolean {\r\n return this._loggingEnabled;\r\n }\r\n\r\n public set loggingEnabled(value: boolean) {\r\n if (this._loggingEnabled === value) {\r\n return;\r\n }\r\n\r\n this._loggingEnabled = value;\r\n\r\n if (this._loggingEnabled) {\r\n this._log = this._logEnabled;\r\n } else {\r\n this._log = this._logDisabled;\r\n }\r\n }\r\n\r\n /**\r\n * Defines if the loader should capture performance counters.\r\n */\r\n public get capturePerformanceCounters(): boolean {\r\n return this._capturePerformanceCounters;\r\n }\r\n\r\n public set capturePerformanceCounters(value: boolean) {\r\n if (this._capturePerformanceCounters === value) {\r\n return;\r\n }\r\n\r\n this._capturePerformanceCounters = value;\r\n\r\n if (this._capturePerformanceCounters) {\r\n this._startPerformanceCounter = this._startPerformanceCounterEnabled;\r\n this._endPerformanceCounter = this._endPerformanceCounterEnabled;\r\n } else {\r\n this._startPerformanceCounter = this._startPerformanceCounterDisabled;\r\n this._endPerformanceCounter = this._endPerformanceCounterDisabled;\r\n }\r\n }\r\n\r\n /**\r\n * Observable raised after validation when validate is set to true. The event data is the result of the validation.\r\n */\r\n public readonly onValidatedObservable = new Observable<GLTF2.IGLTFValidationResults>();\r\n\r\n private _onValidatedObserver: Nullable<Observer<GLTF2.IGLTFValidationResults>>;\r\n\r\n /**\r\n * Callback raised after the asset is validated.\r\n */\r\n public set onValidated(callback: (results: GLTF2.IGLTFValidationResults) => void) {\r\n if (this._onValidatedObserver) {\r\n this.onValidatedObservable.remove(this._onValidatedObserver);\r\n }\r\n this._onValidatedObserver = this.onValidatedObservable.add(callback);\r\n }\r\n\r\n private _loader: Nullable<IGLTFLoader> = null;\r\n private _state: Nullable<GLTFLoaderState> = null;\r\n private _progressCallback?: (event: ISceneLoaderProgressEvent) => void;\r\n private _requests = new Array<IFileRequestInfo>();\r\n\r\n /**\r\n * Name of the loader (\"gltf\")\r\n */\r\n public readonly name = GLTFFileLoaderMetadata.name;\r\n\r\n /** @internal */\r\n public readonly extensions = GLTFFileLoaderMetadata.extensions;\r\n\r\n /**\r\n * Disposes the loader, releases resources during load, and cancels any outstanding requests.\r\n */\r\n public dispose(): void {\r\n if (this._loader) {\r\n this._loader.dispose();\r\n this._loader = null;\r\n }\r\n\r\n for (const request of this._requests) {\r\n request.abort();\r\n }\r\n\r\n this._requests.length = 0;\r\n\r\n delete this._progressCallback;\r\n\r\n this.preprocessUrlAsync = (url) => Promise.resolve(url);\r\n\r\n this.onMeshLoadedObservable.clear();\r\n this.onSkinLoadedObservable.clear();\r\n this.onTextureLoadedObservable.clear();\r\n this.onMaterialLoadedObservable.clear();\r\n this.onCameraLoadedObservable.clear();\r\n this.onCompleteObservable.clear();\r\n this.onExtensionLoadedObservable.clear();\r\n\r\n this.onDisposeObservable.notifyObservers(undefined);\r\n this.onDisposeObservable.clear();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public loadFile(\r\n scene: Scene,\r\n fileOrUrl: File | string | ArrayBufferView,\r\n rootUrl: string,\r\n onSuccess: (data: unknown, responseURL?: string) => void,\r\n onProgress?: (ev: ISceneLoaderProgressEvent) => void,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void,\r\n name?: string\r\n ): Nullable<IFileRequest> {\r\n if (ArrayBuffer.isView(fileOrUrl)) {\r\n this._loadBinary(scene, fileOrUrl, rootUrl, onSuccess, onError, name);\r\n return null;\r\n }\r\n\r\n this._progressCallback = onProgress;\r\n\r\n const fileName = (fileOrUrl as File).name || Tools.GetFilename(fileOrUrl as string);\r\n\r\n if (useArrayBuffer) {\r\n if (this.useRangeRequests) {\r\n if (this.validate) {\r\n Logger.Warn(\"glTF validation is not supported when range requests are enabled\");\r\n }\r\n\r\n const fileRequest: IFileRequest = {\r\n abort: () => {},\r\n onCompleteObservable: new Observable<IFileRequest>(),\r\n };\r\n\r\n const dataBuffer = {\r\n readAsync: (byteOffset: number, byteLength: number) => {\r\n return new Promise<ArrayBufferView>((resolve, reject) => {\r\n this._loadFile(\r\n scene,\r\n fileOrUrl,\r\n (data) => {\r\n resolve(new Uint8Array(data as ArrayBuffer));\r\n },\r\n true,\r\n (error) => {\r\n reject(error);\r\n },\r\n (webRequest) => {\r\n webRequest.setRequestHeader(\"Range\", `bytes=${byteOffset}-${byteOffset + byteLength - 1}`);\r\n }\r\n );\r\n });\r\n },\r\n byteLength: 0,\r\n };\r\n\r\n this._unpackBinaryAsync(new DataReader(dataBuffer)).then(\r\n (loaderData) => {\r\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\r\n onSuccess(loaderData);\r\n },\r\n onError ? (error) => onError(undefined, error) : undefined\r\n );\r\n\r\n return fileRequest;\r\n }\r\n\r\n return this._loadFile(\r\n scene,\r\n fileOrUrl,\r\n (data) => {\r\n this._validate(scene, new Uint8Array(data as ArrayBuffer, 0, (data as ArrayBuffer).byteLength), rootUrl, fileName);\r\n this._unpackBinaryAsync(\r\n new DataReader({\r\n readAsync: (byteOffset, byteLength) => readAsync(data as ArrayBuffer, byteOffset, byteLength),\r\n byteLength: (data as ArrayBuffer).byteLength,\r\n })\r\n ).then(\r\n (loaderData) => {\r\n onSuccess(loaderData);\r\n },\r\n onError ? (error) => onError(undefined, error) : undefined\r\n );\r\n },\r\n true,\r\n onError\r\n );\r\n } else {\r\n return this._loadFile(\r\n scene,\r\n fileOrUrl,\r\n (data) => {\r\n try {\r\n this._validate(scene, data as string, rootUrl, fileName);\r\n onSuccess({ json: this._parseJson(data as string) });\r\n } catch {\r\n if (onError) {\r\n onError();\r\n }\r\n }\r\n },\r\n false,\r\n onError\r\n );\r\n }\r\n }\r\n\r\n private _loadBinary(\r\n scene: Scene,\r\n data: ArrayBufferView,\r\n rootUrl: string,\r\n onSuccess: (data: unknown, responseURL?: string) => void,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void,\r\n fileName?: string\r\n ): void {\r\n this._validate(scene, new Uint8Array(data.buffer, data.byteOffset, data.byteLength), rootUrl, fileName);\r\n this._unpackBinaryAsync(\r\n new DataReader({\r\n readAsync: (byteOffset, byteLength) => readViewAsync(data, byteOffset, byteLength),\r\n byteLength: data.byteLength,\r\n })\r\n ).then(\r\n (loaderData) => {\r\n onSuccess(loaderData);\r\n },\r\n onError ? (error) => onError(undefined, error) : undefined\r\n );\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public importMeshAsync(\r\n meshesNames: string | readonly string[] | null | undefined,\r\n scene: Scene,\r\n data: IGLTFLoaderData,\r\n rootUrl: string,\r\n onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n fileName?: string\r\n ): Promise<ISceneLoaderAsyncResult> {\r\n return Promise.resolve().then(() => {\r\n this.onParsedObservable.notifyObservers(data);\r\n this.onParsedObservable.clear();\r\n\r\n this._log(`Loading ${fileName || \"\"}`);\r\n this._loader = this._getLoader(data);\r\n return this._loader.importMeshAsync(meshesNames, scene, null, data, rootUrl, onProgress, fileName);\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public loadAsync(scene: Scene, data: IGLTFLoaderData, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string): Promise<void> {\r\n return Promise.resolve().then(() => {\r\n this.onParsedObservable.notifyObservers(data);\r\n this.onParsedObservable.clear();\r\n\r\n this._log(`Loading ${fileName || \"\"}`);\r\n this._loader = this._getLoader(data);\r\n return this._loader.loadAsync(scene, data, rootUrl, onProgress, fileName);\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public loadAssetContainerAsync(\r\n scene: Scene,\r\n data: IGLTFLoaderData,\r\n rootUrl: string,\r\n onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n fileName?: string\r\n ): Promise<AssetContainer> {\r\n return Promise.resolve().then(() => {\r\n this.onParsedObservable.notifyObservers(data);\r\n this.onParsedObservable.clear();\r\n\r\n this._log(`Loading ${fileName || \"\"}`);\r\n this._loader = this._getLoader(data);\r\n\r\n // Prepare the asset container.\r\n const container = new AssetContainer(scene);\r\n\r\n // Get materials/textures when loading to add to container\r\n const materials: Array<Material> = [];\r\n this.onMaterialLoadedObservable.add((material) => {\r\n materials.push(material);\r\n });\r\n const textures: Array<BaseTexture> = [];\r\n this.onTextureLoadedObservable.add((texture) => {\r\n textures.push(texture);\r\n });\r\n const cameras: Array<Camera> = [];\r\n this.onCameraLoadedObservable.add((camera) => {\r\n cameras.push(camera);\r\n });\r\n\r\n const morphTargetManagers: Array<MorphTargetManager> = [];\r\n this.onMeshLoadedObservable.add((mesh) => {\r\n if (mesh.morphTargetManager) {\r\n morphTargetManagers.push(mesh.morphTargetManager);\r\n }\r\n });\r\n\r\n return this._loader.importMeshAsync(null, scene, container, data, rootUrl, onProgress, fileName).then((result) => {\r\n Array.prototype.push.apply(container.geometries, result.geometries);\r\n Array.prototype.push.apply(container.meshes, result.meshes);\r\n Array.prototype.push.apply(container.particleSystems, result.particleSystems);\r\n Array.prototype.push.apply(container.skeletons, result.skeletons);\r\n Array.prototype.push.apply(container.animationGroups, result.animationGroups);\r\n Array.prototype.push.apply(container.materials, materials);\r\n Array.prototype.push.apply(container.textures, textures);\r\n Array.prototype.push.apply(container.lights, result.lights);\r\n Array.prototype.push.apply(container.transformNodes, result.transformNodes);\r\n Array.prototype.push.apply(container.cameras, cameras);\r\n Array.prototype.push.apply(container.morphTargetManagers, morphTargetManagers);\r\n return container;\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public canDirectLoad(data: string): boolean {\r\n return GLTFFileLoaderMetadata.canDirectLoad(data);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public directLoad(scene: Scene, data: string): Promise<object> {\r\n if (\r\n data.startsWith(\"base64,\" + GLTFMagicBase64Encoded) || // this is technically incorrect, but will continue to support for backcompat.\r\n data.startsWith(\";base64,\" + GLTFMagicBase64Encoded) ||\r\n data.startsWith(\"application/octet-stream;base64,\" + GLTFMagicBase64Encoded) ||\r\n data.startsWith(\"model/gltf-binary;base64,\" + GLTFMagicBase64Encoded)\r\n ) {\r\n const arrayBuffer = DecodeBase64UrlToBinary(data);\r\n\r\n this._validate(scene, new Uint8Array(arrayBuffer, 0, arrayBuffer.byteLength));\r\n return this._unpackBinaryAsync(\r\n new DataReader({\r\n readAsync: (byteOffset, byteLength) => readAsync(arrayBuffer, byteOffset, byteLength),\r\n byteLength: arrayBuffer.byteLength,\r\n })\r\n );\r\n }\r\n\r\n this._validate(scene, data);\r\n return Promise.resolve({ json: this._parseJson(data) });\r\n }\r\n\r\n /**\r\n * The callback that allows custom handling of the root url based on the response url.\r\n * @param rootUrl the original root url\r\n * @param responseURL the response url if available\r\n * @returns the new root url\r\n */\r\n public rewriteRootURL?(rootUrl: string, responseURL?: string): string;\r\n\r\n /** @internal */\r\n public createPlugin(options: SceneLoaderPluginOptions): ISceneLoaderPluginAsync {\r\n return new GLTFFileLoader(options[GLTFFileLoaderMetadata.name]);\r\n }\r\n\r\n /**\r\n * The loader state or null if the loader is not active.\r\n */\r\n public get loaderState(): Nullable<GLTFLoaderState> {\r\n return this._state;\r\n }\r\n\r\n /**\r\n * Observable raised when the loader state changes.\r\n */\r\n public onLoaderStateChangedObservable = new Observable<Nullable<GLTFLoaderState>>();\r\n\r\n /**\r\n * Returns a promise that resolves when the asset is completely loaded.\r\n * @returns a promise that resolves when the asset is completely loaded.\r\n */\r\n public whenCompleteAsync(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n this.onCompleteObservable.addOnce(() => {\r\n resolve();\r\n });\r\n this.onErrorObservable.addOnce((reason) => {\r\n reject(reason);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setState(state: GLTFLoaderState): void {\r\n if (this._state === state) {\r\n return;\r\n }\r\n\r\n this._state = state;\r\n this.onLoaderStateChangedObservable.notifyObservers(this._state);\r\n this._log(GLTFLoaderState[this._state]);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _loadFile(\r\n scene: Scene,\r\n fileOrUrl: File | string,\r\n onSuccess: (data: string | ArrayBuffer) => void,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest) => void,\r\n onOpened?: (request: WebRequest) => void\r\n ): IFileRequest {\r\n const request = scene._loadFile(\r\n fileOrUrl,\r\n onSuccess,\r\n (event) => {\r\n this._onProgress(event, request);\r\n },\r\n true,\r\n useArrayBuffer,\r\n onError,\r\n onOpened\r\n ) as IFileRequestInfo;\r\n request.onCompleteObservable.add(() => {\r\n // Force the length computable to be true since we can guarantee the data is loaded.\r\n request._lengthComputable = true;\r\n request._total = request._loaded;\r\n });\r\n this._requests.push(request);\r\n return request;\r\n }\r\n\r\n private _onProgress(event: ProgressEvent, request: IFileRequestInfo): void {\r\n if (!this._progressCallback) {\r\n return;\r\n }\r\n\r\n request._lengthComputable = event.lengthComputable;\r\n request._loaded = event.loaded;\r\n request._total = event.total;\r\n\r\n let lengthComputable = true;\r\n let loaded = 0;\r\n let total = 0;\r\n for (const request of this._requests) {\r\n if (request._lengthComputable === undefined || request._loaded === undefined || request._total === undefined) {\r\n return;\r\n }\r\n\r\n lengthComputable = lengthComputable && request._lengthComputable;\r\n loaded += request._loaded;\r\n total += request._total;\r\n }\r\n\r\n this._progressCallback({\r\n lengthComputable: lengthComputable,\r\n loaded: loaded,\r\n total: lengthComputable ? total : 0,\r\n });\r\n }\r\n\r\n private _validate(scene: Scene, data: string | Uint8Array, rootUrl = \"\", fileName = \"\"): void {\r\n if (!this.validate) {\r\n return;\r\n }\r\n\r\n this._startPerformanceCounter(\"Validate JSON\");\r\n GLTFValidation.ValidateAsync(data, rootUrl, fileName, (uri) => {\r\n return this.preprocessUrlAsync(rootUrl + uri).then((url) => {\r\n return scene._loadFileAsync(url, undefined, true, true).then((data) => {\r\n return new Uint8Array(data, 0, data.byteLength);\r\n });\r\n });\r\n }).then(\r\n (result) => {\r\n this._endPerformanceCounter(\"Validate JSON\");\r\n this.onValidatedObservable.notifyObservers(result);\r\n this.onValidatedObservable.clear();\r\n },\r\n (reason) => {\r\n this._endPerformanceCounter(\"Validate JSON\");\r\n Tools.Warn(`Failed to validate: ${reason.message}`);\r\n this.onValidatedObservable.clear();\r\n }\r\n );\r\n }\r\n\r\n private _getLoader(loaderData: IGLTFLoaderData): IGLTFLoader {\r\n const asset = (<any>loaderData.json).asset || {};\r\n\r\n this._log(`Asset version: ${asset.version}`);\r\n asset.minVersion && this._log(`Asset minimum version: ${asset.minVersion}`);\r\n asset.generator && this._log(`Asset generator: ${asset.generator}`);\r\n\r\n const version = GLTFFileLoader._parseVersion(asset.version);\r\n if (!version) {\r\n throw new Error(\"Invalid version: \" + asset.version);\r\n }\r\n\r\n if (asset.minVersion !== undefined) {\r\n const minVersion = GLTFFileLoader._parseVersion(asset.minVersion);\r\n if (!minVersion) {\r\n throw new Error(\"Invalid minimum version: \" + asset.minVersion);\r\n }\r\n\r\n if (GLTFFileLoader._compareVersion(minVersion, { major: 2, minor: 0 }) > 0) {\r\n throw new Error(\"Incompatible minimum version: \" + asset.minVersion);\r\n }\r\n }\r\n\r\n const createLoaders: { [key: number]: (parent: GLTFFileLoader) => IGLTFLoader } = {\r\n 1: GLTFFileLoader._CreateGLTF1Loader,\r\n 2: GLTFFileLoader._CreateGLTF2Loader,\r\n };\r\n\r\n const createLoader = createLoaders[version.major];\r\n if (!createLoader) {\r\n throw new Error(\"Unsupported version: \" + asset.version);\r\n }\r\n\r\n return createLoader(this);\r\n }\r\n\r\n private _parseJson(json: string): object {\r\n this._startPerformanceCounter(\"Parse JSON\");\r\n this._log(`JSON length: ${json.length}`);\r\n const parsed = JSON.parse(json);\r\n this._endPerformanceCounter(\"Parse JSON\");\r\n return parsed;\r\n }\r\n\r\n private _unpackBinaryAsync(dataReader: DataReader): Promise<IGLTFLoaderData> {\r\n this._startPerformanceCounter(\"Unpack Binary\");\r\n\r\n // Read magic + version + length + json length + json format\r\n return dataReader.loadAsync(20).then(() => {\r\n const Binary = {\r\n Magic: 0x46546c67,\r\n };\r\n\r\n const magic = dataReader.readUint32();\r\n if (magic !== Binary.Magic) {\r\n throw new RuntimeError(\"Unexpected magic: \" + magic, ErrorCodes.GLTFLoaderUnexpectedMagicError);\r\n }\r\n\r\n const version = dataReader.readUint32();\r\n\r\n if (this.loggingEnabled) {\r\n this._log(`Binary version: ${version}`);\r\n }\r\n\r\n const length = dataReader.readUint32();\r\n if (!this.useRangeRequests && length !== dataReader.buffer.byteLength) {\r\n Logger.Warn(`Length in header does not match actual data length: ${length} != ${dataReader.buffer.byteLength}`);\r\n }\r\n\r\n let unpacked: Promise<IGLTFLoaderData>;\r\n switch (version) {\r\n case 1: {\r\n unpacked = this._unpackBinaryV1Async(dataReader, length);\r\n break;\r\n }\r\n case 2: {\r\n unpacked = this._unpackBinaryV2Async(dataReader, length);\r\n break;\r\n }\r\n default: {\r\n throw new Error(\"Unsupported version: \" + version);\r\n }\r\n }\r\n\r\n this._endPerformanceCounter(\"Unpack Binary\");\r\n\r\n return unpacked;\r\n });\r\n }\r\n\r\n private _unpackBinaryV1Async(dataReader: DataReader, length: number): Promise<IGLTFLoaderData> {\r\n const ContentFormat = {\r\n JSON: 0,\r\n };\r\n\r\n const contentLength = dataReader.readUint32();\r\n const contentFormat = dataReader.readUint32();\r\n\r\n if (contentFormat !== ContentFormat.JSON) {\r\n throw new Error(`Unexpected content format: ${contentFormat}`);\r\n }\r\n\r\n const bodyLength = length - dataReader.byteOffset;\r\n\r\n const data: IGLTFLoaderData = { json: this._parseJson(dataReader.readString(contentLength)), bin: null };\r\n if (bodyLength !== 0) {\r\n const startByteOffset = dataReader.byteOffset;\r\n data.bin = {\r\n readAsync: (byteOffset, byteLength) => dataReader.buffer.readAsync(startByteOffset + byteOffset, byteLength),\r\n byteLength: bodyLength,\r\n };\r\n }\r\n\r\n return Promise.resolve(data);\r\n }\r\n\r\n private _unpackBinaryV2Async(dataReader: DataReader, length: number): Promise<IGLTFLoaderData> {\r\n const ChunkFormat = {\r\n JSON: 0x4e4f534a,\r\n BIN: 0x004e4942,\r\n };\r\n\r\n // Read the JSON chunk header.\r\n const chunkLength = dataReader.readUint32();\r\n const chunkFormat = dataReader.readUint32();\r\n if (chunkFormat !== ChunkFormat.JSON) {\r\n throw new Error(\"First chunk format is not JSON\");\r\n }\r\n\r\n // Bail if there are no other chunks.\r\n if (dataReader.byteOffset + chunkLength === length) {\r\n return dataReader.loadAsync(chunkLength).then(() => {\r\n return { json: this._parseJson(dataReader.readString(chunkLength)), bin: null };\r\n });\r\n }\r\n\r\n // Read the JSON chunk and the length and type of the next chunk.\r\n return dataReader.loadAsync(chunkLength + 8).then(() => {\r\n const data: IGLTFLoaderData = { json: this._parseJson(dataReader.readString(chunkLength)), bin: null };\r\n\r\n const readAsync = (): Promise<IGLTFLoaderData> => {\r\n const chunkLength = dataReader.readUint32();\r\n const chunkFormat = dataReader.readUint32();\r\n\r\n switch (chunkFormat) {\r\n case ChunkFormat.JSON: {\r\n throw new Error(\"Unexpected JSON chunk\");\r\n }\r\n case ChunkFormat.BIN: {\r\n const startByteOffset = dataReader.byteOffset;\r\n data.bin = {\r\n readAsync: (byteOffset, byteLength) => dataReader.buffer.readAsync(startByteOffset + byteOffset, byteLength),\r\n byteLength: chunkLength,\r\n };\r\n dataReader.skipBytes(chunkLength);\r\n break;\r\n }\r\n default: {\r\n // ignore unrecognized chunkFormat\r\n dataReader.skipBytes(chunkLength);\r\n break;\r\n }\r\n }\r\n\r\n if (dataReader.byteOffset !== length) {\r\n return dataReader.loadAsync(8).then(readAsync);\r\n }\r\n\r\n return Promise.resolve(data);\r\n };\r\n\r\n return readAsync();\r\n });\r\n }\r\n\r\n private static _parseVersion(version: string): Nullable<{ major: number; minor: number }> {\r\n if (version === \"1.0\" || version === \"1.0.1\") {\r\n return {\r\n major: 1,\r\n minor: 0,\r\n };\r\n }\r\n\r\n const match = (version + \"\").match(/^(\\d+)\\.(\\d+)/);\r\n if (!match) {\r\n return null;\r\n }\r\n\r\n return {\r\n major: parseInt(match[1]),\r\n minor: parseInt(match[2]),\r\n };\r\n }\r\n\r\n private static _compareVersion(a: { major: number; minor: number }, b: { major: number; minor: number }): number {\r\n if (a.major > b.major) {\r\n return 1;\r\n }\r\n if (a.major < b.major) {\r\n return -1;\r\n }\r\n if (a.minor > b.minor) {\r\n return 1;\r\n }\r\n if (a.minor < b.minor) {\r\n return -1;\r\n }\r\n return 0;\r\n }\r\n\r\n private static readonly _logSpaces = \" \";\r\n private _logIndentLevel = 0;\r\n private _loggingEnabled = false;\r\n\r\n /** @internal */\r\n public _log = this._logDisabled;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _logOpen(message: string): void {\r\n this._log(message);\r\n this._logIndentLevel++;\r\n }\r\n\r\n /** @internal */\r\n public _logClose(): void {\r\n --this._logIndentLevel;\r\n }\r\n\r\n private _logEnabled(message: string): void {\r\n const spaces = GLTFFileLoader._logSpaces.substring(0, this._logIndentLevel * 2);\r\n Logger.Log(`${spaces}${message}`);\r\n }\r\n\r\n private _logDisabled(message: string): void {}\r\n\r\n private _capturePerformanceCounters = false;\r\n\r\n /** @internal */\r\n public _startPerformanceCounter = this._startPerformanceCounterDisabled;\r\n\r\n /** @internal */\r\n public _endPerformanceCounter = this._endPerformanceCounterDisabled;\r\n\r\n private _startPerformanceCounterEnabled(counterName: string): void {\r\n Tools.StartPerformanceCounter(counterName);\r\n }\r\n\r\n private _startPerformanceCounterDisabled(counterName: string): void {}\r\n\r\n private _endPerformanceCounterEnabled(counterName: string): void {\r\n Tools.EndPerformanceCounter(counterName);\r\n }\r\n\r\n private _endPerformanceCounterDisabled(counterName: string): void {}\r\n}\r\n\r\nRegisterSceneLoaderPlugin(new GLTFFileLoader());\r\n"]}