c09e4445eb77bd9681b01e582c0d9b94844322c3b412c10f5f094a05b2b8e120.json 303 KB

1
  1. {"ast":null,"code":"import { Deferred } from \"@babylonjs/core/Misc/deferred.js\";\nimport { Quaternion, Vector3, Matrix, TmpVectors } from \"@babylonjs/core/Maths/math.vector.js\";\nimport { Color3 } from \"@babylonjs/core/Maths/math.color.js\";\nimport { Tools } from \"@babylonjs/core/Misc/tools.js\";\nimport { Camera } from \"@babylonjs/core/Cameras/camera.js\";\nimport { FreeCamera } from \"@babylonjs/core/Cameras/freeCamera.js\";\nimport { AnimationKeyInterpolation } from \"@babylonjs/core/Animations/animationKey.js\";\nimport { AnimationGroup } from \"@babylonjs/core/Animations/animationGroup.js\";\nimport { Bone } from \"@babylonjs/core/Bones/bone.js\";\nimport { Skeleton } from \"@babylonjs/core/Bones/skeleton.js\";\nimport { Material } from \"@babylonjs/core/Materials/material.js\";\nimport { PBRMaterial } from \"@babylonjs/core/Materials/PBR/pbrMaterial.js\";\nimport { Texture } from \"@babylonjs/core/Materials/Textures/texture.js\";\nimport { TransformNode } from \"@babylonjs/core/Meshes/transformNode.js\";\nimport { Buffer, VertexBuffer } from \"@babylonjs/core/Buffers/buffer.js\";\nimport { Geometry } from \"@babylonjs/core/Meshes/geometry.js\";\nimport { AbstractMesh } from \"@babylonjs/core/Meshes/abstractMesh.js\";\nimport { Mesh } from \"@babylonjs/core/Meshes/mesh.js\";\nimport { MorphTarget } from \"@babylonjs/core/Morph/morphTarget.js\";\nimport { MorphTargetManager } from \"@babylonjs/core/Morph/morphTargetManager.js\";\nimport { GLTFFileLoader, GLTFLoaderState, GLTFLoaderCoordinateSystemMode, GLTFLoaderAnimationStartMode } from \"../glTFFileLoader.js\";\nimport { DecodeBase64UrlToBinary, IsBase64DataUrl, LoadFileError } from \"@babylonjs/core/Misc/fileTools.js\";\nimport { Logger } from \"@babylonjs/core/Misc/logger.js\";\nimport { BoundingInfo } from \"@babylonjs/core/Culling/boundingInfo.js\";\nimport { nodeAnimationData } from \"./glTFLoaderAnimation.js\";\n// https://stackoverflow.com/a/48218209\nfunction mergeDeep(...objects) {\n const isObject = obj => obj && typeof obj === \"object\";\n return objects.reduce((prev, obj) => {\n Object.keys(obj).forEach(key => {\n const pVal = prev[key];\n const oVal = obj[key];\n if (Array.isArray(pVal) && Array.isArray(oVal)) {\n prev[key] = pVal.concat(...oVal);\n } else if (isObject(pVal) && isObject(oVal)) {\n prev[key] = mergeDeep(pVal, oVal);\n } else {\n prev[key] = oVal;\n }\n });\n return prev;\n }, {});\n}\n/**\n * Helper class for working with arrays when loading the glTF asset\n */\nexport class ArrayItem {\n /**\n * Gets an item from the given array.\n * @param context The context when loading the asset\n * @param array The array to get the item from\n * @param index The index to the array\n * @returns The array item\n */\n static Get(context, array, index) {\n if (!array || index == undefined || !array[index]) {\n throw new Error(`${context}: Failed to find index (${index})`);\n }\n return array[index];\n }\n /**\n * Gets an item from the given array or returns null if not available.\n * @param array The array to get the item from\n * @param index The index to the array\n * @returns The array item or null\n */\n static TryGet(array, index) {\n if (!array || index == undefined || !array[index]) {\n return null;\n }\n return array[index];\n }\n /**\n * Assign an `index` field to each item of the given array.\n * @param array The array of items\n */\n static Assign(array) {\n if (array) {\n for (let index = 0; index < array.length; index++) {\n array[index].index = index;\n }\n }\n }\n}\n/**\n * The glTF 2.0 loader\n */\nexport class GLTFLoader {\n /**\n * Registers a loader extension.\n * @param name The name of the loader extension.\n * @param factory The factory function that creates the loader extension.\n */\n static RegisterExtension(name, factory) {\n if (GLTFLoader.UnregisterExtension(name)) {\n Logger.Warn(`Extension with the name '${name}' already exists`);\n }\n GLTFLoader._RegisteredExtensions[name] = {\n factory: factory\n };\n }\n /**\n * Unregisters a loader extension.\n * @param name The name of the loader extension.\n * @returns A boolean indicating whether the extension has been unregistered\n */\n static UnregisterExtension(name) {\n if (!GLTFLoader._RegisteredExtensions[name]) {\n return false;\n }\n delete GLTFLoader._RegisteredExtensions[name];\n return true;\n }\n /**\n * The object that represents the glTF JSON.\n */\n get gltf() {\n if (!this._gltf) {\n throw new Error(\"glTF JSON is not available\");\n }\n return this._gltf;\n }\n /**\n * The BIN chunk of a binary glTF.\n */\n get bin() {\n return this._bin;\n }\n /**\n * The parent file loader.\n */\n get parent() {\n return this._parent;\n }\n /**\n * The Babylon scene when loading the asset.\n */\n get babylonScene() {\n if (!this._babylonScene) {\n throw new Error(\"Scene is not available\");\n }\n return this._babylonScene;\n }\n /**\n * The root Babylon node when loading the asset.\n */\n get rootBabylonMesh() {\n return this._rootBabylonMesh;\n }\n /**\n * The root url when loading the asset.\n */\n get rootUrl() {\n return this._rootUrl;\n }\n /**\n * @internal\n */\n constructor(parent) {\n /** @internal */\n this._completePromises = new Array();\n /** @internal */\n this._assetContainer = null;\n /** Storage */\n this._babylonLights = [];\n /** @internal */\n this._disableInstancedMesh = 0;\n /** @internal */\n this._allMaterialsDirtyRequired = false;\n this._extensions = new Array();\n this._disposed = false;\n this._rootUrl = null;\n this._fileName = null;\n this._uniqueRootUrl = null;\n this._bin = null;\n this._rootBabylonMesh = null;\n this._defaultBabylonMaterialData = {};\n this._postSceneLoadActions = new Array();\n this._parent = parent;\n }\n /** @internal */\n dispose() {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._completePromises.length = 0;\n this._extensions.forEach(extension => extension.dispose && extension.dispose());\n this._extensions.length = 0;\n this._gltf = null; // TODO\n this._bin = null;\n this._babylonScene = null; // TODO\n this._rootBabylonMesh = null;\n this._defaultBabylonMaterialData = {};\n this._postSceneLoadActions.length = 0;\n this._parent.dispose();\n }\n /**\n * @internal\n */\n importMeshAsync(meshesNames, scene, container, data, rootUrl, onProgress, fileName = \"\") {\n return Promise.resolve().then(() => {\n this._babylonScene = scene;\n this._assetContainer = container;\n this._loadData(data);\n let nodes = null;\n if (meshesNames) {\n const nodeMap = {};\n if (this._gltf.nodes) {\n for (const node of this._gltf.nodes) {\n if (node.name) {\n nodeMap[node.name] = node.index;\n }\n }\n }\n const names = meshesNames instanceof Array ? meshesNames : [meshesNames];\n nodes = names.map(name => {\n const node = nodeMap[name];\n if (node === undefined) {\n throw new Error(`Failed to find node '${name}'`);\n }\n return node;\n });\n }\n return this._loadAsync(rootUrl, fileName, nodes, () => {\n return {\n meshes: this._getMeshes(),\n particleSystems: [],\n skeletons: this._getSkeletons(),\n animationGroups: this._getAnimationGroups(),\n lights: this._babylonLights,\n transformNodes: this._getTransformNodes(),\n geometries: this._getGeometries(),\n spriteManagers: []\n };\n });\n });\n }\n /**\n * @internal\n */\n loadAsync(scene, data, rootUrl, onProgress, fileName = \"\") {\n return Promise.resolve().then(() => {\n this._babylonScene = scene;\n this._loadData(data);\n return this._loadAsync(rootUrl, fileName, null, () => undefined);\n });\n }\n _loadAsync(rootUrl, fileName, nodes, resultFunc) {\n return Promise.resolve().then(() => {\n this._rootUrl = rootUrl;\n this._uniqueRootUrl = !rootUrl.startsWith(\"file:\") && fileName ? rootUrl : `${rootUrl}${Date.now()}/`;\n this._fileName = fileName;\n this._allMaterialsDirtyRequired = false;\n this._loadExtensions();\n this._checkExtensions();\n const loadingToReadyCounterName = `${GLTFLoaderState[GLTFLoaderState.LOADING]} => ${GLTFLoaderState[GLTFLoaderState.READY]}`;\n const loadingToCompleteCounterName = `${GLTFLoaderState[GLTFLoaderState.LOADING]} => ${GLTFLoaderState[GLTFLoaderState.COMPLETE]}`;\n this._parent._startPerformanceCounter(loadingToReadyCounterName);\n this._parent._startPerformanceCounter(loadingToCompleteCounterName);\n this._parent._setState(GLTFLoaderState.LOADING);\n this._extensionsOnLoading();\n const promises = new Array();\n // Block the marking of materials dirty until the scene is loaded.\n const oldBlockMaterialDirtyMechanism = this._babylonScene.blockMaterialDirtyMechanism;\n this._babylonScene.blockMaterialDirtyMechanism = true;\n if (!this.parent.loadOnlyMaterials) {\n if (nodes) {\n promises.push(this.loadSceneAsync(\"/nodes\", {\n nodes: nodes,\n index: -1\n }));\n } else if (this._gltf.scene != undefined || this._gltf.scenes && this._gltf.scenes[0]) {\n const scene = ArrayItem.Get(`/scene`, this._gltf.scenes, this._gltf.scene || 0);\n promises.push(this.loadSceneAsync(`/scenes/${scene.index}`, scene));\n }\n }\n if (!this.parent.skipMaterials && this.parent.loadAllMaterials && this._gltf.materials) {\n for (let m = 0; m < this._gltf.materials.length; ++m) {\n const material = this._gltf.materials[m];\n const context = \"/materials/\" + m;\n const babylonDrawMode = Material.TriangleFillMode;\n promises.push(this._loadMaterialAsync(context, material, null, babylonDrawMode, () => {}));\n }\n }\n // Restore the blocking of material dirty.\n if (this._allMaterialsDirtyRequired) {\n // This can happen if we add a light for instance as it will impact the whole scene.\n // This automatically resets everything if needed.\n this._babylonScene.blockMaterialDirtyMechanism = oldBlockMaterialDirtyMechanism;\n } else {\n // By default a newly created material is dirty so there is no need to flag the full scene as dirty.\n // For perf reasons, we then bypass blockMaterialDirtyMechanism as this would \"dirty\" the entire scene.\n this._babylonScene._forceBlockMaterialDirtyMechanism(oldBlockMaterialDirtyMechanism);\n }\n if (this._parent.compileMaterials) {\n promises.push(this._compileMaterialsAsync());\n }\n if (this._parent.compileShadowGenerators) {\n promises.push(this._compileShadowGeneratorsAsync());\n }\n const resultPromise = Promise.all(promises).then(() => {\n if (this._rootBabylonMesh && this._rootBabylonMesh !== this._parent.customRootNode) {\n this._rootBabylonMesh.setEnabled(true);\n }\n this._extensionsOnReady();\n this._parent._setState(GLTFLoaderState.READY);\n this._startAnimations();\n return resultFunc();\n });\n return resultPromise.then(result => {\n this._parent._endPerformanceCounter(loadingToReadyCounterName);\n Tools.SetImmediate(() => {\n if (!this._disposed) {\n Promise.all(this._completePromises).then(() => {\n this._parent._endPerformanceCounter(loadingToCompleteCounterName);\n this._parent._setState(GLTFLoaderState.COMPLETE);\n this._parent.onCompleteObservable.notifyObservers(undefined);\n this._parent.onCompleteObservable.clear();\n this.dispose();\n }, error => {\n this._parent.onErrorObservable.notifyObservers(error);\n this._parent.onErrorObservable.clear();\n this.dispose();\n });\n }\n });\n return result;\n });\n }).catch(error => {\n if (!this._disposed) {\n this._parent.onErrorObservable.notifyObservers(error);\n this._parent.onErrorObservable.clear();\n this.dispose();\n }\n throw error;\n });\n }\n _loadData(data) {\n this._gltf = data.json;\n this._setupData();\n if (data.bin) {\n const buffers = this._gltf.buffers;\n if (buffers && buffers[0] && !buffers[0].uri) {\n const binaryBuffer = buffers[0];\n if (binaryBuffer.byteLength < data.bin.byteLength - 3 || binaryBuffer.byteLength > data.bin.byteLength) {\n Logger.Warn(`Binary buffer length (${binaryBuffer.byteLength}) from JSON does not match chunk length (${data.bin.byteLength})`);\n }\n this._bin = data.bin;\n } else {\n Logger.Warn(\"Unexpected BIN chunk\");\n }\n }\n }\n _setupData() {\n ArrayItem.Assign(this._gltf.accessors);\n ArrayItem.Assign(this._gltf.animations);\n ArrayItem.Assign(this._gltf.buffers);\n ArrayItem.Assign(this._gltf.bufferViews);\n ArrayItem.Assign(this._gltf.cameras);\n ArrayItem.Assign(this._gltf.images);\n ArrayItem.Assign(this._gltf.materials);\n ArrayItem.Assign(this._gltf.meshes);\n ArrayItem.Assign(this._gltf.nodes);\n ArrayItem.Assign(this._gltf.samplers);\n ArrayItem.Assign(this._gltf.scenes);\n ArrayItem.Assign(this._gltf.skins);\n ArrayItem.Assign(this._gltf.textures);\n if (this._gltf.nodes) {\n const nodeParents = {};\n for (const node of this._gltf.nodes) {\n if (node.children) {\n for (const index of node.children) {\n nodeParents[index] = node.index;\n }\n }\n }\n const rootNode = this._createRootNode();\n for (const node of this._gltf.nodes) {\n const parentIndex = nodeParents[node.index];\n node.parent = parentIndex === undefined ? rootNode : this._gltf.nodes[parentIndex];\n }\n }\n }\n _loadExtensions() {\n for (const name in GLTFLoader._RegisteredExtensions) {\n const extension = GLTFLoader._RegisteredExtensions[name].factory(this);\n if (extension.name !== name) {\n Logger.Warn(`The name of the glTF loader extension instance does not match the registered name: ${extension.name} !== ${name}`);\n }\n this._extensions.push(extension);\n this._parent.onExtensionLoadedObservable.notifyObservers(extension);\n }\n this._extensions.sort((a, b) => (a.order || Number.MAX_VALUE) - (b.order || Number.MAX_VALUE));\n this._parent.onExtensionLoadedObservable.clear();\n }\n _checkExtensions() {\n if (this._gltf.extensionsRequired) {\n for (const name of this._gltf.extensionsRequired) {\n const available = this._extensions.some(extension => extension.name === name && extension.enabled);\n if (!available) {\n throw new Error(`Required extension ${name} is not available`);\n }\n }\n }\n }\n _createRootNode() {\n if (this._parent.customRootNode !== undefined) {\n this._rootBabylonMesh = this._parent.customRootNode;\n return {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n _babylonTransformNode: this._rootBabylonMesh === null ? undefined : this._rootBabylonMesh,\n index: -1\n };\n }\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const rootMesh = new Mesh(\"__root__\", this._babylonScene);\n this._rootBabylonMesh = rootMesh;\n this._rootBabylonMesh._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n this._rootBabylonMesh.setEnabled(false);\n const rootNode = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n _babylonTransformNode: this._rootBabylonMesh,\n index: -1\n };\n switch (this._parent.coordinateSystemMode) {\n case GLTFLoaderCoordinateSystemMode.AUTO:\n {\n if (!this._babylonScene.useRightHandedSystem) {\n rootNode.rotation = [0, 1, 0, 0];\n rootNode.scale = [1, 1, -1];\n GLTFLoader._LoadTransform(rootNode, this._rootBabylonMesh);\n }\n break;\n }\n case GLTFLoaderCoordinateSystemMode.FORCE_RIGHT_HANDED:\n {\n this._babylonScene.useRightHandedSystem = true;\n break;\n }\n default:\n {\n throw new Error(`Invalid coordinate system mode (${this._parent.coordinateSystemMode})`);\n }\n }\n this._parent.onMeshLoadedObservable.notifyObservers(rootMesh);\n return rootNode;\n }\n /**\n * Loads a glTF scene.\n * @param context The context when loading the asset\n * @param scene The glTF scene property\n * @returns A promise that resolves when the load is complete\n */\n loadSceneAsync(context, scene) {\n const extensionPromise = this._extensionsLoadSceneAsync(context, scene);\n if (extensionPromise) {\n return extensionPromise;\n }\n const promises = new Array();\n this.logOpen(`${context} ${scene.name || \"\"}`);\n if (scene.nodes) {\n for (const index of scene.nodes) {\n const node = ArrayItem.Get(`${context}/nodes/${index}`, this._gltf.nodes, index);\n promises.push(this.loadNodeAsync(`/nodes/${node.index}`, node, babylonMesh => {\n babylonMesh.parent = this._rootBabylonMesh;\n }));\n }\n }\n for (const action of this._postSceneLoadActions) {\n action();\n }\n promises.push(this._loadAnimationsAsync());\n this.logClose();\n return Promise.all(promises).then(() => {});\n }\n _forEachPrimitive(node, callback) {\n if (node._primitiveBabylonMeshes) {\n for (const babylonMesh of node._primitiveBabylonMeshes) {\n callback(babylonMesh);\n }\n }\n }\n _getGeometries() {\n const geometries = [];\n const nodes = this._gltf.nodes;\n if (nodes) {\n for (const node of nodes) {\n this._forEachPrimitive(node, babylonMesh => {\n const geometry = babylonMesh.geometry;\n if (geometry && geometries.indexOf(geometry) === -1) {\n geometries.push(geometry);\n }\n });\n }\n }\n return geometries;\n }\n _getMeshes() {\n const meshes = [];\n // Root mesh is always first, if available.\n if (this._rootBabylonMesh instanceof AbstractMesh) {\n meshes.push(this._rootBabylonMesh);\n }\n const nodes = this._gltf.nodes;\n if (nodes) {\n for (const node of nodes) {\n this._forEachPrimitive(node, babylonMesh => {\n meshes.push(babylonMesh);\n });\n }\n }\n return meshes;\n }\n _getTransformNodes() {\n const transformNodes = [];\n const nodes = this._gltf.nodes;\n if (nodes) {\n for (const node of nodes) {\n if (node._babylonTransformNode && node._babylonTransformNode.getClassName() === \"TransformNode\") {\n transformNodes.push(node._babylonTransformNode);\n }\n if (node._babylonTransformNodeForSkin) {\n transformNodes.push(node._babylonTransformNodeForSkin);\n }\n }\n }\n return transformNodes;\n }\n _getSkeletons() {\n const skeletons = [];\n const skins = this._gltf.skins;\n if (skins) {\n for (const skin of skins) {\n if (skin._data) {\n skeletons.push(skin._data.babylonSkeleton);\n }\n }\n }\n return skeletons;\n }\n _getAnimationGroups() {\n const animationGroups = [];\n const animations = this._gltf.animations;\n if (animations) {\n for (const animation of animations) {\n if (animation._babylonAnimationGroup) {\n animationGroups.push(animation._babylonAnimationGroup);\n }\n }\n }\n return animationGroups;\n }\n _startAnimations() {\n switch (this._parent.animationStartMode) {\n case GLTFLoaderAnimationStartMode.NONE:\n {\n // do nothing\n break;\n }\n case GLTFLoaderAnimationStartMode.FIRST:\n {\n const babylonAnimationGroups = this._getAnimationGroups();\n if (babylonAnimationGroups.length !== 0) {\n babylonAnimationGroups[0].start(true);\n }\n break;\n }\n case GLTFLoaderAnimationStartMode.ALL:\n {\n const babylonAnimationGroups = this._getAnimationGroups();\n for (const babylonAnimationGroup of babylonAnimationGroups) {\n babylonAnimationGroup.start(true);\n }\n break;\n }\n default:\n {\n Logger.Error(`Invalid animation start mode (${this._parent.animationStartMode})`);\n return;\n }\n }\n }\n /**\n * Loads a glTF node.\n * @param context The context when loading the asset\n * @param node The glTF node property\n * @param assign A function called synchronously after parsing the glTF properties\n * @returns A promise that resolves with the loaded Babylon mesh when the load is complete\n */\n loadNodeAsync(context, node, assign = () => {}) {\n const extensionPromise = this._extensionsLoadNodeAsync(context, node, assign);\n if (extensionPromise) {\n return extensionPromise;\n }\n if (node._babylonTransformNode) {\n throw new Error(`${context}: Invalid recursive node hierarchy`);\n }\n const promises = new Array();\n this.logOpen(`${context} ${node.name || \"\"}`);\n const loadNode = babylonTransformNode => {\n GLTFLoader.AddPointerMetadata(babylonTransformNode, context);\n GLTFLoader._LoadTransform(node, babylonTransformNode);\n if (node.camera != undefined) {\n const camera = ArrayItem.Get(`${context}/camera`, this._gltf.cameras, node.camera);\n promises.push(this.loadCameraAsync(`/cameras/${camera.index}`, camera, babylonCamera => {\n babylonCamera.parent = babylonTransformNode;\n }));\n }\n if (node.children) {\n for (const index of node.children) {\n const childNode = ArrayItem.Get(`${context}/children/${index}`, this._gltf.nodes, index);\n promises.push(this.loadNodeAsync(`/nodes/${childNode.index}`, childNode, childBabylonMesh => {\n childBabylonMesh.parent = babylonTransformNode;\n }));\n }\n }\n assign(babylonTransformNode);\n };\n if (node.mesh == undefined || node.skin != undefined) {\n const nodeName = node.name || `node${node.index}`;\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const transformNode = new TransformNode(nodeName, this._babylonScene);\n transformNode._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n if (node.mesh == undefined) {\n node._babylonTransformNode = transformNode;\n } else {\n node._babylonTransformNodeForSkin = transformNode;\n }\n loadNode(transformNode);\n }\n if (node.mesh != undefined) {\n if (node.skin == undefined) {\n const mesh = ArrayItem.Get(`${context}/mesh`, this._gltf.meshes, node.mesh);\n promises.push(this._loadMeshAsync(`/meshes/${mesh.index}`, node, mesh, loadNode));\n } else {\n // See https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins (second implementation note)\n // This code path will place the skinned mesh as a sibling of the skeleton root node without loading the\n // transform, which effectively ignores the transform of the skinned mesh, as per spec.\n const mesh = ArrayItem.Get(`${context}/mesh`, this._gltf.meshes, node.mesh);\n promises.push(this._loadMeshAsync(`/meshes/${mesh.index}`, node, mesh, babylonTransformNode => {\n const babylonTransformNodeForSkin = node._babylonTransformNodeForSkin;\n // Merge the metadata from the skin node to the skinned mesh in case a loader extension added metadata.\n babylonTransformNode.metadata = mergeDeep(babylonTransformNodeForSkin.metadata, babylonTransformNode.metadata || {});\n const skin = ArrayItem.Get(`${context}/skin`, this._gltf.skins, node.skin);\n promises.push(this._loadSkinAsync(`/skins/${skin.index}`, node, skin, babylonSkeleton => {\n this._forEachPrimitive(node, babylonMesh => {\n babylonMesh.skeleton = babylonSkeleton;\n });\n // Wait until all the nodes are parented before parenting the skinned mesh.\n this._postSceneLoadActions.push(() => {\n if (skin.skeleton != undefined) {\n // Place the skinned mesh node as a sibling of the skeleton root node.\n // Handle special case when the parent of the skeleton root is the skinned mesh.\n const parentNode = ArrayItem.Get(`/skins/${skin.index}/skeleton`, this._gltf.nodes, skin.skeleton).parent;\n if (node.index === parentNode.index) {\n babylonTransformNode.parent = babylonTransformNodeForSkin.parent;\n } else {\n babylonTransformNode.parent = parentNode._babylonTransformNode;\n }\n } else {\n babylonTransformNode.parent = this._rootBabylonMesh;\n }\n this._parent.onSkinLoadedObservable.notifyObservers({\n node: babylonTransformNodeForSkin,\n skinnedNode: babylonTransformNode\n });\n });\n }));\n }));\n }\n }\n this.logClose();\n return Promise.all(promises).then(() => {\n this._forEachPrimitive(node, babylonMesh => {\n if (babylonMesh.geometry && babylonMesh.geometry.useBoundingInfoFromGeometry) {\n // simply apply the world matrices to the bounding info - the extends are already ok\n babylonMesh._updateBoundingInfo();\n } else {\n babylonMesh.refreshBoundingInfo(true, true);\n }\n });\n return node._babylonTransformNode;\n });\n }\n _loadMeshAsync(context, node, mesh, assign) {\n const primitives = mesh.primitives;\n if (!primitives || !primitives.length) {\n throw new Error(`${context}: Primitives are missing`);\n }\n if (primitives[0].index == undefined) {\n ArrayItem.Assign(primitives);\n }\n const promises = new Array();\n this.logOpen(`${context} ${mesh.name || \"\"}`);\n const name = node.name || `node${node.index}`;\n if (primitives.length === 1) {\n const primitive = mesh.primitives[0];\n promises.push(this._loadMeshPrimitiveAsync(`${context}/primitives/${primitive.index}`, name, node, mesh, primitive, babylonMesh => {\n node._babylonTransformNode = babylonMesh;\n node._primitiveBabylonMeshes = [babylonMesh];\n }));\n } else {\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n node._babylonTransformNode = new TransformNode(name, this._babylonScene);\n node._babylonTransformNode._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n node._primitiveBabylonMeshes = [];\n for (const primitive of primitives) {\n promises.push(this._loadMeshPrimitiveAsync(`${context}/primitives/${primitive.index}`, `${name}_primitive${primitive.index}`, node, mesh, primitive, babylonMesh => {\n babylonMesh.parent = node._babylonTransformNode;\n node._primitiveBabylonMeshes.push(babylonMesh);\n }));\n }\n }\n assign(node._babylonTransformNode);\n this.logClose();\n return Promise.all(promises).then(() => {\n return node._babylonTransformNode;\n });\n }\n /**\n * @internal Define this method to modify the default behavior when loading data for mesh primitives.\n * @param context The context when loading the asset\n * @param name The mesh name when loading the asset\n * @param node The glTF node when loading the asset\n * @param mesh The glTF mesh when loading the asset\n * @param primitive The glTF mesh primitive property\n * @param assign A function called synchronously after parsing the glTF properties\n * @returns A promise that resolves with the loaded mesh when the load is complete or null if not handled\n */\n _loadMeshPrimitiveAsync(context, name, node, mesh, primitive, assign) {\n const extensionPromise = this._extensionsLoadMeshPrimitiveAsync(context, name, node, mesh, primitive, assign);\n if (extensionPromise) {\n return extensionPromise;\n }\n this.logOpen(`${context}`);\n const shouldInstance = this._disableInstancedMesh === 0 && this._parent.createInstances && node.skin == undefined && !mesh.primitives[0].targets;\n let babylonAbstractMesh;\n let promise;\n if (shouldInstance && primitive._instanceData) {\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n babylonAbstractMesh = primitive._instanceData.babylonSourceMesh.createInstance(name);\n babylonAbstractMesh._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n promise = primitive._instanceData.promise;\n } else {\n const promises = new Array();\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const babylonMesh = new Mesh(name, this._babylonScene);\n babylonMesh._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n babylonMesh.overrideMaterialSideOrientation = this._babylonScene.useRightHandedSystem ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation;\n this._createMorphTargets(context, node, mesh, primitive, babylonMesh);\n promises.push(this._loadVertexDataAsync(context, primitive, babylonMesh).then(babylonGeometry => {\n return this._loadMorphTargetsAsync(context, primitive, babylonMesh, babylonGeometry).then(() => {\n if (this._disposed) {\n return;\n }\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n babylonGeometry.applyToMesh(babylonMesh);\n babylonGeometry._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n });\n }));\n const babylonDrawMode = GLTFLoader._GetDrawMode(context, primitive.mode);\n if (primitive.material == undefined) {\n let babylonMaterial = this._defaultBabylonMaterialData[babylonDrawMode];\n if (!babylonMaterial) {\n babylonMaterial = this._createDefaultMaterial(\"__GLTFLoader._default\", babylonDrawMode);\n this._parent.onMaterialLoadedObservable.notifyObservers(babylonMaterial);\n this._defaultBabylonMaterialData[babylonDrawMode] = babylonMaterial;\n }\n babylonMesh.material = babylonMaterial;\n } else if (!this.parent.skipMaterials) {\n const material = ArrayItem.Get(`${context}/material`, this._gltf.materials, primitive.material);\n promises.push(this._loadMaterialAsync(`/materials/${material.index}`, material, babylonMesh, babylonDrawMode, babylonMaterial => {\n babylonMesh.material = babylonMaterial;\n }));\n }\n promise = Promise.all(promises);\n if (shouldInstance) {\n primitive._instanceData = {\n babylonSourceMesh: babylonMesh,\n promise: promise\n };\n }\n babylonAbstractMesh = babylonMesh;\n }\n GLTFLoader.AddPointerMetadata(babylonAbstractMesh, context);\n this._parent.onMeshLoadedObservable.notifyObservers(babylonAbstractMesh);\n assign(babylonAbstractMesh);\n this.logClose();\n return promise.then(() => {\n return babylonAbstractMesh;\n });\n }\n _loadVertexDataAsync(context, primitive, babylonMesh) {\n const extensionPromise = this._extensionsLoadVertexDataAsync(context, primitive, babylonMesh);\n if (extensionPromise) {\n return extensionPromise;\n }\n const attributes = primitive.attributes;\n if (!attributes) {\n throw new Error(`${context}: Attributes are missing`);\n }\n const promises = new Array();\n const babylonGeometry = new Geometry(babylonMesh.name, this._babylonScene);\n if (primitive.indices == undefined) {\n babylonMesh.isUnIndexed = true;\n } else {\n const accessor = ArrayItem.Get(`${context}/indices`, this._gltf.accessors, primitive.indices);\n promises.push(this._loadIndicesAccessorAsync(`/accessors/${accessor.index}`, accessor).then(data => {\n babylonGeometry.setIndices(data);\n }));\n }\n const loadAttribute = (name, kind, callback) => {\n if (attributes[name] == undefined) {\n return;\n }\n babylonMesh._delayInfo = babylonMesh._delayInfo || [];\n if (babylonMesh._delayInfo.indexOf(kind) === -1) {\n babylonMesh._delayInfo.push(kind);\n }\n const accessor = ArrayItem.Get(`${context}/attributes/${name}`, this._gltf.accessors, attributes[name]);\n promises.push(this._loadVertexAccessorAsync(`/accessors/${accessor.index}`, accessor, kind).then(babylonVertexBuffer => {\n if (babylonVertexBuffer.getKind() === VertexBuffer.PositionKind && !this.parent.alwaysComputeBoundingBox && !babylonMesh.skeleton) {\n if (accessor.min && accessor.max) {\n const min = TmpVectors.Vector3[0].copyFromFloats(...accessor.min);\n const max = TmpVectors.Vector3[1].copyFromFloats(...accessor.max);\n if (accessor.normalized && accessor.componentType !== 5126 /* AccessorComponentType.FLOAT */) {\n let divider = 1;\n switch (accessor.componentType) {\n case 5120 /* AccessorComponentType.BYTE */:\n divider = 127.0;\n break;\n case 5121 /* AccessorComponentType.UNSIGNED_BYTE */:\n divider = 255.0;\n break;\n case 5122 /* AccessorComponentType.SHORT */:\n divider = 32767.0;\n break;\n case 5123 /* AccessorComponentType.UNSIGNED_SHORT */:\n divider = 65535.0;\n break;\n }\n const oneOverDivider = 1 / divider;\n min.scaleInPlace(oneOverDivider);\n max.scaleInPlace(oneOverDivider);\n }\n babylonGeometry._boundingInfo = new BoundingInfo(min, max);\n babylonGeometry.useBoundingInfoFromGeometry = true;\n }\n }\n babylonGeometry.setVerticesBuffer(babylonVertexBuffer, accessor.count);\n }));\n if (kind == VertexBuffer.MatricesIndicesExtraKind) {\n babylonMesh.numBoneInfluencers = 8;\n }\n if (callback) {\n callback(accessor);\n }\n };\n loadAttribute(\"POSITION\", VertexBuffer.PositionKind);\n loadAttribute(\"NORMAL\", VertexBuffer.NormalKind);\n loadAttribute(\"TANGENT\", VertexBuffer.TangentKind);\n loadAttribute(\"TEXCOORD_0\", VertexBuffer.UVKind);\n loadAttribute(\"TEXCOORD_1\", VertexBuffer.UV2Kind);\n loadAttribute(\"TEXCOORD_2\", VertexBuffer.UV3Kind);\n loadAttribute(\"TEXCOORD_3\", VertexBuffer.UV4Kind);\n loadAttribute(\"TEXCOORD_4\", VertexBuffer.UV5Kind);\n loadAttribute(\"TEXCOORD_5\", VertexBuffer.UV6Kind);\n loadAttribute(\"JOINTS_0\", VertexBuffer.MatricesIndicesKind);\n loadAttribute(\"WEIGHTS_0\", VertexBuffer.MatricesWeightsKind);\n loadAttribute(\"JOINTS_1\", VertexBuffer.MatricesIndicesExtraKind);\n loadAttribute(\"WEIGHTS_1\", VertexBuffer.MatricesWeightsExtraKind);\n loadAttribute(\"COLOR_0\", VertexBuffer.ColorKind, accessor => {\n if (accessor.type === \"VEC4\" /* AccessorType.VEC4 */) {\n babylonMesh.hasVertexAlpha = true;\n }\n });\n return Promise.all(promises).then(() => {\n return babylonGeometry;\n });\n }\n _createMorphTargets(context, node, mesh, primitive, babylonMesh) {\n if (!primitive.targets) {\n return;\n }\n if (node._numMorphTargets == undefined) {\n node._numMorphTargets = primitive.targets.length;\n } else if (primitive.targets.length !== node._numMorphTargets) {\n throw new Error(`${context}: Primitives do not have the same number of targets`);\n }\n const targetNames = mesh.extras ? mesh.extras.targetNames : null;\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n babylonMesh.morphTargetManager = new MorphTargetManager(this._babylonScene);\n babylonMesh.morphTargetManager._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n babylonMesh.morphTargetManager.areUpdatesFrozen = true;\n for (let index = 0; index < primitive.targets.length; index++) {\n const weight = node.weights ? node.weights[index] : mesh.weights ? mesh.weights[index] : 0;\n const name = targetNames ? targetNames[index] : `morphTarget${index}`;\n babylonMesh.morphTargetManager.addTarget(new MorphTarget(name, weight, babylonMesh.getScene()));\n // TODO: tell the target whether it has positions, normals, tangents\n }\n }\n _loadMorphTargetsAsync(context, primitive, babylonMesh, babylonGeometry) {\n if (!primitive.targets) {\n return Promise.resolve();\n }\n const promises = new Array();\n const morphTargetManager = babylonMesh.morphTargetManager;\n for (let index = 0; index < morphTargetManager.numTargets; index++) {\n const babylonMorphTarget = morphTargetManager.getTarget(index);\n promises.push(this._loadMorphTargetVertexDataAsync(`${context}/targets/${index}`, babylonGeometry, primitive.targets[index], babylonMorphTarget));\n }\n return Promise.all(promises).then(() => {\n morphTargetManager.areUpdatesFrozen = false;\n });\n }\n _loadMorphTargetVertexDataAsync(context, babylonGeometry, attributes, babylonMorphTarget) {\n const promises = new Array();\n const loadAttribute = (attribute, kind, setData) => {\n if (attributes[attribute] == undefined) {\n return;\n }\n const babylonVertexBuffer = babylonGeometry.getVertexBuffer(kind);\n if (!babylonVertexBuffer) {\n return;\n }\n const accessor = ArrayItem.Get(`${context}/${attribute}`, this._gltf.accessors, attributes[attribute]);\n promises.push(this._loadFloatAccessorAsync(`/accessors/${accessor.index}`, accessor).then(data => {\n setData(babylonVertexBuffer, data);\n }));\n };\n loadAttribute(\"POSITION\", VertexBuffer.PositionKind, (babylonVertexBuffer, data) => {\n const positions = new Float32Array(data.length);\n babylonVertexBuffer.forEach(data.length, (value, index) => {\n positions[index] = data[index] + value;\n });\n babylonMorphTarget.setPositions(positions);\n });\n loadAttribute(\"NORMAL\", VertexBuffer.NormalKind, (babylonVertexBuffer, data) => {\n const normals = new Float32Array(data.length);\n babylonVertexBuffer.forEach(normals.length, (value, index) => {\n normals[index] = data[index] + value;\n });\n babylonMorphTarget.setNormals(normals);\n });\n loadAttribute(\"TANGENT\", VertexBuffer.TangentKind, (babylonVertexBuffer, data) => {\n const tangents = new Float32Array(data.length / 3 * 4);\n let dataIndex = 0;\n babylonVertexBuffer.forEach(data.length / 3 * 4, (value, index) => {\n // Tangent data for morph targets is stored as xyz delta.\n // The vertexData.tangent is stored as xyzw.\n // So we need to skip every fourth vertexData.tangent.\n if ((index + 1) % 4 !== 0) {\n tangents[dataIndex] = data[dataIndex] + value;\n dataIndex++;\n }\n });\n babylonMorphTarget.setTangents(tangents);\n });\n return Promise.all(promises).then(() => {});\n }\n static _LoadTransform(node, babylonNode) {\n // Ignore the TRS of skinned nodes.\n // See https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins (second implementation note)\n if (node.skin != undefined) {\n return;\n }\n let position = Vector3.Zero();\n let rotation = Quaternion.Identity();\n let scaling = Vector3.One();\n if (node.matrix) {\n const matrix = Matrix.FromArray(node.matrix);\n matrix.decompose(scaling, rotation, position);\n } else {\n if (node.translation) {\n position = Vector3.FromArray(node.translation);\n }\n if (node.rotation) {\n rotation = Quaternion.FromArray(node.rotation);\n }\n if (node.scale) {\n scaling = Vector3.FromArray(node.scale);\n }\n }\n babylonNode.position = position;\n babylonNode.rotationQuaternion = rotation;\n babylonNode.scaling = scaling;\n }\n _loadSkinAsync(context, node, skin, assign) {\n const extensionPromise = this._extensionsLoadSkinAsync(context, node, skin);\n if (extensionPromise) {\n return extensionPromise;\n }\n if (skin._data) {\n assign(skin._data.babylonSkeleton);\n return skin._data.promise;\n }\n const skeletonId = `skeleton${skin.index}`;\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const babylonSkeleton = new Skeleton(skin.name || skeletonId, skeletonId, this._babylonScene);\n babylonSkeleton._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n this._loadBones(context, skin, babylonSkeleton);\n const promise = this._loadSkinInverseBindMatricesDataAsync(context, skin).then(inverseBindMatricesData => {\n this._updateBoneMatrices(babylonSkeleton, inverseBindMatricesData);\n });\n skin._data = {\n babylonSkeleton: babylonSkeleton,\n promise: promise\n };\n assign(babylonSkeleton);\n return promise;\n }\n _loadBones(context, skin, babylonSkeleton) {\n if (skin.skeleton == undefined || this._parent.alwaysComputeSkeletonRootNode) {\n const rootNode = this._findSkeletonRootNode(`${context}/joints`, skin.joints);\n if (rootNode) {\n if (skin.skeleton === undefined) {\n skin.skeleton = rootNode.index;\n } else {\n const isParent = (a, b) => {\n for (; b.parent; b = b.parent) {\n if (b.parent === a) {\n return true;\n }\n }\n return false;\n };\n const skeletonNode = ArrayItem.Get(`${context}/skeleton`, this._gltf.nodes, skin.skeleton);\n if (skeletonNode !== rootNode && !isParent(skeletonNode, rootNode)) {\n Logger.Warn(`${context}/skeleton: Overriding with nearest common ancestor as skeleton node is not a common root`);\n skin.skeleton = rootNode.index;\n }\n }\n } else {\n Logger.Warn(`${context}: Failed to find common root`);\n }\n }\n const babylonBones = {};\n for (const index of skin.joints) {\n const node = ArrayItem.Get(`${context}/joints/${index}`, this._gltf.nodes, index);\n this._loadBone(node, skin, babylonSkeleton, babylonBones);\n }\n }\n _findSkeletonRootNode(context, joints) {\n if (joints.length === 0) {\n return null;\n }\n const paths = {};\n for (const index of joints) {\n const path = [];\n let node = ArrayItem.Get(`${context}/${index}`, this._gltf.nodes, index);\n while (node.index !== -1) {\n path.unshift(node);\n node = node.parent;\n }\n paths[index] = path;\n }\n let rootNode = null;\n for (let i = 0;; ++i) {\n let path = paths[joints[0]];\n if (i >= path.length) {\n return rootNode;\n }\n const node = path[i];\n for (let j = 1; j < joints.length; ++j) {\n path = paths[joints[j]];\n if (i >= path.length || node !== path[i]) {\n return rootNode;\n }\n }\n rootNode = node;\n }\n }\n _loadBone(node, skin, babylonSkeleton, babylonBones) {\n let babylonBone = babylonBones[node.index];\n if (babylonBone) {\n return babylonBone;\n }\n let parentBabylonBone = null;\n if (node.index !== skin.skeleton) {\n if (node.parent && node.parent.index !== -1) {\n parentBabylonBone = this._loadBone(node.parent, skin, babylonSkeleton, babylonBones);\n } else if (skin.skeleton !== undefined) {\n Logger.Warn(`/skins/${skin.index}/skeleton: Skeleton node is not a common root`);\n }\n }\n const boneIndex = skin.joints.indexOf(node.index);\n babylonBone = new Bone(node.name || `joint${node.index}`, babylonSkeleton, parentBabylonBone, this._getNodeMatrix(node), null, null, boneIndex);\n babylonBones[node.index] = babylonBone;\n // Wait until the scene is loaded to ensure the transform nodes are loaded.\n this._postSceneLoadActions.push(() => {\n // Link the Babylon bone with the corresponding Babylon transform node.\n // A glTF joint is a pointer to a glTF node in the glTF node hierarchy similar to Unity3D.\n babylonBone.linkTransformNode(node._babylonTransformNode);\n });\n return babylonBone;\n }\n _loadSkinInverseBindMatricesDataAsync(context, skin) {\n if (skin.inverseBindMatrices == undefined) {\n return Promise.resolve(null);\n }\n const accessor = ArrayItem.Get(`${context}/inverseBindMatrices`, this._gltf.accessors, skin.inverseBindMatrices);\n return this._loadFloatAccessorAsync(`/accessors/${accessor.index}`, accessor);\n }\n _updateBoneMatrices(babylonSkeleton, inverseBindMatricesData) {\n for (const babylonBone of babylonSkeleton.bones) {\n const baseMatrix = Matrix.Identity();\n const boneIndex = babylonBone._index;\n if (inverseBindMatricesData && boneIndex !== -1) {\n Matrix.FromArrayToRef(inverseBindMatricesData, boneIndex * 16, baseMatrix);\n baseMatrix.invertToRef(baseMatrix);\n }\n const babylonParentBone = babylonBone.getParent();\n if (babylonParentBone) {\n baseMatrix.multiplyToRef(babylonParentBone.getAbsoluteInverseBindMatrix(), baseMatrix);\n }\n babylonBone.updateMatrix(baseMatrix, false, false);\n babylonBone._updateAbsoluteBindMatrices(undefined, false);\n }\n }\n _getNodeMatrix(node) {\n return node.matrix ? Matrix.FromArray(node.matrix) : Matrix.Compose(node.scale ? Vector3.FromArray(node.scale) : Vector3.One(), node.rotation ? Quaternion.FromArray(node.rotation) : Quaternion.Identity(), node.translation ? Vector3.FromArray(node.translation) : Vector3.Zero());\n }\n /**\n * Loads a glTF camera.\n * @param context The context when loading the asset\n * @param camera The glTF camera property\n * @param assign A function called synchronously after parsing the glTF properties\n * @returns A promise that resolves with the loaded Babylon camera when the load is complete\n */\n loadCameraAsync(context, camera, assign = () => {}) {\n const extensionPromise = this._extensionsLoadCameraAsync(context, camera, assign);\n if (extensionPromise) {\n return extensionPromise;\n }\n const promises = new Array();\n this.logOpen(`${context} ${camera.name || \"\"}`);\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const babylonCamera = new FreeCamera(camera.name || `camera${camera.index}`, Vector3.Zero(), this._babylonScene, false);\n babylonCamera._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n babylonCamera.ignoreParentScaling = true;\n camera._babylonCamera = babylonCamera;\n // Rotation by 180 as glTF has a different convention than Babylon.\n babylonCamera.rotation.set(0, Math.PI, 0);\n switch (camera.type) {\n case \"perspective\" /* CameraType.PERSPECTIVE */:\n {\n const perspective = camera.perspective;\n if (!perspective) {\n throw new Error(`${context}: Camera perspective properties are missing`);\n }\n babylonCamera.fov = perspective.yfov;\n babylonCamera.minZ = perspective.znear;\n babylonCamera.maxZ = perspective.zfar || 0;\n break;\n }\n case \"orthographic\" /* CameraType.ORTHOGRAPHIC */:\n {\n if (!camera.orthographic) {\n throw new Error(`${context}: Camera orthographic properties are missing`);\n }\n babylonCamera.mode = Camera.ORTHOGRAPHIC_CAMERA;\n babylonCamera.orthoLeft = -camera.orthographic.xmag;\n babylonCamera.orthoRight = camera.orthographic.xmag;\n babylonCamera.orthoBottom = -camera.orthographic.ymag;\n babylonCamera.orthoTop = camera.orthographic.ymag;\n babylonCamera.minZ = camera.orthographic.znear;\n babylonCamera.maxZ = camera.orthographic.zfar;\n break;\n }\n default:\n {\n throw new Error(`${context}: Invalid camera type (${camera.type})`);\n }\n }\n GLTFLoader.AddPointerMetadata(babylonCamera, context);\n this._parent.onCameraLoadedObservable.notifyObservers(babylonCamera);\n assign(babylonCamera);\n this.logClose();\n return Promise.all(promises).then(() => {\n return babylonCamera;\n });\n }\n _loadAnimationsAsync() {\n const animations = this._gltf.animations;\n if (!animations) {\n return Promise.resolve();\n }\n const promises = new Array();\n for (let index = 0; index < animations.length; index++) {\n const animation = animations[index];\n promises.push(this.loadAnimationAsync(`/animations/${animation.index}`, animation).then(animationGroup => {\n // Delete the animation group if it ended up not having any animations in it.\n if (animationGroup.targetedAnimations.length === 0) {\n animationGroup.dispose();\n }\n }));\n }\n return Promise.all(promises).then(() => {});\n }\n /**\n * Loads a glTF animation.\n * @param context The context when loading the asset\n * @param animation The glTF animation property\n * @returns A promise that resolves with the loaded Babylon animation group when the load is complete\n */\n loadAnimationAsync(context, animation) {\n const promise = this._extensionsLoadAnimationAsync(context, animation);\n if (promise) {\n return promise;\n }\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const babylonAnimationGroup = new AnimationGroup(animation.name || `animation${animation.index}`, this._babylonScene);\n babylonAnimationGroup._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n animation._babylonAnimationGroup = babylonAnimationGroup;\n const promises = new Array();\n ArrayItem.Assign(animation.channels);\n ArrayItem.Assign(animation.samplers);\n for (const channel of animation.channels) {\n promises.push(this._loadAnimationChannelAsync(`${context}/channels/${channel.index}`, context, animation, channel, (babylonTarget, babylonAnimation) => {\n babylonTarget.animations = babylonTarget.animations || [];\n babylonTarget.animations.push(babylonAnimation);\n babylonAnimationGroup.addTargetedAnimation(babylonAnimation, babylonTarget);\n }));\n }\n return Promise.all(promises).then(() => {\n babylonAnimationGroup.normalize(0);\n return babylonAnimationGroup;\n });\n }\n /**\n * @hidden\n * Loads a glTF animation channel.\n * @param context The context when loading the asset\n * @param animationContext The context of the animation when loading the asset\n * @param animation The glTF animation property\n * @param channel The glTF animation channel property\n * @param onLoad Called for each animation loaded\n * @returns A void promise that resolves when the load is complete\n */\n _loadAnimationChannelAsync(context, animationContext, animation, channel, onLoad) {\n const promise = this._extensionsLoadAnimationChannelAsync(context, animationContext, animation, channel, onLoad);\n if (promise) {\n return promise;\n }\n if (channel.target.node == undefined) {\n return Promise.resolve();\n }\n const targetNode = ArrayItem.Get(`${context}/target/node`, this._gltf.nodes, channel.target.node);\n // Ignore animations that have no animation targets.\n if (channel.target.path === \"weights\" /* AnimationChannelTargetPath.WEIGHTS */ && !targetNode._numMorphTargets || channel.target.path !== \"weights\" /* AnimationChannelTargetPath.WEIGHTS */ && !targetNode._babylonTransformNode) {\n return Promise.resolve();\n }\n let properties;\n switch (channel.target.path) {\n case \"translation\" /* AnimationChannelTargetPath.TRANSLATION */:\n {\n properties = nodeAnimationData.translation;\n break;\n }\n case \"rotation\" /* AnimationChannelTargetPath.ROTATION */:\n {\n properties = nodeAnimationData.rotation;\n break;\n }\n case \"scale\" /* AnimationChannelTargetPath.SCALE */:\n {\n properties = nodeAnimationData.scale;\n break;\n }\n case \"weights\" /* AnimationChannelTargetPath.WEIGHTS */:\n {\n properties = nodeAnimationData.weights;\n break;\n }\n default:\n {\n throw new Error(`${context}/target/path: Invalid value (${channel.target.path})`);\n }\n }\n const targetInfo = {\n object: targetNode,\n info: properties\n };\n return this._loadAnimationChannelFromTargetInfoAsync(context, animationContext, animation, channel, targetInfo, onLoad);\n }\n /**\n * @hidden\n * Loads a glTF animation channel.\n * @param context The context when loading the asset\n * @param animationContext The context of the animation when loading the asset\n * @param animation The glTF animation property\n * @param channel The glTF animation channel property\n * @param targetInfo The glTF target and properties\n * @param onLoad Called for each animation loaded\n * @returns A void promise that resolves when the load is complete\n */\n _loadAnimationChannelFromTargetInfoAsync(context, animationContext, animation, channel, targetInfo, onLoad) {\n const fps = this.parent.targetFps;\n const invfps = 1 / fps;\n const sampler = ArrayItem.Get(`${context}/sampler`, animation.samplers, channel.sampler);\n return this._loadAnimationSamplerAsync(`${animationContext}/samplers/${channel.sampler}`, sampler).then(data => {\n let numAnimations = 0;\n const target = targetInfo.object;\n const propertyInfos = targetInfo.info;\n // Extract the corresponding values from the read value.\n // GLTF values may be dispatched to several Babylon properties.\n // For example, baseColorFactor [`r`, `g`, `b`, `a`] is dispatched to\n // - albedoColor as Color3(`r`, `g`, `b`)\n // - alpha as `a`\n for (const propertyInfo of propertyInfos) {\n const stride = propertyInfo.getStride(target);\n const input = data.input;\n const output = data.output;\n const keys = new Array(input.length);\n let outputOffset = 0;\n switch (data.interpolation) {\n case \"STEP\" /* AnimationSamplerInterpolation.STEP */:\n {\n for (let index = 0; index < input.length; index++) {\n const value = propertyInfo.getValue(target, output, outputOffset, 1);\n outputOffset += stride;\n keys[index] = {\n frame: input[index] * fps,\n value: value,\n interpolation: AnimationKeyInterpolation.STEP\n };\n }\n break;\n }\n case \"CUBICSPLINE\" /* AnimationSamplerInterpolation.CUBICSPLINE */:\n {\n for (let index = 0; index < input.length; index++) {\n const inTangent = propertyInfo.getValue(target, output, outputOffset, invfps);\n outputOffset += stride;\n const value = propertyInfo.getValue(target, output, outputOffset, 1);\n outputOffset += stride;\n const outTangent = propertyInfo.getValue(target, output, outputOffset, invfps);\n outputOffset += stride;\n keys[index] = {\n frame: input[index] * fps,\n inTangent: inTangent,\n value: value,\n outTangent: outTangent\n };\n }\n break;\n }\n case \"LINEAR\" /* AnimationSamplerInterpolation.LINEAR */:\n {\n for (let index = 0; index < input.length; index++) {\n const value = propertyInfo.getValue(target, output, outputOffset, 1);\n outputOffset += stride;\n keys[index] = {\n frame: input[index] * fps,\n value: value\n };\n }\n break;\n }\n }\n if (outputOffset > 0) {\n const name = `${animation.name || `animation${animation.index}`}_channel${channel.index}_${numAnimations}`;\n propertyInfo.buildAnimations(target, name, fps, keys, (babylonAnimatable, babylonAnimation) => {\n ++numAnimations;\n onLoad(babylonAnimatable, babylonAnimation);\n });\n }\n }\n });\n }\n _loadAnimationSamplerAsync(context, sampler) {\n if (sampler._data) {\n return sampler._data;\n }\n const interpolation = sampler.interpolation || \"LINEAR\" /* AnimationSamplerInterpolation.LINEAR */;\n switch (interpolation) {\n case \"STEP\" /* AnimationSamplerInterpolation.STEP */:\n case \"LINEAR\" /* AnimationSamplerInterpolation.LINEAR */:\n case \"CUBICSPLINE\" /* AnimationSamplerInterpolation.CUBICSPLINE */:\n {\n break;\n }\n default:\n {\n throw new Error(`${context}/interpolation: Invalid value (${sampler.interpolation})`);\n }\n }\n const inputAccessor = ArrayItem.Get(`${context}/input`, this._gltf.accessors, sampler.input);\n const outputAccessor = ArrayItem.Get(`${context}/output`, this._gltf.accessors, sampler.output);\n sampler._data = Promise.all([this._loadFloatAccessorAsync(`/accessors/${inputAccessor.index}`, inputAccessor), this._loadFloatAccessorAsync(`/accessors/${outputAccessor.index}`, outputAccessor)]).then(([inputData, outputData]) => {\n return {\n input: inputData,\n interpolation: interpolation,\n output: outputData\n };\n });\n return sampler._data;\n }\n /**\n * Loads a glTF buffer.\n * @param context The context when loading the asset\n * @param buffer The glTF buffer property\n * @param byteOffset The byte offset to use\n * @param byteLength The byte length to use\n * @returns A promise that resolves with the loaded data when the load is complete\n */\n loadBufferAsync(context, buffer, byteOffset, byteLength) {\n const extensionPromise = this._extensionsLoadBufferAsync(context, buffer, byteOffset, byteLength);\n if (extensionPromise) {\n return extensionPromise;\n }\n if (!buffer._data) {\n if (buffer.uri) {\n buffer._data = this.loadUriAsync(`${context}/uri`, buffer, buffer.uri);\n } else {\n if (!this._bin) {\n throw new Error(`${context}: Uri is missing or the binary glTF is missing its binary chunk`);\n }\n buffer._data = this._bin.readAsync(0, buffer.byteLength);\n }\n }\n return buffer._data.then(data => {\n try {\n return new Uint8Array(data.buffer, data.byteOffset + byteOffset, byteLength);\n } catch (e) {\n throw new Error(`${context}: ${e.message}`);\n }\n });\n }\n /**\n * Loads a glTF buffer view.\n * @param context The context when loading the asset\n * @param bufferView The glTF buffer view property\n * @returns A promise that resolves with the loaded data when the load is complete\n */\n loadBufferViewAsync(context, bufferView) {\n const extensionPromise = this._extensionsLoadBufferViewAsync(context, bufferView);\n if (extensionPromise) {\n return extensionPromise;\n }\n if (bufferView._data) {\n return bufferView._data;\n }\n const buffer = ArrayItem.Get(`${context}/buffer`, this._gltf.buffers, bufferView.buffer);\n bufferView._data = this.loadBufferAsync(`/buffers/${buffer.index}`, buffer, bufferView.byteOffset || 0, bufferView.byteLength);\n return bufferView._data;\n }\n _loadAccessorAsync(context, accessor, constructor) {\n if (accessor._data) {\n return accessor._data;\n }\n const numComponents = GLTFLoader._GetNumComponents(context, accessor.type);\n const byteStride = numComponents * VertexBuffer.GetTypeByteLength(accessor.componentType);\n const length = numComponents * accessor.count;\n if (accessor.bufferView == undefined) {\n accessor._data = Promise.resolve(new constructor(length));\n } else {\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, accessor.bufferView);\n accessor._data = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView).then(data => {\n if (accessor.componentType === 5126 /* AccessorComponentType.FLOAT */ && !accessor.normalized && (!bufferView.byteStride || bufferView.byteStride === byteStride)) {\n return GLTFLoader._GetTypedArray(context, accessor.componentType, data, accessor.byteOffset, length);\n } else {\n const typedArray = new constructor(length);\n VertexBuffer.ForEach(data, accessor.byteOffset || 0, bufferView.byteStride || byteStride, numComponents, accessor.componentType, typedArray.length, accessor.normalized || false, (value, index) => {\n typedArray[index] = value;\n });\n return typedArray;\n }\n });\n }\n if (accessor.sparse) {\n const sparse = accessor.sparse;\n accessor._data = accessor._data.then(data => {\n const typedArray = data;\n const indicesBufferView = ArrayItem.Get(`${context}/sparse/indices/bufferView`, this._gltf.bufferViews, sparse.indices.bufferView);\n const valuesBufferView = ArrayItem.Get(`${context}/sparse/values/bufferView`, this._gltf.bufferViews, sparse.values.bufferView);\n return Promise.all([this.loadBufferViewAsync(`/bufferViews/${indicesBufferView.index}`, indicesBufferView), this.loadBufferViewAsync(`/bufferViews/${valuesBufferView.index}`, valuesBufferView)]).then(([indicesData, valuesData]) => {\n const indices = GLTFLoader._GetTypedArray(`${context}/sparse/indices`, sparse.indices.componentType, indicesData, sparse.indices.byteOffset, sparse.count);\n const sparseLength = numComponents * sparse.count;\n let values;\n if (accessor.componentType === 5126 /* AccessorComponentType.FLOAT */ && !accessor.normalized) {\n values = GLTFLoader._GetTypedArray(`${context}/sparse/values`, accessor.componentType, valuesData, sparse.values.byteOffset, sparseLength);\n } else {\n const sparseData = GLTFLoader._GetTypedArray(`${context}/sparse/values`, accessor.componentType, valuesData, sparse.values.byteOffset, sparseLength);\n values = new constructor(sparseLength);\n VertexBuffer.ForEach(sparseData, 0, byteStride, numComponents, accessor.componentType, values.length, accessor.normalized || false, (value, index) => {\n values[index] = value;\n });\n }\n let valuesIndex = 0;\n for (let indicesIndex = 0; indicesIndex < indices.length; indicesIndex++) {\n let dataIndex = indices[indicesIndex] * numComponents;\n for (let componentIndex = 0; componentIndex < numComponents; componentIndex++) {\n typedArray[dataIndex++] = values[valuesIndex++];\n }\n }\n return typedArray;\n });\n });\n }\n return accessor._data;\n }\n /**\n * @internal\n */\n _loadFloatAccessorAsync(context, accessor) {\n return this._loadAccessorAsync(context, accessor, Float32Array);\n }\n /**\n * @internal\n */\n _loadIndicesAccessorAsync(context, accessor) {\n if (accessor.type !== \"SCALAR\" /* AccessorType.SCALAR */) {\n throw new Error(`${context}/type: Invalid value ${accessor.type}`);\n }\n if (accessor.componentType !== 5121 /* AccessorComponentType.UNSIGNED_BYTE */ && accessor.componentType !== 5123 /* AccessorComponentType.UNSIGNED_SHORT */ && accessor.componentType !== 5125 /* AccessorComponentType.UNSIGNED_INT */) {\n throw new Error(`${context}/componentType: Invalid value ${accessor.componentType}`);\n }\n if (accessor._data) {\n return accessor._data;\n }\n if (accessor.sparse) {\n const constructor = GLTFLoader._GetTypedArrayConstructor(`${context}/componentType`, accessor.componentType);\n accessor._data = this._loadAccessorAsync(context, accessor, constructor);\n } else {\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, accessor.bufferView);\n accessor._data = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView).then(data => {\n return GLTFLoader._GetTypedArray(context, accessor.componentType, data, accessor.byteOffset, accessor.count);\n });\n }\n return accessor._data;\n }\n /**\n * @internal\n */\n _loadVertexBufferViewAsync(bufferView) {\n if (bufferView._babylonBuffer) {\n return bufferView._babylonBuffer;\n }\n const engine = this._babylonScene.getEngine();\n bufferView._babylonBuffer = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView).then(data => {\n return new Buffer(engine, data, false);\n });\n return bufferView._babylonBuffer;\n }\n /**\n * @internal\n */\n _loadVertexAccessorAsync(context, accessor, kind) {\n var _accessor$_babylonVer;\n if ((_accessor$_babylonVer = accessor._babylonVertexBuffer) !== null && _accessor$_babylonVer !== void 0 && _accessor$_babylonVer[kind]) {\n return accessor._babylonVertexBuffer[kind];\n }\n if (!accessor._babylonVertexBuffer) {\n accessor._babylonVertexBuffer = {};\n }\n const engine = this._babylonScene.getEngine();\n if (accessor.sparse || accessor.bufferView == undefined) {\n accessor._babylonVertexBuffer[kind] = this._loadFloatAccessorAsync(context, accessor).then(data => {\n return new VertexBuffer(engine, data, kind, false);\n });\n } else {\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, accessor.bufferView);\n accessor._babylonVertexBuffer[kind] = this._loadVertexBufferViewAsync(bufferView).then(babylonBuffer => {\n const numComponents = GLTFLoader._GetNumComponents(context, accessor.type);\n return new VertexBuffer(engine, babylonBuffer, kind, false, undefined, bufferView.byteStride, undefined, accessor.byteOffset, numComponents, accessor.componentType, accessor.normalized, true, undefined, true);\n });\n }\n return accessor._babylonVertexBuffer[kind];\n }\n _loadMaterialMetallicRoughnessPropertiesAsync(context, properties, babylonMaterial) {\n if (!(babylonMaterial instanceof PBRMaterial)) {\n throw new Error(`${context}: Material type not supported`);\n }\n const promises = new Array();\n if (properties) {\n if (properties.baseColorFactor) {\n babylonMaterial.albedoColor = Color3.FromArray(properties.baseColorFactor);\n babylonMaterial.alpha = properties.baseColorFactor[3];\n } else {\n babylonMaterial.albedoColor = Color3.White();\n }\n babylonMaterial.metallic = properties.metallicFactor == undefined ? 1 : properties.metallicFactor;\n babylonMaterial.roughness = properties.roughnessFactor == undefined ? 1 : properties.roughnessFactor;\n if (properties.baseColorTexture) {\n promises.push(this.loadTextureInfoAsync(`${context}/baseColorTexture`, properties.baseColorTexture, texture => {\n texture.name = `${babylonMaterial.name} (Base Color)`;\n babylonMaterial.albedoTexture = texture;\n }));\n }\n if (properties.metallicRoughnessTexture) {\n properties.metallicRoughnessTexture.nonColorData = true;\n promises.push(this.loadTextureInfoAsync(`${context}/metallicRoughnessTexture`, properties.metallicRoughnessTexture, texture => {\n texture.name = `${babylonMaterial.name} (Metallic Roughness)`;\n babylonMaterial.metallicTexture = texture;\n }));\n babylonMaterial.useMetallnessFromMetallicTextureBlue = true;\n babylonMaterial.useRoughnessFromMetallicTextureGreen = true;\n babylonMaterial.useRoughnessFromMetallicTextureAlpha = false;\n }\n }\n return Promise.all(promises).then(() => {});\n }\n /**\n * @internal\n */\n _loadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign = () => {}) {\n const extensionPromise = this._extensionsLoadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign);\n if (extensionPromise) {\n return extensionPromise;\n }\n material._data = material._data || {};\n let babylonData = material._data[babylonDrawMode];\n if (!babylonData) {\n this.logOpen(`${context} ${material.name || \"\"}`);\n const babylonMaterial = this.createMaterial(context, material, babylonDrawMode);\n babylonData = {\n babylonMaterial: babylonMaterial,\n babylonMeshes: [],\n promise: this.loadMaterialPropertiesAsync(context, material, babylonMaterial)\n };\n material._data[babylonDrawMode] = babylonData;\n GLTFLoader.AddPointerMetadata(babylonMaterial, context);\n this._parent.onMaterialLoadedObservable.notifyObservers(babylonMaterial);\n this.logClose();\n }\n if (babylonMesh) {\n babylonData.babylonMeshes.push(babylonMesh);\n babylonMesh.onDisposeObservable.addOnce(() => {\n const index = babylonData.babylonMeshes.indexOf(babylonMesh);\n if (index !== -1) {\n babylonData.babylonMeshes.splice(index, 1);\n }\n });\n }\n assign(babylonData.babylonMaterial);\n return babylonData.promise.then(() => {\n return babylonData.babylonMaterial;\n });\n }\n _createDefaultMaterial(name, babylonDrawMode) {\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const babylonMaterial = new PBRMaterial(name, this._babylonScene);\n babylonMaterial._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n // Moved to mesh so user can change materials on gltf meshes: babylonMaterial.sideOrientation = this._babylonScene.useRightHandedSystem ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation;\n babylonMaterial.fillMode = babylonDrawMode;\n babylonMaterial.enableSpecularAntiAliasing = true;\n babylonMaterial.useRadianceOverAlpha = !this._parent.transparencyAsCoverage;\n babylonMaterial.useSpecularOverAlpha = !this._parent.transparencyAsCoverage;\n babylonMaterial.transparencyMode = PBRMaterial.PBRMATERIAL_OPAQUE;\n babylonMaterial.metallic = 1;\n babylonMaterial.roughness = 1;\n return babylonMaterial;\n }\n /**\n * Creates a Babylon material from a glTF material.\n * @param context The context when loading the asset\n * @param material The glTF material property\n * @param babylonDrawMode The draw mode for the Babylon material\n * @returns The Babylon material\n */\n createMaterial(context, material, babylonDrawMode) {\n const extensionPromise = this._extensionsCreateMaterial(context, material, babylonDrawMode);\n if (extensionPromise) {\n return extensionPromise;\n }\n const name = material.name || `material${material.index}`;\n const babylonMaterial = this._createDefaultMaterial(name, babylonDrawMode);\n return babylonMaterial;\n }\n /**\n * Loads properties from a glTF material into a Babylon material.\n * @param context The context when loading the asset\n * @param material The glTF material property\n * @param babylonMaterial The Babylon material\n * @returns A promise that resolves when the load is complete\n */\n loadMaterialPropertiesAsync(context, material, babylonMaterial) {\n const extensionPromise = this._extensionsLoadMaterialPropertiesAsync(context, material, babylonMaterial);\n if (extensionPromise) {\n return extensionPromise;\n }\n const promises = new Array();\n promises.push(this.loadMaterialBasePropertiesAsync(context, material, babylonMaterial));\n if (material.pbrMetallicRoughness) {\n promises.push(this._loadMaterialMetallicRoughnessPropertiesAsync(`${context}/pbrMetallicRoughness`, material.pbrMetallicRoughness, babylonMaterial));\n }\n this.loadMaterialAlphaProperties(context, material, babylonMaterial);\n return Promise.all(promises).then(() => {});\n }\n /**\n * Loads the normal, occlusion, and emissive properties from a glTF material into a Babylon material.\n * @param context The context when loading the asset\n * @param material The glTF material property\n * @param babylonMaterial The Babylon material\n * @returns A promise that resolves when the load is complete\n */\n loadMaterialBasePropertiesAsync(context, material, babylonMaterial) {\n if (!(babylonMaterial instanceof PBRMaterial)) {\n throw new Error(`${context}: Material type not supported`);\n }\n const promises = new Array();\n babylonMaterial.emissiveColor = material.emissiveFactor ? Color3.FromArray(material.emissiveFactor) : new Color3(0, 0, 0);\n if (material.doubleSided) {\n babylonMaterial.backFaceCulling = false;\n babylonMaterial.twoSidedLighting = true;\n }\n if (material.normalTexture) {\n material.normalTexture.nonColorData = true;\n promises.push(this.loadTextureInfoAsync(`${context}/normalTexture`, material.normalTexture, texture => {\n texture.name = `${babylonMaterial.name} (Normal)`;\n babylonMaterial.bumpTexture = texture;\n }));\n babylonMaterial.invertNormalMapX = !this._babylonScene.useRightHandedSystem;\n babylonMaterial.invertNormalMapY = this._babylonScene.useRightHandedSystem;\n if (material.normalTexture.scale != undefined && babylonMaterial.bumpTexture) {\n babylonMaterial.bumpTexture.level = material.normalTexture.scale;\n }\n babylonMaterial.forceIrradianceInFragment = true;\n }\n if (material.occlusionTexture) {\n material.occlusionTexture.nonColorData = true;\n promises.push(this.loadTextureInfoAsync(`${context}/occlusionTexture`, material.occlusionTexture, texture => {\n texture.name = `${babylonMaterial.name} (Occlusion)`;\n babylonMaterial.ambientTexture = texture;\n }));\n babylonMaterial.useAmbientInGrayScale = true;\n if (material.occlusionTexture.strength != undefined) {\n babylonMaterial.ambientTextureStrength = material.occlusionTexture.strength;\n }\n }\n if (material.emissiveTexture) {\n promises.push(this.loadTextureInfoAsync(`${context}/emissiveTexture`, material.emissiveTexture, texture => {\n texture.name = `${babylonMaterial.name} (Emissive)`;\n babylonMaterial.emissiveTexture = texture;\n }));\n }\n return Promise.all(promises).then(() => {});\n }\n /**\n * Loads the alpha properties from a glTF material into a Babylon material.\n * Must be called after the setting the albedo texture of the Babylon material when the material has an albedo texture.\n * @param context The context when loading the asset\n * @param material The glTF material property\n * @param babylonMaterial The Babylon material\n */\n loadMaterialAlphaProperties(context, material, babylonMaterial) {\n if (!(babylonMaterial instanceof PBRMaterial)) {\n throw new Error(`${context}: Material type not supported`);\n }\n const alphaMode = material.alphaMode || \"OPAQUE\" /* MaterialAlphaMode.OPAQUE */;\n switch (alphaMode) {\n case \"OPAQUE\" /* MaterialAlphaMode.OPAQUE */:\n {\n babylonMaterial.transparencyMode = PBRMaterial.PBRMATERIAL_OPAQUE;\n babylonMaterial.alpha = 1.0; // Force alpha to 1.0 for opaque mode.\n break;\n }\n case \"MASK\" /* MaterialAlphaMode.MASK */:\n {\n babylonMaterial.transparencyMode = PBRMaterial.PBRMATERIAL_ALPHATEST;\n babylonMaterial.alphaCutOff = material.alphaCutoff == undefined ? 0.5 : material.alphaCutoff;\n if (babylonMaterial.albedoTexture) {\n babylonMaterial.albedoTexture.hasAlpha = true;\n }\n break;\n }\n case \"BLEND\" /* MaterialAlphaMode.BLEND */:\n {\n babylonMaterial.transparencyMode = PBRMaterial.PBRMATERIAL_ALPHABLEND;\n if (babylonMaterial.albedoTexture) {\n babylonMaterial.albedoTexture.hasAlpha = true;\n babylonMaterial.useAlphaFromAlbedoTexture = true;\n }\n break;\n }\n default:\n {\n throw new Error(`${context}/alphaMode: Invalid value (${material.alphaMode})`);\n }\n }\n }\n /**\n * Loads a glTF texture info.\n * @param context The context when loading the asset\n * @param textureInfo The glTF texture info property\n * @param assign A function called synchronously after parsing the glTF properties\n * @returns A promise that resolves with the loaded Babylon texture when the load is complete\n */\n loadTextureInfoAsync(context, textureInfo, assign = () => {}) {\n const extensionPromise = this._extensionsLoadTextureInfoAsync(context, textureInfo, assign);\n if (extensionPromise) {\n return extensionPromise;\n }\n this.logOpen(`${context}`);\n if (textureInfo.texCoord >= 6) {\n throw new Error(`${context}/texCoord: Invalid value (${textureInfo.texCoord})`);\n }\n const texture = ArrayItem.Get(`${context}/index`, this._gltf.textures, textureInfo.index);\n texture._textureInfo = textureInfo;\n const promise = this._loadTextureAsync(`/textures/${textureInfo.index}`, texture, babylonTexture => {\n babylonTexture.coordinatesIndex = textureInfo.texCoord || 0;\n GLTFLoader.AddPointerMetadata(babylonTexture, context);\n this._parent.onTextureLoadedObservable.notifyObservers(babylonTexture);\n assign(babylonTexture);\n });\n this.logClose();\n return promise;\n }\n /**\n * @internal\n */\n _loadTextureAsync(context, texture, assign = () => {}) {\n const extensionPromise = this._extensionsLoadTextureAsync(context, texture, assign);\n if (extensionPromise) {\n return extensionPromise;\n }\n this.logOpen(`${context} ${texture.name || \"\"}`);\n const sampler = texture.sampler == undefined ? GLTFLoader.DefaultSampler : ArrayItem.Get(`${context}/sampler`, this._gltf.samplers, texture.sampler);\n const image = ArrayItem.Get(`${context}/source`, this._gltf.images, texture.source);\n const promise = this._createTextureAsync(context, sampler, image, assign, undefined, !texture._textureInfo.nonColorData);\n this.logClose();\n return promise;\n }\n /**\n * @internal\n */\n _createTextureAsync(context, sampler, image, assign = () => {}, textureLoaderOptions, useSRGBBuffer) {\n const samplerData = this._loadSampler(`/samplers/${sampler.index}`, sampler);\n const promises = new Array();\n const deferred = new Deferred();\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const textureCreationOptions = {\n noMipmap: samplerData.noMipMaps,\n invertY: false,\n samplingMode: samplerData.samplingMode,\n onLoad: () => {\n if (!this._disposed) {\n deferred.resolve();\n }\n },\n onError: (message, exception) => {\n if (!this._disposed) {\n deferred.reject(new Error(`${context}: ${exception && exception.message ? exception.message : message || \"Failed to load texture\"}`));\n }\n },\n mimeType: image.mimeType,\n loaderOptions: textureLoaderOptions,\n useSRGBBuffer: !!useSRGBBuffer && this._parent.useSRGBBuffers\n };\n const babylonTexture = new Texture(null, this._babylonScene, textureCreationOptions);\n babylonTexture._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n promises.push(deferred.promise);\n promises.push(this.loadImageAsync(`/images/${image.index}`, image).then(data => {\n const name = image.uri || `${this._fileName}#image${image.index}`;\n const dataUrl = `data:${this._uniqueRootUrl}${name}`;\n babylonTexture.updateURL(dataUrl, data);\n }));\n babylonTexture.wrapU = samplerData.wrapU;\n babylonTexture.wrapV = samplerData.wrapV;\n assign(babylonTexture);\n return Promise.all(promises).then(() => {\n return babylonTexture;\n });\n }\n _loadSampler(context, sampler) {\n if (!sampler._data) {\n sampler._data = {\n noMipMaps: sampler.minFilter === 9728 /* TextureMinFilter.NEAREST */ || sampler.minFilter === 9729 /* TextureMinFilter.LINEAR */,\n samplingMode: GLTFLoader._GetTextureSamplingMode(context, sampler),\n wrapU: GLTFLoader._GetTextureWrapMode(`${context}/wrapS`, sampler.wrapS),\n wrapV: GLTFLoader._GetTextureWrapMode(`${context}/wrapT`, sampler.wrapT)\n };\n }\n return sampler._data;\n }\n /**\n * Loads a glTF image.\n * @param context The context when loading the asset\n * @param image The glTF image property\n * @returns A promise that resolves with the loaded data when the load is complete\n */\n loadImageAsync(context, image) {\n if (!image._data) {\n this.logOpen(`${context} ${image.name || \"\"}`);\n if (image.uri) {\n image._data = this.loadUriAsync(`${context}/uri`, image, image.uri);\n } else {\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, image.bufferView);\n image._data = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView);\n }\n this.logClose();\n }\n return image._data;\n }\n /**\n * Loads a glTF uri.\n * @param context The context when loading the asset\n * @param property The glTF property associated with the uri\n * @param uri The base64 or relative uri\n * @returns A promise that resolves with the loaded data when the load is complete\n */\n loadUriAsync(context, property, uri) {\n const extensionPromise = this._extensionsLoadUriAsync(context, property, uri);\n if (extensionPromise) {\n return extensionPromise;\n }\n if (!GLTFLoader._ValidateUri(uri)) {\n throw new Error(`${context}: '${uri}' is invalid`);\n }\n if (IsBase64DataUrl(uri)) {\n const data = new Uint8Array(DecodeBase64UrlToBinary(uri));\n this.log(`${context}: Decoded ${uri.substr(0, 64)}... (${data.length} bytes)`);\n return Promise.resolve(data);\n }\n this.log(`${context}: Loading ${uri}`);\n return this._parent.preprocessUrlAsync(this._rootUrl + uri).then(url => {\n return new Promise((resolve, reject) => {\n this._parent._loadFile(this._babylonScene, url, data => {\n if (!this._disposed) {\n this.log(`${context}: Loaded ${uri} (${data.byteLength} bytes)`);\n resolve(new Uint8Array(data));\n }\n }, true, request => {\n reject(new LoadFileError(`${context}: Failed to load '${uri}'${request ? \": \" + request.status + \" \" + request.statusText : \"\"}`, request));\n });\n });\n });\n }\n /**\n * Adds a JSON pointer to the _internalMetadata of the Babylon object at `<object>._internalMetadata.gltf.pointers`.\n * @param babylonObject the Babylon object with _internalMetadata\n * @param pointer the JSON pointer\n */\n static AddPointerMetadata(babylonObject, pointer) {\n babylonObject.metadata = babylonObject.metadata || {};\n const metadata = babylonObject._internalMetadata = babylonObject._internalMetadata || {};\n const gltf = metadata.gltf = metadata.gltf || {};\n const pointers = gltf.pointers = gltf.pointers || [];\n pointers.push(pointer);\n }\n static _GetTextureWrapMode(context, mode) {\n // Set defaults if undefined\n mode = mode == undefined ? 10497 /* TextureWrapMode.REPEAT */ : mode;\n switch (mode) {\n case 33071 /* TextureWrapMode.CLAMP_TO_EDGE */:\n return Texture.CLAMP_ADDRESSMODE;\n case 33648 /* TextureWrapMode.MIRRORED_REPEAT */:\n return Texture.MIRROR_ADDRESSMODE;\n case 10497 /* TextureWrapMode.REPEAT */:\n return Texture.WRAP_ADDRESSMODE;\n default:\n Logger.Warn(`${context}: Invalid value (${mode})`);\n return Texture.WRAP_ADDRESSMODE;\n }\n }\n static _GetTextureSamplingMode(context, sampler) {\n // Set defaults if undefined\n const magFilter = sampler.magFilter == undefined ? 9729 /* TextureMagFilter.LINEAR */ : sampler.magFilter;\n const minFilter = sampler.minFilter == undefined ? 9987 /* TextureMinFilter.LINEAR_MIPMAP_LINEAR */ : sampler.minFilter;\n if (magFilter === 9729 /* TextureMagFilter.LINEAR */) {\n switch (minFilter) {\n case 9728 /* TextureMinFilter.NEAREST */:\n return Texture.LINEAR_NEAREST;\n case 9729 /* TextureMinFilter.LINEAR */:\n return Texture.LINEAR_LINEAR;\n case 9984 /* TextureMinFilter.NEAREST_MIPMAP_NEAREST */:\n return Texture.LINEAR_NEAREST_MIPNEAREST;\n case 9985 /* TextureMinFilter.LINEAR_MIPMAP_NEAREST */:\n return Texture.LINEAR_LINEAR_MIPNEAREST;\n case 9986 /* TextureMinFilter.NEAREST_MIPMAP_LINEAR */:\n return Texture.LINEAR_NEAREST_MIPLINEAR;\n case 9987 /* TextureMinFilter.LINEAR_MIPMAP_LINEAR */:\n return Texture.LINEAR_LINEAR_MIPLINEAR;\n default:\n Logger.Warn(`${context}/minFilter: Invalid value (${minFilter})`);\n return Texture.LINEAR_LINEAR_MIPLINEAR;\n }\n } else {\n if (magFilter !== 9728 /* TextureMagFilter.NEAREST */) {\n Logger.Warn(`${context}/magFilter: Invalid value (${magFilter})`);\n }\n switch (minFilter) {\n case 9728 /* TextureMinFilter.NEAREST */:\n return Texture.NEAREST_NEAREST;\n case 9729 /* TextureMinFilter.LINEAR */:\n return Texture.NEAREST_LINEAR;\n case 9984 /* TextureMinFilter.NEAREST_MIPMAP_NEAREST */:\n return Texture.NEAREST_NEAREST_MIPNEAREST;\n case 9985 /* TextureMinFilter.LINEAR_MIPMAP_NEAREST */:\n return Texture.NEAREST_LINEAR_MIPNEAREST;\n case 9986 /* TextureMinFilter.NEAREST_MIPMAP_LINEAR */:\n return Texture.NEAREST_NEAREST_MIPLINEAR;\n case 9987 /* TextureMinFilter.LINEAR_MIPMAP_LINEAR */:\n return Texture.NEAREST_LINEAR_MIPLINEAR;\n default:\n Logger.Warn(`${context}/minFilter: Invalid value (${minFilter})`);\n return Texture.NEAREST_NEAREST_MIPNEAREST;\n }\n }\n }\n static _GetTypedArrayConstructor(context, componentType) {\n switch (componentType) {\n case 5120 /* AccessorComponentType.BYTE */:\n return Int8Array;\n case 5121 /* AccessorComponentType.UNSIGNED_BYTE */:\n return Uint8Array;\n case 5122 /* AccessorComponentType.SHORT */:\n return Int16Array;\n case 5123 /* AccessorComponentType.UNSIGNED_SHORT */:\n return Uint16Array;\n case 5125 /* AccessorComponentType.UNSIGNED_INT */:\n return Uint32Array;\n case 5126 /* AccessorComponentType.FLOAT */:\n return Float32Array;\n default:\n throw new Error(`${context}: Invalid component type ${componentType}`);\n }\n }\n static _GetTypedArray(context, componentType, bufferView, byteOffset, length) {\n const buffer = bufferView.buffer;\n byteOffset = bufferView.byteOffset + (byteOffset || 0);\n const constructor = GLTFLoader._GetTypedArrayConstructor(`${context}/componentType`, componentType);\n const componentTypeLength = VertexBuffer.GetTypeByteLength(componentType);\n if (byteOffset % componentTypeLength !== 0) {\n // HACK: Copy the buffer if byte offset is not a multiple of component type byte length.\n Logger.Warn(`${context}: Copying buffer as byte offset (${byteOffset}) is not a multiple of component type byte length (${componentTypeLength})`);\n return new constructor(buffer.slice(byteOffset, byteOffset + length * componentTypeLength), 0);\n }\n return new constructor(buffer, byteOffset, length);\n }\n static _GetNumComponents(context, type) {\n switch (type) {\n case \"SCALAR\":\n return 1;\n case \"VEC2\":\n return 2;\n case \"VEC3\":\n return 3;\n case \"VEC4\":\n return 4;\n case \"MAT2\":\n return 4;\n case \"MAT3\":\n return 9;\n case \"MAT4\":\n return 16;\n }\n throw new Error(`${context}: Invalid type (${type})`);\n }\n static _ValidateUri(uri) {\n return Tools.IsBase64(uri) || uri.indexOf(\"..\") === -1;\n }\n /**\n * @internal\n */\n static _GetDrawMode(context, mode) {\n if (mode == undefined) {\n mode = 4 /* MeshPrimitiveMode.TRIANGLES */;\n }\n switch (mode) {\n case 0 /* MeshPrimitiveMode.POINTS */:\n return Material.PointListDrawMode;\n case 1 /* MeshPrimitiveMode.LINES */:\n return Material.LineListDrawMode;\n case 2 /* MeshPrimitiveMode.LINE_LOOP */:\n return Material.LineLoopDrawMode;\n case 3 /* MeshPrimitiveMode.LINE_STRIP */:\n return Material.LineStripDrawMode;\n case 4 /* MeshPrimitiveMode.TRIANGLES */:\n return Material.TriangleFillMode;\n case 5 /* MeshPrimitiveMode.TRIANGLE_STRIP */:\n return Material.TriangleStripDrawMode;\n case 6 /* MeshPrimitiveMode.TRIANGLE_FAN */:\n return Material.TriangleFanDrawMode;\n }\n throw new Error(`${context}: Invalid mesh primitive mode (${mode})`);\n }\n _compileMaterialsAsync() {\n this._parent._startPerformanceCounter(\"Compile materials\");\n const promises = new Array();\n if (this._gltf.materials) {\n for (const material of this._gltf.materials) {\n if (material._data) {\n for (const babylonDrawMode in material._data) {\n const babylonData = material._data[babylonDrawMode];\n for (const babylonMesh of babylonData.babylonMeshes) {\n // Ensure nonUniformScaling is set if necessary.\n babylonMesh.computeWorldMatrix(true);\n const babylonMaterial = babylonData.babylonMaterial;\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh));\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, {\n useInstances: true\n }));\n if (this._parent.useClipPlane) {\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, {\n clipPlane: true\n }));\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, {\n clipPlane: true,\n useInstances: true\n }));\n }\n }\n }\n }\n }\n }\n return Promise.all(promises).then(() => {\n this._parent._endPerformanceCounter(\"Compile materials\");\n });\n }\n _compileShadowGeneratorsAsync() {\n this._parent._startPerformanceCounter(\"Compile shadow generators\");\n const promises = new Array();\n const lights = this._babylonScene.lights;\n for (const light of lights) {\n const generator = light.getShadowGenerator();\n if (generator) {\n promises.push(generator.forceCompilationAsync());\n }\n }\n return Promise.all(promises).then(() => {\n this._parent._endPerformanceCounter(\"Compile shadow generators\");\n });\n }\n _forEachExtensions(action) {\n for (const extension of this._extensions) {\n if (extension.enabled) {\n action(extension);\n }\n }\n }\n _applyExtensions(property, functionName, actionAsync) {\n for (const extension of this._extensions) {\n if (extension.enabled) {\n const id = `${extension.name}.${functionName}`;\n const loaderProperty = property;\n loaderProperty._activeLoaderExtensionFunctions = loaderProperty._activeLoaderExtensionFunctions || {};\n const activeLoaderExtensionFunctions = loaderProperty._activeLoaderExtensionFunctions;\n if (!activeLoaderExtensionFunctions[id]) {\n activeLoaderExtensionFunctions[id] = true;\n try {\n const result = actionAsync(extension);\n if (result) {\n return result;\n }\n } finally {\n delete activeLoaderExtensionFunctions[id];\n }\n }\n }\n }\n return null;\n }\n _extensionsOnLoading() {\n this._forEachExtensions(extension => extension.onLoading && extension.onLoading());\n }\n _extensionsOnReady() {\n this._forEachExtensions(extension => extension.onReady && extension.onReady());\n }\n _extensionsLoadSceneAsync(context, scene) {\n return this._applyExtensions(scene, \"loadScene\", extension => extension.loadSceneAsync && extension.loadSceneAsync(context, scene));\n }\n _extensionsLoadNodeAsync(context, node, assign) {\n return this._applyExtensions(node, \"loadNode\", extension => extension.loadNodeAsync && extension.loadNodeAsync(context, node, assign));\n }\n _extensionsLoadCameraAsync(context, camera, assign) {\n return this._applyExtensions(camera, \"loadCamera\", extension => extension.loadCameraAsync && extension.loadCameraAsync(context, camera, assign));\n }\n _extensionsLoadVertexDataAsync(context, primitive, babylonMesh) {\n return this._applyExtensions(primitive, \"loadVertexData\", extension => extension._loadVertexDataAsync && extension._loadVertexDataAsync(context, primitive, babylonMesh));\n }\n _extensionsLoadMeshPrimitiveAsync(context, name, node, mesh, primitive, assign) {\n return this._applyExtensions(primitive, \"loadMeshPrimitive\", extension => extension._loadMeshPrimitiveAsync && extension._loadMeshPrimitiveAsync(context, name, node, mesh, primitive, assign));\n }\n _extensionsLoadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign) {\n return this._applyExtensions(material, \"loadMaterial\", extension => extension._loadMaterialAsync && extension._loadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign));\n }\n _extensionsCreateMaterial(context, material, babylonDrawMode) {\n return this._applyExtensions(material, \"createMaterial\", extension => extension.createMaterial && extension.createMaterial(context, material, babylonDrawMode));\n }\n _extensionsLoadMaterialPropertiesAsync(context, material, babylonMaterial) {\n return this._applyExtensions(material, \"loadMaterialProperties\", extension => extension.loadMaterialPropertiesAsync && extension.loadMaterialPropertiesAsync(context, material, babylonMaterial));\n }\n _extensionsLoadTextureInfoAsync(context, textureInfo, assign) {\n return this._applyExtensions(textureInfo, \"loadTextureInfo\", extension => extension.loadTextureInfoAsync && extension.loadTextureInfoAsync(context, textureInfo, assign));\n }\n _extensionsLoadTextureAsync(context, texture, assign) {\n return this._applyExtensions(texture, \"loadTexture\", extension => extension._loadTextureAsync && extension._loadTextureAsync(context, texture, assign));\n }\n _extensionsLoadAnimationAsync(context, animation) {\n return this._applyExtensions(animation, \"loadAnimation\", extension => extension.loadAnimationAsync && extension.loadAnimationAsync(context, animation));\n }\n _extensionsLoadAnimationChannelAsync(context, animationContext, animation, channel, onLoad) {\n return this._applyExtensions(animation, \"loadAnimationChannel\", extension => extension._loadAnimationChannelAsync && extension._loadAnimationChannelAsync(context, animationContext, animation, channel, onLoad));\n }\n _extensionsLoadSkinAsync(context, node, skin) {\n return this._applyExtensions(skin, \"loadSkin\", extension => extension._loadSkinAsync && extension._loadSkinAsync(context, node, skin));\n }\n _extensionsLoadUriAsync(context, property, uri) {\n return this._applyExtensions(property, \"loadUri\", extension => extension._loadUriAsync && extension._loadUriAsync(context, property, uri));\n }\n _extensionsLoadBufferViewAsync(context, bufferView) {\n return this._applyExtensions(bufferView, \"loadBufferView\", extension => extension.loadBufferViewAsync && extension.loadBufferViewAsync(context, bufferView));\n }\n _extensionsLoadBufferAsync(context, buffer, byteOffset, byteLength) {\n return this._applyExtensions(buffer, \"loadBuffer\", extension => extension.loadBufferAsync && extension.loadBufferAsync(context, buffer, byteOffset, byteLength));\n }\n /**\n * Helper method called by a loader extension to load an glTF extension.\n * @param context The context when loading the asset\n * @param property The glTF property to load the extension from\n * @param extensionName The name of the extension to load\n * @param actionAsync The action to run\n * @returns The promise returned by actionAsync or null if the extension does not exist\n */\n static LoadExtensionAsync(context, property, extensionName, actionAsync) {\n if (!property.extensions) {\n return null;\n }\n const extensions = property.extensions;\n const extension = extensions[extensionName];\n if (!extension) {\n return null;\n }\n return actionAsync(`${context}/extensions/${extensionName}`, extension);\n }\n /**\n * Helper method called by a loader extension to load a glTF extra.\n * @param context The context when loading the asset\n * @param property The glTF property to load the extra from\n * @param extensionName The name of the extension to load\n * @param actionAsync The action to run\n * @returns The promise returned by actionAsync or null if the extra does not exist\n */\n static LoadExtraAsync(context, property, extensionName, actionAsync) {\n if (!property.extras) {\n return null;\n }\n const extras = property.extras;\n const extra = extras[extensionName];\n if (!extra) {\n return null;\n }\n return actionAsync(`${context}/extras/${extensionName}`, extra);\n }\n /**\n * Checks for presence of an extension.\n * @param name The name of the extension to check\n * @returns A boolean indicating the presence of the given extension name in `extensionsUsed`\n */\n isExtensionUsed(name) {\n return !!this._gltf.extensionsUsed && this._gltf.extensionsUsed.indexOf(name) !== -1;\n }\n /**\n * Increments the indentation level and logs a message.\n * @param message The message to log\n */\n logOpen(message) {\n this._parent._logOpen(message);\n }\n /**\n * Decrements the indentation level.\n */\n logClose() {\n this._parent._logClose();\n }\n /**\n * Logs a message\n * @param message The message to log\n */\n log(message) {\n this._parent._log(message);\n }\n /**\n * Starts a performance counter.\n * @param counterName The name of the performance counter\n */\n startPerformanceCounter(counterName) {\n this._parent._startPerformanceCounter(counterName);\n }\n /**\n * Ends a performance counter.\n * @param counterName The name of the performance counter\n */\n endPerformanceCounter(counterName) {\n this._parent._endPerformanceCounter(counterName);\n }\n}\nGLTFLoader._RegisteredExtensions = {};\n/**\n * The default glTF sampler.\n */\nGLTFLoader.DefaultSampler = {\n index: -1\n};\nGLTFFileLoader._CreateGLTF2Loader = parent => new GLTFLoader(parent);","map":{"version":3,"names":["Deferred","Quaternion","Vector3","Matrix","TmpVectors","Color3","Tools","Camera","FreeCamera","AnimationKeyInterpolation","AnimationGroup","Bone","Skeleton","Material","PBRMaterial","Texture","TransformNode","Buffer","VertexBuffer","Geometry","AbstractMesh","Mesh","MorphTarget","MorphTargetManager","GLTFFileLoader","GLTFLoaderState","GLTFLoaderCoordinateSystemMode","GLTFLoaderAnimationStartMode","DecodeBase64UrlToBinary","IsBase64DataUrl","LoadFileError","Logger","BoundingInfo","nodeAnimationData","mergeDeep","objects","isObject","obj","reduce","prev","Object","keys","forEach","key","pVal","oVal","Array","isArray","concat","ArrayItem","Get","context","array","index","undefined","Error","TryGet","Assign","length","GLTFLoader","RegisterExtension","name","factory","UnregisterExtension","Warn","_RegisteredExtensions","gltf","_gltf","bin","_bin","parent","_parent","babylonScene","_babylonScene","rootBabylonMesh","_rootBabylonMesh","rootUrl","_rootUrl","constructor","_completePromises","_assetContainer","_babylonLights","_disableInstancedMesh","_allMaterialsDirtyRequired","_extensions","_disposed","_fileName","_uniqueRootUrl","_defaultBabylonMaterialData","_postSceneLoadActions","dispose","extension","importMeshAsync","meshesNames","scene","container","data","onProgress","fileName","Promise","resolve","then","_loadData","nodes","nodeMap","node","names","map","_loadAsync","meshes","_getMeshes","particleSystems","skeletons","_getSkeletons","animationGroups","_getAnimationGroups","lights","transformNodes","_getTransformNodes","geometries","_getGeometries","spriteManagers","loadAsync","resultFunc","startsWith","Date","now","_loadExtensions","_checkExtensions","loadingToReadyCounterName","LOADING","READY","loadingToCompleteCounterName","COMPLETE","_startPerformanceCounter","_setState","_extensionsOnLoading","promises","oldBlockMaterialDirtyMechanism","blockMaterialDirtyMechanism","loadOnlyMaterials","push","loadSceneAsync","scenes","skipMaterials","loadAllMaterials","materials","m","material","babylonDrawMode","TriangleFillMode","_loadMaterialAsync","_forceBlockMaterialDirtyMechanism","compileMaterials","_compileMaterialsAsync","compileShadowGenerators","_compileShadowGeneratorsAsync","resultPromise","all","customRootNode","setEnabled","_extensionsOnReady","_startAnimations","result","_endPerformanceCounter","SetImmediate","onCompleteObservable","notifyObservers","clear","error","onErrorObservable","catch","json","_setupData","buffers","uri","binaryBuffer","byteLength","accessors","animations","bufferViews","cameras","images","samplers","skins","textures","nodeParents","children","rootNode","_createRootNode","parentIndex","onExtensionLoadedObservable","sort","a","b","order","Number","MAX_VALUE","extensionsRequired","available","some","enabled","_babylonTransformNode","_blockEntityCollection","rootMesh","_parentContainer","coordinateSystemMode","AUTO","useRightHandedSystem","rotation","scale","_LoadTransform","FORCE_RIGHT_HANDED","onMeshLoadedObservable","extensionPromise","_extensionsLoadSceneAsync","logOpen","loadNodeAsync","babylonMesh","action","_loadAnimationsAsync","logClose","_forEachPrimitive","callback","_primitiveBabylonMeshes","geometry","indexOf","getClassName","_babylonTransformNodeForSkin","skin","_data","babylonSkeleton","animation","_babylonAnimationGroup","animationStartMode","NONE","FIRST","babylonAnimationGroups","start","ALL","babylonAnimationGroup","assign","_extensionsLoadNodeAsync","loadNode","babylonTransformNode","AddPointerMetadata","camera","loadCameraAsync","babylonCamera","childNode","childBabylonMesh","mesh","nodeName","transformNode","_loadMeshAsync","babylonTransformNodeForSkin","metadata","_loadSkinAsync","skeleton","parentNode","onSkinLoadedObservable","skinnedNode","useBoundingInfoFromGeometry","_updateBoundingInfo","refreshBoundingInfo","primitives","primitive","_loadMeshPrimitiveAsync","_extensionsLoadMeshPrimitiveAsync","shouldInstance","createInstances","targets","babylonAbstractMesh","promise","_instanceData","babylonSourceMesh","createInstance","overrideMaterialSideOrientation","CounterClockWiseSideOrientation","ClockWiseSideOrientation","_createMorphTargets","_loadVertexDataAsync","babylonGeometry","_loadMorphTargetsAsync","applyToMesh","_GetDrawMode","mode","babylonMaterial","_createDefaultMaterial","onMaterialLoadedObservable","_extensionsLoadVertexDataAsync","attributes","indices","isUnIndexed","accessor","_loadIndicesAccessorAsync","setIndices","loadAttribute","kind","_delayInfo","_loadVertexAccessorAsync","babylonVertexBuffer","getKind","PositionKind","alwaysComputeBoundingBox","min","max","copyFromFloats","normalized","componentType","divider","oneOverDivider","scaleInPlace","_boundingInfo","setVerticesBuffer","count","MatricesIndicesExtraKind","numBoneInfluencers","NormalKind","TangentKind","UVKind","UV2Kind","UV3Kind","UV4Kind","UV5Kind","UV6Kind","MatricesIndicesKind","MatricesWeightsKind","MatricesWeightsExtraKind","ColorKind","type","hasVertexAlpha","_numMorphTargets","targetNames","extras","morphTargetManager","areUpdatesFrozen","weight","weights","addTarget","getScene","numTargets","babylonMorphTarget","getTarget","_loadMorphTargetVertexDataAsync","attribute","setData","getVertexBuffer","_loadFloatAccessorAsync","positions","Float32Array","value","setPositions","normals","setNormals","tangents","dataIndex","setTangents","babylonNode","position","Zero","Identity","scaling","One","matrix","FromArray","decompose","translation","rotationQuaternion","_extensionsLoadSkinAsync","skeletonId","_loadBones","_loadSkinInverseBindMatricesDataAsync","inverseBindMatricesData","_updateBoneMatrices","alwaysComputeSkeletonRootNode","_findSkeletonRootNode","joints","isParent","skeletonNode","babylonBones","_loadBone","paths","path","unshift","i","j","babylonBone","parentBabylonBone","boneIndex","_getNodeMatrix","linkTransformNode","inverseBindMatrices","bones","baseMatrix","_index","FromArrayToRef","invertToRef","babylonParentBone","getParent","multiplyToRef","getAbsoluteInverseBindMatrix","updateMatrix","_updateAbsoluteBindMatrices","Compose","_extensionsLoadCameraAsync","ignoreParentScaling","_babylonCamera","set","Math","PI","perspective","fov","yfov","minZ","znear","maxZ","zfar","orthographic","ORTHOGRAPHIC_CAMERA","orthoLeft","xmag","orthoRight","orthoBottom","ymag","orthoTop","onCameraLoadedObservable","loadAnimationAsync","animationGroup","targetedAnimations","_extensionsLoadAnimationAsync","channels","channel","_loadAnimationChannelAsync","babylonTarget","babylonAnimation","addTargetedAnimation","normalize","animationContext","onLoad","_extensionsLoadAnimationChannelAsync","target","targetNode","properties","targetInfo","object","info","_loadAnimationChannelFromTargetInfoAsync","fps","targetFps","invfps","sampler","_loadAnimationSamplerAsync","numAnimations","propertyInfos","propertyInfo","stride","getStride","input","output","outputOffset","interpolation","getValue","frame","STEP","inTangent","outTangent","buildAnimations","babylonAnimatable","inputAccessor","outputAccessor","inputData","outputData","loadBufferAsync","buffer","byteOffset","_extensionsLoadBufferAsync","loadUriAsync","readAsync","Uint8Array","e","message","loadBufferViewAsync","bufferView","_extensionsLoadBufferViewAsync","_loadAccessorAsync","numComponents","_GetNumComponents","byteStride","GetTypeByteLength","_GetTypedArray","typedArray","ForEach","sparse","indicesBufferView","valuesBufferView","values","indicesData","valuesData","sparseLength","sparseData","valuesIndex","indicesIndex","componentIndex","_GetTypedArrayConstructor","_loadVertexBufferViewAsync","_babylonBuffer","engine","getEngine","_accessor$_babylonVer","_babylonVertexBuffer","babylonBuffer","_loadMaterialMetallicRoughnessPropertiesAsync","baseColorFactor","albedoColor","alpha","White","metallic","metallicFactor","roughness","roughnessFactor","baseColorTexture","loadTextureInfoAsync","texture","albedoTexture","metallicRoughnessTexture","nonColorData","metallicTexture","useMetallnessFromMetallicTextureBlue","useRoughnessFromMetallicTextureGreen","useRoughnessFromMetallicTextureAlpha","_extensionsLoadMaterialAsync","babylonData","createMaterial","babylonMeshes","loadMaterialPropertiesAsync","onDisposeObservable","addOnce","splice","fillMode","enableSpecularAntiAliasing","useRadianceOverAlpha","transparencyAsCoverage","useSpecularOverAlpha","transparencyMode","PBRMATERIAL_OPAQUE","_extensionsCreateMaterial","_extensionsLoadMaterialPropertiesAsync","loadMaterialBasePropertiesAsync","pbrMetallicRoughness","loadMaterialAlphaProperties","emissiveColor","emissiveFactor","doubleSided","backFaceCulling","twoSidedLighting","normalTexture","bumpTexture","invertNormalMapX","invertNormalMapY","level","forceIrradianceInFragment","occlusionTexture","ambientTexture","useAmbientInGrayScale","strength","ambientTextureStrength","emissiveTexture","alphaMode","PBRMATERIAL_ALPHATEST","alphaCutOff","alphaCutoff","hasAlpha","PBRMATERIAL_ALPHABLEND","useAlphaFromAlbedoTexture","textureInfo","_extensionsLoadTextureInfoAsync","texCoord","_textureInfo","_loadTextureAsync","babylonTexture","coordinatesIndex","onTextureLoadedObservable","_extensionsLoadTextureAsync","DefaultSampler","image","source","_createTextureAsync","textureLoaderOptions","useSRGBBuffer","samplerData","_loadSampler","deferred","textureCreationOptions","noMipmap","noMipMaps","invertY","samplingMode","onError","exception","reject","mimeType","loaderOptions","useSRGBBuffers","loadImageAsync","dataUrl","updateURL","wrapU","wrapV","minFilter","_GetTextureSamplingMode","_GetTextureWrapMode","wrapS","wrapT","property","_extensionsLoadUriAsync","_ValidateUri","log","substr","preprocessUrlAsync","url","_loadFile","request","status","statusText","babylonObject","pointer","_internalMetadata","pointers","CLAMP_ADDRESSMODE","MIRROR_ADDRESSMODE","WRAP_ADDRESSMODE","magFilter","LINEAR_NEAREST","LINEAR_LINEAR","LINEAR_NEAREST_MIPNEAREST","LINEAR_LINEAR_MIPNEAREST","LINEAR_NEAREST_MIPLINEAR","LINEAR_LINEAR_MIPLINEAR","NEAREST_NEAREST","NEAREST_LINEAR","NEAREST_NEAREST_MIPNEAREST","NEAREST_LINEAR_MIPNEAREST","NEAREST_NEAREST_MIPLINEAR","NEAREST_LINEAR_MIPLINEAR","Int8Array","Int16Array","Uint16Array","Uint32Array","componentTypeLength","slice","IsBase64","PointListDrawMode","LineListDrawMode","LineLoopDrawMode","LineStripDrawMode","TriangleStripDrawMode","TriangleFanDrawMode","computeWorldMatrix","forceCompilationAsync","useInstances","useClipPlane","clipPlane","light","generator","getShadowGenerator","_forEachExtensions","_applyExtensions","functionName","actionAsync","id","loaderProperty","_activeLoaderExtensionFunctions","activeLoaderExtensionFunctions","onLoading","onReady","_loadUriAsync","LoadExtensionAsync","extensionName","extensions","LoadExtraAsync","extra","isExtensionUsed","extensionsUsed","_logOpen","_logClose","_log","startPerformanceCounter","counterName","endPerformanceCounter","_CreateGLTF2Loader"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/@babylonjs/loaders/glTF/2.0/glTFLoader.js"],"sourcesContent":["import { Deferred } from \"@babylonjs/core/Misc/deferred.js\";\nimport { Quaternion, Vector3, Matrix, TmpVectors } from \"@babylonjs/core/Maths/math.vector.js\";\nimport { Color3 } from \"@babylonjs/core/Maths/math.color.js\";\nimport { Tools } from \"@babylonjs/core/Misc/tools.js\";\nimport { Camera } from \"@babylonjs/core/Cameras/camera.js\";\nimport { FreeCamera } from \"@babylonjs/core/Cameras/freeCamera.js\";\nimport { AnimationKeyInterpolation } from \"@babylonjs/core/Animations/animationKey.js\";\nimport { AnimationGroup } from \"@babylonjs/core/Animations/animationGroup.js\";\nimport { Bone } from \"@babylonjs/core/Bones/bone.js\";\nimport { Skeleton } from \"@babylonjs/core/Bones/skeleton.js\";\nimport { Material } from \"@babylonjs/core/Materials/material.js\";\nimport { PBRMaterial } from \"@babylonjs/core/Materials/PBR/pbrMaterial.js\";\nimport { Texture } from \"@babylonjs/core/Materials/Textures/texture.js\";\nimport { TransformNode } from \"@babylonjs/core/Meshes/transformNode.js\";\nimport { Buffer, VertexBuffer } from \"@babylonjs/core/Buffers/buffer.js\";\nimport { Geometry } from \"@babylonjs/core/Meshes/geometry.js\";\nimport { AbstractMesh } from \"@babylonjs/core/Meshes/abstractMesh.js\";\nimport { Mesh } from \"@babylonjs/core/Meshes/mesh.js\";\nimport { MorphTarget } from \"@babylonjs/core/Morph/morphTarget.js\";\nimport { MorphTargetManager } from \"@babylonjs/core/Morph/morphTargetManager.js\";\nimport { GLTFFileLoader, GLTFLoaderState, GLTFLoaderCoordinateSystemMode, GLTFLoaderAnimationStartMode } from \"../glTFFileLoader.js\";\nimport { DecodeBase64UrlToBinary, IsBase64DataUrl, LoadFileError } from \"@babylonjs/core/Misc/fileTools.js\";\nimport { Logger } from \"@babylonjs/core/Misc/logger.js\";\nimport { BoundingInfo } from \"@babylonjs/core/Culling/boundingInfo.js\";\nimport { nodeAnimationData } from \"./glTFLoaderAnimation.js\";\n// https://stackoverflow.com/a/48218209\nfunction mergeDeep(...objects) {\n const isObject = (obj) => obj && typeof obj === \"object\";\n return objects.reduce((prev, obj) => {\n Object.keys(obj).forEach((key) => {\n const pVal = prev[key];\n const oVal = obj[key];\n if (Array.isArray(pVal) && Array.isArray(oVal)) {\n prev[key] = pVal.concat(...oVal);\n }\n else if (isObject(pVal) && isObject(oVal)) {\n prev[key] = mergeDeep(pVal, oVal);\n }\n else {\n prev[key] = oVal;\n }\n });\n return prev;\n }, {});\n}\n/**\n * Helper class for working with arrays when loading the glTF asset\n */\nexport class ArrayItem {\n /**\n * Gets an item from the given array.\n * @param context The context when loading the asset\n * @param array The array to get the item from\n * @param index The index to the array\n * @returns The array item\n */\n static Get(context, array, index) {\n if (!array || index == undefined || !array[index]) {\n throw new Error(`${context}: Failed to find index (${index})`);\n }\n return array[index];\n }\n /**\n * Gets an item from the given array or returns null if not available.\n * @param array The array to get the item from\n * @param index The index to the array\n * @returns The array item or null\n */\n static TryGet(array, index) {\n if (!array || index == undefined || !array[index]) {\n return null;\n }\n return array[index];\n }\n /**\n * Assign an `index` field to each item of the given array.\n * @param array The array of items\n */\n static Assign(array) {\n if (array) {\n for (let index = 0; index < array.length; index++) {\n array[index].index = index;\n }\n }\n }\n}\n/**\n * The glTF 2.0 loader\n */\nexport class GLTFLoader {\n /**\n * Registers a loader extension.\n * @param name The name of the loader extension.\n * @param factory The factory function that creates the loader extension.\n */\n static RegisterExtension(name, factory) {\n if (GLTFLoader.UnregisterExtension(name)) {\n Logger.Warn(`Extension with the name '${name}' already exists`);\n }\n GLTFLoader._RegisteredExtensions[name] = {\n factory: factory,\n };\n }\n /**\n * Unregisters a loader extension.\n * @param name The name of the loader extension.\n * @returns A boolean indicating whether the extension has been unregistered\n */\n static UnregisterExtension(name) {\n if (!GLTFLoader._RegisteredExtensions[name]) {\n return false;\n }\n delete GLTFLoader._RegisteredExtensions[name];\n return true;\n }\n /**\n * The object that represents the glTF JSON.\n */\n get gltf() {\n if (!this._gltf) {\n throw new Error(\"glTF JSON is not available\");\n }\n return this._gltf;\n }\n /**\n * The BIN chunk of a binary glTF.\n */\n get bin() {\n return this._bin;\n }\n /**\n * The parent file loader.\n */\n get parent() {\n return this._parent;\n }\n /**\n * The Babylon scene when loading the asset.\n */\n get babylonScene() {\n if (!this._babylonScene) {\n throw new Error(\"Scene is not available\");\n }\n return this._babylonScene;\n }\n /**\n * The root Babylon node when loading the asset.\n */\n get rootBabylonMesh() {\n return this._rootBabylonMesh;\n }\n /**\n * The root url when loading the asset.\n */\n get rootUrl() {\n return this._rootUrl;\n }\n /**\n * @internal\n */\n constructor(parent) {\n /** @internal */\n this._completePromises = new Array();\n /** @internal */\n this._assetContainer = null;\n /** Storage */\n this._babylonLights = [];\n /** @internal */\n this._disableInstancedMesh = 0;\n /** @internal */\n this._allMaterialsDirtyRequired = false;\n this._extensions = new Array();\n this._disposed = false;\n this._rootUrl = null;\n this._fileName = null;\n this._uniqueRootUrl = null;\n this._bin = null;\n this._rootBabylonMesh = null;\n this._defaultBabylonMaterialData = {};\n this._postSceneLoadActions = new Array();\n this._parent = parent;\n }\n /** @internal */\n dispose() {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._completePromises.length = 0;\n this._extensions.forEach((extension) => extension.dispose && extension.dispose());\n this._extensions.length = 0;\n this._gltf = null; // TODO\n this._bin = null;\n this._babylonScene = null; // TODO\n this._rootBabylonMesh = null;\n this._defaultBabylonMaterialData = {};\n this._postSceneLoadActions.length = 0;\n this._parent.dispose();\n }\n /**\n * @internal\n */\n importMeshAsync(meshesNames, scene, container, data, rootUrl, onProgress, fileName = \"\") {\n return Promise.resolve().then(() => {\n this._babylonScene = scene;\n this._assetContainer = container;\n this._loadData(data);\n let nodes = null;\n if (meshesNames) {\n const nodeMap = {};\n if (this._gltf.nodes) {\n for (const node of this._gltf.nodes) {\n if (node.name) {\n nodeMap[node.name] = node.index;\n }\n }\n }\n const names = meshesNames instanceof Array ? meshesNames : [meshesNames];\n nodes = names.map((name) => {\n const node = nodeMap[name];\n if (node === undefined) {\n throw new Error(`Failed to find node '${name}'`);\n }\n return node;\n });\n }\n return this._loadAsync(rootUrl, fileName, nodes, () => {\n return {\n meshes: this._getMeshes(),\n particleSystems: [],\n skeletons: this._getSkeletons(),\n animationGroups: this._getAnimationGroups(),\n lights: this._babylonLights,\n transformNodes: this._getTransformNodes(),\n geometries: this._getGeometries(),\n spriteManagers: [],\n };\n });\n });\n }\n /**\n * @internal\n */\n loadAsync(scene, data, rootUrl, onProgress, fileName = \"\") {\n return Promise.resolve().then(() => {\n this._babylonScene = scene;\n this._loadData(data);\n return this._loadAsync(rootUrl, fileName, null, () => undefined);\n });\n }\n _loadAsync(rootUrl, fileName, nodes, resultFunc) {\n return Promise.resolve()\n .then(() => {\n this._rootUrl = rootUrl;\n this._uniqueRootUrl = !rootUrl.startsWith(\"file:\") && fileName ? rootUrl : `${rootUrl}${Date.now()}/`;\n this._fileName = fileName;\n this._allMaterialsDirtyRequired = false;\n this._loadExtensions();\n this._checkExtensions();\n const loadingToReadyCounterName = `${GLTFLoaderState[GLTFLoaderState.LOADING]} => ${GLTFLoaderState[GLTFLoaderState.READY]}`;\n const loadingToCompleteCounterName = `${GLTFLoaderState[GLTFLoaderState.LOADING]} => ${GLTFLoaderState[GLTFLoaderState.COMPLETE]}`;\n this._parent._startPerformanceCounter(loadingToReadyCounterName);\n this._parent._startPerformanceCounter(loadingToCompleteCounterName);\n this._parent._setState(GLTFLoaderState.LOADING);\n this._extensionsOnLoading();\n const promises = new Array();\n // Block the marking of materials dirty until the scene is loaded.\n const oldBlockMaterialDirtyMechanism = this._babylonScene.blockMaterialDirtyMechanism;\n this._babylonScene.blockMaterialDirtyMechanism = true;\n if (!this.parent.loadOnlyMaterials) {\n if (nodes) {\n promises.push(this.loadSceneAsync(\"/nodes\", { nodes: nodes, index: -1 }));\n }\n else if (this._gltf.scene != undefined || (this._gltf.scenes && this._gltf.scenes[0])) {\n const scene = ArrayItem.Get(`/scene`, this._gltf.scenes, this._gltf.scene || 0);\n promises.push(this.loadSceneAsync(`/scenes/${scene.index}`, scene));\n }\n }\n if (!this.parent.skipMaterials && this.parent.loadAllMaterials && this._gltf.materials) {\n for (let m = 0; m < this._gltf.materials.length; ++m) {\n const material = this._gltf.materials[m];\n const context = \"/materials/\" + m;\n const babylonDrawMode = Material.TriangleFillMode;\n promises.push(this._loadMaterialAsync(context, material, null, babylonDrawMode, () => { }));\n }\n }\n // Restore the blocking of material dirty.\n if (this._allMaterialsDirtyRequired) {\n // This can happen if we add a light for instance as it will impact the whole scene.\n // This automatically resets everything if needed.\n this._babylonScene.blockMaterialDirtyMechanism = oldBlockMaterialDirtyMechanism;\n }\n else {\n // By default a newly created material is dirty so there is no need to flag the full scene as dirty.\n // For perf reasons, we then bypass blockMaterialDirtyMechanism as this would \"dirty\" the entire scene.\n this._babylonScene._forceBlockMaterialDirtyMechanism(oldBlockMaterialDirtyMechanism);\n }\n if (this._parent.compileMaterials) {\n promises.push(this._compileMaterialsAsync());\n }\n if (this._parent.compileShadowGenerators) {\n promises.push(this._compileShadowGeneratorsAsync());\n }\n const resultPromise = Promise.all(promises).then(() => {\n if (this._rootBabylonMesh && this._rootBabylonMesh !== this._parent.customRootNode) {\n this._rootBabylonMesh.setEnabled(true);\n }\n this._extensionsOnReady();\n this._parent._setState(GLTFLoaderState.READY);\n this._startAnimations();\n return resultFunc();\n });\n return resultPromise.then((result) => {\n this._parent._endPerformanceCounter(loadingToReadyCounterName);\n Tools.SetImmediate(() => {\n if (!this._disposed) {\n Promise.all(this._completePromises).then(() => {\n this._parent._endPerformanceCounter(loadingToCompleteCounterName);\n this._parent._setState(GLTFLoaderState.COMPLETE);\n this._parent.onCompleteObservable.notifyObservers(undefined);\n this._parent.onCompleteObservable.clear();\n this.dispose();\n }, (error) => {\n this._parent.onErrorObservable.notifyObservers(error);\n this._parent.onErrorObservable.clear();\n this.dispose();\n });\n }\n });\n return result;\n });\n })\n .catch((error) => {\n if (!this._disposed) {\n this._parent.onErrorObservable.notifyObservers(error);\n this._parent.onErrorObservable.clear();\n this.dispose();\n }\n throw error;\n });\n }\n _loadData(data) {\n this._gltf = data.json;\n this._setupData();\n if (data.bin) {\n const buffers = this._gltf.buffers;\n if (buffers && buffers[0] && !buffers[0].uri) {\n const binaryBuffer = buffers[0];\n if (binaryBuffer.byteLength < data.bin.byteLength - 3 || binaryBuffer.byteLength > data.bin.byteLength) {\n Logger.Warn(`Binary buffer length (${binaryBuffer.byteLength}) from JSON does not match chunk length (${data.bin.byteLength})`);\n }\n this._bin = data.bin;\n }\n else {\n Logger.Warn(\"Unexpected BIN chunk\");\n }\n }\n }\n _setupData() {\n ArrayItem.Assign(this._gltf.accessors);\n ArrayItem.Assign(this._gltf.animations);\n ArrayItem.Assign(this._gltf.buffers);\n ArrayItem.Assign(this._gltf.bufferViews);\n ArrayItem.Assign(this._gltf.cameras);\n ArrayItem.Assign(this._gltf.images);\n ArrayItem.Assign(this._gltf.materials);\n ArrayItem.Assign(this._gltf.meshes);\n ArrayItem.Assign(this._gltf.nodes);\n ArrayItem.Assign(this._gltf.samplers);\n ArrayItem.Assign(this._gltf.scenes);\n ArrayItem.Assign(this._gltf.skins);\n ArrayItem.Assign(this._gltf.textures);\n if (this._gltf.nodes) {\n const nodeParents = {};\n for (const node of this._gltf.nodes) {\n if (node.children) {\n for (const index of node.children) {\n nodeParents[index] = node.index;\n }\n }\n }\n const rootNode = this._createRootNode();\n for (const node of this._gltf.nodes) {\n const parentIndex = nodeParents[node.index];\n node.parent = parentIndex === undefined ? rootNode : this._gltf.nodes[parentIndex];\n }\n }\n }\n _loadExtensions() {\n for (const name in GLTFLoader._RegisteredExtensions) {\n const extension = GLTFLoader._RegisteredExtensions[name].factory(this);\n if (extension.name !== name) {\n Logger.Warn(`The name of the glTF loader extension instance does not match the registered name: ${extension.name} !== ${name}`);\n }\n this._extensions.push(extension);\n this._parent.onExtensionLoadedObservable.notifyObservers(extension);\n }\n this._extensions.sort((a, b) => (a.order || Number.MAX_VALUE) - (b.order || Number.MAX_VALUE));\n this._parent.onExtensionLoadedObservable.clear();\n }\n _checkExtensions() {\n if (this._gltf.extensionsRequired) {\n for (const name of this._gltf.extensionsRequired) {\n const available = this._extensions.some((extension) => extension.name === name && extension.enabled);\n if (!available) {\n throw new Error(`Required extension ${name} is not available`);\n }\n }\n }\n }\n _createRootNode() {\n if (this._parent.customRootNode !== undefined) {\n this._rootBabylonMesh = this._parent.customRootNode;\n return {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n _babylonTransformNode: this._rootBabylonMesh === null ? undefined : this._rootBabylonMesh,\n index: -1,\n };\n }\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const rootMesh = new Mesh(\"__root__\", this._babylonScene);\n this._rootBabylonMesh = rootMesh;\n this._rootBabylonMesh._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n this._rootBabylonMesh.setEnabled(false);\n const rootNode = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n _babylonTransformNode: this._rootBabylonMesh,\n index: -1,\n };\n switch (this._parent.coordinateSystemMode) {\n case GLTFLoaderCoordinateSystemMode.AUTO: {\n if (!this._babylonScene.useRightHandedSystem) {\n rootNode.rotation = [0, 1, 0, 0];\n rootNode.scale = [1, 1, -1];\n GLTFLoader._LoadTransform(rootNode, this._rootBabylonMesh);\n }\n break;\n }\n case GLTFLoaderCoordinateSystemMode.FORCE_RIGHT_HANDED: {\n this._babylonScene.useRightHandedSystem = true;\n break;\n }\n default: {\n throw new Error(`Invalid coordinate system mode (${this._parent.coordinateSystemMode})`);\n }\n }\n this._parent.onMeshLoadedObservable.notifyObservers(rootMesh);\n return rootNode;\n }\n /**\n * Loads a glTF scene.\n * @param context The context when loading the asset\n * @param scene The glTF scene property\n * @returns A promise that resolves when the load is complete\n */\n loadSceneAsync(context, scene) {\n const extensionPromise = this._extensionsLoadSceneAsync(context, scene);\n if (extensionPromise) {\n return extensionPromise;\n }\n const promises = new Array();\n this.logOpen(`${context} ${scene.name || \"\"}`);\n if (scene.nodes) {\n for (const index of scene.nodes) {\n const node = ArrayItem.Get(`${context}/nodes/${index}`, this._gltf.nodes, index);\n promises.push(this.loadNodeAsync(`/nodes/${node.index}`, node, (babylonMesh) => {\n babylonMesh.parent = this._rootBabylonMesh;\n }));\n }\n }\n for (const action of this._postSceneLoadActions) {\n action();\n }\n promises.push(this._loadAnimationsAsync());\n this.logClose();\n return Promise.all(promises).then(() => { });\n }\n _forEachPrimitive(node, callback) {\n if (node._primitiveBabylonMeshes) {\n for (const babylonMesh of node._primitiveBabylonMeshes) {\n callback(babylonMesh);\n }\n }\n }\n _getGeometries() {\n const geometries = [];\n const nodes = this._gltf.nodes;\n if (nodes) {\n for (const node of nodes) {\n this._forEachPrimitive(node, (babylonMesh) => {\n const geometry = babylonMesh.geometry;\n if (geometry && geometries.indexOf(geometry) === -1) {\n geometries.push(geometry);\n }\n });\n }\n }\n return geometries;\n }\n _getMeshes() {\n const meshes = [];\n // Root mesh is always first, if available.\n if (this._rootBabylonMesh instanceof AbstractMesh) {\n meshes.push(this._rootBabylonMesh);\n }\n const nodes = this._gltf.nodes;\n if (nodes) {\n for (const node of nodes) {\n this._forEachPrimitive(node, (babylonMesh) => {\n meshes.push(babylonMesh);\n });\n }\n }\n return meshes;\n }\n _getTransformNodes() {\n const transformNodes = [];\n const nodes = this._gltf.nodes;\n if (nodes) {\n for (const node of nodes) {\n if (node._babylonTransformNode && node._babylonTransformNode.getClassName() === \"TransformNode\") {\n transformNodes.push(node._babylonTransformNode);\n }\n if (node._babylonTransformNodeForSkin) {\n transformNodes.push(node._babylonTransformNodeForSkin);\n }\n }\n }\n return transformNodes;\n }\n _getSkeletons() {\n const skeletons = [];\n const skins = this._gltf.skins;\n if (skins) {\n for (const skin of skins) {\n if (skin._data) {\n skeletons.push(skin._data.babylonSkeleton);\n }\n }\n }\n return skeletons;\n }\n _getAnimationGroups() {\n const animationGroups = [];\n const animations = this._gltf.animations;\n if (animations) {\n for (const animation of animations) {\n if (animation._babylonAnimationGroup) {\n animationGroups.push(animation._babylonAnimationGroup);\n }\n }\n }\n return animationGroups;\n }\n _startAnimations() {\n switch (this._parent.animationStartMode) {\n case GLTFLoaderAnimationStartMode.NONE: {\n // do nothing\n break;\n }\n case GLTFLoaderAnimationStartMode.FIRST: {\n const babylonAnimationGroups = this._getAnimationGroups();\n if (babylonAnimationGroups.length !== 0) {\n babylonAnimationGroups[0].start(true);\n }\n break;\n }\n case GLTFLoaderAnimationStartMode.ALL: {\n const babylonAnimationGroups = this._getAnimationGroups();\n for (const babylonAnimationGroup of babylonAnimationGroups) {\n babylonAnimationGroup.start(true);\n }\n break;\n }\n default: {\n Logger.Error(`Invalid animation start mode (${this._parent.animationStartMode})`);\n return;\n }\n }\n }\n /**\n * Loads a glTF node.\n * @param context The context when loading the asset\n * @param node The glTF node property\n * @param assign A function called synchronously after parsing the glTF properties\n * @returns A promise that resolves with the loaded Babylon mesh when the load is complete\n */\n loadNodeAsync(context, node, assign = () => { }) {\n const extensionPromise = this._extensionsLoadNodeAsync(context, node, assign);\n if (extensionPromise) {\n return extensionPromise;\n }\n if (node._babylonTransformNode) {\n throw new Error(`${context}: Invalid recursive node hierarchy`);\n }\n const promises = new Array();\n this.logOpen(`${context} ${node.name || \"\"}`);\n const loadNode = (babylonTransformNode) => {\n GLTFLoader.AddPointerMetadata(babylonTransformNode, context);\n GLTFLoader._LoadTransform(node, babylonTransformNode);\n if (node.camera != undefined) {\n const camera = ArrayItem.Get(`${context}/camera`, this._gltf.cameras, node.camera);\n promises.push(this.loadCameraAsync(`/cameras/${camera.index}`, camera, (babylonCamera) => {\n babylonCamera.parent = babylonTransformNode;\n }));\n }\n if (node.children) {\n for (const index of node.children) {\n const childNode = ArrayItem.Get(`${context}/children/${index}`, this._gltf.nodes, index);\n promises.push(this.loadNodeAsync(`/nodes/${childNode.index}`, childNode, (childBabylonMesh) => {\n childBabylonMesh.parent = babylonTransformNode;\n }));\n }\n }\n assign(babylonTransformNode);\n };\n if (node.mesh == undefined || node.skin != undefined) {\n const nodeName = node.name || `node${node.index}`;\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const transformNode = new TransformNode(nodeName, this._babylonScene);\n transformNode._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n if (node.mesh == undefined) {\n node._babylonTransformNode = transformNode;\n }\n else {\n node._babylonTransformNodeForSkin = transformNode;\n }\n loadNode(transformNode);\n }\n if (node.mesh != undefined) {\n if (node.skin == undefined) {\n const mesh = ArrayItem.Get(`${context}/mesh`, this._gltf.meshes, node.mesh);\n promises.push(this._loadMeshAsync(`/meshes/${mesh.index}`, node, mesh, loadNode));\n }\n else {\n // See https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins (second implementation note)\n // This code path will place the skinned mesh as a sibling of the skeleton root node without loading the\n // transform, which effectively ignores the transform of the skinned mesh, as per spec.\n const mesh = ArrayItem.Get(`${context}/mesh`, this._gltf.meshes, node.mesh);\n promises.push(this._loadMeshAsync(`/meshes/${mesh.index}`, node, mesh, (babylonTransformNode) => {\n const babylonTransformNodeForSkin = node._babylonTransformNodeForSkin;\n // Merge the metadata from the skin node to the skinned mesh in case a loader extension added metadata.\n babylonTransformNode.metadata = mergeDeep(babylonTransformNodeForSkin.metadata, babylonTransformNode.metadata || {});\n const skin = ArrayItem.Get(`${context}/skin`, this._gltf.skins, node.skin);\n promises.push(this._loadSkinAsync(`/skins/${skin.index}`, node, skin, (babylonSkeleton) => {\n this._forEachPrimitive(node, (babylonMesh) => {\n babylonMesh.skeleton = babylonSkeleton;\n });\n // Wait until all the nodes are parented before parenting the skinned mesh.\n this._postSceneLoadActions.push(() => {\n if (skin.skeleton != undefined) {\n // Place the skinned mesh node as a sibling of the skeleton root node.\n // Handle special case when the parent of the skeleton root is the skinned mesh.\n const parentNode = ArrayItem.Get(`/skins/${skin.index}/skeleton`, this._gltf.nodes, skin.skeleton).parent;\n if (node.index === parentNode.index) {\n babylonTransformNode.parent = babylonTransformNodeForSkin.parent;\n }\n else {\n babylonTransformNode.parent = parentNode._babylonTransformNode;\n }\n }\n else {\n babylonTransformNode.parent = this._rootBabylonMesh;\n }\n this._parent.onSkinLoadedObservable.notifyObservers({ node: babylonTransformNodeForSkin, skinnedNode: babylonTransformNode });\n });\n }));\n }));\n }\n }\n this.logClose();\n return Promise.all(promises).then(() => {\n this._forEachPrimitive(node, (babylonMesh) => {\n if (babylonMesh.geometry && babylonMesh.geometry.useBoundingInfoFromGeometry) {\n // simply apply the world matrices to the bounding info - the extends are already ok\n babylonMesh._updateBoundingInfo();\n }\n else {\n babylonMesh.refreshBoundingInfo(true, true);\n }\n });\n return node._babylonTransformNode;\n });\n }\n _loadMeshAsync(context, node, mesh, assign) {\n const primitives = mesh.primitives;\n if (!primitives || !primitives.length) {\n throw new Error(`${context}: Primitives are missing`);\n }\n if (primitives[0].index == undefined) {\n ArrayItem.Assign(primitives);\n }\n const promises = new Array();\n this.logOpen(`${context} ${mesh.name || \"\"}`);\n const name = node.name || `node${node.index}`;\n if (primitives.length === 1) {\n const primitive = mesh.primitives[0];\n promises.push(this._loadMeshPrimitiveAsync(`${context}/primitives/${primitive.index}`, name, node, mesh, primitive, (babylonMesh) => {\n node._babylonTransformNode = babylonMesh;\n node._primitiveBabylonMeshes = [babylonMesh];\n }));\n }\n else {\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n node._babylonTransformNode = new TransformNode(name, this._babylonScene);\n node._babylonTransformNode._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n node._primitiveBabylonMeshes = [];\n for (const primitive of primitives) {\n promises.push(this._loadMeshPrimitiveAsync(`${context}/primitives/${primitive.index}`, `${name}_primitive${primitive.index}`, node, mesh, primitive, (babylonMesh) => {\n babylonMesh.parent = node._babylonTransformNode;\n node._primitiveBabylonMeshes.push(babylonMesh);\n }));\n }\n }\n assign(node._babylonTransformNode);\n this.logClose();\n return Promise.all(promises).then(() => {\n return node._babylonTransformNode;\n });\n }\n /**\n * @internal Define this method to modify the default behavior when loading data for mesh primitives.\n * @param context The context when loading the asset\n * @param name The mesh name when loading the asset\n * @param node The glTF node when loading the asset\n * @param mesh The glTF mesh when loading the asset\n * @param primitive The glTF mesh primitive property\n * @param assign A function called synchronously after parsing the glTF properties\n * @returns A promise that resolves with the loaded mesh when the load is complete or null if not handled\n */\n _loadMeshPrimitiveAsync(context, name, node, mesh, primitive, assign) {\n const extensionPromise = this._extensionsLoadMeshPrimitiveAsync(context, name, node, mesh, primitive, assign);\n if (extensionPromise) {\n return extensionPromise;\n }\n this.logOpen(`${context}`);\n const shouldInstance = this._disableInstancedMesh === 0 && this._parent.createInstances && node.skin == undefined && !mesh.primitives[0].targets;\n let babylonAbstractMesh;\n let promise;\n if (shouldInstance && primitive._instanceData) {\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n babylonAbstractMesh = primitive._instanceData.babylonSourceMesh.createInstance(name);\n babylonAbstractMesh._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n promise = primitive._instanceData.promise;\n }\n else {\n const promises = new Array();\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const babylonMesh = new Mesh(name, this._babylonScene);\n babylonMesh._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n babylonMesh.overrideMaterialSideOrientation = this._babylonScene.useRightHandedSystem ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation;\n this._createMorphTargets(context, node, mesh, primitive, babylonMesh);\n promises.push(this._loadVertexDataAsync(context, primitive, babylonMesh).then((babylonGeometry) => {\n return this._loadMorphTargetsAsync(context, primitive, babylonMesh, babylonGeometry).then(() => {\n if (this._disposed) {\n return;\n }\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n babylonGeometry.applyToMesh(babylonMesh);\n babylonGeometry._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n });\n }));\n const babylonDrawMode = GLTFLoader._GetDrawMode(context, primitive.mode);\n if (primitive.material == undefined) {\n let babylonMaterial = this._defaultBabylonMaterialData[babylonDrawMode];\n if (!babylonMaterial) {\n babylonMaterial = this._createDefaultMaterial(\"__GLTFLoader._default\", babylonDrawMode);\n this._parent.onMaterialLoadedObservable.notifyObservers(babylonMaterial);\n this._defaultBabylonMaterialData[babylonDrawMode] = babylonMaterial;\n }\n babylonMesh.material = babylonMaterial;\n }\n else if (!this.parent.skipMaterials) {\n const material = ArrayItem.Get(`${context}/material`, this._gltf.materials, primitive.material);\n promises.push(this._loadMaterialAsync(`/materials/${material.index}`, material, babylonMesh, babylonDrawMode, (babylonMaterial) => {\n babylonMesh.material = babylonMaterial;\n }));\n }\n promise = Promise.all(promises);\n if (shouldInstance) {\n primitive._instanceData = {\n babylonSourceMesh: babylonMesh,\n promise: promise,\n };\n }\n babylonAbstractMesh = babylonMesh;\n }\n GLTFLoader.AddPointerMetadata(babylonAbstractMesh, context);\n this._parent.onMeshLoadedObservable.notifyObservers(babylonAbstractMesh);\n assign(babylonAbstractMesh);\n this.logClose();\n return promise.then(() => {\n return babylonAbstractMesh;\n });\n }\n _loadVertexDataAsync(context, primitive, babylonMesh) {\n const extensionPromise = this._extensionsLoadVertexDataAsync(context, primitive, babylonMesh);\n if (extensionPromise) {\n return extensionPromise;\n }\n const attributes = primitive.attributes;\n if (!attributes) {\n throw new Error(`${context}: Attributes are missing`);\n }\n const promises = new Array();\n const babylonGeometry = new Geometry(babylonMesh.name, this._babylonScene);\n if (primitive.indices == undefined) {\n babylonMesh.isUnIndexed = true;\n }\n else {\n const accessor = ArrayItem.Get(`${context}/indices`, this._gltf.accessors, primitive.indices);\n promises.push(this._loadIndicesAccessorAsync(`/accessors/${accessor.index}`, accessor).then((data) => {\n babylonGeometry.setIndices(data);\n }));\n }\n const loadAttribute = (name, kind, callback) => {\n if (attributes[name] == undefined) {\n return;\n }\n babylonMesh._delayInfo = babylonMesh._delayInfo || [];\n if (babylonMesh._delayInfo.indexOf(kind) === -1) {\n babylonMesh._delayInfo.push(kind);\n }\n const accessor = ArrayItem.Get(`${context}/attributes/${name}`, this._gltf.accessors, attributes[name]);\n promises.push(this._loadVertexAccessorAsync(`/accessors/${accessor.index}`, accessor, kind).then((babylonVertexBuffer) => {\n if (babylonVertexBuffer.getKind() === VertexBuffer.PositionKind && !this.parent.alwaysComputeBoundingBox && !babylonMesh.skeleton) {\n if (accessor.min && accessor.max) {\n const min = TmpVectors.Vector3[0].copyFromFloats(...accessor.min);\n const max = TmpVectors.Vector3[1].copyFromFloats(...accessor.max);\n if (accessor.normalized && accessor.componentType !== 5126 /* AccessorComponentType.FLOAT */) {\n let divider = 1;\n switch (accessor.componentType) {\n case 5120 /* AccessorComponentType.BYTE */:\n divider = 127.0;\n break;\n case 5121 /* AccessorComponentType.UNSIGNED_BYTE */:\n divider = 255.0;\n break;\n case 5122 /* AccessorComponentType.SHORT */:\n divider = 32767.0;\n break;\n case 5123 /* AccessorComponentType.UNSIGNED_SHORT */:\n divider = 65535.0;\n break;\n }\n const oneOverDivider = 1 / divider;\n min.scaleInPlace(oneOverDivider);\n max.scaleInPlace(oneOverDivider);\n }\n babylonGeometry._boundingInfo = new BoundingInfo(min, max);\n babylonGeometry.useBoundingInfoFromGeometry = true;\n }\n }\n babylonGeometry.setVerticesBuffer(babylonVertexBuffer, accessor.count);\n }));\n if (kind == VertexBuffer.MatricesIndicesExtraKind) {\n babylonMesh.numBoneInfluencers = 8;\n }\n if (callback) {\n callback(accessor);\n }\n };\n loadAttribute(\"POSITION\", VertexBuffer.PositionKind);\n loadAttribute(\"NORMAL\", VertexBuffer.NormalKind);\n loadAttribute(\"TANGENT\", VertexBuffer.TangentKind);\n loadAttribute(\"TEXCOORD_0\", VertexBuffer.UVKind);\n loadAttribute(\"TEXCOORD_1\", VertexBuffer.UV2Kind);\n loadAttribute(\"TEXCOORD_2\", VertexBuffer.UV3Kind);\n loadAttribute(\"TEXCOORD_3\", VertexBuffer.UV4Kind);\n loadAttribute(\"TEXCOORD_4\", VertexBuffer.UV5Kind);\n loadAttribute(\"TEXCOORD_5\", VertexBuffer.UV6Kind);\n loadAttribute(\"JOINTS_0\", VertexBuffer.MatricesIndicesKind);\n loadAttribute(\"WEIGHTS_0\", VertexBuffer.MatricesWeightsKind);\n loadAttribute(\"JOINTS_1\", VertexBuffer.MatricesIndicesExtraKind);\n loadAttribute(\"WEIGHTS_1\", VertexBuffer.MatricesWeightsExtraKind);\n loadAttribute(\"COLOR_0\", VertexBuffer.ColorKind, (accessor) => {\n if (accessor.type === \"VEC4\" /* AccessorType.VEC4 */) {\n babylonMesh.hasVertexAlpha = true;\n }\n });\n return Promise.all(promises).then(() => {\n return babylonGeometry;\n });\n }\n _createMorphTargets(context, node, mesh, primitive, babylonMesh) {\n if (!primitive.targets) {\n return;\n }\n if (node._numMorphTargets == undefined) {\n node._numMorphTargets = primitive.targets.length;\n }\n else if (primitive.targets.length !== node._numMorphTargets) {\n throw new Error(`${context}: Primitives do not have the same number of targets`);\n }\n const targetNames = mesh.extras ? mesh.extras.targetNames : null;\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n babylonMesh.morphTargetManager = new MorphTargetManager(this._babylonScene);\n babylonMesh.morphTargetManager._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n babylonMesh.morphTargetManager.areUpdatesFrozen = true;\n for (let index = 0; index < primitive.targets.length; index++) {\n const weight = node.weights ? node.weights[index] : mesh.weights ? mesh.weights[index] : 0;\n const name = targetNames ? targetNames[index] : `morphTarget${index}`;\n babylonMesh.morphTargetManager.addTarget(new MorphTarget(name, weight, babylonMesh.getScene()));\n // TODO: tell the target whether it has positions, normals, tangents\n }\n }\n _loadMorphTargetsAsync(context, primitive, babylonMesh, babylonGeometry) {\n if (!primitive.targets) {\n return Promise.resolve();\n }\n const promises = new Array();\n const morphTargetManager = babylonMesh.morphTargetManager;\n for (let index = 0; index < morphTargetManager.numTargets; index++) {\n const babylonMorphTarget = morphTargetManager.getTarget(index);\n promises.push(this._loadMorphTargetVertexDataAsync(`${context}/targets/${index}`, babylonGeometry, primitive.targets[index], babylonMorphTarget));\n }\n return Promise.all(promises).then(() => {\n morphTargetManager.areUpdatesFrozen = false;\n });\n }\n _loadMorphTargetVertexDataAsync(context, babylonGeometry, attributes, babylonMorphTarget) {\n const promises = new Array();\n const loadAttribute = (attribute, kind, setData) => {\n if (attributes[attribute] == undefined) {\n return;\n }\n const babylonVertexBuffer = babylonGeometry.getVertexBuffer(kind);\n if (!babylonVertexBuffer) {\n return;\n }\n const accessor = ArrayItem.Get(`${context}/${attribute}`, this._gltf.accessors, attributes[attribute]);\n promises.push(this._loadFloatAccessorAsync(`/accessors/${accessor.index}`, accessor).then((data) => {\n setData(babylonVertexBuffer, data);\n }));\n };\n loadAttribute(\"POSITION\", VertexBuffer.PositionKind, (babylonVertexBuffer, data) => {\n const positions = new Float32Array(data.length);\n babylonVertexBuffer.forEach(data.length, (value, index) => {\n positions[index] = data[index] + value;\n });\n babylonMorphTarget.setPositions(positions);\n });\n loadAttribute(\"NORMAL\", VertexBuffer.NormalKind, (babylonVertexBuffer, data) => {\n const normals = new Float32Array(data.length);\n babylonVertexBuffer.forEach(normals.length, (value, index) => {\n normals[index] = data[index] + value;\n });\n babylonMorphTarget.setNormals(normals);\n });\n loadAttribute(\"TANGENT\", VertexBuffer.TangentKind, (babylonVertexBuffer, data) => {\n const tangents = new Float32Array((data.length / 3) * 4);\n let dataIndex = 0;\n babylonVertexBuffer.forEach((data.length / 3) * 4, (value, index) => {\n // Tangent data for morph targets is stored as xyz delta.\n // The vertexData.tangent is stored as xyzw.\n // So we need to skip every fourth vertexData.tangent.\n if ((index + 1) % 4 !== 0) {\n tangents[dataIndex] = data[dataIndex] + value;\n dataIndex++;\n }\n });\n babylonMorphTarget.setTangents(tangents);\n });\n return Promise.all(promises).then(() => { });\n }\n static _LoadTransform(node, babylonNode) {\n // Ignore the TRS of skinned nodes.\n // See https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins (second implementation note)\n if (node.skin != undefined) {\n return;\n }\n let position = Vector3.Zero();\n let rotation = Quaternion.Identity();\n let scaling = Vector3.One();\n if (node.matrix) {\n const matrix = Matrix.FromArray(node.matrix);\n matrix.decompose(scaling, rotation, position);\n }\n else {\n if (node.translation) {\n position = Vector3.FromArray(node.translation);\n }\n if (node.rotation) {\n rotation = Quaternion.FromArray(node.rotation);\n }\n if (node.scale) {\n scaling = Vector3.FromArray(node.scale);\n }\n }\n babylonNode.position = position;\n babylonNode.rotationQuaternion = rotation;\n babylonNode.scaling = scaling;\n }\n _loadSkinAsync(context, node, skin, assign) {\n const extensionPromise = this._extensionsLoadSkinAsync(context, node, skin);\n if (extensionPromise) {\n return extensionPromise;\n }\n if (skin._data) {\n assign(skin._data.babylonSkeleton);\n return skin._data.promise;\n }\n const skeletonId = `skeleton${skin.index}`;\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const babylonSkeleton = new Skeleton(skin.name || skeletonId, skeletonId, this._babylonScene);\n babylonSkeleton._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n this._loadBones(context, skin, babylonSkeleton);\n const promise = this._loadSkinInverseBindMatricesDataAsync(context, skin).then((inverseBindMatricesData) => {\n this._updateBoneMatrices(babylonSkeleton, inverseBindMatricesData);\n });\n skin._data = {\n babylonSkeleton: babylonSkeleton,\n promise: promise,\n };\n assign(babylonSkeleton);\n return promise;\n }\n _loadBones(context, skin, babylonSkeleton) {\n if (skin.skeleton == undefined || this._parent.alwaysComputeSkeletonRootNode) {\n const rootNode = this._findSkeletonRootNode(`${context}/joints`, skin.joints);\n if (rootNode) {\n if (skin.skeleton === undefined) {\n skin.skeleton = rootNode.index;\n }\n else {\n const isParent = (a, b) => {\n for (; b.parent; b = b.parent) {\n if (b.parent === a) {\n return true;\n }\n }\n return false;\n };\n const skeletonNode = ArrayItem.Get(`${context}/skeleton`, this._gltf.nodes, skin.skeleton);\n if (skeletonNode !== rootNode && !isParent(skeletonNode, rootNode)) {\n Logger.Warn(`${context}/skeleton: Overriding with nearest common ancestor as skeleton node is not a common root`);\n skin.skeleton = rootNode.index;\n }\n }\n }\n else {\n Logger.Warn(`${context}: Failed to find common root`);\n }\n }\n const babylonBones = {};\n for (const index of skin.joints) {\n const node = ArrayItem.Get(`${context}/joints/${index}`, this._gltf.nodes, index);\n this._loadBone(node, skin, babylonSkeleton, babylonBones);\n }\n }\n _findSkeletonRootNode(context, joints) {\n if (joints.length === 0) {\n return null;\n }\n const paths = {};\n for (const index of joints) {\n const path = [];\n let node = ArrayItem.Get(`${context}/${index}`, this._gltf.nodes, index);\n while (node.index !== -1) {\n path.unshift(node);\n node = node.parent;\n }\n paths[index] = path;\n }\n let rootNode = null;\n for (let i = 0;; ++i) {\n let path = paths[joints[0]];\n if (i >= path.length) {\n return rootNode;\n }\n const node = path[i];\n for (let j = 1; j < joints.length; ++j) {\n path = paths[joints[j]];\n if (i >= path.length || node !== path[i]) {\n return rootNode;\n }\n }\n rootNode = node;\n }\n }\n _loadBone(node, skin, babylonSkeleton, babylonBones) {\n let babylonBone = babylonBones[node.index];\n if (babylonBone) {\n return babylonBone;\n }\n let parentBabylonBone = null;\n if (node.index !== skin.skeleton) {\n if (node.parent && node.parent.index !== -1) {\n parentBabylonBone = this._loadBone(node.parent, skin, babylonSkeleton, babylonBones);\n }\n else if (skin.skeleton !== undefined) {\n Logger.Warn(`/skins/${skin.index}/skeleton: Skeleton node is not a common root`);\n }\n }\n const boneIndex = skin.joints.indexOf(node.index);\n babylonBone = new Bone(node.name || `joint${node.index}`, babylonSkeleton, parentBabylonBone, this._getNodeMatrix(node), null, null, boneIndex);\n babylonBones[node.index] = babylonBone;\n // Wait until the scene is loaded to ensure the transform nodes are loaded.\n this._postSceneLoadActions.push(() => {\n // Link the Babylon bone with the corresponding Babylon transform node.\n // A glTF joint is a pointer to a glTF node in the glTF node hierarchy similar to Unity3D.\n babylonBone.linkTransformNode(node._babylonTransformNode);\n });\n return babylonBone;\n }\n _loadSkinInverseBindMatricesDataAsync(context, skin) {\n if (skin.inverseBindMatrices == undefined) {\n return Promise.resolve(null);\n }\n const accessor = ArrayItem.Get(`${context}/inverseBindMatrices`, this._gltf.accessors, skin.inverseBindMatrices);\n return this._loadFloatAccessorAsync(`/accessors/${accessor.index}`, accessor);\n }\n _updateBoneMatrices(babylonSkeleton, inverseBindMatricesData) {\n for (const babylonBone of babylonSkeleton.bones) {\n const baseMatrix = Matrix.Identity();\n const boneIndex = babylonBone._index;\n if (inverseBindMatricesData && boneIndex !== -1) {\n Matrix.FromArrayToRef(inverseBindMatricesData, boneIndex * 16, baseMatrix);\n baseMatrix.invertToRef(baseMatrix);\n }\n const babylonParentBone = babylonBone.getParent();\n if (babylonParentBone) {\n baseMatrix.multiplyToRef(babylonParentBone.getAbsoluteInverseBindMatrix(), baseMatrix);\n }\n babylonBone.updateMatrix(baseMatrix, false, false);\n babylonBone._updateAbsoluteBindMatrices(undefined, false);\n }\n }\n _getNodeMatrix(node) {\n return node.matrix\n ? Matrix.FromArray(node.matrix)\n : Matrix.Compose(node.scale ? Vector3.FromArray(node.scale) : Vector3.One(), node.rotation ? Quaternion.FromArray(node.rotation) : Quaternion.Identity(), node.translation ? Vector3.FromArray(node.translation) : Vector3.Zero());\n }\n /**\n * Loads a glTF camera.\n * @param context The context when loading the asset\n * @param camera The glTF camera property\n * @param assign A function called synchronously after parsing the glTF properties\n * @returns A promise that resolves with the loaded Babylon camera when the load is complete\n */\n loadCameraAsync(context, camera, assign = () => { }) {\n const extensionPromise = this._extensionsLoadCameraAsync(context, camera, assign);\n if (extensionPromise) {\n return extensionPromise;\n }\n const promises = new Array();\n this.logOpen(`${context} ${camera.name || \"\"}`);\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const babylonCamera = new FreeCamera(camera.name || `camera${camera.index}`, Vector3.Zero(), this._babylonScene, false);\n babylonCamera._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n babylonCamera.ignoreParentScaling = true;\n camera._babylonCamera = babylonCamera;\n // Rotation by 180 as glTF has a different convention than Babylon.\n babylonCamera.rotation.set(0, Math.PI, 0);\n switch (camera.type) {\n case \"perspective\" /* CameraType.PERSPECTIVE */: {\n const perspective = camera.perspective;\n if (!perspective) {\n throw new Error(`${context}: Camera perspective properties are missing`);\n }\n babylonCamera.fov = perspective.yfov;\n babylonCamera.minZ = perspective.znear;\n babylonCamera.maxZ = perspective.zfar || 0;\n break;\n }\n case \"orthographic\" /* CameraType.ORTHOGRAPHIC */: {\n if (!camera.orthographic) {\n throw new Error(`${context}: Camera orthographic properties are missing`);\n }\n babylonCamera.mode = Camera.ORTHOGRAPHIC_CAMERA;\n babylonCamera.orthoLeft = -camera.orthographic.xmag;\n babylonCamera.orthoRight = camera.orthographic.xmag;\n babylonCamera.orthoBottom = -camera.orthographic.ymag;\n babylonCamera.orthoTop = camera.orthographic.ymag;\n babylonCamera.minZ = camera.orthographic.znear;\n babylonCamera.maxZ = camera.orthographic.zfar;\n break;\n }\n default: {\n throw new Error(`${context}: Invalid camera type (${camera.type})`);\n }\n }\n GLTFLoader.AddPointerMetadata(babylonCamera, context);\n this._parent.onCameraLoadedObservable.notifyObservers(babylonCamera);\n assign(babylonCamera);\n this.logClose();\n return Promise.all(promises).then(() => {\n return babylonCamera;\n });\n }\n _loadAnimationsAsync() {\n const animations = this._gltf.animations;\n if (!animations) {\n return Promise.resolve();\n }\n const promises = new Array();\n for (let index = 0; index < animations.length; index++) {\n const animation = animations[index];\n promises.push(this.loadAnimationAsync(`/animations/${animation.index}`, animation).then((animationGroup) => {\n // Delete the animation group if it ended up not having any animations in it.\n if (animationGroup.targetedAnimations.length === 0) {\n animationGroup.dispose();\n }\n }));\n }\n return Promise.all(promises).then(() => { });\n }\n /**\n * Loads a glTF animation.\n * @param context The context when loading the asset\n * @param animation The glTF animation property\n * @returns A promise that resolves with the loaded Babylon animation group when the load is complete\n */\n loadAnimationAsync(context, animation) {\n const promise = this._extensionsLoadAnimationAsync(context, animation);\n if (promise) {\n return promise;\n }\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const babylonAnimationGroup = new AnimationGroup(animation.name || `animation${animation.index}`, this._babylonScene);\n babylonAnimationGroup._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n animation._babylonAnimationGroup = babylonAnimationGroup;\n const promises = new Array();\n ArrayItem.Assign(animation.channels);\n ArrayItem.Assign(animation.samplers);\n for (const channel of animation.channels) {\n promises.push(this._loadAnimationChannelAsync(`${context}/channels/${channel.index}`, context, animation, channel, (babylonTarget, babylonAnimation) => {\n babylonTarget.animations = babylonTarget.animations || [];\n babylonTarget.animations.push(babylonAnimation);\n babylonAnimationGroup.addTargetedAnimation(babylonAnimation, babylonTarget);\n }));\n }\n return Promise.all(promises).then(() => {\n babylonAnimationGroup.normalize(0);\n return babylonAnimationGroup;\n });\n }\n /**\n * @hidden\n * Loads a glTF animation channel.\n * @param context The context when loading the asset\n * @param animationContext The context of the animation when loading the asset\n * @param animation The glTF animation property\n * @param channel The glTF animation channel property\n * @param onLoad Called for each animation loaded\n * @returns A void promise that resolves when the load is complete\n */\n _loadAnimationChannelAsync(context, animationContext, animation, channel, onLoad) {\n const promise = this._extensionsLoadAnimationChannelAsync(context, animationContext, animation, channel, onLoad);\n if (promise) {\n return promise;\n }\n if (channel.target.node == undefined) {\n return Promise.resolve();\n }\n const targetNode = ArrayItem.Get(`${context}/target/node`, this._gltf.nodes, channel.target.node);\n // Ignore animations that have no animation targets.\n if ((channel.target.path === \"weights\" /* AnimationChannelTargetPath.WEIGHTS */ && !targetNode._numMorphTargets) ||\n (channel.target.path !== \"weights\" /* AnimationChannelTargetPath.WEIGHTS */ && !targetNode._babylonTransformNode)) {\n return Promise.resolve();\n }\n let properties;\n switch (channel.target.path) {\n case \"translation\" /* AnimationChannelTargetPath.TRANSLATION */: {\n properties = nodeAnimationData.translation;\n break;\n }\n case \"rotation\" /* AnimationChannelTargetPath.ROTATION */: {\n properties = nodeAnimationData.rotation;\n break;\n }\n case \"scale\" /* AnimationChannelTargetPath.SCALE */: {\n properties = nodeAnimationData.scale;\n break;\n }\n case \"weights\" /* AnimationChannelTargetPath.WEIGHTS */: {\n properties = nodeAnimationData.weights;\n break;\n }\n default: {\n throw new Error(`${context}/target/path: Invalid value (${channel.target.path})`);\n }\n }\n const targetInfo = {\n object: targetNode,\n info: properties,\n };\n return this._loadAnimationChannelFromTargetInfoAsync(context, animationContext, animation, channel, targetInfo, onLoad);\n }\n /**\n * @hidden\n * Loads a glTF animation channel.\n * @param context The context when loading the asset\n * @param animationContext The context of the animation when loading the asset\n * @param animation The glTF animation property\n * @param channel The glTF animation channel property\n * @param targetInfo The glTF target and properties\n * @param onLoad Called for each animation loaded\n * @returns A void promise that resolves when the load is complete\n */\n _loadAnimationChannelFromTargetInfoAsync(context, animationContext, animation, channel, targetInfo, onLoad) {\n const fps = this.parent.targetFps;\n const invfps = 1 / fps;\n const sampler = ArrayItem.Get(`${context}/sampler`, animation.samplers, channel.sampler);\n return this._loadAnimationSamplerAsync(`${animationContext}/samplers/${channel.sampler}`, sampler).then((data) => {\n let numAnimations = 0;\n const target = targetInfo.object;\n const propertyInfos = targetInfo.info;\n // Extract the corresponding values from the read value.\n // GLTF values may be dispatched to several Babylon properties.\n // For example, baseColorFactor [`r`, `g`, `b`, `a`] is dispatched to\n // - albedoColor as Color3(`r`, `g`, `b`)\n // - alpha as `a`\n for (const propertyInfo of propertyInfos) {\n const stride = propertyInfo.getStride(target);\n const input = data.input;\n const output = data.output;\n const keys = new Array(input.length);\n let outputOffset = 0;\n switch (data.interpolation) {\n case \"STEP\" /* AnimationSamplerInterpolation.STEP */: {\n for (let index = 0; index < input.length; index++) {\n const value = propertyInfo.getValue(target, output, outputOffset, 1);\n outputOffset += stride;\n keys[index] = {\n frame: input[index] * fps,\n value: value,\n interpolation: AnimationKeyInterpolation.STEP,\n };\n }\n break;\n }\n case \"CUBICSPLINE\" /* AnimationSamplerInterpolation.CUBICSPLINE */: {\n for (let index = 0; index < input.length; index++) {\n const inTangent = propertyInfo.getValue(target, output, outputOffset, invfps);\n outputOffset += stride;\n const value = propertyInfo.getValue(target, output, outputOffset, 1);\n outputOffset += stride;\n const outTangent = propertyInfo.getValue(target, output, outputOffset, invfps);\n outputOffset += stride;\n keys[index] = {\n frame: input[index] * fps,\n inTangent: inTangent,\n value: value,\n outTangent: outTangent,\n };\n }\n break;\n }\n case \"LINEAR\" /* AnimationSamplerInterpolation.LINEAR */: {\n for (let index = 0; index < input.length; index++) {\n const value = propertyInfo.getValue(target, output, outputOffset, 1);\n outputOffset += stride;\n keys[index] = {\n frame: input[index] * fps,\n value: value,\n };\n }\n break;\n }\n }\n if (outputOffset > 0) {\n const name = `${animation.name || `animation${animation.index}`}_channel${channel.index}_${numAnimations}`;\n propertyInfo.buildAnimations(target, name, fps, keys, (babylonAnimatable, babylonAnimation) => {\n ++numAnimations;\n onLoad(babylonAnimatable, babylonAnimation);\n });\n }\n }\n });\n }\n _loadAnimationSamplerAsync(context, sampler) {\n if (sampler._data) {\n return sampler._data;\n }\n const interpolation = sampler.interpolation || \"LINEAR\" /* AnimationSamplerInterpolation.LINEAR */;\n switch (interpolation) {\n case \"STEP\" /* AnimationSamplerInterpolation.STEP */:\n case \"LINEAR\" /* AnimationSamplerInterpolation.LINEAR */:\n case \"CUBICSPLINE\" /* AnimationSamplerInterpolation.CUBICSPLINE */: {\n break;\n }\n default: {\n throw new Error(`${context}/interpolation: Invalid value (${sampler.interpolation})`);\n }\n }\n const inputAccessor = ArrayItem.Get(`${context}/input`, this._gltf.accessors, sampler.input);\n const outputAccessor = ArrayItem.Get(`${context}/output`, this._gltf.accessors, sampler.output);\n sampler._data = Promise.all([\n this._loadFloatAccessorAsync(`/accessors/${inputAccessor.index}`, inputAccessor),\n this._loadFloatAccessorAsync(`/accessors/${outputAccessor.index}`, outputAccessor),\n ]).then(([inputData, outputData]) => {\n return {\n input: inputData,\n interpolation: interpolation,\n output: outputData,\n };\n });\n return sampler._data;\n }\n /**\n * Loads a glTF buffer.\n * @param context The context when loading the asset\n * @param buffer The glTF buffer property\n * @param byteOffset The byte offset to use\n * @param byteLength The byte length to use\n * @returns A promise that resolves with the loaded data when the load is complete\n */\n loadBufferAsync(context, buffer, byteOffset, byteLength) {\n const extensionPromise = this._extensionsLoadBufferAsync(context, buffer, byteOffset, byteLength);\n if (extensionPromise) {\n return extensionPromise;\n }\n if (!buffer._data) {\n if (buffer.uri) {\n buffer._data = this.loadUriAsync(`${context}/uri`, buffer, buffer.uri);\n }\n else {\n if (!this._bin) {\n throw new Error(`${context}: Uri is missing or the binary glTF is missing its binary chunk`);\n }\n buffer._data = this._bin.readAsync(0, buffer.byteLength);\n }\n }\n return buffer._data.then((data) => {\n try {\n return new Uint8Array(data.buffer, data.byteOffset + byteOffset, byteLength);\n }\n catch (e) {\n throw new Error(`${context}: ${e.message}`);\n }\n });\n }\n /**\n * Loads a glTF buffer view.\n * @param context The context when loading the asset\n * @param bufferView The glTF buffer view property\n * @returns A promise that resolves with the loaded data when the load is complete\n */\n loadBufferViewAsync(context, bufferView) {\n const extensionPromise = this._extensionsLoadBufferViewAsync(context, bufferView);\n if (extensionPromise) {\n return extensionPromise;\n }\n if (bufferView._data) {\n return bufferView._data;\n }\n const buffer = ArrayItem.Get(`${context}/buffer`, this._gltf.buffers, bufferView.buffer);\n bufferView._data = this.loadBufferAsync(`/buffers/${buffer.index}`, buffer, bufferView.byteOffset || 0, bufferView.byteLength);\n return bufferView._data;\n }\n _loadAccessorAsync(context, accessor, constructor) {\n if (accessor._data) {\n return accessor._data;\n }\n const numComponents = GLTFLoader._GetNumComponents(context, accessor.type);\n const byteStride = numComponents * VertexBuffer.GetTypeByteLength(accessor.componentType);\n const length = numComponents * accessor.count;\n if (accessor.bufferView == undefined) {\n accessor._data = Promise.resolve(new constructor(length));\n }\n else {\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, accessor.bufferView);\n accessor._data = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView).then((data) => {\n if (accessor.componentType === 5126 /* AccessorComponentType.FLOAT */ && !accessor.normalized && (!bufferView.byteStride || bufferView.byteStride === byteStride)) {\n return GLTFLoader._GetTypedArray(context, accessor.componentType, data, accessor.byteOffset, length);\n }\n else {\n const typedArray = new constructor(length);\n VertexBuffer.ForEach(data, accessor.byteOffset || 0, bufferView.byteStride || byteStride, numComponents, accessor.componentType, typedArray.length, accessor.normalized || false, (value, index) => {\n typedArray[index] = value;\n });\n return typedArray;\n }\n });\n }\n if (accessor.sparse) {\n const sparse = accessor.sparse;\n accessor._data = accessor._data.then((data) => {\n const typedArray = data;\n const indicesBufferView = ArrayItem.Get(`${context}/sparse/indices/bufferView`, this._gltf.bufferViews, sparse.indices.bufferView);\n const valuesBufferView = ArrayItem.Get(`${context}/sparse/values/bufferView`, this._gltf.bufferViews, sparse.values.bufferView);\n return Promise.all([\n this.loadBufferViewAsync(`/bufferViews/${indicesBufferView.index}`, indicesBufferView),\n this.loadBufferViewAsync(`/bufferViews/${valuesBufferView.index}`, valuesBufferView),\n ]).then(([indicesData, valuesData]) => {\n const indices = GLTFLoader._GetTypedArray(`${context}/sparse/indices`, sparse.indices.componentType, indicesData, sparse.indices.byteOffset, sparse.count);\n const sparseLength = numComponents * sparse.count;\n let values;\n if (accessor.componentType === 5126 /* AccessorComponentType.FLOAT */ && !accessor.normalized) {\n values = GLTFLoader._GetTypedArray(`${context}/sparse/values`, accessor.componentType, valuesData, sparse.values.byteOffset, sparseLength);\n }\n else {\n const sparseData = GLTFLoader._GetTypedArray(`${context}/sparse/values`, accessor.componentType, valuesData, sparse.values.byteOffset, sparseLength);\n values = new constructor(sparseLength);\n VertexBuffer.ForEach(sparseData, 0, byteStride, numComponents, accessor.componentType, values.length, accessor.normalized || false, (value, index) => {\n values[index] = value;\n });\n }\n let valuesIndex = 0;\n for (let indicesIndex = 0; indicesIndex < indices.length; indicesIndex++) {\n let dataIndex = indices[indicesIndex] * numComponents;\n for (let componentIndex = 0; componentIndex < numComponents; componentIndex++) {\n typedArray[dataIndex++] = values[valuesIndex++];\n }\n }\n return typedArray;\n });\n });\n }\n return accessor._data;\n }\n /**\n * @internal\n */\n _loadFloatAccessorAsync(context, accessor) {\n return this._loadAccessorAsync(context, accessor, Float32Array);\n }\n /**\n * @internal\n */\n _loadIndicesAccessorAsync(context, accessor) {\n if (accessor.type !== \"SCALAR\" /* AccessorType.SCALAR */) {\n throw new Error(`${context}/type: Invalid value ${accessor.type}`);\n }\n if (accessor.componentType !== 5121 /* AccessorComponentType.UNSIGNED_BYTE */ &&\n accessor.componentType !== 5123 /* AccessorComponentType.UNSIGNED_SHORT */ &&\n accessor.componentType !== 5125 /* AccessorComponentType.UNSIGNED_INT */) {\n throw new Error(`${context}/componentType: Invalid value ${accessor.componentType}`);\n }\n if (accessor._data) {\n return accessor._data;\n }\n if (accessor.sparse) {\n const constructor = GLTFLoader._GetTypedArrayConstructor(`${context}/componentType`, accessor.componentType);\n accessor._data = this._loadAccessorAsync(context, accessor, constructor);\n }\n else {\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, accessor.bufferView);\n accessor._data = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView).then((data) => {\n return GLTFLoader._GetTypedArray(context, accessor.componentType, data, accessor.byteOffset, accessor.count);\n });\n }\n return accessor._data;\n }\n /**\n * @internal\n */\n _loadVertexBufferViewAsync(bufferView) {\n if (bufferView._babylonBuffer) {\n return bufferView._babylonBuffer;\n }\n const engine = this._babylonScene.getEngine();\n bufferView._babylonBuffer = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView).then((data) => {\n return new Buffer(engine, data, false);\n });\n return bufferView._babylonBuffer;\n }\n /**\n * @internal\n */\n _loadVertexAccessorAsync(context, accessor, kind) {\n if (accessor._babylonVertexBuffer?.[kind]) {\n return accessor._babylonVertexBuffer[kind];\n }\n if (!accessor._babylonVertexBuffer) {\n accessor._babylonVertexBuffer = {};\n }\n const engine = this._babylonScene.getEngine();\n if (accessor.sparse || accessor.bufferView == undefined) {\n accessor._babylonVertexBuffer[kind] = this._loadFloatAccessorAsync(context, accessor).then((data) => {\n return new VertexBuffer(engine, data, kind, false);\n });\n }\n else {\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, accessor.bufferView);\n accessor._babylonVertexBuffer[kind] = this._loadVertexBufferViewAsync(bufferView).then((babylonBuffer) => {\n const numComponents = GLTFLoader._GetNumComponents(context, accessor.type);\n return new VertexBuffer(engine, babylonBuffer, kind, false, undefined, bufferView.byteStride, undefined, accessor.byteOffset, numComponents, accessor.componentType, accessor.normalized, true, undefined, true);\n });\n }\n return accessor._babylonVertexBuffer[kind];\n }\n _loadMaterialMetallicRoughnessPropertiesAsync(context, properties, babylonMaterial) {\n if (!(babylonMaterial instanceof PBRMaterial)) {\n throw new Error(`${context}: Material type not supported`);\n }\n const promises = new Array();\n if (properties) {\n if (properties.baseColorFactor) {\n babylonMaterial.albedoColor = Color3.FromArray(properties.baseColorFactor);\n babylonMaterial.alpha = properties.baseColorFactor[3];\n }\n else {\n babylonMaterial.albedoColor = Color3.White();\n }\n babylonMaterial.metallic = properties.metallicFactor == undefined ? 1 : properties.metallicFactor;\n babylonMaterial.roughness = properties.roughnessFactor == undefined ? 1 : properties.roughnessFactor;\n if (properties.baseColorTexture) {\n promises.push(this.loadTextureInfoAsync(`${context}/baseColorTexture`, properties.baseColorTexture, (texture) => {\n texture.name = `${babylonMaterial.name} (Base Color)`;\n babylonMaterial.albedoTexture = texture;\n }));\n }\n if (properties.metallicRoughnessTexture) {\n properties.metallicRoughnessTexture.nonColorData = true;\n promises.push(this.loadTextureInfoAsync(`${context}/metallicRoughnessTexture`, properties.metallicRoughnessTexture, (texture) => {\n texture.name = `${babylonMaterial.name} (Metallic Roughness)`;\n babylonMaterial.metallicTexture = texture;\n }));\n babylonMaterial.useMetallnessFromMetallicTextureBlue = true;\n babylonMaterial.useRoughnessFromMetallicTextureGreen = true;\n babylonMaterial.useRoughnessFromMetallicTextureAlpha = false;\n }\n }\n return Promise.all(promises).then(() => { });\n }\n /**\n * @internal\n */\n _loadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign = () => { }) {\n const extensionPromise = this._extensionsLoadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign);\n if (extensionPromise) {\n return extensionPromise;\n }\n material._data = material._data || {};\n let babylonData = material._data[babylonDrawMode];\n if (!babylonData) {\n this.logOpen(`${context} ${material.name || \"\"}`);\n const babylonMaterial = this.createMaterial(context, material, babylonDrawMode);\n babylonData = {\n babylonMaterial: babylonMaterial,\n babylonMeshes: [],\n promise: this.loadMaterialPropertiesAsync(context, material, babylonMaterial),\n };\n material._data[babylonDrawMode] = babylonData;\n GLTFLoader.AddPointerMetadata(babylonMaterial, context);\n this._parent.onMaterialLoadedObservable.notifyObservers(babylonMaterial);\n this.logClose();\n }\n if (babylonMesh) {\n babylonData.babylonMeshes.push(babylonMesh);\n babylonMesh.onDisposeObservable.addOnce(() => {\n const index = babylonData.babylonMeshes.indexOf(babylonMesh);\n if (index !== -1) {\n babylonData.babylonMeshes.splice(index, 1);\n }\n });\n }\n assign(babylonData.babylonMaterial);\n return babylonData.promise.then(() => {\n return babylonData.babylonMaterial;\n });\n }\n _createDefaultMaterial(name, babylonDrawMode) {\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const babylonMaterial = new PBRMaterial(name, this._babylonScene);\n babylonMaterial._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n // Moved to mesh so user can change materials on gltf meshes: babylonMaterial.sideOrientation = this._babylonScene.useRightHandedSystem ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation;\n babylonMaterial.fillMode = babylonDrawMode;\n babylonMaterial.enableSpecularAntiAliasing = true;\n babylonMaterial.useRadianceOverAlpha = !this._parent.transparencyAsCoverage;\n babylonMaterial.useSpecularOverAlpha = !this._parent.transparencyAsCoverage;\n babylonMaterial.transparencyMode = PBRMaterial.PBRMATERIAL_OPAQUE;\n babylonMaterial.metallic = 1;\n babylonMaterial.roughness = 1;\n return babylonMaterial;\n }\n /**\n * Creates a Babylon material from a glTF material.\n * @param context The context when loading the asset\n * @param material The glTF material property\n * @param babylonDrawMode The draw mode for the Babylon material\n * @returns The Babylon material\n */\n createMaterial(context, material, babylonDrawMode) {\n const extensionPromise = this._extensionsCreateMaterial(context, material, babylonDrawMode);\n if (extensionPromise) {\n return extensionPromise;\n }\n const name = material.name || `material${material.index}`;\n const babylonMaterial = this._createDefaultMaterial(name, babylonDrawMode);\n return babylonMaterial;\n }\n /**\n * Loads properties from a glTF material into a Babylon material.\n * @param context The context when loading the asset\n * @param material The glTF material property\n * @param babylonMaterial The Babylon material\n * @returns A promise that resolves when the load is complete\n */\n loadMaterialPropertiesAsync(context, material, babylonMaterial) {\n const extensionPromise = this._extensionsLoadMaterialPropertiesAsync(context, material, babylonMaterial);\n if (extensionPromise) {\n return extensionPromise;\n }\n const promises = new Array();\n promises.push(this.loadMaterialBasePropertiesAsync(context, material, babylonMaterial));\n if (material.pbrMetallicRoughness) {\n promises.push(this._loadMaterialMetallicRoughnessPropertiesAsync(`${context}/pbrMetallicRoughness`, material.pbrMetallicRoughness, babylonMaterial));\n }\n this.loadMaterialAlphaProperties(context, material, babylonMaterial);\n return Promise.all(promises).then(() => { });\n }\n /**\n * Loads the normal, occlusion, and emissive properties from a glTF material into a Babylon material.\n * @param context The context when loading the asset\n * @param material The glTF material property\n * @param babylonMaterial The Babylon material\n * @returns A promise that resolves when the load is complete\n */\n loadMaterialBasePropertiesAsync(context, material, babylonMaterial) {\n if (!(babylonMaterial instanceof PBRMaterial)) {\n throw new Error(`${context}: Material type not supported`);\n }\n const promises = new Array();\n babylonMaterial.emissiveColor = material.emissiveFactor ? Color3.FromArray(material.emissiveFactor) : new Color3(0, 0, 0);\n if (material.doubleSided) {\n babylonMaterial.backFaceCulling = false;\n babylonMaterial.twoSidedLighting = true;\n }\n if (material.normalTexture) {\n material.normalTexture.nonColorData = true;\n promises.push(this.loadTextureInfoAsync(`${context}/normalTexture`, material.normalTexture, (texture) => {\n texture.name = `${babylonMaterial.name} (Normal)`;\n babylonMaterial.bumpTexture = texture;\n }));\n babylonMaterial.invertNormalMapX = !this._babylonScene.useRightHandedSystem;\n babylonMaterial.invertNormalMapY = this._babylonScene.useRightHandedSystem;\n if (material.normalTexture.scale != undefined && babylonMaterial.bumpTexture) {\n babylonMaterial.bumpTexture.level = material.normalTexture.scale;\n }\n babylonMaterial.forceIrradianceInFragment = true;\n }\n if (material.occlusionTexture) {\n material.occlusionTexture.nonColorData = true;\n promises.push(this.loadTextureInfoAsync(`${context}/occlusionTexture`, material.occlusionTexture, (texture) => {\n texture.name = `${babylonMaterial.name} (Occlusion)`;\n babylonMaterial.ambientTexture = texture;\n }));\n babylonMaterial.useAmbientInGrayScale = true;\n if (material.occlusionTexture.strength != undefined) {\n babylonMaterial.ambientTextureStrength = material.occlusionTexture.strength;\n }\n }\n if (material.emissiveTexture) {\n promises.push(this.loadTextureInfoAsync(`${context}/emissiveTexture`, material.emissiveTexture, (texture) => {\n texture.name = `${babylonMaterial.name} (Emissive)`;\n babylonMaterial.emissiveTexture = texture;\n }));\n }\n return Promise.all(promises).then(() => { });\n }\n /**\n * Loads the alpha properties from a glTF material into a Babylon material.\n * Must be called after the setting the albedo texture of the Babylon material when the material has an albedo texture.\n * @param context The context when loading the asset\n * @param material The glTF material property\n * @param babylonMaterial The Babylon material\n */\n loadMaterialAlphaProperties(context, material, babylonMaterial) {\n if (!(babylonMaterial instanceof PBRMaterial)) {\n throw new Error(`${context}: Material type not supported`);\n }\n const alphaMode = material.alphaMode || \"OPAQUE\" /* MaterialAlphaMode.OPAQUE */;\n switch (alphaMode) {\n case \"OPAQUE\" /* MaterialAlphaMode.OPAQUE */: {\n babylonMaterial.transparencyMode = PBRMaterial.PBRMATERIAL_OPAQUE;\n babylonMaterial.alpha = 1.0; // Force alpha to 1.0 for opaque mode.\n break;\n }\n case \"MASK\" /* MaterialAlphaMode.MASK */: {\n babylonMaterial.transparencyMode = PBRMaterial.PBRMATERIAL_ALPHATEST;\n babylonMaterial.alphaCutOff = material.alphaCutoff == undefined ? 0.5 : material.alphaCutoff;\n if (babylonMaterial.albedoTexture) {\n babylonMaterial.albedoTexture.hasAlpha = true;\n }\n break;\n }\n case \"BLEND\" /* MaterialAlphaMode.BLEND */: {\n babylonMaterial.transparencyMode = PBRMaterial.PBRMATERIAL_ALPHABLEND;\n if (babylonMaterial.albedoTexture) {\n babylonMaterial.albedoTexture.hasAlpha = true;\n babylonMaterial.useAlphaFromAlbedoTexture = true;\n }\n break;\n }\n default: {\n throw new Error(`${context}/alphaMode: Invalid value (${material.alphaMode})`);\n }\n }\n }\n /**\n * Loads a glTF texture info.\n * @param context The context when loading the asset\n * @param textureInfo The glTF texture info property\n * @param assign A function called synchronously after parsing the glTF properties\n * @returns A promise that resolves with the loaded Babylon texture when the load is complete\n */\n loadTextureInfoAsync(context, textureInfo, assign = () => { }) {\n const extensionPromise = this._extensionsLoadTextureInfoAsync(context, textureInfo, assign);\n if (extensionPromise) {\n return extensionPromise;\n }\n this.logOpen(`${context}`);\n if (textureInfo.texCoord >= 6) {\n throw new Error(`${context}/texCoord: Invalid value (${textureInfo.texCoord})`);\n }\n const texture = ArrayItem.Get(`${context}/index`, this._gltf.textures, textureInfo.index);\n texture._textureInfo = textureInfo;\n const promise = this._loadTextureAsync(`/textures/${textureInfo.index}`, texture, (babylonTexture) => {\n babylonTexture.coordinatesIndex = textureInfo.texCoord || 0;\n GLTFLoader.AddPointerMetadata(babylonTexture, context);\n this._parent.onTextureLoadedObservable.notifyObservers(babylonTexture);\n assign(babylonTexture);\n });\n this.logClose();\n return promise;\n }\n /**\n * @internal\n */\n _loadTextureAsync(context, texture, assign = () => { }) {\n const extensionPromise = this._extensionsLoadTextureAsync(context, texture, assign);\n if (extensionPromise) {\n return extensionPromise;\n }\n this.logOpen(`${context} ${texture.name || \"\"}`);\n const sampler = texture.sampler == undefined ? GLTFLoader.DefaultSampler : ArrayItem.Get(`${context}/sampler`, this._gltf.samplers, texture.sampler);\n const image = ArrayItem.Get(`${context}/source`, this._gltf.images, texture.source);\n const promise = this._createTextureAsync(context, sampler, image, assign, undefined, !texture._textureInfo.nonColorData);\n this.logClose();\n return promise;\n }\n /**\n * @internal\n */\n _createTextureAsync(context, sampler, image, assign = () => { }, textureLoaderOptions, useSRGBBuffer) {\n const samplerData = this._loadSampler(`/samplers/${sampler.index}`, sampler);\n const promises = new Array();\n const deferred = new Deferred();\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\n const textureCreationOptions = {\n noMipmap: samplerData.noMipMaps,\n invertY: false,\n samplingMode: samplerData.samplingMode,\n onLoad: () => {\n if (!this._disposed) {\n deferred.resolve();\n }\n },\n onError: (message, exception) => {\n if (!this._disposed) {\n deferred.reject(new Error(`${context}: ${exception && exception.message ? exception.message : message || \"Failed to load texture\"}`));\n }\n },\n mimeType: image.mimeType,\n loaderOptions: textureLoaderOptions,\n useSRGBBuffer: !!useSRGBBuffer && this._parent.useSRGBBuffers,\n };\n const babylonTexture = new Texture(null, this._babylonScene, textureCreationOptions);\n babylonTexture._parentContainer = this._assetContainer;\n this._babylonScene._blockEntityCollection = false;\n promises.push(deferred.promise);\n promises.push(this.loadImageAsync(`/images/${image.index}`, image).then((data) => {\n const name = image.uri || `${this._fileName}#image${image.index}`;\n const dataUrl = `data:${this._uniqueRootUrl}${name}`;\n babylonTexture.updateURL(dataUrl, data);\n }));\n babylonTexture.wrapU = samplerData.wrapU;\n babylonTexture.wrapV = samplerData.wrapV;\n assign(babylonTexture);\n return Promise.all(promises).then(() => {\n return babylonTexture;\n });\n }\n _loadSampler(context, sampler) {\n if (!sampler._data) {\n sampler._data = {\n noMipMaps: sampler.minFilter === 9728 /* TextureMinFilter.NEAREST */ || sampler.minFilter === 9729 /* TextureMinFilter.LINEAR */,\n samplingMode: GLTFLoader._GetTextureSamplingMode(context, sampler),\n wrapU: GLTFLoader._GetTextureWrapMode(`${context}/wrapS`, sampler.wrapS),\n wrapV: GLTFLoader._GetTextureWrapMode(`${context}/wrapT`, sampler.wrapT),\n };\n }\n return sampler._data;\n }\n /**\n * Loads a glTF image.\n * @param context The context when loading the asset\n * @param image The glTF image property\n * @returns A promise that resolves with the loaded data when the load is complete\n */\n loadImageAsync(context, image) {\n if (!image._data) {\n this.logOpen(`${context} ${image.name || \"\"}`);\n if (image.uri) {\n image._data = this.loadUriAsync(`${context}/uri`, image, image.uri);\n }\n else {\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, image.bufferView);\n image._data = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView);\n }\n this.logClose();\n }\n return image._data;\n }\n /**\n * Loads a glTF uri.\n * @param context The context when loading the asset\n * @param property The glTF property associated with the uri\n * @param uri The base64 or relative uri\n * @returns A promise that resolves with the loaded data when the load is complete\n */\n loadUriAsync(context, property, uri) {\n const extensionPromise = this._extensionsLoadUriAsync(context, property, uri);\n if (extensionPromise) {\n return extensionPromise;\n }\n if (!GLTFLoader._ValidateUri(uri)) {\n throw new Error(`${context}: '${uri}' is invalid`);\n }\n if (IsBase64DataUrl(uri)) {\n const data = new Uint8Array(DecodeBase64UrlToBinary(uri));\n this.log(`${context}: Decoded ${uri.substr(0, 64)}... (${data.length} bytes)`);\n return Promise.resolve(data);\n }\n this.log(`${context}: Loading ${uri}`);\n return this._parent.preprocessUrlAsync(this._rootUrl + uri).then((url) => {\n return new Promise((resolve, reject) => {\n this._parent._loadFile(this._babylonScene, url, (data) => {\n if (!this._disposed) {\n this.log(`${context}: Loaded ${uri} (${data.byteLength} bytes)`);\n resolve(new Uint8Array(data));\n }\n }, true, (request) => {\n reject(new LoadFileError(`${context}: Failed to load '${uri}'${request ? \": \" + request.status + \" \" + request.statusText : \"\"}`, request));\n });\n });\n });\n }\n /**\n * Adds a JSON pointer to the _internalMetadata of the Babylon object at `<object>._internalMetadata.gltf.pointers`.\n * @param babylonObject the Babylon object with _internalMetadata\n * @param pointer the JSON pointer\n */\n static AddPointerMetadata(babylonObject, pointer) {\n babylonObject.metadata = babylonObject.metadata || {};\n const metadata = (babylonObject._internalMetadata = babylonObject._internalMetadata || {});\n const gltf = (metadata.gltf = metadata.gltf || {});\n const pointers = (gltf.pointers = gltf.pointers || []);\n pointers.push(pointer);\n }\n static _GetTextureWrapMode(context, mode) {\n // Set defaults if undefined\n mode = mode == undefined ? 10497 /* TextureWrapMode.REPEAT */ : mode;\n switch (mode) {\n case 33071 /* TextureWrapMode.CLAMP_TO_EDGE */:\n return Texture.CLAMP_ADDRESSMODE;\n case 33648 /* TextureWrapMode.MIRRORED_REPEAT */:\n return Texture.MIRROR_ADDRESSMODE;\n case 10497 /* TextureWrapMode.REPEAT */:\n return Texture.WRAP_ADDRESSMODE;\n default:\n Logger.Warn(`${context}: Invalid value (${mode})`);\n return Texture.WRAP_ADDRESSMODE;\n }\n }\n static _GetTextureSamplingMode(context, sampler) {\n // Set defaults if undefined\n const magFilter = sampler.magFilter == undefined ? 9729 /* TextureMagFilter.LINEAR */ : sampler.magFilter;\n const minFilter = sampler.minFilter == undefined ? 9987 /* TextureMinFilter.LINEAR_MIPMAP_LINEAR */ : sampler.minFilter;\n if (magFilter === 9729 /* TextureMagFilter.LINEAR */) {\n switch (minFilter) {\n case 9728 /* TextureMinFilter.NEAREST */:\n return Texture.LINEAR_NEAREST;\n case 9729 /* TextureMinFilter.LINEAR */:\n return Texture.LINEAR_LINEAR;\n case 9984 /* TextureMinFilter.NEAREST_MIPMAP_NEAREST */:\n return Texture.LINEAR_NEAREST_MIPNEAREST;\n case 9985 /* TextureMinFilter.LINEAR_MIPMAP_NEAREST */:\n return Texture.LINEAR_LINEAR_MIPNEAREST;\n case 9986 /* TextureMinFilter.NEAREST_MIPMAP_LINEAR */:\n return Texture.LINEAR_NEAREST_MIPLINEAR;\n case 9987 /* TextureMinFilter.LINEAR_MIPMAP_LINEAR */:\n return Texture.LINEAR_LINEAR_MIPLINEAR;\n default:\n Logger.Warn(`${context}/minFilter: Invalid value (${minFilter})`);\n return Texture.LINEAR_LINEAR_MIPLINEAR;\n }\n }\n else {\n if (magFilter !== 9728 /* TextureMagFilter.NEAREST */) {\n Logger.Warn(`${context}/magFilter: Invalid value (${magFilter})`);\n }\n switch (minFilter) {\n case 9728 /* TextureMinFilter.NEAREST */:\n return Texture.NEAREST_NEAREST;\n case 9729 /* TextureMinFilter.LINEAR */:\n return Texture.NEAREST_LINEAR;\n case 9984 /* TextureMinFilter.NEAREST_MIPMAP_NEAREST */:\n return Texture.NEAREST_NEAREST_MIPNEAREST;\n case 9985 /* TextureMinFilter.LINEAR_MIPMAP_NEAREST */:\n return Texture.NEAREST_LINEAR_MIPNEAREST;\n case 9986 /* TextureMinFilter.NEAREST_MIPMAP_LINEAR */:\n return Texture.NEAREST_NEAREST_MIPLINEAR;\n case 9987 /* TextureMinFilter.LINEAR_MIPMAP_LINEAR */:\n return Texture.NEAREST_LINEAR_MIPLINEAR;\n default:\n Logger.Warn(`${context}/minFilter: Invalid value (${minFilter})`);\n return Texture.NEAREST_NEAREST_MIPNEAREST;\n }\n }\n }\n static _GetTypedArrayConstructor(context, componentType) {\n switch (componentType) {\n case 5120 /* AccessorComponentType.BYTE */:\n return Int8Array;\n case 5121 /* AccessorComponentType.UNSIGNED_BYTE */:\n return Uint8Array;\n case 5122 /* AccessorComponentType.SHORT */:\n return Int16Array;\n case 5123 /* AccessorComponentType.UNSIGNED_SHORT */:\n return Uint16Array;\n case 5125 /* AccessorComponentType.UNSIGNED_INT */:\n return Uint32Array;\n case 5126 /* AccessorComponentType.FLOAT */:\n return Float32Array;\n default:\n throw new Error(`${context}: Invalid component type ${componentType}`);\n }\n }\n static _GetTypedArray(context, componentType, bufferView, byteOffset, length) {\n const buffer = bufferView.buffer;\n byteOffset = bufferView.byteOffset + (byteOffset || 0);\n const constructor = GLTFLoader._GetTypedArrayConstructor(`${context}/componentType`, componentType);\n const componentTypeLength = VertexBuffer.GetTypeByteLength(componentType);\n if (byteOffset % componentTypeLength !== 0) {\n // HACK: Copy the buffer if byte offset is not a multiple of component type byte length.\n Logger.Warn(`${context}: Copying buffer as byte offset (${byteOffset}) is not a multiple of component type byte length (${componentTypeLength})`);\n return new constructor(buffer.slice(byteOffset, byteOffset + length * componentTypeLength), 0);\n }\n return new constructor(buffer, byteOffset, length);\n }\n static _GetNumComponents(context, type) {\n switch (type) {\n case \"SCALAR\":\n return 1;\n case \"VEC2\":\n return 2;\n case \"VEC3\":\n return 3;\n case \"VEC4\":\n return 4;\n case \"MAT2\":\n return 4;\n case \"MAT3\":\n return 9;\n case \"MAT4\":\n return 16;\n }\n throw new Error(`${context}: Invalid type (${type})`);\n }\n static _ValidateUri(uri) {\n return Tools.IsBase64(uri) || uri.indexOf(\"..\") === -1;\n }\n /**\n * @internal\n */\n static _GetDrawMode(context, mode) {\n if (mode == undefined) {\n mode = 4 /* MeshPrimitiveMode.TRIANGLES */;\n }\n switch (mode) {\n case 0 /* MeshPrimitiveMode.POINTS */:\n return Material.PointListDrawMode;\n case 1 /* MeshPrimitiveMode.LINES */:\n return Material.LineListDrawMode;\n case 2 /* MeshPrimitiveMode.LINE_LOOP */:\n return Material.LineLoopDrawMode;\n case 3 /* MeshPrimitiveMode.LINE_STRIP */:\n return Material.LineStripDrawMode;\n case 4 /* MeshPrimitiveMode.TRIANGLES */:\n return Material.TriangleFillMode;\n case 5 /* MeshPrimitiveMode.TRIANGLE_STRIP */:\n return Material.TriangleStripDrawMode;\n case 6 /* MeshPrimitiveMode.TRIANGLE_FAN */:\n return Material.TriangleFanDrawMode;\n }\n throw new Error(`${context}: Invalid mesh primitive mode (${mode})`);\n }\n _compileMaterialsAsync() {\n this._parent._startPerformanceCounter(\"Compile materials\");\n const promises = new Array();\n if (this._gltf.materials) {\n for (const material of this._gltf.materials) {\n if (material._data) {\n for (const babylonDrawMode in material._data) {\n const babylonData = material._data[babylonDrawMode];\n for (const babylonMesh of babylonData.babylonMeshes) {\n // Ensure nonUniformScaling is set if necessary.\n babylonMesh.computeWorldMatrix(true);\n const babylonMaterial = babylonData.babylonMaterial;\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh));\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, { useInstances: true }));\n if (this._parent.useClipPlane) {\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, { clipPlane: true }));\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, { clipPlane: true, useInstances: true }));\n }\n }\n }\n }\n }\n }\n return Promise.all(promises).then(() => {\n this._parent._endPerformanceCounter(\"Compile materials\");\n });\n }\n _compileShadowGeneratorsAsync() {\n this._parent._startPerformanceCounter(\"Compile shadow generators\");\n const promises = new Array();\n const lights = this._babylonScene.lights;\n for (const light of lights) {\n const generator = light.getShadowGenerator();\n if (generator) {\n promises.push(generator.forceCompilationAsync());\n }\n }\n return Promise.all(promises).then(() => {\n this._parent._endPerformanceCounter(\"Compile shadow generators\");\n });\n }\n _forEachExtensions(action) {\n for (const extension of this._extensions) {\n if (extension.enabled) {\n action(extension);\n }\n }\n }\n _applyExtensions(property, functionName, actionAsync) {\n for (const extension of this._extensions) {\n if (extension.enabled) {\n const id = `${extension.name}.${functionName}`;\n const loaderProperty = property;\n loaderProperty._activeLoaderExtensionFunctions = loaderProperty._activeLoaderExtensionFunctions || {};\n const activeLoaderExtensionFunctions = loaderProperty._activeLoaderExtensionFunctions;\n if (!activeLoaderExtensionFunctions[id]) {\n activeLoaderExtensionFunctions[id] = true;\n try {\n const result = actionAsync(extension);\n if (result) {\n return result;\n }\n }\n finally {\n delete activeLoaderExtensionFunctions[id];\n }\n }\n }\n }\n return null;\n }\n _extensionsOnLoading() {\n this._forEachExtensions((extension) => extension.onLoading && extension.onLoading());\n }\n _extensionsOnReady() {\n this._forEachExtensions((extension) => extension.onReady && extension.onReady());\n }\n _extensionsLoadSceneAsync(context, scene) {\n return this._applyExtensions(scene, \"loadScene\", (extension) => extension.loadSceneAsync && extension.loadSceneAsync(context, scene));\n }\n _extensionsLoadNodeAsync(context, node, assign) {\n return this._applyExtensions(node, \"loadNode\", (extension) => extension.loadNodeAsync && extension.loadNodeAsync(context, node, assign));\n }\n _extensionsLoadCameraAsync(context, camera, assign) {\n return this._applyExtensions(camera, \"loadCamera\", (extension) => extension.loadCameraAsync && extension.loadCameraAsync(context, camera, assign));\n }\n _extensionsLoadVertexDataAsync(context, primitive, babylonMesh) {\n return this._applyExtensions(primitive, \"loadVertexData\", (extension) => extension._loadVertexDataAsync && extension._loadVertexDataAsync(context, primitive, babylonMesh));\n }\n _extensionsLoadMeshPrimitiveAsync(context, name, node, mesh, primitive, assign) {\n return this._applyExtensions(primitive, \"loadMeshPrimitive\", (extension) => extension._loadMeshPrimitiveAsync && extension._loadMeshPrimitiveAsync(context, name, node, mesh, primitive, assign));\n }\n _extensionsLoadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign) {\n return this._applyExtensions(material, \"loadMaterial\", (extension) => extension._loadMaterialAsync && extension._loadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign));\n }\n _extensionsCreateMaterial(context, material, babylonDrawMode) {\n return this._applyExtensions(material, \"createMaterial\", (extension) => extension.createMaterial && extension.createMaterial(context, material, babylonDrawMode));\n }\n _extensionsLoadMaterialPropertiesAsync(context, material, babylonMaterial) {\n return this._applyExtensions(material, \"loadMaterialProperties\", (extension) => extension.loadMaterialPropertiesAsync && extension.loadMaterialPropertiesAsync(context, material, babylonMaterial));\n }\n _extensionsLoadTextureInfoAsync(context, textureInfo, assign) {\n return this._applyExtensions(textureInfo, \"loadTextureInfo\", (extension) => extension.loadTextureInfoAsync && extension.loadTextureInfoAsync(context, textureInfo, assign));\n }\n _extensionsLoadTextureAsync(context, texture, assign) {\n return this._applyExtensions(texture, \"loadTexture\", (extension) => extension._loadTextureAsync && extension._loadTextureAsync(context, texture, assign));\n }\n _extensionsLoadAnimationAsync(context, animation) {\n return this._applyExtensions(animation, \"loadAnimation\", (extension) => extension.loadAnimationAsync && extension.loadAnimationAsync(context, animation));\n }\n _extensionsLoadAnimationChannelAsync(context, animationContext, animation, channel, onLoad) {\n return this._applyExtensions(animation, \"loadAnimationChannel\", (extension) => extension._loadAnimationChannelAsync && extension._loadAnimationChannelAsync(context, animationContext, animation, channel, onLoad));\n }\n _extensionsLoadSkinAsync(context, node, skin) {\n return this._applyExtensions(skin, \"loadSkin\", (extension) => extension._loadSkinAsync && extension._loadSkinAsync(context, node, skin));\n }\n _extensionsLoadUriAsync(context, property, uri) {\n return this._applyExtensions(property, \"loadUri\", (extension) => extension._loadUriAsync && extension._loadUriAsync(context, property, uri));\n }\n _extensionsLoadBufferViewAsync(context, bufferView) {\n return this._applyExtensions(bufferView, \"loadBufferView\", (extension) => extension.loadBufferViewAsync && extension.loadBufferViewAsync(context, bufferView));\n }\n _extensionsLoadBufferAsync(context, buffer, byteOffset, byteLength) {\n return this._applyExtensions(buffer, \"loadBuffer\", (extension) => extension.loadBufferAsync && extension.loadBufferAsync(context, buffer, byteOffset, byteLength));\n }\n /**\n * Helper method called by a loader extension to load an glTF extension.\n * @param context The context when loading the asset\n * @param property The glTF property to load the extension from\n * @param extensionName The name of the extension to load\n * @param actionAsync The action to run\n * @returns The promise returned by actionAsync or null if the extension does not exist\n */\n static LoadExtensionAsync(context, property, extensionName, actionAsync) {\n if (!property.extensions) {\n return null;\n }\n const extensions = property.extensions;\n const extension = extensions[extensionName];\n if (!extension) {\n return null;\n }\n return actionAsync(`${context}/extensions/${extensionName}`, extension);\n }\n /**\n * Helper method called by a loader extension to load a glTF extra.\n * @param context The context when loading the asset\n * @param property The glTF property to load the extra from\n * @param extensionName The name of the extension to load\n * @param actionAsync The action to run\n * @returns The promise returned by actionAsync or null if the extra does not exist\n */\n static LoadExtraAsync(context, property, extensionName, actionAsync) {\n if (!property.extras) {\n return null;\n }\n const extras = property.extras;\n const extra = extras[extensionName];\n if (!extra) {\n return null;\n }\n return actionAsync(`${context}/extras/${extensionName}`, extra);\n }\n /**\n * Checks for presence of an extension.\n * @param name The name of the extension to check\n * @returns A boolean indicating the presence of the given extension name in `extensionsUsed`\n */\n isExtensionUsed(name) {\n return !!this._gltf.extensionsUsed && this._gltf.extensionsUsed.indexOf(name) !== -1;\n }\n /**\n * Increments the indentation level and logs a message.\n * @param message The message to log\n */\n logOpen(message) {\n this._parent._logOpen(message);\n }\n /**\n * Decrements the indentation level.\n */\n logClose() {\n this._parent._logClose();\n }\n /**\n * Logs a message\n * @param message The message to log\n */\n log(message) {\n this._parent._log(message);\n }\n /**\n * Starts a performance counter.\n * @param counterName The name of the performance counter\n */\n startPerformanceCounter(counterName) {\n this._parent._startPerformanceCounter(counterName);\n }\n /**\n * Ends a performance counter.\n * @param counterName The name of the performance counter\n */\n endPerformanceCounter(counterName) {\n this._parent._endPerformanceCounter(counterName);\n }\n}\nGLTFLoader._RegisteredExtensions = {};\n/**\n * The default glTF sampler.\n */\nGLTFLoader.DefaultSampler = { index: -1 };\nGLTFFileLoader._CreateGLTF2Loader = (parent) => new GLTFLoader(parent);\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}