45a3b0f4eb292c7b7f4dc6f17452c0070b22d01bde38057bcd5e0231ccc7af2e.json 139 KB

1
  1. {"ast":null,"code":"import { Logger } from \"../../Misc/logger.js\";\nimport { Camera } from \"../../Cameras/camera.js\";\nimport { Vector3 } from \"../../Maths/math.vector.js\";\nimport { Color3, Color4 } from \"../../Maths/math.color.js\";\nimport { Mesh } from \"../../Meshes/mesh.js\";\nimport { Geometry } from \"../../Meshes/geometry.js\";\nimport { TransformNode } from \"../../Meshes/transformNode.js\";\nimport { Material } from \"../../Materials/material.js\";\nimport { MultiMaterial } from \"../../Materials/multiMaterial.js\";\nimport { CubeTexture } from \"../../Materials/Textures/cubeTexture.js\";\nimport { HDRCubeTexture } from \"../../Materials/Textures/hdrCubeTexture.js\";\nimport { AnimationGroup } from \"../../Animations/animationGroup.js\";\nimport { Light } from \"../../Lights/light.js\";\nimport { SceneComponentConstants } from \"../../sceneComponent.js\";\nimport { SceneLoader } from \"../../Loading/sceneLoader.js\";\nimport { AssetContainer } from \"../../assetContainer.js\";\nimport { ActionManager } from \"../../Actions/actionManager.js\";\nimport { Skeleton } from \"../../Bones/skeleton.js\";\nimport { MorphTargetManager } from \"../../Morph/morphTargetManager.js\";\nimport { CannonJSPlugin } from \"../../Physics/v1/Plugins/cannonJSPlugin.js\";\nimport { OimoJSPlugin } from \"../../Physics/v1/Plugins/oimoJSPlugin.js\";\nimport { AmmoJSPlugin } from \"../../Physics/v1/Plugins/ammoJSPlugin.js\";\nimport { ReflectionProbe } from \"../../Probes/reflectionProbe.js\";\nimport { GetClass } from \"../../Misc/typeStore.js\";\nimport { Tools } from \"../../Misc/tools.js\";\nimport { PostProcess } from \"../../PostProcesses/postProcess.js\";\nimport { SpriteManager } from \"../../Sprites/spriteManager.js\";\nimport { GetIndividualParser, Parse } from \"./babylonFileParser.function.js\";\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/naming-convention, no-var\nexport var _BabylonLoaderRegistered = true;\n/**\n * Helps setting up some configuration for the babylon file loader.\n */\nexport class BabylonFileLoaderConfiguration {}\n/**\n * The loader does not allow injecting custom physics engine into the plugins.\n * Unfortunately in ES6, we need to manually inject them into the plugin.\n * So you could set this variable to your engine import to make it work.\n */\nBabylonFileLoaderConfiguration.LoaderInjectedPhysicsEngine = undefined;\nlet tempIndexContainer = {};\nlet tempMaterialIndexContainer = {};\nlet tempMorphTargetManagerIndexContainer = {};\nconst parseMaterialByPredicate = (predicate, parsedData, scene, rootUrl) => {\n if (!parsedData.materials) {\n return null;\n }\n for (let index = 0, cache = parsedData.materials.length; index < cache; index++) {\n const parsedMaterial = parsedData.materials[index];\n if (predicate(parsedMaterial)) {\n return {\n parsedMaterial,\n material: Material.Parse(parsedMaterial, scene, rootUrl)\n };\n }\n }\n return null;\n};\nconst isDescendantOf = (mesh, names, hierarchyIds) => {\n for (const i in names) {\n if (mesh.name === names[i]) {\n hierarchyIds.push(mesh.id);\n return true;\n }\n }\n if (mesh.parentId !== undefined && hierarchyIds.indexOf(mesh.parentId) !== -1) {\n hierarchyIds.push(mesh.id);\n return true;\n }\n return false;\n};\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst logOperation = (operation, producer) => {\n return operation + \" of \" + (producer ? producer.file + \" from \" + producer.name + \" version: \" + producer.version + \", exporter version: \" + producer.exporter_version : \"unknown\");\n};\nconst loadDetailLevels = (scene, mesh) => {\n const mastermesh = mesh;\n // Every value specified in the ids array of the lod data points to another mesh which should be used as the lower LOD level.\n // The distances (or coverages) array values specified are used along with the lod mesh ids as a hint to determine the switching threshold for the various LODs.\n if (mesh._waitingData.lods) {\n if (mesh._waitingData.lods.ids && mesh._waitingData.lods.ids.length > 0) {\n const lodmeshes = mesh._waitingData.lods.ids;\n const wasenabled = mastermesh.isEnabled(false);\n if (mesh._waitingData.lods.distances) {\n const distances = mesh._waitingData.lods.distances;\n if (distances.length >= lodmeshes.length) {\n const culling = distances.length > lodmeshes.length ? distances[distances.length - 1] : 0;\n mastermesh.setEnabled(false);\n for (let index = 0; index < lodmeshes.length; index++) {\n const lodid = lodmeshes[index];\n const lodmesh = scene.getMeshById(lodid);\n if (lodmesh != null) {\n mastermesh.addLODLevel(distances[index], lodmesh);\n }\n }\n if (culling > 0) {\n mastermesh.addLODLevel(culling, null);\n }\n if (wasenabled === true) {\n mastermesh.setEnabled(true);\n }\n } else {\n Tools.Warn(\"Invalid level of detail distances for \" + mesh.name);\n }\n }\n }\n mesh._waitingData.lods = null;\n }\n};\nconst findParent = (parentId, parentInstanceIndex, scene) => {\n if (typeof parentId !== \"number\") {\n const parentEntry = scene.getLastEntryById(parentId);\n if (parentEntry && parentInstanceIndex !== undefined && parentInstanceIndex !== null) {\n const instance = parentEntry.instances[parseInt(parentInstanceIndex)];\n return instance;\n }\n return parentEntry;\n }\n const parent = tempIndexContainer[parentId];\n if (parent && parentInstanceIndex !== undefined && parentInstanceIndex !== null) {\n const instance = parent.instances[parseInt(parentInstanceIndex)];\n return instance;\n }\n return parent;\n};\nconst findMaterial = (materialId, scene) => {\n if (typeof materialId !== \"number\") {\n return scene.getLastMaterialById(materialId, true);\n }\n return tempMaterialIndexContainer[materialId];\n};\nconst loadAssetContainer = (scene, data, rootUrl, onError, addToScene = false) => {\n const container = new AssetContainer(scene);\n // Entire method running in try block, so ALWAYS logs as far as it got, only actually writes details\n // when SceneLoader.debugLogging = true (default), or exception encountered.\n // Everything stored in var log instead of writing separate lines to support only writing in exception,\n // and avoid problems with multiple concurrent .babylon loads.\n let log = \"importScene has failed JSON parse\";\n try {\n // eslint-disable-next-line no-var\n var parsedData = JSON.parse(data);\n log = \"\";\n const fullDetails = SceneLoader.loggingLevel === SceneLoader.DETAILED_LOGGING;\n let index;\n let cache;\n // Environment texture\n if (parsedData.environmentTexture !== undefined && parsedData.environmentTexture !== null) {\n // PBR needed for both HDR texture (gamma space) & a sky box\n const isPBR = parsedData.isPBR !== undefined ? parsedData.isPBR : true;\n if (parsedData.environmentTextureType && parsedData.environmentTextureType === \"BABYLON.HDRCubeTexture\") {\n const hdrSize = parsedData.environmentTextureSize ? parsedData.environmentTextureSize : 128;\n const hdrTexture = new HDRCubeTexture((parsedData.environmentTexture.match(/https?:\\/\\//g) ? \"\" : rootUrl) + parsedData.environmentTexture, scene, hdrSize, true, !isPBR, undefined, parsedData.environmentTexturePrefilterOnLoad);\n if (parsedData.environmentTextureRotationY) {\n hdrTexture.rotationY = parsedData.environmentTextureRotationY;\n }\n scene.environmentTexture = hdrTexture;\n } else {\n if (typeof parsedData.environmentTexture === \"object\") {\n const environmentTexture = CubeTexture.Parse(parsedData.environmentTexture, scene, rootUrl);\n scene.environmentTexture = environmentTexture;\n } else if (parsedData.environmentTexture.endsWith(\".env\")) {\n const compressedTexture = new CubeTexture((parsedData.environmentTexture.match(/https?:\\/\\//g) ? \"\" : rootUrl) + parsedData.environmentTexture, scene, parsedData.environmentTextureForcedExtension);\n if (parsedData.environmentTextureRotationY) {\n compressedTexture.rotationY = parsedData.environmentTextureRotationY;\n }\n scene.environmentTexture = compressedTexture;\n } else {\n const cubeTexture = CubeTexture.CreateFromPrefilteredData((parsedData.environmentTexture.match(/https?:\\/\\//g) ? \"\" : rootUrl) + parsedData.environmentTexture, scene, parsedData.environmentTextureForcedExtension);\n if (parsedData.environmentTextureRotationY) {\n cubeTexture.rotationY = parsedData.environmentTextureRotationY;\n }\n scene.environmentTexture = cubeTexture;\n }\n }\n if (parsedData.createDefaultSkybox === true) {\n const skyboxScale = scene.activeCamera !== undefined && scene.activeCamera !== null ? (scene.activeCamera.maxZ - scene.activeCamera.minZ) / 2 : 1000;\n const skyboxBlurLevel = parsedData.skyboxBlurLevel || 0;\n scene.createDefaultSkybox(scene.environmentTexture, isPBR, skyboxScale, skyboxBlurLevel);\n }\n container.environmentTexture = scene.environmentTexture;\n }\n // Environment Intensity\n if (parsedData.environmentIntensity !== undefined && parsedData.environmentIntensity !== null) {\n scene.environmentIntensity = parsedData.environmentIntensity;\n }\n // Lights\n if (parsedData.lights !== undefined && parsedData.lights !== null) {\n for (index = 0, cache = parsedData.lights.length; index < cache; index++) {\n const parsedLight = parsedData.lights[index];\n const light = Light.Parse(parsedLight, scene);\n if (light) {\n tempIndexContainer[parsedLight.uniqueId] = light;\n container.lights.push(light);\n light._parentContainer = container;\n log += index === 0 ? \"\\n\\tLights:\" : \"\";\n log += \"\\n\\t\\t\" + light.toString(fullDetails);\n }\n }\n }\n // Reflection probes\n if (parsedData.reflectionProbes !== undefined && parsedData.reflectionProbes !== null) {\n for (index = 0, cache = parsedData.reflectionProbes.length; index < cache; index++) {\n const parsedReflectionProbe = parsedData.reflectionProbes[index];\n const reflectionProbe = ReflectionProbe.Parse(parsedReflectionProbe, scene, rootUrl);\n if (reflectionProbe) {\n container.reflectionProbes.push(reflectionProbe);\n reflectionProbe._parentContainer = container;\n log += index === 0 ? \"\\n\\tReflection Probes:\" : \"\";\n log += \"\\n\\t\\t\" + reflectionProbe.toString(fullDetails);\n }\n }\n }\n // Animations\n if (parsedData.animations !== undefined && parsedData.animations !== null) {\n for (index = 0, cache = parsedData.animations.length; index < cache; index++) {\n const parsedAnimation = parsedData.animations[index];\n const internalClass = GetClass(\"BABYLON.Animation\");\n if (internalClass) {\n const animation = internalClass.Parse(parsedAnimation);\n scene.animations.push(animation);\n container.animations.push(animation);\n log += index === 0 ? \"\\n\\tAnimations:\" : \"\";\n log += \"\\n\\t\\t\" + animation.toString(fullDetails);\n }\n }\n }\n // Materials\n if (parsedData.materials !== undefined && parsedData.materials !== null) {\n for (index = 0, cache = parsedData.materials.length; index < cache; index++) {\n const parsedMaterial = parsedData.materials[index];\n const mat = Material.Parse(parsedMaterial, scene, rootUrl);\n if (mat) {\n tempMaterialIndexContainer[parsedMaterial.uniqueId || parsedMaterial.id] = mat;\n container.materials.push(mat);\n mat._parentContainer = container;\n log += index === 0 ? \"\\n\\tMaterials:\" : \"\";\n log += \"\\n\\t\\t\" + mat.toString(fullDetails);\n // Textures\n const textures = mat.getActiveTextures();\n textures.forEach(t => {\n if (container.textures.indexOf(t) == -1) {\n container.textures.push(t);\n t._parentContainer = container;\n }\n });\n }\n }\n }\n if (parsedData.multiMaterials !== undefined && parsedData.multiMaterials !== null) {\n for (index = 0, cache = parsedData.multiMaterials.length; index < cache; index++) {\n const parsedMultiMaterial = parsedData.multiMaterials[index];\n const mmat = MultiMaterial.ParseMultiMaterial(parsedMultiMaterial, scene);\n tempMaterialIndexContainer[parsedMultiMaterial.uniqueId || parsedMultiMaterial.id] = mmat;\n container.multiMaterials.push(mmat);\n mmat._parentContainer = container;\n log += index === 0 ? \"\\n\\tMultiMaterials:\" : \"\";\n log += \"\\n\\t\\t\" + mmat.toString(fullDetails);\n // Textures\n const textures = mmat.getActiveTextures();\n textures.forEach(t => {\n if (container.textures.indexOf(t) == -1) {\n container.textures.push(t);\n t._parentContainer = container;\n }\n });\n }\n }\n // Morph targets\n if (parsedData.morphTargetManagers !== undefined && parsedData.morphTargetManagers !== null) {\n for (const parsedManager of parsedData.morphTargetManagers) {\n const manager = MorphTargetManager.Parse(parsedManager, scene);\n tempMorphTargetManagerIndexContainer[parsedManager.id] = manager;\n container.morphTargetManagers.push(manager);\n manager._parentContainer = container;\n }\n }\n // Skeletons\n if (parsedData.skeletons !== undefined && parsedData.skeletons !== null) {\n for (index = 0, cache = parsedData.skeletons.length; index < cache; index++) {\n const parsedSkeleton = parsedData.skeletons[index];\n const skeleton = Skeleton.Parse(parsedSkeleton, scene);\n container.skeletons.push(skeleton);\n skeleton._parentContainer = container;\n log += index === 0 ? \"\\n\\tSkeletons:\" : \"\";\n log += \"\\n\\t\\t\" + skeleton.toString(fullDetails);\n }\n }\n // Geometries\n const geometries = parsedData.geometries;\n if (geometries !== undefined && geometries !== null) {\n const addedGeometry = new Array();\n // VertexData\n const vertexData = geometries.vertexData;\n if (vertexData !== undefined && vertexData !== null) {\n for (index = 0, cache = vertexData.length; index < cache; index++) {\n const parsedVertexData = vertexData[index];\n addedGeometry.push(Geometry.Parse(parsedVertexData, scene, rootUrl));\n }\n }\n addedGeometry.forEach(g => {\n if (g) {\n container.geometries.push(g);\n g._parentContainer = container;\n }\n });\n }\n // Transform nodes\n if (parsedData.transformNodes !== undefined && parsedData.transformNodes !== null) {\n for (index = 0, cache = parsedData.transformNodes.length; index < cache; index++) {\n const parsedTransformNode = parsedData.transformNodes[index];\n const node = TransformNode.Parse(parsedTransformNode, scene, rootUrl);\n tempIndexContainer[parsedTransformNode.uniqueId] = node;\n container.transformNodes.push(node);\n node._parentContainer = container;\n }\n }\n // Meshes\n if (parsedData.meshes !== undefined && parsedData.meshes !== null) {\n for (index = 0, cache = parsedData.meshes.length; index < cache; index++) {\n const parsedMesh = parsedData.meshes[index];\n const mesh = Mesh.Parse(parsedMesh, scene, rootUrl);\n tempIndexContainer[parsedMesh.uniqueId] = mesh;\n container.meshes.push(mesh);\n mesh._parentContainer = container;\n if (mesh.hasInstances) {\n for (const instance of mesh.instances) {\n container.meshes.push(instance);\n instance._parentContainer = container;\n }\n }\n log += index === 0 ? \"\\n\\tMeshes:\" : \"\";\n log += \"\\n\\t\\t\" + mesh.toString(fullDetails);\n }\n }\n // Cameras\n if (parsedData.cameras !== undefined && parsedData.cameras !== null) {\n for (index = 0, cache = parsedData.cameras.length; index < cache; index++) {\n const parsedCamera = parsedData.cameras[index];\n const camera = Camera.Parse(parsedCamera, scene);\n tempIndexContainer[parsedCamera.uniqueId] = camera;\n container.cameras.push(camera);\n camera._parentContainer = container;\n log += index === 0 ? \"\\n\\tCameras:\" : \"\";\n log += \"\\n\\t\\t\" + camera.toString(fullDetails);\n }\n }\n // Postprocesses\n if (parsedData.postProcesses !== undefined && parsedData.postProcesses !== null) {\n for (index = 0, cache = parsedData.postProcesses.length; index < cache; index++) {\n const parsedPostProcess = parsedData.postProcesses[index];\n const postProcess = PostProcess.Parse(parsedPostProcess, scene, rootUrl);\n if (postProcess) {\n container.postProcesses.push(postProcess);\n postProcess._parentContainer = container;\n log += index === 0 ? \"\\nPostprocesses:\" : \"\";\n log += \"\\n\\t\\t\" + postProcess.toString();\n }\n }\n }\n // Animation Groups\n if (parsedData.animationGroups !== undefined && parsedData.animationGroups !== null) {\n for (index = 0, cache = parsedData.animationGroups.length; index < cache; index++) {\n const parsedAnimationGroup = parsedData.animationGroups[index];\n const animationGroup = AnimationGroup.Parse(parsedAnimationGroup, scene);\n container.animationGroups.push(animationGroup);\n animationGroup._parentContainer = container;\n log += index === 0 ? \"\\n\\tAnimationGroups:\" : \"\";\n log += \"\\n\\t\\t\" + animationGroup.toString(fullDetails);\n }\n }\n // Sprites\n if (parsedData.spriteManagers) {\n for (let index = 0, cache = parsedData.spriteManagers.length; index < cache; index++) {\n const parsedSpriteManager = parsedData.spriteManagers[index];\n const spriteManager = SpriteManager.Parse(parsedSpriteManager, scene, rootUrl);\n log += \"\\n\\t\\tSpriteManager \" + spriteManager.name;\n }\n }\n // Browsing all the graph to connect the dots\n for (index = 0, cache = scene.cameras.length; index < cache; index++) {\n const camera = scene.cameras[index];\n if (camera._waitingParentId !== null) {\n camera.parent = findParent(camera._waitingParentId, camera._waitingParentInstanceIndex, scene);\n camera._waitingParentId = null;\n camera._waitingParentInstanceIndex = null;\n }\n }\n for (index = 0, cache = scene.lights.length; index < cache; index++) {\n const light = scene.lights[index];\n if (light && light._waitingParentId !== null) {\n light.parent = findParent(light._waitingParentId, light._waitingParentInstanceIndex, scene);\n light._waitingParentId = null;\n light._waitingParentInstanceIndex = null;\n }\n }\n // Connect parents & children and parse actions and lods\n for (index = 0, cache = scene.transformNodes.length; index < cache; index++) {\n const transformNode = scene.transformNodes[index];\n if (transformNode._waitingParentId !== null) {\n transformNode.parent = findParent(transformNode._waitingParentId, transformNode._waitingParentInstanceIndex, scene);\n transformNode._waitingParentId = null;\n transformNode._waitingParentInstanceIndex = null;\n }\n }\n for (index = 0, cache = scene.meshes.length; index < cache; index++) {\n const mesh = scene.meshes[index];\n if (mesh._waitingParentId !== null) {\n mesh.parent = findParent(mesh._waitingParentId, mesh._waitingParentInstanceIndex, scene);\n mesh._waitingParentId = null;\n mesh._waitingParentInstanceIndex = null;\n }\n if (mesh._waitingData.lods) {\n loadDetailLevels(scene, mesh);\n }\n }\n // link multimats with materials\n scene.multiMaterials.forEach(multimat => {\n multimat._waitingSubMaterialsUniqueIds.forEach(subMaterial => {\n multimat.subMaterials.push(findMaterial(subMaterial, scene));\n });\n multimat._waitingSubMaterialsUniqueIds = [];\n });\n // link meshes with materials\n scene.meshes.forEach(mesh => {\n if (mesh._waitingMaterialId !== null) {\n mesh.material = findMaterial(mesh._waitingMaterialId, scene);\n mesh._waitingMaterialId = null;\n }\n });\n // link meshes with morph target managers\n scene.meshes.forEach(mesh => {\n if (mesh._waitingMorphTargetManagerId !== null) {\n mesh.morphTargetManager = tempMorphTargetManagerIndexContainer[mesh._waitingMorphTargetManagerId];\n mesh._waitingMorphTargetManagerId = null;\n }\n });\n // link skeleton transform nodes\n for (index = 0, cache = scene.skeletons.length; index < cache; index++) {\n const skeleton = scene.skeletons[index];\n if (skeleton._hasWaitingData) {\n if (skeleton.bones != null) {\n skeleton.bones.forEach(bone => {\n if (bone._waitingTransformNodeId) {\n const linkTransformNode = scene.getLastEntryById(bone._waitingTransformNodeId);\n if (linkTransformNode) {\n bone.linkTransformNode(linkTransformNode);\n }\n bone._waitingTransformNodeId = null;\n }\n });\n }\n skeleton._hasWaitingData = null;\n }\n }\n // freeze world matrix application\n for (index = 0, cache = scene.meshes.length; index < cache; index++) {\n const currentMesh = scene.meshes[index];\n if (currentMesh._waitingData.freezeWorldMatrix) {\n currentMesh.freezeWorldMatrix();\n currentMesh._waitingData.freezeWorldMatrix = null;\n } else {\n currentMesh.computeWorldMatrix(true);\n }\n }\n // Lights exclusions / inclusions\n for (index = 0, cache = scene.lights.length; index < cache; index++) {\n const light = scene.lights[index];\n // Excluded check\n if (light._excludedMeshesIds.length > 0) {\n for (let excludedIndex = 0; excludedIndex < light._excludedMeshesIds.length; excludedIndex++) {\n const excludedMesh = scene.getMeshById(light._excludedMeshesIds[excludedIndex]);\n if (excludedMesh) {\n light.excludedMeshes.push(excludedMesh);\n }\n }\n light._excludedMeshesIds = [];\n }\n // Included check\n if (light._includedOnlyMeshesIds.length > 0) {\n for (let includedOnlyIndex = 0; includedOnlyIndex < light._includedOnlyMeshesIds.length; includedOnlyIndex++) {\n const includedOnlyMesh = scene.getMeshById(light._includedOnlyMeshesIds[includedOnlyIndex]);\n if (includedOnlyMesh) {\n light.includedOnlyMeshes.push(includedOnlyMesh);\n }\n }\n light._includedOnlyMeshesIds = [];\n }\n }\n scene.geometries.forEach(g => {\n g._loadedUniqueId = \"\";\n });\n Parse(parsedData, scene, container, rootUrl);\n // Actions (scene) Done last as it can access other objects.\n for (index = 0, cache = scene.meshes.length; index < cache; index++) {\n const mesh = scene.meshes[index];\n if (mesh._waitingData.actions) {\n ActionManager.Parse(mesh._waitingData.actions, mesh, scene);\n mesh._waitingData.actions = null;\n }\n }\n if (parsedData.actions !== undefined && parsedData.actions !== null) {\n ActionManager.Parse(parsedData.actions, null, scene);\n }\n } catch (err) {\n const msg = logOperation(\"loadAssets\", parsedData ? parsedData.producer : \"Unknown\") + log;\n if (onError) {\n onError(msg, err);\n } else {\n Logger.Log(msg);\n throw err;\n }\n } finally {\n tempIndexContainer = {};\n tempMaterialIndexContainer = {};\n tempMorphTargetManagerIndexContainer = {};\n if (!addToScene) {\n container.removeAllFromScene();\n }\n if (log !== null && SceneLoader.loggingLevel !== SceneLoader.NO_LOGGING) {\n Logger.Log(logOperation(\"loadAssets\", parsedData ? parsedData.producer : \"Unknown\") + (SceneLoader.loggingLevel !== SceneLoader.MINIMAL_LOGGING ? log : \"\"));\n }\n }\n return container;\n};\nSceneLoader.RegisterPlugin({\n name: \"babylon.js\",\n extensions: \".babylon\",\n canDirectLoad: data => {\n if (data.indexOf(\"babylon\") !== -1) {\n // We consider that the producer string is filled\n return true;\n }\n return false;\n },\n importMesh: (meshesNames, scene, data, rootUrl, meshes, particleSystems, skeletons, onError) => {\n // Entire method running in try block, so ALWAYS logs as far as it got, only actually writes details\n // when SceneLoader.debugLogging = true (default), or exception encountered.\n // Everything stored in var log instead of writing separate lines to support only writing in exception,\n // and avoid problems with multiple concurrent .babylon loads.\n let log = \"importMesh has failed JSON parse\";\n try {\n // eslint-disable-next-line no-var\n var parsedData = JSON.parse(data);\n log = \"\";\n const fullDetails = SceneLoader.loggingLevel === SceneLoader.DETAILED_LOGGING;\n if (!meshesNames) {\n meshesNames = null;\n } else if (!Array.isArray(meshesNames)) {\n meshesNames = [meshesNames];\n }\n const hierarchyIds = [];\n const parsedIdToNodeMap = new Map();\n // Transform nodes (the overall idea is to load all of them as this is super fast and then get rid of the ones we don't need)\n const loadedTransformNodes = [];\n if (parsedData.transformNodes !== undefined && parsedData.transformNodes !== null) {\n for (let index = 0, cache = parsedData.transformNodes.length; index < cache; index++) {\n const parsedJSONTransformNode = parsedData.transformNodes[index];\n const parsedTransformNode = TransformNode.Parse(parsedJSONTransformNode, scene, rootUrl);\n loadedTransformNodes.push(parsedTransformNode);\n parsedIdToNodeMap.set(parsedTransformNode._waitingParsedUniqueId, parsedTransformNode);\n parsedTransformNode._waitingParsedUniqueId = null;\n }\n }\n if (parsedData.meshes !== undefined && parsedData.meshes !== null) {\n const loadedSkeletonsIds = [];\n const loadedMaterialsIds = [];\n const loadedMaterialsUniqueIds = [];\n const loadedMorphTargetManagerIds = [];\n for (let index = 0, cache = parsedData.meshes.length; index < cache; index++) {\n const parsedMesh = parsedData.meshes[index];\n if (meshesNames === null || isDescendantOf(parsedMesh, meshesNames, hierarchyIds)) {\n if (meshesNames !== null) {\n // Remove found mesh name from list.\n delete meshesNames[meshesNames.indexOf(parsedMesh.name)];\n }\n //Geometry?\n if (parsedMesh.geometryId !== undefined && parsedMesh.geometryId !== null) {\n //does the file contain geometries?\n if (parsedData.geometries !== undefined && parsedData.geometries !== null) {\n //find the correct geometry and add it to the scene\n let found = false;\n [\"boxes\", \"spheres\", \"cylinders\", \"toruses\", \"grounds\", \"planes\", \"torusKnots\", \"vertexData\"].forEach(geometryType => {\n if (found === true || !parsedData.geometries[geometryType] || !Array.isArray(parsedData.geometries[geometryType])) {\n return;\n } else {\n parsedData.geometries[geometryType].forEach(parsedGeometryData => {\n if (parsedGeometryData.id === parsedMesh.geometryId) {\n switch (geometryType) {\n case \"vertexData\":\n Geometry.Parse(parsedGeometryData, scene, rootUrl);\n break;\n }\n found = true;\n }\n });\n }\n });\n if (found === false) {\n Logger.Warn(\"Geometry not found for mesh \" + parsedMesh.id);\n }\n }\n }\n // Material ?\n if (parsedMesh.materialUniqueId || parsedMesh.materialId) {\n // if we have a unique ID, look up and store in loadedMaterialsUniqueIds, else use loadedMaterialsIds\n const materialArray = parsedMesh.materialUniqueId ? loadedMaterialsUniqueIds : loadedMaterialsIds;\n let materialFound = materialArray.indexOf(parsedMesh.materialUniqueId || parsedMesh.materialId) !== -1;\n if (materialFound === false && parsedData.multiMaterials !== undefined && parsedData.multiMaterials !== null) {\n // Loads a submaterial of a multimaterial\n const loadSubMaterial = (subMatId, predicate) => {\n materialArray.push(subMatId);\n const mat = parseMaterialByPredicate(predicate, parsedData, scene, rootUrl);\n if (mat && mat.material) {\n tempMaterialIndexContainer[mat.parsedMaterial.uniqueId || mat.parsedMaterial.id] = mat.material;\n log += \"\\n\\tMaterial \" + mat.material.toString(fullDetails);\n }\n };\n for (let multimatIndex = 0, multimatCache = parsedData.multiMaterials.length; multimatIndex < multimatCache; multimatIndex++) {\n const parsedMultiMaterial = parsedData.multiMaterials[multimatIndex];\n if (parsedMesh.materialUniqueId && parsedMultiMaterial.uniqueId === parsedMesh.materialUniqueId || parsedMultiMaterial.id === parsedMesh.materialId) {\n if (parsedMultiMaterial.materialsUniqueIds) {\n // if the materials inside the multimat are stored by unique id\n parsedMultiMaterial.materialsUniqueIds.forEach(subMatId => loadSubMaterial(subMatId, parsedMaterial => parsedMaterial.uniqueId === subMatId));\n } else {\n // if the mats are stored by id instead\n parsedMultiMaterial.materials.forEach(subMatId => loadSubMaterial(subMatId, parsedMaterial => parsedMaterial.id === subMatId));\n }\n materialArray.push(parsedMultiMaterial.uniqueId || parsedMultiMaterial.id);\n const mmat = MultiMaterial.ParseMultiMaterial(parsedMultiMaterial, scene);\n tempMaterialIndexContainer[parsedMultiMaterial.uniqueId || parsedMultiMaterial.id] = mmat;\n if (mmat) {\n materialFound = true;\n log += \"\\n\\tMulti-Material \" + mmat.toString(fullDetails);\n }\n break;\n }\n }\n }\n if (materialFound === false) {\n materialArray.push(parsedMesh.materialUniqueId || parsedMesh.materialId);\n const mat = parseMaterialByPredicate(parsedMaterial => parsedMesh.materialUniqueId && parsedMaterial.uniqueId === parsedMesh.materialUniqueId || parsedMaterial.id === parsedMesh.materialId, parsedData, scene, rootUrl);\n if (!mat || !mat.material) {\n Logger.Warn(\"Material not found for mesh \" + parsedMesh.id);\n } else {\n tempMaterialIndexContainer[mat.parsedMaterial.uniqueId || mat.parsedMaterial.id] = mat.material;\n log += \"\\n\\tMaterial \" + mat.material.toString(fullDetails);\n }\n }\n }\n // Skeleton ?\n if (parsedMesh.skeletonId !== null && parsedMesh.skeletonId !== undefined && parsedData.skeletonId !== -1 && parsedData.skeletons !== undefined && parsedData.skeletons !== null) {\n const skeletonAlreadyLoaded = loadedSkeletonsIds.indexOf(parsedMesh.skeletonId) > -1;\n if (!skeletonAlreadyLoaded) {\n for (let skeletonIndex = 0, skeletonCache = parsedData.skeletons.length; skeletonIndex < skeletonCache; skeletonIndex++) {\n const parsedSkeleton = parsedData.skeletons[skeletonIndex];\n if (parsedSkeleton.id === parsedMesh.skeletonId) {\n const skeleton = Skeleton.Parse(parsedSkeleton, scene);\n skeletons.push(skeleton);\n loadedSkeletonsIds.push(parsedSkeleton.id);\n log += \"\\n\\tSkeleton \" + skeleton.toString(fullDetails);\n }\n }\n }\n }\n // Morph targets ?\n if (parsedMesh.morphTargetManagerId > -1 && parsedData.morphTargetManagers !== undefined && parsedData.morphTargetManagers !== null) {\n const morphTargetManagerAlreadyLoaded = loadedMorphTargetManagerIds.indexOf(parsedMesh.morphTargetManagerId) > -1;\n if (!morphTargetManagerAlreadyLoaded) {\n for (let morphTargetManagerIndex = 0; morphTargetManagerIndex < parsedData.morphTargetManagers.length; morphTargetManagerIndex++) {\n const parsedManager = parsedData.morphTargetManagers[morphTargetManagerIndex];\n if (parsedManager.id === parsedMesh.morphTargetManagerId) {\n const morphTargetManager = MorphTargetManager.Parse(parsedManager, scene);\n tempMorphTargetManagerIndexContainer[parsedManager.id] = morphTargetManager;\n loadedMorphTargetManagerIds.push(parsedManager.id);\n log += \"\\nMorph target manager\" + morphTargetManager.toString();\n }\n }\n }\n }\n const mesh = Mesh.Parse(parsedMesh, scene, rootUrl);\n meshes.push(mesh);\n parsedIdToNodeMap.set(mesh._waitingParsedUniqueId, mesh);\n mesh._waitingParsedUniqueId = null;\n log += \"\\n\\tMesh \" + mesh.toString(fullDetails);\n }\n }\n // link multimats with materials\n scene.multiMaterials.forEach(multimat => {\n multimat._waitingSubMaterialsUniqueIds.forEach(subMaterial => {\n multimat.subMaterials.push(findMaterial(subMaterial, scene));\n });\n multimat._waitingSubMaterialsUniqueIds = [];\n });\n // link meshes with materials\n scene.meshes.forEach(mesh => {\n if (mesh._waitingMaterialId !== null) {\n mesh.material = findMaterial(mesh._waitingMaterialId, scene);\n mesh._waitingMaterialId = null;\n }\n });\n // link meshes with morph target managers\n scene.meshes.forEach(mesh => {\n if (mesh._waitingMorphTargetManagerId !== null) {\n mesh.morphTargetManager = tempMorphTargetManagerIndexContainer[mesh._waitingMorphTargetManagerId];\n mesh._waitingMorphTargetManagerId = null;\n }\n });\n // Connecting parents and lods\n for (let index = 0, cache = scene.transformNodes.length; index < cache; index++) {\n const transformNode = scene.transformNodes[index];\n if (transformNode._waitingParentId !== null) {\n let parent = parsedIdToNodeMap.get(parseInt(transformNode._waitingParentId)) || null;\n if (parent === null) {\n parent = scene.getLastEntryById(transformNode._waitingParentId);\n }\n let parentNode = parent;\n if (transformNode._waitingParentInstanceIndex) {\n parentNode = parent.instances[parseInt(transformNode._waitingParentInstanceIndex)];\n transformNode._waitingParentInstanceIndex = null;\n }\n transformNode.parent = parentNode;\n transformNode._waitingParentId = null;\n }\n }\n let currentMesh;\n for (let index = 0, cache = scene.meshes.length; index < cache; index++) {\n currentMesh = scene.meshes[index];\n if (currentMesh._waitingParentId) {\n let parent = parsedIdToNodeMap.get(parseInt(currentMesh._waitingParentId)) || null;\n if (parent === null) {\n parent = scene.getLastEntryById(currentMesh._waitingParentId);\n }\n let parentNode = parent;\n if (currentMesh._waitingParentInstanceIndex) {\n parentNode = parent.instances[parseInt(currentMesh._waitingParentInstanceIndex)];\n currentMesh._waitingParentInstanceIndex = null;\n }\n currentMesh.parent = parentNode;\n currentMesh._waitingParentId = null;\n }\n if (currentMesh._waitingData.lods) {\n loadDetailLevels(scene, currentMesh);\n }\n }\n // Remove unused transform nodes\n for (const transformNode of loadedTransformNodes) {\n const childMeshes = transformNode.getChildMeshes(false);\n if (!childMeshes.length) {\n transformNode.dispose();\n }\n }\n // link skeleton transform nodes\n for (let index = 0, cache = scene.skeletons.length; index < cache; index++) {\n const skeleton = scene.skeletons[index];\n if (skeleton._hasWaitingData) {\n if (skeleton.bones != null) {\n skeleton.bones.forEach(bone => {\n if (bone._waitingTransformNodeId) {\n const linkTransformNode = scene.getLastEntryById(bone._waitingTransformNodeId);\n if (linkTransformNode) {\n bone.linkTransformNode(linkTransformNode);\n }\n bone._waitingTransformNodeId = null;\n }\n });\n }\n skeleton._hasWaitingData = null;\n }\n }\n // freeze and compute world matrix application\n for (let index = 0, cache = scene.meshes.length; index < cache; index++) {\n currentMesh = scene.meshes[index];\n if (currentMesh._waitingData.freezeWorldMatrix) {\n currentMesh.freezeWorldMatrix();\n currentMesh._waitingData.freezeWorldMatrix = null;\n } else {\n currentMesh.computeWorldMatrix(true);\n }\n }\n }\n // Particles\n if (parsedData.particleSystems !== undefined && parsedData.particleSystems !== null) {\n const parser = GetIndividualParser(SceneComponentConstants.NAME_PARTICLESYSTEM);\n if (parser) {\n for (let index = 0, cache = parsedData.particleSystems.length; index < cache; index++) {\n const parsedParticleSystem = parsedData.particleSystems[index];\n if (hierarchyIds.indexOf(parsedParticleSystem.emitterId) !== -1) {\n particleSystems.push(parser(parsedParticleSystem, scene, rootUrl));\n }\n }\n }\n }\n scene.geometries.forEach(g => {\n g._loadedUniqueId = \"\";\n });\n return true;\n } catch (err) {\n const msg = logOperation(\"importMesh\", parsedData ? parsedData.producer : \"Unknown\") + log;\n if (onError) {\n onError(msg, err);\n } else {\n Logger.Log(msg);\n throw err;\n }\n } finally {\n if (log !== null && SceneLoader.loggingLevel !== SceneLoader.NO_LOGGING) {\n Logger.Log(logOperation(\"importMesh\", parsedData ? parsedData.producer : \"Unknown\") + (SceneLoader.loggingLevel !== SceneLoader.MINIMAL_LOGGING ? log : \"\"));\n }\n tempMaterialIndexContainer = {};\n tempMorphTargetManagerIndexContainer = {};\n }\n return false;\n },\n load: (scene, data, rootUrl, onError) => {\n // Entire method running in try block, so ALWAYS logs as far as it got, only actually writes details\n // when SceneLoader.debugLogging = true (default), or exception encountered.\n // Everything stored in var log instead of writing separate lines to support only writing in exception,\n // and avoid problems with multiple concurrent .babylon loads.\n let log = \"importScene has failed JSON parse\";\n try {\n // eslint-disable-next-line no-var\n var parsedData = JSON.parse(data);\n log = \"\";\n // Scene\n if (parsedData.useDelayedTextureLoading !== undefined && parsedData.useDelayedTextureLoading !== null) {\n scene.useDelayedTextureLoading = parsedData.useDelayedTextureLoading && !SceneLoader.ForceFullSceneLoadingForIncremental;\n }\n if (parsedData.autoClear !== undefined && parsedData.autoClear !== null) {\n scene.autoClear = parsedData.autoClear;\n }\n if (parsedData.clearColor !== undefined && parsedData.clearColor !== null) {\n scene.clearColor = Color4.FromArray(parsedData.clearColor);\n }\n if (parsedData.ambientColor !== undefined && parsedData.ambientColor !== null) {\n scene.ambientColor = Color3.FromArray(parsedData.ambientColor);\n }\n if (parsedData.gravity !== undefined && parsedData.gravity !== null) {\n scene.gravity = Vector3.FromArray(parsedData.gravity);\n }\n if (parsedData.useRightHandedSystem !== undefined) {\n scene.useRightHandedSystem = !!parsedData.useRightHandedSystem;\n }\n // Fog\n if (parsedData.fogMode !== undefined && parsedData.fogMode !== null) {\n scene.fogMode = parsedData.fogMode;\n }\n if (parsedData.fogColor !== undefined && parsedData.fogColor !== null) {\n scene.fogColor = Color3.FromArray(parsedData.fogColor);\n }\n if (parsedData.fogStart !== undefined && parsedData.fogStart !== null) {\n scene.fogStart = parsedData.fogStart;\n }\n if (parsedData.fogEnd !== undefined && parsedData.fogEnd !== null) {\n scene.fogEnd = parsedData.fogEnd;\n }\n if (parsedData.fogDensity !== undefined && parsedData.fogDensity !== null) {\n scene.fogDensity = parsedData.fogDensity;\n }\n log += \"\\tFog mode for scene: \";\n switch (scene.fogMode) {\n case 0:\n log += \"none\\n\";\n break;\n // getters not compiling, so using hardcoded\n case 1:\n log += \"exp\\n\";\n break;\n case 2:\n log += \"exp2\\n\";\n break;\n case 3:\n log += \"linear\\n\";\n break;\n }\n //Physics\n if (parsedData.physicsEnabled) {\n let physicsPlugin;\n if (parsedData.physicsEngine === \"cannon\" || parsedData.physicsEngine === CannonJSPlugin.name) {\n physicsPlugin = new CannonJSPlugin(undefined, undefined, BabylonFileLoaderConfiguration.LoaderInjectedPhysicsEngine);\n } else if (parsedData.physicsEngine === \"oimo\" || parsedData.physicsEngine === OimoJSPlugin.name) {\n physicsPlugin = new OimoJSPlugin(undefined, BabylonFileLoaderConfiguration.LoaderInjectedPhysicsEngine);\n } else if (parsedData.physicsEngine === \"ammo\" || parsedData.physicsEngine === AmmoJSPlugin.name) {\n physicsPlugin = new AmmoJSPlugin(undefined, BabylonFileLoaderConfiguration.LoaderInjectedPhysicsEngine, undefined);\n }\n log = \"\\tPhysics engine \" + (parsedData.physicsEngine ? parsedData.physicsEngine : \"oimo\") + \" enabled\\n\";\n //else - default engine, which is currently oimo\n const physicsGravity = parsedData.gravity ? Vector3.FromArray(parsedData.gravity) : parsedData.physicsGravity ? Vector3.FromArray(parsedData.physicsGravity) : null;\n scene.enablePhysics(physicsGravity, physicsPlugin);\n }\n // Metadata\n if (parsedData.metadata !== undefined && parsedData.metadata !== null) {\n scene.metadata = parsedData.metadata;\n }\n //collisions, if defined. otherwise, default is true\n if (parsedData.collisionsEnabled !== undefined && parsedData.collisionsEnabled !== null) {\n scene.collisionsEnabled = parsedData.collisionsEnabled;\n }\n const container = loadAssetContainer(scene, data, rootUrl, onError, true);\n if (!container) {\n return false;\n }\n if (parsedData.autoAnimate) {\n scene.beginAnimation(scene, parsedData.autoAnimateFrom, parsedData.autoAnimateTo, parsedData.autoAnimateLoop, parsedData.autoAnimateSpeed || 1.0);\n }\n if (parsedData.activeCameraID !== undefined && parsedData.activeCameraID !== null) {\n scene.setActiveCameraById(parsedData.activeCameraID);\n }\n // Finish\n return true;\n } catch (err) {\n const msg = logOperation(\"importScene\", parsedData ? parsedData.producer : \"Unknown\") + log;\n if (onError) {\n onError(msg, err);\n } else {\n Logger.Log(msg);\n throw err;\n }\n } finally {\n if (log !== null && SceneLoader.loggingLevel !== SceneLoader.NO_LOGGING) {\n Logger.Log(logOperation(\"importScene\", parsedData ? parsedData.producer : \"Unknown\") + (SceneLoader.loggingLevel !== SceneLoader.MINIMAL_LOGGING ? log : \"\"));\n }\n }\n return false;\n },\n loadAssetContainer: (scene, data, rootUrl, onError) => {\n const container = loadAssetContainer(scene, data, rootUrl, onError);\n return container;\n }\n});","map":{"version":3,"names":["Logger","Camera","Vector3","Color3","Color4","Mesh","Geometry","TransformNode","Material","MultiMaterial","CubeTexture","HDRCubeTexture","AnimationGroup","Light","SceneComponentConstants","SceneLoader","AssetContainer","ActionManager","Skeleton","MorphTargetManager","CannonJSPlugin","OimoJSPlugin","AmmoJSPlugin","ReflectionProbe","GetClass","Tools","PostProcess","SpriteManager","GetIndividualParser","Parse","_BabylonLoaderRegistered","BabylonFileLoaderConfiguration","LoaderInjectedPhysicsEngine","undefined","tempIndexContainer","tempMaterialIndexContainer","tempMorphTargetManagerIndexContainer","parseMaterialByPredicate","predicate","parsedData","scene","rootUrl","materials","index","cache","length","parsedMaterial","material","isDescendantOf","mesh","names","hierarchyIds","i","name","push","id","parentId","indexOf","logOperation","operation","producer","file","version","exporter_version","loadDetailLevels","mastermesh","_waitingData","lods","ids","lodmeshes","wasenabled","isEnabled","distances","culling","setEnabled","lodid","lodmesh","getMeshById","addLODLevel","Warn","findParent","parentInstanceIndex","parentEntry","getLastEntryById","instance","instances","parseInt","parent","findMaterial","materialId","getLastMaterialById","loadAssetContainer","data","onError","addToScene","container","log","JSON","parse","fullDetails","loggingLevel","DETAILED_LOGGING","environmentTexture","isPBR","environmentTextureType","hdrSize","environmentTextureSize","hdrTexture","match","environmentTexturePrefilterOnLoad","environmentTextureRotationY","rotationY","endsWith","compressedTexture","environmentTextureForcedExtension","cubeTexture","CreateFromPrefilteredData","createDefaultSkybox","skyboxScale","activeCamera","maxZ","minZ","skyboxBlurLevel","environmentIntensity","lights","parsedLight","light","uniqueId","_parentContainer","toString","reflectionProbes","parsedReflectionProbe","reflectionProbe","animations","parsedAnimation","internalClass","animation","mat","textures","getActiveTextures","forEach","t","multiMaterials","parsedMultiMaterial","mmat","ParseMultiMaterial","morphTargetManagers","parsedManager","manager","skeletons","parsedSkeleton","skeleton","geometries","addedGeometry","Array","vertexData","parsedVertexData","g","transformNodes","parsedTransformNode","node","meshes","parsedMesh","hasInstances","cameras","parsedCamera","camera","postProcesses","parsedPostProcess","postProcess","animationGroups","parsedAnimationGroup","animationGroup","spriteManagers","parsedSpriteManager","spriteManager","_waitingParentId","_waitingParentInstanceIndex","transformNode","multimat","_waitingSubMaterialsUniqueIds","subMaterial","subMaterials","_waitingMaterialId","_waitingMorphTargetManagerId","morphTargetManager","_hasWaitingData","bones","bone","_waitingTransformNodeId","linkTransformNode","currentMesh","freezeWorldMatrix","computeWorldMatrix","_excludedMeshesIds","excludedIndex","excludedMesh","excludedMeshes","_includedOnlyMeshesIds","includedOnlyIndex","includedOnlyMesh","includedOnlyMeshes","_loadedUniqueId","actions","err","msg","Log","removeAllFromScene","NO_LOGGING","MINIMAL_LOGGING","RegisterPlugin","extensions","canDirectLoad","importMesh","meshesNames","particleSystems","isArray","parsedIdToNodeMap","Map","loadedTransformNodes","parsedJSONTransformNode","set","_waitingParsedUniqueId","loadedSkeletonsIds","loadedMaterialsIds","loadedMaterialsUniqueIds","loadedMorphTargetManagerIds","geometryId","found","geometryType","parsedGeometryData","materialUniqueId","materialArray","materialFound","loadSubMaterial","subMatId","multimatIndex","multimatCache","materialsUniqueIds","skeletonId","skeletonAlreadyLoaded","skeletonIndex","skeletonCache","morphTargetManagerId","morphTargetManagerAlreadyLoaded","morphTargetManagerIndex","get","parentNode","childMeshes","getChildMeshes","dispose","parser","NAME_PARTICLESYSTEM","parsedParticleSystem","emitterId","load","useDelayedTextureLoading","ForceFullSceneLoadingForIncremental","autoClear","clearColor","FromArray","ambientColor","gravity","useRightHandedSystem","fogMode","fogColor","fogStart","fogEnd","fogDensity","physicsEnabled","physicsPlugin","physicsEngine","physicsGravity","enablePhysics","metadata","collisionsEnabled","autoAnimate","beginAnimation","autoAnimateFrom","autoAnimateTo","autoAnimateLoop","autoAnimateSpeed","activeCameraID","setActiveCameraById"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/@babylonjs/core/Loading/Plugins/babylonFileLoader.js"],"sourcesContent":["import { Logger } from \"../../Misc/logger.js\";\nimport { Camera } from \"../../Cameras/camera.js\";\nimport { Vector3 } from \"../../Maths/math.vector.js\";\nimport { Color3, Color4 } from \"../../Maths/math.color.js\";\nimport { Mesh } from \"../../Meshes/mesh.js\";\nimport { Geometry } from \"../../Meshes/geometry.js\";\nimport { TransformNode } from \"../../Meshes/transformNode.js\";\nimport { Material } from \"../../Materials/material.js\";\nimport { MultiMaterial } from \"../../Materials/multiMaterial.js\";\nimport { CubeTexture } from \"../../Materials/Textures/cubeTexture.js\";\nimport { HDRCubeTexture } from \"../../Materials/Textures/hdrCubeTexture.js\";\nimport { AnimationGroup } from \"../../Animations/animationGroup.js\";\nimport { Light } from \"../../Lights/light.js\";\nimport { SceneComponentConstants } from \"../../sceneComponent.js\";\nimport { SceneLoader } from \"../../Loading/sceneLoader.js\";\nimport { AssetContainer } from \"../../assetContainer.js\";\nimport { ActionManager } from \"../../Actions/actionManager.js\";\nimport { Skeleton } from \"../../Bones/skeleton.js\";\nimport { MorphTargetManager } from \"../../Morph/morphTargetManager.js\";\nimport { CannonJSPlugin } from \"../../Physics/v1/Plugins/cannonJSPlugin.js\";\nimport { OimoJSPlugin } from \"../../Physics/v1/Plugins/oimoJSPlugin.js\";\nimport { AmmoJSPlugin } from \"../../Physics/v1/Plugins/ammoJSPlugin.js\";\nimport { ReflectionProbe } from \"../../Probes/reflectionProbe.js\";\nimport { GetClass } from \"../../Misc/typeStore.js\";\nimport { Tools } from \"../../Misc/tools.js\";\nimport { PostProcess } from \"../../PostProcesses/postProcess.js\";\nimport { SpriteManager } from \"../../Sprites/spriteManager.js\";\nimport { GetIndividualParser, Parse } from \"./babylonFileParser.function.js\";\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/naming-convention, no-var\nexport var _BabylonLoaderRegistered = true;\n/**\n * Helps setting up some configuration for the babylon file loader.\n */\nexport class BabylonFileLoaderConfiguration {\n}\n/**\n * The loader does not allow injecting custom physics engine into the plugins.\n * Unfortunately in ES6, we need to manually inject them into the plugin.\n * So you could set this variable to your engine import to make it work.\n */\nBabylonFileLoaderConfiguration.LoaderInjectedPhysicsEngine = undefined;\nlet tempIndexContainer = {};\nlet tempMaterialIndexContainer = {};\nlet tempMorphTargetManagerIndexContainer = {};\nconst parseMaterialByPredicate = (predicate, parsedData, scene, rootUrl) => {\n if (!parsedData.materials) {\n return null;\n }\n for (let index = 0, cache = parsedData.materials.length; index < cache; index++) {\n const parsedMaterial = parsedData.materials[index];\n if (predicate(parsedMaterial)) {\n return { parsedMaterial, material: Material.Parse(parsedMaterial, scene, rootUrl) };\n }\n }\n return null;\n};\nconst isDescendantOf = (mesh, names, hierarchyIds) => {\n for (const i in names) {\n if (mesh.name === names[i]) {\n hierarchyIds.push(mesh.id);\n return true;\n }\n }\n if (mesh.parentId !== undefined && hierarchyIds.indexOf(mesh.parentId) !== -1) {\n hierarchyIds.push(mesh.id);\n return true;\n }\n return false;\n};\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst logOperation = (operation, producer) => {\n return (operation +\n \" of \" +\n (producer ? producer.file + \" from \" + producer.name + \" version: \" + producer.version + \", exporter version: \" + producer.exporter_version : \"unknown\"));\n};\nconst loadDetailLevels = (scene, mesh) => {\n const mastermesh = mesh;\n // Every value specified in the ids array of the lod data points to another mesh which should be used as the lower LOD level.\n // The distances (or coverages) array values specified are used along with the lod mesh ids as a hint to determine the switching threshold for the various LODs.\n if (mesh._waitingData.lods) {\n if (mesh._waitingData.lods.ids && mesh._waitingData.lods.ids.length > 0) {\n const lodmeshes = mesh._waitingData.lods.ids;\n const wasenabled = mastermesh.isEnabled(false);\n if (mesh._waitingData.lods.distances) {\n const distances = mesh._waitingData.lods.distances;\n if (distances.length >= lodmeshes.length) {\n const culling = distances.length > lodmeshes.length ? distances[distances.length - 1] : 0;\n mastermesh.setEnabled(false);\n for (let index = 0; index < lodmeshes.length; index++) {\n const lodid = lodmeshes[index];\n const lodmesh = scene.getMeshById(lodid);\n if (lodmesh != null) {\n mastermesh.addLODLevel(distances[index], lodmesh);\n }\n }\n if (culling > 0) {\n mastermesh.addLODLevel(culling, null);\n }\n if (wasenabled === true) {\n mastermesh.setEnabled(true);\n }\n }\n else {\n Tools.Warn(\"Invalid level of detail distances for \" + mesh.name);\n }\n }\n }\n mesh._waitingData.lods = null;\n }\n};\nconst findParent = (parentId, parentInstanceIndex, scene) => {\n if (typeof parentId !== \"number\") {\n const parentEntry = scene.getLastEntryById(parentId);\n if (parentEntry && parentInstanceIndex !== undefined && parentInstanceIndex !== null) {\n const instance = parentEntry.instances[parseInt(parentInstanceIndex)];\n return instance;\n }\n return parentEntry;\n }\n const parent = tempIndexContainer[parentId];\n if (parent && parentInstanceIndex !== undefined && parentInstanceIndex !== null) {\n const instance = parent.instances[parseInt(parentInstanceIndex)];\n return instance;\n }\n return parent;\n};\nconst findMaterial = (materialId, scene) => {\n if (typeof materialId !== \"number\") {\n return scene.getLastMaterialById(materialId, true);\n }\n return tempMaterialIndexContainer[materialId];\n};\nconst loadAssetContainer = (scene, data, rootUrl, onError, addToScene = false) => {\n const container = new AssetContainer(scene);\n // Entire method running in try block, so ALWAYS logs as far as it got, only actually writes details\n // when SceneLoader.debugLogging = true (default), or exception encountered.\n // Everything stored in var log instead of writing separate lines to support only writing in exception,\n // and avoid problems with multiple concurrent .babylon loads.\n let log = \"importScene has failed JSON parse\";\n try {\n // eslint-disable-next-line no-var\n var parsedData = JSON.parse(data);\n log = \"\";\n const fullDetails = SceneLoader.loggingLevel === SceneLoader.DETAILED_LOGGING;\n let index;\n let cache;\n // Environment texture\n if (parsedData.environmentTexture !== undefined && parsedData.environmentTexture !== null) {\n // PBR needed for both HDR texture (gamma space) & a sky box\n const isPBR = parsedData.isPBR !== undefined ? parsedData.isPBR : true;\n if (parsedData.environmentTextureType && parsedData.environmentTextureType === \"BABYLON.HDRCubeTexture\") {\n const hdrSize = parsedData.environmentTextureSize ? parsedData.environmentTextureSize : 128;\n const hdrTexture = new HDRCubeTexture((parsedData.environmentTexture.match(/https?:\\/\\//g) ? \"\" : rootUrl) + parsedData.environmentTexture, scene, hdrSize, true, !isPBR, undefined, parsedData.environmentTexturePrefilterOnLoad);\n if (parsedData.environmentTextureRotationY) {\n hdrTexture.rotationY = parsedData.environmentTextureRotationY;\n }\n scene.environmentTexture = hdrTexture;\n }\n else {\n if (typeof parsedData.environmentTexture === \"object\") {\n const environmentTexture = CubeTexture.Parse(parsedData.environmentTexture, scene, rootUrl);\n scene.environmentTexture = environmentTexture;\n }\n else if (parsedData.environmentTexture.endsWith(\".env\")) {\n const compressedTexture = new CubeTexture((parsedData.environmentTexture.match(/https?:\\/\\//g) ? \"\" : rootUrl) + parsedData.environmentTexture, scene, parsedData.environmentTextureForcedExtension);\n if (parsedData.environmentTextureRotationY) {\n compressedTexture.rotationY = parsedData.environmentTextureRotationY;\n }\n scene.environmentTexture = compressedTexture;\n }\n else {\n const cubeTexture = CubeTexture.CreateFromPrefilteredData((parsedData.environmentTexture.match(/https?:\\/\\//g) ? \"\" : rootUrl) + parsedData.environmentTexture, scene, parsedData.environmentTextureForcedExtension);\n if (parsedData.environmentTextureRotationY) {\n cubeTexture.rotationY = parsedData.environmentTextureRotationY;\n }\n scene.environmentTexture = cubeTexture;\n }\n }\n if (parsedData.createDefaultSkybox === true) {\n const skyboxScale = scene.activeCamera !== undefined && scene.activeCamera !== null ? (scene.activeCamera.maxZ - scene.activeCamera.minZ) / 2 : 1000;\n const skyboxBlurLevel = parsedData.skyboxBlurLevel || 0;\n scene.createDefaultSkybox(scene.environmentTexture, isPBR, skyboxScale, skyboxBlurLevel);\n }\n container.environmentTexture = scene.environmentTexture;\n }\n // Environment Intensity\n if (parsedData.environmentIntensity !== undefined && parsedData.environmentIntensity !== null) {\n scene.environmentIntensity = parsedData.environmentIntensity;\n }\n // Lights\n if (parsedData.lights !== undefined && parsedData.lights !== null) {\n for (index = 0, cache = parsedData.lights.length; index < cache; index++) {\n const parsedLight = parsedData.lights[index];\n const light = Light.Parse(parsedLight, scene);\n if (light) {\n tempIndexContainer[parsedLight.uniqueId] = light;\n container.lights.push(light);\n light._parentContainer = container;\n log += index === 0 ? \"\\n\\tLights:\" : \"\";\n log += \"\\n\\t\\t\" + light.toString(fullDetails);\n }\n }\n }\n // Reflection probes\n if (parsedData.reflectionProbes !== undefined && parsedData.reflectionProbes !== null) {\n for (index = 0, cache = parsedData.reflectionProbes.length; index < cache; index++) {\n const parsedReflectionProbe = parsedData.reflectionProbes[index];\n const reflectionProbe = ReflectionProbe.Parse(parsedReflectionProbe, scene, rootUrl);\n if (reflectionProbe) {\n container.reflectionProbes.push(reflectionProbe);\n reflectionProbe._parentContainer = container;\n log += index === 0 ? \"\\n\\tReflection Probes:\" : \"\";\n log += \"\\n\\t\\t\" + reflectionProbe.toString(fullDetails);\n }\n }\n }\n // Animations\n if (parsedData.animations !== undefined && parsedData.animations !== null) {\n for (index = 0, cache = parsedData.animations.length; index < cache; index++) {\n const parsedAnimation = parsedData.animations[index];\n const internalClass = GetClass(\"BABYLON.Animation\");\n if (internalClass) {\n const animation = internalClass.Parse(parsedAnimation);\n scene.animations.push(animation);\n container.animations.push(animation);\n log += index === 0 ? \"\\n\\tAnimations:\" : \"\";\n log += \"\\n\\t\\t\" + animation.toString(fullDetails);\n }\n }\n }\n // Materials\n if (parsedData.materials !== undefined && parsedData.materials !== null) {\n for (index = 0, cache = parsedData.materials.length; index < cache; index++) {\n const parsedMaterial = parsedData.materials[index];\n const mat = Material.Parse(parsedMaterial, scene, rootUrl);\n if (mat) {\n tempMaterialIndexContainer[parsedMaterial.uniqueId || parsedMaterial.id] = mat;\n container.materials.push(mat);\n mat._parentContainer = container;\n log += index === 0 ? \"\\n\\tMaterials:\" : \"\";\n log += \"\\n\\t\\t\" + mat.toString(fullDetails);\n // Textures\n const textures = mat.getActiveTextures();\n textures.forEach((t) => {\n if (container.textures.indexOf(t) == -1) {\n container.textures.push(t);\n t._parentContainer = container;\n }\n });\n }\n }\n }\n if (parsedData.multiMaterials !== undefined && parsedData.multiMaterials !== null) {\n for (index = 0, cache = parsedData.multiMaterials.length; index < cache; index++) {\n const parsedMultiMaterial = parsedData.multiMaterials[index];\n const mmat = MultiMaterial.ParseMultiMaterial(parsedMultiMaterial, scene);\n tempMaterialIndexContainer[parsedMultiMaterial.uniqueId || parsedMultiMaterial.id] = mmat;\n container.multiMaterials.push(mmat);\n mmat._parentContainer = container;\n log += index === 0 ? \"\\n\\tMultiMaterials:\" : \"\";\n log += \"\\n\\t\\t\" + mmat.toString(fullDetails);\n // Textures\n const textures = mmat.getActiveTextures();\n textures.forEach((t) => {\n if (container.textures.indexOf(t) == -1) {\n container.textures.push(t);\n t._parentContainer = container;\n }\n });\n }\n }\n // Morph targets\n if (parsedData.morphTargetManagers !== undefined && parsedData.morphTargetManagers !== null) {\n for (const parsedManager of parsedData.morphTargetManagers) {\n const manager = MorphTargetManager.Parse(parsedManager, scene);\n tempMorphTargetManagerIndexContainer[parsedManager.id] = manager;\n container.morphTargetManagers.push(manager);\n manager._parentContainer = container;\n }\n }\n // Skeletons\n if (parsedData.skeletons !== undefined && parsedData.skeletons !== null) {\n for (index = 0, cache = parsedData.skeletons.length; index < cache; index++) {\n const parsedSkeleton = parsedData.skeletons[index];\n const skeleton = Skeleton.Parse(parsedSkeleton, scene);\n container.skeletons.push(skeleton);\n skeleton._parentContainer = container;\n log += index === 0 ? \"\\n\\tSkeletons:\" : \"\";\n log += \"\\n\\t\\t\" + skeleton.toString(fullDetails);\n }\n }\n // Geometries\n const geometries = parsedData.geometries;\n if (geometries !== undefined && geometries !== null) {\n const addedGeometry = new Array();\n // VertexData\n const vertexData = geometries.vertexData;\n if (vertexData !== undefined && vertexData !== null) {\n for (index = 0, cache = vertexData.length; index < cache; index++) {\n const parsedVertexData = vertexData[index];\n addedGeometry.push(Geometry.Parse(parsedVertexData, scene, rootUrl));\n }\n }\n addedGeometry.forEach((g) => {\n if (g) {\n container.geometries.push(g);\n g._parentContainer = container;\n }\n });\n }\n // Transform nodes\n if (parsedData.transformNodes !== undefined && parsedData.transformNodes !== null) {\n for (index = 0, cache = parsedData.transformNodes.length; index < cache; index++) {\n const parsedTransformNode = parsedData.transformNodes[index];\n const node = TransformNode.Parse(parsedTransformNode, scene, rootUrl);\n tempIndexContainer[parsedTransformNode.uniqueId] = node;\n container.transformNodes.push(node);\n node._parentContainer = container;\n }\n }\n // Meshes\n if (parsedData.meshes !== undefined && parsedData.meshes !== null) {\n for (index = 0, cache = parsedData.meshes.length; index < cache; index++) {\n const parsedMesh = parsedData.meshes[index];\n const mesh = Mesh.Parse(parsedMesh, scene, rootUrl);\n tempIndexContainer[parsedMesh.uniqueId] = mesh;\n container.meshes.push(mesh);\n mesh._parentContainer = container;\n if (mesh.hasInstances) {\n for (const instance of mesh.instances) {\n container.meshes.push(instance);\n instance._parentContainer = container;\n }\n }\n log += index === 0 ? \"\\n\\tMeshes:\" : \"\";\n log += \"\\n\\t\\t\" + mesh.toString(fullDetails);\n }\n }\n // Cameras\n if (parsedData.cameras !== undefined && parsedData.cameras !== null) {\n for (index = 0, cache = parsedData.cameras.length; index < cache; index++) {\n const parsedCamera = parsedData.cameras[index];\n const camera = Camera.Parse(parsedCamera, scene);\n tempIndexContainer[parsedCamera.uniqueId] = camera;\n container.cameras.push(camera);\n camera._parentContainer = container;\n log += index === 0 ? \"\\n\\tCameras:\" : \"\";\n log += \"\\n\\t\\t\" + camera.toString(fullDetails);\n }\n }\n // Postprocesses\n if (parsedData.postProcesses !== undefined && parsedData.postProcesses !== null) {\n for (index = 0, cache = parsedData.postProcesses.length; index < cache; index++) {\n const parsedPostProcess = parsedData.postProcesses[index];\n const postProcess = PostProcess.Parse(parsedPostProcess, scene, rootUrl);\n if (postProcess) {\n container.postProcesses.push(postProcess);\n postProcess._parentContainer = container;\n log += index === 0 ? \"\\nPostprocesses:\" : \"\";\n log += \"\\n\\t\\t\" + postProcess.toString();\n }\n }\n }\n // Animation Groups\n if (parsedData.animationGroups !== undefined && parsedData.animationGroups !== null) {\n for (index = 0, cache = parsedData.animationGroups.length; index < cache; index++) {\n const parsedAnimationGroup = parsedData.animationGroups[index];\n const animationGroup = AnimationGroup.Parse(parsedAnimationGroup, scene);\n container.animationGroups.push(animationGroup);\n animationGroup._parentContainer = container;\n log += index === 0 ? \"\\n\\tAnimationGroups:\" : \"\";\n log += \"\\n\\t\\t\" + animationGroup.toString(fullDetails);\n }\n }\n // Sprites\n if (parsedData.spriteManagers) {\n for (let index = 0, cache = parsedData.spriteManagers.length; index < cache; index++) {\n const parsedSpriteManager = parsedData.spriteManagers[index];\n const spriteManager = SpriteManager.Parse(parsedSpriteManager, scene, rootUrl);\n log += \"\\n\\t\\tSpriteManager \" + spriteManager.name;\n }\n }\n // Browsing all the graph to connect the dots\n for (index = 0, cache = scene.cameras.length; index < cache; index++) {\n const camera = scene.cameras[index];\n if (camera._waitingParentId !== null) {\n camera.parent = findParent(camera._waitingParentId, camera._waitingParentInstanceIndex, scene);\n camera._waitingParentId = null;\n camera._waitingParentInstanceIndex = null;\n }\n }\n for (index = 0, cache = scene.lights.length; index < cache; index++) {\n const light = scene.lights[index];\n if (light && light._waitingParentId !== null) {\n light.parent = findParent(light._waitingParentId, light._waitingParentInstanceIndex, scene);\n light._waitingParentId = null;\n light._waitingParentInstanceIndex = null;\n }\n }\n // Connect parents & children and parse actions and lods\n for (index = 0, cache = scene.transformNodes.length; index < cache; index++) {\n const transformNode = scene.transformNodes[index];\n if (transformNode._waitingParentId !== null) {\n transformNode.parent = findParent(transformNode._waitingParentId, transformNode._waitingParentInstanceIndex, scene);\n transformNode._waitingParentId = null;\n transformNode._waitingParentInstanceIndex = null;\n }\n }\n for (index = 0, cache = scene.meshes.length; index < cache; index++) {\n const mesh = scene.meshes[index];\n if (mesh._waitingParentId !== null) {\n mesh.parent = findParent(mesh._waitingParentId, mesh._waitingParentInstanceIndex, scene);\n mesh._waitingParentId = null;\n mesh._waitingParentInstanceIndex = null;\n }\n if (mesh._waitingData.lods) {\n loadDetailLevels(scene, mesh);\n }\n }\n // link multimats with materials\n scene.multiMaterials.forEach((multimat) => {\n multimat._waitingSubMaterialsUniqueIds.forEach((subMaterial) => {\n multimat.subMaterials.push(findMaterial(subMaterial, scene));\n });\n multimat._waitingSubMaterialsUniqueIds = [];\n });\n // link meshes with materials\n scene.meshes.forEach((mesh) => {\n if (mesh._waitingMaterialId !== null) {\n mesh.material = findMaterial(mesh._waitingMaterialId, scene);\n mesh._waitingMaterialId = null;\n }\n });\n // link meshes with morph target managers\n scene.meshes.forEach((mesh) => {\n if (mesh._waitingMorphTargetManagerId !== null) {\n mesh.morphTargetManager = tempMorphTargetManagerIndexContainer[mesh._waitingMorphTargetManagerId];\n mesh._waitingMorphTargetManagerId = null;\n }\n });\n // link skeleton transform nodes\n for (index = 0, cache = scene.skeletons.length; index < cache; index++) {\n const skeleton = scene.skeletons[index];\n if (skeleton._hasWaitingData) {\n if (skeleton.bones != null) {\n skeleton.bones.forEach((bone) => {\n if (bone._waitingTransformNodeId) {\n const linkTransformNode = scene.getLastEntryById(bone._waitingTransformNodeId);\n if (linkTransformNode) {\n bone.linkTransformNode(linkTransformNode);\n }\n bone._waitingTransformNodeId = null;\n }\n });\n }\n skeleton._hasWaitingData = null;\n }\n }\n // freeze world matrix application\n for (index = 0, cache = scene.meshes.length; index < cache; index++) {\n const currentMesh = scene.meshes[index];\n if (currentMesh._waitingData.freezeWorldMatrix) {\n currentMesh.freezeWorldMatrix();\n currentMesh._waitingData.freezeWorldMatrix = null;\n }\n else {\n currentMesh.computeWorldMatrix(true);\n }\n }\n // Lights exclusions / inclusions\n for (index = 0, cache = scene.lights.length; index < cache; index++) {\n const light = scene.lights[index];\n // Excluded check\n if (light._excludedMeshesIds.length > 0) {\n for (let excludedIndex = 0; excludedIndex < light._excludedMeshesIds.length; excludedIndex++) {\n const excludedMesh = scene.getMeshById(light._excludedMeshesIds[excludedIndex]);\n if (excludedMesh) {\n light.excludedMeshes.push(excludedMesh);\n }\n }\n light._excludedMeshesIds = [];\n }\n // Included check\n if (light._includedOnlyMeshesIds.length > 0) {\n for (let includedOnlyIndex = 0; includedOnlyIndex < light._includedOnlyMeshesIds.length; includedOnlyIndex++) {\n const includedOnlyMesh = scene.getMeshById(light._includedOnlyMeshesIds[includedOnlyIndex]);\n if (includedOnlyMesh) {\n light.includedOnlyMeshes.push(includedOnlyMesh);\n }\n }\n light._includedOnlyMeshesIds = [];\n }\n }\n scene.geometries.forEach((g) => {\n g._loadedUniqueId = \"\";\n });\n Parse(parsedData, scene, container, rootUrl);\n // Actions (scene) Done last as it can access other objects.\n for (index = 0, cache = scene.meshes.length; index < cache; index++) {\n const mesh = scene.meshes[index];\n if (mesh._waitingData.actions) {\n ActionManager.Parse(mesh._waitingData.actions, mesh, scene);\n mesh._waitingData.actions = null;\n }\n }\n if (parsedData.actions !== undefined && parsedData.actions !== null) {\n ActionManager.Parse(parsedData.actions, null, scene);\n }\n }\n catch (err) {\n const msg = logOperation(\"loadAssets\", parsedData ? parsedData.producer : \"Unknown\") + log;\n if (onError) {\n onError(msg, err);\n }\n else {\n Logger.Log(msg);\n throw err;\n }\n }\n finally {\n tempIndexContainer = {};\n tempMaterialIndexContainer = {};\n tempMorphTargetManagerIndexContainer = {};\n if (!addToScene) {\n container.removeAllFromScene();\n }\n if (log !== null && SceneLoader.loggingLevel !== SceneLoader.NO_LOGGING) {\n Logger.Log(logOperation(\"loadAssets\", parsedData ? parsedData.producer : \"Unknown\") + (SceneLoader.loggingLevel !== SceneLoader.MINIMAL_LOGGING ? log : \"\"));\n }\n }\n return container;\n};\nSceneLoader.RegisterPlugin({\n name: \"babylon.js\",\n extensions: \".babylon\",\n canDirectLoad: (data) => {\n if (data.indexOf(\"babylon\") !== -1) {\n // We consider that the producer string is filled\n return true;\n }\n return false;\n },\n importMesh: (meshesNames, scene, data, rootUrl, meshes, particleSystems, skeletons, onError) => {\n // Entire method running in try block, so ALWAYS logs as far as it got, only actually writes details\n // when SceneLoader.debugLogging = true (default), or exception encountered.\n // Everything stored in var log instead of writing separate lines to support only writing in exception,\n // and avoid problems with multiple concurrent .babylon loads.\n let log = \"importMesh has failed JSON parse\";\n try {\n // eslint-disable-next-line no-var\n var parsedData = JSON.parse(data);\n log = \"\";\n const fullDetails = SceneLoader.loggingLevel === SceneLoader.DETAILED_LOGGING;\n if (!meshesNames) {\n meshesNames = null;\n }\n else if (!Array.isArray(meshesNames)) {\n meshesNames = [meshesNames];\n }\n const hierarchyIds = [];\n const parsedIdToNodeMap = new Map();\n // Transform nodes (the overall idea is to load all of them as this is super fast and then get rid of the ones we don't need)\n const loadedTransformNodes = [];\n if (parsedData.transformNodes !== undefined && parsedData.transformNodes !== null) {\n for (let index = 0, cache = parsedData.transformNodes.length; index < cache; index++) {\n const parsedJSONTransformNode = parsedData.transformNodes[index];\n const parsedTransformNode = TransformNode.Parse(parsedJSONTransformNode, scene, rootUrl);\n loadedTransformNodes.push(parsedTransformNode);\n parsedIdToNodeMap.set(parsedTransformNode._waitingParsedUniqueId, parsedTransformNode);\n parsedTransformNode._waitingParsedUniqueId = null;\n }\n }\n if (parsedData.meshes !== undefined && parsedData.meshes !== null) {\n const loadedSkeletonsIds = [];\n const loadedMaterialsIds = [];\n const loadedMaterialsUniqueIds = [];\n const loadedMorphTargetManagerIds = [];\n for (let index = 0, cache = parsedData.meshes.length; index < cache; index++) {\n const parsedMesh = parsedData.meshes[index];\n if (meshesNames === null || isDescendantOf(parsedMesh, meshesNames, hierarchyIds)) {\n if (meshesNames !== null) {\n // Remove found mesh name from list.\n delete meshesNames[meshesNames.indexOf(parsedMesh.name)];\n }\n //Geometry?\n if (parsedMesh.geometryId !== undefined && parsedMesh.geometryId !== null) {\n //does the file contain geometries?\n if (parsedData.geometries !== undefined && parsedData.geometries !== null) {\n //find the correct geometry and add it to the scene\n let found = false;\n [\"boxes\", \"spheres\", \"cylinders\", \"toruses\", \"grounds\", \"planes\", \"torusKnots\", \"vertexData\"].forEach((geometryType) => {\n if (found === true || !parsedData.geometries[geometryType] || !Array.isArray(parsedData.geometries[geometryType])) {\n return;\n }\n else {\n parsedData.geometries[geometryType].forEach((parsedGeometryData) => {\n if (parsedGeometryData.id === parsedMesh.geometryId) {\n switch (geometryType) {\n case \"vertexData\":\n Geometry.Parse(parsedGeometryData, scene, rootUrl);\n break;\n }\n found = true;\n }\n });\n }\n });\n if (found === false) {\n Logger.Warn(\"Geometry not found for mesh \" + parsedMesh.id);\n }\n }\n }\n // Material ?\n if (parsedMesh.materialUniqueId || parsedMesh.materialId) {\n // if we have a unique ID, look up and store in loadedMaterialsUniqueIds, else use loadedMaterialsIds\n const materialArray = parsedMesh.materialUniqueId ? loadedMaterialsUniqueIds : loadedMaterialsIds;\n let materialFound = materialArray.indexOf(parsedMesh.materialUniqueId || parsedMesh.materialId) !== -1;\n if (materialFound === false && parsedData.multiMaterials !== undefined && parsedData.multiMaterials !== null) {\n // Loads a submaterial of a multimaterial\n const loadSubMaterial = (subMatId, predicate) => {\n materialArray.push(subMatId);\n const mat = parseMaterialByPredicate(predicate, parsedData, scene, rootUrl);\n if (mat && mat.material) {\n tempMaterialIndexContainer[mat.parsedMaterial.uniqueId || mat.parsedMaterial.id] = mat.material;\n log += \"\\n\\tMaterial \" + mat.material.toString(fullDetails);\n }\n };\n for (let multimatIndex = 0, multimatCache = parsedData.multiMaterials.length; multimatIndex < multimatCache; multimatIndex++) {\n const parsedMultiMaterial = parsedData.multiMaterials[multimatIndex];\n if ((parsedMesh.materialUniqueId && parsedMultiMaterial.uniqueId === parsedMesh.materialUniqueId) ||\n parsedMultiMaterial.id === parsedMesh.materialId) {\n if (parsedMultiMaterial.materialsUniqueIds) {\n // if the materials inside the multimat are stored by unique id\n parsedMultiMaterial.materialsUniqueIds.forEach((subMatId) => loadSubMaterial(subMatId, (parsedMaterial) => parsedMaterial.uniqueId === subMatId));\n }\n else {\n // if the mats are stored by id instead\n parsedMultiMaterial.materials.forEach((subMatId) => loadSubMaterial(subMatId, (parsedMaterial) => parsedMaterial.id === subMatId));\n }\n materialArray.push(parsedMultiMaterial.uniqueId || parsedMultiMaterial.id);\n const mmat = MultiMaterial.ParseMultiMaterial(parsedMultiMaterial, scene);\n tempMaterialIndexContainer[parsedMultiMaterial.uniqueId || parsedMultiMaterial.id] = mmat;\n if (mmat) {\n materialFound = true;\n log += \"\\n\\tMulti-Material \" + mmat.toString(fullDetails);\n }\n break;\n }\n }\n }\n if (materialFound === false) {\n materialArray.push(parsedMesh.materialUniqueId || parsedMesh.materialId);\n const mat = parseMaterialByPredicate((parsedMaterial) => (parsedMesh.materialUniqueId && parsedMaterial.uniqueId === parsedMesh.materialUniqueId) || parsedMaterial.id === parsedMesh.materialId, parsedData, scene, rootUrl);\n if (!mat || !mat.material) {\n Logger.Warn(\"Material not found for mesh \" + parsedMesh.id);\n }\n else {\n tempMaterialIndexContainer[mat.parsedMaterial.uniqueId || mat.parsedMaterial.id] = mat.material;\n log += \"\\n\\tMaterial \" + mat.material.toString(fullDetails);\n }\n }\n }\n // Skeleton ?\n if (parsedMesh.skeletonId !== null &&\n parsedMesh.skeletonId !== undefined &&\n parsedData.skeletonId !== -1 &&\n parsedData.skeletons !== undefined &&\n parsedData.skeletons !== null) {\n const skeletonAlreadyLoaded = loadedSkeletonsIds.indexOf(parsedMesh.skeletonId) > -1;\n if (!skeletonAlreadyLoaded) {\n for (let skeletonIndex = 0, skeletonCache = parsedData.skeletons.length; skeletonIndex < skeletonCache; skeletonIndex++) {\n const parsedSkeleton = parsedData.skeletons[skeletonIndex];\n if (parsedSkeleton.id === parsedMesh.skeletonId) {\n const skeleton = Skeleton.Parse(parsedSkeleton, scene);\n skeletons.push(skeleton);\n loadedSkeletonsIds.push(parsedSkeleton.id);\n log += \"\\n\\tSkeleton \" + skeleton.toString(fullDetails);\n }\n }\n }\n }\n // Morph targets ?\n if (parsedMesh.morphTargetManagerId > -1 && parsedData.morphTargetManagers !== undefined && parsedData.morphTargetManagers !== null) {\n const morphTargetManagerAlreadyLoaded = loadedMorphTargetManagerIds.indexOf(parsedMesh.morphTargetManagerId) > -1;\n if (!morphTargetManagerAlreadyLoaded) {\n for (let morphTargetManagerIndex = 0; morphTargetManagerIndex < parsedData.morphTargetManagers.length; morphTargetManagerIndex++) {\n const parsedManager = parsedData.morphTargetManagers[morphTargetManagerIndex];\n if (parsedManager.id === parsedMesh.morphTargetManagerId) {\n const morphTargetManager = MorphTargetManager.Parse(parsedManager, scene);\n tempMorphTargetManagerIndexContainer[parsedManager.id] = morphTargetManager;\n loadedMorphTargetManagerIds.push(parsedManager.id);\n log += \"\\nMorph target manager\" + morphTargetManager.toString();\n }\n }\n }\n }\n const mesh = Mesh.Parse(parsedMesh, scene, rootUrl);\n meshes.push(mesh);\n parsedIdToNodeMap.set(mesh._waitingParsedUniqueId, mesh);\n mesh._waitingParsedUniqueId = null;\n log += \"\\n\\tMesh \" + mesh.toString(fullDetails);\n }\n }\n // link multimats with materials\n scene.multiMaterials.forEach((multimat) => {\n multimat._waitingSubMaterialsUniqueIds.forEach((subMaterial) => {\n multimat.subMaterials.push(findMaterial(subMaterial, scene));\n });\n multimat._waitingSubMaterialsUniqueIds = [];\n });\n // link meshes with materials\n scene.meshes.forEach((mesh) => {\n if (mesh._waitingMaterialId !== null) {\n mesh.material = findMaterial(mesh._waitingMaterialId, scene);\n mesh._waitingMaterialId = null;\n }\n });\n // link meshes with morph target managers\n scene.meshes.forEach((mesh) => {\n if (mesh._waitingMorphTargetManagerId !== null) {\n mesh.morphTargetManager = tempMorphTargetManagerIndexContainer[mesh._waitingMorphTargetManagerId];\n mesh._waitingMorphTargetManagerId = null;\n }\n });\n // Connecting parents and lods\n for (let index = 0, cache = scene.transformNodes.length; index < cache; index++) {\n const transformNode = scene.transformNodes[index];\n if (transformNode._waitingParentId !== null) {\n let parent = parsedIdToNodeMap.get(parseInt(transformNode._waitingParentId)) || null;\n if (parent === null) {\n parent = scene.getLastEntryById(transformNode._waitingParentId);\n }\n let parentNode = parent;\n if (transformNode._waitingParentInstanceIndex) {\n parentNode = parent.instances[parseInt(transformNode._waitingParentInstanceIndex)];\n transformNode._waitingParentInstanceIndex = null;\n }\n transformNode.parent = parentNode;\n transformNode._waitingParentId = null;\n }\n }\n let currentMesh;\n for (let index = 0, cache = scene.meshes.length; index < cache; index++) {\n currentMesh = scene.meshes[index];\n if (currentMesh._waitingParentId) {\n let parent = parsedIdToNodeMap.get(parseInt(currentMesh._waitingParentId)) || null;\n if (parent === null) {\n parent = scene.getLastEntryById(currentMesh._waitingParentId);\n }\n let parentNode = parent;\n if (currentMesh._waitingParentInstanceIndex) {\n parentNode = parent.instances[parseInt(currentMesh._waitingParentInstanceIndex)];\n currentMesh._waitingParentInstanceIndex = null;\n }\n currentMesh.parent = parentNode;\n currentMesh._waitingParentId = null;\n }\n if (currentMesh._waitingData.lods) {\n loadDetailLevels(scene, currentMesh);\n }\n }\n // Remove unused transform nodes\n for (const transformNode of loadedTransformNodes) {\n const childMeshes = transformNode.getChildMeshes(false);\n if (!childMeshes.length) {\n transformNode.dispose();\n }\n }\n // link skeleton transform nodes\n for (let index = 0, cache = scene.skeletons.length; index < cache; index++) {\n const skeleton = scene.skeletons[index];\n if (skeleton._hasWaitingData) {\n if (skeleton.bones != null) {\n skeleton.bones.forEach((bone) => {\n if (bone._waitingTransformNodeId) {\n const linkTransformNode = scene.getLastEntryById(bone._waitingTransformNodeId);\n if (linkTransformNode) {\n bone.linkTransformNode(linkTransformNode);\n }\n bone._waitingTransformNodeId = null;\n }\n });\n }\n skeleton._hasWaitingData = null;\n }\n }\n // freeze and compute world matrix application\n for (let index = 0, cache = scene.meshes.length; index < cache; index++) {\n currentMesh = scene.meshes[index];\n if (currentMesh._waitingData.freezeWorldMatrix) {\n currentMesh.freezeWorldMatrix();\n currentMesh._waitingData.freezeWorldMatrix = null;\n }\n else {\n currentMesh.computeWorldMatrix(true);\n }\n }\n }\n // Particles\n if (parsedData.particleSystems !== undefined && parsedData.particleSystems !== null) {\n const parser = GetIndividualParser(SceneComponentConstants.NAME_PARTICLESYSTEM);\n if (parser) {\n for (let index = 0, cache = parsedData.particleSystems.length; index < cache; index++) {\n const parsedParticleSystem = parsedData.particleSystems[index];\n if (hierarchyIds.indexOf(parsedParticleSystem.emitterId) !== -1) {\n particleSystems.push(parser(parsedParticleSystem, scene, rootUrl));\n }\n }\n }\n }\n scene.geometries.forEach((g) => {\n g._loadedUniqueId = \"\";\n });\n return true;\n }\n catch (err) {\n const msg = logOperation(\"importMesh\", parsedData ? parsedData.producer : \"Unknown\") + log;\n if (onError) {\n onError(msg, err);\n }\n else {\n Logger.Log(msg);\n throw err;\n }\n }\n finally {\n if (log !== null && SceneLoader.loggingLevel !== SceneLoader.NO_LOGGING) {\n Logger.Log(logOperation(\"importMesh\", parsedData ? parsedData.producer : \"Unknown\") + (SceneLoader.loggingLevel !== SceneLoader.MINIMAL_LOGGING ? log : \"\"));\n }\n tempMaterialIndexContainer = {};\n tempMorphTargetManagerIndexContainer = {};\n }\n return false;\n },\n load: (scene, data, rootUrl, onError) => {\n // Entire method running in try block, so ALWAYS logs as far as it got, only actually writes details\n // when SceneLoader.debugLogging = true (default), or exception encountered.\n // Everything stored in var log instead of writing separate lines to support only writing in exception,\n // and avoid problems with multiple concurrent .babylon loads.\n let log = \"importScene has failed JSON parse\";\n try {\n // eslint-disable-next-line no-var\n var parsedData = JSON.parse(data);\n log = \"\";\n // Scene\n if (parsedData.useDelayedTextureLoading !== undefined && parsedData.useDelayedTextureLoading !== null) {\n scene.useDelayedTextureLoading = parsedData.useDelayedTextureLoading && !SceneLoader.ForceFullSceneLoadingForIncremental;\n }\n if (parsedData.autoClear !== undefined && parsedData.autoClear !== null) {\n scene.autoClear = parsedData.autoClear;\n }\n if (parsedData.clearColor !== undefined && parsedData.clearColor !== null) {\n scene.clearColor = Color4.FromArray(parsedData.clearColor);\n }\n if (parsedData.ambientColor !== undefined && parsedData.ambientColor !== null) {\n scene.ambientColor = Color3.FromArray(parsedData.ambientColor);\n }\n if (parsedData.gravity !== undefined && parsedData.gravity !== null) {\n scene.gravity = Vector3.FromArray(parsedData.gravity);\n }\n if (parsedData.useRightHandedSystem !== undefined) {\n scene.useRightHandedSystem = !!parsedData.useRightHandedSystem;\n }\n // Fog\n if (parsedData.fogMode !== undefined && parsedData.fogMode !== null) {\n scene.fogMode = parsedData.fogMode;\n }\n if (parsedData.fogColor !== undefined && parsedData.fogColor !== null) {\n scene.fogColor = Color3.FromArray(parsedData.fogColor);\n }\n if (parsedData.fogStart !== undefined && parsedData.fogStart !== null) {\n scene.fogStart = parsedData.fogStart;\n }\n if (parsedData.fogEnd !== undefined && parsedData.fogEnd !== null) {\n scene.fogEnd = parsedData.fogEnd;\n }\n if (parsedData.fogDensity !== undefined && parsedData.fogDensity !== null) {\n scene.fogDensity = parsedData.fogDensity;\n }\n log += \"\\tFog mode for scene: \";\n switch (scene.fogMode) {\n case 0:\n log += \"none\\n\";\n break;\n // getters not compiling, so using hardcoded\n case 1:\n log += \"exp\\n\";\n break;\n case 2:\n log += \"exp2\\n\";\n break;\n case 3:\n log += \"linear\\n\";\n break;\n }\n //Physics\n if (parsedData.physicsEnabled) {\n let physicsPlugin;\n if (parsedData.physicsEngine === \"cannon\" || parsedData.physicsEngine === CannonJSPlugin.name) {\n physicsPlugin = new CannonJSPlugin(undefined, undefined, BabylonFileLoaderConfiguration.LoaderInjectedPhysicsEngine);\n }\n else if (parsedData.physicsEngine === \"oimo\" || parsedData.physicsEngine === OimoJSPlugin.name) {\n physicsPlugin = new OimoJSPlugin(undefined, BabylonFileLoaderConfiguration.LoaderInjectedPhysicsEngine);\n }\n else if (parsedData.physicsEngine === \"ammo\" || parsedData.physicsEngine === AmmoJSPlugin.name) {\n physicsPlugin = new AmmoJSPlugin(undefined, BabylonFileLoaderConfiguration.LoaderInjectedPhysicsEngine, undefined);\n }\n log = \"\\tPhysics engine \" + (parsedData.physicsEngine ? parsedData.physicsEngine : \"oimo\") + \" enabled\\n\";\n //else - default engine, which is currently oimo\n const physicsGravity = parsedData.gravity ? Vector3.FromArray(parsedData.gravity) : parsedData.physicsGravity ? Vector3.FromArray(parsedData.physicsGravity) : null;\n scene.enablePhysics(physicsGravity, physicsPlugin);\n }\n // Metadata\n if (parsedData.metadata !== undefined && parsedData.metadata !== null) {\n scene.metadata = parsedData.metadata;\n }\n //collisions, if defined. otherwise, default is true\n if (parsedData.collisionsEnabled !== undefined && parsedData.collisionsEnabled !== null) {\n scene.collisionsEnabled = parsedData.collisionsEnabled;\n }\n const container = loadAssetContainer(scene, data, rootUrl, onError, true);\n if (!container) {\n return false;\n }\n if (parsedData.autoAnimate) {\n scene.beginAnimation(scene, parsedData.autoAnimateFrom, parsedData.autoAnimateTo, parsedData.autoAnimateLoop, parsedData.autoAnimateSpeed || 1.0);\n }\n if (parsedData.activeCameraID !== undefined && parsedData.activeCameraID !== null) {\n scene.setActiveCameraById(parsedData.activeCameraID);\n }\n // Finish\n return true;\n }\n catch (err) {\n const msg = logOperation(\"importScene\", parsedData ? parsedData.producer : \"Unknown\") + log;\n if (onError) {\n onError(msg, err);\n }\n else {\n Logger.Log(msg);\n throw err;\n }\n }\n finally {\n if (log !== null && SceneLoader.loggingLevel !== SceneLoader.NO_LOGGING) {\n Logger.Log(logOperation(\"importScene\", parsedData ? parsedData.producer : \"Unknown\") + (SceneLoader.loggingLevel !== SceneLoader.MINIMAL_LOGGING ? log : \"\"));\n }\n }\n return false;\n },\n loadAssetContainer: (scene, data, rootUrl, onError) => {\n const container = loadAssetContainer(scene, data, rootUrl, onError);\n return container;\n },\n});\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}