{"version":3,"file":"babylon.glTF2FileLoader.min.js","mappings":"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","sources":["webpack://LOADERS/webpack/universalModuleDefinition","webpack://LOADERS/external umd {\"root\":\"BABYLON\",\"commonjs\":\"babylonjs\",\"commonjs2\":\"babylonjs\",\"amd\":\"babylonjs\"}","webpack://LOADERS/webpack/bootstrap","webpack://LOADERS/webpack/runtime/define property getters","webpack://LOADERS/webpack/runtime/global","webpack://LOADERS/webpack/runtime/hasOwnProperty shorthand","webpack://LOADERS/webpack/runtime/make namespace object","webpack://LOADERS/../../../lts/loaders/generated/glTF/glTFValidation.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/glTFFileLoader.ts","webpack://LOADERS/../../../lts/loaders/generated/legacy/legacy-glTF.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/glTFLoader.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/EXT_lights_image_based.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/EXT_meshopt_compression.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/EXT_texture_webp.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/KHR_draco_mesh_compression.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/KHR_lights_punctual.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/KHR_materials_unlit.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/KHR_materials_clearcoat.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/KHR_materials_iridescence.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/KHR_materials_emissive_strength.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/KHR_materials_sheen.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/KHR_materials_specular.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/KHR_materials_ior.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/KHR_materials_variants.ts","webpack://LOADERS/../../../../node_modules/tslib/tslib.es6.js","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/KHR_materials_transmission.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/KHR_materials_translucency.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/KHR_materials_volume.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/KHR_mesh_quantization.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/KHR_texture_basisu.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/KHR_texture_transform.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/KHR_xmp_json_ld.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/MSFT_audio_emitter.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/MSFT_lod.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/MSFT_minecraftMesh.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/MSFT_sRGBFactors.ts","webpack://LOADERS/../../../lts/loaders/generated/glTF/2.0/Extensions/ExtrasAsMetadata.ts","webpack://LOADERS/../../../lts/loaders/generated/legacy/legacy-glTF2.ts","webpack://LOADERS/./src/glTF2FileLoader.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"babylonjs\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"babylonjs-loaders\", [\"babylonjs\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"babylonjs-loaders\"] = factory(require(\"babylonjs\"));\n\telse\n\t\troot[\"LOADERS\"] = factory(root[\"BABYLON\"]);\n})((typeof self !== \"undefined\" ? self : typeof global !== \"undefined\" ? global : this), (__WEBPACK_EXTERNAL_MODULE__520__) => {\nreturn ","module.exports = __WEBPACK_EXTERNAL_MODULE__520__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type * as GLTF2 from \"babylonjs-gltf2interface\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare let GLTFValidator: GLTF2.IGLTFValidator;\r\n\r\n// WorkerGlobalScope\r\ndeclare function importScripts(...urls: string[]): void;\r\ndeclare function postMessage(message: any, transfer?: any[]): void;\r\n\r\nfunction validateAsync(\r\n data: string | ArrayBuffer,\r\n rootUrl: string,\r\n fileName: string,\r\n getExternalResource: (uri: string) => Promise\r\n): Promise {\r\n const options: GLTF2.IGLTFValidationOptions = {\r\n externalResourceFunction: (uri) => getExternalResource(uri).then((value) => new Uint8Array(value)),\r\n };\r\n\r\n if (fileName) {\r\n options.uri = rootUrl === \"file:\" ? fileName : rootUrl + fileName;\r\n }\r\n\r\n return data instanceof ArrayBuffer ? GLTFValidator.validateBytes(new Uint8Array(data), options) : GLTFValidator.validateString(data, options);\r\n}\r\n\r\n/**\r\n * The worker function that gets converted to a blob url to pass into a worker.\r\n */\r\nfunction workerFunc(): void {\r\n const pendingExternalResources: Array<{ resolve: (data: any) => void; reject: (reason: any) => void }> = [];\r\n\r\n onmessage = (message) => {\r\n const data = message.data;\r\n switch (data.id) {\r\n case \"init\": {\r\n importScripts(data.url);\r\n break;\r\n }\r\n case \"validate\": {\r\n validateAsync(\r\n data.data,\r\n data.rootUrl,\r\n data.fileName,\r\n (uri) =>\r\n new Promise((resolve, reject) => {\r\n const index = pendingExternalResources.length;\r\n pendingExternalResources.push({ resolve, reject });\r\n postMessage({ id: \"getExternalResource\", index: index, uri: uri });\r\n })\r\n ).then(\r\n (value) => {\r\n postMessage({ id: \"validate.resolve\", value: value });\r\n },\r\n (reason) => {\r\n postMessage({ id: \"validate.reject\", reason: reason });\r\n }\r\n );\r\n break;\r\n }\r\n case \"getExternalResource.resolve\": {\r\n pendingExternalResources[data.index].resolve(data.value);\r\n break;\r\n }\r\n case \"getExternalResource.reject\": {\r\n pendingExternalResources[data.index].reject(data.reason);\r\n break;\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Configuration for glTF validation\r\n */\r\nexport interface IGLTFValidationConfiguration {\r\n /**\r\n * The url of the glTF validator.\r\n */\r\n url: string;\r\n}\r\n\r\n/**\r\n * glTF validation\r\n */\r\nexport class GLTFValidation {\r\n /**\r\n * The configuration. Defaults to `{ url: \"https://preview.babylonjs.com/gltf_validator.js\" }`.\r\n */\r\n public static Configuration: IGLTFValidationConfiguration = {\r\n url: \"https://preview.babylonjs.com/gltf_validator.js\",\r\n };\r\n\r\n private static _LoadScriptPromise: Promise;\r\n\r\n /**\r\n * Validate a glTF asset using the glTF-Validator.\r\n * @param data The JSON of a glTF or the array buffer of a binary glTF\r\n * @param rootUrl The root url for the glTF\r\n * @param fileName The file name for the glTF\r\n * @param getExternalResource The callback to get external resources for the glTF validator\r\n * @returns A promise that resolves with the glTF validation results once complete\r\n */\r\n public static ValidateAsync(\r\n data: string | ArrayBuffer,\r\n rootUrl: string,\r\n fileName: string,\r\n getExternalResource: (uri: string) => Promise\r\n ): Promise {\r\n if (typeof Worker === \"function\") {\r\n return new Promise((resolve, reject) => {\r\n const workerContent = `${validateAsync}(${workerFunc})()`;\r\n const workerBlobUrl = URL.createObjectURL(new Blob([workerContent], { type: \"application/javascript\" }));\r\n const worker = new Worker(workerBlobUrl);\r\n\r\n const onError = (error: ErrorEvent) => {\r\n worker.removeEventListener(\"error\", onError);\r\n worker.removeEventListener(\"message\", onMessage);\r\n reject(error);\r\n };\r\n\r\n const onMessage = (message: MessageEvent) => {\r\n const data = message.data;\r\n switch (data.id) {\r\n case \"getExternalResource\": {\r\n getExternalResource(data.uri).then(\r\n (value) => {\r\n worker.postMessage({ id: \"getExternalResource.resolve\", index: data.index, value: value }, [value]);\r\n },\r\n (reason) => {\r\n worker.postMessage({ id: \"getExternalResource.reject\", index: data.index, reason: reason });\r\n }\r\n );\r\n break;\r\n }\r\n case \"validate.resolve\": {\r\n worker.removeEventListener(\"error\", onError);\r\n worker.removeEventListener(\"message\", onMessage);\r\n resolve(data.value);\r\n worker.terminate();\r\n break;\r\n }\r\n case \"validate.reject\": {\r\n worker.removeEventListener(\"error\", onError);\r\n worker.removeEventListener(\"message\", onMessage);\r\n reject(data.reason);\r\n worker.terminate();\r\n }\r\n }\r\n };\r\n\r\n worker.addEventListener(\"error\", onError);\r\n worker.addEventListener(\"message\", onMessage);\r\n\r\n worker.postMessage({ id: \"init\", url: this.Configuration.url });\r\n worker.postMessage({ id: \"validate\", data: data, rootUrl: rootUrl, fileName: fileName });\r\n });\r\n } else {\r\n if (!this._LoadScriptPromise) {\r\n this._LoadScriptPromise = Tools.LoadScriptAsync(this.Configuration.url);\r\n }\r\n\r\n return this._LoadScriptPromise.then(() => {\r\n return validateAsync(data, rootUrl, fileName, getExternalResource);\r\n });\r\n }\r\n }\r\n}\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 {\r\n ISceneLoaderPluginFactory,\r\n ISceneLoaderPlugin,\r\n ISceneLoaderPluginAsync,\r\n ISceneLoaderProgressEvent,\r\n ISceneLoaderPluginExtensions,\r\n ISceneLoaderAsyncResult,\r\n} from \"core/Loading/sceneLoader\";\r\nimport { SceneLoader } 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 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\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 {\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\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;\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/** @hidden */\r\nexport interface IGLTFLoader extends IDisposable {\r\n importMeshAsync: (\r\n meshesNames: any,\r\n scene: Scene,\r\n container: Nullable,\r\n data: IGLTFLoaderData,\r\n rootUrl: string,\r\n onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n fileName?: string\r\n ) => Promise;\r\n loadAsync: (scene: Scene, data: IGLTFLoaderData, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string) => Promise;\r\n}\r\n\r\n/**\r\n * File loader for loading glTF files into a scene.\r\n */\r\nexport class GLTFFileLoader implements IDisposable, ISceneLoaderPluginAsync, ISceneLoaderPluginFactory {\r\n /** @hidden */\r\n public static _CreateGLTF1Loader: (parent: GLTFFileLoader) => IGLTFLoader;\r\n\r\n /** @hidden */\r\n public static _CreateGLTF2Loader: (parent: GLTFFileLoader) => IGLTFLoader;\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 onParsedObservable = new Observable();\r\n\r\n private _onParsedObserver: Nullable>;\r\n\r\n /**\r\n * Raised when the asset has been parsed\r\n */\r\n public set onParsed(callback: (loaderData: IGLTFLoaderData) => void) {\r\n if (this._onParsedObserver) {\r\n this.onParsedObservable.remove(this._onParsedObserver);\r\n }\r\n this._onParsedObserver = this.onParsedObservable.add(callback);\r\n }\r\n\r\n // ----------\r\n // 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 * @hidden\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 * @hidden\r\n */\r\n public static HomogeneousCoordinates = false;\r\n\r\n // ----------\r\n // V2 options\r\n // ----------\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 * 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 also compile materials with clip planes. Defaults to false.\r\n */\r\n public useClipPlane = 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 * 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 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 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 * Function called before loading a url referenced by the asset.\r\n * @param url\r\n */\r\n public preprocessUrlAsync = (url: string) => Promise.resolve(url);\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();\r\n\r\n private _onMeshLoadedObserver: Nullable>;\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) {\r\n if (this._onMeshLoadedObserver) {\r\n this.onMeshLoadedObservable.remove(this._onMeshLoadedObserver);\r\n }\r\n this._onMeshLoadedObserver = this.onMeshLoadedObservable.add(callback);\r\n }\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/divingDeeper/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 /**\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();\r\n\r\n private _onTextureLoadedObserver: Nullable>;\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) {\r\n if (this._onTextureLoadedObserver) {\r\n this.onTextureLoadedObservable.remove(this._onTextureLoadedObserver);\r\n }\r\n this._onTextureLoadedObserver = this.onTextureLoadedObservable.add(callback);\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();\r\n\r\n private _onMaterialLoadedObserver: Nullable>;\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) {\r\n if (this._onMaterialLoadedObserver) {\r\n this.onMaterialLoadedObservable.remove(this._onMaterialLoadedObserver);\r\n }\r\n this._onMaterialLoadedObserver = this.onMaterialLoadedObservable.add(callback);\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();\r\n\r\n private _onCameraLoadedObserver: Nullable>;\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) {\r\n if (this._onCameraLoadedObserver) {\r\n this.onCameraLoadedObservable.remove(this._onCameraLoadedObserver);\r\n }\r\n this._onCameraLoadedObserver = this.onCameraLoadedObservable.add(callback);\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();\r\n\r\n private _onCompleteObserver: Nullable>;\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();\r\n\r\n private _onErrorObserver: Nullable>;\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();\r\n\r\n private _onDisposeObserver: Nullable>;\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();\r\n\r\n private _onExtensionLoadedObserver: Nullable>;\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 * Defines if the loader should validate the asset.\r\n */\r\n public validate = false;\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();\r\n\r\n private _onValidatedObserver: Nullable>;\r\n\r\n /**\r\n * Callback raised after a loader extension is created.\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 = null;\r\n private _state: Nullable = null;\r\n private _progressCallback?: (event: ISceneLoaderProgressEvent) => void;\r\n private _requests = new Array();\r\n\r\n private static _MagicBase64Encoded = \"Z2xURg\"; // \"glTF\" base64 encoded (without the quotes!)\r\n\r\n /**\r\n * Name of the loader (\"gltf\")\r\n */\r\n public name = \"gltf\";\r\n\r\n /** @hidden */\r\n public extensions: ISceneLoaderPluginExtensions = {\r\n \".gltf\": { isBinary: false },\r\n \".glb\": { isBinary: true },\r\n };\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 * @param scene\r\n * @param fileOrUrl\r\n * @param onSuccess\r\n * @param onProgress\r\n * @param useArrayBuffer\r\n * @param onError\r\n * @hidden\r\n */\r\n public loadFile(\r\n scene: Scene,\r\n fileOrUrl: File | string,\r\n onSuccess: (data: any, responseURL?: string) => void,\r\n onProgress?: (ev: ISceneLoaderProgressEvent) => void,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void\r\n ): IFileRequest {\r\n this._progressCallback = onProgress;\r\n\r\n const rootUrl = (fileOrUrl as File).name ? \"file:\" : Tools.GetFolderPath(fileOrUrl as string);\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(),\r\n };\r\n\r\n const dataBuffer = {\r\n readAsync: (byteOffset: number, byteLength: number) => {\r\n return new Promise((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, data as ArrayBuffer, 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 }\r\n\r\n return this._loadFile(\r\n scene,\r\n fileOrUrl,\r\n (data) => {\r\n this._validate(scene, data, rootUrl, fileName);\r\n onSuccess({ json: this._parseJson(data as string) });\r\n },\r\n useArrayBuffer,\r\n onError\r\n );\r\n }\r\n\r\n /**\r\n * @param meshesNames\r\n * @param scene\r\n * @param data\r\n * @param rootUrl\r\n * @param onProgress\r\n * @param fileName\r\n * @hidden\r\n */\r\n public importMeshAsync(\r\n meshesNames: any,\r\n scene: Scene,\r\n data: any,\r\n rootUrl: string,\r\n onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n fileName?: string\r\n ): Promise {\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 * @param scene\r\n * @param data\r\n * @param rootUrl\r\n * @param onProgress\r\n * @param fileName\r\n * @hidden\r\n */\r\n public loadAsync(scene: Scene, data: any, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string): Promise {\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 * @param scene\r\n * @param data\r\n * @param rootUrl\r\n * @param onProgress\r\n * @param fileName\r\n * @hidden\r\n */\r\n public loadAssetContainerAsync(scene: Scene, data: any, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string): Promise {\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 = [];\r\n this.onMaterialLoadedObservable.add((material) => {\r\n materials.push(material);\r\n });\r\n const textures: Array = [];\r\n this.onTextureLoadedObservable.add((texture) => {\r\n textures.push(texture);\r\n });\r\n const cameras: Array = [];\r\n this.onCameraLoadedObservable.add((camera) => {\r\n cameras.push(camera);\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 return container;\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * @param data\r\n * @hidden\r\n */\r\n public canDirectLoad(data: string): boolean {\r\n return (\r\n (data.indexOf(\"asset\") !== -1 && data.indexOf(\"version\") !== -1) ||\r\n data.startsWith(\"data:base64,\" + GLTFFileLoader._MagicBase64Encoded) || // this is technically incorrect, but will continue to support for backcompat.\r\n data.startsWith(\"data:;base64,\" + GLTFFileLoader._MagicBase64Encoded) ||\r\n data.startsWith(\"data:application/octet-stream;base64,\" + GLTFFileLoader._MagicBase64Encoded) ||\r\n data.startsWith(\"data:model/gltf-binary;base64,\" + GLTFFileLoader._MagicBase64Encoded)\r\n );\r\n }\r\n\r\n /**\r\n * @param scene\r\n * @param data\r\n * @hidden\r\n */\r\n public directLoad(scene: Scene, data: string): Promise {\r\n if (\r\n data.startsWith(\"base64,\" + GLTFFileLoader._MagicBase64Encoded) || // this is technically incorrect, but will continue to support for backcompat.\r\n data.startsWith(\";base64,\" + GLTFFileLoader._MagicBase64Encoded) ||\r\n data.startsWith(\"application/octet-stream;base64,\" + GLTFFileLoader._MagicBase64Encoded) ||\r\n data.startsWith(\"model/gltf-binary;base64,\" + GLTFFileLoader._MagicBase64Encoded)\r\n ) {\r\n const arrayBuffer = DecodeBase64UrlToBinary(data);\r\n\r\n this._validate(scene, arrayBuffer);\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 /** @hidden */\r\n public createPlugin(): ISceneLoaderPlugin | ISceneLoaderPluginAsync {\r\n return new GLTFFileLoader();\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 {\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>();\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 {\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 * @param state\r\n * @hidden\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 * @param scene\r\n * @param fileOrUrl\r\n * @param onSuccess\r\n * @param useArrayBuffer\r\n * @param onError\r\n * @param onOpened\r\n * @hidden\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((request) => {\r\n this._requests.splice(this._requests.indexOf(request), 1);\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 | ArrayBuffer, 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) => scene._loadFileAsync(url, undefined, true, true) as Promise);\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 = (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 {\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 (dataReader.buffer.byteLength !== 0 && length !== dataReader.buffer.byteLength) {\r\n throw new Error(`Length in header does not match actual data length: ${length} != ${dataReader.buffer.byteLength}`);\r\n }\r\n\r\n let unpacked: Promise;\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 {\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 {\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 => {\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 /** @hidden */\r\n public _log = this._logDisabled;\r\n\r\n /**\r\n * @param message\r\n * @hidden\r\n */\r\n public _logOpen(message: string): void {\r\n this._log(message);\r\n this._logIndentLevel++;\r\n }\r\n\r\n /** @hidden */\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.substr(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 /** @hidden */\r\n public _startPerformanceCounter = this._startPerformanceCounterDisabled;\r\n\r\n /** @hidden */\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\nif (SceneLoader) {\r\n SceneLoader.RegisterPlugin(new GLTFFileLoader());\r\n}\r\n","import * as FileLoader from \"../glTF/glTFFileLoader\";\nimport * as Validation from \"../glTF/glTFValidation\";\n/**\n * This is the entry point for the UMD module.\n * The entry point for a future ESM package should be index.ts\n */\nconst globalObject = typeof global !== \"undefined\" ? global : typeof window !== \"undefined\" ? window : undefined;\nif (typeof globalObject !== \"undefined\") {\n (globalObject).BABYLON = (globalObject).BABYLON || {};\n for (const key in FileLoader) {\n (globalObject).BABYLON[key] = (FileLoader)[key];\n }\n for (const key in Validation) {\n (globalObject).BABYLON[key] = (Validation)[key];\n }\n}\nexport * from \"../glTF/glTFFileLoader\";\nexport * from \"../glTF/glTFValidation\";\n","import type { IndicesArray, Nullable } from \"core/types\";\r\nimport { Deferred } from \"core/Misc/deferred\";\r\nimport { Quaternion, Vector3, Matrix, TmpVectors } from \"core/Maths/math.vector\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { Camera } from \"core/Cameras/camera\";\r\nimport { FreeCamera } from \"core/Cameras/freeCamera\";\r\nimport { AnimationGroup } from \"core/Animations/animationGroup\";\r\nimport { Animation } from \"core/Animations/animation\";\r\nimport { Bone } from \"core/Bones/bone\";\r\nimport { Skeleton } from \"core/Bones/skeleton\";\r\nimport { Material } from \"core/Materials/material\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { ITextureCreationOptions } from \"core/Materials/Textures/texture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Buffer, VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { Geometry } from \"core/Meshes/geometry\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport type { InstancedMesh } from \"core/Meshes/instancedMesh\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { MorphTarget } from \"core/Morph/morphTarget\";\r\nimport { MorphTargetManager } from \"core/Morph/morphTargetManager\";\r\nimport type { ISceneLoaderAsyncResult, ISceneLoaderProgressEvent } from \"core/Loading/sceneLoader\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { IProperty } from \"babylonjs-gltf2interface\";\r\nimport {\r\n AccessorType,\r\n CameraType,\r\n AnimationChannelTargetPath,\r\n AnimationSamplerInterpolation,\r\n AccessorComponentType,\r\n MaterialAlphaMode,\r\n TextureMinFilter,\r\n TextureWrapMode,\r\n TextureMagFilter,\r\n MeshPrimitiveMode,\r\n} from \"babylonjs-gltf2interface\";\r\nimport type {\r\n _IAnimationSamplerData,\r\n IGLTF,\r\n ISampler,\r\n INode,\r\n IScene,\r\n IMesh,\r\n IAccessor,\r\n ISkin,\r\n ICamera,\r\n IAnimation,\r\n IAnimationChannel,\r\n IAnimationSampler,\r\n IBuffer,\r\n IBufferView,\r\n IMaterialPbrMetallicRoughness,\r\n IMaterial,\r\n ITextureInfo,\r\n ITexture,\r\n IImage,\r\n IMeshPrimitive,\r\n IArrayItem as IArrItem,\r\n _ISamplerData,\r\n} from \"./glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"./glTFLoaderExtension\";\r\nimport type { IGLTFLoader, IGLTFLoaderData } from \"../glTFFileLoader\";\r\nimport { GLTFFileLoader, GLTFLoaderState, GLTFLoaderCoordinateSystemMode, GLTFLoaderAnimationStartMode } from \"../glTFFileLoader\";\r\nimport type { IAnimationKey } from \"core/Animations/animationKey\";\r\nimport { AnimationKeyInterpolation } from \"core/Animations/animationKey\";\r\nimport type { IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport type { IDataBuffer } from \"core/Misc/dataReader\";\r\nimport { DecodeBase64UrlToBinary, IsBase64DataUrl, LoadFileError } from \"core/Misc/fileTools\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport type { Light } from \"core/Lights/light\";\r\nimport { BoundingInfo } from \"core/Culling/boundingInfo\";\r\nimport type { AssetContainer } from \"core/assetContainer\";\r\n\r\ninterface TypedArrayLike extends ArrayBufferView {\r\n readonly length: number;\r\n [n: number]: number;\r\n}\r\n\r\ninterface TypedArrayConstructor {\r\n new (length: number): TypedArrayLike;\r\n new (buffer: ArrayBufferLike, byteOffset: number, length?: number): TypedArrayLike;\r\n}\r\n\r\ninterface ILoaderProperty extends IProperty {\r\n _activeLoaderExtensionFunctions: {\r\n [id: string]: boolean;\r\n };\r\n}\r\n\r\ninterface IRegisteredExtension {\r\n factory: (loader: GLTFLoader) => IGLTFLoaderExtension;\r\n}\r\n\r\n/**\r\n * Helper class for working with arrays when loading the glTF asset\r\n */\r\nexport class ArrayItem {\r\n /**\r\n * Gets an item from the given array.\r\n * @param context The context when loading the asset\r\n * @param array The array to get the item from\r\n * @param index The index to the array\r\n * @returns The array item\r\n */\r\n public static Get(context: string, array: ArrayLike | undefined, index: number | undefined): T {\r\n if (!array || index == undefined || !array[index]) {\r\n throw new Error(`${context}: Failed to find index (${index})`);\r\n }\r\n\r\n return array[index];\r\n }\r\n\r\n /**\r\n * Assign an `index` field to each item of the given array.\r\n * @param array The array of items\r\n */\r\n public static Assign(array?: IArrItem[]): void {\r\n if (array) {\r\n for (let index = 0; index < array.length; index++) {\r\n array[index].index = index;\r\n }\r\n }\r\n }\r\n}\r\n\r\n// https://stackoverflow.com/a/48218209\r\nfunction mergeDeep(...objects: any[]): any {\r\n const isObject = (obj: any) => obj && typeof obj === \"object\";\r\n\r\n return objects.reduce((prev, obj) => {\r\n Object.keys(obj).forEach((key) => {\r\n const pVal = prev[key];\r\n const oVal = obj[key];\r\n\r\n if (Array.isArray(pVal) && Array.isArray(oVal)) {\r\n prev[key] = pVal.concat(...oVal);\r\n } else if (isObject(pVal) && isObject(oVal)) {\r\n prev[key] = mergeDeep(pVal, oVal);\r\n } else {\r\n prev[key] = oVal;\r\n }\r\n });\r\n\r\n return prev;\r\n }, {});\r\n}\r\n\r\n/**\r\n * The glTF 2.0 loader\r\n */\r\nexport class GLTFLoader implements IGLTFLoader {\r\n /** @hidden */\r\n public readonly _completePromises = new Array>();\r\n\r\n /** @hidden */\r\n public _assetContainer: Nullable = null;\r\n\r\n /** Storage */\r\n public _babylonLights: Light[] = [];\r\n\r\n /** @hidden */\r\n public _disableInstancedMesh = 0;\r\n\r\n private readonly _parent: GLTFFileLoader;\r\n private readonly _extensions = new Array();\r\n private _disposed = false;\r\n private _rootUrl: Nullable = null;\r\n private _fileName: Nullable = null;\r\n private _uniqueRootUrl: Nullable = null;\r\n private _gltf: IGLTF;\r\n private _bin: Nullable = null;\r\n private _babylonScene: Scene;\r\n private _rootBabylonMesh: Nullable = null;\r\n private _defaultBabylonMaterialData: { [drawMode: number]: Material } = {};\r\n private readonly _postSceneLoadActions = new Array<() => void>();\r\n\r\n private static _RegisteredExtensions: { [name: string]: IRegisteredExtension } = {};\r\n\r\n /**\r\n * The default glTF sampler.\r\n */\r\n public static readonly DefaultSampler: ISampler = { index: -1 };\r\n\r\n /**\r\n * Registers a loader extension.\r\n * @param name The name of the loader extension.\r\n * @param factory The factory function that creates the loader extension.\r\n */\r\n public static RegisterExtension(name: string, factory: (loader: GLTFLoader) => IGLTFLoaderExtension): void {\r\n if (GLTFLoader.UnregisterExtension(name)) {\r\n Logger.Warn(`Extension with the name '${name}' already exists`);\r\n }\r\n\r\n GLTFLoader._RegisteredExtensions[name] = {\r\n factory: factory,\r\n };\r\n }\r\n\r\n /**\r\n * Unregisters a loader extension.\r\n * @param name The name of the loader extension.\r\n * @returns A boolean indicating whether the extension has been unregistered\r\n */\r\n public static UnregisterExtension(name: string): boolean {\r\n if (!GLTFLoader._RegisteredExtensions[name]) {\r\n return false;\r\n }\r\n\r\n delete GLTFLoader._RegisteredExtensions[name];\r\n return true;\r\n }\r\n\r\n /**\r\n * The object that represents the glTF JSON.\r\n */\r\n public get gltf(): IGLTF {\r\n if (!this._gltf) {\r\n throw new Error(\"glTF JSON is not available\");\r\n }\r\n\r\n return this._gltf;\r\n }\r\n\r\n /**\r\n * The BIN chunk of a binary glTF.\r\n */\r\n public get bin(): Nullable {\r\n return this._bin;\r\n }\r\n\r\n /**\r\n * The parent file loader.\r\n */\r\n public get parent(): GLTFFileLoader {\r\n return this._parent;\r\n }\r\n\r\n /**\r\n * The Babylon scene when loading the asset.\r\n */\r\n public get babylonScene(): Scene {\r\n if (!this._babylonScene) {\r\n throw new Error(\"Scene is not available\");\r\n }\r\n\r\n return this._babylonScene;\r\n }\r\n\r\n /**\r\n * The root Babylon mesh when loading the asset.\r\n */\r\n public get rootBabylonMesh(): Nullable {\r\n return this._rootBabylonMesh;\r\n }\r\n\r\n /**\r\n * @param parent\r\n * @hidden\r\n */\r\n constructor(parent: GLTFFileLoader) {\r\n this._parent = parent;\r\n }\r\n\r\n /** @hidden */\r\n public dispose(): void {\r\n if (this._disposed) {\r\n return;\r\n }\r\n\r\n this._disposed = true;\r\n\r\n this._completePromises.length = 0;\r\n\r\n this._extensions.forEach((extension) => extension.dispose && extension.dispose());\r\n this._extensions.length = 0;\r\n\r\n (this._gltf as Nullable) = null; // TODO\r\n this._bin = null;\r\n (this._babylonScene as Nullable) = null; // TODO\r\n this._rootBabylonMesh = null;\r\n this._defaultBabylonMaterialData = {};\r\n this._postSceneLoadActions.length = 0;\r\n\r\n this._parent.dispose();\r\n }\r\n\r\n /**\r\n * @param meshesNames\r\n * @param scene\r\n * @param container\r\n * @param data\r\n * @param rootUrl\r\n * @param onProgress\r\n * @param fileName\r\n * @hidden\r\n */\r\n public importMeshAsync(\r\n meshesNames: any,\r\n scene: Scene,\r\n container: Nullable,\r\n data: IGLTFLoaderData,\r\n rootUrl: string,\r\n onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n fileName = \"\"\r\n ): Promise {\r\n return Promise.resolve().then(() => {\r\n this._babylonScene = scene;\r\n this._assetContainer = container;\r\n this._loadData(data);\r\n\r\n let nodes: Nullable> = null;\r\n\r\n if (meshesNames) {\r\n const nodeMap: { [name: string]: number } = {};\r\n if (this._gltf.nodes) {\r\n for (const node of this._gltf.nodes) {\r\n if (node.name) {\r\n nodeMap[node.name] = node.index;\r\n }\r\n }\r\n }\r\n\r\n const names = meshesNames instanceof Array ? meshesNames : [meshesNames];\r\n nodes = names.map((name) => {\r\n const node = nodeMap[name];\r\n if (node === undefined) {\r\n throw new Error(`Failed to find node '${name}'`);\r\n }\r\n\r\n return node;\r\n });\r\n }\r\n\r\n return this._loadAsync(rootUrl, fileName, nodes, () => {\r\n return {\r\n meshes: this._getMeshes(),\r\n particleSystems: [],\r\n skeletons: this._getSkeletons(),\r\n animationGroups: this._getAnimationGroups(),\r\n lights: this._babylonLights,\r\n transformNodes: this._getTransformNodes(),\r\n geometries: this._getGeometries(),\r\n };\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * @param scene\r\n * @param data\r\n * @param rootUrl\r\n * @param onProgress\r\n * @param fileName\r\n * @hidden\r\n */\r\n public loadAsync(scene: Scene, data: IGLTFLoaderData, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName = \"\"): Promise {\r\n return Promise.resolve().then(() => {\r\n this._babylonScene = scene;\r\n this._loadData(data);\r\n return this._loadAsync(rootUrl, fileName, null, () => undefined);\r\n });\r\n }\r\n\r\n private _loadAsync(rootUrl: string, fileName: string, nodes: Nullable>, resultFunc: () => T): Promise {\r\n return Promise.resolve()\r\n .then(() => {\r\n this._rootUrl = rootUrl;\r\n this._uniqueRootUrl = !rootUrl.startsWith(\"file:\") && fileName ? rootUrl : `${rootUrl}${Date.now()}/`;\r\n this._fileName = fileName;\r\n\r\n this._loadExtensions();\r\n this._checkExtensions();\r\n\r\n const loadingToReadyCounterName = `${GLTFLoaderState[GLTFLoaderState.LOADING]} => ${GLTFLoaderState[GLTFLoaderState.READY]}`;\r\n const loadingToCompleteCounterName = `${GLTFLoaderState[GLTFLoaderState.LOADING]} => ${GLTFLoaderState[GLTFLoaderState.COMPLETE]}`;\r\n\r\n this._parent._startPerformanceCounter(loadingToReadyCounterName);\r\n this._parent._startPerformanceCounter(loadingToCompleteCounterName);\r\n\r\n this._parent._setState(GLTFLoaderState.LOADING);\r\n this._extensionsOnLoading();\r\n\r\n const promises = new Array>();\r\n\r\n // Block the marking of materials dirty until the scene is loaded.\r\n const oldBlockMaterialDirtyMechanism = this._babylonScene.blockMaterialDirtyMechanism;\r\n this._babylonScene.blockMaterialDirtyMechanism = true;\r\n\r\n if (!this.parent.loadOnlyMaterials) {\r\n if (nodes) {\r\n promises.push(this.loadSceneAsync(\"/nodes\", { nodes: nodes, index: -1 }));\r\n } else if (this._gltf.scene != undefined || (this._gltf.scenes && this._gltf.scenes[0])) {\r\n const scene = ArrayItem.Get(`/scene`, this._gltf.scenes, this._gltf.scene || 0);\r\n promises.push(this.loadSceneAsync(`/scenes/${scene.index}`, scene));\r\n }\r\n }\r\n\r\n if (!this.parent.skipMaterials && this.parent.loadAllMaterials && this._gltf.materials) {\r\n for (let m = 0; m < this._gltf.materials.length; ++m) {\r\n const material = this._gltf.materials[m];\r\n const context = \"/materials/\" + m;\r\n const babylonDrawMode = Material.TriangleFillMode;\r\n\r\n promises.push(this._loadMaterialAsync(context, material, null, babylonDrawMode, () => {}));\r\n }\r\n }\r\n\r\n // Restore the blocking of material dirty.\r\n this._babylonScene.blockMaterialDirtyMechanism = oldBlockMaterialDirtyMechanism;\r\n\r\n if (this._parent.compileMaterials) {\r\n promises.push(this._compileMaterialsAsync());\r\n }\r\n\r\n if (this._parent.compileShadowGenerators) {\r\n promises.push(this._compileShadowGeneratorsAsync());\r\n }\r\n\r\n const resultPromise = Promise.all(promises).then(() => {\r\n if (this._rootBabylonMesh) {\r\n this._rootBabylonMesh.setEnabled(true);\r\n }\r\n\r\n this._extensionsOnReady();\r\n this._parent._setState(GLTFLoaderState.READY);\r\n\r\n this._startAnimations();\r\n\r\n return resultFunc();\r\n });\r\n\r\n return resultPromise.then((result) => {\r\n this._parent._endPerformanceCounter(loadingToReadyCounterName);\r\n\r\n Tools.SetImmediate(() => {\r\n if (!this._disposed) {\r\n Promise.all(this._completePromises).then(\r\n () => {\r\n this._parent._endPerformanceCounter(loadingToCompleteCounterName);\r\n\r\n this._parent._setState(GLTFLoaderState.COMPLETE);\r\n\r\n this._parent.onCompleteObservable.notifyObservers(undefined);\r\n this._parent.onCompleteObservable.clear();\r\n\r\n this.dispose();\r\n },\r\n (error) => {\r\n this._parent.onErrorObservable.notifyObservers(error);\r\n this._parent.onErrorObservable.clear();\r\n\r\n this.dispose();\r\n }\r\n );\r\n }\r\n });\r\n\r\n return result;\r\n });\r\n })\r\n .catch((error) => {\r\n if (!this._disposed) {\r\n this._parent.onErrorObservable.notifyObservers(error);\r\n this._parent.onErrorObservable.clear();\r\n\r\n this.dispose();\r\n }\r\n\r\n throw error;\r\n });\r\n }\r\n\r\n private _loadData(data: IGLTFLoaderData): void {\r\n this._gltf = data.json as IGLTF;\r\n this._setupData();\r\n\r\n if (data.bin) {\r\n const buffers = this._gltf.buffers;\r\n if (buffers && buffers[0] && !buffers[0].uri) {\r\n const binaryBuffer = buffers[0];\r\n if (binaryBuffer.byteLength < data.bin.byteLength - 3 || binaryBuffer.byteLength > data.bin.byteLength) {\r\n Logger.Warn(`Binary buffer length (${binaryBuffer.byteLength}) from JSON does not match chunk length (${data.bin.byteLength})`);\r\n }\r\n\r\n this._bin = data.bin;\r\n } else {\r\n Logger.Warn(\"Unexpected BIN chunk\");\r\n }\r\n }\r\n }\r\n\r\n private _setupData(): void {\r\n ArrayItem.Assign(this._gltf.accessors);\r\n ArrayItem.Assign(this._gltf.animations);\r\n ArrayItem.Assign(this._gltf.buffers);\r\n ArrayItem.Assign(this._gltf.bufferViews);\r\n ArrayItem.Assign(this._gltf.cameras);\r\n ArrayItem.Assign(this._gltf.images);\r\n ArrayItem.Assign(this._gltf.materials);\r\n ArrayItem.Assign(this._gltf.meshes);\r\n ArrayItem.Assign(this._gltf.nodes);\r\n ArrayItem.Assign(this._gltf.samplers);\r\n ArrayItem.Assign(this._gltf.scenes);\r\n ArrayItem.Assign(this._gltf.skins);\r\n ArrayItem.Assign(this._gltf.textures);\r\n\r\n if (this._gltf.nodes) {\r\n const nodeParents: { [index: number]: number } = {};\r\n for (const node of this._gltf.nodes) {\r\n if (node.children) {\r\n for (const index of node.children) {\r\n nodeParents[index] = node.index;\r\n }\r\n }\r\n }\r\n\r\n const rootNode = this._createRootNode();\r\n for (const node of this._gltf.nodes) {\r\n const parentIndex = nodeParents[node.index];\r\n node.parent = parentIndex === undefined ? rootNode : this._gltf.nodes[parentIndex];\r\n }\r\n }\r\n }\r\n\r\n private _loadExtensions(): void {\r\n for (const name in GLTFLoader._RegisteredExtensions) {\r\n const extension = GLTFLoader._RegisteredExtensions[name].factory(this);\r\n if (extension.name !== name) {\r\n Logger.Warn(`The name of the glTF loader extension instance does not match the registered name: ${extension.name} !== ${name}`);\r\n }\r\n\r\n this._extensions.push(extension);\r\n this._parent.onExtensionLoadedObservable.notifyObservers(extension);\r\n }\r\n\r\n this._extensions.sort((a, b) => (a.order || Number.MAX_VALUE) - (b.order || Number.MAX_VALUE));\r\n this._parent.onExtensionLoadedObservable.clear();\r\n }\r\n\r\n private _checkExtensions(): void {\r\n if (this._gltf.extensionsRequired) {\r\n for (const name of this._gltf.extensionsRequired) {\r\n const available = this._extensions.some((extension) => extension.name === name && extension.enabled);\r\n if (!available) {\r\n throw new Error(`Require extension ${name} is not available`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _createRootNode(): INode {\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n this._rootBabylonMesh = new Mesh(\"__root__\", this._babylonScene);\r\n this._rootBabylonMesh._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n this._rootBabylonMesh.setEnabled(false);\r\n\r\n const rootNode: INode = {\r\n _babylonTransformNode: this._rootBabylonMesh,\r\n index: -1,\r\n };\r\n\r\n switch (this._parent.coordinateSystemMode) {\r\n case GLTFLoaderCoordinateSystemMode.AUTO: {\r\n if (!this._babylonScene.useRightHandedSystem) {\r\n rootNode.rotation = [0, 1, 0, 0];\r\n rootNode.scale = [1, 1, -1];\r\n GLTFLoader._LoadTransform(rootNode, this._rootBabylonMesh);\r\n }\r\n break;\r\n }\r\n case GLTFLoaderCoordinateSystemMode.FORCE_RIGHT_HANDED: {\r\n this._babylonScene.useRightHandedSystem = true;\r\n break;\r\n }\r\n default: {\r\n throw new Error(`Invalid coordinate system mode (${this._parent.coordinateSystemMode})`);\r\n }\r\n }\r\n\r\n this._parent.onMeshLoadedObservable.notifyObservers(this._rootBabylonMesh);\r\n return rootNode;\r\n }\r\n\r\n /**\r\n * Loads a glTF scene.\r\n * @param context The context when loading the asset\r\n * @param scene The glTF scene property\r\n * @returns A promise that resolves when the load is complete\r\n */\r\n public loadSceneAsync(context: string, scene: IScene): Promise {\r\n const extensionPromise = this._extensionsLoadSceneAsync(context, scene);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n const promises = new Array>();\r\n\r\n this.logOpen(`${context} ${scene.name || \"\"}`);\r\n\r\n if (scene.nodes) {\r\n for (const index of scene.nodes) {\r\n const node = ArrayItem.Get(`${context}/nodes/${index}`, this._gltf.nodes, index);\r\n promises.push(\r\n this.loadNodeAsync(`/nodes/${node.index}`, node, (babylonMesh) => {\r\n babylonMesh.parent = this._rootBabylonMesh;\r\n })\r\n );\r\n }\r\n }\r\n\r\n for (const action of this._postSceneLoadActions) {\r\n action();\r\n }\r\n\r\n promises.push(this._loadAnimationsAsync());\r\n\r\n this.logClose();\r\n\r\n return Promise.all(promises).then(() => {});\r\n }\r\n\r\n private _forEachPrimitive(node: INode, callback: (babylonMesh: AbstractMesh) => void): void {\r\n if (node._primitiveBabylonMeshes) {\r\n for (const babylonMesh of node._primitiveBabylonMeshes) {\r\n callback(babylonMesh);\r\n }\r\n }\r\n }\r\n\r\n private _getGeometries(): Geometry[] {\r\n const geometries = new Array();\r\n\r\n const nodes = this._gltf.nodes;\r\n if (nodes) {\r\n for (const node of nodes) {\r\n this._forEachPrimitive(node, (babylonMesh) => {\r\n const geometry = (babylonMesh as Mesh).geometry;\r\n if (geometry && geometries.indexOf(geometry) === -1) {\r\n geometries.push(geometry);\r\n }\r\n });\r\n }\r\n }\r\n\r\n return geometries;\r\n }\r\n\r\n private _getMeshes(): AbstractMesh[] {\r\n const meshes = new Array();\r\n\r\n // Root mesh is always first, if available.\r\n if (this._rootBabylonMesh) {\r\n meshes.push(this._rootBabylonMesh);\r\n }\r\n\r\n const nodes = this._gltf.nodes;\r\n if (nodes) {\r\n for (const node of nodes) {\r\n this._forEachPrimitive(node, (babylonMesh) => {\r\n meshes.push(babylonMesh);\r\n });\r\n }\r\n }\r\n\r\n return meshes;\r\n }\r\n\r\n private _getTransformNodes(): TransformNode[] {\r\n const transformNodes = new Array();\r\n\r\n const nodes = this._gltf.nodes;\r\n if (nodes) {\r\n for (const node of nodes) {\r\n if (node._babylonTransformNode && node._babylonTransformNode.getClassName() === \"TransformNode\") {\r\n transformNodes.push(node._babylonTransformNode);\r\n }\r\n if (node._babylonTransformNodeForSkin) {\r\n transformNodes.push(node._babylonTransformNodeForSkin);\r\n }\r\n }\r\n }\r\n\r\n return transformNodes;\r\n }\r\n\r\n private _getSkeletons(): Skeleton[] {\r\n const skeletons = new Array();\r\n\r\n const skins = this._gltf.skins;\r\n if (skins) {\r\n for (const skin of skins) {\r\n if (skin._data) {\r\n skeletons.push(skin._data.babylonSkeleton);\r\n }\r\n }\r\n }\r\n\r\n return skeletons;\r\n }\r\n\r\n private _getAnimationGroups(): AnimationGroup[] {\r\n const animationGroups = new Array();\r\n\r\n const animations = this._gltf.animations;\r\n if (animations) {\r\n for (const animation of animations) {\r\n if (animation._babylonAnimationGroup) {\r\n animationGroups.push(animation._babylonAnimationGroup);\r\n }\r\n }\r\n }\r\n\r\n return animationGroups;\r\n }\r\n\r\n private _startAnimations(): void {\r\n switch (this._parent.animationStartMode) {\r\n case GLTFLoaderAnimationStartMode.NONE: {\r\n // do nothing\r\n break;\r\n }\r\n case GLTFLoaderAnimationStartMode.FIRST: {\r\n const babylonAnimationGroups = this._getAnimationGroups();\r\n if (babylonAnimationGroups.length !== 0) {\r\n babylonAnimationGroups[0].start(true);\r\n }\r\n break;\r\n }\r\n case GLTFLoaderAnimationStartMode.ALL: {\r\n const babylonAnimationGroups = this._getAnimationGroups();\r\n for (const babylonAnimationGroup of babylonAnimationGroups) {\r\n babylonAnimationGroup.start(true);\r\n }\r\n break;\r\n }\r\n default: {\r\n Logger.Error(`Invalid animation start mode (${this._parent.animationStartMode})`);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Loads a glTF node.\r\n * @param context The context when loading the asset\r\n * @param node The glTF node property\r\n * @param assign A function called synchronously after parsing the glTF properties\r\n * @returns A promise that resolves with the loaded Babylon mesh when the load is complete\r\n */\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void = () => {}): Promise {\r\n const extensionPromise = this._extensionsLoadNodeAsync(context, node, assign);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n if (node._babylonTransformNode) {\r\n throw new Error(`${context}: Invalid recursive node hierarchy`);\r\n }\r\n\r\n const promises = new Array>();\r\n\r\n this.logOpen(`${context} ${node.name || \"\"}`);\r\n\r\n const loadNode = (babylonTransformNode: TransformNode) => {\r\n GLTFLoader.AddPointerMetadata(babylonTransformNode, context);\r\n GLTFLoader._LoadTransform(node, babylonTransformNode);\r\n\r\n if (node.camera != undefined) {\r\n const camera = ArrayItem.Get(`${context}/camera`, this._gltf.cameras, node.camera);\r\n promises.push(\r\n this.loadCameraAsync(`/cameras/${camera.index}`, camera, (babylonCamera) => {\r\n babylonCamera.parent = babylonTransformNode;\r\n })\r\n );\r\n }\r\n\r\n if (node.children) {\r\n for (const index of node.children) {\r\n const childNode = ArrayItem.Get(`${context}/children/${index}`, this._gltf.nodes, index);\r\n promises.push(\r\n this.loadNodeAsync(`/nodes/${childNode.index}`, childNode, (childBabylonMesh) => {\r\n childBabylonMesh.parent = babylonTransformNode;\r\n })\r\n );\r\n }\r\n }\r\n\r\n assign(babylonTransformNode);\r\n };\r\n\r\n if (node.mesh == undefined || node.skin != undefined) {\r\n const nodeName = node.name || `node${node.index}`;\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n const transformNode = new TransformNode(nodeName, this._babylonScene);\r\n transformNode._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n if (node.mesh == undefined) {\r\n node._babylonTransformNode = transformNode;\r\n } else {\r\n node._babylonTransformNodeForSkin = transformNode;\r\n }\r\n loadNode(transformNode);\r\n }\r\n\r\n if (node.mesh != undefined) {\r\n if (node.skin == undefined) {\r\n const mesh = ArrayItem.Get(`${context}/mesh`, this._gltf.meshes, node.mesh);\r\n promises.push(this._loadMeshAsync(`/meshes/${mesh.index}`, node, mesh, loadNode));\r\n } else {\r\n // See https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins (second implementation note)\r\n // This code path will place the skinned mesh as a sibling of the skeleton root node without loading the\r\n // transform, which effectively ignores the transform of the skinned mesh, as per spec.\r\n\r\n const mesh = ArrayItem.Get(`${context}/mesh`, this._gltf.meshes, node.mesh);\r\n promises.push(\r\n this._loadMeshAsync(`/meshes/${mesh.index}`, node, mesh, (babylonTransformNode) => {\r\n const babylonTransformNodeForSkin = node._babylonTransformNodeForSkin!;\r\n\r\n // Merge the metadata from the skin node to the skinned mesh in case a loader extension added metadata.\r\n babylonTransformNode.metadata = mergeDeep(babylonTransformNodeForSkin.metadata, babylonTransformNode.metadata || {});\r\n\r\n const skin = ArrayItem.Get(`${context}/skin`, this._gltf.skins, node.skin);\r\n promises.push(\r\n this._loadSkinAsync(`/skins/${skin.index}`, node, skin, (babylonSkeleton) => {\r\n this._forEachPrimitive(node, (babylonMesh) => {\r\n babylonMesh.skeleton = babylonSkeleton;\r\n });\r\n\r\n // Wait until all the nodes are parented before parenting the skinned mesh.\r\n this._postSceneLoadActions.push(() => {\r\n if (skin.skeleton != undefined) {\r\n // Place the skinned mesh node as a sibling of the skeleton root node.\r\n // Handle special case when the parent of the skeleton root is the skinned mesh.\r\n const parentNode = ArrayItem.Get(`/skins/${skin.index}/skeleton`, this._gltf.nodes, skin.skeleton).parent!;\r\n if (node.index === parentNode.index) {\r\n babylonTransformNode.parent = babylonTransformNodeForSkin.parent;\r\n } else {\r\n babylonTransformNode.parent = parentNode._babylonTransformNode!;\r\n }\r\n } else {\r\n babylonTransformNode.parent = this._rootBabylonMesh;\r\n }\r\n\r\n this._parent.onSkinLoadedObservable.notifyObservers({ node: babylonTransformNodeForSkin, skinnedNode: babylonTransformNode });\r\n });\r\n })\r\n );\r\n })\r\n );\r\n }\r\n }\r\n\r\n this.logClose();\r\n\r\n return Promise.all(promises).then(() => {\r\n this._forEachPrimitive(node, (babylonMesh) => {\r\n if ((babylonMesh as Mesh).geometry && (babylonMesh as Mesh).geometry!.useBoundingInfoFromGeometry) {\r\n // simply apply the world matrices to the bounding info - the extends are already ok\r\n babylonMesh._updateBoundingInfo();\r\n } else {\r\n babylonMesh.refreshBoundingInfo(true);\r\n }\r\n });\r\n\r\n return node._babylonTransformNode!;\r\n });\r\n }\r\n\r\n private _loadMeshAsync(context: string, node: INode, mesh: IMesh, assign: (babylonTransformNode: TransformNode) => void): Promise {\r\n const primitives = mesh.primitives;\r\n if (!primitives || !primitives.length) {\r\n throw new Error(`${context}: Primitives are missing`);\r\n }\r\n\r\n if (primitives[0].index == undefined) {\r\n ArrayItem.Assign(primitives);\r\n }\r\n\r\n const promises = new Array>();\r\n\r\n this.logOpen(`${context} ${mesh.name || \"\"}`);\r\n\r\n const name = node.name || `node${node.index}`;\r\n\r\n if (primitives.length === 1) {\r\n const primitive = mesh.primitives[0];\r\n promises.push(\r\n this._loadMeshPrimitiveAsync(`${context}/primitives/${primitive.index}`, name, node, mesh, primitive, (babylonMesh) => {\r\n node._babylonTransformNode = babylonMesh;\r\n node._primitiveBabylonMeshes = [babylonMesh];\r\n })\r\n );\r\n } else {\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n node._babylonTransformNode = new TransformNode(name, this._babylonScene);\r\n node._babylonTransformNode._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n node._primitiveBabylonMeshes = [];\r\n for (const primitive of primitives) {\r\n promises.push(\r\n this._loadMeshPrimitiveAsync(`${context}/primitives/${primitive.index}`, `${name}_primitive${primitive.index}`, node, mesh, primitive, (babylonMesh) => {\r\n babylonMesh.parent = node._babylonTransformNode!;\r\n node._primitiveBabylonMeshes!.push(babylonMesh);\r\n })\r\n );\r\n }\r\n }\r\n\r\n assign(node._babylonTransformNode!);\r\n\r\n this.logClose();\r\n\r\n return Promise.all(promises).then(() => {\r\n return node._babylonTransformNode!;\r\n });\r\n }\r\n\r\n /**\r\n * @hidden Define this method to modify the default behavior when loading data for mesh primitives.\r\n * @param context The context when loading the asset\r\n * @param name The mesh name when loading the asset\r\n * @param node The glTF node when loading the asset\r\n * @param mesh The glTF mesh when loading the asset\r\n * @param primitive The glTF mesh primitive property\r\n * @param assign A function called synchronously after parsing the glTF properties\r\n * @returns A promise that resolves with the loaded mesh when the load is complete or null if not handled\r\n */\r\n public _loadMeshPrimitiveAsync(\r\n context: string,\r\n name: string,\r\n node: INode,\r\n mesh: IMesh,\r\n primitive: IMeshPrimitive,\r\n assign: (babylonMesh: AbstractMesh) => void\r\n ): Promise {\r\n const extensionPromise = this._extensionsLoadMeshPrimitiveAsync(context, name, node, mesh, primitive, assign);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n this.logOpen(`${context}`);\r\n\r\n const shouldInstance = this._disableInstancedMesh === 0 && this._parent.createInstances && node.skin == undefined && !mesh.primitives[0].targets;\r\n\r\n let babylonAbstractMesh: AbstractMesh;\r\n let promise: Promise;\r\n\r\n if (shouldInstance && primitive._instanceData) {\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n babylonAbstractMesh = primitive._instanceData.babylonSourceMesh.createInstance(name) as InstancedMesh;\r\n babylonAbstractMesh._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n promise = primitive._instanceData.promise;\r\n } else {\r\n const promises = new Array>();\r\n\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n const babylonMesh = new Mesh(name, this._babylonScene);\r\n babylonMesh._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n babylonMesh.overrideMaterialSideOrientation = this._babylonScene.useRightHandedSystem ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation;\r\n\r\n this._createMorphTargets(context, node, mesh, primitive, babylonMesh);\r\n promises.push(\r\n this._loadVertexDataAsync(context, primitive, babylonMesh).then((babylonGeometry) => {\r\n return this._loadMorphTargetsAsync(context, primitive, babylonMesh, babylonGeometry).then(() => {\r\n if (this._disposed) {\r\n return;\r\n }\r\n\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n babylonGeometry.applyToMesh(babylonMesh);\r\n babylonGeometry._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n });\r\n })\r\n );\r\n\r\n const babylonDrawMode = GLTFLoader._GetDrawMode(context, primitive.mode);\r\n if (primitive.material == undefined) {\r\n let babylonMaterial = this._defaultBabylonMaterialData[babylonDrawMode];\r\n if (!babylonMaterial) {\r\n babylonMaterial = this._createDefaultMaterial(\"__GLTFLoader._default\", babylonDrawMode);\r\n this._parent.onMaterialLoadedObservable.notifyObservers(babylonMaterial);\r\n this._defaultBabylonMaterialData[babylonDrawMode] = babylonMaterial;\r\n }\r\n babylonMesh.material = babylonMaterial;\r\n } else if (!this.parent.skipMaterials) {\r\n const material = ArrayItem.Get(`${context}/material`, this._gltf.materials, primitive.material);\r\n promises.push(\r\n this._loadMaterialAsync(`/materials/${material.index}`, material, babylonMesh, babylonDrawMode, (babylonMaterial) => {\r\n babylonMesh.material = babylonMaterial;\r\n })\r\n );\r\n }\r\n\r\n promise = Promise.all(promises);\r\n\r\n if (shouldInstance) {\r\n primitive._instanceData = {\r\n babylonSourceMesh: babylonMesh,\r\n promise: promise,\r\n };\r\n }\r\n\r\n babylonAbstractMesh = babylonMesh;\r\n }\r\n\r\n GLTFLoader.AddPointerMetadata(babylonAbstractMesh, context);\r\n this._parent.onMeshLoadedObservable.notifyObservers(babylonAbstractMesh);\r\n assign(babylonAbstractMesh);\r\n\r\n this.logClose();\r\n\r\n return promise.then(() => {\r\n return babylonAbstractMesh;\r\n });\r\n }\r\n\r\n private _loadVertexDataAsync(context: string, primitive: IMeshPrimitive, babylonMesh: Mesh): Promise {\r\n const extensionPromise = this._extensionsLoadVertexDataAsync(context, primitive, babylonMesh);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n const attributes = primitive.attributes;\r\n if (!attributes) {\r\n throw new Error(`${context}: Attributes are missing`);\r\n }\r\n\r\n const promises = new Array>();\r\n\r\n const babylonGeometry = new Geometry(babylonMesh.name, this._babylonScene);\r\n\r\n if (primitive.indices == undefined) {\r\n babylonMesh.isUnIndexed = true;\r\n } else {\r\n const accessor = ArrayItem.Get(`${context}/indices`, this._gltf.accessors, primitive.indices);\r\n promises.push(\r\n this._loadIndicesAccessorAsync(`/accessors/${accessor.index}`, accessor).then((data) => {\r\n babylonGeometry.setIndices(data);\r\n })\r\n );\r\n }\r\n\r\n const loadAttribute = (attribute: string, kind: string, callback?: (accessor: IAccessor) => void) => {\r\n if (attributes[attribute] == undefined) {\r\n return;\r\n }\r\n\r\n babylonMesh._delayInfo = babylonMesh._delayInfo || [];\r\n if (babylonMesh._delayInfo.indexOf(kind) === -1) {\r\n babylonMesh._delayInfo.push(kind);\r\n }\r\n\r\n const accessor = ArrayItem.Get(`${context}/attributes/${attribute}`, this._gltf.accessors, attributes[attribute]);\r\n promises.push(\r\n this._loadVertexAccessorAsync(`/accessors/${accessor.index}`, accessor, kind).then((babylonVertexBuffer) => {\r\n if (babylonVertexBuffer.getKind() === VertexBuffer.PositionKind && !this.parent.alwaysComputeBoundingBox && !babylonMesh.skeleton) {\r\n const mmin = accessor.min as [number, number, number],\r\n mmax = accessor.max as [number, number, number];\r\n if (mmin !== undefined && mmax !== undefined) {\r\n if (accessor.normalized && accessor.componentType !== AccessorComponentType.FLOAT) {\r\n let divider = 1;\r\n switch (accessor.componentType) {\r\n case AccessorComponentType.BYTE:\r\n divider = 127.0;\r\n break;\r\n case AccessorComponentType.UNSIGNED_BYTE:\r\n divider = 255.0;\r\n break;\r\n case AccessorComponentType.SHORT:\r\n divider = 32767.0;\r\n break;\r\n case AccessorComponentType.UNSIGNED_SHORT:\r\n divider = 65535.0;\r\n break;\r\n }\r\n for (let i = 0; i < 3; ++i) {\r\n mmin[i] = Math.max(mmin[i] / divider, -1.0);\r\n mmax[i] = Math.max(mmax[i] / divider, -1.0);\r\n }\r\n }\r\n const min = TmpVectors.Vector3[0],\r\n max = TmpVectors.Vector3[1];\r\n min.copyFromFloats(...mmin);\r\n max.copyFromFloats(...mmax);\r\n babylonGeometry._boundingInfo = new BoundingInfo(min, max);\r\n babylonGeometry.useBoundingInfoFromGeometry = true;\r\n }\r\n }\r\n babylonGeometry.setVerticesBuffer(babylonVertexBuffer, accessor.count);\r\n })\r\n );\r\n\r\n if (kind == VertexBuffer.MatricesIndicesExtraKind) {\r\n babylonMesh.numBoneInfluencers = 8;\r\n }\r\n\r\n if (callback) {\r\n callback(accessor);\r\n }\r\n };\r\n\r\n loadAttribute(\"POSITION\", VertexBuffer.PositionKind);\r\n loadAttribute(\"NORMAL\", VertexBuffer.NormalKind);\r\n loadAttribute(\"TANGENT\", VertexBuffer.TangentKind);\r\n loadAttribute(\"TEXCOORD_0\", VertexBuffer.UVKind);\r\n loadAttribute(\"TEXCOORD_1\", VertexBuffer.UV2Kind);\r\n loadAttribute(\"TEXCOORD_2\", VertexBuffer.UV3Kind);\r\n loadAttribute(\"TEXCOORD_3\", VertexBuffer.UV4Kind);\r\n loadAttribute(\"TEXCOORD_4\", VertexBuffer.UV5Kind);\r\n loadAttribute(\"TEXCOORD_5\", VertexBuffer.UV6Kind);\r\n loadAttribute(\"JOINTS_0\", VertexBuffer.MatricesIndicesKind);\r\n loadAttribute(\"WEIGHTS_0\", VertexBuffer.MatricesWeightsKind);\r\n loadAttribute(\"JOINTS_1\", VertexBuffer.MatricesIndicesExtraKind);\r\n loadAttribute(\"WEIGHTS_1\", VertexBuffer.MatricesWeightsExtraKind);\r\n loadAttribute(\"COLOR_0\", VertexBuffer.ColorKind, (accessor) => {\r\n if (accessor.type === AccessorType.VEC4) {\r\n babylonMesh.hasVertexAlpha = true;\r\n }\r\n });\r\n\r\n return Promise.all(promises).then(() => {\r\n return babylonGeometry;\r\n });\r\n }\r\n\r\n private _createMorphTargets(context: string, node: INode, mesh: IMesh, primitive: IMeshPrimitive, babylonMesh: Mesh): void {\r\n if (!primitive.targets) {\r\n return;\r\n }\r\n\r\n if (node._numMorphTargets == undefined) {\r\n node._numMorphTargets = primitive.targets.length;\r\n } else if (primitive.targets.length !== node._numMorphTargets) {\r\n throw new Error(`${context}: Primitives do not have the same number of targets`);\r\n }\r\n\r\n const targetNames = mesh.extras ? mesh.extras.targetNames : null;\r\n\r\n babylonMesh.morphTargetManager = new MorphTargetManager(babylonMesh.getScene());\r\n babylonMesh.morphTargetManager.areUpdatesFrozen = true;\r\n\r\n for (let index = 0; index < primitive.targets.length; index++) {\r\n const weight = node.weights ? node.weights[index] : mesh.weights ? mesh.weights[index] : 0;\r\n const name = targetNames ? targetNames[index] : `morphTarget${index}`;\r\n babylonMesh.morphTargetManager.addTarget(new MorphTarget(name, weight, babylonMesh.getScene()));\r\n // TODO: tell the target whether it has positions, normals, tangents\r\n }\r\n }\r\n\r\n private _loadMorphTargetsAsync(context: string, primitive: IMeshPrimitive, babylonMesh: Mesh, babylonGeometry: Geometry): Promise {\r\n if (!primitive.targets) {\r\n return Promise.resolve();\r\n }\r\n\r\n const promises = new Array>();\r\n\r\n const morphTargetManager = babylonMesh.morphTargetManager!;\r\n for (let index = 0; index < morphTargetManager.numTargets; index++) {\r\n const babylonMorphTarget = morphTargetManager.getTarget(index);\r\n promises.push(this._loadMorphTargetVertexDataAsync(`${context}/targets/${index}`, babylonGeometry, primitive.targets[index], babylonMorphTarget));\r\n }\r\n\r\n return Promise.all(promises).then(() => {\r\n morphTargetManager.areUpdatesFrozen = false;\r\n });\r\n }\r\n\r\n private _loadMorphTargetVertexDataAsync(context: string, babylonGeometry: Geometry, attributes: { [name: string]: number }, babylonMorphTarget: MorphTarget): Promise {\r\n const promises = new Array>();\r\n\r\n const loadAttribute = (attribute: string, kind: string, setData: (babylonVertexBuffer: VertexBuffer, data: Float32Array) => void) => {\r\n if (attributes[attribute] == undefined) {\r\n return;\r\n }\r\n\r\n const babylonVertexBuffer = babylonGeometry.getVertexBuffer(kind);\r\n if (!babylonVertexBuffer) {\r\n return;\r\n }\r\n\r\n const accessor = ArrayItem.Get(`${context}/${attribute}`, this._gltf.accessors, attributes[attribute]);\r\n promises.push(\r\n this._loadFloatAccessorAsync(`/accessors/${accessor.index}`, accessor).then((data) => {\r\n setData(babylonVertexBuffer, data);\r\n })\r\n );\r\n };\r\n\r\n loadAttribute(\"POSITION\", VertexBuffer.PositionKind, (babylonVertexBuffer, data) => {\r\n const positions = new Float32Array(data.length);\r\n babylonVertexBuffer.forEach(data.length, (value, index) => {\r\n positions[index] = data[index] + value;\r\n });\r\n\r\n babylonMorphTarget.setPositions(positions);\r\n });\r\n\r\n loadAttribute(\"NORMAL\", VertexBuffer.NormalKind, (babylonVertexBuffer, data) => {\r\n const normals = new Float32Array(data.length);\r\n babylonVertexBuffer.forEach(normals.length, (value, index) => {\r\n normals[index] = data[index] + value;\r\n });\r\n\r\n babylonMorphTarget.setNormals(normals);\r\n });\r\n\r\n loadAttribute(\"TANGENT\", VertexBuffer.TangentKind, (babylonVertexBuffer, data) => {\r\n const tangents = new Float32Array((data.length / 3) * 4);\r\n let dataIndex = 0;\r\n babylonVertexBuffer.forEach((data.length / 3) * 4, (value, index) => {\r\n // Tangent data for morph targets is stored as xyz delta.\r\n // The vertexData.tangent is stored as xyzw.\r\n // So we need to skip every fourth vertexData.tangent.\r\n if ((index + 1) % 4 !== 0) {\r\n tangents[dataIndex] = data[dataIndex] + value;\r\n dataIndex++;\r\n }\r\n });\r\n babylonMorphTarget.setTangents(tangents);\r\n });\r\n\r\n return Promise.all(promises).then(() => {});\r\n }\r\n\r\n private static _LoadTransform(node: INode, babylonNode: TransformNode): void {\r\n // Ignore the TRS of skinned nodes.\r\n // See https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins (second implementation note)\r\n if (node.skin != undefined) {\r\n return;\r\n }\r\n\r\n let position = Vector3.Zero();\r\n let rotation = Quaternion.Identity();\r\n let scaling = Vector3.One();\r\n\r\n if (node.matrix) {\r\n const matrix = Matrix.FromArray(node.matrix);\r\n matrix.decompose(scaling, rotation, position);\r\n } else {\r\n if (node.translation) {\r\n position = Vector3.FromArray(node.translation);\r\n }\r\n if (node.rotation) {\r\n rotation = Quaternion.FromArray(node.rotation);\r\n }\r\n if (node.scale) {\r\n scaling = Vector3.FromArray(node.scale);\r\n }\r\n }\r\n\r\n babylonNode.position = position;\r\n babylonNode.rotationQuaternion = rotation;\r\n babylonNode.scaling = scaling;\r\n }\r\n\r\n private _loadSkinAsync(context: string, node: INode, skin: ISkin, assign: (babylonSkeleton: Skeleton) => void): Promise {\r\n const extensionPromise = this._extensionsLoadSkinAsync(context, node, skin);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n if (skin._data) {\r\n assign(skin._data.babylonSkeleton);\r\n return skin._data.promise;\r\n }\r\n\r\n const skeletonId = `skeleton${skin.index}`;\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n const babylonSkeleton = new Skeleton(skin.name || skeletonId, skeletonId, this._babylonScene);\r\n babylonSkeleton._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n\r\n this._loadBones(context, skin, babylonSkeleton);\r\n const promise = this._loadSkinInverseBindMatricesDataAsync(context, skin).then((inverseBindMatricesData) => {\r\n this._updateBoneMatrices(babylonSkeleton, inverseBindMatricesData);\r\n });\r\n\r\n skin._data = {\r\n babylonSkeleton: babylonSkeleton,\r\n promise: promise,\r\n };\r\n\r\n assign(babylonSkeleton);\r\n\r\n return promise;\r\n }\r\n\r\n private _loadBones(context: string, skin: ISkin, babylonSkeleton: Skeleton): void {\r\n if (skin.skeleton == undefined || this._parent.alwaysComputeSkeletonRootNode) {\r\n const rootNode = this._findSkeletonRootNode(`${context}/joints`, skin.joints);\r\n if (rootNode) {\r\n if (skin.skeleton === undefined) {\r\n skin.skeleton = rootNode.index;\r\n } else {\r\n const isParent = (a: INode, b: INode): boolean => {\r\n for (; b.parent; b = b.parent) {\r\n if (b.parent === a) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n const skeletonNode = ArrayItem.Get(`${context}/skeleton`, this._gltf.nodes, skin.skeleton);\r\n if (skeletonNode !== rootNode && !isParent(skeletonNode, rootNode)) {\r\n Logger.Warn(`${context}/skeleton: Overriding with nearest common ancestor as skeleton node is not a common root`);\r\n skin.skeleton = rootNode.index;\r\n }\r\n }\r\n } else {\r\n Logger.Warn(`${context}: Failed to find common root`);\r\n }\r\n }\r\n\r\n const babylonBones: { [index: number]: Bone } = {};\r\n for (const index of skin.joints) {\r\n const node = ArrayItem.Get(`${context}/joints/${index}`, this._gltf.nodes, index);\r\n this._loadBone(node, skin, babylonSkeleton, babylonBones);\r\n }\r\n }\r\n\r\n private _findSkeletonRootNode(context: string, joints: Array): Nullable {\r\n if (joints.length === 0) {\r\n return null;\r\n }\r\n\r\n const paths: { [joint: number]: Array } = {};\r\n for (const index of joints) {\r\n const path = new Array();\r\n let node = ArrayItem.Get(`${context}/${index}`, this._gltf.nodes, index);\r\n while (node.index !== -1) {\r\n path.unshift(node);\r\n node = node.parent!;\r\n }\r\n paths[index] = path;\r\n }\r\n\r\n let rootNode: Nullable = null;\r\n for (let i = 0; ; ++i) {\r\n let path = paths[joints[0]];\r\n if (i >= path.length) {\r\n return rootNode;\r\n }\r\n\r\n const node = path[i];\r\n for (let j = 1; j < joints.length; ++j) {\r\n path = paths[joints[j]];\r\n if (i >= path.length || node !== path[i]) {\r\n return rootNode;\r\n }\r\n }\r\n\r\n rootNode = node;\r\n }\r\n }\r\n\r\n private _loadBone(node: INode, skin: ISkin, babylonSkeleton: Skeleton, babylonBones: { [index: number]: Bone }): Bone {\r\n let babylonBone = babylonBones[node.index];\r\n if (babylonBone) {\r\n return babylonBone;\r\n }\r\n\r\n let parentBabylonBone: Nullable = null;\r\n if (node.index !== skin.skeleton) {\r\n if (node.parent && node.parent.index !== -1) {\r\n parentBabylonBone = this._loadBone(node.parent, skin, babylonSkeleton, babylonBones);\r\n } else if (skin.skeleton !== undefined) {\r\n Logger.Warn(`/skins/${skin.index}/skeleton: Skeleton node is not a common root`);\r\n }\r\n }\r\n\r\n const boneIndex = skin.joints.indexOf(node.index);\r\n babylonBone = new Bone(node.name || `joint${node.index}`, babylonSkeleton, parentBabylonBone, this._getNodeMatrix(node), null, null, boneIndex);\r\n babylonBones[node.index] = babylonBone;\r\n\r\n // Wait until the scene is loaded to ensure the transform nodes are loaded.\r\n this._postSceneLoadActions.push(() => {\r\n // Link the Babylon bone with the corresponding Babylon transform node.\r\n // A glTF joint is a pointer to a glTF node in the glTF node hierarchy similar to Unity3D.\r\n babylonBone.linkTransformNode(node._babylonTransformNode!);\r\n });\r\n\r\n return babylonBone;\r\n }\r\n\r\n private _loadSkinInverseBindMatricesDataAsync(context: string, skin: ISkin): Promise> {\r\n if (skin.inverseBindMatrices == undefined) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n const accessor = ArrayItem.Get(`${context}/inverseBindMatrices`, this._gltf.accessors, skin.inverseBindMatrices);\r\n return this._loadFloatAccessorAsync(`/accessors/${accessor.index}`, accessor);\r\n }\r\n\r\n private _updateBoneMatrices(babylonSkeleton: Skeleton, inverseBindMatricesData: Nullable): void {\r\n for (const babylonBone of babylonSkeleton.bones) {\r\n const baseMatrix = Matrix.Identity();\r\n const boneIndex = babylonBone._index!;\r\n if (inverseBindMatricesData && boneIndex !== -1) {\r\n Matrix.FromArrayToRef(inverseBindMatricesData, boneIndex * 16, baseMatrix);\r\n baseMatrix.invertToRef(baseMatrix);\r\n }\r\n\r\n const babylonParentBone = babylonBone.getParent();\r\n if (babylonParentBone) {\r\n baseMatrix.multiplyToRef(babylonParentBone.getInvertedAbsoluteTransform(), baseMatrix);\r\n }\r\n\r\n babylonBone.updateMatrix(baseMatrix, false, false);\r\n babylonBone._updateDifferenceMatrix(undefined, false);\r\n }\r\n }\r\n\r\n private _getNodeMatrix(node: INode): Matrix {\r\n return node.matrix\r\n ? Matrix.FromArray(node.matrix)\r\n : Matrix.Compose(\r\n node.scale ? Vector3.FromArray(node.scale) : Vector3.One(),\r\n node.rotation ? Quaternion.FromArray(node.rotation) : Quaternion.Identity(),\r\n node.translation ? Vector3.FromArray(node.translation) : Vector3.Zero()\r\n );\r\n }\r\n\r\n /**\r\n * Loads a glTF camera.\r\n * @param context The context when loading the asset\r\n * @param camera The glTF camera property\r\n * @param assign A function called synchronously after parsing the glTF properties\r\n * @returns A promise that resolves with the loaded Babylon camera when the load is complete\r\n */\r\n public loadCameraAsync(context: string, camera: ICamera, assign: (babylonCamera: Camera) => void = () => {}): Promise {\r\n const extensionPromise = this._extensionsLoadCameraAsync(context, camera, assign);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n const promises = new Array>();\r\n\r\n this.logOpen(`${context} ${camera.name || \"\"}`);\r\n\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n const babylonCamera = new FreeCamera(camera.name || `camera${camera.index}`, Vector3.Zero(), this._babylonScene, false);\r\n babylonCamera._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n babylonCamera.ignoreParentScaling = true;\r\n\r\n babylonCamera.rotation = new Vector3(0, Math.PI, 0);\r\n\r\n switch (camera.type) {\r\n case CameraType.PERSPECTIVE: {\r\n const perspective = camera.perspective;\r\n if (!perspective) {\r\n throw new Error(`${context}: Camera perspective properties are missing`);\r\n }\r\n\r\n babylonCamera.fov = perspective.yfov;\r\n babylonCamera.minZ = perspective.znear;\r\n babylonCamera.maxZ = perspective.zfar || 0;\r\n break;\r\n }\r\n case CameraType.ORTHOGRAPHIC: {\r\n if (!camera.orthographic) {\r\n throw new Error(`${context}: Camera orthographic properties are missing`);\r\n }\r\n\r\n babylonCamera.mode = Camera.ORTHOGRAPHIC_CAMERA;\r\n babylonCamera.orthoLeft = -camera.orthographic.xmag;\r\n babylonCamera.orthoRight = camera.orthographic.xmag;\r\n babylonCamera.orthoBottom = -camera.orthographic.ymag;\r\n babylonCamera.orthoTop = camera.orthographic.ymag;\r\n babylonCamera.minZ = camera.orthographic.znear;\r\n babylonCamera.maxZ = camera.orthographic.zfar;\r\n break;\r\n }\r\n default: {\r\n throw new Error(`${context}: Invalid camera type (${camera.type})`);\r\n }\r\n }\r\n\r\n GLTFLoader.AddPointerMetadata(babylonCamera, context);\r\n this._parent.onCameraLoadedObservable.notifyObservers(babylonCamera);\r\n assign(babylonCamera);\r\n\r\n this.logClose();\r\n\r\n return Promise.all(promises).then(() => {\r\n return babylonCamera;\r\n });\r\n }\r\n\r\n private _loadAnimationsAsync(): Promise {\r\n const animations = this._gltf.animations;\r\n if (!animations) {\r\n return Promise.resolve();\r\n }\r\n\r\n const promises = new Array>();\r\n\r\n for (let index = 0; index < animations.length; index++) {\r\n const animation = animations[index];\r\n promises.push(\r\n this.loadAnimationAsync(`/animations/${animation.index}`, animation).then((animationGroup) => {\r\n // Delete the animation group if it ended up not having any animations in it.\r\n if (animationGroup.targetedAnimations.length === 0) {\r\n animationGroup.dispose();\r\n }\r\n })\r\n );\r\n }\r\n\r\n return Promise.all(promises).then(() => {});\r\n }\r\n\r\n /**\r\n * Loads a glTF animation.\r\n * @param context The context when loading the asset\r\n * @param animation The glTF animation property\r\n * @returns A promise that resolves with the loaded Babylon animation group when the load is complete\r\n */\r\n public loadAnimationAsync(context: string, animation: IAnimation): Promise {\r\n const promise = this._extensionsLoadAnimationAsync(context, animation);\r\n if (promise) {\r\n return promise;\r\n }\r\n\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n const babylonAnimationGroup = new AnimationGroup(animation.name || `animation${animation.index}`, this._babylonScene);\r\n babylonAnimationGroup._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n animation._babylonAnimationGroup = babylonAnimationGroup;\r\n\r\n const promises = new Array>();\r\n\r\n ArrayItem.Assign(animation.channels);\r\n ArrayItem.Assign(animation.samplers);\r\n\r\n for (const channel of animation.channels) {\r\n promises.push(this._loadAnimationChannelAsync(`${context}/channels/${channel.index}`, context, animation, channel, babylonAnimationGroup));\r\n }\r\n\r\n return Promise.all(promises).then(() => {\r\n babylonAnimationGroup.normalize(0);\r\n return babylonAnimationGroup;\r\n });\r\n }\r\n\r\n /**\r\n * @hidden Loads a glTF animation channel.\r\n * @param context The context when loading the asset\r\n * @param animationContext The context of the animation when loading the asset\r\n * @param animation The glTF animation property\r\n * @param channel The glTF animation channel property\r\n * @param babylonAnimationGroup The babylon animation group property\r\n * @param animationTargetOverride The babylon animation channel target override property. My be null.\r\n * @returns A void promise when the channel load is complete\r\n */\r\n public _loadAnimationChannelAsync(\r\n context: string,\r\n animationContext: string,\r\n animation: IAnimation,\r\n channel: IAnimationChannel,\r\n babylonAnimationGroup: AnimationGroup,\r\n animationTargetOverride: Nullable = null\r\n ): Promise {\r\n if (channel.target.node == undefined) {\r\n return Promise.resolve();\r\n }\r\n\r\n const targetNode = ArrayItem.Get(`${context}/target/node`, this._gltf.nodes, channel.target.node);\r\n\r\n // Ignore animations that have no animation targets.\r\n if (\r\n (channel.target.path === AnimationChannelTargetPath.WEIGHTS && !targetNode._numMorphTargets) ||\r\n (channel.target.path !== AnimationChannelTargetPath.WEIGHTS && !targetNode._babylonTransformNode)\r\n ) {\r\n return Promise.resolve();\r\n }\r\n\r\n const sampler = ArrayItem.Get(`${context}/sampler`, animation.samplers, channel.sampler);\r\n return this._loadAnimationSamplerAsync(`${animationContext}/samplers/${channel.sampler}`, sampler).then((data) => {\r\n let targetPath: string;\r\n let animationType: number;\r\n switch (channel.target.path) {\r\n case AnimationChannelTargetPath.TRANSLATION: {\r\n targetPath = \"position\";\r\n animationType = Animation.ANIMATIONTYPE_VECTOR3;\r\n break;\r\n }\r\n case AnimationChannelTargetPath.ROTATION: {\r\n targetPath = \"rotationQuaternion\";\r\n animationType = Animation.ANIMATIONTYPE_QUATERNION;\r\n break;\r\n }\r\n case AnimationChannelTargetPath.SCALE: {\r\n targetPath = \"scaling\";\r\n animationType = Animation.ANIMATIONTYPE_VECTOR3;\r\n break;\r\n }\r\n case AnimationChannelTargetPath.WEIGHTS: {\r\n targetPath = \"influence\";\r\n animationType = Animation.ANIMATIONTYPE_FLOAT;\r\n break;\r\n }\r\n default: {\r\n throw new Error(`${context}/target/path: Invalid value (${channel.target.path})`);\r\n }\r\n }\r\n\r\n let outputBufferOffset = 0;\r\n let getNextOutputValue: (scale: number) => Vector3 | Quaternion | Array;\r\n switch (targetPath) {\r\n case \"position\": {\r\n getNextOutputValue = (scale) => {\r\n const value = Vector3.FromArray(data.output, outputBufferOffset).scaleInPlace(scale);\r\n outputBufferOffset += 3;\r\n return value;\r\n };\r\n break;\r\n }\r\n case \"rotationQuaternion\": {\r\n getNextOutputValue = (scale) => {\r\n const value = Quaternion.FromArray(data.output, outputBufferOffset).scaleInPlace(scale);\r\n outputBufferOffset += 4;\r\n return value;\r\n };\r\n break;\r\n }\r\n case \"scaling\": {\r\n getNextOutputValue = (scale) => {\r\n const value = Vector3.FromArray(data.output, outputBufferOffset).scaleInPlace(scale);\r\n outputBufferOffset += 3;\r\n return value;\r\n };\r\n break;\r\n }\r\n case \"influence\": {\r\n getNextOutputValue = (scale) => {\r\n const value = new Array(targetNode._numMorphTargets!);\r\n for (let i = 0; i < targetNode._numMorphTargets!; i++) {\r\n value[i] = data.output[outputBufferOffset++] * scale;\r\n }\r\n return value;\r\n };\r\n break;\r\n }\r\n }\r\n\r\n let getNextKey: (frameIndex: number) => IAnimationKey;\r\n switch (data.interpolation) {\r\n case AnimationSamplerInterpolation.STEP: {\r\n getNextKey = (frameIndex) => ({\r\n frame: data.input[frameIndex] * this.parent.targetFps,\r\n value: getNextOutputValue(1),\r\n interpolation: AnimationKeyInterpolation.STEP,\r\n });\r\n break;\r\n }\r\n case AnimationSamplerInterpolation.LINEAR: {\r\n getNextKey = (frameIndex) => ({\r\n frame: data.input[frameIndex] * this.parent.targetFps,\r\n value: getNextOutputValue(1),\r\n });\r\n break;\r\n }\r\n case AnimationSamplerInterpolation.CUBICSPLINE: {\r\n const invTargetFps = 1 / this.parent.targetFps;\r\n getNextKey = (frameIndex) => ({\r\n frame: data.input[frameIndex] * this.parent.targetFps,\r\n inTangent: getNextOutputValue(invTargetFps),\r\n value: getNextOutputValue(1),\r\n outTangent: getNextOutputValue(invTargetFps),\r\n });\r\n break;\r\n }\r\n }\r\n\r\n const keys = new Array(data.input.length);\r\n for (let frameIndex = 0; frameIndex < data.input.length; frameIndex++) {\r\n keys[frameIndex] = getNextKey!(frameIndex);\r\n }\r\n\r\n if (targetPath === \"influence\") {\r\n for (let targetIndex = 0; targetIndex < targetNode._numMorphTargets!; targetIndex++) {\r\n const animationName = `${babylonAnimationGroup.name}_channel${babylonAnimationGroup.targetedAnimations.length}`;\r\n const babylonAnimation = new Animation(animationName, targetPath, this.parent.targetFps, animationType);\r\n babylonAnimation.setKeys(\r\n keys.map((key) => ({\r\n frame: key.frame,\r\n inTangent: key.inTangent ? key.inTangent[targetIndex] : undefined,\r\n value: key.value[targetIndex],\r\n outTangent: key.outTangent ? key.outTangent[targetIndex] : undefined,\r\n interpolation: key.interpolation,\r\n }))\r\n );\r\n\r\n this._forEachPrimitive(targetNode, (babylonAbstractMesh: AbstractMesh) => {\r\n const babylonMesh = babylonAbstractMesh as Mesh;\r\n if (babylonMesh.morphTargetManager) {\r\n const morphTarget = babylonMesh.morphTargetManager.getTarget(targetIndex);\r\n const babylonAnimationClone = babylonAnimation.clone();\r\n morphTarget.animations.push(babylonAnimationClone);\r\n babylonAnimationGroup.addTargetedAnimation(babylonAnimationClone, morphTarget);\r\n }\r\n });\r\n }\r\n } else {\r\n const animationName = `${babylonAnimationGroup.name}_channel${babylonAnimationGroup.targetedAnimations.length}`;\r\n const babylonAnimation = new Animation(animationName, targetPath, this.parent.targetFps, animationType);\r\n babylonAnimation.setKeys(keys);\r\n\r\n if (animationTargetOverride != null && animationTargetOverride.animations != null) {\r\n animationTargetOverride.animations.push(babylonAnimation);\r\n babylonAnimationGroup.addTargetedAnimation(babylonAnimation, animationTargetOverride);\r\n } else {\r\n targetNode._babylonTransformNode!.animations.push(babylonAnimation);\r\n babylonAnimationGroup.addTargetedAnimation(babylonAnimation, targetNode._babylonTransformNode!);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _loadAnimationSamplerAsync(context: string, sampler: IAnimationSampler): Promise<_IAnimationSamplerData> {\r\n if (sampler._data) {\r\n return sampler._data;\r\n }\r\n\r\n const interpolation = sampler.interpolation || AnimationSamplerInterpolation.LINEAR;\r\n switch (interpolation) {\r\n case AnimationSamplerInterpolation.STEP:\r\n case AnimationSamplerInterpolation.LINEAR:\r\n case AnimationSamplerInterpolation.CUBICSPLINE: {\r\n break;\r\n }\r\n default: {\r\n throw new Error(`${context}/interpolation: Invalid value (${sampler.interpolation})`);\r\n }\r\n }\r\n\r\n const inputAccessor = ArrayItem.Get(`${context}/input`, this._gltf.accessors, sampler.input);\r\n const outputAccessor = ArrayItem.Get(`${context}/output`, this._gltf.accessors, sampler.output);\r\n sampler._data = Promise.all([\r\n this._loadFloatAccessorAsync(`/accessors/${inputAccessor.index}`, inputAccessor),\r\n this._loadFloatAccessorAsync(`/accessors/${outputAccessor.index}`, outputAccessor),\r\n ]).then(([inputData, outputData]) => {\r\n return {\r\n input: inputData,\r\n interpolation: interpolation,\r\n output: outputData,\r\n };\r\n });\r\n\r\n return sampler._data;\r\n }\r\n\r\n /**\r\n * Loads a glTF buffer.\r\n * @param context The context when loading the asset\r\n * @param buffer The glTF buffer property\r\n * @param byteOffset The byte offset to use\r\n * @param byteLength The byte length to use\r\n * @returns A promise that resolves with the loaded data when the load is complete\r\n */\r\n public loadBufferAsync(context: string, buffer: IBuffer, byteOffset: number, byteLength: number): Promise {\r\n const extensionPromise = this._extensionsLoadBufferAsync(context, buffer, byteOffset, byteLength);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n if (!buffer._data) {\r\n if (buffer.uri) {\r\n buffer._data = this.loadUriAsync(`${context}/uri`, buffer, buffer.uri);\r\n } else {\r\n if (!this._bin) {\r\n throw new Error(`${context}: Uri is missing or the binary glTF is missing its binary chunk`);\r\n }\r\n\r\n buffer._data = this._bin.readAsync(0, buffer.byteLength);\r\n }\r\n }\r\n\r\n return buffer._data.then((data) => {\r\n try {\r\n return new Uint8Array(data.buffer, data.byteOffset + byteOffset, byteLength);\r\n } catch (e) {\r\n throw new Error(`${context}: ${e.message}`);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Loads a glTF buffer view.\r\n * @param context The context when loading the asset\r\n * @param bufferView The glTF buffer view property\r\n * @returns A promise that resolves with the loaded data when the load is complete\r\n */\r\n public loadBufferViewAsync(context: string, bufferView: IBufferView): Promise {\r\n const extensionPromise = this._extensionsLoadBufferViewAsync(context, bufferView);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n if (bufferView._data) {\r\n return bufferView._data;\r\n }\r\n\r\n const buffer = ArrayItem.Get(`${context}/buffer`, this._gltf.buffers, bufferView.buffer);\r\n bufferView._data = this.loadBufferAsync(`/buffers/${buffer.index}`, buffer, bufferView.byteOffset || 0, bufferView.byteLength);\r\n\r\n return bufferView._data;\r\n }\r\n\r\n private _loadAccessorAsync(context: string, accessor: IAccessor, constructor: TypedArrayConstructor): Promise {\r\n if (accessor._data) {\r\n return accessor._data;\r\n }\r\n\r\n const numComponents = GLTFLoader._GetNumComponents(context, accessor.type);\r\n const byteStride = numComponents * VertexBuffer.GetTypeByteLength(accessor.componentType);\r\n const length = numComponents * accessor.count;\r\n\r\n if (accessor.bufferView == undefined) {\r\n accessor._data = Promise.resolve(new constructor(length));\r\n } else {\r\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, accessor.bufferView);\r\n accessor._data = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView).then((data) => {\r\n if (accessor.componentType === AccessorComponentType.FLOAT && !accessor.normalized && (!bufferView.byteStride || bufferView.byteStride === byteStride)) {\r\n return GLTFLoader._GetTypedArray(context, accessor.componentType, data, accessor.byteOffset, length);\r\n } else {\r\n const typedArray = new constructor(length);\r\n VertexBuffer.ForEach(\r\n data,\r\n accessor.byteOffset || 0,\r\n bufferView.byteStride || byteStride,\r\n numComponents,\r\n accessor.componentType,\r\n typedArray.length,\r\n accessor.normalized || false,\r\n (value, index) => {\r\n typedArray[index] = value;\r\n }\r\n );\r\n return typedArray;\r\n }\r\n });\r\n }\r\n\r\n if (accessor.sparse) {\r\n const sparse = accessor.sparse;\r\n accessor._data = accessor._data.then((data) => {\r\n const typedArray = data as TypedArrayLike;\r\n const indicesBufferView = ArrayItem.Get(`${context}/sparse/indices/bufferView`, this._gltf.bufferViews, sparse.indices.bufferView);\r\n const valuesBufferView = ArrayItem.Get(`${context}/sparse/values/bufferView`, this._gltf.bufferViews, sparse.values.bufferView);\r\n return Promise.all([\r\n this.loadBufferViewAsync(`/bufferViews/${indicesBufferView.index}`, indicesBufferView),\r\n this.loadBufferViewAsync(`/bufferViews/${valuesBufferView.index}`, valuesBufferView),\r\n ]).then(([indicesData, valuesData]) => {\r\n const indices = GLTFLoader._GetTypedArray(\r\n `${context}/sparse/indices`,\r\n sparse.indices.componentType,\r\n indicesData,\r\n sparse.indices.byteOffset,\r\n sparse.count\r\n ) as IndicesArray;\r\n\r\n const sparseLength = numComponents * sparse.count;\r\n let values: TypedArrayLike;\r\n\r\n if (accessor.componentType === AccessorComponentType.FLOAT && !accessor.normalized) {\r\n values = GLTFLoader._GetTypedArray(`${context}/sparse/values`, accessor.componentType, valuesData, sparse.values.byteOffset, sparseLength);\r\n } else {\r\n const sparseData = GLTFLoader._GetTypedArray(`${context}/sparse/values`, accessor.componentType, valuesData, sparse.values.byteOffset, sparseLength);\r\n values = new constructor(sparseLength);\r\n VertexBuffer.ForEach(sparseData, 0, byteStride, numComponents, accessor.componentType, values.length, accessor.normalized || false, (value, index) => {\r\n values[index] = value;\r\n });\r\n }\r\n\r\n let valuesIndex = 0;\r\n for (let indicesIndex = 0; indicesIndex < indices.length; indicesIndex++) {\r\n let dataIndex = indices[indicesIndex] * numComponents;\r\n for (let componentIndex = 0; componentIndex < numComponents; componentIndex++) {\r\n typedArray[dataIndex++] = values[valuesIndex++];\r\n }\r\n }\r\n\r\n return typedArray;\r\n });\r\n });\r\n }\r\n\r\n return accessor._data;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param accessor\r\n * @hidden\r\n */\r\n public _loadFloatAccessorAsync(context: string, accessor: IAccessor): Promise {\r\n return this._loadAccessorAsync(context, accessor, Float32Array) as Promise;\r\n }\r\n\r\n private _loadIndicesAccessorAsync(context: string, accessor: IAccessor): Promise {\r\n if (accessor.type !== AccessorType.SCALAR) {\r\n throw new Error(`${context}/type: Invalid value ${accessor.type}`);\r\n }\r\n\r\n if (\r\n accessor.componentType !== AccessorComponentType.UNSIGNED_BYTE &&\r\n accessor.componentType !== AccessorComponentType.UNSIGNED_SHORT &&\r\n accessor.componentType !== AccessorComponentType.UNSIGNED_INT\r\n ) {\r\n throw new Error(`${context}/componentType: Invalid value ${accessor.componentType}`);\r\n }\r\n\r\n if (accessor._data) {\r\n return accessor._data as Promise;\r\n }\r\n\r\n if (accessor.sparse) {\r\n const constructor = GLTFLoader._GetTypedArrayConstructor(`${context}/componentType`, accessor.componentType);\r\n accessor._data = this._loadAccessorAsync(context, accessor, constructor);\r\n } else {\r\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, accessor.bufferView);\r\n accessor._data = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView).then((data) => {\r\n return GLTFLoader._GetTypedArray(context, accessor.componentType, data, accessor.byteOffset, accessor.count);\r\n });\r\n }\r\n\r\n return accessor._data as Promise;\r\n }\r\n\r\n private _loadVertexBufferViewAsync(bufferView: IBufferView): Promise {\r\n if (bufferView._babylonBuffer) {\r\n return bufferView._babylonBuffer;\r\n }\r\n\r\n const engine = this._babylonScene.getEngine();\r\n bufferView._babylonBuffer = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView).then((data) => {\r\n return new Buffer(engine, data, false);\r\n });\r\n\r\n return bufferView._babylonBuffer;\r\n }\r\n\r\n private _loadVertexAccessorAsync(context: string, accessor: IAccessor, kind: string): Promise {\r\n if (accessor._babylonVertexBuffer?.[kind]) {\r\n return accessor._babylonVertexBuffer[kind];\r\n }\r\n\r\n if (!accessor._babylonVertexBuffer) {\r\n accessor._babylonVertexBuffer = {};\r\n }\r\n\r\n const engine = this._babylonScene.getEngine();\r\n\r\n if (accessor.sparse) {\r\n accessor._babylonVertexBuffer[kind] = this._loadFloatAccessorAsync(context, accessor).then((data) => {\r\n return new VertexBuffer(engine, data, kind, false);\r\n });\r\n }\r\n // Load joint indices as a float array since the shaders expect float data but glTF uses unsigned byte/short.\r\n // This prevents certain platforms (e.g. D3D) from having to convert the data to float on the fly.\r\n else if (kind === VertexBuffer.MatricesIndicesKind || kind === VertexBuffer.MatricesIndicesExtraKind) {\r\n accessor._babylonVertexBuffer[kind] = this._loadFloatAccessorAsync(context, accessor).then((data) => {\r\n return new VertexBuffer(engine, data, kind, false);\r\n });\r\n } else {\r\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, accessor.bufferView);\r\n accessor._babylonVertexBuffer[kind] = this._loadVertexBufferViewAsync(bufferView).then((babylonBuffer) => {\r\n const size = GLTFLoader._GetNumComponents(context, accessor.type);\r\n return new VertexBuffer(\r\n engine,\r\n babylonBuffer,\r\n kind,\r\n false,\r\n false,\r\n bufferView.byteStride,\r\n false,\r\n accessor.byteOffset,\r\n size,\r\n accessor.componentType,\r\n accessor.normalized,\r\n true,\r\n 1,\r\n true\r\n );\r\n });\r\n }\r\n\r\n return accessor._babylonVertexBuffer[kind];\r\n }\r\n\r\n private _loadMaterialMetallicRoughnessPropertiesAsync(context: string, properties: IMaterialPbrMetallicRoughness, babylonMaterial: Material): Promise {\r\n if (!(babylonMaterial instanceof PBRMaterial)) {\r\n throw new Error(`${context}: Material type not supported`);\r\n }\r\n\r\n const promises = new Array>();\r\n\r\n if (properties) {\r\n if (properties.baseColorFactor) {\r\n babylonMaterial.albedoColor = Color3.FromArray(properties.baseColorFactor);\r\n babylonMaterial.alpha = properties.baseColorFactor[3];\r\n } else {\r\n babylonMaterial.albedoColor = Color3.White();\r\n }\r\n\r\n babylonMaterial.metallic = properties.metallicFactor == undefined ? 1 : properties.metallicFactor;\r\n babylonMaterial.roughness = properties.roughnessFactor == undefined ? 1 : properties.roughnessFactor;\r\n\r\n if (properties.baseColorTexture) {\r\n promises.push(\r\n this.loadTextureInfoAsync(`${context}/baseColorTexture`, properties.baseColorTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Base Color)`;\r\n babylonMaterial.albedoTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.metallicRoughnessTexture) {\r\n properties.metallicRoughnessTexture.nonColorData = true;\r\n promises.push(\r\n this.loadTextureInfoAsync(`${context}/metallicRoughnessTexture`, properties.metallicRoughnessTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Metallic Roughness)`;\r\n babylonMaterial.metallicTexture = texture;\r\n })\r\n );\r\n\r\n babylonMaterial.useMetallnessFromMetallicTextureBlue = true;\r\n babylonMaterial.useRoughnessFromMetallicTextureGreen = true;\r\n babylonMaterial.useRoughnessFromMetallicTextureAlpha = false;\r\n }\r\n }\r\n\r\n return Promise.all(promises).then(() => {});\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param material\r\n * @param babylonMesh\r\n * @param babylonDrawMode\r\n * @param assign\r\n * @hidden\r\n */\r\n public _loadMaterialAsync(\r\n context: string,\r\n material: IMaterial,\r\n babylonMesh: Nullable,\r\n babylonDrawMode: number,\r\n assign: (babylonMaterial: Material) => void = () => {}\r\n ): Promise {\r\n const extensionPromise = this._extensionsLoadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n material._data = material._data || {};\r\n let babylonData = material._data[babylonDrawMode];\r\n if (!babylonData) {\r\n this.logOpen(`${context} ${material.name || \"\"}`);\r\n\r\n const babylonMaterial = this.createMaterial(context, material, babylonDrawMode);\r\n\r\n babylonData = {\r\n babylonMaterial: babylonMaterial,\r\n babylonMeshes: [],\r\n promise: this.loadMaterialPropertiesAsync(context, material, babylonMaterial),\r\n };\r\n\r\n material._data[babylonDrawMode] = babylonData;\r\n\r\n GLTFLoader.AddPointerMetadata(babylonMaterial, context);\r\n this._parent.onMaterialLoadedObservable.notifyObservers(babylonMaterial);\r\n\r\n this.logClose();\r\n }\r\n\r\n if (babylonMesh) {\r\n babylonData.babylonMeshes.push(babylonMesh);\r\n\r\n babylonMesh.onDisposeObservable.addOnce(() => {\r\n const index = babylonData.babylonMeshes.indexOf(babylonMesh);\r\n if (index !== -1) {\r\n babylonData.babylonMeshes.splice(index, 1);\r\n }\r\n });\r\n }\r\n\r\n assign(babylonData.babylonMaterial);\r\n\r\n return babylonData.promise.then(() => {\r\n return babylonData.babylonMaterial;\r\n });\r\n }\r\n\r\n private _createDefaultMaterial(name: string, babylonDrawMode: number): Material {\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n const babylonMaterial = new PBRMaterial(name, this._babylonScene);\r\n babylonMaterial._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n // Moved to mesh so user can change materials on gltf meshes: babylonMaterial.sideOrientation = this._babylonScene.useRightHandedSystem ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation;\r\n babylonMaterial.fillMode = babylonDrawMode;\r\n babylonMaterial.enableSpecularAntiAliasing = true;\r\n babylonMaterial.useRadianceOverAlpha = !this._parent.transparencyAsCoverage;\r\n babylonMaterial.useSpecularOverAlpha = !this._parent.transparencyAsCoverage;\r\n babylonMaterial.transparencyMode = PBRMaterial.PBRMATERIAL_OPAQUE;\r\n babylonMaterial.metallic = 1;\r\n babylonMaterial.roughness = 1;\r\n return babylonMaterial;\r\n }\r\n\r\n /**\r\n * Creates a Babylon material from a glTF material.\r\n * @param context The context when loading the asset\r\n * @param material The glTF material property\r\n * @param babylonDrawMode The draw mode for the Babylon material\r\n * @returns The Babylon material\r\n */\r\n public createMaterial(context: string, material: IMaterial, babylonDrawMode: number): Material {\r\n const extensionPromise = this._extensionsCreateMaterial(context, material, babylonDrawMode);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n const name = material.name || `material${material.index}`;\r\n const babylonMaterial = this._createDefaultMaterial(name, babylonDrawMode);\r\n\r\n return babylonMaterial;\r\n }\r\n\r\n /**\r\n * Loads properties from a glTF material into a Babylon material.\r\n * @param context The context when loading the asset\r\n * @param material The glTF material property\r\n * @param babylonMaterial The Babylon material\r\n * @returns A promise that resolves when the load is complete\r\n */\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Promise {\r\n const extensionPromise = this._extensionsLoadMaterialPropertiesAsync(context, material, babylonMaterial);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n const promises = new Array>();\r\n\r\n promises.push(this.loadMaterialBasePropertiesAsync(context, material, babylonMaterial));\r\n\r\n if (material.pbrMetallicRoughness) {\r\n promises.push(this._loadMaterialMetallicRoughnessPropertiesAsync(`${context}/pbrMetallicRoughness`, material.pbrMetallicRoughness, babylonMaterial));\r\n }\r\n\r\n this.loadMaterialAlphaProperties(context, material, babylonMaterial);\r\n\r\n return Promise.all(promises).then(() => {});\r\n }\r\n\r\n /**\r\n * Loads the normal, occlusion, and emissive properties from a glTF material into a Babylon material.\r\n * @param context The context when loading the asset\r\n * @param material The glTF material property\r\n * @param babylonMaterial The Babylon material\r\n * @returns A promise that resolves when the load is complete\r\n */\r\n public loadMaterialBasePropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Promise {\r\n if (!(babylonMaterial instanceof PBRMaterial)) {\r\n throw new Error(`${context}: Material type not supported`);\r\n }\r\n\r\n const promises = new Array>();\r\n\r\n babylonMaterial.emissiveColor = material.emissiveFactor ? Color3.FromArray(material.emissiveFactor) : new Color3(0, 0, 0);\r\n if (material.doubleSided) {\r\n babylonMaterial.backFaceCulling = false;\r\n babylonMaterial.twoSidedLighting = true;\r\n }\r\n\r\n if (material.normalTexture) {\r\n material.normalTexture.nonColorData = true;\r\n promises.push(\r\n this.loadTextureInfoAsync(`${context}/normalTexture`, material.normalTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Normal)`;\r\n babylonMaterial.bumpTexture = texture;\r\n })\r\n );\r\n\r\n babylonMaterial.invertNormalMapX = !this._babylonScene.useRightHandedSystem;\r\n babylonMaterial.invertNormalMapY = this._babylonScene.useRightHandedSystem;\r\n if (material.normalTexture.scale != undefined && babylonMaterial.bumpTexture) {\r\n babylonMaterial.bumpTexture.level = material.normalTexture.scale;\r\n }\r\n\r\n babylonMaterial.forceIrradianceInFragment = true;\r\n }\r\n\r\n if (material.occlusionTexture) {\r\n material.occlusionTexture.nonColorData = true;\r\n promises.push(\r\n this.loadTextureInfoAsync(`${context}/occlusionTexture`, material.occlusionTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Occlusion)`;\r\n babylonMaterial.ambientTexture = texture;\r\n })\r\n );\r\n\r\n babylonMaterial.useAmbientInGrayScale = true;\r\n if (material.occlusionTexture.strength != undefined) {\r\n babylonMaterial.ambientTextureStrength = material.occlusionTexture.strength;\r\n }\r\n }\r\n\r\n if (material.emissiveTexture) {\r\n promises.push(\r\n this.loadTextureInfoAsync(`${context}/emissiveTexture`, material.emissiveTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Emissive)`;\r\n babylonMaterial.emissiveTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n return Promise.all(promises).then(() => {});\r\n }\r\n\r\n /**\r\n * Loads the alpha properties from a glTF material into a Babylon material.\r\n * Must be called after the setting the albedo texture of the Babylon material when the material has an albedo texture.\r\n * @param context The context when loading the asset\r\n * @param material The glTF material property\r\n * @param babylonMaterial The Babylon material\r\n */\r\n public loadMaterialAlphaProperties(context: string, material: IMaterial, babylonMaterial: Material): void {\r\n if (!(babylonMaterial instanceof PBRMaterial)) {\r\n throw new Error(`${context}: Material type not supported`);\r\n }\r\n\r\n const alphaMode = material.alphaMode || MaterialAlphaMode.OPAQUE;\r\n switch (alphaMode) {\r\n case MaterialAlphaMode.OPAQUE: {\r\n babylonMaterial.transparencyMode = PBRMaterial.PBRMATERIAL_OPAQUE;\r\n break;\r\n }\r\n case MaterialAlphaMode.MASK: {\r\n babylonMaterial.transparencyMode = PBRMaterial.PBRMATERIAL_ALPHATEST;\r\n babylonMaterial.alphaCutOff = material.alphaCutoff == undefined ? 0.5 : material.alphaCutoff;\r\n if (babylonMaterial.albedoTexture) {\r\n babylonMaterial.albedoTexture.hasAlpha = true;\r\n }\r\n break;\r\n }\r\n case MaterialAlphaMode.BLEND: {\r\n babylonMaterial.transparencyMode = PBRMaterial.PBRMATERIAL_ALPHABLEND;\r\n if (babylonMaterial.albedoTexture) {\r\n babylonMaterial.albedoTexture.hasAlpha = true;\r\n babylonMaterial.useAlphaFromAlbedoTexture = true;\r\n }\r\n break;\r\n }\r\n default: {\r\n throw new Error(`${context}/alphaMode: Invalid value (${material.alphaMode})`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Loads a glTF texture info.\r\n * @param context The context when loading the asset\r\n * @param textureInfo The glTF texture info property\r\n * @param assign A function called synchronously after parsing the glTF properties\r\n * @returns A promise that resolves with the loaded Babylon texture when the load is complete\r\n */\r\n public loadTextureInfoAsync(context: string, textureInfo: ITextureInfo, assign: (babylonTexture: BaseTexture) => void = () => {}): Promise {\r\n const extensionPromise = this._extensionsLoadTextureInfoAsync(context, textureInfo, assign);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n this.logOpen(`${context}`);\r\n\r\n if (textureInfo.texCoord! >= 6) {\r\n throw new Error(`${context}/texCoord: Invalid value (${textureInfo.texCoord})`);\r\n }\r\n\r\n const texture = ArrayItem.Get(`${context}/index`, this._gltf.textures, textureInfo.index);\r\n texture._textureInfo = textureInfo;\r\n\r\n const promise = this._loadTextureAsync(`/textures/${textureInfo.index}`, texture, (babylonTexture) => {\r\n babylonTexture.coordinatesIndex = textureInfo.texCoord || 0;\r\n GLTFLoader.AddPointerMetadata(babylonTexture, context);\r\n this._parent.onTextureLoadedObservable.notifyObservers(babylonTexture);\r\n assign(babylonTexture);\r\n });\r\n\r\n this.logClose();\r\n\r\n return promise;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param texture\r\n * @param assign\r\n * @hidden\r\n */\r\n public _loadTextureAsync(context: string, texture: ITexture, assign: (babylonTexture: BaseTexture) => void = () => {}): Promise {\r\n const extensionPromise = this._extensionsLoadTextureAsync(context, texture, assign);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n this.logOpen(`${context} ${texture.name || \"\"}`);\r\n\r\n const sampler = texture.sampler == undefined ? GLTFLoader.DefaultSampler : ArrayItem.Get(`${context}/sampler`, this._gltf.samplers, texture.sampler);\r\n const image = ArrayItem.Get(`${context}/source`, this._gltf.images, texture.source);\r\n const promise = this._createTextureAsync(context, sampler, image, assign, undefined, !texture._textureInfo.nonColorData);\r\n\r\n this.logClose();\r\n\r\n return promise;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param sampler\r\n * @param image\r\n * @param assign\r\n * @param textureLoaderOptions\r\n * @param useSRGBBuffer\r\n * @hidden\r\n */\r\n public _createTextureAsync(\r\n context: string,\r\n sampler: ISampler,\r\n image: IImage,\r\n assign: (babylonTexture: BaseTexture) => void = () => {},\r\n textureLoaderOptions?: any,\r\n useSRGBBuffer?: boolean\r\n ): Promise {\r\n const samplerData = this._loadSampler(`/samplers/${sampler.index}`, sampler);\r\n\r\n const promises = new Array>();\r\n\r\n const deferred = new Deferred();\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n const textureCreationOptions: ITextureCreationOptions = {\r\n noMipmap: samplerData.noMipMaps,\r\n invertY: false,\r\n samplingMode: samplerData.samplingMode,\r\n onLoad: () => {\r\n if (!this._disposed) {\r\n deferred.resolve();\r\n }\r\n },\r\n onError: (message?: string, exception?: any) => {\r\n if (!this._disposed) {\r\n deferred.reject(new Error(`${context}: ${exception && exception.message ? exception.message : message || \"Failed to load texture\"}`));\r\n }\r\n },\r\n mimeType: image.mimeType,\r\n loaderOptions: textureLoaderOptions,\r\n useSRGBBuffer: !!useSRGBBuffer && this._parent.useSRGBBuffers,\r\n };\r\n const babylonTexture = new Texture(null, this._babylonScene, textureCreationOptions);\r\n babylonTexture._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n promises.push(deferred.promise);\r\n\r\n promises.push(\r\n this.loadImageAsync(`/images/${image.index}`, image).then((data) => {\r\n const name = image.uri || `${this._fileName}#image${image.index}`;\r\n const dataUrl = `data:${this._uniqueRootUrl}${name}`;\r\n babylonTexture.updateURL(dataUrl, data);\r\n })\r\n );\r\n\r\n babylonTexture.wrapU = samplerData.wrapU;\r\n babylonTexture.wrapV = samplerData.wrapV;\r\n assign(babylonTexture);\r\n\r\n return Promise.all(promises).then(() => {\r\n return babylonTexture;\r\n });\r\n }\r\n\r\n private _loadSampler(context: string, sampler: ISampler): _ISamplerData {\r\n if (!sampler._data) {\r\n sampler._data = {\r\n noMipMaps: sampler.minFilter === TextureMinFilter.NEAREST || sampler.minFilter === TextureMinFilter.LINEAR,\r\n samplingMode: GLTFLoader._GetTextureSamplingMode(context, sampler),\r\n wrapU: GLTFLoader._GetTextureWrapMode(`${context}/wrapS`, sampler.wrapS),\r\n wrapV: GLTFLoader._GetTextureWrapMode(`${context}/wrapT`, sampler.wrapT),\r\n };\r\n }\r\n\r\n return sampler._data;\r\n }\r\n\r\n /**\r\n * Loads a glTF image.\r\n * @param context The context when loading the asset\r\n * @param image The glTF image property\r\n * @returns A promise that resolves with the loaded data when the load is complete\r\n */\r\n public loadImageAsync(context: string, image: IImage): Promise {\r\n if (!image._data) {\r\n this.logOpen(`${context} ${image.name || \"\"}`);\r\n\r\n if (image.uri) {\r\n image._data = this.loadUriAsync(`${context}/uri`, image, image.uri);\r\n } else {\r\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, image.bufferView);\r\n image._data = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView);\r\n }\r\n\r\n this.logClose();\r\n }\r\n\r\n return image._data;\r\n }\r\n\r\n /**\r\n * Loads a glTF uri.\r\n * @param context The context when loading the asset\r\n * @param property The glTF property associated with the uri\r\n * @param uri The base64 or relative uri\r\n * @returns A promise that resolves with the loaded data when the load is complete\r\n */\r\n public loadUriAsync(context: string, property: IProperty, uri: string): Promise {\r\n const extensionPromise = this._extensionsLoadUriAsync(context, property, uri);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n if (!GLTFLoader._ValidateUri(uri)) {\r\n throw new Error(`${context}: '${uri}' is invalid`);\r\n }\r\n\r\n if (IsBase64DataUrl(uri)) {\r\n const data = new Uint8Array(DecodeBase64UrlToBinary(uri));\r\n this.log(`${context}: Decoded ${uri.substr(0, 64)}... (${data.length} bytes)`);\r\n return Promise.resolve(data);\r\n }\r\n\r\n this.log(`${context}: Loading ${uri}`);\r\n\r\n return this._parent.preprocessUrlAsync(this._rootUrl + uri).then((url) => {\r\n return new Promise((resolve, reject) => {\r\n this._parent._loadFile(\r\n this._babylonScene,\r\n url,\r\n (data) => {\r\n if (!this._disposed) {\r\n this.log(`${context}: Loaded ${uri} (${(data as ArrayBuffer).byteLength} bytes)`);\r\n resolve(new Uint8Array(data as ArrayBuffer));\r\n }\r\n },\r\n true,\r\n (request) => {\r\n reject(new LoadFileError(`${context}: Failed to load '${uri}'${request ? \": \" + request.status + \" \" + request.statusText : \"\"}`, request));\r\n }\r\n );\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Adds a JSON pointer to the metadata of the Babylon object at `.metadata.gltf.pointers`.\r\n * @param babylonObject the Babylon object with metadata\r\n * @param babylonObject.metadata\r\n * @param pointer the JSON pointer\r\n */\r\n public static AddPointerMetadata(babylonObject: { metadata: any }, pointer: string): void {\r\n const metadata = (babylonObject.metadata = babylonObject.metadata || {});\r\n const gltf = (metadata.gltf = metadata.gltf || {});\r\n const pointers = (gltf.pointers = gltf.pointers || []);\r\n pointers.push(pointer);\r\n }\r\n\r\n private static _GetTextureWrapMode(context: string, mode: TextureWrapMode | undefined): number {\r\n // Set defaults if undefined\r\n mode = mode == undefined ? TextureWrapMode.REPEAT : mode;\r\n\r\n switch (mode) {\r\n case TextureWrapMode.CLAMP_TO_EDGE:\r\n return Texture.CLAMP_ADDRESSMODE;\r\n case TextureWrapMode.MIRRORED_REPEAT:\r\n return Texture.MIRROR_ADDRESSMODE;\r\n case TextureWrapMode.REPEAT:\r\n return Texture.WRAP_ADDRESSMODE;\r\n default:\r\n Logger.Warn(`${context}: Invalid value (${mode})`);\r\n return Texture.WRAP_ADDRESSMODE;\r\n }\r\n }\r\n\r\n private static _GetTextureSamplingMode(context: string, sampler: ISampler): number {\r\n // Set defaults if undefined\r\n const magFilter = sampler.magFilter == undefined ? TextureMagFilter.LINEAR : sampler.magFilter;\r\n const minFilter = sampler.minFilter == undefined ? TextureMinFilter.LINEAR_MIPMAP_LINEAR : sampler.minFilter;\r\n\r\n if (magFilter === TextureMagFilter.LINEAR) {\r\n switch (minFilter) {\r\n case TextureMinFilter.NEAREST:\r\n return Texture.LINEAR_NEAREST;\r\n case TextureMinFilter.LINEAR:\r\n return Texture.LINEAR_LINEAR;\r\n case TextureMinFilter.NEAREST_MIPMAP_NEAREST:\r\n return Texture.LINEAR_NEAREST_MIPNEAREST;\r\n case TextureMinFilter.LINEAR_MIPMAP_NEAREST:\r\n return Texture.LINEAR_LINEAR_MIPNEAREST;\r\n case TextureMinFilter.NEAREST_MIPMAP_LINEAR:\r\n return Texture.LINEAR_NEAREST_MIPLINEAR;\r\n case TextureMinFilter.LINEAR_MIPMAP_LINEAR:\r\n return Texture.LINEAR_LINEAR_MIPLINEAR;\r\n default:\r\n Logger.Warn(`${context}/minFilter: Invalid value (${minFilter})`);\r\n return Texture.LINEAR_LINEAR_MIPLINEAR;\r\n }\r\n } else {\r\n if (magFilter !== TextureMagFilter.NEAREST) {\r\n Logger.Warn(`${context}/magFilter: Invalid value (${magFilter})`);\r\n }\r\n\r\n switch (minFilter) {\r\n case TextureMinFilter.NEAREST:\r\n return Texture.NEAREST_NEAREST;\r\n case TextureMinFilter.LINEAR:\r\n return Texture.NEAREST_LINEAR;\r\n case TextureMinFilter.NEAREST_MIPMAP_NEAREST:\r\n return Texture.NEAREST_NEAREST_MIPNEAREST;\r\n case TextureMinFilter.LINEAR_MIPMAP_NEAREST:\r\n return Texture.NEAREST_LINEAR_MIPNEAREST;\r\n case TextureMinFilter.NEAREST_MIPMAP_LINEAR:\r\n return Texture.NEAREST_NEAREST_MIPLINEAR;\r\n case TextureMinFilter.LINEAR_MIPMAP_LINEAR:\r\n return Texture.NEAREST_LINEAR_MIPLINEAR;\r\n default:\r\n Logger.Warn(`${context}/minFilter: Invalid value (${minFilter})`);\r\n return Texture.NEAREST_NEAREST_MIPNEAREST;\r\n }\r\n }\r\n }\r\n\r\n private static _GetTypedArrayConstructor(context: string, componentType: AccessorComponentType): TypedArrayConstructor {\r\n switch (componentType) {\r\n case AccessorComponentType.BYTE:\r\n return Int8Array;\r\n case AccessorComponentType.UNSIGNED_BYTE:\r\n return Uint8Array;\r\n case AccessorComponentType.SHORT:\r\n return Int16Array;\r\n case AccessorComponentType.UNSIGNED_SHORT:\r\n return Uint16Array;\r\n case AccessorComponentType.UNSIGNED_INT:\r\n return Uint32Array;\r\n case AccessorComponentType.FLOAT:\r\n return Float32Array;\r\n default:\r\n throw new Error(`${context}: Invalid component type ${componentType}`);\r\n }\r\n }\r\n\r\n private static _GetTypedArray(\r\n context: string,\r\n componentType: AccessorComponentType,\r\n bufferView: ArrayBufferView,\r\n byteOffset: number | undefined,\r\n length: number\r\n ): TypedArrayLike {\r\n const buffer = bufferView.buffer;\r\n byteOffset = bufferView.byteOffset + (byteOffset || 0);\r\n\r\n const constructor = GLTFLoader._GetTypedArrayConstructor(`${context}/componentType`, componentType);\r\n\r\n const componentTypeLength = VertexBuffer.GetTypeByteLength(componentType);\r\n if (byteOffset % componentTypeLength !== 0) {\r\n // HACK: Copy the buffer if byte offset is not a multiple of component type byte length.\r\n Logger.Warn(`${context}: Copying buffer as byte offset (${byteOffset}) is not a multiple of component type byte length (${componentTypeLength})`);\r\n return new constructor(buffer.slice(byteOffset, byteOffset + length * componentTypeLength), 0);\r\n }\r\n\r\n return new constructor(buffer, byteOffset, length);\r\n }\r\n\r\n private static _GetNumComponents(context: string, type: string): number {\r\n switch (type) {\r\n case \"SCALAR\":\r\n return 1;\r\n case \"VEC2\":\r\n return 2;\r\n case \"VEC3\":\r\n return 3;\r\n case \"VEC4\":\r\n return 4;\r\n case \"MAT2\":\r\n return 4;\r\n case \"MAT3\":\r\n return 9;\r\n case \"MAT4\":\r\n return 16;\r\n }\r\n\r\n throw new Error(`${context}: Invalid type (${type})`);\r\n }\r\n\r\n private static _ValidateUri(uri: string): boolean {\r\n return Tools.IsBase64(uri) || uri.indexOf(\"..\") === -1;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param mode\r\n * @hidden\r\n */\r\n public static _GetDrawMode(context: string, mode: number | undefined): number {\r\n if (mode == undefined) {\r\n mode = MeshPrimitiveMode.TRIANGLES;\r\n }\r\n\r\n switch (mode) {\r\n case MeshPrimitiveMode.POINTS:\r\n return Material.PointListDrawMode;\r\n case MeshPrimitiveMode.LINES:\r\n return Material.LineListDrawMode;\r\n case MeshPrimitiveMode.LINE_LOOP:\r\n return Material.LineLoopDrawMode;\r\n case MeshPrimitiveMode.LINE_STRIP:\r\n return Material.LineStripDrawMode;\r\n case MeshPrimitiveMode.TRIANGLES:\r\n return Material.TriangleFillMode;\r\n case MeshPrimitiveMode.TRIANGLE_STRIP:\r\n return Material.TriangleStripDrawMode;\r\n case MeshPrimitiveMode.TRIANGLE_FAN:\r\n return Material.TriangleFanDrawMode;\r\n }\r\n\r\n throw new Error(`${context}: Invalid mesh primitive mode (${mode})`);\r\n }\r\n\r\n private _compileMaterialsAsync(): Promise {\r\n this._parent._startPerformanceCounter(\"Compile materials\");\r\n\r\n const promises = new Array>();\r\n\r\n if (this._gltf.materials) {\r\n for (const material of this._gltf.materials) {\r\n if (material._data) {\r\n for (const babylonDrawMode in material._data) {\r\n const babylonData = material._data[babylonDrawMode];\r\n for (const babylonMesh of babylonData.babylonMeshes) {\r\n // Ensure nonUniformScaling is set if necessary.\r\n babylonMesh.computeWorldMatrix(true);\r\n\r\n const babylonMaterial = babylonData.babylonMaterial;\r\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh));\r\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, { useInstances: true }));\r\n if (this._parent.useClipPlane) {\r\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, { clipPlane: true }));\r\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, { clipPlane: true, useInstances: true }));\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return Promise.all(promises).then(() => {\r\n this._parent._endPerformanceCounter(\"Compile materials\");\r\n });\r\n }\r\n\r\n private _compileShadowGeneratorsAsync(): Promise {\r\n this._parent._startPerformanceCounter(\"Compile shadow generators\");\r\n\r\n const promises = new Array>();\r\n\r\n const lights = this._babylonScene.lights;\r\n for (const light of lights) {\r\n const generator = light.getShadowGenerator();\r\n if (generator) {\r\n promises.push(generator.forceCompilationAsync());\r\n }\r\n }\r\n\r\n return Promise.all(promises).then(() => {\r\n this._parent._endPerformanceCounter(\"Compile shadow generators\");\r\n });\r\n }\r\n\r\n private _forEachExtensions(action: (extension: IGLTFLoaderExtension) => void): void {\r\n for (const extension of this._extensions) {\r\n if (extension.enabled) {\r\n action(extension);\r\n }\r\n }\r\n }\r\n\r\n private _applyExtensions(property: IProperty, functionName: string, actionAsync: (extension: IGLTFLoaderExtension) => Nullable | undefined): Nullable {\r\n for (const extension of this._extensions) {\r\n if (extension.enabled) {\r\n const id = `${extension.name}.${functionName}`;\r\n const loaderProperty = property as ILoaderProperty;\r\n loaderProperty._activeLoaderExtensionFunctions = loaderProperty._activeLoaderExtensionFunctions || {};\r\n const activeLoaderExtensionFunctions = loaderProperty._activeLoaderExtensionFunctions;\r\n if (!activeLoaderExtensionFunctions[id]) {\r\n activeLoaderExtensionFunctions[id] = true;\r\n\r\n try {\r\n const result = actionAsync(extension);\r\n if (result) {\r\n return result;\r\n }\r\n } finally {\r\n delete activeLoaderExtensionFunctions[id];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _extensionsOnLoading(): void {\r\n this._forEachExtensions((extension) => extension.onLoading && extension.onLoading());\r\n }\r\n\r\n private _extensionsOnReady(): void {\r\n this._forEachExtensions((extension) => extension.onReady && extension.onReady());\r\n }\r\n\r\n private _extensionsLoadSceneAsync(context: string, scene: IScene): Nullable> {\r\n return this._applyExtensions(scene, \"loadScene\", (extension) => extension.loadSceneAsync && extension.loadSceneAsync(context, scene));\r\n }\r\n\r\n private _extensionsLoadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable> {\r\n return this._applyExtensions(node, \"loadNode\", (extension) => extension.loadNodeAsync && extension.loadNodeAsync(context, node, assign));\r\n }\r\n\r\n private _extensionsLoadCameraAsync(context: string, camera: ICamera, assign: (babylonCamera: Camera) => void): Nullable> {\r\n return this._applyExtensions(camera, \"loadCamera\", (extension) => extension.loadCameraAsync && extension.loadCameraAsync(context, camera, assign));\r\n }\r\n\r\n private _extensionsLoadVertexDataAsync(context: string, primitive: IMeshPrimitive, babylonMesh: Mesh): Nullable> {\r\n return this._applyExtensions(primitive, \"loadVertexData\", (extension) => extension._loadVertexDataAsync && extension._loadVertexDataAsync(context, primitive, babylonMesh));\r\n }\r\n\r\n private _extensionsLoadMeshPrimitiveAsync(\r\n context: string,\r\n name: string,\r\n node: INode,\r\n mesh: IMesh,\r\n primitive: IMeshPrimitive,\r\n assign: (babylonMesh: AbstractMesh) => void\r\n ): Nullable> {\r\n return this._applyExtensions(\r\n primitive,\r\n \"loadMeshPrimitive\",\r\n (extension) => extension._loadMeshPrimitiveAsync && extension._loadMeshPrimitiveAsync(context, name, node, mesh, primitive, assign)\r\n );\r\n }\r\n\r\n private _extensionsLoadMaterialAsync(\r\n context: string,\r\n material: IMaterial,\r\n babylonMesh: Nullable,\r\n babylonDrawMode: number,\r\n assign: (babylonMaterial: Material) => void\r\n ): Nullable> {\r\n return this._applyExtensions(\r\n material,\r\n \"loadMaterial\",\r\n (extension) => extension._loadMaterialAsync && extension._loadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign)\r\n );\r\n }\r\n\r\n private _extensionsCreateMaterial(context: string, material: IMaterial, babylonDrawMode: number): Nullable {\r\n return this._applyExtensions(material, \"createMaterial\", (extension) => extension.createMaterial && extension.createMaterial(context, material, babylonDrawMode));\r\n }\r\n\r\n private _extensionsLoadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> {\r\n return this._applyExtensions(\r\n material,\r\n \"loadMaterialProperties\",\r\n (extension) => extension.loadMaterialPropertiesAsync && extension.loadMaterialPropertiesAsync(context, material, babylonMaterial)\r\n );\r\n }\r\n\r\n private _extensionsLoadTextureInfoAsync(context: string, textureInfo: ITextureInfo, assign: (babylonTexture: BaseTexture) => void): Nullable> {\r\n return this._applyExtensions(textureInfo, \"loadTextureInfo\", (extension) => extension.loadTextureInfoAsync && extension.loadTextureInfoAsync(context, textureInfo, assign));\r\n }\r\n\r\n private _extensionsLoadTextureAsync(context: string, texture: ITexture, assign: (babylonTexture: BaseTexture) => void): Nullable> {\r\n return this._applyExtensions(texture, \"loadTexture\", (extension) => extension._loadTextureAsync && extension._loadTextureAsync(context, texture, assign));\r\n }\r\n\r\n private _extensionsLoadAnimationAsync(context: string, animation: IAnimation): Nullable> {\r\n return this._applyExtensions(animation, \"loadAnimation\", (extension) => extension.loadAnimationAsync && extension.loadAnimationAsync(context, animation));\r\n }\r\n\r\n private _extensionsLoadSkinAsync(context: string, node: INode, skin: ISkin): Nullable> {\r\n return this._applyExtensions(skin, \"loadSkin\", (extension) => extension._loadSkinAsync && extension._loadSkinAsync(context, node, skin));\r\n }\r\n\r\n private _extensionsLoadUriAsync(context: string, property: IProperty, uri: string): Nullable> {\r\n return this._applyExtensions(property, \"loadUri\", (extension) => extension._loadUriAsync && extension._loadUriAsync(context, property, uri));\r\n }\r\n\r\n private _extensionsLoadBufferViewAsync(context: string, bufferView: IBufferView): Nullable> {\r\n return this._applyExtensions(bufferView, \"loadBufferView\", (extension) => extension.loadBufferViewAsync && extension.loadBufferViewAsync(context, bufferView));\r\n }\r\n\r\n private _extensionsLoadBufferAsync(context: string, buffer: IBuffer, byteOffset: number, byteLength: number): Nullable> {\r\n return this._applyExtensions(buffer, \"loadBuffer\", (extension) => extension.loadBufferAsync && extension.loadBufferAsync(context, buffer, byteOffset, byteLength));\r\n }\r\n\r\n /**\r\n * Helper method called by a loader extension to load an glTF extension.\r\n * @param context The context when loading the asset\r\n * @param property The glTF property to load the extension from\r\n * @param extensionName The name of the extension to load\r\n * @param actionAsync The action to run\r\n * @returns The promise returned by actionAsync or null if the extension does not exist\r\n */\r\n public static LoadExtensionAsync(\r\n context: string,\r\n property: IProperty,\r\n extensionName: string,\r\n actionAsync: (extensionContext: string, extension: TExtension) => Nullable>\r\n ): Nullable> {\r\n if (!property.extensions) {\r\n return null;\r\n }\r\n\r\n const extensions = property.extensions;\r\n\r\n const extension = extensions[extensionName] as TExtension;\r\n if (!extension) {\r\n return null;\r\n }\r\n\r\n return actionAsync(`${context}/extensions/${extensionName}`, extension);\r\n }\r\n\r\n /**\r\n * Helper method called by a loader extension to load a glTF extra.\r\n * @param context The context when loading the asset\r\n * @param property The glTF property to load the extra from\r\n * @param extensionName The name of the extension to load\r\n * @param actionAsync The action to run\r\n * @returns The promise returned by actionAsync or null if the extra does not exist\r\n */\r\n public static LoadExtraAsync(\r\n context: string,\r\n property: IProperty,\r\n extensionName: string,\r\n actionAsync: (extraContext: string, extra: TExtra) => Nullable>\r\n ): Nullable> {\r\n if (!property.extras) {\r\n return null;\r\n }\r\n\r\n const extras = property.extras;\r\n\r\n const extra = extras[extensionName] as TExtra;\r\n if (!extra) {\r\n return null;\r\n }\r\n\r\n return actionAsync(`${context}/extras/${extensionName}`, extra);\r\n }\r\n\r\n /**\r\n * Checks for presence of an extension.\r\n * @param name The name of the extension to check\r\n * @returns A boolean indicating the presence of the given extension name in `extensionsUsed`\r\n */\r\n public isExtensionUsed(name: string): boolean {\r\n return !!this._gltf.extensionsUsed && this._gltf.extensionsUsed.indexOf(name) !== -1;\r\n }\r\n\r\n /**\r\n * Increments the indentation level and logs a message.\r\n * @param message The message to log\r\n */\r\n public logOpen(message: string): void {\r\n this._parent._logOpen(message);\r\n }\r\n\r\n /**\r\n * Decrements the indentation level.\r\n */\r\n public logClose(): void {\r\n this._parent._logClose();\r\n }\r\n\r\n /**\r\n * Logs a message\r\n * @param message The message to log\r\n */\r\n public log(message: string): void {\r\n this._parent._log(message);\r\n }\r\n\r\n /**\r\n * Starts a performance counter.\r\n * @param counterName The name of the performance counter\r\n */\r\n public startPerformanceCounter(counterName: string): void {\r\n this._parent._startPerformanceCounter(counterName);\r\n }\r\n\r\n /**\r\n * Ends a performance counter.\r\n * @param counterName The name of the performance counter\r\n */\r\n public endPerformanceCounter(counterName: string): void {\r\n this._parent._endPerformanceCounter(counterName);\r\n }\r\n}\r\n\r\nGLTFFileLoader._CreateGLTF2Loader = (parent) => new GLTFLoader(parent);\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport { SphericalHarmonics, SphericalPolynomial } from \"core/Maths/sphericalPolynomial\";\r\nimport { Quaternion, Matrix } from \"core/Maths/math.vector\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { RawCubeTexture } from \"core/Materials/Textures/rawCubeTexture\";\r\n\r\nimport type { IEXTLightsImageBased_LightReferenceImageBased, IEXTLightsImageBased_LightImageBased, IEXTLightsImageBased } from \"babylonjs-gltf2interface\";\r\nimport type { IScene } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\n\r\nconst NAME = \"EXT_lights_image_based\";\r\n\r\ndeclare module \"babylonjs-gltf2interface\" {\r\n /** @hidden */\r\n interface IEXTLightsImageBased_LightImageBased {\r\n _babylonTexture?: BaseTexture;\r\n _loaded?: Promise;\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Vendor/EXT_lights_image_based/README.md)\r\n */\r\nexport class EXT_lights_image_based implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n private _lights?: IEXTLightsImageBased_LightImageBased[];\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n delete this._lights;\r\n }\r\n\r\n /** @hidden */\r\n public onLoading(): void {\r\n const extensions = this._loader.gltf.extensions;\r\n if (extensions && extensions[this.name]) {\r\n const extension = extensions[this.name] as IEXTLightsImageBased;\r\n this._lights = extension.lights;\r\n }\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param scene\r\n * @hidden\r\n */\r\n public loadSceneAsync(context: string, scene: IScene): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, scene, this.name, (extensionContext, extension) => {\r\n const promises = new Array>();\r\n\r\n promises.push(this._loader.loadSceneAsync(context, scene));\r\n\r\n this._loader.logOpen(`${extensionContext}`);\r\n\r\n const light = ArrayItem.Get(`${extensionContext}/light`, this._lights, extension.light);\r\n promises.push(\r\n this._loadLightAsync(`/extensions/${this.name}/lights/${extension.light}`, light).then((texture) => {\r\n this._loader.babylonScene.environmentTexture = texture;\r\n })\r\n );\r\n\r\n this._loader.logClose();\r\n\r\n return Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n private _loadLightAsync(context: string, light: IEXTLightsImageBased_LightImageBased): Promise {\r\n if (!light._loaded) {\r\n const promises = new Array>();\r\n\r\n this._loader.logOpen(`${context}`);\r\n\r\n const imageData = new Array>(light.specularImages.length);\r\n for (let mipmap = 0; mipmap < light.specularImages.length; mipmap++) {\r\n const faces = light.specularImages[mipmap];\r\n imageData[mipmap] = new Array(faces.length);\r\n for (let face = 0; face < faces.length; face++) {\r\n const specularImageContext = `${context}/specularImages/${mipmap}/${face}`;\r\n this._loader.logOpen(`${specularImageContext}`);\r\n\r\n const index = faces[face];\r\n const image = ArrayItem.Get(specularImageContext, this._loader.gltf.images, index);\r\n promises.push(\r\n this._loader.loadImageAsync(`/images/${index}`, image).then((data) => {\r\n imageData[mipmap][face] = data;\r\n })\r\n );\r\n\r\n this._loader.logClose();\r\n }\r\n }\r\n\r\n this._loader.logClose();\r\n\r\n light._loaded = Promise.all(promises).then(() => {\r\n const babylonTexture = new RawCubeTexture(this._loader.babylonScene, null, light.specularImageSize);\r\n babylonTexture.name = light.name || \"environment\";\r\n light._babylonTexture = babylonTexture;\r\n\r\n if (light.intensity != undefined) {\r\n babylonTexture.level = light.intensity;\r\n }\r\n\r\n if (light.rotation) {\r\n let rotation = Quaternion.FromArray(light.rotation);\r\n\r\n // Invert the rotation so that positive rotation is counter-clockwise.\r\n if (!this._loader.babylonScene.useRightHandedSystem) {\r\n rotation = Quaternion.Inverse(rotation);\r\n }\r\n\r\n Matrix.FromQuaternionToRef(rotation, babylonTexture.getReflectionTextureMatrix());\r\n }\r\n\r\n if (!light.irradianceCoefficients) {\r\n throw new Error(`${context}: Irradiance coefficients are missing`);\r\n }\r\n\r\n const sphericalHarmonics = SphericalHarmonics.FromArray(light.irradianceCoefficients);\r\n sphericalHarmonics.scaleInPlace(light.intensity);\r\n\r\n sphericalHarmonics.convertIrradianceToLambertianRadiance();\r\n const sphericalPolynomial = SphericalPolynomial.FromHarmonics(sphericalHarmonics);\r\n\r\n // Compute the lod generation scale to fit exactly to the number of levels available.\r\n const lodGenerationScale = (imageData.length - 1) / Scalar.Log2(light.specularImageSize);\r\n return babylonTexture.updateRGBDAsync(imageData, sphericalPolynomial, lodGenerationScale);\r\n });\r\n }\r\n\r\n return light._loaded.then(() => {\r\n return light._babylonTexture!;\r\n });\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new EXT_lights_image_based(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { Vector3, Quaternion, Matrix, TmpVectors } from \"core/Maths/math.vector\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\nimport type { TransformNode } from \"core/Meshes/transformNode\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport type { INode } from \"../glTFLoaderInterfaces\";\r\n\r\nimport type { IEXTMeshGpuInstancing } from \"babylonjs-gltf2interface\";\r\n\r\nimport \"core/Meshes/thinInstanceMesh\";\r\n\r\nconst NAME = \"EXT_mesh_gpu_instancing\";\r\n\r\n/**\r\n * [Proposed Specification](https://github.com/KhronosGroup/glTF/pull/1691)\r\n * [Playground Sample](https://playground.babylonjs.com/#QFIGLW#9)\r\n * !!! Experimental Extension Subject to Changes !!!\r\n */\r\nexport class EXT_mesh_gpu_instancing implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param node\r\n * @param assign\r\n * @hidden\r\n */\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, node, this.name, (extensionContext, extension) => {\r\n this._loader._disableInstancedMesh++;\r\n\r\n const promise = this._loader.loadNodeAsync(`/nodes/${node.index}`, node, assign);\r\n\r\n this._loader._disableInstancedMesh--;\r\n\r\n if (!node._primitiveBabylonMeshes) {\r\n return promise;\r\n }\r\n\r\n const promises = new Array>>();\r\n let instanceCount = 0;\r\n\r\n const loadAttribute = (attribute: string) => {\r\n if (extension.attributes[attribute] == undefined) {\r\n promises.push(Promise.resolve(null));\r\n return;\r\n }\r\n\r\n const accessor = ArrayItem.Get(`${extensionContext}/attributes/${attribute}`, this._loader.gltf.accessors, extension.attributes[attribute]);\r\n promises.push(this._loader._loadFloatAccessorAsync(`/accessors/${accessor.bufferView}`, accessor));\r\n\r\n if (instanceCount === 0) {\r\n instanceCount = accessor.count;\r\n } else if (instanceCount !== accessor.count) {\r\n throw new Error(`${extensionContext}/attributes: Instance buffer accessors do not have the same count.`);\r\n }\r\n };\r\n\r\n loadAttribute(\"TRANSLATION\");\r\n loadAttribute(\"ROTATION\");\r\n loadAttribute(\"SCALE\");\r\n\r\n return promise.then((babylonTransformNode) => {\r\n return Promise.all(promises).then(([translationBuffer, rotationBuffer, scaleBuffer]) => {\r\n const matrices = new Float32Array(instanceCount * 16);\r\n\r\n TmpVectors.Vector3[0].copyFromFloats(0, 0, 0); // translation\r\n TmpVectors.Quaternion[0].copyFromFloats(0, 0, 0, 1); // rotation\r\n TmpVectors.Vector3[1].copyFromFloats(1, 1, 1); // scale\r\n\r\n for (let i = 0; i < instanceCount; ++i) {\r\n translationBuffer && Vector3.FromArrayToRef(translationBuffer, i * 3, TmpVectors.Vector3[0]);\r\n rotationBuffer && Quaternion.FromArrayToRef(rotationBuffer, i * 4, TmpVectors.Quaternion[0]);\r\n scaleBuffer && Vector3.FromArrayToRef(scaleBuffer, i * 3, TmpVectors.Vector3[1]);\r\n\r\n Matrix.ComposeToRef(TmpVectors.Vector3[1], TmpVectors.Quaternion[0], TmpVectors.Vector3[0], TmpVectors.Matrix[0]);\r\n\r\n TmpVectors.Matrix[0].copyToArray(matrices, i * 16);\r\n }\r\n\r\n for (const babylonMesh of node._primitiveBabylonMeshes!) {\r\n (babylonMesh as Mesh).thinInstanceSetBuffer(\"matrix\", matrices, 16, true);\r\n }\r\n\r\n return babylonTransformNode;\r\n });\r\n });\r\n });\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new EXT_mesh_gpu_instancing(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { ArrayItem, GLTFLoader } from \"../glTFLoader\";\r\nimport type { IBufferView } from \"../glTFLoaderInterfaces\";\r\nimport type { IEXTMeshoptCompression } from \"babylonjs-gltf2interface\";\r\nimport { MeshoptCompression } from \"core/Meshes/Compression/meshoptCompression\";\r\n\r\nconst NAME = \"EXT_meshopt_compression\";\r\n\r\ninterface IBufferViewMeshopt extends IBufferView {\r\n _meshOptData?: Promise;\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression)\r\n *\r\n * This extension uses a WebAssembly decoder module from https://github.com/zeux/meshoptimizer/tree/master/js\r\n * @since 5.0.0\r\n */\r\nexport class EXT_meshopt_compression implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this.enabled = loader.isExtensionUsed(NAME);\r\n this._loader = loader;\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param bufferView\r\n * @hidden\r\n */\r\n public loadBufferViewAsync(context: string, bufferView: IBufferView): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, bufferView, this.name, (extensionContext, extension) => {\r\n const bufferViewMeshopt = bufferView as IBufferViewMeshopt;\r\n if (bufferViewMeshopt._meshOptData) {\r\n return bufferViewMeshopt._meshOptData;\r\n }\r\n\r\n const buffer = ArrayItem.Get(`${context}/buffer`, this._loader.gltf.buffers, extension.buffer);\r\n bufferViewMeshopt._meshOptData = this._loader.loadBufferAsync(`/buffers/${buffer.index}`, buffer, extension.byteOffset || 0, extension.byteLength).then((buffer) => {\r\n return MeshoptCompression.Default.decodeGltfBufferAsync(buffer as Uint8Array, extension.count, extension.byteStride, extension.mode, extension.filter);\r\n });\r\n\r\n return bufferViewMeshopt._meshOptData;\r\n });\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new EXT_meshopt_compression(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\nimport type { ITexture } from \"../glTFLoaderInterfaces\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { IEXTTextureWebP } from \"babylonjs-gltf2interface\";\r\n\r\nconst NAME = \"EXT_texture_webp\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Vendor/EXT_texture_webp/)\r\n */\r\nexport class EXT_texture_webp implements IGLTFLoaderExtension {\r\n /** The name of this extension. */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled. */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param texture\r\n * @param assign\r\n * @hidden\r\n */\r\n public _loadTextureAsync(context: string, texture: ITexture, assign: (babylonTexture: BaseTexture) => void): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, texture, this.name, (extensionContext, extension) => {\r\n const sampler = texture.sampler == undefined ? GLTFLoader.DefaultSampler : ArrayItem.Get(`${context}/sampler`, this._loader.gltf.samplers, texture.sampler);\r\n const image = ArrayItem.Get(`${extensionContext}/source`, this._loader.gltf.images, extension.source);\r\n return this._loader._createTextureAsync(\r\n context,\r\n sampler,\r\n image,\r\n (babylonTexture) => {\r\n assign(babylonTexture);\r\n },\r\n undefined,\r\n !texture._textureInfo.nonColorData\r\n );\r\n });\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new EXT_texture_webp(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { DracoCompression } from \"core/Meshes/Compression/dracoCompression\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { Geometry } from \"core/Meshes/geometry\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\n\r\nimport { MeshPrimitiveMode, AccessorComponentType } from \"babylonjs-gltf2interface\";\r\nimport type { IKHRDracoMeshCompression } from \"babylonjs-gltf2interface\";\r\nimport type { IMeshPrimitive, IBufferView } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\n\r\nconst NAME = \"KHR_draco_mesh_compression\";\r\n\r\ninterface IBufferViewDraco extends IBufferView {\r\n _dracoBabylonGeometry?: Promise;\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression)\r\n */\r\nexport class KHR_draco_mesh_compression implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * The draco compression used to decode vertex data or DracoCompression.Default if not defined\r\n */\r\n public dracoCompression?: DracoCompression;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = DracoCompression.DecoderAvailable && this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose(): void {\r\n delete this.dracoCompression;\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param primitive\r\n * @param babylonMesh\r\n * @hidden\r\n */\r\n public _loadVertexDataAsync(context: string, primitive: IMeshPrimitive, babylonMesh: Mesh): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, primitive, this.name, (extensionContext, extension) => {\r\n if (primitive.mode != undefined) {\r\n if (primitive.mode !== MeshPrimitiveMode.TRIANGLE_STRIP && primitive.mode !== MeshPrimitiveMode.TRIANGLES) {\r\n throw new Error(`${context}: Unsupported mode ${primitive.mode}`);\r\n }\r\n\r\n // TODO: handle triangle strips\r\n if (primitive.mode === MeshPrimitiveMode.TRIANGLE_STRIP) {\r\n throw new Error(`${context}: Mode ${primitive.mode} is not currently supported`);\r\n }\r\n }\r\n\r\n const attributes: {\r\n [kind: string]: number;\r\n } = {};\r\n const dividers: {\r\n [kind: string]: number;\r\n } = {};\r\n const loadAttribute = (name: string, kind: string) => {\r\n const uniqueId = extension.attributes[name];\r\n if (uniqueId === undefined || primitive.attributes[name] === undefined) {\r\n return;\r\n }\r\n\r\n attributes[kind] = uniqueId;\r\n const accessor = ArrayItem.Get(`${context}/attributes/${name}`, this._loader.gltf.accessors, primitive.attributes[name]);\r\n if (accessor.normalized && accessor.componentType !== AccessorComponentType.FLOAT) {\r\n let divider = 1;\r\n switch (accessor.componentType) {\r\n case AccessorComponentType.BYTE:\r\n divider = 127.0;\r\n break;\r\n case AccessorComponentType.UNSIGNED_BYTE:\r\n divider = 255.0;\r\n break;\r\n case AccessorComponentType.SHORT:\r\n divider = 32767.0;\r\n break;\r\n case AccessorComponentType.UNSIGNED_SHORT:\r\n divider = 65535.0;\r\n break;\r\n }\r\n dividers[kind] = divider;\r\n }\r\n\r\n babylonMesh._delayInfo = babylonMesh._delayInfo || [];\r\n if (babylonMesh._delayInfo.indexOf(kind) === -1) {\r\n babylonMesh._delayInfo.push(kind);\r\n }\r\n };\r\n\r\n loadAttribute(\"POSITION\", VertexBuffer.PositionKind);\r\n loadAttribute(\"NORMAL\", VertexBuffer.NormalKind);\r\n loadAttribute(\"TANGENT\", VertexBuffer.TangentKind);\r\n loadAttribute(\"TEXCOORD_0\", VertexBuffer.UVKind);\r\n loadAttribute(\"TEXCOORD_1\", VertexBuffer.UV2Kind);\r\n loadAttribute(\"TEXCOORD_2\", VertexBuffer.UV3Kind);\r\n loadAttribute(\"TEXCOORD_3\", VertexBuffer.UV4Kind);\r\n loadAttribute(\"TEXCOORD_4\", VertexBuffer.UV5Kind);\r\n loadAttribute(\"TEXCOORD_5\", VertexBuffer.UV6Kind);\r\n loadAttribute(\"JOINTS_0\", VertexBuffer.MatricesIndicesKind);\r\n loadAttribute(\"WEIGHTS_0\", VertexBuffer.MatricesWeightsKind);\r\n loadAttribute(\"COLOR_0\", VertexBuffer.ColorKind);\r\n\r\n const bufferView = ArrayItem.Get(extensionContext, this._loader.gltf.bufferViews, extension.bufferView) as IBufferViewDraco;\r\n if (!bufferView._dracoBabylonGeometry) {\r\n bufferView._dracoBabylonGeometry = this._loader.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView).then((data) => {\r\n const dracoCompression = this.dracoCompression || DracoCompression.Default;\r\n return dracoCompression\r\n .decodeMeshAsync(data, attributes, dividers)\r\n .then((babylonVertexData) => {\r\n const babylonGeometry = new Geometry(babylonMesh.name, this._loader.babylonScene);\r\n babylonVertexData.applyToGeometry(babylonGeometry);\r\n return babylonGeometry;\r\n })\r\n .catch((error) => {\r\n throw new Error(`${context}: ${error.message}`);\r\n });\r\n });\r\n }\r\n\r\n return bufferView._dracoBabylonGeometry;\r\n });\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new KHR_draco_mesh_compression(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { DirectionalLight } from \"core/Lights/directionalLight\";\r\nimport { PointLight } from \"core/Lights/pointLight\";\r\nimport { SpotLight } from \"core/Lights/spotLight\";\r\nimport { Light } from \"core/Lights/light\";\r\nimport type { TransformNode } from \"core/Meshes/transformNode\";\r\n\r\nimport type { IKHRLightsPunctual_LightReference, IKHRLightsPunctual_Light, IKHRLightsPunctual } from \"babylonjs-gltf2interface\";\r\nimport { KHRLightsPunctual_LightType } from \"babylonjs-gltf2interface\";\r\nimport type { INode } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\n\r\nconst NAME = \"KHR_lights_punctual\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual)\r\n */\r\nexport class KHR_lights implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n private _lights?: IKHRLightsPunctual_Light[];\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n delete this._lights;\r\n }\r\n\r\n /** @hidden */\r\n public onLoading(): void {\r\n const extensions = this._loader.gltf.extensions;\r\n if (extensions && extensions[this.name]) {\r\n const extension = extensions[this.name] as IKHRLightsPunctual;\r\n this._lights = extension.lights;\r\n }\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param node\r\n * @param assign\r\n * @hidden\r\n */\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, node, this.name, (extensionContext, extension) => {\r\n return this._loader.loadNodeAsync(context, node, (babylonMesh) => {\r\n let babylonLight: Light;\r\n\r\n const light = ArrayItem.Get(extensionContext, this._lights, extension.light);\r\n const name = light.name || babylonMesh.name;\r\n\r\n this._loader.babylonScene._blockEntityCollection = !!this._loader._assetContainer;\r\n\r\n switch (light.type) {\r\n case KHRLightsPunctual_LightType.DIRECTIONAL: {\r\n babylonLight = new DirectionalLight(name, Vector3.Backward(), this._loader.babylonScene);\r\n break;\r\n }\r\n case KHRLightsPunctual_LightType.POINT: {\r\n babylonLight = new PointLight(name, Vector3.Zero(), this._loader.babylonScene);\r\n break;\r\n }\r\n case KHRLightsPunctual_LightType.SPOT: {\r\n const babylonSpotLight = new SpotLight(name, Vector3.Zero(), Vector3.Backward(), 0, 1, this._loader.babylonScene);\r\n babylonSpotLight.angle = ((light.spot && light.spot.outerConeAngle) || Math.PI / 4) * 2;\r\n babylonSpotLight.innerAngle = ((light.spot && light.spot.innerConeAngle) || 0) * 2;\r\n babylonLight = babylonSpotLight;\r\n break;\r\n }\r\n default: {\r\n this._loader.babylonScene._blockEntityCollection = false;\r\n throw new Error(`${extensionContext}: Invalid light type (${light.type})`);\r\n }\r\n }\r\n\r\n babylonLight._parentContainer = this._loader._assetContainer;\r\n this._loader.babylonScene._blockEntityCollection = false;\r\n babylonLight.falloffType = Light.FALLOFF_GLTF;\r\n babylonLight.diffuse = light.color ? Color3.FromArray(light.color) : Color3.White();\r\n babylonLight.intensity = light.intensity == undefined ? 1 : light.intensity;\r\n babylonLight.range = light.range == undefined ? Number.MAX_VALUE : light.range;\r\n babylonLight.parent = babylonMesh;\r\n\r\n this._loader._babylonLights.push(babylonLight);\r\n\r\n GLTFLoader.AddPointerMetadata(babylonLight, extensionContext);\r\n\r\n assign(babylonMesh);\r\n });\r\n });\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new KHR_lights(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport type { Material } from \"core/Materials/material\";\r\n\r\nimport type { IMaterial } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport type { IKHRMaterialsPbrSpecularGlossiness } from \"babylonjs-gltf2interface\";\r\n\r\nconst NAME = \"KHR_materials_pbrSpecularGlossiness\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness)\r\n */\r\nexport class KHR_materials_pbrSpecularGlossiness implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 200;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param material\r\n * @param babylonMaterial\r\n * @hidden\r\n */\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => {\r\n const promises = new Array>();\r\n promises.push(this._loader.loadMaterialBasePropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadSpecularGlossinessPropertiesAsync(extensionContext, material, extension, babylonMaterial));\r\n this._loader.loadMaterialAlphaProperties(context, material, babylonMaterial);\r\n return Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n private _loadSpecularGlossinessPropertiesAsync(context: string, material: IMaterial, properties: IKHRMaterialsPbrSpecularGlossiness, babylonMaterial: Material): Promise {\r\n if (!(babylonMaterial instanceof PBRMaterial)) {\r\n throw new Error(`${context}: Material type not supported`);\r\n }\r\n\r\n const promises = new Array>();\r\n\r\n babylonMaterial.metallic = null;\r\n babylonMaterial.roughness = null;\r\n\r\n if (properties.diffuseFactor) {\r\n babylonMaterial.albedoColor = Color3.FromArray(properties.diffuseFactor);\r\n babylonMaterial.alpha = properties.diffuseFactor[3];\r\n } else {\r\n babylonMaterial.albedoColor = Color3.White();\r\n }\r\n\r\n babylonMaterial.reflectivityColor = properties.specularFactor ? Color3.FromArray(properties.specularFactor) : Color3.White();\r\n babylonMaterial.microSurface = properties.glossinessFactor == undefined ? 1 : properties.glossinessFactor;\r\n\r\n if (properties.diffuseTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/diffuseTexture`, properties.diffuseTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Diffuse)`;\r\n babylonMaterial.albedoTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.specularGlossinessTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/specularGlossinessTexture`, properties.specularGlossinessTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Specular Glossiness)`;\r\n babylonMaterial.reflectivityTexture = texture;\r\n babylonMaterial.reflectivityTexture.hasAlpha = true;\r\n })\r\n );\r\n\r\n babylonMaterial.useMicroSurfaceFromReflectivityMapAlpha = true;\r\n }\r\n\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new KHR_materials_pbrSpecularGlossiness(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport type { Material } from \"core/Materials/material\";\r\n\r\nimport type { IMaterial } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\n\r\nconst NAME = \"KHR_materials_unlit\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit)\r\n */\r\nexport class KHR_materials_unlit implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 210;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param material\r\n * @param babylonMaterial\r\n * @hidden\r\n */\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, material, this.name, () => {\r\n return this._loadUnlitPropertiesAsync(context, material, babylonMaterial);\r\n });\r\n }\r\n\r\n private _loadUnlitPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Promise {\r\n if (!(babylonMaterial instanceof PBRMaterial)) {\r\n throw new Error(`${context}: Material type not supported`);\r\n }\r\n\r\n const promises = new Array>();\r\n babylonMaterial.unlit = true;\r\n\r\n const properties = material.pbrMetallicRoughness;\r\n if (properties) {\r\n if (properties.baseColorFactor) {\r\n babylonMaterial.albedoColor = Color3.FromArray(properties.baseColorFactor);\r\n babylonMaterial.alpha = properties.baseColorFactor[3];\r\n } else {\r\n babylonMaterial.albedoColor = Color3.White();\r\n }\r\n\r\n if (properties.baseColorTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/baseColorTexture`, properties.baseColorTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Base Color)`;\r\n babylonMaterial.albedoTexture = texture;\r\n })\r\n );\r\n }\r\n }\r\n\r\n if (material.doubleSided) {\r\n babylonMaterial.backFaceCulling = false;\r\n babylonMaterial.twoSidedLighting = true;\r\n }\r\n\r\n this._loader.loadMaterialAlphaProperties(context, material, babylonMaterial);\r\n\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new KHR_materials_unlit(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport type { Material } from \"core/Materials/material\";\r\n\r\nimport type { IMaterial, ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport type { IKHRMaterialsClearcoat } from \"babylonjs-gltf2interface\";\r\n\r\nconst NAME = \"KHR_materials_clearcoat\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_clearcoat/README.md)\r\n * [Playground Sample](https://www.babylonjs-playground.com/frame.html#7F7PN6#8)\r\n */\r\nexport class KHR_materials_clearcoat implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 190;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param material\r\n * @param babylonMaterial\r\n * @hidden\r\n */\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => {\r\n const promises = new Array>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadClearCoatPropertiesAsync(extensionContext, extension, babylonMaterial));\r\n return Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n private _loadClearCoatPropertiesAsync(context: string, properties: IKHRMaterialsClearcoat, babylonMaterial: Material): Promise {\r\n if (!(babylonMaterial instanceof PBRMaterial)) {\r\n throw new Error(`${context}: Material type not supported`);\r\n }\r\n\r\n const promises = new Array>();\r\n\r\n babylonMaterial.clearCoat.isEnabled = true;\r\n babylonMaterial.clearCoat.useRoughnessFromMainTexture = false;\r\n babylonMaterial.clearCoat.remapF0OnInterfaceChange = false;\r\n\r\n if (properties.clearcoatFactor != undefined) {\r\n babylonMaterial.clearCoat.intensity = properties.clearcoatFactor;\r\n } else {\r\n babylonMaterial.clearCoat.intensity = 0;\r\n }\r\n\r\n if (properties.clearcoatTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/clearcoatTexture`, properties.clearcoatTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (ClearCoat Intensity)`;\r\n babylonMaterial.clearCoat.texture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.clearcoatRoughnessFactor != undefined) {\r\n babylonMaterial.clearCoat.roughness = properties.clearcoatRoughnessFactor;\r\n } else {\r\n babylonMaterial.clearCoat.roughness = 0;\r\n }\r\n\r\n if (properties.clearcoatRoughnessTexture) {\r\n (properties.clearcoatRoughnessTexture as ITextureInfo).nonColorData = true;\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/clearcoatRoughnessTexture`, properties.clearcoatRoughnessTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (ClearCoat Roughness)`;\r\n babylonMaterial.clearCoat.textureRoughness = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.clearcoatNormalTexture) {\r\n (properties.clearcoatNormalTexture as ITextureInfo).nonColorData = true;\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/clearcoatNormalTexture`, properties.clearcoatNormalTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (ClearCoat Normal)`;\r\n babylonMaterial.clearCoat.bumpTexture = texture;\r\n })\r\n );\r\n\r\n babylonMaterial.invertNormalMapX = !babylonMaterial.getScene().useRightHandedSystem;\r\n babylonMaterial.invertNormalMapY = babylonMaterial.getScene().useRightHandedSystem;\r\n if (properties.clearcoatNormalTexture.scale != undefined) {\r\n babylonMaterial.clearCoat.bumpTexture!.level = properties.clearcoatNormalTexture.scale;\r\n }\r\n }\r\n\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new KHR_materials_clearcoat(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport type { Material } from \"core/Materials/material\";\r\n\r\nimport type { IMaterial } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport type { IKHRMaterialsIridescence } from \"babylonjs-gltf2interface\";\r\n\r\nconst NAME = \"KHR_materials_iridescence\";\r\n\r\n/**\r\n * [Experimental Spec](https://github.com/KhronosGroup/glTF/pull/2027)\r\n */\r\nexport class KHR_materials_iridescence implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 195;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param material\r\n * @param babylonMaterial\r\n * @hidden\r\n */\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => {\r\n const promises = new Array>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadIridescencePropertiesAsync(extensionContext, extension, babylonMaterial));\r\n return Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n private _loadIridescencePropertiesAsync(context: string, properties: IKHRMaterialsIridescence, babylonMaterial: Material): Promise {\r\n if (!(babylonMaterial instanceof PBRMaterial)) {\r\n throw new Error(`${context}: Material type not supported`);\r\n }\r\n\r\n const promises = new Array>();\r\n\r\n babylonMaterial.iridescence.isEnabled = true;\r\n\r\n babylonMaterial.iridescence.intensity = properties.iridescenceFactor ?? 0;\r\n babylonMaterial.iridescence.indexOfRefraction = properties.iridescenceIor ?? (properties as any).iridescenceIOR ?? 1.3;\r\n babylonMaterial.iridescence.minimumThickness = properties.iridescenceThicknessMinimum ?? 100;\r\n babylonMaterial.iridescence.maximumThickness = properties.iridescenceThicknessMaximum ?? 400;\r\n\r\n if (properties.iridescenceTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/iridescenceTexture`, properties.iridescenceTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Iridescence Intensity)`;\r\n babylonMaterial.iridescence.texture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.iridescenceThicknessTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/iridescenceThicknessTexture`, properties.iridescenceThicknessTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Iridescence Thickness)`;\r\n babylonMaterial.iridescence.thicknessTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new KHR_materials_iridescence(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport type { Material } from \"core/Materials/material\";\r\n\r\nimport type { IMaterial } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport type { IKHRMaterialsEmissiveStrength } from \"babylonjs-gltf2interface\";\r\n\r\nconst NAME = \"KHR_materials_emissive_strength\";\r\n\r\n/**\r\n * [Experimental Spec](https://github.com/KhronosGroup/glTF/pull/1994)\r\n */\r\nexport class KHR_materials_emissive_strength implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 170;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param material\r\n * @param babylonMaterial\r\n * @hidden\r\n */\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => {\r\n return this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial).then(() => {\r\n this._loadEmissiveProperties(extensionContext, extension, babylonMaterial);\r\n });\r\n });\r\n }\r\n\r\n private _loadEmissiveProperties(context: string, properties: IKHRMaterialsEmissiveStrength, babylonMaterial: Material): void {\r\n if (!(babylonMaterial instanceof PBRMaterial)) {\r\n throw new Error(`${context}: Material type not supported`);\r\n }\r\n\r\n if (properties.emissiveStrength !== undefined) {\r\n babylonMaterial.emissiveColor.scaleToRef(properties.emissiveStrength, babylonMaterial.emissiveColor);\r\n }\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new KHR_materials_emissive_strength(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport type { Material } from \"core/Materials/material\";\r\n\r\nimport type { IMaterial, ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport type { IKHRMaterialsSheen } from \"babylonjs-gltf2interface\";\r\n\r\nconst NAME = \"KHR_materials_sheen\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_sheen/README.md)\r\n * [Playground Sample](https://www.babylonjs-playground.com/frame.html#BNIZX6#4)\r\n */\r\nexport class KHR_materials_sheen implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 190;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param material\r\n * @param babylonMaterial\r\n * @hidden\r\n */\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => {\r\n const promises = new Array>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadSheenPropertiesAsync(extensionContext, extension, babylonMaterial));\r\n return Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n private _loadSheenPropertiesAsync(context: string, properties: IKHRMaterialsSheen, babylonMaterial: Material): Promise {\r\n if (!(babylonMaterial instanceof PBRMaterial)) {\r\n throw new Error(`${context}: Material type not supported`);\r\n }\r\n\r\n const promises = new Array>();\r\n\r\n babylonMaterial.sheen.isEnabled = true;\r\n babylonMaterial.sheen.intensity = 1;\r\n\r\n if (properties.sheenColorFactor != undefined) {\r\n babylonMaterial.sheen.color = Color3.FromArray(properties.sheenColorFactor);\r\n } else {\r\n babylonMaterial.sheen.color = Color3.Black();\r\n }\r\n\r\n if (properties.sheenColorTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/sheenColorTexture`, properties.sheenColorTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Sheen Color)`;\r\n babylonMaterial.sheen.texture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.sheenRoughnessFactor !== undefined) {\r\n babylonMaterial.sheen.roughness = properties.sheenRoughnessFactor;\r\n } else {\r\n babylonMaterial.sheen.roughness = 0;\r\n }\r\n\r\n if (properties.sheenRoughnessTexture) {\r\n (properties.sheenRoughnessTexture as ITextureInfo).nonColorData = true;\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/sheenRoughnessTexture`, properties.sheenRoughnessTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Sheen Roughness)`;\r\n babylonMaterial.sheen.textureRoughness = texture;\r\n })\r\n );\r\n }\r\n\r\n babylonMaterial.sheen.albedoScaling = true;\r\n babylonMaterial.sheen.useRoughnessFromMainTexture = false;\r\n\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new KHR_materials_sheen(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport type { Material } from \"core/Materials/material\";\r\n\r\nimport type { IMaterial, ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport type { IKHRMaterialsSpecular } from \"babylonjs-gltf2interface\";\r\n\r\nconst NAME = \"KHR_materials_specular\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular)\r\n */\r\nexport class KHR_materials_specular implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 190;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param material\r\n * @param babylonMaterial\r\n * @hidden\r\n */\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => {\r\n const promises = new Array>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadSpecularPropertiesAsync(extensionContext, extension, babylonMaterial));\r\n return Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n private _loadSpecularPropertiesAsync(context: string, properties: IKHRMaterialsSpecular, babylonMaterial: Material): Promise {\r\n if (!(babylonMaterial instanceof PBRMaterial)) {\r\n throw new Error(`${context}: Material type not supported`);\r\n }\r\n\r\n const promises = new Array>();\r\n\r\n if (properties.specularFactor !== undefined) {\r\n babylonMaterial.metallicF0Factor = properties.specularFactor;\r\n }\r\n\r\n if (properties.specularColorFactor !== undefined) {\r\n babylonMaterial.metallicReflectanceColor = Color3.FromArray(properties.specularColorFactor);\r\n }\r\n\r\n if (properties.specularTexture) {\r\n (properties.specularTexture as ITextureInfo).nonColorData = true;\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/specularTexture`, properties.specularTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Specular F0 Strength)`;\r\n babylonMaterial.metallicReflectanceTexture = texture;\r\n babylonMaterial.useOnlyMetallicFromMetallicReflectanceTexture = true;\r\n })\r\n );\r\n }\r\n\r\n if (properties.specularColorTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/specularColorTexture`, properties.specularColorTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Specular F0 Color)`;\r\n babylonMaterial.reflectanceTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new KHR_materials_specular(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport type { Material } from \"core/Materials/material\";\r\n\r\nimport type { IMaterial } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport type { IKHRMaterialsIor } from \"babylonjs-gltf2interface\";\r\n\r\nconst NAME = \"KHR_materials_ior\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior)\r\n */\r\nexport class KHR_materials_ior implements IGLTFLoaderExtension {\r\n /**\r\n * Default ior Value from the spec.\r\n */\r\n private static readonly _DEFAULT_IOR = 1.5;\r\n\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 180;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param material\r\n * @param babylonMaterial\r\n * @hidden\r\n */\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => {\r\n const promises = new Array>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadIorPropertiesAsync(extensionContext, extension, babylonMaterial));\r\n return Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n private _loadIorPropertiesAsync(context: string, properties: IKHRMaterialsIor, babylonMaterial: Material): Promise {\r\n if (!(babylonMaterial instanceof PBRMaterial)) {\r\n throw new Error(`${context}: Material type not supported`);\r\n }\r\n\r\n if (properties.ior !== undefined) {\r\n babylonMaterial.indexOfRefraction = properties.ior;\r\n } else {\r\n babylonMaterial.indexOfRefraction = KHR_materials_ior._DEFAULT_IOR;\r\n }\r\n\r\n return Promise.resolve();\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new KHR_materials_ior(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\n\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport type { Node } from \"core/node\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport type { INode, IMeshPrimitive, IMesh } from \"../glTFLoaderInterfaces\";\r\nimport type { IKHRMaterialVariants_Mapping, IKHRMaterialVariants_Variant, IKHRMaterialVariants_Variants } from \"babylonjs-gltf2interface\";\r\n\r\nconst NAME = \"KHR_materials_variants\";\r\n\r\ninterface IVariantsMap {\r\n [key: string]: Array<{ mesh: AbstractMesh; material: Nullable }>;\r\n}\r\n\r\ninterface IExtensionMetadata {\r\n lastSelected: Nullable>;\r\n original: Array<{ mesh: AbstractMesh; material: Nullable }>;\r\n variants: IVariantsMap;\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_variants/README.md)\r\n */\r\nexport class KHR_materials_variants implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n private _variants?: Array;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * Gets the list of available variant names for this asset.\r\n * @param rootMesh The glTF root mesh\r\n * @returns the list of all the variant names for this model\r\n */\r\n public static GetAvailableVariants(rootMesh: Mesh): string[] {\r\n const extensionMetadata = this._GetExtensionMetadata(rootMesh);\r\n if (!extensionMetadata) {\r\n return [];\r\n }\r\n\r\n return Object.keys(extensionMetadata.variants);\r\n }\r\n\r\n /**\r\n * Gets the list of available variant names for this asset.\r\n * @param rootMesh The glTF root mesh\r\n * @returns the list of all the variant names for this model\r\n */\r\n public getAvailableVariants(rootMesh: Mesh): string[] {\r\n return KHR_materials_variants.GetAvailableVariants(rootMesh);\r\n }\r\n\r\n /**\r\n * Select a variant given a variant name or a list of variant names.\r\n * @param rootMesh The glTF root mesh\r\n * @param variantName The variant name(s) to select.\r\n */\r\n public static SelectVariant(rootMesh: Mesh, variantName: string | string[]): void {\r\n const extensionMetadata = this._GetExtensionMetadata(rootMesh);\r\n if (!extensionMetadata) {\r\n throw new Error(`Cannot select variant on a glTF mesh that does not have the ${NAME} extension`);\r\n }\r\n\r\n const select = (variantName: string): void => {\r\n const entries = extensionMetadata.variants[variantName];\r\n if (entries) {\r\n for (const entry of entries) {\r\n entry.mesh.material = entry.material;\r\n }\r\n }\r\n };\r\n\r\n if (variantName instanceof Array) {\r\n for (const name of variantName) {\r\n select(name);\r\n }\r\n } else {\r\n select(variantName);\r\n }\r\n\r\n extensionMetadata.lastSelected = variantName;\r\n }\r\n\r\n /**\r\n * Select a variant given a variant name or a list of variant names.\r\n * @param rootMesh The glTF root mesh\r\n * @param variantName The variant name(s) to select.\r\n */\r\n public selectVariant(rootMesh: Mesh, variantName: string | string[]): void {\r\n return KHR_materials_variants.SelectVariant(rootMesh, variantName);\r\n }\r\n\r\n /**\r\n * Reset back to the original before selecting a variant.\r\n * @param rootMesh The glTF root mesh\r\n */\r\n public static Reset(rootMesh: Mesh): void {\r\n const extensionMetadata = this._GetExtensionMetadata(rootMesh);\r\n if (!extensionMetadata) {\r\n throw new Error(`Cannot reset on a glTF mesh that does not have the ${NAME} extension`);\r\n }\r\n\r\n for (const entry of extensionMetadata.original) {\r\n entry.mesh.material = entry.material;\r\n }\r\n\r\n extensionMetadata.lastSelected = null;\r\n }\r\n\r\n /**\r\n * Reset back to the original before selecting a variant.\r\n * @param rootMesh The glTF root mesh\r\n */\r\n public reset(rootMesh: Mesh): void {\r\n return KHR_materials_variants.Reset(rootMesh);\r\n }\r\n\r\n /**\r\n * Gets the last selected variant name(s) or null if original.\r\n * @param rootMesh The glTF root mesh\r\n * @returns The selected variant name(s).\r\n */\r\n public static GetLastSelectedVariant(rootMesh: Mesh): Nullable {\r\n const extensionMetadata = this._GetExtensionMetadata(rootMesh);\r\n if (!extensionMetadata) {\r\n throw new Error(`Cannot get the last selected variant on a glTF mesh that does not have the ${NAME} extension`);\r\n }\r\n\r\n return extensionMetadata.lastSelected;\r\n }\r\n\r\n /**\r\n * Gets the last selected variant name(s) or null if original.\r\n * @param rootMesh The glTF root mesh\r\n * @returns The selected variant name(s).\r\n */\r\n public getLastSelectedVariant(rootMesh: Mesh): Nullable {\r\n return KHR_materials_variants.GetLastSelectedVariant(rootMesh);\r\n }\r\n\r\n private static _GetExtensionMetadata(rootMesh: Nullable): Nullable {\r\n return rootMesh?.metadata?.gltf?.[NAME] || null;\r\n }\r\n\r\n /** @hidden */\r\n public onLoading(): void {\r\n const extensions = this._loader.gltf.extensions;\r\n if (extensions && extensions[this.name]) {\r\n const extension = extensions[this.name] as IKHRMaterialVariants_Variants;\r\n this._variants = extension.variants;\r\n }\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param name\r\n * @param node\r\n * @param mesh\r\n * @param primitive\r\n * @param assign\r\n * @hidden\r\n */\r\n public _loadMeshPrimitiveAsync(\r\n context: string,\r\n name: string,\r\n node: INode,\r\n mesh: IMesh,\r\n primitive: IMeshPrimitive,\r\n assign: (babylonMesh: AbstractMesh) => void\r\n ): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, primitive, this.name, (extensionContext, extension) => {\r\n const promises = new Array>();\r\n promises.push(\r\n this._loader._loadMeshPrimitiveAsync(context, name, node, mesh, primitive, (babylonMesh) => {\r\n assign(babylonMesh);\r\n\r\n if (babylonMesh instanceof Mesh) {\r\n const babylonDrawMode = GLTFLoader._GetDrawMode(context, primitive.mode);\r\n\r\n const root = this._loader.rootBabylonMesh;\r\n const metadata = root ? (root.metadata = root.metadata || {}) : {};\r\n const gltf = (metadata.gltf = metadata.gltf || {});\r\n const extensionMetadata: IExtensionMetadata = (gltf[NAME] = gltf[NAME] || { lastSelected: null, original: [], variants: {} });\r\n\r\n // Store the original material.\r\n extensionMetadata.original.push({ mesh: babylonMesh, material: babylonMesh.material });\r\n\r\n // For each mapping, look at the variants and make a new entry for them.\r\n for (let mappingIndex = 0; mappingIndex < extension.mappings.length; ++mappingIndex) {\r\n const mapping = extension.mappings[mappingIndex];\r\n const material = ArrayItem.Get(`${extensionContext}/mappings/${mappingIndex}/material`, this._loader.gltf.materials, mapping.material);\r\n promises.push(\r\n this._loader._loadMaterialAsync(`#/materials/${mapping.material}`, material, babylonMesh, babylonDrawMode, (babylonMaterial) => {\r\n for (let mappingVariantIndex = 0; mappingVariantIndex < mapping.variants.length; ++mappingVariantIndex) {\r\n const variantIndex = mapping.variants[mappingVariantIndex];\r\n const variant = ArrayItem.Get(`/extensions/${NAME}/variants/${variantIndex}`, this._variants, variantIndex);\r\n extensionMetadata.variants[variant.name] = extensionMetadata.variants[variant.name] || [];\r\n extensionMetadata.variants[variant.name].push({\r\n mesh: babylonMesh,\r\n material: babylonMaterial,\r\n });\r\n\r\n // Replace the target when original mesh is cloned\r\n babylonMesh.onClonedObservable.add((newOne: Node) => {\r\n const newMesh = newOne as Mesh;\r\n let metadata: Nullable = null;\r\n let newRoot: Nullable = newMesh;\r\n\r\n // Find root to get medata\r\n do {\r\n newRoot = newRoot!.parent;\r\n if (!newRoot) {\r\n return;\r\n }\r\n metadata = KHR_materials_variants._GetExtensionMetadata(newRoot as Mesh);\r\n } while (metadata === null);\r\n\r\n // Need to clone the metadata on the root (first time only)\r\n if (root && metadata === KHR_materials_variants._GetExtensionMetadata(root)) {\r\n // Copy main metadata\r\n newRoot.metadata = {};\r\n for (const key in root.metadata) {\r\n newRoot.metadata[key] = root.metadata[key];\r\n }\r\n\r\n // Copy the gltf metadata\r\n newRoot.metadata.gltf = [];\r\n for (const key in root.metadata.gltf) {\r\n newRoot.metadata.gltf[key] = root.metadata.gltf[key];\r\n }\r\n\r\n // Duplicate the extension specific metadata\r\n newRoot.metadata.gltf[NAME] = { lastSelected: null, original: [], variants: {} };\r\n for (const original of metadata.original) {\r\n newRoot.metadata.gltf[NAME].original.push({\r\n mesh: original.mesh,\r\n material: original.material,\r\n });\r\n }\r\n for (const key in metadata.variants) {\r\n if (Object.prototype.hasOwnProperty.call(metadata.variants, key)) {\r\n newRoot.metadata.gltf[NAME].variants[key] = [];\r\n for (const variantEntry of metadata.variants[key]) {\r\n newRoot.metadata.gltf[NAME].variants[key].push({\r\n mesh: variantEntry.mesh,\r\n material: variantEntry.material,\r\n });\r\n }\r\n }\r\n }\r\n\r\n metadata = newRoot.metadata.gltf[NAME];\r\n }\r\n\r\n // Relocate\r\n for (const target of metadata!.original) {\r\n if (target.mesh === babylonMesh) {\r\n target.mesh = newMesh;\r\n }\r\n }\r\n for (const target of metadata!.variants[variant.name]) {\r\n if (target.mesh === babylonMesh) {\r\n target.mesh = newMesh;\r\n }\r\n }\r\n });\r\n }\r\n })\r\n );\r\n }\r\n }\r\n })\r\n );\r\n return Promise.all(promises).then(([babylonMesh]) => {\r\n return babylonMesh;\r\n });\r\n });\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new KHR_materials_variants(loader));\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import type { Nullable } from \"core/types\";\r\nimport { 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 { IMaterial, ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport type { IKHRMaterialsTransmission } from \"babylonjs-gltf2interface\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport type { Texture } from \"core/Materials/Textures/texture\";\r\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { Color4 } from \"core/Maths/math.color\";\r\n\r\ninterface ITransmissionHelperHolder {\r\n /**\r\n * @hidden\r\n */\r\n _transmissionHelper: TransmissionHelper | undefined;\r\n}\r\n\r\ninterface ITransmissionHelperOptions {\r\n /**\r\n * The size of the render buffers (default: 1024)\r\n */\r\n renderSize: number;\r\n\r\n /**\r\n * The number of samples to use when generating the render target texture for opaque meshes (default: 4)\r\n */\r\n samples: number;\r\n\r\n /**\r\n * Scale to apply when selecting the LOD level to sample the refraction texture (default: 1)\r\n */\r\n lodGenerationScale: number;\r\n\r\n /**\r\n * Offset to apply when selecting the LOD level to sample the refraction texture (default: -4)\r\n */\r\n lodGenerationOffset: number;\r\n\r\n /**\r\n * Type of the refraction render target texture (default: TEXTURETYPE_HALF_FLOAT)\r\n */\r\n renderTargetTextureType: number;\r\n\r\n /**\r\n * Defines if the mipmaps for the refraction render target texture must be generated (default: true)\r\n */\r\n generateMipmaps: boolean;\r\n\r\n /**\r\n * Clear color of the opaque texture. If not provided, use the scene clear color (which will be converted to linear space).\r\n * If provided, should be in linear space\r\n */\r\n clearColor?: Color4;\r\n}\r\n\r\n/**\r\n * A class to handle setting up the rendering of opaque objects to be shown through transmissive objects.\r\n */\r\nclass TransmissionHelper {\r\n /**\r\n * Creates the default options for the helper.\r\n */\r\n private static _GetDefaultOptions(): ITransmissionHelperOptions {\r\n return {\r\n renderSize: 1024,\r\n samples: 4,\r\n lodGenerationScale: 1,\r\n lodGenerationOffset: -4,\r\n renderTargetTextureType: Constants.TEXTURETYPE_HALF_FLOAT,\r\n generateMipmaps: true,\r\n };\r\n }\r\n\r\n /**\r\n * Stores the creation options.\r\n */\r\n private readonly _scene: Scene & ITransmissionHelperHolder;\r\n\r\n private _options: ITransmissionHelperOptions;\r\n\r\n private _opaqueRenderTarget: Nullable = null;\r\n private _opaqueMeshesCache: AbstractMesh[] = [];\r\n private _transparentMeshesCache: AbstractMesh[] = [];\r\n private _materialObservers: { [id: string]: Nullable> } = {};\r\n\r\n /**\r\n * This observable will be notified with any error during the creation of the environment,\r\n * mainly texture creation errors.\r\n */\r\n public onErrorObservable: Observable<{ message?: string; exception?: any }>;\r\n\r\n /**\r\n * constructor\r\n * @param options Defines the options we want to customize the helper\r\n * @param scene The scene to add the material to\r\n */\r\n constructor(options: Partial, scene: Scene) {\r\n this._options = {\r\n ...TransmissionHelper._GetDefaultOptions(),\r\n ...options,\r\n };\r\n this._scene = scene as any;\r\n this._scene._transmissionHelper = this;\r\n\r\n this.onErrorObservable = new Observable();\r\n this._scene.onDisposeObservable.addOnce(() => {\r\n this.dispose();\r\n });\r\n\r\n this._parseScene();\r\n this._setupRenderTargets();\r\n }\r\n\r\n /**\r\n * Updates the background according to the new options\r\n * @param options\r\n */\r\n public updateOptions(options: Partial) {\r\n // First check if any options are actually being changed. If not, exit.\r\n const newValues = Object.keys(options).filter((key: string) => (this._options as any)[key] !== (options as any)[key]);\r\n if (!newValues.length) {\r\n return;\r\n }\r\n\r\n const newOptions = {\r\n ...this._options,\r\n ...options,\r\n };\r\n\r\n const oldOptions = this._options;\r\n this._options = newOptions;\r\n\r\n // If size changes, recreate everything\r\n if (\r\n newOptions.renderSize !== oldOptions.renderSize ||\r\n newOptions.renderTargetTextureType !== oldOptions.renderTargetTextureType ||\r\n newOptions.generateMipmaps !== oldOptions.generateMipmaps ||\r\n !this._opaqueRenderTarget\r\n ) {\r\n this._setupRenderTargets();\r\n } else {\r\n this._opaqueRenderTarget.samples = newOptions.samples;\r\n this._opaqueRenderTarget.lodGenerationScale = newOptions.lodGenerationScale;\r\n this._opaqueRenderTarget.lodGenerationOffset = newOptions.lodGenerationOffset;\r\n }\r\n }\r\n\r\n public getOpaqueTarget(): Nullable {\r\n return this._opaqueRenderTarget;\r\n }\r\n\r\n private _shouldRenderAsTransmission(material: Nullable): boolean {\r\n if (!material) {\r\n return false;\r\n }\r\n if (material instanceof PBRMaterial && material.subSurface.isRefractionEnabled) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n private _addMesh(mesh: AbstractMesh): void {\r\n this._materialObservers[mesh.uniqueId] = mesh.onMaterialChangedObservable.add(this._onMeshMaterialChanged.bind(this));\r\n\r\n // we need to defer the processing because _addMesh may be called as part as an instance mesh creation, in which case some\r\n // internal properties are not setup yet, like _sourceMesh (needed when doing mesh.material below)\r\n Tools.SetImmediate(() => {\r\n if (this._shouldRenderAsTransmission(mesh.material)) {\r\n (mesh.material as PBRMaterial).refractionTexture = this._opaqueRenderTarget;\r\n this._transparentMeshesCache.push(mesh);\r\n } else {\r\n this._opaqueMeshesCache.push(mesh);\r\n }\r\n });\r\n }\r\n\r\n private _removeMesh(mesh: AbstractMesh): void {\r\n mesh.onMaterialChangedObservable.remove(this._materialObservers[mesh.uniqueId]);\r\n delete this._materialObservers[mesh.uniqueId];\r\n let idx = this._transparentMeshesCache.indexOf(mesh);\r\n if (idx !== -1) {\r\n this._transparentMeshesCache.splice(idx, 1);\r\n }\r\n idx = this._opaqueMeshesCache.indexOf(mesh);\r\n if (idx !== -1) {\r\n this._opaqueMeshesCache.splice(idx, 1);\r\n }\r\n }\r\n\r\n private _parseScene(): void {\r\n this._scene.meshes.forEach(this._addMesh.bind(this));\r\n // Listen for when a mesh is added to the scene and add it to our cache lists.\r\n this._scene.onNewMeshAddedObservable.add(this._addMesh.bind(this));\r\n // Listen for when a mesh is removed from to the scene and remove it from our cache lists.\r\n this._scene.onMeshRemovedObservable.add(this._removeMesh.bind(this));\r\n }\r\n\r\n // When one of the meshes in the scene has its material changed, make sure that it's in the correct cache list.\r\n private _onMeshMaterialChanged(mesh: AbstractMesh) {\r\n const transparentIdx = this._transparentMeshesCache.indexOf(mesh);\r\n const opaqueIdx = this._opaqueMeshesCache.indexOf(mesh);\r\n\r\n // If the material is transparent, make sure that it's added to the transparent list and removed from the opaque list\r\n const useTransmission = this._shouldRenderAsTransmission(mesh.material);\r\n if (useTransmission) {\r\n if (mesh.material instanceof PBRMaterial) {\r\n mesh.material.subSurface.refractionTexture = this._opaqueRenderTarget;\r\n }\r\n if (opaqueIdx !== -1) {\r\n this._opaqueMeshesCache.splice(opaqueIdx, 1);\r\n this._transparentMeshesCache.push(mesh);\r\n } else if (transparentIdx === -1) {\r\n this._transparentMeshesCache.push(mesh);\r\n }\r\n // If the material is opaque, make sure that it's added to the opaque list and removed from the transparent list\r\n } else {\r\n if (transparentIdx !== -1) {\r\n this._transparentMeshesCache.splice(transparentIdx, 1);\r\n this._opaqueMeshesCache.push(mesh);\r\n } else if (opaqueIdx === -1) {\r\n this._opaqueMeshesCache.push(mesh);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Setup the render targets according to the specified options.\r\n */\r\n private _setupRenderTargets(): void {\r\n if (this._opaqueRenderTarget) {\r\n this._opaqueRenderTarget.dispose();\r\n }\r\n this._opaqueRenderTarget = new RenderTargetTexture(\r\n \"opaqueSceneTexture\",\r\n this._options.renderSize,\r\n this._scene,\r\n this._options.generateMipmaps,\r\n undefined,\r\n this._options.renderTargetTextureType\r\n );\r\n this._opaqueRenderTarget.ignoreCameraViewport = true;\r\n this._opaqueRenderTarget.renderList = this._opaqueMeshesCache;\r\n this._opaqueRenderTarget.clearColor = this._options.clearColor?.clone() ?? this._scene.clearColor.clone();\r\n this._opaqueRenderTarget.gammaSpace = false;\r\n this._opaqueRenderTarget.lodGenerationScale = this._options.lodGenerationScale;\r\n this._opaqueRenderTarget.lodGenerationOffset = this._options.lodGenerationOffset;\r\n this._opaqueRenderTarget.samples = this._options.samples;\r\n\r\n let sceneImageProcessingapplyByPostProcess: boolean;\r\n\r\n let saveSceneEnvIntensity: number;\r\n this._opaqueRenderTarget.onBeforeBindObservable.add((opaqueRenderTarget) => {\r\n saveSceneEnvIntensity = this._scene.environmentIntensity;\r\n this._scene.environmentIntensity = 1.0;\r\n sceneImageProcessingapplyByPostProcess = this._scene.imageProcessingConfiguration.applyByPostProcess;\r\n if (!this._options.clearColor) {\r\n this._scene.clearColor.toLinearSpaceToRef(opaqueRenderTarget.clearColor);\r\n } else {\r\n opaqueRenderTarget.clearColor.copyFrom(this._options.clearColor);\r\n }\r\n // we do not use the applyByPostProcess setter to avoid flagging all the materials as \"image processing dirty\"!\r\n this._scene.imageProcessingConfiguration._applyByPostProcess = true;\r\n });\r\n this._opaqueRenderTarget.onAfterUnbindObservable.add(() => {\r\n this._scene.environmentIntensity = saveSceneEnvIntensity;\r\n this._scene.imageProcessingConfiguration._applyByPostProcess = sceneImageProcessingapplyByPostProcess;\r\n });\r\n\r\n this._transparentMeshesCache.forEach((mesh: AbstractMesh) => {\r\n if (this._shouldRenderAsTransmission(mesh.material)) {\r\n (mesh.material as PBRMaterial).refractionTexture = this._opaqueRenderTarget;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Dispose all the elements created by the Helper.\r\n */\r\n public dispose(): void {\r\n this._scene._transmissionHelper = undefined;\r\n if (this._opaqueRenderTarget) {\r\n this._opaqueRenderTarget.dispose();\r\n this._opaqueRenderTarget = null;\r\n }\r\n this._transparentMeshesCache = [];\r\n this._opaqueMeshesCache = [];\r\n }\r\n}\r\n\r\nconst NAME = \"KHR_materials_transmission\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_transmission/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_transmission implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 175;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n if (this.enabled) {\r\n loader.parent.transparencyAsCoverage = true;\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param material\r\n * @param babylonMaterial\r\n * @hidden\r\n */\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => {\r\n const promises = new Array>();\r\n promises.push(this._loader.loadMaterialBasePropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadTransparentPropertiesAsync(extensionContext, material, babylonMaterial, extension));\r\n return Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n private _loadTransparentPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material, extension: IKHRMaterialsTransmission): Promise {\r\n if (!(babylonMaterial instanceof PBRMaterial)) {\r\n throw new Error(`${context}: Material type not supported`);\r\n }\r\n const pbrMaterial = babylonMaterial as PBRMaterial;\r\n\r\n // Enables \"refraction\" texture which represents transmitted light.\r\n pbrMaterial.subSurface.isRefractionEnabled = true;\r\n\r\n // Since this extension models thin-surface transmission only, we must make IOR = 1.0\r\n pbrMaterial.subSurface.volumeIndexOfRefraction = 1.0;\r\n\r\n // Albedo colour will tint transmission.\r\n pbrMaterial.subSurface.useAlbedoToTintRefraction = true;\r\n\r\n if (extension.transmissionFactor !== undefined) {\r\n pbrMaterial.subSurface.refractionIntensity = extension.transmissionFactor;\r\n const scene = pbrMaterial.getScene() as unknown as ITransmissionHelperHolder;\r\n if (pbrMaterial.subSurface.refractionIntensity && !scene._transmissionHelper) {\r\n new TransmissionHelper({}, pbrMaterial.getScene());\r\n }\r\n } else {\r\n pbrMaterial.subSurface.refractionIntensity = 0.0;\r\n pbrMaterial.subSurface.isRefractionEnabled = false;\r\n return Promise.resolve();\r\n }\r\n\r\n pbrMaterial.subSurface.minimumThickness = 0.0;\r\n pbrMaterial.subSurface.maximumThickness = 0.0;\r\n if (extension.transmissionTexture) {\r\n (extension.transmissionTexture as ITextureInfo).nonColorData = true;\r\n return this._loader.loadTextureInfoAsync(`${context}/transmissionTexture`, extension.transmissionTexture, undefined).then((texture: BaseTexture) => {\r\n pbrMaterial.subSurface.refractionIntensityTexture = texture;\r\n pbrMaterial.subSurface.useGltfStyleTextures = true;\r\n });\r\n } else {\r\n return Promise.resolve();\r\n }\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new KHR_materials_transmission(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport { 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 { IMaterial, ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport type { IKHRMaterialsTranslucency } from \"babylonjs-gltf2interface\";\r\n\r\nconst NAME = \"KHR_materials_translucency\";\r\n\r\n/**\r\n * [Proposed Specification](https://github.com/KhronosGroup/glTF/pull/1825)\r\n * !!! Experimental Extension Subject to Changes !!!\r\n */\r\nexport class KHR_materials_translucency implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 174;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n if (this.enabled) {\r\n loader.parent.transparencyAsCoverage = true;\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param material\r\n * @param babylonMaterial\r\n * @hidden\r\n */\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => {\r\n const promises = new Array>();\r\n promises.push(this._loader.loadMaterialBasePropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadTranslucentPropertiesAsync(extensionContext, material, babylonMaterial, extension));\r\n return Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n private _loadTranslucentPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material, extension: IKHRMaterialsTranslucency): Promise {\r\n if (!(babylonMaterial instanceof PBRMaterial)) {\r\n throw new Error(`${context}: Material type not supported`);\r\n }\r\n const pbrMaterial = babylonMaterial as PBRMaterial;\r\n\r\n // Enables \"translucency\" texture which represents diffusely-transmitted light.\r\n pbrMaterial.subSurface.isTranslucencyEnabled = 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 pbrMaterial.subSurface.volumeIndexOfRefraction = 1.0;\r\n pbrMaterial.subSurface.minimumThickness = 0.0;\r\n pbrMaterial.subSurface.maximumThickness = 0.0;\r\n\r\n // Albedo colour will tint transmission.\r\n pbrMaterial.subSurface.useAlbedoToTintTranslucency = true;\r\n\r\n if (extension.translucencyFactor !== undefined) {\r\n pbrMaterial.subSurface.translucencyIntensity = extension.translucencyFactor;\r\n } else {\r\n pbrMaterial.subSurface.translucencyIntensity = 0.0;\r\n pbrMaterial.subSurface.isTranslucencyEnabled = false;\r\n return Promise.resolve();\r\n }\r\n\r\n if (extension.translucencyTexture) {\r\n (extension.translucencyTexture as ITextureInfo).nonColorData = true;\r\n return this._loader.loadTextureInfoAsync(`${context}/translucencyTexture`, extension.translucencyTexture).then((texture: BaseTexture) => {\r\n pbrMaterial.subSurface.translucencyIntensityTexture = texture;\r\n });\r\n } else {\r\n return Promise.resolve();\r\n }\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new KHR_materials_translucency(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport { 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 { IMaterial, ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport type { IKHRMaterialsVolume } from \"babylonjs-gltf2interface\";\r\n\r\nconst NAME = \"KHR_materials_volume\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume)\r\n * @since 5.0.0\r\n */\r\nexport class KHR_materials_volume implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 173;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n if (this.enabled) {\r\n // We need to disable instance usage because the attenuation factor depends on the node scale of each individual mesh\r\n this._loader._disableInstancedMesh++;\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n if (this.enabled) {\r\n this._loader._disableInstancedMesh--;\r\n }\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param material\r\n * @param babylonMaterial\r\n * @hidden\r\n */\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => {\r\n const promises = new Array>();\r\n promises.push(this._loader.loadMaterialBasePropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadVolumePropertiesAsync(extensionContext, material, babylonMaterial, extension));\r\n return Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n private _loadVolumePropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material, extension: IKHRMaterialsVolume): Promise {\r\n if (!(babylonMaterial instanceof PBRMaterial)) {\r\n throw new Error(`${context}: Material type not supported`);\r\n }\r\n\r\n // If transparency isn't enabled already, this extension shouldn't do anything.\r\n // i.e. it requires either the KHR_materials_transmission or KHR_materials_translucency extensions.\r\n if ((!babylonMaterial.subSurface.isRefractionEnabled && !babylonMaterial.subSurface.isTranslucencyEnabled) || !extension.thicknessFactor) {\r\n return Promise.resolve();\r\n }\r\n\r\n // IOR in this extension only affects interior.\r\n babylonMaterial.subSurface.volumeIndexOfRefraction = babylonMaterial.indexOfRefraction;\r\n const attenuationDistance = extension.attenuationDistance !== undefined ? extension.attenuationDistance : Number.MAX_VALUE;\r\n babylonMaterial.subSurface.tintColorAtDistance = attenuationDistance;\r\n if (extension.attenuationColor !== undefined && extension.attenuationColor.length == 3) {\r\n babylonMaterial.subSurface.tintColor.copyFromFloats(extension.attenuationColor[0], extension.attenuationColor[1], extension.attenuationColor[2]);\r\n }\r\n\r\n babylonMaterial.subSurface.minimumThickness = 0.0;\r\n babylonMaterial.subSurface.maximumThickness = extension.thicknessFactor;\r\n babylonMaterial.subSurface.useThicknessAsDepth = true;\r\n if (extension.thicknessTexture) {\r\n (extension.thicknessTexture as ITextureInfo).nonColorData = true;\r\n return this._loader.loadTextureInfoAsync(`${context}/thicknessTexture`, extension.thicknessTexture).then((texture: BaseTexture) => {\r\n babylonMaterial.subSurface.thicknessTexture = texture;\r\n babylonMaterial.subSurface.useGltfStyleTextures = true;\r\n });\r\n } else {\r\n return Promise.resolve();\r\n }\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new KHR_materials_volume(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\n\r\nconst NAME = \"KHR_mesh_quantization\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization)\r\n */\r\nexport class KHR_mesh_quantization implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this.enabled = loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {}\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new KHR_mesh_quantization(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\nimport type { ITexture } from \"../glTFLoaderInterfaces\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { IKHRTextureBasisU } from \"babylonjs-gltf2interface\";\r\n\r\nconst NAME = \"KHR_texture_basisu\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu)\r\n */\r\nexport class KHR_texture_basisu implements IGLTFLoaderExtension {\r\n /** The name of this extension. */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled. */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param texture\r\n * @param assign\r\n * @hidden\r\n */\r\n public _loadTextureAsync(context: string, texture: ITexture, assign: (babylonTexture: BaseTexture) => void): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, texture, this.name, (extensionContext, extension) => {\r\n const sampler = texture.sampler == undefined ? GLTFLoader.DefaultSampler : ArrayItem.Get(`${context}/sampler`, this._loader.gltf.samplers, texture.sampler);\r\n const image = ArrayItem.Get(`${extensionContext}/source`, this._loader.gltf.images, extension.source);\r\n return this._loader._createTextureAsync(\r\n context,\r\n sampler,\r\n image,\r\n (babylonTexture) => {\r\n assign(babylonTexture);\r\n },\r\n texture._textureInfo.nonColorData ? { useRGBAIfASTCBC7NotAvailableWhenUASTC: true } : undefined,\r\n !texture._textureInfo.nonColorData\r\n );\r\n });\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new KHR_texture_basisu(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\n\r\nimport type { ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport type { IKHRTextureTransform } from \"babylonjs-gltf2interface\";\r\n\r\nconst NAME = \"KHR_texture_transform\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_texture_transform)\r\n */\r\nexport class KHR_texture_transform implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param textureInfo\r\n * @param assign\r\n * @hidden\r\n */\r\n public loadTextureInfoAsync(context: string, textureInfo: ITextureInfo, assign: (babylonTexture: BaseTexture) => void): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, textureInfo, this.name, (extensionContext, extension) => {\r\n return this._loader.loadTextureInfoAsync(context, textureInfo, (babylonTexture) => {\r\n if (!(babylonTexture instanceof Texture)) {\r\n throw new Error(`${extensionContext}: Texture type not supported`);\r\n }\r\n\r\n if (extension.offset) {\r\n babylonTexture.uOffset = extension.offset[0];\r\n babylonTexture.vOffset = extension.offset[1];\r\n }\r\n\r\n // Always rotate around the origin.\r\n babylonTexture.uRotationCenter = 0;\r\n babylonTexture.vRotationCenter = 0;\r\n\r\n if (extension.rotation) {\r\n babylonTexture.wAng = -extension.rotation;\r\n }\r\n\r\n if (extension.scale) {\r\n babylonTexture.uScale = extension.scale[0];\r\n babylonTexture.vScale = extension.scale[1];\r\n }\r\n\r\n if (extension.texCoord != undefined) {\r\n babylonTexture.coordinatesIndex = extension.texCoord;\r\n }\r\n\r\n assign(babylonTexture);\r\n });\r\n });\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new KHR_texture_transform(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport type { IKHRXmpJsonLd_Gltf, IKHRXmpJsonLd_Node } from \"babylonjs-gltf2interface\";\r\n\r\nconst NAME = \"KHR_xmp_json_ld\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_xmp_json_ld)\r\n * @since 5.0.0\r\n */\r\nexport class KHR_xmp_json_ld implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 100;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * Called after the loader state changes to LOADING.\r\n */\r\n public onLoading(): void {\r\n if (this._loader.rootBabylonMesh === null) {\r\n return;\r\n }\r\n\r\n const xmp_gltf = this._loader.gltf.extensions?.KHR_xmp_json_ld as IKHRXmpJsonLd_Gltf;\r\n const xmp_node = this._loader.gltf.asset?.extensions?.KHR_xmp_json_ld as IKHRXmpJsonLd_Node;\r\n if (xmp_gltf && xmp_node) {\r\n const packet = +xmp_node.packet;\r\n if (xmp_gltf.packets && packet < xmp_gltf.packets.length) {\r\n this._loader.rootBabylonMesh.metadata = this._loader.rootBabylonMesh.metadata || {};\r\n this._loader.rootBabylonMesh.metadata.xmp = xmp_gltf.packets[packet];\r\n }\r\n }\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new KHR_xmp_json_ld(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { AnimationGroup } from \"core/Animations/animationGroup\";\r\nimport { AnimationEvent } from \"core/Animations/animationEvent\";\r\nimport type { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Sound } from \"core/Audio/sound\";\r\nimport { WeightedSound } from \"core/Audio/weightedsound\";\r\n\r\nimport type { IArrayItem, IScene, INode, IAnimation } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\nimport type { IMSFTAudioEmitter_Clip, IMSFTAudioEmitter_Emitter, IMSFTAudioEmitter_EmittersReference, IMSFTAudioEmitter_AnimationEvent } from \"babylonjs-gltf2interface\";\r\nimport { IMSFTAudioEmitter_AnimationEventAction } from \"babylonjs-gltf2interface\";\r\n\r\nconst NAME = \"MSFT_audio_emitter\";\r\n\r\ninterface ILoaderClip extends IMSFTAudioEmitter_Clip, IArrayItem {\r\n _objectURL?: Promise;\r\n}\r\n\r\ninterface ILoaderEmitter extends IMSFTAudioEmitter_Emitter, IArrayItem {\r\n _babylonData?: {\r\n sound?: WeightedSound;\r\n loaded: Promise;\r\n };\r\n _babylonSounds: Sound[];\r\n}\r\n\r\ninterface IMSFTAudioEmitter {\r\n clips: ILoaderClip[];\r\n emitters: ILoaderEmitter[];\r\n}\r\n\r\ninterface ILoaderAnimationEvent extends IMSFTAudioEmitter_AnimationEvent, IArrayItem {}\r\n\r\ninterface ILoaderAnimationEvents {\r\n events: ILoaderAnimationEvent[];\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/najadojo/glTF/tree/MSFT_audio_emitter/extensions/2.0/Vendor/MSFT_audio_emitter)\r\n */\r\nexport class MSFT_audio_emitter implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n private _clips: Array;\r\n private _emitters: Array;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n (this._clips as any) = null;\r\n (this._emitters as any) = null;\r\n }\r\n\r\n /** @hidden */\r\n public onLoading(): void {\r\n const extensions = this._loader.gltf.extensions;\r\n if (extensions && extensions[this.name]) {\r\n const extension = extensions[this.name] as IMSFTAudioEmitter;\r\n\r\n this._clips = extension.clips;\r\n this._emitters = extension.emitters;\r\n\r\n ArrayItem.Assign(this._clips);\r\n ArrayItem.Assign(this._emitters);\r\n }\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param scene\r\n * @hidden\r\n */\r\n public loadSceneAsync(context: string, scene: IScene): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, scene, this.name, (extensionContext, extension) => {\r\n const promises = new Array>();\r\n\r\n promises.push(this._loader.loadSceneAsync(context, scene));\r\n\r\n for (const emitterIndex of extension.emitters) {\r\n const emitter = ArrayItem.Get(`${extensionContext}/emitters`, this._emitters, emitterIndex);\r\n if (\r\n emitter.refDistance != undefined ||\r\n emitter.maxDistance != undefined ||\r\n emitter.rolloffFactor != undefined ||\r\n emitter.distanceModel != undefined ||\r\n emitter.innerAngle != undefined ||\r\n emitter.outerAngle != undefined\r\n ) {\r\n throw new Error(`${extensionContext}: Direction or Distance properties are not allowed on emitters attached to a scene`);\r\n }\r\n\r\n promises.push(this._loadEmitterAsync(`${extensionContext}/emitters/${emitter.index}`, emitter));\r\n }\r\n\r\n return Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param node\r\n * @param assign\r\n * @hidden\r\n */\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, node, this.name, (extensionContext, extension) => {\r\n const promises = new Array>();\r\n\r\n return this._loader\r\n .loadNodeAsync(extensionContext, node, (babylonMesh) => {\r\n for (const emitterIndex of extension.emitters) {\r\n const emitter = ArrayItem.Get(`${extensionContext}/emitters`, this._emitters, emitterIndex);\r\n promises.push(\r\n this._loadEmitterAsync(`${extensionContext}/emitters/${emitter.index}`, emitter).then(() => {\r\n for (const sound of emitter._babylonSounds) {\r\n sound.attachToMesh(babylonMesh);\r\n if (emitter.innerAngle != undefined || emitter.outerAngle != undefined) {\r\n sound.setLocalDirectionToMesh(Vector3.Forward());\r\n sound.setDirectionalCone(\r\n 2 * Tools.ToDegrees(emitter.innerAngle == undefined ? Math.PI : emitter.innerAngle),\r\n 2 * Tools.ToDegrees(emitter.outerAngle == undefined ? Math.PI : emitter.outerAngle),\r\n 0\r\n );\r\n }\r\n }\r\n })\r\n );\r\n }\r\n\r\n assign(babylonMesh);\r\n })\r\n .then((babylonMesh) => {\r\n return Promise.all(promises).then(() => {\r\n return babylonMesh;\r\n });\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param animation\r\n * @hidden\r\n */\r\n public loadAnimationAsync(context: string, animation: IAnimation): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, animation, this.name, (extensionContext, extension) => {\r\n return this._loader.loadAnimationAsync(context, animation).then((babylonAnimationGroup) => {\r\n const promises = new Array>();\r\n\r\n ArrayItem.Assign(extension.events);\r\n for (const event of extension.events) {\r\n promises.push(this._loadAnimationEventAsync(`${extensionContext}/events/${event.index}`, context, animation, event, babylonAnimationGroup));\r\n }\r\n\r\n return Promise.all(promises).then(() => {\r\n return babylonAnimationGroup;\r\n });\r\n });\r\n });\r\n }\r\n\r\n private _loadClipAsync(context: string, clip: ILoaderClip): Promise {\r\n if (clip._objectURL) {\r\n return clip._objectURL;\r\n }\r\n\r\n let promise: Promise;\r\n if (clip.uri) {\r\n promise = this._loader.loadUriAsync(context, clip, clip.uri);\r\n } else {\r\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._loader.gltf.bufferViews, clip.bufferView);\r\n promise = this._loader.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView);\r\n }\r\n\r\n clip._objectURL = promise.then((data) => {\r\n return URL.createObjectURL(new Blob([data], { type: clip.mimeType }));\r\n });\r\n\r\n return clip._objectURL;\r\n }\r\n\r\n private _loadEmitterAsync(context: string, emitter: ILoaderEmitter): Promise {\r\n emitter._babylonSounds = emitter._babylonSounds || [];\r\n if (!emitter._babylonData) {\r\n const clipPromises = new Array>();\r\n const name = emitter.name || `emitter${emitter.index}`;\r\n const options = {\r\n loop: false,\r\n autoplay: false,\r\n volume: emitter.volume == undefined ? 1 : emitter.volume,\r\n };\r\n\r\n for (let i = 0; i < emitter.clips.length; i++) {\r\n const clipContext = `/extensions/${this.name}/clips`;\r\n const clip = ArrayItem.Get(clipContext, this._clips, emitter.clips[i].clip);\r\n clipPromises.push(\r\n this._loadClipAsync(`${clipContext}/${emitter.clips[i].clip}`, clip).then((objectURL: string) => {\r\n const sound = (emitter._babylonSounds[i] = new Sound(name, objectURL, this._loader.babylonScene, null, options));\r\n sound.refDistance = emitter.refDistance || 1;\r\n sound.maxDistance = emitter.maxDistance || 256;\r\n sound.rolloffFactor = emitter.rolloffFactor || 1;\r\n sound.distanceModel = emitter.distanceModel || \"exponential\";\r\n })\r\n );\r\n }\r\n\r\n const promise = Promise.all(clipPromises).then(() => {\r\n const weights = emitter.clips.map((clip) => {\r\n return clip.weight || 1;\r\n });\r\n const weightedSound = new WeightedSound(emitter.loop || false, emitter._babylonSounds, weights);\r\n if (emitter.innerAngle) {\r\n weightedSound.directionalConeInnerAngle = 2 * Tools.ToDegrees(emitter.innerAngle);\r\n }\r\n if (emitter.outerAngle) {\r\n weightedSound.directionalConeOuterAngle = 2 * Tools.ToDegrees(emitter.outerAngle);\r\n }\r\n if (emitter.volume) {\r\n weightedSound.volume = emitter.volume;\r\n }\r\n emitter._babylonData!.sound = weightedSound;\r\n });\r\n\r\n emitter._babylonData = {\r\n loaded: promise,\r\n };\r\n }\r\n\r\n return emitter._babylonData.loaded;\r\n }\r\n\r\n private _getEventAction(\r\n context: string,\r\n sound: WeightedSound,\r\n action: IMSFTAudioEmitter_AnimationEventAction,\r\n time: number,\r\n startOffset?: number\r\n ): (currentFrame: number) => void {\r\n switch (action) {\r\n case IMSFTAudioEmitter_AnimationEventAction.play: {\r\n return (currentFrame: number) => {\r\n const frameOffset = (startOffset || 0) + (currentFrame - time);\r\n sound.play(frameOffset);\r\n };\r\n }\r\n case IMSFTAudioEmitter_AnimationEventAction.stop: {\r\n return () => {\r\n sound.stop();\r\n };\r\n }\r\n case IMSFTAudioEmitter_AnimationEventAction.pause: {\r\n return () => {\r\n sound.pause();\r\n };\r\n }\r\n default: {\r\n throw new Error(`${context}: Unsupported action ${action}`);\r\n }\r\n }\r\n }\r\n\r\n private _loadAnimationEventAsync(\r\n context: string,\r\n animationContext: string,\r\n animation: IAnimation,\r\n event: ILoaderAnimationEvent,\r\n babylonAnimationGroup: AnimationGroup\r\n ): Promise {\r\n if (babylonAnimationGroup.targetedAnimations.length == 0) {\r\n return Promise.resolve();\r\n }\r\n const babylonAnimation = babylonAnimationGroup.targetedAnimations[0];\r\n const emitterIndex = event.emitter;\r\n const emitter = ArrayItem.Get(`/extensions/${this.name}/emitters`, this._emitters, emitterIndex);\r\n return this._loadEmitterAsync(context, emitter).then(() => {\r\n const sound = emitter._babylonData!.sound;\r\n if (sound) {\r\n const babylonAnimationEvent = new AnimationEvent(event.time, this._getEventAction(context, sound, event.action, event.time, event.startOffset));\r\n babylonAnimation.animation.addEvent(babylonAnimationEvent);\r\n // Make sure all started audio stops when this animation is terminated.\r\n babylonAnimationGroup.onAnimationGroupEndObservable.add(() => {\r\n sound.stop();\r\n });\r\n babylonAnimationGroup.onAnimationGroupPauseObservable.add(() => {\r\n sound.pause();\r\n });\r\n }\r\n });\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new MSFT_audio_emitter(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { Deferred } from \"core/Misc/deferred\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport type { TransformNode } from \"core/Meshes/transformNode\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { INode, IMaterial, IBuffer, IScene } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\nimport type { IProperty, IMSFTLOD } from \"babylonjs-gltf2interface\";\r\n\r\nconst NAME = \"MSFT_lod\";\r\n\r\ninterface IBufferInfo {\r\n start: number;\r\n end: number;\r\n loaded: Deferred;\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/MSFT_lod)\r\n */\r\nexport class MSFT_lod implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 100;\r\n\r\n /**\r\n * Maximum number of LODs to load, starting from the lowest LOD.\r\n */\r\n public maxLODsToLoad = 10;\r\n\r\n /**\r\n * Observable raised when all node LODs of one level are loaded.\r\n * The event data is the index of the loaded LOD starting from zero.\r\n * Dispose the loader to cancel the loading of the next level of LODs.\r\n */\r\n public onNodeLODsLoadedObservable = new Observable();\r\n\r\n /**\r\n * Observable raised when all material LODs of one level are loaded.\r\n * The event data is the index of the loaded LOD starting from zero.\r\n * Dispose the loader to cancel the loading of the next level of LODs.\r\n */\r\n public onMaterialLODsLoadedObservable = new Observable();\r\n\r\n private _loader: GLTFLoader;\r\n\r\n private _bufferLODs = new Array();\r\n\r\n private _nodeIndexLOD: Nullable = null;\r\n private _nodeSignalLODs = new Array>();\r\n private _nodePromiseLODs = new Array>>();\r\n private _nodeBufferLODs = new Array();\r\n\r\n private _materialIndexLOD: Nullable = null;\r\n private _materialSignalLODs = new Array>();\r\n private _materialPromiseLODs = new Array>>();\r\n private _materialBufferLODs = new Array();\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n\r\n this._nodeIndexLOD = null;\r\n this._nodeSignalLODs.length = 0;\r\n this._nodePromiseLODs.length = 0;\r\n this._nodeBufferLODs.length = 0;\r\n\r\n this._materialIndexLOD = null;\r\n this._materialSignalLODs.length = 0;\r\n this._materialPromiseLODs.length = 0;\r\n this._materialBufferLODs.length = 0;\r\n\r\n this.onMaterialLODsLoadedObservable.clear();\r\n this.onNodeLODsLoadedObservable.clear();\r\n }\r\n\r\n /** @hidden */\r\n public onReady(): void {\r\n for (let indexLOD = 0; indexLOD < this._nodePromiseLODs.length; indexLOD++) {\r\n const promise = Promise.all(this._nodePromiseLODs[indexLOD]).then(() => {\r\n if (indexLOD !== 0) {\r\n this._loader.endPerformanceCounter(`Node LOD ${indexLOD}`);\r\n this._loader.log(`Loaded node LOD ${indexLOD}`);\r\n }\r\n\r\n this.onNodeLODsLoadedObservable.notifyObservers(indexLOD);\r\n\r\n if (indexLOD !== this._nodePromiseLODs.length - 1) {\r\n this._loader.startPerformanceCounter(`Node LOD ${indexLOD + 1}`);\r\n this._loadBufferLOD(this._nodeBufferLODs, indexLOD + 1);\r\n if (this._nodeSignalLODs[indexLOD]) {\r\n this._nodeSignalLODs[indexLOD].resolve();\r\n }\r\n }\r\n });\r\n\r\n this._loader._completePromises.push(promise);\r\n }\r\n\r\n for (let indexLOD = 0; indexLOD < this._materialPromiseLODs.length; indexLOD++) {\r\n const promise = Promise.all(this._materialPromiseLODs[indexLOD]).then(() => {\r\n if (indexLOD !== 0) {\r\n this._loader.endPerformanceCounter(`Material LOD ${indexLOD}`);\r\n this._loader.log(`Loaded material LOD ${indexLOD}`);\r\n }\r\n\r\n this.onMaterialLODsLoadedObservable.notifyObservers(indexLOD);\r\n\r\n if (indexLOD !== this._materialPromiseLODs.length - 1) {\r\n this._loader.startPerformanceCounter(`Material LOD ${indexLOD + 1}`);\r\n this._loadBufferLOD(this._materialBufferLODs, indexLOD + 1);\r\n if (this._materialSignalLODs[indexLOD]) {\r\n this._materialSignalLODs[indexLOD].resolve();\r\n }\r\n }\r\n });\r\n\r\n this._loader._completePromises.push(promise);\r\n }\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param scene\r\n * @hidden\r\n */\r\n public loadSceneAsync(context: string, scene: IScene): Nullable> {\r\n const promise = this._loader.loadSceneAsync(context, scene);\r\n this._loadBufferLOD(this._bufferLODs, 0);\r\n return promise;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param node\r\n * @param assign\r\n * @hidden\r\n */\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable> {\r\n return GLTFLoader.LoadExtensionAsync(context, node, this.name, (extensionContext, extension) => {\r\n let firstPromise: Promise;\r\n\r\n const nodeLODs = this._getLODs(extensionContext, node, this._loader.gltf.nodes, extension.ids);\r\n this._loader.logOpen(`${extensionContext}`);\r\n\r\n for (let indexLOD = 0; indexLOD < nodeLODs.length; indexLOD++) {\r\n const nodeLOD = nodeLODs[indexLOD];\r\n\r\n if (indexLOD !== 0) {\r\n this._nodeIndexLOD = indexLOD;\r\n this._nodeSignalLODs[indexLOD] = this._nodeSignalLODs[indexLOD] || new Deferred();\r\n }\r\n\r\n const assignWrap = (babylonTransformNode: TransformNode) => {\r\n assign(babylonTransformNode);\r\n babylonTransformNode.setEnabled(false);\r\n };\r\n\r\n const promise = this._loader.loadNodeAsync(`/nodes/${nodeLOD.index}`, nodeLOD, assignWrap).then((babylonMesh) => {\r\n if (indexLOD !== 0) {\r\n // TODO: should not rely on _babylonTransformNode\r\n const previousNodeLOD = nodeLODs[indexLOD - 1];\r\n if (previousNodeLOD._babylonTransformNode) {\r\n this._disposeTransformNode(previousNodeLOD._babylonTransformNode);\r\n delete previousNodeLOD._babylonTransformNode;\r\n }\r\n }\r\n\r\n babylonMesh.setEnabled(true);\r\n return babylonMesh;\r\n });\r\n\r\n this._nodePromiseLODs[indexLOD] = this._nodePromiseLODs[indexLOD] || [];\r\n\r\n if (indexLOD === 0) {\r\n firstPromise = promise;\r\n } else {\r\n this._nodeIndexLOD = null;\r\n this._nodePromiseLODs[indexLOD].push(promise);\r\n }\r\n }\r\n\r\n this._loader.logClose();\r\n return firstPromise!;\r\n });\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param material\r\n * @param babylonMesh\r\n * @param babylonDrawMode\r\n * @param assign\r\n * @hidden\r\n */\r\n public _loadMaterialAsync(\r\n context: string,\r\n material: IMaterial,\r\n babylonMesh: Nullable,\r\n babylonDrawMode: number,\r\n assign: (babylonMaterial: Material) => void\r\n ): Nullable> {\r\n // Don't load material LODs if already loading a node LOD.\r\n if (this._nodeIndexLOD) {\r\n return null;\r\n }\r\n\r\n return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => {\r\n let firstPromise: Promise;\r\n\r\n const materialLODs = this._getLODs(extensionContext, material, this._loader.gltf.materials, extension.ids);\r\n this._loader.logOpen(`${extensionContext}`);\r\n\r\n for (let indexLOD = 0; indexLOD < materialLODs.length; indexLOD++) {\r\n const materialLOD = materialLODs[indexLOD];\r\n\r\n if (indexLOD !== 0) {\r\n this._materialIndexLOD = indexLOD;\r\n }\r\n\r\n const promise = this._loader\r\n ._loadMaterialAsync(`/materials/${materialLOD.index}`, materialLOD, babylonMesh, babylonDrawMode, (babylonMaterial) => {\r\n if (indexLOD === 0) {\r\n assign(babylonMaterial);\r\n }\r\n })\r\n .then((babylonMaterial) => {\r\n if (indexLOD !== 0) {\r\n assign(babylonMaterial);\r\n\r\n // TODO: should not rely on _data\r\n const previousDataLOD = materialLODs[indexLOD - 1]._data!;\r\n if (previousDataLOD[babylonDrawMode]) {\r\n this._disposeMaterials([previousDataLOD[babylonDrawMode].babylonMaterial]);\r\n delete previousDataLOD[babylonDrawMode];\r\n }\r\n }\r\n\r\n return babylonMaterial;\r\n });\r\n\r\n this._materialPromiseLODs[indexLOD] = this._materialPromiseLODs[indexLOD] || [];\r\n\r\n if (indexLOD === 0) {\r\n firstPromise = promise;\r\n } else {\r\n this._materialIndexLOD = null;\r\n this._materialPromiseLODs[indexLOD].push(promise);\r\n }\r\n }\r\n\r\n this._loader.logClose();\r\n return firstPromise!;\r\n });\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param property\r\n * @param uri\r\n * @hidden\r\n */\r\n public _loadUriAsync(context: string, property: IProperty, uri: string): Nullable> {\r\n // Defer the loading of uris if loading a node or material LOD.\r\n if (this._nodeIndexLOD !== null) {\r\n this._loader.log(`deferred`);\r\n const previousIndexLOD = this._nodeIndexLOD - 1;\r\n this._nodeSignalLODs[previousIndexLOD] = this._nodeSignalLODs[previousIndexLOD] || new Deferred();\r\n return this._nodeSignalLODs[this._nodeIndexLOD - 1].promise.then(() => {\r\n return this._loader.loadUriAsync(context, property, uri);\r\n });\r\n } else if (this._materialIndexLOD !== null) {\r\n this._loader.log(`deferred`);\r\n const previousIndexLOD = this._materialIndexLOD - 1;\r\n this._materialSignalLODs[previousIndexLOD] = this._materialSignalLODs[previousIndexLOD] || new Deferred();\r\n return this._materialSignalLODs[previousIndexLOD].promise.then(() => {\r\n return this._loader.loadUriAsync(context, property, uri);\r\n });\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param buffer\r\n * @param byteOffset\r\n * @param byteLength\r\n * @hidden\r\n */\r\n public loadBufferAsync(context: string, buffer: IBuffer, byteOffset: number, byteLength: number): Nullable> {\r\n if (this._loader.parent.useRangeRequests && !buffer.uri) {\r\n if (!this._loader.bin) {\r\n throw new Error(`${context}: Uri is missing or the binary glTF is missing its binary chunk`);\r\n }\r\n\r\n const loadAsync = (bufferLODs: Array, indexLOD: number) => {\r\n const start = byteOffset;\r\n const end = start + byteLength - 1;\r\n let bufferLOD = bufferLODs[indexLOD];\r\n if (bufferLOD) {\r\n bufferLOD.start = Math.min(bufferLOD.start, start);\r\n bufferLOD.end = Math.max(bufferLOD.end, end);\r\n } else {\r\n bufferLOD = { start: start, end: end, loaded: new Deferred() };\r\n bufferLODs[indexLOD] = bufferLOD;\r\n }\r\n\r\n return bufferLOD.loaded.promise.then((data) => {\r\n return new Uint8Array(data.buffer, data.byteOffset + byteOffset - bufferLOD.start, byteLength);\r\n });\r\n };\r\n\r\n this._loader.log(`deferred`);\r\n\r\n if (this._nodeIndexLOD !== null) {\r\n return loadAsync(this._nodeBufferLODs, this._nodeIndexLOD);\r\n } else if (this._materialIndexLOD !== null) {\r\n return loadAsync(this._materialBufferLODs, this._materialIndexLOD);\r\n } else {\r\n return loadAsync(this._bufferLODs, 0);\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _loadBufferLOD(bufferLODs: Array, indexLOD: number): void {\r\n const bufferLOD = bufferLODs[indexLOD];\r\n if (bufferLOD) {\r\n this._loader.log(`Loading buffer range [${bufferLOD.start}-${bufferLOD.end}]`);\r\n this._loader.bin!.readAsync(bufferLOD.start, bufferLOD.end - bufferLOD.start + 1).then(\r\n (data) => {\r\n bufferLOD.loaded.resolve(data);\r\n },\r\n (error) => {\r\n bufferLOD.loaded.reject(error);\r\n }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Gets an array of LOD properties from lowest to highest.\r\n * @param context\r\n * @param property\r\n * @param array\r\n * @param ids\r\n */\r\n private _getLODs(context: string, property: T, array: ArrayLike | undefined, ids: number[]): T[] {\r\n if (this.maxLODsToLoad <= 0) {\r\n throw new Error(\"maxLODsToLoad must be greater than zero\");\r\n }\r\n\r\n const properties = new Array();\r\n\r\n for (let i = ids.length - 1; i >= 0; i--) {\r\n properties.push(ArrayItem.Get(`${context}/ids/${ids[i]}`, array, ids[i]));\r\n if (properties.length === this.maxLODsToLoad) {\r\n return properties;\r\n }\r\n }\r\n\r\n properties.push(property);\r\n return properties;\r\n }\r\n\r\n private _disposeTransformNode(babylonTransformNode: TransformNode): void {\r\n const babylonMaterials = new Array();\r\n const babylonMaterial = (babylonTransformNode as Mesh).material;\r\n if (babylonMaterial) {\r\n babylonMaterials.push(babylonMaterial);\r\n }\r\n for (const babylonMesh of babylonTransformNode.getChildMeshes()) {\r\n if (babylonMesh.material) {\r\n babylonMaterials.push(babylonMesh.material);\r\n }\r\n }\r\n\r\n babylonTransformNode.dispose();\r\n\r\n const babylonMaterialsToDispose = babylonMaterials.filter((babylonMaterial) => this._loader.babylonScene.meshes.every((mesh) => mesh.material != babylonMaterial));\r\n this._disposeMaterials(babylonMaterialsToDispose);\r\n }\r\n\r\n private _disposeMaterials(babylonMaterials: Material[]): void {\r\n const babylonTextures: { [uniqueId: number]: BaseTexture } = {};\r\n\r\n for (const babylonMaterial of babylonMaterials) {\r\n for (const babylonTexture of babylonMaterial.getActiveTextures()) {\r\n babylonTextures[babylonTexture.uniqueId] = babylonTexture;\r\n }\r\n\r\n babylonMaterial.dispose();\r\n }\r\n\r\n for (const uniqueId in babylonTextures) {\r\n for (const babylonMaterial of this._loader.babylonScene.materials) {\r\n if (babylonMaterial.hasTexture(babylonTextures[uniqueId])) {\r\n delete babylonTextures[uniqueId];\r\n }\r\n }\r\n }\r\n\r\n for (const uniqueId in babylonTextures) {\r\n babylonTextures[uniqueId].dispose();\r\n }\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new MSFT_lod(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\n\r\nimport type { IMaterial } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\n\r\nconst NAME = \"MSFT_minecraftMesh\";\r\n\r\n/** @hidden */\r\nexport class MSFT_minecraftMesh implements IGLTFLoaderExtension {\r\n public readonly name = NAME;\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> {\r\n return GLTFLoader.LoadExtraAsync(context, material, this.name, (extraContext, extra) => {\r\n if (extra) {\r\n if (!(babylonMaterial instanceof PBRMaterial)) {\r\n throw new Error(`${extraContext}: Material type not supported`);\r\n }\r\n\r\n const promise = this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial);\r\n\r\n if (babylonMaterial.needAlphaBlending()) {\r\n babylonMaterial.forceDepthWrite = true;\r\n babylonMaterial.separateCullingPass = true;\r\n }\r\n\r\n babylonMaterial.backFaceCulling = babylonMaterial.forceDepthWrite;\r\n babylonMaterial.twoSidedLighting = true;\r\n\r\n return promise;\r\n }\r\n\r\n return null;\r\n });\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new MSFT_minecraftMesh(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\n\r\nimport type { IMaterial } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\n\r\nconst NAME = \"MSFT_sRGBFactors\";\r\n\r\n/** @hidden */\r\nexport class MSFT_sRGBFactors implements IGLTFLoaderExtension {\r\n public readonly name = NAME;\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> {\r\n return GLTFLoader.LoadExtraAsync(context, material, this.name, (extraContext, extra) => {\r\n if (extra) {\r\n if (!(babylonMaterial instanceof PBRMaterial)) {\r\n throw new Error(`${extraContext}: Material type not supported`);\r\n }\r\n\r\n const promise = this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial);\r\n\r\n if (!babylonMaterial.albedoTexture) {\r\n babylonMaterial.albedoColor.toLinearSpaceToRef(babylonMaterial.albedoColor);\r\n }\r\n\r\n if (!babylonMaterial.reflectivityTexture) {\r\n babylonMaterial.reflectivityColor.toLinearSpaceToRef(babylonMaterial.reflectivityColor);\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n return null;\r\n });\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new MSFT_sRGBFactors(loader));\r\n","import type { Nullable } from \"core/types\";\r\nimport type { TransformNode } from \"core/Meshes/transformNode\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\n\r\nimport type { IProperty } from \"babylonjs-gltf2interface\";\r\nimport type { INode, ICamera, IMaterial } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport type { Material } from \"core/Materials/material\";\r\n\r\nconst NAME = \"ExtrasAsMetadata\";\r\n\r\ninterface ObjectWithMetadata {\r\n metadata: any;\r\n}\r\n\r\n/**\r\n * Store glTF extras (if present) in BJS objects' metadata\r\n */\r\nexport class ExtrasAsMetadata implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled = true;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n private _assignExtras(babylonObject: ObjectWithMetadata, gltfProp: IProperty): void {\r\n if (gltfProp.extras && Object.keys(gltfProp.extras).length > 0) {\r\n const metadata = (babylonObject.metadata = babylonObject.metadata || {});\r\n const gltf = (metadata.gltf = metadata.gltf || {});\r\n gltf.extras = gltfProp.extras;\r\n }\r\n }\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n public constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n }\r\n\r\n /** @hidden */\r\n public dispose(): void {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param node\r\n * @param assign\r\n * @hidden\r\n */\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable> {\r\n return this._loader.loadNodeAsync(context, node, (babylonTransformNode): void => {\r\n this._assignExtras(babylonTransformNode, node);\r\n assign(babylonTransformNode);\r\n });\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param camera\r\n * @param assign\r\n * @hidden\r\n */\r\n public loadCameraAsync(context: string, camera: ICamera, assign: (babylonCamera: Camera) => void): Nullable> {\r\n return this._loader.loadCameraAsync(context, camera, (babylonCamera): void => {\r\n this._assignExtras(babylonCamera, camera);\r\n assign(babylonCamera);\r\n });\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param material\r\n * @param babylonDrawMode\r\n * @hidden\r\n */\r\n public createMaterial(context: string, material: IMaterial, babylonDrawMode: number): Nullable {\r\n const babylonMaterial = this._loader.createMaterial(context, material, babylonDrawMode);\r\n this._assignExtras(babylonMaterial, material);\r\n return babylonMaterial;\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader): IGLTFLoaderExtension => new ExtrasAsMetadata(loader));\r\n","/* eslint-disable import/no-internal-modules */\nimport * as Extensions from \"../glTF/2.0/Extensions/index\";\nimport * as Interfaces from \"../glTF/2.0/glTFLoaderInterfaces\";\nimport * as GLTF2 from \"../glTF/2.0/index\";\n/**\n * This is the entry point for the UMD module.\n * The entry point for a future ESM package should be index.ts\n */\nconst globalObject = typeof global !== \"undefined\" ? global : typeof window !== \"undefined\" ? window : undefined;\nif (typeof globalObject !== \"undefined\") {\n (globalObject).BABYLON = (globalObject).BABYLON || {};\n const BABYLON = (globalObject).BABYLON;\n BABYLON.GLTF2 = BABYLON.GLTF2 || {};\n BABYLON.GLTF2.Loader = BABYLON.GLTF2.Loader || {};\n BABYLON.GLTF2.Loader.Extensions = BABYLON.GLTF2.Loader.Extensions || {};\n const keys = [];\n for (const key in Extensions) {\n BABYLON.GLTF2.Loader.Extensions[key] = (Extensions)[key];\n keys.push(key);\n }\n for (const key in Interfaces) {\n BABYLON.GLTF2.Loader[key] = (Interfaces)[key];\n keys.push(key);\n }\n for (const key in GLTF2) {\n // Prevent Reassignment.\n if (keys.indexOf(key) > -1) {\n continue;\n }\n BABYLON.GLTF2[key] = (GLTF2)[key];\n }\n}\nexport { GLTF2 };\n","import * as loaders from \"loaders/legacy/legacy-glTF2FileLoader\";\r\nexport { loaders };\r\nexport default loaders;\r\n"],"names":["root","factory","exports","module","require","define","amd","self","global","this","__WEBPACK_EXTERNAL_MODULE__520__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","d","definition","key","o","Object","defineProperty","enumerable","get","g","globalThis","Function","e","window","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","validateAsync","data","rootUrl","fileName","getExternalResource","options","externalResourceFunction","uri","then","Uint8Array","ArrayBuffer","GLTFValidator","validateBytes","validateString","workerFunc","pendingExternalResources","onmessage","message","id","importScripts","url","Promise","resolve","reject","index","length","push","postMessage","reason","GLTFLoaderCoordinateSystemMode","GLTFLoaderAnimationStartMode","GLTFLoaderState","ValidateAsync","Worker","workerContent","workerBlobUrl","URL","createObjectURL","Blob","type","worker","onError","error","removeEventListener","onMessage","terminate","addEventListener","Configuration","_LoadScriptPromise","Tools","readAsync","arrayBuffer","byteOffset","byteLength","onParsedObservable","Observable","coordinateSystemMode","AUTO","animationStartMode","FIRST","compileMaterials","useClipPlane","compileShadowGenerators","transparencyAsCoverage","useRangeRequests","createInstances","alwaysComputeBoundingBox","loadAllMaterials","loadOnlyMaterials","skipMaterials","useSRGBBuffers","targetFps","alwaysComputeSkeletonRootNode","preprocessUrlAsync","onMeshLoadedObservable","onSkinLoadedObservable","onTextureLoadedObservable","onMaterialLoadedObservable","onCameraLoadedObservable","onCompleteObservable","onErrorObservable","onDisposeObservable","onExtensionLoadedObservable","validate","onValidatedObservable","_loader","_state","_requests","Array","name","extensions","isBinary","onLoaderStateChangedObservable","_logIndentLevel","_loggingEnabled","_log","_logDisabled","_capturePerformanceCounters","_startPerformanceCounter","_startPerformanceCounterDisabled","_endPerformanceCounter","_endPerformanceCounterDisabled","callback","_onParsedObserver","remove","add","_onMeshLoadedObserver","_onTextureLoadedObserver","_onMaterialLoadedObserver","_onCameraLoadedObserver","_onCompleteObserver","_onErrorObserver","_onDisposeObserver","_onExtensionLoadedObserver","_logEnabled","_startPerformanceCounterEnabled","_endPerformanceCounterEnabled","_onValidatedObserver","dispose","abort","_progressCallback","clear","notifyObservers","loadFile","scene","fileOrUrl","onSuccess","onProgress","useArrayBuffer","Logger","dataBuffer","_loadFile","webRequest","setRequestHeader","_unpackBinaryAsync","DataReader","loaderData","_validate","json","_parseJson","importMeshAsync","meshesNames","_getLoader","loadAsync","loadAssetContainerAsync","container","AssetContainer","materials","material","textures","texture","cameras","camera","result","apply","geometries","meshes","particleSystems","skeletons","animationGroups","lights","transformNodes","canDirectLoad","indexOf","startsWith","GLTFFileLoader","_MagicBase64Encoded","directLoad","DecodeBase64UrlToBinary","createPlugin","whenCompleteAsync","addOnce","_setState","state","onOpened","request","event","_onProgress","splice","_lengthComputable","lengthComputable","_loaded","loaded","_total","total","GLTFValidation","_loadFileAsync","asset","version","minVersion","generator","_parseVersion","Error","_compareVersion","major","minor","createLoader","_CreateGLTF1Loader","_CreateGLTF2Loader","parsed","JSON","parse","dataReader","magic","readUint32","RuntimeError","ErrorCodes","loggingEnabled","unpacked","buffer","_unpackBinaryV1Async","_unpackBinaryV2Async","contentLength","contentFormat","bodyLength","readString","bin","ChunkFormat","chunkLength","skipBytes","match","parseInt","a","b","_logOpen","_logClose","spaces","_logSpaces","substr","Log","counterName","IncrementalLoading","HomogeneousCoordinates","SceneLoader","globalObject","BABYLON","Get","context","array","Assign","mergeDeep","isObject","objects","reduce","prev","keys","forEach","pVal","oVal","isArray","concat","parent","_completePromises","_assetContainer","_babylonLights","_disableInstancedMesh","_extensions","_disposed","_rootUrl","_fileName","_uniqueRootUrl","_bin","_rootBabylonMesh","_defaultBabylonMaterialData","_postSceneLoadActions","_parent","RegisterExtension","GLTFLoader","UnregisterExtension","_RegisteredExtensions","_gltf","_babylonScene","extension","_loadData","nodes","node","map","_loadAsync","_getMeshes","_getSkeletons","_getAnimationGroups","_getTransformNodes","_getGeometries","resultFunc","Date","now","_loadExtensions","_checkExtensions","loadingToReadyCounterName","LOADING","READY","loadingToCompleteCounterName","COMPLETE","_extensionsOnLoading","promises","oldBlockMaterialDirtyMechanism","blockMaterialDirtyMechanism","loadSceneAsync","scenes","ArrayItem","m","babylonDrawMode","Material","_loadMaterialAsync","_compileMaterialsAsync","_compileShadowGeneratorsAsync","all","setEnabled","_extensionsOnReady","_startAnimations","catch","_setupData","buffers","binaryBuffer","accessors","animations","bufferViews","images","samplers","skins","nodeParents","children","rootNode","_createRootNode","parentIndex","sort","order","Number","MAX_VALUE","extensionsRequired","some","enabled","_blockEntityCollection","Mesh","_parentContainer","_babylonTransformNode","useRightHandedSystem","rotation","scale","_LoadTransform","FORCE_RIGHT_HANDED","extensionPromise","_extensionsLoadSceneAsync","logOpen","loadNodeAsync","babylonMesh","action","_loadAnimationsAsync","logClose","_forEachPrimitive","_primitiveBabylonMeshes","geometry","getClassName","_babylonTransformNodeForSkin","skin","_data","babylonSkeleton","animation","_babylonAnimationGroup","NONE","babylonAnimationGroups","start","ALL","assign","_extensionsLoadNodeAsync","loadNode","babylonTransformNode","AddPointerMetadata","loadCameraAsync","babylonCamera","childNode","childBabylonMesh","mesh","nodeName","transformNode","TransformNode","_loadMeshAsync","babylonTransformNodeForSkin","metadata","_loadSkinAsync","skeleton","parentNode","skinnedNode","useBoundingInfoFromGeometry","_updateBoundingInfo","refreshBoundingInfo","primitives","primitive","_loadMeshPrimitiveAsync","_extensionsLoadMeshPrimitiveAsync","babylonAbstractMesh","promise","shouldInstance","targets","_instanceData","babylonSourceMesh","createInstance","overrideMaterialSideOrientation","_createMorphTargets","_loadVertexDataAsync","babylonGeometry","_loadMorphTargetsAsync","applyToMesh","_GetDrawMode","mode","babylonMaterial","_createDefaultMaterial","_extensionsLoadVertexDataAsync","attributes","Geometry","indices","isUnIndexed","accessor","_loadIndicesAccessorAsync","setIndices","loadAttribute","attribute","kind","_delayInfo","_loadVertexAccessorAsync","babylonVertexBuffer","getKind","VertexBuffer","mmin","min","mmax","max","normalized","componentType","divider","i","Math","TmpVectors","copyFromFloats","_boundingInfo","BoundingInfo","setVerticesBuffer","count","numBoneInfluencers","hasVertexAlpha","_numMorphTargets","targetNames","extras","morphTargetManager","MorphTargetManager","getScene","areUpdatesFrozen","weight","weights","addTarget","MorphTarget","numTargets","babylonMorphTarget","getTarget","_loadMorphTargetVertexDataAsync","setData","getVertexBuffer","_loadFloatAccessorAsync","positions","Float32Array","setPositions","normals","setNormals","tangents","dataIndex","setTangents","babylonNode","position","Vector3","Quaternion","scaling","matrix","Matrix","decompose","translation","rotationQuaternion","_extensionsLoadSkinAsync","skeletonId","Skeleton","_loadBones","_loadSkinInverseBindMatricesDataAsync","inverseBindMatricesData","_updateBoneMatrices","_findSkeletonRootNode","joints","skeletonNode","isParent","babylonBones","_loadBone","paths","path","unshift","j","babylonBone","parentBabylonBone","boneIndex","Bone","_getNodeMatrix","linkTransformNode","inverseBindMatrices","bones","baseMatrix","_index","invertToRef","babylonParentBone","getParent","multiplyToRef","getInvertedAbsoluteTransform","updateMatrix","_updateDifferenceMatrix","_extensionsLoadCameraAsync","FreeCamera","ignoreParentScaling","PI","perspective","fov","yfov","minZ","znear","maxZ","zfar","orthographic","Camera","orthoLeft","xmag","orthoRight","orthoBottom","ymag","orthoTop","loadAnimationAsync","animationGroup","targetedAnimations","_extensionsLoadAnimationAsync","babylonAnimationGroup","AnimationGroup","channels","channel","_loadAnimationChannelAsync","normalize","animationContext","animationTargetOverride","target","targetNode","sampler","_loadAnimationSamplerAsync","targetPath","animationType","Animation","getNextOutputValue","getNextKey","outputBufferOffset","output","scaleInPlace","interpolation","frameIndex","frame","input","AnimationKeyInterpolation","inTangent","outTangent","targetIndex","animationName","babylonAnimation","setKeys","morphTarget","babylonAnimationClone","clone","addTargetedAnimation","inputAccessor","outputAccessor","inputData","outputData","loadBufferAsync","_extensionsLoadBufferAsync","loadUriAsync","loadBufferViewAsync","bufferView","_extensionsLoadBufferViewAsync","_loadAccessorAsync","constructor","numComponents","_GetNumComponents","byteStride","_GetTypedArray","sparse","typedArray","indicesBufferView","valuesBufferView","values","indicesData","valuesData","sparseLength","sparseData","valuesIndex","indicesIndex","componentIndex","_GetTypedArrayConstructor","_loadVertexBufferViewAsync","_babylonBuffer","engine","getEngine","Buffer","_babylonVertexBuffer","babylonBuffer","size","_loadMaterialMetallicRoughnessPropertiesAsync","properties","PBRMaterial","baseColorFactor","albedoColor","Color3","alpha","metallic","metallicFactor","roughness","roughnessFactor","baseColorTexture","loadTextureInfoAsync","albedoTexture","metallicRoughnessTexture","nonColorData","metallicTexture","useMetallnessFromMetallicTextureBlue","useRoughnessFromMetallicTextureGreen","useRoughnessFromMetallicTextureAlpha","_extensionsLoadMaterialAsync","babylonData","createMaterial","babylonMeshes","loadMaterialPropertiesAsync","fillMode","enableSpecularAntiAliasing","useRadianceOverAlpha","useSpecularOverAlpha","transparencyMode","_extensionsCreateMaterial","_extensionsLoadMaterialPropertiesAsync","loadMaterialBasePropertiesAsync","pbrMetallicRoughness","loadMaterialAlphaProperties","emissiveColor","emissiveFactor","doubleSided","backFaceCulling","twoSidedLighting","normalTexture","bumpTexture","invertNormalMapX","invertNormalMapY","level","forceIrradianceInFragment","occlusionTexture","ambientTexture","useAmbientInGrayScale","strength","ambientTextureStrength","emissiveTexture","alphaMode","alphaCutOff","alphaCutoff","hasAlpha","useAlphaFromAlbedoTexture","textureInfo","_extensionsLoadTextureInfoAsync","texCoord","_textureInfo","_loadTextureAsync","babylonTexture","coordinatesIndex","_extensionsLoadTextureAsync","DefaultSampler","image","source","_createTextureAsync","textureLoaderOptions","useSRGBBuffer","samplerData","_loadSampler","deferred","Deferred","textureCreationOptions","noMipmap","noMipMaps","invertY","samplingMode","onLoad","exception","mimeType","loaderOptions","Texture","loadImageAsync","dataUrl","updateURL","wrapU","wrapV","minFilter","_GetTextureSamplingMode","_GetTextureWrapMode","wrapS","wrapT","property","_extensionsLoadUriAsync","_ValidateUri","IsBase64DataUrl","log","LoadFileError","status","statusText","babylonObject","pointer","gltf","pointers","magFilter","Int8Array","Int16Array","Uint16Array","Uint32Array","componentTypeLength","slice","computeWorldMatrix","forceCompilationAsync","useInstances","clipPlane","getShadowGenerator","_forEachExtensions","_applyExtensions","functionName","actionAsync","loaderProperty","_activeLoaderExtensionFunctions","activeLoaderExtensionFunctions","onLoading","onReady","_loadUriAsync","LoadExtensionAsync","extensionName","LoadExtraAsync","extra","isExtensionUsed","extensionsUsed","startPerformanceCounter","endPerformanceCounter","NAME","loader","_lights","extensionContext","light","_loadLightAsync","babylonScene","environmentTexture","specularImages","mipmap","faces","face","specularImageContext","RawCubeTexture","specularImageSize","_babylonTexture","intensity","getReflectionTextureMatrix","irradianceCoefficients","sphericalHarmonics","SphericalHarmonics","convertIrradianceToLambertianRadiance","sphericalPolynomial","SphericalPolynomial","lodGenerationScale","Scalar","updateRGBDAsync","EXT_lights_image_based","instanceCount","translationBuffer","rotationBuffer","scaleBuffer","matrices","thinInstanceSetBuffer","EXT_mesh_gpu_instancing","bufferViewMeshopt","_meshOptData","MeshoptCompression","filter","EXT_meshopt_compression","EXT_texture_webp","DracoCompression","dracoCompression","dividers","uniqueId","_dracoBabylonGeometry","decodeMeshAsync","babylonVertexData","applyToGeometry","KHR_draco_mesh_compression","babylonLight","DirectionalLight","PointLight","babylonSpotLight","SpotLight","angle","spot","outerConeAngle","innerAngle","innerConeAngle","falloffType","Light","diffuse","color","range","KHR_lights","_loadSpecularGlossinessPropertiesAsync","diffuseFactor","reflectivityColor","specularFactor","microSurface","glossinessFactor","diffuseTexture","specularGlossinessTexture","reflectivityTexture","useMicroSurfaceFromReflectivityMapAlpha","KHR_materials_pbrSpecularGlossiness","_loadUnlitPropertiesAsync","unlit","KHR_materials_unlit","_loadClearCoatPropertiesAsync","clearCoat","isEnabled","useRoughnessFromMainTexture","remapF0OnInterfaceChange","clearcoatFactor","clearcoatTexture","clearcoatRoughnessFactor","clearcoatRoughnessTexture","textureRoughness","clearcoatNormalTexture","KHR_materials_clearcoat","_loadIridescencePropertiesAsync","iridescence","iridescenceFactor","indexOfRefraction","iridescenceIor","iridescenceIOR","minimumThickness","iridescenceThicknessMinimum","maximumThickness","iridescenceThicknessMaximum","iridescenceTexture","iridescenceThicknessTexture","thicknessTexture","KHR_materials_iridescence","_loadEmissiveProperties","emissiveStrength","scaleToRef","KHR_materials_emissive_strength","_loadSheenPropertiesAsync","sheen","sheenColorFactor","sheenColorTexture","sheenRoughnessFactor","sheenRoughnessTexture","albedoScaling","KHR_materials_sheen","_loadSpecularPropertiesAsync","metallicF0Factor","specularColorFactor","metallicReflectanceColor","specularTexture","metallicReflectanceTexture","useOnlyMetallicFromMetallicReflectanceTexture","specularColorTexture","reflectanceTexture","KHR_materials_specular","_loadIorPropertiesAsync","ior","KHR_materials_ior","_DEFAULT_IOR","GetAvailableVariants","rootMesh","extensionMetadata","_GetExtensionMetadata","variants","getAvailableVariants","KHR_materials_variants","SelectVariant","variantName","select","entries","entry","lastSelected","selectVariant","Reset","original","reset","GetLastSelectedVariant","getLastSelectedVariant","_variants","rootBabylonMesh","mappingIndex","mapping","mappings","mappingVariantIndex","variantIndex","variant","onClonedObservable","newOne","newMesh","newRoot","variantEntry","__assign","t","s","n","arguments","p","create","_opaqueRenderTarget","_opaqueMeshesCache","_transparentMeshesCache","_materialObservers","_options","TransmissionHelper","_GetDefaultOptions","_scene","_transmissionHelper","_parseScene","_setupRenderTargets","renderSize","samples","lodGenerationOffset","renderTargetTextureType","Constants","generateMipmaps","updateOptions","newValues","newOptions","oldOptions","getOpaqueTarget","_shouldRenderAsTransmission","subSurface","isRefractionEnabled","_addMesh","onMaterialChangedObservable","_onMeshMaterialChanged","bind","refractionTexture","_removeMesh","idx","onNewMeshAddedObservable","onMeshRemovedObservable","transparentIdx","opaqueIdx","sceneImageProcessingapplyByPostProcess","saveSceneEnvIntensity","RenderTargetTexture","ignoreCameraViewport","renderList","clearColor","gammaSpace","onBeforeBindObservable","opaqueRenderTarget","environmentIntensity","imageProcessingConfiguration","applyByPostProcess","copyFrom","toLinearSpaceToRef","_applyByPostProcess","onAfterUnbindObservable","_loadTransparentPropertiesAsync","pbrMaterial","volumeIndexOfRefraction","useAlbedoToTintRefraction","transmissionFactor","refractionIntensity","transmissionTexture","refractionIntensityTexture","useGltfStyleTextures","KHR_materials_transmission","_loadTranslucentPropertiesAsync","isTranslucencyEnabled","useAlbedoToTintTranslucency","translucencyFactor","translucencyIntensity","translucencyTexture","translucencyIntensityTexture","KHR_materials_translucency","_loadVolumePropertiesAsync","thicknessFactor","attenuationDistance","tintColorAtDistance","attenuationColor","tintColor","useThicknessAsDepth","KHR_materials_volume","KHR_mesh_quantization","useRGBAIfASTCBC7NotAvailableWhenUASTC","KHR_texture_basisu","offset","uOffset","vOffset","uRotationCenter","vRotationCenter","wAng","uScale","vScale","KHR_texture_transform","xmp_gltf","KHR_xmp_json_ld","xmp_node","packet","packets","xmp","_clips","_emitters","clips","emitters","emitterIndex","emitter","refDistance","maxDistance","rolloffFactor","distanceModel","outerAngle","_loadEmitterAsync","_babylonSounds","sound","attachToMesh","setLocalDirectionToMesh","setDirectionalCone","events","_loadAnimationEventAsync","_loadClipAsync","clip","_objectURL","_babylonData","clipPromises","loop","autoplay","volume","clipContext","objectURL","Sound","weightedSound","WeightedSound","directionalConeInnerAngle","directionalConeOuterAngle","_getEventAction","time","startOffset","currentFrame","frameOffset","play","stop","pause","babylonAnimationEvent","AnimationEvent","addEvent","onAnimationGroupEndObservable","onAnimationGroupPauseObservable","MSFT_audio_emitter","maxLODsToLoad","onNodeLODsLoadedObservable","onMaterialLODsLoadedObservable","_bufferLODs","_nodeIndexLOD","_nodeSignalLODs","_nodePromiseLODs","_nodeBufferLODs","_materialIndexLOD","_materialSignalLODs","_materialPromiseLODs","_materialBufferLODs","indexLOD","_loadBufferLOD","firstPromise","nodeLODs","_getLODs","ids","nodeLOD","previousNodeLOD","_disposeTransformNode","materialLODs","materialLOD","previousDataLOD","_disposeMaterials","previousIndexLOD","bufferLODs","end","bufferLOD","babylonMaterials","getChildMeshes","babylonMaterialsToDispose","every","babylonTextures","getActiveTextures","hasTexture","MSFT_lod","extraContext","needAlphaBlending","forceDepthWrite","separateCullingPass","MSFT_minecraftMesh","MSFT_sRGBFactors","_assignExtras","gltfProp","ExtrasAsMetadata","GLTF2","Loader","Extensions"],"sourceRoot":""}