@onerjs/core 8.44.6 → 8.44.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -139,6 +139,12 @@ const FindMaterial = (materialId, scene) => {
139
139
  }
140
140
  return TempMaterialIndexContainer[materialId];
141
141
  };
142
+ const FindMorphTargetManager = (managerId, scene) => {
143
+ if (TempMorphTargetManagerIndexContainer[managerId]) {
144
+ return TempMorphTargetManagerIndexContainer[managerId];
145
+ }
146
+ return scene.getMorphTargetManagerById(managerId);
147
+ };
142
148
  /**
143
149
  * @experimental
144
150
  * Loads an AssetContainer from a serialized Babylon scene.
@@ -576,7 +582,7 @@ const LoadAssetContainer = (scene, data, rootUrl, onError, addToScene = false) =
576
582
  // link meshes with morph target managers
577
583
  for (const mesh of scene.meshes) {
578
584
  if (mesh._waitingMorphTargetManagerId !== null) {
579
- mesh.morphTargetManager = TempMorphTargetManagerIndexContainer[mesh._waitingMorphTargetManagerId];
585
+ mesh.morphTargetManager = FindMorphTargetManager(mesh._waitingMorphTargetManagerId, scene);
580
586
  mesh._waitingMorphTargetManagerId = null;
581
587
  }
582
588
  }
@@ -1 +1 @@
1
- {"version":3,"file":"babylonFileLoader.js","sourceRoot":"","sources":["../../../../../dev/core/src/Loading/Plugins/babylonFileLoader.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../../Misc/logger\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Camera } from \"../../Cameras/camera\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Vector3 } from \"../../Maths/math.vector\";\r\nimport { Color3, Color4 } from \"../../Maths/math.color\";\r\nimport { Mesh } from \"../../Meshes/mesh\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Geometry } from \"../../Meshes/geometry\";\r\nimport type { Node } from \"../../node\";\r\nimport { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Material } from \"../../Materials/material\";\r\nimport { MultiMaterial } from \"../../Materials/multiMaterial\";\r\nimport { CubeTexture } from \"../../Materials/Textures/cubeTexture\";\r\nimport { HDRCubeTexture } from \"../../Materials/Textures/hdrCubeTexture\";\r\nimport { AnimationGroup } from \"../../Animations/animationGroup\";\r\nimport { Light } from \"../../Lights/light\";\r\nimport { SceneComponentConstants } from \"../../sceneComponent\";\r\nimport { RegisterSceneLoaderPlugin } from \"../../Loading/sceneLoader\";\r\nimport { SceneLoaderFlags } from \"../sceneLoaderFlags\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { AssetContainer } from \"../../assetContainer\";\r\nimport { ActionManager } from \"../../Actions/actionManager\";\r\nimport type { IParticleSystem } from \"../../Particles/IParticleSystem\";\r\nimport { Skeleton } from \"../../Bones/skeleton\";\r\nimport { MorphTargetManager } from \"../../Morph/morphTargetManager\";\r\nimport { CannonJSPlugin } from \"../../Physics/v1/Plugins/cannonJSPlugin\";\r\nimport { OimoJSPlugin } from \"../../Physics/v1/Plugins/oimoJSPlugin\";\r\nimport { AmmoJSPlugin } from \"../../Physics/v1/Plugins/ammoJSPlugin\";\r\nimport { ReflectionProbe } from \"../../Probes/reflectionProbe\";\r\nimport { GetClass } from \"../../Misc/typeStore\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport { SpriteManager } from \"core/Sprites/spriteManager\";\r\nimport { GetIndividualParser, Parse } from \"./babylonFileParser.function\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { MorphTarget } from \"../../Morph/morphTarget\";\r\n\r\nimport \"../../Physics/joinedPhysicsEngineComponent\";\r\nimport \"../../Helpers/sceneHelpers\";\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention, no-var\r\nexport var _BabylonLoaderRegistered = true;\r\n\r\n/**\r\n * Helps setting up some configuration for the babylon file loader.\r\n */\r\nexport class BabylonFileLoaderConfiguration {\r\n /**\r\n * The loader does not allow injecting custom physics engine into the plugins.\r\n * Unfortunately in ES6, we need to manually inject them into the plugin.\r\n * So you could set this variable to your engine import to make it work.\r\n */\r\n public static LoaderInjectedPhysicsEngine: any = undefined;\r\n}\r\n\r\nlet TempIndexContainer: { [key: string]: Node } = {};\r\nlet TempMaterialIndexContainer: { [key: string]: Material } = {};\r\nlet TempMorphTargetIndexContainer: { [key: number]: MorphTarget } = {};\r\nlet TempMorphTargetManagerIndexContainer: { [key: string]: MorphTargetManager } = {};\r\nlet TempSkeletonIndexContainer: { [key: number]: Skeleton } = {};\r\n\r\nconst ParseMaterialByPredicate = (predicate: (parsedMaterial: any) => boolean, parsedData: any, scene: Scene, rootUrl: string) => {\r\n if (!parsedData.materials) {\r\n return null;\r\n }\r\n\r\n for (let index = 0, cache = parsedData.materials.length; index < cache; index++) {\r\n const parsedMaterial = parsedData.materials[index];\r\n if (predicate(parsedMaterial)) {\r\n return { parsedMaterial, material: Material.Parse(parsedMaterial, scene, rootUrl) };\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nconst IsDescendantOf = (mesh: any, names: Array<any>, hierarchyIds: Array<number>) => {\r\n for (const i in names) {\r\n if (mesh.name === names[i]) {\r\n hierarchyIds.push(mesh.id);\r\n return true;\r\n }\r\n }\r\n if (mesh.parentId !== undefined && hierarchyIds.indexOf(mesh.parentId) !== -1) {\r\n hierarchyIds.push(mesh.id);\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst logOperation = (operation: string, producer: { file: string; name: string; version: string; exporter_version: string }) => {\r\n return (\r\n operation +\r\n \" of \" +\r\n (producer ? producer.file + \" from \" + producer.name + \" version: \" + producer.version + \", exporter version: \" + producer.exporter_version : \"unknown\")\r\n );\r\n};\r\n\r\nconst LoadDetailLevels = (scene: Scene, mesh: AbstractMesh) => {\r\n const mastermesh: Mesh = mesh as Mesh;\r\n\r\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.\r\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.\r\n if (mesh._waitingData.lods) {\r\n if (mesh._waitingData.lods.ids && mesh._waitingData.lods.ids.length > 0) {\r\n const lodmeshes: string[] = mesh._waitingData.lods.ids;\r\n const wasenabled: boolean = mastermesh.isEnabled(false);\r\n if (mesh._waitingData.lods.distances) {\r\n const distances: number[] = mesh._waitingData.lods.distances;\r\n if (distances.length >= lodmeshes.length) {\r\n const culling: number = distances.length > lodmeshes.length ? distances[distances.length - 1] : 0;\r\n mastermesh.setEnabled(false);\r\n for (let index = 0; index < lodmeshes.length; index++) {\r\n const lodid: string = lodmeshes[index];\r\n const lodmesh: Mesh = scene.getMeshById(lodid) as Mesh;\r\n if (lodmesh != null) {\r\n mastermesh.addLODLevel(distances[index], lodmesh);\r\n }\r\n }\r\n if (culling > 0) {\r\n mastermesh.addLODLevel(culling, null);\r\n }\r\n if (wasenabled === true) {\r\n mastermesh.setEnabled(true);\r\n }\r\n } else {\r\n Tools.Warn(\"Invalid level of detail distances for \" + mesh.name);\r\n }\r\n }\r\n }\r\n mesh._waitingData.lods = null;\r\n }\r\n};\r\n\r\nconst FindParent = (parentId: any, parentInstanceIndex: any, scene: Scene) => {\r\n if (typeof parentId !== \"number\") {\r\n const parentEntry = scene.getLastEntryById(parentId);\r\n if (parentEntry && parentInstanceIndex !== undefined && parentInstanceIndex !== null) {\r\n const instance = (parentEntry as Mesh).instances[parseInt(parentInstanceIndex)];\r\n return instance;\r\n }\r\n return parentEntry;\r\n }\r\n\r\n const parent = TempIndexContainer[parentId];\r\n if (parent && parentInstanceIndex !== undefined && parentInstanceIndex !== null) {\r\n const instance = (parent as Mesh).instances[parseInt(parentInstanceIndex)];\r\n return instance;\r\n }\r\n\r\n return parent;\r\n};\r\n\r\nconst FindMaterial = (materialId: any, scene: Scene) => {\r\n if (typeof materialId !== \"number\") {\r\n return scene.getLastMaterialById(materialId, true);\r\n }\r\n\r\n return TempMaterialIndexContainer[materialId];\r\n};\r\n\r\n/**\r\n * @experimental\r\n * Loads an AssetContainer from a serialized Babylon scene.\r\n * @param scene The scene to load the asset container into.\r\n * @param serializedScene The serialized scene data. This can be either a JSON string, or an object (e.g. from a call to JSON.parse).\r\n * @param rootUrl The root URL for loading assets.\r\n * @returns The loaded AssetContainer.\r\n */\r\nexport function LoadAssetContainerFromSerializedScene(scene: Scene, serializedScene: string | object, rootUrl: string): AssetContainer {\r\n return LoadAssetContainer(scene, serializedScene, rootUrl);\r\n}\r\n\r\nconst LoadAssetContainer = (scene: Scene, data: string | object, rootUrl: string, onError?: (message: string, exception?: any) => void, addToScene = false): AssetContainer => {\r\n const container = new AssetContainer(scene);\r\n\r\n // When loading into a container (not directly into the scene), suppress entity-added\r\n // observables to prevent scene events during loading. Entities still get added to scene\r\n // arrays (so the linking code can find them), but no events fire.\r\n // They are removed from the scene at the end via container.removeAllFromScene().\r\n let savedObservables: Record<string, Observable<any>> | undefined;\r\n if (!addToScene) {\r\n savedObservables = {\r\n mesh: scene.onNewMeshAddedObservable,\r\n transformNode: scene.onNewTransformNodeAddedObservable,\r\n light: scene.onNewLightAddedObservable,\r\n camera: scene.onNewCameraAddedObservable,\r\n material: scene.onNewMaterialAddedObservable,\r\n multiMaterial: scene.onNewMultiMaterialAddedObservable,\r\n texture: scene.onNewTextureAddedObservable,\r\n skeleton: scene.onNewSkeletonAddedObservable,\r\n geometry: scene.onNewGeometryAddedObservable,\r\n animationGroup: scene.onNewAnimationGroupAddedObservable,\r\n particleSystem: scene.onNewParticleSystemAddedObservable,\r\n };\r\n scene.onNewMeshAddedObservable = new Observable();\r\n scene.onNewTransformNodeAddedObservable = new Observable();\r\n scene.onNewLightAddedObservable = new Observable();\r\n scene.onNewCameraAddedObservable = new Observable();\r\n scene.onNewMaterialAddedObservable = new Observable();\r\n scene.onNewMultiMaterialAddedObservable = new Observable();\r\n scene.onNewTextureAddedObservable = new Observable();\r\n scene.onNewSkeletonAddedObservable = new Observable();\r\n scene.onNewGeometryAddedObservable = new Observable();\r\n scene.onNewAnimationGroupAddedObservable = new Observable();\r\n scene.onNewParticleSystemAddedObservable = new Observable();\r\n }\r\n\r\n // Entire method running in try block, so ALWAYS logs as far as it got, only actually writes details\r\n // when SceneLoader.debugLogging = true (default), or exception encountered.\r\n // Everything stored in var log instead of writing separate lines to support only writing in exception,\r\n // and avoid problems with multiple concurrent .babylon loads.\r\n let log = \"importScene has failed JSON parse\";\r\n try {\r\n // eslint-disable-next-line no-var\r\n var parsedData = typeof data === \"object\" ? data : JSON.parse(data);\r\n log = \"\";\r\n const fullDetails = SceneLoaderFlags.loggingLevel === Constants.SCENELOADER_DETAILED_LOGGING;\r\n\r\n let index: number;\r\n let cache: number;\r\n\r\n // Environment texture\r\n if (parsedData.environmentTexture !== undefined && parsedData.environmentTexture !== null) {\r\n // PBR needed for both HDR texture (gamma space) & a sky box\r\n const isPBR = parsedData.isPBR !== undefined ? parsedData.isPBR : true;\r\n if (parsedData.environmentTextureType && parsedData.environmentTextureType === \"BABYLON.HDRCubeTexture\") {\r\n const hdrSize: number = parsedData.environmentTextureSize ? parsedData.environmentTextureSize : 128;\r\n const hdrTexture = new HDRCubeTexture(\r\n (parsedData.environmentTexture.match(/https?:\\/\\//g) ? \"\" : rootUrl) + parsedData.environmentTexture,\r\n scene,\r\n hdrSize,\r\n true,\r\n !isPBR,\r\n undefined,\r\n parsedData.environmentTexturePrefilterOnLoad\r\n );\r\n if (parsedData.environmentTextureRotationY) {\r\n hdrTexture.rotationY = parsedData.environmentTextureRotationY;\r\n }\r\n scene.environmentTexture = hdrTexture;\r\n } else {\r\n if (typeof parsedData.environmentTexture === \"object\") {\r\n const environmentTexture = CubeTexture.Parse(parsedData.environmentTexture, scene, rootUrl);\r\n scene.environmentTexture = environmentTexture;\r\n } else if ((parsedData.environmentTexture as string).endsWith(\".env\")) {\r\n const compressedTexture = new CubeTexture(\r\n (parsedData.environmentTexture.match(/https?:\\/\\//g) ? \"\" : rootUrl) + parsedData.environmentTexture,\r\n scene,\r\n parsedData.environmentTextureForcedExtension\r\n );\r\n if (parsedData.environmentTextureRotationY) {\r\n compressedTexture.rotationY = parsedData.environmentTextureRotationY;\r\n }\r\n scene.environmentTexture = compressedTexture;\r\n } else {\r\n const cubeTexture = CubeTexture.CreateFromPrefilteredData(\r\n (parsedData.environmentTexture.match(/https?:\\/\\//g) ? \"\" : rootUrl) + parsedData.environmentTexture,\r\n scene,\r\n parsedData.environmentTextureForcedExtension\r\n );\r\n if (parsedData.environmentTextureRotationY) {\r\n cubeTexture.rotationY = parsedData.environmentTextureRotationY;\r\n }\r\n scene.environmentTexture = cubeTexture;\r\n }\r\n }\r\n if (parsedData.createDefaultSkybox === true) {\r\n const skyboxScale = scene.activeCamera !== undefined && scene.activeCamera !== null ? (scene.activeCamera.maxZ - scene.activeCamera.minZ) / 2 : 1000;\r\n const skyboxBlurLevel = parsedData.skyboxBlurLevel || 0;\r\n scene.createDefaultSkybox(scene.environmentTexture, isPBR, skyboxScale, skyboxBlurLevel);\r\n }\r\n container.environmentTexture = scene.environmentTexture;\r\n }\r\n\r\n // Environment Intensity\r\n if (parsedData.environmentIntensity !== undefined && parsedData.environmentIntensity !== null) {\r\n scene.environmentIntensity = parsedData.environmentIntensity;\r\n }\r\n\r\n // IBL Intensity\r\n if (parsedData.iblIntensity !== undefined && parsedData.iblIntensity !== null) {\r\n scene.iblIntensity = parsedData.iblIntensity;\r\n }\r\n\r\n // Lights\r\n if (parsedData.lights !== undefined && parsedData.lights !== null) {\r\n for (index = 0, cache = parsedData.lights.length; index < cache; index++) {\r\n const parsedLight = parsedData.lights[index];\r\n const light = Light.Parse(parsedLight, scene);\r\n if (light) {\r\n TempIndexContainer[parsedLight.uniqueId] = light;\r\n container.lights.push(light);\r\n light._parentContainer = container;\r\n log += index === 0 ? \"\\n\\tLights:\" : \"\";\r\n log += \"\\n\\t\\t\" + light.toString(fullDetails);\r\n }\r\n }\r\n }\r\n\r\n // Reflection probes\r\n if (parsedData.reflectionProbes !== undefined && parsedData.reflectionProbes !== null) {\r\n for (index = 0, cache = parsedData.reflectionProbes.length; index < cache; index++) {\r\n const parsedReflectionProbe = parsedData.reflectionProbes[index];\r\n const reflectionProbe = ReflectionProbe.Parse(parsedReflectionProbe, scene, rootUrl);\r\n if (reflectionProbe) {\r\n container.reflectionProbes.push(reflectionProbe);\r\n reflectionProbe._parentContainer = container;\r\n log += index === 0 ? \"\\n\\tReflection Probes:\" : \"\";\r\n log += \"\\n\\t\\t\" + reflectionProbe.toString(fullDetails);\r\n }\r\n }\r\n }\r\n\r\n // Animations\r\n if (parsedData.animations !== undefined && parsedData.animations !== null) {\r\n for (index = 0, cache = parsedData.animations.length; index < cache; index++) {\r\n const parsedAnimation = parsedData.animations[index];\r\n const internalClass = GetClass(\"BABYLON.Animation\");\r\n if (internalClass) {\r\n const animation = internalClass.Parse(parsedAnimation);\r\n scene.animations.push(animation);\r\n container.animations.push(animation);\r\n log += index === 0 ? \"\\n\\tAnimations:\" : \"\";\r\n log += \"\\n\\t\\t\" + animation.toString(fullDetails);\r\n }\r\n }\r\n }\r\n\r\n // Materials\r\n if (parsedData.materials !== undefined && parsedData.materials !== null) {\r\n for (index = 0, cache = parsedData.materials.length; index < cache; index++) {\r\n const parsedMaterial = parsedData.materials[index];\r\n const mat = Material.Parse(parsedMaterial, scene, rootUrl);\r\n if (mat) {\r\n TempMaterialIndexContainer[parsedMaterial.uniqueId || parsedMaterial.id] = mat;\r\n container.materials.push(mat);\r\n mat._parentContainer = container;\r\n log += index === 0 ? \"\\n\\tMaterials:\" : \"\";\r\n log += \"\\n\\t\\t\" + mat.toString(fullDetails);\r\n\r\n // Textures\r\n const textures = mat.getActiveTextures();\r\n for (const t of textures) {\r\n if (container.textures.indexOf(t) == -1) {\r\n container.textures.push(t);\r\n t._parentContainer = container;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (parsedData.textures !== undefined && parsedData.textures !== null) {\r\n for (index = 0, cache = parsedData.textures.length; index < cache; index++) {\r\n const parsedTexture = parsedData.textures[index];\r\n const texture = Texture.Parse(parsedTexture, scene, rootUrl);\r\n if (texture) {\r\n if (container.textures.indexOf(texture) == -1) {\r\n container.textures.push(texture);\r\n texture._parentContainer = container;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (parsedData.multiMaterials !== undefined && parsedData.multiMaterials !== null) {\r\n for (index = 0, cache = parsedData.multiMaterials.length; index < cache; index++) {\r\n const parsedMultiMaterial = parsedData.multiMaterials[index];\r\n const mmat = MultiMaterial.ParseMultiMaterial(parsedMultiMaterial, scene);\r\n TempMaterialIndexContainer[parsedMultiMaterial.uniqueId || parsedMultiMaterial.id] = mmat;\r\n container.multiMaterials.push(mmat);\r\n mmat._parentContainer = container;\r\n\r\n log += index === 0 ? \"\\n\\tMultiMaterials:\" : \"\";\r\n log += \"\\n\\t\\t\" + mmat.toString(fullDetails);\r\n\r\n // Textures\r\n const textures = mmat.getActiveTextures();\r\n for (const t of textures) {\r\n if (container.textures.indexOf(t) == -1) {\r\n container.textures.push(t);\r\n t._parentContainer = container;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Morph target managers\r\n if (parsedData.morphTargetManagers !== undefined && parsedData.morphTargetManagers !== null) {\r\n for (const parsedManager of parsedData.morphTargetManagers) {\r\n const manager = MorphTargetManager.Parse(parsedManager, scene);\r\n TempMorphTargetManagerIndexContainer[parsedManager.id] = manager;\r\n container.morphTargetManagers.push(manager);\r\n manager._parentContainer = container;\r\n\r\n // Morph targets - add to TempMorphTargetIndexContainer to later connect animations -> morph targets\r\n for (let index = 0; index < parsedManager.targets.length; index++) {\r\n const parsedTarget = parsedManager.targets[index];\r\n if (parsedTarget.uniqueId !== undefined && parsedTarget.uniqueId !== null) {\r\n const target = manager.getTarget(index);\r\n TempMorphTargetIndexContainer[parsedTarget.uniqueId] = target;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Skeletons\r\n if (parsedData.skeletons !== undefined && parsedData.skeletons !== null) {\r\n for (index = 0, cache = parsedData.skeletons.length; index < cache; index++) {\r\n const parsedSkeleton = parsedData.skeletons[index];\r\n const skeleton = Skeleton.Parse(parsedSkeleton, scene);\r\n if (parsedSkeleton.uniqueId !== undefined && parsedSkeleton.uniqueId !== null) {\r\n TempSkeletonIndexContainer[parsedSkeleton.uniqueId] = skeleton;\r\n }\r\n container.skeletons.push(skeleton);\r\n skeleton._parentContainer = container;\r\n log += index === 0 ? \"\\n\\tSkeletons:\" : \"\";\r\n log += \"\\n\\t\\t\" + skeleton.toString(fullDetails);\r\n\r\n // Bones - add to TempIndexContainer to later connect animations -> bones\r\n for (let boneIndex = 0; boneIndex < parsedSkeleton.bones.length; boneIndex++) {\r\n const parsedBone = parsedSkeleton.bones[boneIndex];\r\n const bone = skeleton.bones[boneIndex]; // This was instantiated in Skeleton.Parse\r\n TempIndexContainer[parsedBone.uniqueId] = bone;\r\n }\r\n }\r\n }\r\n\r\n // Geometries\r\n const geometries = parsedData.geometries;\r\n if (geometries !== undefined && geometries !== null) {\r\n const addedGeometry = new Array<Nullable<Geometry>>();\r\n\r\n // VertexData\r\n const vertexData = geometries.vertexData;\r\n if (vertexData !== undefined && vertexData !== null) {\r\n for (index = 0, cache = vertexData.length; index < cache; index++) {\r\n const parsedVertexData = vertexData[index];\r\n\r\n addedGeometry.push(Geometry.Parse(parsedVertexData, scene, rootUrl));\r\n }\r\n }\r\n\r\n for (const g of addedGeometry) {\r\n if (g) {\r\n container.geometries.push(g);\r\n g._parentContainer = container;\r\n }\r\n }\r\n }\r\n\r\n // Transform nodes\r\n if (parsedData.transformNodes !== undefined && parsedData.transformNodes !== null) {\r\n for (index = 0, cache = parsedData.transformNodes.length; index < cache; index++) {\r\n const parsedTransformNode = parsedData.transformNodes[index];\r\n const node = TransformNode.Parse(parsedTransformNode, scene, rootUrl);\r\n TempIndexContainer[parsedTransformNode.uniqueId] = node;\r\n container.transformNodes.push(node);\r\n node._parentContainer = container;\r\n }\r\n }\r\n\r\n // Meshes\r\n if (parsedData.meshes !== undefined && parsedData.meshes !== null) {\r\n for (index = 0, cache = parsedData.meshes.length; index < cache; index++) {\r\n const parsedMesh = parsedData.meshes[index];\r\n const mesh = <AbstractMesh>Mesh.Parse(parsedMesh, scene, rootUrl);\r\n TempIndexContainer[parsedMesh.uniqueId] = mesh;\r\n container.meshes.push(mesh);\r\n mesh._parentContainer = container;\r\n if (mesh.hasInstances) {\r\n for (const instance of (mesh as Mesh).instances) {\r\n container.meshes.push(instance);\r\n instance._parentContainer = container;\r\n }\r\n }\r\n log += index === 0 ? \"\\n\\tMeshes:\" : \"\";\r\n log += \"\\n\\t\\t\" + mesh.toString(fullDetails);\r\n }\r\n }\r\n\r\n // Cameras\r\n if (parsedData.cameras !== undefined && parsedData.cameras !== null) {\r\n for (index = 0, cache = parsedData.cameras.length; index < cache; index++) {\r\n const parsedCamera = parsedData.cameras[index];\r\n const camera = Camera.Parse(parsedCamera, scene);\r\n TempIndexContainer[parsedCamera.uniqueId] = camera;\r\n container.cameras.push(camera);\r\n camera._parentContainer = container;\r\n log += index === 0 ? \"\\n\\tCameras:\" : \"\";\r\n log += \"\\n\\t\\t\" + camera.toString(fullDetails);\r\n }\r\n }\r\n\r\n // Postprocesses\r\n if (parsedData.postProcesses !== undefined && parsedData.postProcesses !== null) {\r\n for (index = 0, cache = parsedData.postProcesses.length; index < cache; index++) {\r\n const parsedPostProcess = parsedData.postProcesses[index];\r\n const postProcess = PostProcess.Parse(parsedPostProcess, scene, rootUrl);\r\n if (postProcess) {\r\n container.postProcesses.push(postProcess);\r\n postProcess._parentContainer = container;\r\n log += index === 0 ? \"\\nPostprocesses:\" : \"\";\r\n log += \"\\n\\t\\t\" + postProcess.toString();\r\n }\r\n }\r\n }\r\n\r\n // Animation Groups\r\n if (parsedData.animationGroups !== undefined && parsedData.animationGroups !== null && parsedData.animationGroups.length) {\r\n // Build the nodeMap only for scenes with animationGroups.\r\n let nodeMap: Nullable<Map<Node[\"id\"], Node>> = null;\r\n\r\n // Helper to get nodes by id more efficiently, building the nodeMap only on first access.\r\n const getNodeById = (id: Node[\"id\"]) => {\r\n if (!nodeMap) {\r\n nodeMap = new Map<Node[\"id\"], Node>();\r\n\r\n // Nodes in scene does not change when parsing animationGroups, so it's safe to build a map.\r\n // This follows the order of scene.getNodeById: mesh, transformNode, light, camera, bone\r\n for (let index = 0; index < scene.meshes.length; index++) {\r\n // This follows the behavior of scene.getXXXById, which picks the first match\r\n if (!nodeMap.has(scene.meshes[index].id)) {\r\n nodeMap.set(scene.meshes[index].id, scene.meshes[index]);\r\n }\r\n }\r\n for (let index = 0; index < scene.transformNodes.length; index++) {\r\n if (!nodeMap.has(scene.transformNodes[index].id)) {\r\n nodeMap.set(scene.transformNodes[index].id, scene.transformNodes[index]);\r\n }\r\n }\r\n for (let index = 0; index < scene.lights.length; index++) {\r\n if (!nodeMap.has(scene.lights[index].id)) {\r\n nodeMap.set(scene.lights[index].id, scene.lights[index]);\r\n }\r\n }\r\n for (let index = 0; index < scene.cameras.length; index++) {\r\n if (!nodeMap.has(scene.cameras[index].id)) {\r\n nodeMap.set(scene.cameras[index].id, scene.cameras[index]);\r\n }\r\n }\r\n for (let skeletonIndex = 0; skeletonIndex < scene.skeletons.length; skeletonIndex++) {\r\n const skeleton = scene.skeletons[skeletonIndex];\r\n for (let boneIndex = 0; boneIndex < skeleton.bones.length; boneIndex++) {\r\n if (!nodeMap.has(skeleton.bones[boneIndex].id)) {\r\n nodeMap.set(skeleton.bones[boneIndex].id, skeleton.bones[boneIndex]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return nodeMap.get(id);\r\n };\r\n\r\n const targetLookup = (parsedTargetAnimation: any) => {\r\n let target = null;\r\n const isMorphTarget = parsedTargetAnimation.animation.property === \"influence\";\r\n const uniqueId = parsedTargetAnimation.targetUniqueId;\r\n\r\n // Attempt to find animation targets by uniqueId first (tracked in TempXXXIndexContainer).\r\n if (uniqueId !== undefined && uniqueId !== null) {\r\n target = isMorphTarget ? TempMorphTargetIndexContainer[uniqueId] : TempIndexContainer[uniqueId];\r\n }\r\n\r\n // Backwards compatibility: If no uniqueId is provided or no match is found,\r\n // fall back to searching by id in the scene.\r\n if (!target) {\r\n const id = parsedTargetAnimation.targetId;\r\n target = isMorphTarget ? scene.getMorphTargetById(id) : getNodeById(id);\r\n }\r\n\r\n return target;\r\n };\r\n\r\n for (index = 0, cache = parsedData.animationGroups.length; index < cache; index++) {\r\n const parsedAnimationGroup = parsedData.animationGroups[index];\r\n const animationGroup = AnimationGroup.Parse(parsedAnimationGroup, scene, targetLookup);\r\n container.animationGroups.push(animationGroup);\r\n animationGroup._parentContainer = container;\r\n log += index === 0 ? \"\\n\\tAnimationGroups:\" : \"\";\r\n log += \"\\n\\t\\t\" + animationGroup.toString(fullDetails);\r\n }\r\n }\r\n\r\n // Sprites\r\n if (parsedData.spriteManagers) {\r\n for (let index = 0, cache = parsedData.spriteManagers.length; index < cache; index++) {\r\n const parsedSpriteManager = parsedData.spriteManagers[index];\r\n const spriteManager = SpriteManager.Parse(parsedSpriteManager, scene, rootUrl);\r\n container.spriteManagers.push(spriteManager);\r\n spriteManager._parentContainer = container;\r\n log += \"\\n\\t\\tSpriteManager \" + spriteManager.name;\r\n }\r\n }\r\n\r\n // Browsing all the graph to connect the dots\r\n for (index = 0, cache = scene.cameras.length; index < cache; index++) {\r\n const camera = scene.cameras[index];\r\n if (camera._waitingParentId !== null) {\r\n camera.parent = FindParent(camera._waitingParentId, camera._waitingParentInstanceIndex, scene);\r\n camera._waitingParentId = null;\r\n camera._waitingParentInstanceIndex = null;\r\n }\r\n }\r\n\r\n for (index = 0, cache = scene.lights.length; index < cache; index++) {\r\n const light = scene.lights[index];\r\n if (light && light._waitingParentId !== null) {\r\n light.parent = FindParent(light._waitingParentId, light._waitingParentInstanceIndex, scene);\r\n light._waitingParentId = null;\r\n light._waitingParentInstanceIndex = null;\r\n }\r\n }\r\n\r\n // Connect parents & children and parse actions and lods\r\n for (index = 0, cache = scene.transformNodes.length; index < cache; index++) {\r\n const transformNode = scene.transformNodes[index];\r\n if (transformNode._waitingParentId !== null) {\r\n transformNode.parent = FindParent(transformNode._waitingParentId, transformNode._waitingParentInstanceIndex, scene);\r\n transformNode._waitingParentId = null;\r\n transformNode._waitingParentInstanceIndex = null;\r\n }\r\n }\r\n for (index = 0, cache = scene.meshes.length; index < cache; index++) {\r\n const mesh = scene.meshes[index];\r\n if (mesh._waitingParentId !== null) {\r\n mesh.parent = FindParent(mesh._waitingParentId, mesh._waitingParentInstanceIndex, scene);\r\n mesh._waitingParentId = null;\r\n mesh._waitingParentInstanceIndex = null;\r\n }\r\n if (mesh._waitingData.lods) {\r\n LoadDetailLevels(scene, mesh);\r\n }\r\n }\r\n\r\n // link multimats with materials\r\n for (const multimat of scene.multiMaterials) {\r\n for (const subMaterial of multimat._waitingSubMaterialsUniqueIds) {\r\n multimat.subMaterials.push(FindMaterial(subMaterial, scene));\r\n }\r\n multimat._waitingSubMaterialsUniqueIds = [];\r\n }\r\n\r\n // link meshes with materials\r\n for (const mesh of scene.meshes) {\r\n if (mesh._waitingMaterialId !== null) {\r\n mesh.material = FindMaterial(mesh._waitingMaterialId, scene);\r\n mesh._waitingMaterialId = null;\r\n }\r\n }\r\n\r\n // link meshes with morph target managers\r\n for (const mesh of scene.meshes) {\r\n if (mesh._waitingMorphTargetManagerId !== null) {\r\n mesh.morphTargetManager = TempMorphTargetManagerIndexContainer[mesh._waitingMorphTargetManagerId];\r\n mesh._waitingMorphTargetManagerId = null;\r\n }\r\n }\r\n\r\n // link meshes with skeletons\r\n for (const mesh of scene.meshes) {\r\n // First try to get it via uniqueId\r\n if (mesh._waitingSkeletonUniqueId !== null) {\r\n mesh.skeleton = TempSkeletonIndexContainer[mesh._waitingSkeletonUniqueId];\r\n }\r\n\r\n // If not possible or not found, try to get it from the scene (backwards compatibility)\r\n if (mesh._waitingSkeletonId !== null && !mesh.skeleton) {\r\n mesh.skeleton = scene.getLastSkeletonById(mesh._waitingSkeletonId);\r\n }\r\n\r\n mesh._waitingSkeletonId = null;\r\n mesh._waitingSkeletonUniqueId = null;\r\n }\r\n\r\n // link bones to transform nodes\r\n for (index = 0, cache = scene.skeletons.length; index < cache; index++) {\r\n const skeleton = scene.skeletons[index];\r\n if (skeleton._hasWaitingData) {\r\n if (skeleton.bones != null) {\r\n for (const bone of skeleton.bones) {\r\n let linkTransformNode: Nullable<Node> = null;\r\n // First try to get it via uniqueId\r\n if (bone._waitingTransformNodeUniqueId !== null) {\r\n linkTransformNode = TempIndexContainer[bone._waitingTransformNodeUniqueId];\r\n }\r\n\r\n // If not possible or not found, try to get it from the scene (backwards compatibility)\r\n if (bone._waitingTransformNodeId !== null && !linkTransformNode) {\r\n linkTransformNode = scene.getLastEntryById(bone._waitingTransformNodeId);\r\n }\r\n\r\n if (linkTransformNode) {\r\n bone.linkTransformNode(linkTransformNode as TransformNode);\r\n }\r\n\r\n bone._waitingTransformNodeId = null;\r\n bone._waitingTransformNodeUniqueId = null;\r\n }\r\n }\r\n\r\n skeleton._hasWaitingData = null;\r\n }\r\n }\r\n\r\n // freeze world matrix application\r\n for (index = 0, cache = scene.meshes.length; index < cache; index++) {\r\n const currentMesh = scene.meshes[index];\r\n if (currentMesh._waitingData.freezeWorldMatrix) {\r\n currentMesh.freezeWorldMatrix();\r\n currentMesh._waitingData.freezeWorldMatrix = null;\r\n } else {\r\n currentMesh.computeWorldMatrix(true);\r\n }\r\n }\r\n\r\n // Lights exclusions / inclusions\r\n for (index = 0, cache = scene.lights.length; index < cache; index++) {\r\n const light = scene.lights[index];\r\n // Excluded check\r\n if (light._excludedMeshesIds.length > 0) {\r\n for (let excludedIndex = 0; excludedIndex < light._excludedMeshesIds.length; excludedIndex++) {\r\n const excludedMesh = scene.getMeshById(light._excludedMeshesIds[excludedIndex]);\r\n\r\n if (excludedMesh) {\r\n light.excludedMeshes.push(excludedMesh);\r\n }\r\n }\r\n\r\n light._excludedMeshesIds = [];\r\n }\r\n\r\n // Included check\r\n if (light._includedOnlyMeshesIds.length > 0) {\r\n for (let includedOnlyIndex = 0; includedOnlyIndex < light._includedOnlyMeshesIds.length; includedOnlyIndex++) {\r\n const includedOnlyMesh = scene.getMeshById(light._includedOnlyMeshesIds[includedOnlyIndex]);\r\n\r\n if (includedOnlyMesh) {\r\n light.includedOnlyMeshes.push(includedOnlyMesh);\r\n }\r\n }\r\n\r\n light._includedOnlyMeshesIds = [];\r\n }\r\n }\r\n\r\n for (const g of scene.geometries) {\r\n g._loadedUniqueId = \"\";\r\n }\r\n\r\n Parse(parsedData, scene, container, rootUrl);\r\n\r\n // Actions (scene) Done last as it can access other objects.\r\n for (index = 0, cache = scene.meshes.length; index < cache; index++) {\r\n const mesh = scene.meshes[index];\r\n if (mesh._waitingData.actions) {\r\n ActionManager.Parse(mesh._waitingData.actions, mesh, scene);\r\n mesh._waitingData.actions = null;\r\n }\r\n }\r\n if (parsedData.actions !== undefined && parsedData.actions !== null) {\r\n ActionManager.Parse(parsedData.actions, null, scene);\r\n }\r\n } catch (err) {\r\n const msg = logOperation(\"loadAssets\", parsedData ? parsedData.producer : \"Unknown\") + log;\r\n if (onError) {\r\n onError(msg, err);\r\n } else {\r\n Logger.Log(msg);\r\n throw err;\r\n }\r\n } finally {\r\n TempIndexContainer = {};\r\n TempMaterialIndexContainer = {};\r\n TempMorphTargetIndexContainer = {};\r\n TempMorphTargetManagerIndexContainer = {};\r\n TempSkeletonIndexContainer = {};\r\n\r\n if (!addToScene) {\r\n // Restore observables before removing from scene\r\n if (savedObservables) {\r\n scene.onNewMeshAddedObservable = savedObservables.mesh;\r\n scene.onNewTransformNodeAddedObservable = savedObservables.transformNode;\r\n scene.onNewLightAddedObservable = savedObservables.light;\r\n scene.onNewCameraAddedObservable = savedObservables.camera;\r\n scene.onNewMaterialAddedObservable = savedObservables.material;\r\n scene.onNewMultiMaterialAddedObservable = savedObservables.multiMaterial;\r\n scene.onNewTextureAddedObservable = savedObservables.texture;\r\n scene.onNewSkeletonAddedObservable = savedObservables.skeleton;\r\n scene.onNewGeometryAddedObservable = savedObservables.geometry;\r\n scene.onNewAnimationGroupAddedObservable = savedObservables.animationGroup;\r\n scene.onNewParticleSystemAddedObservable = savedObservables.particleSystem;\r\n }\r\n // Removes entities from scene arrays and moves them to the container\r\n container.removeAllFromScene();\r\n }\r\n if (log !== null && SceneLoaderFlags.loggingLevel !== Constants.SCENELOADER_NO_LOGGING) {\r\n Logger.Log(\r\n logOperation(\"loadAssets\", parsedData ? parsedData.producer : \"Unknown\") + (SceneLoaderFlags.loggingLevel !== Constants.SCENELOADER_MINIMAL_LOGGING ? log : \"\")\r\n );\r\n }\r\n }\r\n\r\n return container;\r\n};\r\n\r\nRegisterSceneLoaderPlugin({\r\n name: \"babylon.js\",\r\n extensions: \".babylon\",\r\n canDirectLoad: (data: string) => {\r\n if (data.indexOf(\"babylon\") !== -1) {\r\n // We consider that the producer string is filled\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n importMesh: (\r\n meshesNames: any,\r\n scene: Scene,\r\n data: any,\r\n rootUrl: string,\r\n meshes: AbstractMesh[],\r\n particleSystems: IParticleSystem[],\r\n skeletons: Skeleton[],\r\n onError?: (message: string, exception?: any) => void\r\n ): boolean => {\r\n // Entire method running in try block, so ALWAYS logs as far as it got, only actually writes details\r\n // when SceneLoader.debugLogging = true (default), or exception encountered.\r\n // Everything stored in var log instead of writing separate lines to support only writing in exception,\r\n // and avoid problems with multiple concurrent .babylon loads.\r\n let log = \"importMesh has failed JSON parse\";\r\n try {\r\n // eslint-disable-next-line no-var\r\n var parsedData = JSON.parse(data);\r\n log = \"\";\r\n const fullDetails = SceneLoaderFlags.loggingLevel === Constants.SCENELOADER_DETAILED_LOGGING;\r\n if (!meshesNames) {\r\n meshesNames = null;\r\n } else if (!Array.isArray(meshesNames)) {\r\n meshesNames = [meshesNames];\r\n }\r\n\r\n const hierarchyIds: number[] = [];\r\n const parsedIdToNodeMap = new Map<number, Node>();\r\n\r\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)\r\n const loadedTransformNodes = [];\r\n if (parsedData.transformNodes !== undefined && parsedData.transformNodes !== null) {\r\n for (let index = 0, cache = parsedData.transformNodes.length; index < cache; index++) {\r\n const parsedJSONTransformNode = parsedData.transformNodes[index];\r\n const parsedTransformNode = TransformNode.Parse(parsedJSONTransformNode, scene, rootUrl);\r\n loadedTransformNodes.push(parsedTransformNode);\r\n parsedIdToNodeMap.set(parsedTransformNode._waitingParsedUniqueId!, parsedTransformNode);\r\n parsedTransformNode._waitingParsedUniqueId = null;\r\n }\r\n }\r\n if (parsedData.meshes !== undefined && parsedData.meshes !== null) {\r\n const loadedSkeletonsIds = [];\r\n const loadedMaterialsIds: string[] = [];\r\n const loadedMaterialsUniqueIds: string[] = [];\r\n const loadedMorphTargetManagerIds: number[] = [];\r\n for (let index = 0, cache = parsedData.meshes.length; index < cache; index++) {\r\n const parsedMesh = parsedData.meshes[index];\r\n\r\n if (meshesNames === null || IsDescendantOf(parsedMesh, meshesNames, hierarchyIds)) {\r\n if (meshesNames !== null) {\r\n // Remove found mesh name from list.\r\n delete meshesNames[meshesNames.indexOf(parsedMesh.name)];\r\n }\r\n\r\n //Geometry?\r\n if (parsedMesh.geometryId !== undefined && parsedMesh.geometryId !== null) {\r\n //does the file contain geometries?\r\n if (parsedData.geometries !== undefined && parsedData.geometries !== null) {\r\n //find the correct geometry and add it to the scene\r\n let found: boolean = false;\r\n const geoms = [\"boxes\", \"spheres\", \"cylinders\", \"toruses\", \"grounds\", \"planes\", \"torusKnots\", \"vertexData\"];\r\n for (const geometryType of geoms) {\r\n if (!parsedData.geometries[geometryType] || !Array.isArray(parsedData.geometries[geometryType])) {\r\n continue;\r\n }\r\n const geom = parsedData.geometries[geometryType];\r\n for (const parsedGeometryData of geom) {\r\n if (parsedGeometryData.id === parsedMesh.geometryId) {\r\n switch (geometryType) {\r\n case \"vertexData\":\r\n Geometry.Parse(parsedGeometryData, scene, rootUrl);\r\n break;\r\n }\r\n found = true;\r\n break;\r\n }\r\n }\r\n\r\n if (found) {\r\n break;\r\n }\r\n }\r\n if (found === false) {\r\n Logger.Warn(\"Geometry not found for mesh \" + parsedMesh.id);\r\n }\r\n }\r\n }\r\n\r\n // Material ?\r\n if (parsedMesh.materialUniqueId || parsedMesh.materialId) {\r\n // if we have a unique ID, look up and store in loadedMaterialsUniqueIds, else use loadedMaterialsIds\r\n const materialArray = parsedMesh.materialUniqueId ? loadedMaterialsUniqueIds : loadedMaterialsIds;\r\n let materialFound = materialArray.indexOf(parsedMesh.materialUniqueId || parsedMesh.materialId) !== -1;\r\n if (materialFound === false && parsedData.multiMaterials !== undefined && parsedData.multiMaterials !== null) {\r\n // Loads a submaterial of a multimaterial\r\n const loadSubMaterial = (subMatId: string, predicate: (parsedMaterial: any) => boolean) => {\r\n materialArray.push(subMatId);\r\n const mat = ParseMaterialByPredicate(predicate, parsedData, scene, rootUrl);\r\n if (mat && mat.material) {\r\n TempMaterialIndexContainer[mat.parsedMaterial.uniqueId || mat.parsedMaterial.id] = mat.material;\r\n log += \"\\n\\tMaterial \" + mat.material.toString(fullDetails);\r\n }\r\n };\r\n for (let multimatIndex = 0, multimatCache = parsedData.multiMaterials.length; multimatIndex < multimatCache; multimatIndex++) {\r\n const parsedMultiMaterial = parsedData.multiMaterials[multimatIndex];\r\n if (\r\n (parsedMesh.materialUniqueId && parsedMultiMaterial.uniqueId === parsedMesh.materialUniqueId) ||\r\n parsedMultiMaterial.id === parsedMesh.materialId\r\n ) {\r\n if (parsedMultiMaterial.materialsUniqueIds) {\r\n // if the materials inside the multimat are stored by unique id\r\n for (const subMatId of parsedMultiMaterial.materialsUniqueIds) {\r\n loadSubMaterial(subMatId, (parsedMaterial) => parsedMaterial.uniqueId === subMatId);\r\n }\r\n } else {\r\n // if the mats are stored by id instead\r\n for (const subMatId of parsedMultiMaterial.materials) {\r\n loadSubMaterial(subMatId, (parsedMaterial) => parsedMaterial.id === subMatId);\r\n }\r\n }\r\n materialArray.push(parsedMultiMaterial.uniqueId || parsedMultiMaterial.id);\r\n const mmat = MultiMaterial.ParseMultiMaterial(parsedMultiMaterial, scene);\r\n TempMaterialIndexContainer[parsedMultiMaterial.uniqueId || parsedMultiMaterial.id] = mmat;\r\n if (mmat) {\r\n materialFound = true;\r\n log += \"\\n\\tMulti-Material \" + mmat.toString(fullDetails);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (materialFound === false) {\r\n materialArray.push(parsedMesh.materialUniqueId || parsedMesh.materialId);\r\n const mat = ParseMaterialByPredicate(\r\n (parsedMaterial) =>\r\n (parsedMesh.materialUniqueId && parsedMaterial.uniqueId === parsedMesh.materialUniqueId) || parsedMaterial.id === parsedMesh.materialId,\r\n parsedData,\r\n scene,\r\n rootUrl\r\n );\r\n if (!mat || !mat.material) {\r\n Logger.Warn(\"Material not found for mesh \" + parsedMesh.id);\r\n } else {\r\n TempMaterialIndexContainer[mat.parsedMaterial.uniqueId || mat.parsedMaterial.id] = mat.material;\r\n log += \"\\n\\tMaterial \" + mat.material.toString(fullDetails);\r\n }\r\n }\r\n }\r\n\r\n // Skeleton ?\r\n if (\r\n parsedMesh.skeletonId !== null &&\r\n parsedMesh.skeletonId !== undefined &&\r\n parsedData.skeletonId !== -1 &&\r\n parsedData.skeletons !== undefined &&\r\n parsedData.skeletons !== null\r\n ) {\r\n const skeletonAlreadyLoaded = loadedSkeletonsIds.indexOf(parsedMesh.skeletonId) > -1;\r\n if (!skeletonAlreadyLoaded) {\r\n for (let skeletonIndex = 0, skeletonCache = parsedData.skeletons.length; skeletonIndex < skeletonCache; skeletonIndex++) {\r\n const parsedSkeleton = parsedData.skeletons[skeletonIndex];\r\n if (parsedSkeleton.id === parsedMesh.skeletonId) {\r\n const skeleton = Skeleton.Parse(parsedSkeleton, scene);\r\n loadedSkeletonsIds.push(parsedSkeleton.id);\r\n if (parsedSkeleton.uniqueId !== undefined && parsedSkeleton.uniqueId !== null) {\r\n TempSkeletonIndexContainer[parsedSkeleton.uniqueId] = skeleton;\r\n }\r\n skeletons.push(skeleton);\r\n log += \"\\n\\tSkeleton \" + skeleton.toString(fullDetails);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Morph target managers ?\r\n if (parsedMesh.morphTargetManagerId > -1 && parsedData.morphTargetManagers !== undefined && parsedData.morphTargetManagers !== null) {\r\n const morphTargetManagerAlreadyLoaded = loadedMorphTargetManagerIds.indexOf(parsedMesh.morphTargetManagerId) > -1;\r\n if (!morphTargetManagerAlreadyLoaded) {\r\n for (let morphTargetManagerIndex = 0; morphTargetManagerIndex < parsedData.morphTargetManagers.length; morphTargetManagerIndex++) {\r\n const parsedManager = parsedData.morphTargetManagers[morphTargetManagerIndex];\r\n if (parsedManager.id === parsedMesh.morphTargetManagerId) {\r\n const morphTargetManager = MorphTargetManager.Parse(parsedManager, scene);\r\n TempMorphTargetManagerIndexContainer[parsedManager.id] = morphTargetManager;\r\n loadedMorphTargetManagerIds.push(parsedManager.id);\r\n log += \"\\nMorph target manager\" + morphTargetManager.toString();\r\n }\r\n }\r\n }\r\n }\r\n\r\n const mesh = Mesh.Parse(parsedMesh, scene, rootUrl);\r\n meshes.push(mesh);\r\n parsedIdToNodeMap.set(mesh._waitingParsedUniqueId!, mesh);\r\n mesh._waitingParsedUniqueId = null;\r\n log += \"\\n\\tMesh \" + mesh.toString(fullDetails);\r\n }\r\n }\r\n\r\n // link multimats with materials\r\n for (const multimat of scene.multiMaterials) {\r\n for (const subMaterial of multimat._waitingSubMaterialsUniqueIds) {\r\n multimat.subMaterials.push(FindMaterial(subMaterial, scene));\r\n }\r\n multimat._waitingSubMaterialsUniqueIds = [];\r\n }\r\n\r\n // link meshes with materials\r\n for (const mesh of scene.meshes) {\r\n if (mesh._waitingMaterialId !== null) {\r\n mesh.material = FindMaterial(mesh._waitingMaterialId, scene);\r\n mesh._waitingMaterialId = null;\r\n }\r\n }\r\n\r\n // link meshes with morph target managers\r\n for (const mesh of scene.meshes) {\r\n if (mesh._waitingMorphTargetManagerId !== null) {\r\n mesh.morphTargetManager = TempMorphTargetManagerIndexContainer[mesh._waitingMorphTargetManagerId];\r\n mesh._waitingMorphTargetManagerId = null;\r\n }\r\n }\r\n\r\n // Connecting parents and lods\r\n for (let index = 0, cache = scene.transformNodes.length; index < cache; index++) {\r\n const transformNode = scene.transformNodes[index];\r\n if (transformNode._waitingParentId !== null) {\r\n let parent = parsedIdToNodeMap.get(parseInt(transformNode._waitingParentId)) || null;\r\n if (parent === null) {\r\n parent = scene.getLastEntryById(transformNode._waitingParentId);\r\n }\r\n let parentNode = parent;\r\n if (transformNode._waitingParentInstanceIndex) {\r\n parentNode = (parent as Mesh).instances[parseInt(transformNode._waitingParentInstanceIndex)];\r\n transformNode._waitingParentInstanceIndex = null;\r\n }\r\n transformNode.parent = parentNode;\r\n transformNode._waitingParentId = null;\r\n }\r\n }\r\n let currentMesh: AbstractMesh;\r\n for (let index = 0, cache = scene.meshes.length; index < cache; index++) {\r\n currentMesh = scene.meshes[index];\r\n if (currentMesh._waitingParentId) {\r\n let parent = parsedIdToNodeMap.get(parseInt(currentMesh._waitingParentId)) || null;\r\n if (parent === null) {\r\n parent = scene.getLastEntryById(currentMesh._waitingParentId);\r\n }\r\n let parentNode = parent;\r\n if (currentMesh._waitingParentInstanceIndex) {\r\n parentNode = (parent as Mesh).instances[parseInt(currentMesh._waitingParentInstanceIndex)];\r\n currentMesh._waitingParentInstanceIndex = null;\r\n }\r\n currentMesh.parent = parentNode;\r\n currentMesh._waitingParentId = null;\r\n }\r\n if (currentMesh._waitingData.lods) {\r\n LoadDetailLevels(scene, currentMesh);\r\n }\r\n }\r\n\r\n // Remove unused transform nodes\r\n for (const transformNode of loadedTransformNodes) {\r\n const childMeshes = transformNode.getChildMeshes(false);\r\n if (!childMeshes.length) {\r\n transformNode.dispose();\r\n }\r\n }\r\n\r\n // link meshes with skeletons\r\n for (const mesh of scene.meshes) {\r\n // First try to get it via uniqueId\r\n if (mesh._waitingSkeletonUniqueId !== null) {\r\n mesh.skeleton = TempSkeletonIndexContainer[mesh._waitingSkeletonUniqueId];\r\n }\r\n\r\n // If not possible or not found, try to get it from the scene (backwards compatibility)\r\n if (mesh._waitingSkeletonId !== null && !mesh.skeleton) {\r\n mesh.skeleton = scene.getLastSkeletonById(mesh._waitingSkeletonId);\r\n }\r\n\r\n mesh._waitingSkeletonId = null;\r\n mesh._waitingSkeletonUniqueId = null;\r\n }\r\n\r\n // link bones to transform nodes\r\n for (let index = 0, cache = scene.skeletons.length; index < cache; index++) {\r\n const skeleton = scene.skeletons[index];\r\n if (skeleton._hasWaitingData) {\r\n if (skeleton.bones != null) {\r\n for (const bone of skeleton.bones) {\r\n let linkTransformNode: Nullable<Node> = null;\r\n // First try to get it via uniqueId\r\n if (bone._waitingTransformNodeUniqueId !== null) {\r\n linkTransformNode = parsedIdToNodeMap.get(bone._waitingTransformNodeUniqueId) ?? null;\r\n }\r\n\r\n // If not possible or not found, try to get it from the scene (backwards compatibility)\r\n if (bone._waitingTransformNodeId !== null && !linkTransformNode) {\r\n linkTransformNode = scene.getLastEntryById(bone._waitingTransformNodeId);\r\n }\r\n\r\n if (linkTransformNode) {\r\n bone.linkTransformNode(linkTransformNode as TransformNode);\r\n }\r\n\r\n bone._waitingTransformNodeId = null;\r\n bone._waitingTransformNodeUniqueId = null;\r\n }\r\n }\r\n\r\n skeleton._hasWaitingData = null;\r\n }\r\n }\r\n\r\n // freeze and compute world matrix application\r\n for (let index = 0, cache = scene.meshes.length; index < cache; index++) {\r\n currentMesh = scene.meshes[index];\r\n if (currentMesh._waitingData.freezeWorldMatrix) {\r\n currentMesh.freezeWorldMatrix();\r\n currentMesh._waitingData.freezeWorldMatrix = null;\r\n } else {\r\n currentMesh.computeWorldMatrix(true);\r\n }\r\n }\r\n }\r\n\r\n // Particles\r\n if (parsedData.particleSystems !== undefined && parsedData.particleSystems !== null) {\r\n const parser = GetIndividualParser(SceneComponentConstants.NAME_PARTICLESYSTEM);\r\n if (parser) {\r\n for (let index = 0, cache = parsedData.particleSystems.length; index < cache; index++) {\r\n const parsedParticleSystem = parsedData.particleSystems[index];\r\n if (hierarchyIds.indexOf(parsedParticleSystem.emitterId) !== -1) {\r\n particleSystems.push(parser(parsedParticleSystem, scene, rootUrl));\r\n }\r\n }\r\n }\r\n }\r\n\r\n for (const g of scene.geometries) {\r\n g._loadedUniqueId = \"\";\r\n }\r\n\r\n return true;\r\n } catch (err) {\r\n const msg = logOperation(\"importMesh\", parsedData ? parsedData.producer : \"Unknown\") + log;\r\n if (onError) {\r\n onError(msg, err);\r\n } else {\r\n Logger.Log(msg);\r\n throw err;\r\n }\r\n } finally {\r\n if (log !== null && SceneLoaderFlags.loggingLevel !== Constants.SCENELOADER_NO_LOGGING) {\r\n Logger.Log(\r\n logOperation(\"importMesh\", parsedData ? parsedData.producer : \"Unknown\") + (SceneLoaderFlags.loggingLevel !== Constants.SCENELOADER_MINIMAL_LOGGING ? log : \"\")\r\n );\r\n }\r\n TempMaterialIndexContainer = {};\r\n TempMorphTargetManagerIndexContainer = {};\r\n TempSkeletonIndexContainer = {};\r\n }\r\n\r\n return false;\r\n },\r\n load: (scene: Scene, data: string, rootUrl: string, onError?: (message: string, exception?: any) => void): boolean => {\r\n // Entire method running in try block, so ALWAYS logs as far as it got, only actually writes details\r\n // when SceneLoader.debugLogging = true (default), or exception encountered.\r\n // Everything stored in var log instead of writing separate lines to support only writing in exception,\r\n // and avoid problems with multiple concurrent .babylon loads.\r\n let log = \"importScene has failed JSON parse\";\r\n try {\r\n // eslint-disable-next-line no-var\r\n var parsedData = JSON.parse(data);\r\n log = \"\";\r\n\r\n // Scene\r\n if (parsedData.useDelayedTextureLoading !== undefined && parsedData.useDelayedTextureLoading !== null) {\r\n scene.useDelayedTextureLoading = parsedData.useDelayedTextureLoading && !SceneLoaderFlags.ForceFullSceneLoadingForIncremental;\r\n }\r\n if (parsedData.autoClear !== undefined && parsedData.autoClear !== null) {\r\n scene.autoClear = parsedData.autoClear;\r\n }\r\n if (parsedData.clearColor !== undefined && parsedData.clearColor !== null) {\r\n scene.clearColor = Color4.FromArray(parsedData.clearColor);\r\n }\r\n if (parsedData.ambientColor !== undefined && parsedData.ambientColor !== null) {\r\n scene.ambientColor = Color3.FromArray(parsedData.ambientColor);\r\n }\r\n if (parsedData.gravity !== undefined && parsedData.gravity !== null) {\r\n scene.gravity = Vector3.FromArray(parsedData.gravity);\r\n }\r\n\r\n if (parsedData.useRightHandedSystem !== undefined) {\r\n scene.useRightHandedSystem = !!parsedData.useRightHandedSystem;\r\n }\r\n\r\n // Fog\r\n if (parsedData.fogMode !== undefined && parsedData.fogMode !== null) {\r\n scene.fogMode = parsedData.fogMode;\r\n }\r\n if (parsedData.fogColor !== undefined && parsedData.fogColor !== null) {\r\n scene.fogColor = Color3.FromArray(parsedData.fogColor);\r\n }\r\n if (parsedData.fogStart !== undefined && parsedData.fogStart !== null) {\r\n scene.fogStart = parsedData.fogStart;\r\n }\r\n if (parsedData.fogEnd !== undefined && parsedData.fogEnd !== null) {\r\n scene.fogEnd = parsedData.fogEnd;\r\n }\r\n if (parsedData.fogDensity !== undefined && parsedData.fogDensity !== null) {\r\n scene.fogDensity = parsedData.fogDensity;\r\n }\r\n log += \"\\tFog mode for scene: \";\r\n switch (scene.fogMode) {\r\n case 0:\r\n log += \"none\\n\";\r\n break;\r\n // getters not compiling, so using hardcoded\r\n case 1:\r\n log += \"exp\\n\";\r\n break;\r\n case 2:\r\n log += \"exp2\\n\";\r\n break;\r\n case 3:\r\n log += \"linear\\n\";\r\n break;\r\n }\r\n\r\n //Physics\r\n if (parsedData.physicsEnabled) {\r\n let physicsPlugin;\r\n if (parsedData.physicsEngine === \"cannon\" || parsedData.physicsEngine === CannonJSPlugin.name) {\r\n physicsPlugin = new CannonJSPlugin(undefined, undefined, BabylonFileLoaderConfiguration.LoaderInjectedPhysicsEngine);\r\n } else if (parsedData.physicsEngine === \"oimo\" || parsedData.physicsEngine === OimoJSPlugin.name) {\r\n physicsPlugin = new OimoJSPlugin(undefined, BabylonFileLoaderConfiguration.LoaderInjectedPhysicsEngine);\r\n } else if (parsedData.physicsEngine === \"ammo\" || parsedData.physicsEngine === AmmoJSPlugin.name) {\r\n physicsPlugin = new AmmoJSPlugin(undefined, BabylonFileLoaderConfiguration.LoaderInjectedPhysicsEngine, undefined);\r\n }\r\n log = \"\\tPhysics engine \" + (parsedData.physicsEngine ? parsedData.physicsEngine : \"oimo\") + \" enabled\\n\";\r\n //else - default engine, which is currently oimo\r\n const physicsGravity = parsedData.gravity ? Vector3.FromArray(parsedData.gravity) : parsedData.physicsGravity ? Vector3.FromArray(parsedData.physicsGravity) : null;\r\n scene.enablePhysics(physicsGravity, physicsPlugin);\r\n }\r\n\r\n // Metadata\r\n if (parsedData.metadata !== undefined && parsedData.metadata !== null) {\r\n scene.metadata = parsedData.metadata;\r\n }\r\n\r\n //collisions, if defined. otherwise, default is true\r\n if (parsedData.collisionsEnabled !== undefined && parsedData.collisionsEnabled !== null) {\r\n scene.collisionsEnabled = parsedData.collisionsEnabled;\r\n }\r\n\r\n const container = LoadAssetContainer(scene, data, rootUrl, onError, true);\r\n if (!container) {\r\n return false;\r\n }\r\n\r\n if (parsedData.autoAnimate) {\r\n scene.beginAnimation(scene, parsedData.autoAnimateFrom, parsedData.autoAnimateTo, parsedData.autoAnimateLoop, parsedData.autoAnimateSpeed || 1.0);\r\n }\r\n\r\n if (parsedData.activeCameraID !== undefined && parsedData.activeCameraID !== null) {\r\n scene.setActiveCameraById(parsedData.activeCameraID);\r\n }\r\n\r\n // Finish\r\n return true;\r\n } catch (err) {\r\n const msg = logOperation(\"importScene\", parsedData ? parsedData.producer : \"Unknown\") + log;\r\n if (onError) {\r\n onError(msg, err);\r\n } else {\r\n Logger.Log(msg);\r\n throw err;\r\n }\r\n } finally {\r\n if (log !== null && SceneLoaderFlags.loggingLevel !== Constants.SCENELOADER_NO_LOGGING) {\r\n Logger.Log(\r\n logOperation(\"importScene\", parsedData ? parsedData.producer : \"Unknown\") + (SceneLoaderFlags.loggingLevel !== Constants.SCENELOADER_MINIMAL_LOGGING ? log : \"\")\r\n );\r\n }\r\n }\r\n return false;\r\n },\r\n loadAssetContainer: (scene: Scene, data: string, rootUrl: string, onError?: (message: string, exception?: any) => void): AssetContainer => {\r\n const container = LoadAssetContainer(scene, data, rootUrl, onError);\r\n return container;\r\n },\r\n});\r\n"]}
1
+ {"version":3,"file":"babylonFileLoader.js","sourceRoot":"","sources":["../../../../../dev/core/src/Loading/Plugins/babylonFileLoader.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../../Misc/logger\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Camera } from \"../../Cameras/camera\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Vector3 } from \"../../Maths/math.vector\";\r\nimport { Color3, Color4 } from \"../../Maths/math.color\";\r\nimport { Mesh } from \"../../Meshes/mesh\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Geometry } from \"../../Meshes/geometry\";\r\nimport type { Node } from \"../../node\";\r\nimport { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Material } from \"../../Materials/material\";\r\nimport { MultiMaterial } from \"../../Materials/multiMaterial\";\r\nimport { CubeTexture } from \"../../Materials/Textures/cubeTexture\";\r\nimport { HDRCubeTexture } from \"../../Materials/Textures/hdrCubeTexture\";\r\nimport { AnimationGroup } from \"../../Animations/animationGroup\";\r\nimport { Light } from \"../../Lights/light\";\r\nimport { SceneComponentConstants } from \"../../sceneComponent\";\r\nimport { RegisterSceneLoaderPlugin } from \"../../Loading/sceneLoader\";\r\nimport { SceneLoaderFlags } from \"../sceneLoaderFlags\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { AssetContainer } from \"../../assetContainer\";\r\nimport { ActionManager } from \"../../Actions/actionManager\";\r\nimport type { IParticleSystem } from \"../../Particles/IParticleSystem\";\r\nimport { Skeleton } from \"../../Bones/skeleton\";\r\nimport { MorphTargetManager } from \"../../Morph/morphTargetManager\";\r\nimport { CannonJSPlugin } from \"../../Physics/v1/Plugins/cannonJSPlugin\";\r\nimport { OimoJSPlugin } from \"../../Physics/v1/Plugins/oimoJSPlugin\";\r\nimport { AmmoJSPlugin } from \"../../Physics/v1/Plugins/ammoJSPlugin\";\r\nimport { ReflectionProbe } from \"../../Probes/reflectionProbe\";\r\nimport { GetClass } from \"../../Misc/typeStore\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport { SpriteManager } from \"core/Sprites/spriteManager\";\r\nimport { GetIndividualParser, Parse } from \"./babylonFileParser.function\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { MorphTarget } from \"../../Morph/morphTarget\";\r\n\r\nimport \"../../Physics/joinedPhysicsEngineComponent\";\r\nimport \"../../Helpers/sceneHelpers\";\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention, no-var\r\nexport var _BabylonLoaderRegistered = true;\r\n\r\n/**\r\n * Helps setting up some configuration for the babylon file loader.\r\n */\r\nexport class BabylonFileLoaderConfiguration {\r\n /**\r\n * The loader does not allow injecting custom physics engine into the plugins.\r\n * Unfortunately in ES6, we need to manually inject them into the plugin.\r\n * So you could set this variable to your engine import to make it work.\r\n */\r\n public static LoaderInjectedPhysicsEngine: any = undefined;\r\n}\r\n\r\nlet TempIndexContainer: { [key: string]: Node } = {};\r\nlet TempMaterialIndexContainer: { [key: string]: Material } = {};\r\nlet TempMorphTargetIndexContainer: { [key: number]: MorphTarget } = {};\r\nlet TempMorphTargetManagerIndexContainer: { [key: string]: MorphTargetManager } = {};\r\nlet TempSkeletonIndexContainer: { [key: number]: Skeleton } = {};\r\n\r\nconst ParseMaterialByPredicate = (predicate: (parsedMaterial: any) => boolean, parsedData: any, scene: Scene, rootUrl: string) => {\r\n if (!parsedData.materials) {\r\n return null;\r\n }\r\n\r\n for (let index = 0, cache = parsedData.materials.length; index < cache; index++) {\r\n const parsedMaterial = parsedData.materials[index];\r\n if (predicate(parsedMaterial)) {\r\n return { parsedMaterial, material: Material.Parse(parsedMaterial, scene, rootUrl) };\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nconst IsDescendantOf = (mesh: any, names: Array<any>, hierarchyIds: Array<number>) => {\r\n for (const i in names) {\r\n if (mesh.name === names[i]) {\r\n hierarchyIds.push(mesh.id);\r\n return true;\r\n }\r\n }\r\n if (mesh.parentId !== undefined && hierarchyIds.indexOf(mesh.parentId) !== -1) {\r\n hierarchyIds.push(mesh.id);\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst logOperation = (operation: string, producer: { file: string; name: string; version: string; exporter_version: string }) => {\r\n return (\r\n operation +\r\n \" of \" +\r\n (producer ? producer.file + \" from \" + producer.name + \" version: \" + producer.version + \", exporter version: \" + producer.exporter_version : \"unknown\")\r\n );\r\n};\r\n\r\nconst LoadDetailLevels = (scene: Scene, mesh: AbstractMesh) => {\r\n const mastermesh: Mesh = mesh as Mesh;\r\n\r\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.\r\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.\r\n if (mesh._waitingData.lods) {\r\n if (mesh._waitingData.lods.ids && mesh._waitingData.lods.ids.length > 0) {\r\n const lodmeshes: string[] = mesh._waitingData.lods.ids;\r\n const wasenabled: boolean = mastermesh.isEnabled(false);\r\n if (mesh._waitingData.lods.distances) {\r\n const distances: number[] = mesh._waitingData.lods.distances;\r\n if (distances.length >= lodmeshes.length) {\r\n const culling: number = distances.length > lodmeshes.length ? distances[distances.length - 1] : 0;\r\n mastermesh.setEnabled(false);\r\n for (let index = 0; index < lodmeshes.length; index++) {\r\n const lodid: string = lodmeshes[index];\r\n const lodmesh: Mesh = scene.getMeshById(lodid) as Mesh;\r\n if (lodmesh != null) {\r\n mastermesh.addLODLevel(distances[index], lodmesh);\r\n }\r\n }\r\n if (culling > 0) {\r\n mastermesh.addLODLevel(culling, null);\r\n }\r\n if (wasenabled === true) {\r\n mastermesh.setEnabled(true);\r\n }\r\n } else {\r\n Tools.Warn(\"Invalid level of detail distances for \" + mesh.name);\r\n }\r\n }\r\n }\r\n mesh._waitingData.lods = null;\r\n }\r\n};\r\n\r\nconst FindParent = (parentId: any, parentInstanceIndex: any, scene: Scene) => {\r\n if (typeof parentId !== \"number\") {\r\n const parentEntry = scene.getLastEntryById(parentId);\r\n if (parentEntry && parentInstanceIndex !== undefined && parentInstanceIndex !== null) {\r\n const instance = (parentEntry as Mesh).instances[parseInt(parentInstanceIndex)];\r\n return instance;\r\n }\r\n return parentEntry;\r\n }\r\n\r\n const parent = TempIndexContainer[parentId];\r\n if (parent && parentInstanceIndex !== undefined && parentInstanceIndex !== null) {\r\n const instance = (parent as Mesh).instances[parseInt(parentInstanceIndex)];\r\n return instance;\r\n }\r\n\r\n return parent;\r\n};\r\n\r\nconst FindMaterial = (materialId: any, scene: Scene) => {\r\n if (typeof materialId !== \"number\") {\r\n return scene.getLastMaterialById(materialId, true);\r\n }\r\n\r\n return TempMaterialIndexContainer[materialId];\r\n};\r\n\r\nconst FindMorphTargetManager = (managerId: any, scene: Scene) => {\r\n if (TempMorphTargetManagerIndexContainer[managerId]) {\r\n return TempMorphTargetManagerIndexContainer[managerId];\r\n }\r\n return scene.getMorphTargetManagerById(managerId);\r\n};\r\n\r\n/**\r\n * @experimental\r\n * Loads an AssetContainer from a serialized Babylon scene.\r\n * @param scene The scene to load the asset container into.\r\n * @param serializedScene The serialized scene data. This can be either a JSON string, or an object (e.g. from a call to JSON.parse).\r\n * @param rootUrl The root URL for loading assets.\r\n * @returns The loaded AssetContainer.\r\n */\r\nexport function LoadAssetContainerFromSerializedScene(scene: Scene, serializedScene: string | object, rootUrl: string): AssetContainer {\r\n return LoadAssetContainer(scene, serializedScene, rootUrl);\r\n}\r\n\r\nconst LoadAssetContainer = (scene: Scene, data: string | object, rootUrl: string, onError?: (message: string, exception?: any) => void, addToScene = false): AssetContainer => {\r\n const container = new AssetContainer(scene);\r\n\r\n // When loading into a container (not directly into the scene), suppress entity-added\r\n // observables to prevent scene events during loading. Entities still get added to scene\r\n // arrays (so the linking code can find them), but no events fire.\r\n // They are removed from the scene at the end via container.removeAllFromScene().\r\n let savedObservables: Record<string, Observable<any>> | undefined;\r\n if (!addToScene) {\r\n savedObservables = {\r\n mesh: scene.onNewMeshAddedObservable,\r\n transformNode: scene.onNewTransformNodeAddedObservable,\r\n light: scene.onNewLightAddedObservable,\r\n camera: scene.onNewCameraAddedObservable,\r\n material: scene.onNewMaterialAddedObservable,\r\n multiMaterial: scene.onNewMultiMaterialAddedObservable,\r\n texture: scene.onNewTextureAddedObservable,\r\n skeleton: scene.onNewSkeletonAddedObservable,\r\n geometry: scene.onNewGeometryAddedObservable,\r\n animationGroup: scene.onNewAnimationGroupAddedObservable,\r\n particleSystem: scene.onNewParticleSystemAddedObservable,\r\n };\r\n scene.onNewMeshAddedObservable = new Observable();\r\n scene.onNewTransformNodeAddedObservable = new Observable();\r\n scene.onNewLightAddedObservable = new Observable();\r\n scene.onNewCameraAddedObservable = new Observable();\r\n scene.onNewMaterialAddedObservable = new Observable();\r\n scene.onNewMultiMaterialAddedObservable = new Observable();\r\n scene.onNewTextureAddedObservable = new Observable();\r\n scene.onNewSkeletonAddedObservable = new Observable();\r\n scene.onNewGeometryAddedObservable = new Observable();\r\n scene.onNewAnimationGroupAddedObservable = new Observable();\r\n scene.onNewParticleSystemAddedObservable = new Observable();\r\n }\r\n\r\n // Entire method running in try block, so ALWAYS logs as far as it got, only actually writes details\r\n // when SceneLoader.debugLogging = true (default), or exception encountered.\r\n // Everything stored in var log instead of writing separate lines to support only writing in exception,\r\n // and avoid problems with multiple concurrent .babylon loads.\r\n let log = \"importScene has failed JSON parse\";\r\n try {\r\n // eslint-disable-next-line no-var\r\n var parsedData = typeof data === \"object\" ? data : JSON.parse(data);\r\n log = \"\";\r\n const fullDetails = SceneLoaderFlags.loggingLevel === Constants.SCENELOADER_DETAILED_LOGGING;\r\n\r\n let index: number;\r\n let cache: number;\r\n\r\n // Environment texture\r\n if (parsedData.environmentTexture !== undefined && parsedData.environmentTexture !== null) {\r\n // PBR needed for both HDR texture (gamma space) & a sky box\r\n const isPBR = parsedData.isPBR !== undefined ? parsedData.isPBR : true;\r\n if (parsedData.environmentTextureType && parsedData.environmentTextureType === \"BABYLON.HDRCubeTexture\") {\r\n const hdrSize: number = parsedData.environmentTextureSize ? parsedData.environmentTextureSize : 128;\r\n const hdrTexture = new HDRCubeTexture(\r\n (parsedData.environmentTexture.match(/https?:\\/\\//g) ? \"\" : rootUrl) + parsedData.environmentTexture,\r\n scene,\r\n hdrSize,\r\n true,\r\n !isPBR,\r\n undefined,\r\n parsedData.environmentTexturePrefilterOnLoad\r\n );\r\n if (parsedData.environmentTextureRotationY) {\r\n hdrTexture.rotationY = parsedData.environmentTextureRotationY;\r\n }\r\n scene.environmentTexture = hdrTexture;\r\n } else {\r\n if (typeof parsedData.environmentTexture === \"object\") {\r\n const environmentTexture = CubeTexture.Parse(parsedData.environmentTexture, scene, rootUrl);\r\n scene.environmentTexture = environmentTexture;\r\n } else if ((parsedData.environmentTexture as string).endsWith(\".env\")) {\r\n const compressedTexture = new CubeTexture(\r\n (parsedData.environmentTexture.match(/https?:\\/\\//g) ? \"\" : rootUrl) + parsedData.environmentTexture,\r\n scene,\r\n parsedData.environmentTextureForcedExtension\r\n );\r\n if (parsedData.environmentTextureRotationY) {\r\n compressedTexture.rotationY = parsedData.environmentTextureRotationY;\r\n }\r\n scene.environmentTexture = compressedTexture;\r\n } else {\r\n const cubeTexture = CubeTexture.CreateFromPrefilteredData(\r\n (parsedData.environmentTexture.match(/https?:\\/\\//g) ? \"\" : rootUrl) + parsedData.environmentTexture,\r\n scene,\r\n parsedData.environmentTextureForcedExtension\r\n );\r\n if (parsedData.environmentTextureRotationY) {\r\n cubeTexture.rotationY = parsedData.environmentTextureRotationY;\r\n }\r\n scene.environmentTexture = cubeTexture;\r\n }\r\n }\r\n if (parsedData.createDefaultSkybox === true) {\r\n const skyboxScale = scene.activeCamera !== undefined && scene.activeCamera !== null ? (scene.activeCamera.maxZ - scene.activeCamera.minZ) / 2 : 1000;\r\n const skyboxBlurLevel = parsedData.skyboxBlurLevel || 0;\r\n scene.createDefaultSkybox(scene.environmentTexture, isPBR, skyboxScale, skyboxBlurLevel);\r\n }\r\n container.environmentTexture = scene.environmentTexture;\r\n }\r\n\r\n // Environment Intensity\r\n if (parsedData.environmentIntensity !== undefined && parsedData.environmentIntensity !== null) {\r\n scene.environmentIntensity = parsedData.environmentIntensity;\r\n }\r\n\r\n // IBL Intensity\r\n if (parsedData.iblIntensity !== undefined && parsedData.iblIntensity !== null) {\r\n scene.iblIntensity = parsedData.iblIntensity;\r\n }\r\n\r\n // Lights\r\n if (parsedData.lights !== undefined && parsedData.lights !== null) {\r\n for (index = 0, cache = parsedData.lights.length; index < cache; index++) {\r\n const parsedLight = parsedData.lights[index];\r\n const light = Light.Parse(parsedLight, scene);\r\n if (light) {\r\n TempIndexContainer[parsedLight.uniqueId] = light;\r\n container.lights.push(light);\r\n light._parentContainer = container;\r\n log += index === 0 ? \"\\n\\tLights:\" : \"\";\r\n log += \"\\n\\t\\t\" + light.toString(fullDetails);\r\n }\r\n }\r\n }\r\n\r\n // Reflection probes\r\n if (parsedData.reflectionProbes !== undefined && parsedData.reflectionProbes !== null) {\r\n for (index = 0, cache = parsedData.reflectionProbes.length; index < cache; index++) {\r\n const parsedReflectionProbe = parsedData.reflectionProbes[index];\r\n const reflectionProbe = ReflectionProbe.Parse(parsedReflectionProbe, scene, rootUrl);\r\n if (reflectionProbe) {\r\n container.reflectionProbes.push(reflectionProbe);\r\n reflectionProbe._parentContainer = container;\r\n log += index === 0 ? \"\\n\\tReflection Probes:\" : \"\";\r\n log += \"\\n\\t\\t\" + reflectionProbe.toString(fullDetails);\r\n }\r\n }\r\n }\r\n\r\n // Animations\r\n if (parsedData.animations !== undefined && parsedData.animations !== null) {\r\n for (index = 0, cache = parsedData.animations.length; index < cache; index++) {\r\n const parsedAnimation = parsedData.animations[index];\r\n const internalClass = GetClass(\"BABYLON.Animation\");\r\n if (internalClass) {\r\n const animation = internalClass.Parse(parsedAnimation);\r\n scene.animations.push(animation);\r\n container.animations.push(animation);\r\n log += index === 0 ? \"\\n\\tAnimations:\" : \"\";\r\n log += \"\\n\\t\\t\" + animation.toString(fullDetails);\r\n }\r\n }\r\n }\r\n\r\n // Materials\r\n if (parsedData.materials !== undefined && parsedData.materials !== null) {\r\n for (index = 0, cache = parsedData.materials.length; index < cache; index++) {\r\n const parsedMaterial = parsedData.materials[index];\r\n const mat = Material.Parse(parsedMaterial, scene, rootUrl);\r\n if (mat) {\r\n TempMaterialIndexContainer[parsedMaterial.uniqueId || parsedMaterial.id] = mat;\r\n container.materials.push(mat);\r\n mat._parentContainer = container;\r\n log += index === 0 ? \"\\n\\tMaterials:\" : \"\";\r\n log += \"\\n\\t\\t\" + mat.toString(fullDetails);\r\n\r\n // Textures\r\n const textures = mat.getActiveTextures();\r\n for (const t of textures) {\r\n if (container.textures.indexOf(t) == -1) {\r\n container.textures.push(t);\r\n t._parentContainer = container;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (parsedData.textures !== undefined && parsedData.textures !== null) {\r\n for (index = 0, cache = parsedData.textures.length; index < cache; index++) {\r\n const parsedTexture = parsedData.textures[index];\r\n const texture = Texture.Parse(parsedTexture, scene, rootUrl);\r\n if (texture) {\r\n if (container.textures.indexOf(texture) == -1) {\r\n container.textures.push(texture);\r\n texture._parentContainer = container;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (parsedData.multiMaterials !== undefined && parsedData.multiMaterials !== null) {\r\n for (index = 0, cache = parsedData.multiMaterials.length; index < cache; index++) {\r\n const parsedMultiMaterial = parsedData.multiMaterials[index];\r\n const mmat = MultiMaterial.ParseMultiMaterial(parsedMultiMaterial, scene);\r\n TempMaterialIndexContainer[parsedMultiMaterial.uniqueId || parsedMultiMaterial.id] = mmat;\r\n container.multiMaterials.push(mmat);\r\n mmat._parentContainer = container;\r\n\r\n log += index === 0 ? \"\\n\\tMultiMaterials:\" : \"\";\r\n log += \"\\n\\t\\t\" + mmat.toString(fullDetails);\r\n\r\n // Textures\r\n const textures = mmat.getActiveTextures();\r\n for (const t of textures) {\r\n if (container.textures.indexOf(t) == -1) {\r\n container.textures.push(t);\r\n t._parentContainer = container;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Morph target managers\r\n if (parsedData.morphTargetManagers !== undefined && parsedData.morphTargetManagers !== null) {\r\n for (const parsedManager of parsedData.morphTargetManagers) {\r\n const manager = MorphTargetManager.Parse(parsedManager, scene);\r\n TempMorphTargetManagerIndexContainer[parsedManager.id] = manager;\r\n container.morphTargetManagers.push(manager);\r\n manager._parentContainer = container;\r\n\r\n // Morph targets - add to TempMorphTargetIndexContainer to later connect animations -> morph targets\r\n for (let index = 0; index < parsedManager.targets.length; index++) {\r\n const parsedTarget = parsedManager.targets[index];\r\n if (parsedTarget.uniqueId !== undefined && parsedTarget.uniqueId !== null) {\r\n const target = manager.getTarget(index);\r\n TempMorphTargetIndexContainer[parsedTarget.uniqueId] = target;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Skeletons\r\n if (parsedData.skeletons !== undefined && parsedData.skeletons !== null) {\r\n for (index = 0, cache = parsedData.skeletons.length; index < cache; index++) {\r\n const parsedSkeleton = parsedData.skeletons[index];\r\n const skeleton = Skeleton.Parse(parsedSkeleton, scene);\r\n if (parsedSkeleton.uniqueId !== undefined && parsedSkeleton.uniqueId !== null) {\r\n TempSkeletonIndexContainer[parsedSkeleton.uniqueId] = skeleton;\r\n }\r\n container.skeletons.push(skeleton);\r\n skeleton._parentContainer = container;\r\n log += index === 0 ? \"\\n\\tSkeletons:\" : \"\";\r\n log += \"\\n\\t\\t\" + skeleton.toString(fullDetails);\r\n\r\n // Bones - add to TempIndexContainer to later connect animations -> bones\r\n for (let boneIndex = 0; boneIndex < parsedSkeleton.bones.length; boneIndex++) {\r\n const parsedBone = parsedSkeleton.bones[boneIndex];\r\n const bone = skeleton.bones[boneIndex]; // This was instantiated in Skeleton.Parse\r\n TempIndexContainer[parsedBone.uniqueId] = bone;\r\n }\r\n }\r\n }\r\n\r\n // Geometries\r\n const geometries = parsedData.geometries;\r\n if (geometries !== undefined && geometries !== null) {\r\n const addedGeometry = new Array<Nullable<Geometry>>();\r\n\r\n // VertexData\r\n const vertexData = geometries.vertexData;\r\n if (vertexData !== undefined && vertexData !== null) {\r\n for (index = 0, cache = vertexData.length; index < cache; index++) {\r\n const parsedVertexData = vertexData[index];\r\n\r\n addedGeometry.push(Geometry.Parse(parsedVertexData, scene, rootUrl));\r\n }\r\n }\r\n\r\n for (const g of addedGeometry) {\r\n if (g) {\r\n container.geometries.push(g);\r\n g._parentContainer = container;\r\n }\r\n }\r\n }\r\n\r\n // Transform nodes\r\n if (parsedData.transformNodes !== undefined && parsedData.transformNodes !== null) {\r\n for (index = 0, cache = parsedData.transformNodes.length; index < cache; index++) {\r\n const parsedTransformNode = parsedData.transformNodes[index];\r\n const node = TransformNode.Parse(parsedTransformNode, scene, rootUrl);\r\n TempIndexContainer[parsedTransformNode.uniqueId] = node;\r\n container.transformNodes.push(node);\r\n node._parentContainer = container;\r\n }\r\n }\r\n\r\n // Meshes\r\n if (parsedData.meshes !== undefined && parsedData.meshes !== null) {\r\n for (index = 0, cache = parsedData.meshes.length; index < cache; index++) {\r\n const parsedMesh = parsedData.meshes[index];\r\n const mesh = <AbstractMesh>Mesh.Parse(parsedMesh, scene, rootUrl);\r\n TempIndexContainer[parsedMesh.uniqueId] = mesh;\r\n container.meshes.push(mesh);\r\n mesh._parentContainer = container;\r\n if (mesh.hasInstances) {\r\n for (const instance of (mesh as Mesh).instances) {\r\n container.meshes.push(instance);\r\n instance._parentContainer = container;\r\n }\r\n }\r\n log += index === 0 ? \"\\n\\tMeshes:\" : \"\";\r\n log += \"\\n\\t\\t\" + mesh.toString(fullDetails);\r\n }\r\n }\r\n\r\n // Cameras\r\n if (parsedData.cameras !== undefined && parsedData.cameras !== null) {\r\n for (index = 0, cache = parsedData.cameras.length; index < cache; index++) {\r\n const parsedCamera = parsedData.cameras[index];\r\n const camera = Camera.Parse(parsedCamera, scene);\r\n TempIndexContainer[parsedCamera.uniqueId] = camera;\r\n container.cameras.push(camera);\r\n camera._parentContainer = container;\r\n log += index === 0 ? \"\\n\\tCameras:\" : \"\";\r\n log += \"\\n\\t\\t\" + camera.toString(fullDetails);\r\n }\r\n }\r\n\r\n // Postprocesses\r\n if (parsedData.postProcesses !== undefined && parsedData.postProcesses !== null) {\r\n for (index = 0, cache = parsedData.postProcesses.length; index < cache; index++) {\r\n const parsedPostProcess = parsedData.postProcesses[index];\r\n const postProcess = PostProcess.Parse(parsedPostProcess, scene, rootUrl);\r\n if (postProcess) {\r\n container.postProcesses.push(postProcess);\r\n postProcess._parentContainer = container;\r\n log += index === 0 ? \"\\nPostprocesses:\" : \"\";\r\n log += \"\\n\\t\\t\" + postProcess.toString();\r\n }\r\n }\r\n }\r\n\r\n // Animation Groups\r\n if (parsedData.animationGroups !== undefined && parsedData.animationGroups !== null && parsedData.animationGroups.length) {\r\n // Build the nodeMap only for scenes with animationGroups.\r\n let nodeMap: Nullable<Map<Node[\"id\"], Node>> = null;\r\n\r\n // Helper to get nodes by id more efficiently, building the nodeMap only on first access.\r\n const getNodeById = (id: Node[\"id\"]) => {\r\n if (!nodeMap) {\r\n nodeMap = new Map<Node[\"id\"], Node>();\r\n\r\n // Nodes in scene does not change when parsing animationGroups, so it's safe to build a map.\r\n // This follows the order of scene.getNodeById: mesh, transformNode, light, camera, bone\r\n for (let index = 0; index < scene.meshes.length; index++) {\r\n // This follows the behavior of scene.getXXXById, which picks the first match\r\n if (!nodeMap.has(scene.meshes[index].id)) {\r\n nodeMap.set(scene.meshes[index].id, scene.meshes[index]);\r\n }\r\n }\r\n for (let index = 0; index < scene.transformNodes.length; index++) {\r\n if (!nodeMap.has(scene.transformNodes[index].id)) {\r\n nodeMap.set(scene.transformNodes[index].id, scene.transformNodes[index]);\r\n }\r\n }\r\n for (let index = 0; index < scene.lights.length; index++) {\r\n if (!nodeMap.has(scene.lights[index].id)) {\r\n nodeMap.set(scene.lights[index].id, scene.lights[index]);\r\n }\r\n }\r\n for (let index = 0; index < scene.cameras.length; index++) {\r\n if (!nodeMap.has(scene.cameras[index].id)) {\r\n nodeMap.set(scene.cameras[index].id, scene.cameras[index]);\r\n }\r\n }\r\n for (let skeletonIndex = 0; skeletonIndex < scene.skeletons.length; skeletonIndex++) {\r\n const skeleton = scene.skeletons[skeletonIndex];\r\n for (let boneIndex = 0; boneIndex < skeleton.bones.length; boneIndex++) {\r\n if (!nodeMap.has(skeleton.bones[boneIndex].id)) {\r\n nodeMap.set(skeleton.bones[boneIndex].id, skeleton.bones[boneIndex]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return nodeMap.get(id);\r\n };\r\n\r\n const targetLookup = (parsedTargetAnimation: any) => {\r\n let target = null;\r\n const isMorphTarget = parsedTargetAnimation.animation.property === \"influence\";\r\n const uniqueId = parsedTargetAnimation.targetUniqueId;\r\n\r\n // Attempt to find animation targets by uniqueId first (tracked in TempXXXIndexContainer).\r\n if (uniqueId !== undefined && uniqueId !== null) {\r\n target = isMorphTarget ? TempMorphTargetIndexContainer[uniqueId] : TempIndexContainer[uniqueId];\r\n }\r\n\r\n // Backwards compatibility: If no uniqueId is provided or no match is found,\r\n // fall back to searching by id in the scene.\r\n if (!target) {\r\n const id = parsedTargetAnimation.targetId;\r\n target = isMorphTarget ? scene.getMorphTargetById(id) : getNodeById(id);\r\n }\r\n\r\n return target;\r\n };\r\n\r\n for (index = 0, cache = parsedData.animationGroups.length; index < cache; index++) {\r\n const parsedAnimationGroup = parsedData.animationGroups[index];\r\n const animationGroup = AnimationGroup.Parse(parsedAnimationGroup, scene, targetLookup);\r\n container.animationGroups.push(animationGroup);\r\n animationGroup._parentContainer = container;\r\n log += index === 0 ? \"\\n\\tAnimationGroups:\" : \"\";\r\n log += \"\\n\\t\\t\" + animationGroup.toString(fullDetails);\r\n }\r\n }\r\n\r\n // Sprites\r\n if (parsedData.spriteManagers) {\r\n for (let index = 0, cache = parsedData.spriteManagers.length; index < cache; index++) {\r\n const parsedSpriteManager = parsedData.spriteManagers[index];\r\n const spriteManager = SpriteManager.Parse(parsedSpriteManager, scene, rootUrl);\r\n container.spriteManagers.push(spriteManager);\r\n spriteManager._parentContainer = container;\r\n log += \"\\n\\t\\tSpriteManager \" + spriteManager.name;\r\n }\r\n }\r\n\r\n // Browsing all the graph to connect the dots\r\n for (index = 0, cache = scene.cameras.length; index < cache; index++) {\r\n const camera = scene.cameras[index];\r\n if (camera._waitingParentId !== null) {\r\n camera.parent = FindParent(camera._waitingParentId, camera._waitingParentInstanceIndex, scene);\r\n camera._waitingParentId = null;\r\n camera._waitingParentInstanceIndex = null;\r\n }\r\n }\r\n\r\n for (index = 0, cache = scene.lights.length; index < cache; index++) {\r\n const light = scene.lights[index];\r\n if (light && light._waitingParentId !== null) {\r\n light.parent = FindParent(light._waitingParentId, light._waitingParentInstanceIndex, scene);\r\n light._waitingParentId = null;\r\n light._waitingParentInstanceIndex = null;\r\n }\r\n }\r\n\r\n // Connect parents & children and parse actions and lods\r\n for (index = 0, cache = scene.transformNodes.length; index < cache; index++) {\r\n const transformNode = scene.transformNodes[index];\r\n if (transformNode._waitingParentId !== null) {\r\n transformNode.parent = FindParent(transformNode._waitingParentId, transformNode._waitingParentInstanceIndex, scene);\r\n transformNode._waitingParentId = null;\r\n transformNode._waitingParentInstanceIndex = null;\r\n }\r\n }\r\n for (index = 0, cache = scene.meshes.length; index < cache; index++) {\r\n const mesh = scene.meshes[index];\r\n if (mesh._waitingParentId !== null) {\r\n mesh.parent = FindParent(mesh._waitingParentId, mesh._waitingParentInstanceIndex, scene);\r\n mesh._waitingParentId = null;\r\n mesh._waitingParentInstanceIndex = null;\r\n }\r\n if (mesh._waitingData.lods) {\r\n LoadDetailLevels(scene, mesh);\r\n }\r\n }\r\n\r\n // link multimats with materials\r\n for (const multimat of scene.multiMaterials) {\r\n for (const subMaterial of multimat._waitingSubMaterialsUniqueIds) {\r\n multimat.subMaterials.push(FindMaterial(subMaterial, scene));\r\n }\r\n multimat._waitingSubMaterialsUniqueIds = [];\r\n }\r\n\r\n // link meshes with materials\r\n for (const mesh of scene.meshes) {\r\n if (mesh._waitingMaterialId !== null) {\r\n mesh.material = FindMaterial(mesh._waitingMaterialId, scene);\r\n mesh._waitingMaterialId = null;\r\n }\r\n }\r\n\r\n // link meshes with morph target managers\r\n for (const mesh of scene.meshes) {\r\n if (mesh._waitingMorphTargetManagerId !== null) {\r\n mesh.morphTargetManager = FindMorphTargetManager(mesh._waitingMorphTargetManagerId, scene);\r\n mesh._waitingMorphTargetManagerId = null;\r\n }\r\n }\r\n\r\n // link meshes with skeletons\r\n for (const mesh of scene.meshes) {\r\n // First try to get it via uniqueId\r\n if (mesh._waitingSkeletonUniqueId !== null) {\r\n mesh.skeleton = TempSkeletonIndexContainer[mesh._waitingSkeletonUniqueId];\r\n }\r\n\r\n // If not possible or not found, try to get it from the scene (backwards compatibility)\r\n if (mesh._waitingSkeletonId !== null && !mesh.skeleton) {\r\n mesh.skeleton = scene.getLastSkeletonById(mesh._waitingSkeletonId);\r\n }\r\n\r\n mesh._waitingSkeletonId = null;\r\n mesh._waitingSkeletonUniqueId = null;\r\n }\r\n\r\n // link bones to transform nodes\r\n for (index = 0, cache = scene.skeletons.length; index < cache; index++) {\r\n const skeleton = scene.skeletons[index];\r\n if (skeleton._hasWaitingData) {\r\n if (skeleton.bones != null) {\r\n for (const bone of skeleton.bones) {\r\n let linkTransformNode: Nullable<Node> = null;\r\n // First try to get it via uniqueId\r\n if (bone._waitingTransformNodeUniqueId !== null) {\r\n linkTransformNode = TempIndexContainer[bone._waitingTransformNodeUniqueId];\r\n }\r\n\r\n // If not possible or not found, try to get it from the scene (backwards compatibility)\r\n if (bone._waitingTransformNodeId !== null && !linkTransformNode) {\r\n linkTransformNode = scene.getLastEntryById(bone._waitingTransformNodeId);\r\n }\r\n\r\n if (linkTransformNode) {\r\n bone.linkTransformNode(linkTransformNode as TransformNode);\r\n }\r\n\r\n bone._waitingTransformNodeId = null;\r\n bone._waitingTransformNodeUniqueId = null;\r\n }\r\n }\r\n\r\n skeleton._hasWaitingData = null;\r\n }\r\n }\r\n\r\n // freeze world matrix application\r\n for (index = 0, cache = scene.meshes.length; index < cache; index++) {\r\n const currentMesh = scene.meshes[index];\r\n if (currentMesh._waitingData.freezeWorldMatrix) {\r\n currentMesh.freezeWorldMatrix();\r\n currentMesh._waitingData.freezeWorldMatrix = null;\r\n } else {\r\n currentMesh.computeWorldMatrix(true);\r\n }\r\n }\r\n\r\n // Lights exclusions / inclusions\r\n for (index = 0, cache = scene.lights.length; index < cache; index++) {\r\n const light = scene.lights[index];\r\n // Excluded check\r\n if (light._excludedMeshesIds.length > 0) {\r\n for (let excludedIndex = 0; excludedIndex < light._excludedMeshesIds.length; excludedIndex++) {\r\n const excludedMesh = scene.getMeshById(light._excludedMeshesIds[excludedIndex]);\r\n\r\n if (excludedMesh) {\r\n light.excludedMeshes.push(excludedMesh);\r\n }\r\n }\r\n\r\n light._excludedMeshesIds = [];\r\n }\r\n\r\n // Included check\r\n if (light._includedOnlyMeshesIds.length > 0) {\r\n for (let includedOnlyIndex = 0; includedOnlyIndex < light._includedOnlyMeshesIds.length; includedOnlyIndex++) {\r\n const includedOnlyMesh = scene.getMeshById(light._includedOnlyMeshesIds[includedOnlyIndex]);\r\n\r\n if (includedOnlyMesh) {\r\n light.includedOnlyMeshes.push(includedOnlyMesh);\r\n }\r\n }\r\n\r\n light._includedOnlyMeshesIds = [];\r\n }\r\n }\r\n\r\n for (const g of scene.geometries) {\r\n g._loadedUniqueId = \"\";\r\n }\r\n\r\n Parse(parsedData, scene, container, rootUrl);\r\n\r\n // Actions (scene) Done last as it can access other objects.\r\n for (index = 0, cache = scene.meshes.length; index < cache; index++) {\r\n const mesh = scene.meshes[index];\r\n if (mesh._waitingData.actions) {\r\n ActionManager.Parse(mesh._waitingData.actions, mesh, scene);\r\n mesh._waitingData.actions = null;\r\n }\r\n }\r\n if (parsedData.actions !== undefined && parsedData.actions !== null) {\r\n ActionManager.Parse(parsedData.actions, null, scene);\r\n }\r\n } catch (err) {\r\n const msg = logOperation(\"loadAssets\", parsedData ? parsedData.producer : \"Unknown\") + log;\r\n if (onError) {\r\n onError(msg, err);\r\n } else {\r\n Logger.Log(msg);\r\n throw err;\r\n }\r\n } finally {\r\n TempIndexContainer = {};\r\n TempMaterialIndexContainer = {};\r\n TempMorphTargetIndexContainer = {};\r\n TempMorphTargetManagerIndexContainer = {};\r\n TempSkeletonIndexContainer = {};\r\n\r\n if (!addToScene) {\r\n // Restore observables before removing from scene\r\n if (savedObservables) {\r\n scene.onNewMeshAddedObservable = savedObservables.mesh;\r\n scene.onNewTransformNodeAddedObservable = savedObservables.transformNode;\r\n scene.onNewLightAddedObservable = savedObservables.light;\r\n scene.onNewCameraAddedObservable = savedObservables.camera;\r\n scene.onNewMaterialAddedObservable = savedObservables.material;\r\n scene.onNewMultiMaterialAddedObservable = savedObservables.multiMaterial;\r\n scene.onNewTextureAddedObservable = savedObservables.texture;\r\n scene.onNewSkeletonAddedObservable = savedObservables.skeleton;\r\n scene.onNewGeometryAddedObservable = savedObservables.geometry;\r\n scene.onNewAnimationGroupAddedObservable = savedObservables.animationGroup;\r\n scene.onNewParticleSystemAddedObservable = savedObservables.particleSystem;\r\n }\r\n // Removes entities from scene arrays and moves them to the container\r\n container.removeAllFromScene();\r\n }\r\n if (log !== null && SceneLoaderFlags.loggingLevel !== Constants.SCENELOADER_NO_LOGGING) {\r\n Logger.Log(\r\n logOperation(\"loadAssets\", parsedData ? parsedData.producer : \"Unknown\") + (SceneLoaderFlags.loggingLevel !== Constants.SCENELOADER_MINIMAL_LOGGING ? log : \"\")\r\n );\r\n }\r\n }\r\n\r\n return container;\r\n};\r\n\r\nRegisterSceneLoaderPlugin({\r\n name: \"babylon.js\",\r\n extensions: \".babylon\",\r\n canDirectLoad: (data: string) => {\r\n if (data.indexOf(\"babylon\") !== -1) {\r\n // We consider that the producer string is filled\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n importMesh: (\r\n meshesNames: any,\r\n scene: Scene,\r\n data: any,\r\n rootUrl: string,\r\n meshes: AbstractMesh[],\r\n particleSystems: IParticleSystem[],\r\n skeletons: Skeleton[],\r\n onError?: (message: string, exception?: any) => void\r\n ): boolean => {\r\n // Entire method running in try block, so ALWAYS logs as far as it got, only actually writes details\r\n // when SceneLoader.debugLogging = true (default), or exception encountered.\r\n // Everything stored in var log instead of writing separate lines to support only writing in exception,\r\n // and avoid problems with multiple concurrent .babylon loads.\r\n let log = \"importMesh has failed JSON parse\";\r\n try {\r\n // eslint-disable-next-line no-var\r\n var parsedData = JSON.parse(data);\r\n log = \"\";\r\n const fullDetails = SceneLoaderFlags.loggingLevel === Constants.SCENELOADER_DETAILED_LOGGING;\r\n if (!meshesNames) {\r\n meshesNames = null;\r\n } else if (!Array.isArray(meshesNames)) {\r\n meshesNames = [meshesNames];\r\n }\r\n\r\n const hierarchyIds: number[] = [];\r\n const parsedIdToNodeMap = new Map<number, Node>();\r\n\r\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)\r\n const loadedTransformNodes = [];\r\n if (parsedData.transformNodes !== undefined && parsedData.transformNodes !== null) {\r\n for (let index = 0, cache = parsedData.transformNodes.length; index < cache; index++) {\r\n const parsedJSONTransformNode = parsedData.transformNodes[index];\r\n const parsedTransformNode = TransformNode.Parse(parsedJSONTransformNode, scene, rootUrl);\r\n loadedTransformNodes.push(parsedTransformNode);\r\n parsedIdToNodeMap.set(parsedTransformNode._waitingParsedUniqueId!, parsedTransformNode);\r\n parsedTransformNode._waitingParsedUniqueId = null;\r\n }\r\n }\r\n if (parsedData.meshes !== undefined && parsedData.meshes !== null) {\r\n const loadedSkeletonsIds = [];\r\n const loadedMaterialsIds: string[] = [];\r\n const loadedMaterialsUniqueIds: string[] = [];\r\n const loadedMorphTargetManagerIds: number[] = [];\r\n for (let index = 0, cache = parsedData.meshes.length; index < cache; index++) {\r\n const parsedMesh = parsedData.meshes[index];\r\n\r\n if (meshesNames === null || IsDescendantOf(parsedMesh, meshesNames, hierarchyIds)) {\r\n if (meshesNames !== null) {\r\n // Remove found mesh name from list.\r\n delete meshesNames[meshesNames.indexOf(parsedMesh.name)];\r\n }\r\n\r\n //Geometry?\r\n if (parsedMesh.geometryId !== undefined && parsedMesh.geometryId !== null) {\r\n //does the file contain geometries?\r\n if (parsedData.geometries !== undefined && parsedData.geometries !== null) {\r\n //find the correct geometry and add it to the scene\r\n let found: boolean = false;\r\n const geoms = [\"boxes\", \"spheres\", \"cylinders\", \"toruses\", \"grounds\", \"planes\", \"torusKnots\", \"vertexData\"];\r\n for (const geometryType of geoms) {\r\n if (!parsedData.geometries[geometryType] || !Array.isArray(parsedData.geometries[geometryType])) {\r\n continue;\r\n }\r\n const geom = parsedData.geometries[geometryType];\r\n for (const parsedGeometryData of geom) {\r\n if (parsedGeometryData.id === parsedMesh.geometryId) {\r\n switch (geometryType) {\r\n case \"vertexData\":\r\n Geometry.Parse(parsedGeometryData, scene, rootUrl);\r\n break;\r\n }\r\n found = true;\r\n break;\r\n }\r\n }\r\n\r\n if (found) {\r\n break;\r\n }\r\n }\r\n if (found === false) {\r\n Logger.Warn(\"Geometry not found for mesh \" + parsedMesh.id);\r\n }\r\n }\r\n }\r\n\r\n // Material ?\r\n if (parsedMesh.materialUniqueId || parsedMesh.materialId) {\r\n // if we have a unique ID, look up and store in loadedMaterialsUniqueIds, else use loadedMaterialsIds\r\n const materialArray = parsedMesh.materialUniqueId ? loadedMaterialsUniqueIds : loadedMaterialsIds;\r\n let materialFound = materialArray.indexOf(parsedMesh.materialUniqueId || parsedMesh.materialId) !== -1;\r\n if (materialFound === false && parsedData.multiMaterials !== undefined && parsedData.multiMaterials !== null) {\r\n // Loads a submaterial of a multimaterial\r\n const loadSubMaterial = (subMatId: string, predicate: (parsedMaterial: any) => boolean) => {\r\n materialArray.push(subMatId);\r\n const mat = ParseMaterialByPredicate(predicate, parsedData, scene, rootUrl);\r\n if (mat && mat.material) {\r\n TempMaterialIndexContainer[mat.parsedMaterial.uniqueId || mat.parsedMaterial.id] = mat.material;\r\n log += \"\\n\\tMaterial \" + mat.material.toString(fullDetails);\r\n }\r\n };\r\n for (let multimatIndex = 0, multimatCache = parsedData.multiMaterials.length; multimatIndex < multimatCache; multimatIndex++) {\r\n const parsedMultiMaterial = parsedData.multiMaterials[multimatIndex];\r\n if (\r\n (parsedMesh.materialUniqueId && parsedMultiMaterial.uniqueId === parsedMesh.materialUniqueId) ||\r\n parsedMultiMaterial.id === parsedMesh.materialId\r\n ) {\r\n if (parsedMultiMaterial.materialsUniqueIds) {\r\n // if the materials inside the multimat are stored by unique id\r\n for (const subMatId of parsedMultiMaterial.materialsUniqueIds) {\r\n loadSubMaterial(subMatId, (parsedMaterial) => parsedMaterial.uniqueId === subMatId);\r\n }\r\n } else {\r\n // if the mats are stored by id instead\r\n for (const subMatId of parsedMultiMaterial.materials) {\r\n loadSubMaterial(subMatId, (parsedMaterial) => parsedMaterial.id === subMatId);\r\n }\r\n }\r\n materialArray.push(parsedMultiMaterial.uniqueId || parsedMultiMaterial.id);\r\n const mmat = MultiMaterial.ParseMultiMaterial(parsedMultiMaterial, scene);\r\n TempMaterialIndexContainer[parsedMultiMaterial.uniqueId || parsedMultiMaterial.id] = mmat;\r\n if (mmat) {\r\n materialFound = true;\r\n log += \"\\n\\tMulti-Material \" + mmat.toString(fullDetails);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (materialFound === false) {\r\n materialArray.push(parsedMesh.materialUniqueId || parsedMesh.materialId);\r\n const mat = ParseMaterialByPredicate(\r\n (parsedMaterial) =>\r\n (parsedMesh.materialUniqueId && parsedMaterial.uniqueId === parsedMesh.materialUniqueId) || parsedMaterial.id === parsedMesh.materialId,\r\n parsedData,\r\n scene,\r\n rootUrl\r\n );\r\n if (!mat || !mat.material) {\r\n Logger.Warn(\"Material not found for mesh \" + parsedMesh.id);\r\n } else {\r\n TempMaterialIndexContainer[mat.parsedMaterial.uniqueId || mat.parsedMaterial.id] = mat.material;\r\n log += \"\\n\\tMaterial \" + mat.material.toString(fullDetails);\r\n }\r\n }\r\n }\r\n\r\n // Skeleton ?\r\n if (\r\n parsedMesh.skeletonId !== null &&\r\n parsedMesh.skeletonId !== undefined &&\r\n parsedData.skeletonId !== -1 &&\r\n parsedData.skeletons !== undefined &&\r\n parsedData.skeletons !== null\r\n ) {\r\n const skeletonAlreadyLoaded = loadedSkeletonsIds.indexOf(parsedMesh.skeletonId) > -1;\r\n if (!skeletonAlreadyLoaded) {\r\n for (let skeletonIndex = 0, skeletonCache = parsedData.skeletons.length; skeletonIndex < skeletonCache; skeletonIndex++) {\r\n const parsedSkeleton = parsedData.skeletons[skeletonIndex];\r\n if (parsedSkeleton.id === parsedMesh.skeletonId) {\r\n const skeleton = Skeleton.Parse(parsedSkeleton, scene);\r\n loadedSkeletonsIds.push(parsedSkeleton.id);\r\n if (parsedSkeleton.uniqueId !== undefined && parsedSkeleton.uniqueId !== null) {\r\n TempSkeletonIndexContainer[parsedSkeleton.uniqueId] = skeleton;\r\n }\r\n skeletons.push(skeleton);\r\n log += \"\\n\\tSkeleton \" + skeleton.toString(fullDetails);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Morph target managers ?\r\n if (parsedMesh.morphTargetManagerId > -1 && parsedData.morphTargetManagers !== undefined && parsedData.morphTargetManagers !== null) {\r\n const morphTargetManagerAlreadyLoaded = loadedMorphTargetManagerIds.indexOf(parsedMesh.morphTargetManagerId) > -1;\r\n if (!morphTargetManagerAlreadyLoaded) {\r\n for (let morphTargetManagerIndex = 0; morphTargetManagerIndex < parsedData.morphTargetManagers.length; morphTargetManagerIndex++) {\r\n const parsedManager = parsedData.morphTargetManagers[morphTargetManagerIndex];\r\n if (parsedManager.id === parsedMesh.morphTargetManagerId) {\r\n const morphTargetManager = MorphTargetManager.Parse(parsedManager, scene);\r\n TempMorphTargetManagerIndexContainer[parsedManager.id] = morphTargetManager;\r\n loadedMorphTargetManagerIds.push(parsedManager.id);\r\n log += \"\\nMorph target manager\" + morphTargetManager.toString();\r\n }\r\n }\r\n }\r\n }\r\n\r\n const mesh = Mesh.Parse(parsedMesh, scene, rootUrl);\r\n meshes.push(mesh);\r\n parsedIdToNodeMap.set(mesh._waitingParsedUniqueId!, mesh);\r\n mesh._waitingParsedUniqueId = null;\r\n log += \"\\n\\tMesh \" + mesh.toString(fullDetails);\r\n }\r\n }\r\n\r\n // link multimats with materials\r\n for (const multimat of scene.multiMaterials) {\r\n for (const subMaterial of multimat._waitingSubMaterialsUniqueIds) {\r\n multimat.subMaterials.push(FindMaterial(subMaterial, scene));\r\n }\r\n multimat._waitingSubMaterialsUniqueIds = [];\r\n }\r\n\r\n // link meshes with materials\r\n for (const mesh of scene.meshes) {\r\n if (mesh._waitingMaterialId !== null) {\r\n mesh.material = FindMaterial(mesh._waitingMaterialId, scene);\r\n mesh._waitingMaterialId = null;\r\n }\r\n }\r\n\r\n // link meshes with morph target managers\r\n for (const mesh of scene.meshes) {\r\n if (mesh._waitingMorphTargetManagerId !== null) {\r\n mesh.morphTargetManager = TempMorphTargetManagerIndexContainer[mesh._waitingMorphTargetManagerId];\r\n mesh._waitingMorphTargetManagerId = null;\r\n }\r\n }\r\n\r\n // Connecting parents and lods\r\n for (let index = 0, cache = scene.transformNodes.length; index < cache; index++) {\r\n const transformNode = scene.transformNodes[index];\r\n if (transformNode._waitingParentId !== null) {\r\n let parent = parsedIdToNodeMap.get(parseInt(transformNode._waitingParentId)) || null;\r\n if (parent === null) {\r\n parent = scene.getLastEntryById(transformNode._waitingParentId);\r\n }\r\n let parentNode = parent;\r\n if (transformNode._waitingParentInstanceIndex) {\r\n parentNode = (parent as Mesh).instances[parseInt(transformNode._waitingParentInstanceIndex)];\r\n transformNode._waitingParentInstanceIndex = null;\r\n }\r\n transformNode.parent = parentNode;\r\n transformNode._waitingParentId = null;\r\n }\r\n }\r\n let currentMesh: AbstractMesh;\r\n for (let index = 0, cache = scene.meshes.length; index < cache; index++) {\r\n currentMesh = scene.meshes[index];\r\n if (currentMesh._waitingParentId) {\r\n let parent = parsedIdToNodeMap.get(parseInt(currentMesh._waitingParentId)) || null;\r\n if (parent === null) {\r\n parent = scene.getLastEntryById(currentMesh._waitingParentId);\r\n }\r\n let parentNode = parent;\r\n if (currentMesh._waitingParentInstanceIndex) {\r\n parentNode = (parent as Mesh).instances[parseInt(currentMesh._waitingParentInstanceIndex)];\r\n currentMesh._waitingParentInstanceIndex = null;\r\n }\r\n currentMesh.parent = parentNode;\r\n currentMesh._waitingParentId = null;\r\n }\r\n if (currentMesh._waitingData.lods) {\r\n LoadDetailLevels(scene, currentMesh);\r\n }\r\n }\r\n\r\n // Remove unused transform nodes\r\n for (const transformNode of loadedTransformNodes) {\r\n const childMeshes = transformNode.getChildMeshes(false);\r\n if (!childMeshes.length) {\r\n transformNode.dispose();\r\n }\r\n }\r\n\r\n // link meshes with skeletons\r\n for (const mesh of scene.meshes) {\r\n // First try to get it via uniqueId\r\n if (mesh._waitingSkeletonUniqueId !== null) {\r\n mesh.skeleton = TempSkeletonIndexContainer[mesh._waitingSkeletonUniqueId];\r\n }\r\n\r\n // If not possible or not found, try to get it from the scene (backwards compatibility)\r\n if (mesh._waitingSkeletonId !== null && !mesh.skeleton) {\r\n mesh.skeleton = scene.getLastSkeletonById(mesh._waitingSkeletonId);\r\n }\r\n\r\n mesh._waitingSkeletonId = null;\r\n mesh._waitingSkeletonUniqueId = null;\r\n }\r\n\r\n // link bones to transform nodes\r\n for (let index = 0, cache = scene.skeletons.length; index < cache; index++) {\r\n const skeleton = scene.skeletons[index];\r\n if (skeleton._hasWaitingData) {\r\n if (skeleton.bones != null) {\r\n for (const bone of skeleton.bones) {\r\n let linkTransformNode: Nullable<Node> = null;\r\n // First try to get it via uniqueId\r\n if (bone._waitingTransformNodeUniqueId !== null) {\r\n linkTransformNode = parsedIdToNodeMap.get(bone._waitingTransformNodeUniqueId) ?? null;\r\n }\r\n\r\n // If not possible or not found, try to get it from the scene (backwards compatibility)\r\n if (bone._waitingTransformNodeId !== null && !linkTransformNode) {\r\n linkTransformNode = scene.getLastEntryById(bone._waitingTransformNodeId);\r\n }\r\n\r\n if (linkTransformNode) {\r\n bone.linkTransformNode(linkTransformNode as TransformNode);\r\n }\r\n\r\n bone._waitingTransformNodeId = null;\r\n bone._waitingTransformNodeUniqueId = null;\r\n }\r\n }\r\n\r\n skeleton._hasWaitingData = null;\r\n }\r\n }\r\n\r\n // freeze and compute world matrix application\r\n for (let index = 0, cache = scene.meshes.length; index < cache; index++) {\r\n currentMesh = scene.meshes[index];\r\n if (currentMesh._waitingData.freezeWorldMatrix) {\r\n currentMesh.freezeWorldMatrix();\r\n currentMesh._waitingData.freezeWorldMatrix = null;\r\n } else {\r\n currentMesh.computeWorldMatrix(true);\r\n }\r\n }\r\n }\r\n\r\n // Particles\r\n if (parsedData.particleSystems !== undefined && parsedData.particleSystems !== null) {\r\n const parser = GetIndividualParser(SceneComponentConstants.NAME_PARTICLESYSTEM);\r\n if (parser) {\r\n for (let index = 0, cache = parsedData.particleSystems.length; index < cache; index++) {\r\n const parsedParticleSystem = parsedData.particleSystems[index];\r\n if (hierarchyIds.indexOf(parsedParticleSystem.emitterId) !== -1) {\r\n particleSystems.push(parser(parsedParticleSystem, scene, rootUrl));\r\n }\r\n }\r\n }\r\n }\r\n\r\n for (const g of scene.geometries) {\r\n g._loadedUniqueId = \"\";\r\n }\r\n\r\n return true;\r\n } catch (err) {\r\n const msg = logOperation(\"importMesh\", parsedData ? parsedData.producer : \"Unknown\") + log;\r\n if (onError) {\r\n onError(msg, err);\r\n } else {\r\n Logger.Log(msg);\r\n throw err;\r\n }\r\n } finally {\r\n if (log !== null && SceneLoaderFlags.loggingLevel !== Constants.SCENELOADER_NO_LOGGING) {\r\n Logger.Log(\r\n logOperation(\"importMesh\", parsedData ? parsedData.producer : \"Unknown\") + (SceneLoaderFlags.loggingLevel !== Constants.SCENELOADER_MINIMAL_LOGGING ? log : \"\")\r\n );\r\n }\r\n TempMaterialIndexContainer = {};\r\n TempMorphTargetManagerIndexContainer = {};\r\n TempSkeletonIndexContainer = {};\r\n }\r\n\r\n return false;\r\n },\r\n load: (scene: Scene, data: string, rootUrl: string, onError?: (message: string, exception?: any) => void): boolean => {\r\n // Entire method running in try block, so ALWAYS logs as far as it got, only actually writes details\r\n // when SceneLoader.debugLogging = true (default), or exception encountered.\r\n // Everything stored in var log instead of writing separate lines to support only writing in exception,\r\n // and avoid problems with multiple concurrent .babylon loads.\r\n let log = \"importScene has failed JSON parse\";\r\n try {\r\n // eslint-disable-next-line no-var\r\n var parsedData = JSON.parse(data);\r\n log = \"\";\r\n\r\n // Scene\r\n if (parsedData.useDelayedTextureLoading !== undefined && parsedData.useDelayedTextureLoading !== null) {\r\n scene.useDelayedTextureLoading = parsedData.useDelayedTextureLoading && !SceneLoaderFlags.ForceFullSceneLoadingForIncremental;\r\n }\r\n if (parsedData.autoClear !== undefined && parsedData.autoClear !== null) {\r\n scene.autoClear = parsedData.autoClear;\r\n }\r\n if (parsedData.clearColor !== undefined && parsedData.clearColor !== null) {\r\n scene.clearColor = Color4.FromArray(parsedData.clearColor);\r\n }\r\n if (parsedData.ambientColor !== undefined && parsedData.ambientColor !== null) {\r\n scene.ambientColor = Color3.FromArray(parsedData.ambientColor);\r\n }\r\n if (parsedData.gravity !== undefined && parsedData.gravity !== null) {\r\n scene.gravity = Vector3.FromArray(parsedData.gravity);\r\n }\r\n\r\n if (parsedData.useRightHandedSystem !== undefined) {\r\n scene.useRightHandedSystem = !!parsedData.useRightHandedSystem;\r\n }\r\n\r\n // Fog\r\n if (parsedData.fogMode !== undefined && parsedData.fogMode !== null) {\r\n scene.fogMode = parsedData.fogMode;\r\n }\r\n if (parsedData.fogColor !== undefined && parsedData.fogColor !== null) {\r\n scene.fogColor = Color3.FromArray(parsedData.fogColor);\r\n }\r\n if (parsedData.fogStart !== undefined && parsedData.fogStart !== null) {\r\n scene.fogStart = parsedData.fogStart;\r\n }\r\n if (parsedData.fogEnd !== undefined && parsedData.fogEnd !== null) {\r\n scene.fogEnd = parsedData.fogEnd;\r\n }\r\n if (parsedData.fogDensity !== undefined && parsedData.fogDensity !== null) {\r\n scene.fogDensity = parsedData.fogDensity;\r\n }\r\n log += \"\\tFog mode for scene: \";\r\n switch (scene.fogMode) {\r\n case 0:\r\n log += \"none\\n\";\r\n break;\r\n // getters not compiling, so using hardcoded\r\n case 1:\r\n log += \"exp\\n\";\r\n break;\r\n case 2:\r\n log += \"exp2\\n\";\r\n break;\r\n case 3:\r\n log += \"linear\\n\";\r\n break;\r\n }\r\n\r\n //Physics\r\n if (parsedData.physicsEnabled) {\r\n let physicsPlugin;\r\n if (parsedData.physicsEngine === \"cannon\" || parsedData.physicsEngine === CannonJSPlugin.name) {\r\n physicsPlugin = new CannonJSPlugin(undefined, undefined, BabylonFileLoaderConfiguration.LoaderInjectedPhysicsEngine);\r\n } else if (parsedData.physicsEngine === \"oimo\" || parsedData.physicsEngine === OimoJSPlugin.name) {\r\n physicsPlugin = new OimoJSPlugin(undefined, BabylonFileLoaderConfiguration.LoaderInjectedPhysicsEngine);\r\n } else if (parsedData.physicsEngine === \"ammo\" || parsedData.physicsEngine === AmmoJSPlugin.name) {\r\n physicsPlugin = new AmmoJSPlugin(undefined, BabylonFileLoaderConfiguration.LoaderInjectedPhysicsEngine, undefined);\r\n }\r\n log = \"\\tPhysics engine \" + (parsedData.physicsEngine ? parsedData.physicsEngine : \"oimo\") + \" enabled\\n\";\r\n //else - default engine, which is currently oimo\r\n const physicsGravity = parsedData.gravity ? Vector3.FromArray(parsedData.gravity) : parsedData.physicsGravity ? Vector3.FromArray(parsedData.physicsGravity) : null;\r\n scene.enablePhysics(physicsGravity, physicsPlugin);\r\n }\r\n\r\n // Metadata\r\n if (parsedData.metadata !== undefined && parsedData.metadata !== null) {\r\n scene.metadata = parsedData.metadata;\r\n }\r\n\r\n //collisions, if defined. otherwise, default is true\r\n if (parsedData.collisionsEnabled !== undefined && parsedData.collisionsEnabled !== null) {\r\n scene.collisionsEnabled = parsedData.collisionsEnabled;\r\n }\r\n\r\n const container = LoadAssetContainer(scene, data, rootUrl, onError, true);\r\n if (!container) {\r\n return false;\r\n }\r\n\r\n if (parsedData.autoAnimate) {\r\n scene.beginAnimation(scene, parsedData.autoAnimateFrom, parsedData.autoAnimateTo, parsedData.autoAnimateLoop, parsedData.autoAnimateSpeed || 1.0);\r\n }\r\n\r\n if (parsedData.activeCameraID !== undefined && parsedData.activeCameraID !== null) {\r\n scene.setActiveCameraById(parsedData.activeCameraID);\r\n }\r\n\r\n // Finish\r\n return true;\r\n } catch (err) {\r\n const msg = logOperation(\"importScene\", parsedData ? parsedData.producer : \"Unknown\") + log;\r\n if (onError) {\r\n onError(msg, err);\r\n } else {\r\n Logger.Log(msg);\r\n throw err;\r\n }\r\n } finally {\r\n if (log !== null && SceneLoaderFlags.loggingLevel !== Constants.SCENELOADER_NO_LOGGING) {\r\n Logger.Log(\r\n logOperation(\"importScene\", parsedData ? parsedData.producer : \"Unknown\") + (SceneLoaderFlags.loggingLevel !== Constants.SCENELOADER_MINIMAL_LOGGING ? log : \"\")\r\n );\r\n }\r\n }\r\n return false;\r\n },\r\n loadAssetContainer: (scene: Scene, data: string, rootUrl: string, onError?: (message: string, exception?: any) => void): AssetContainer => {\r\n const container = LoadAssetContainer(scene, data, rootUrl, onError);\r\n return container;\r\n },\r\n});\r\n"]}
@@ -472,6 +472,7 @@ export class GaussianSplattingMaterial extends PushMaterial {
472
472
  defines: defines,
473
473
  needAlphaBlending: alphaBlendedDepth,
474
474
  });
475
+ shaderMaterial.backFaceCulling = false;
475
476
  shaderMaterial.onBindObservable.add((mesh) => {
476
477
  const gsMaterial = mesh.material;
477
478
  const gsMesh = mesh;
@@ -490,6 +491,7 @@ export class GaussianSplattingMaterial extends PushMaterial {
490
491
  uniformBuffers: GaussianSplattingMaterial._UniformBuffers,
491
492
  shaderLanguage: shaderLanguage,
492
493
  });
494
+ shaderMaterial.backFaceCulling = false;
493
495
  const shadowDepthWrapper = new ShadowDepthWrapper(shaderMaterial, scene, {
494
496
  standalone: true,
495
497
  });
@@ -1 +1 @@
1
- {"version":3,"file":"gaussianSplattingMaterial.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SubMesh } from \"../../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Effect, IEffectCreationOptions } from \"../../Materials/effect\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Matrix } from \"../../Maths/math.vector\";\r\nimport type { GaussianSplattingMesh } from \"../../Meshes/GaussianSplatting/gaussianSplattingMesh\";\r\nimport type { AbstractEngine } from \"../../Engines/abstractEngine\";\r\nimport { SerializationHelper } from \"../../Misc/decorators.serialization\";\r\nimport { VertexBuffer } from \"../../Buffers/buffer\";\r\nimport { MaterialDefines } from \"../../Materials/materialDefines\";\r\nimport { PushMaterial } from \"../../Materials/pushMaterial\";\r\nimport { RegisterClass } from \"../../Misc/typeStore\";\r\nimport { AddClipPlaneUniforms, BindClipPlane } from \"../clipPlaneMaterialHelper\";\r\nimport { Camera } from \"../../Cameras/camera\";\r\nimport { ShadowDepthWrapper } from \"../../Materials/shadowDepthWrapper\";\r\nimport { ShaderMaterial } from \"../../Materials/shaderMaterial\";\r\nimport { MaterialPluginEvent } from \"../materialPluginEvent\";\r\nimport { Material } from \"../material\";\r\n\r\nimport \"../../Shaders/gaussianSplatting.fragment\";\r\nimport \"../../Shaders/gaussianSplatting.vertex\";\r\nimport \"../../ShadersWGSL/gaussianSplatting.fragment\";\r\nimport \"../../ShadersWGSL/gaussianSplatting.vertex\";\r\nimport \"../../Shaders/gaussianSplattingDepth.fragment\";\r\nimport \"../../Shaders/gaussianSplattingDepth.vertex\";\r\nimport \"../../ShadersWGSL/gaussianSplattingDepth.fragment\";\r\nimport \"../../ShadersWGSL/gaussianSplattingDepth.vertex\";\r\nimport {\r\n BindFogParameters,\r\n BindLogDepth,\r\n PrepareAttributesForInstances,\r\n PrepareDefinesForAttributes,\r\n PrepareDefinesForFrameBoundValues,\r\n PrepareDefinesForMisc,\r\n PrepareUniformsAndSamplersList,\r\n} from \"../materialHelper.functions\";\r\nimport { ShaderLanguage } from \"../shaderLanguage\";\r\n\r\n/**\r\n * Computes the maximum number of Gaussian Splatting compound parts supported by the given engine.\r\n * The limit is derived from the engine's maximum vertex uniform vectors capability.\r\n * @param engine - The engine to compute the limit for\r\n * @returns The maximum number of parts supported\r\n */\r\nexport function GetGaussianSplattingMaxPartCount(engine: AbstractEngine): number {\r\n // Each GS compound part requires 5 uniform vectors: 4 for the mat4 world matrix + 1 for the visibility float.\r\n // The maximum number of parts is limited by the engine's uniform vector capacity and by the uint8 partIndices texture format (max 256).\r\n\r\n const uniformsPerSplat = 5;\r\n const reservedUniforms = 40; // base shader uniforms + margin for plugins/clip planes\r\n const absoluteMax = 256; // uint8 partIndices texture format limit\r\n\r\n const maxUniformVectors = engine.getCaps().maxVertexUniformVectors;\r\n const available = Math.max(maxUniformVectors - reservedUniforms, 0);\r\n const maxFromUniforms = Math.floor(available / uniformsPerSplat);\r\n return Math.min(Math.max(maxFromUniforms, 1), absoluteMax);\r\n}\r\n\r\n/**\r\n * @deprecated Use {@link GetGaussianSplattingMaxPartCount} with an engine instance instead.\r\n */\r\nexport const GaussianSplattingMaxPartCount = 128;\r\n\r\n/**\r\n * @internal\r\n */\r\nclass GaussianSplattingMaterialDefines extends MaterialDefines {\r\n /** Defines whether fog is enabled */\r\n public FOG = false;\r\n /** Defines whether thin instances are used */\r\n public THIN_INSTANCES = true;\r\n /** Defines whether logarithmic depth is enabled */\r\n public LOGARITHMICDEPTH = false;\r\n /** Defines whether clip plane 1 is enabled */\r\n public CLIPPLANE = false;\r\n /** Defines whether clip plane 2 is enabled */\r\n public CLIPPLANE2 = false;\r\n /** Defines whether clip plane 3 is enabled */\r\n public CLIPPLANE3 = false;\r\n /** Defines whether clip plane 4 is enabled */\r\n public CLIPPLANE4 = false;\r\n /** Defines whether clip plane 5 is enabled */\r\n public CLIPPLANE5 = false;\r\n /** Defines whether clip plane 6 is enabled */\r\n public CLIPPLANE6 = false;\r\n /** Defines the spherical harmonics degree */\r\n public SH_DEGREE = 0;\r\n /** Defines whether compensation is applied */\r\n public COMPENSATION = false;\r\n /** Defines whether this is a compound splat */\r\n public IS_COMPOUND = false;\r\n /** Defines the maximum number of parts (computed from engine caps at runtime) */\r\n public MAX_PART_COUNT = GaussianSplattingMaxPartCount;\r\n\r\n /**\r\n * Constructor of the defines.\r\n * @param externalProperties External properties (e.g. from material plugins) to add to the defines.\r\n */\r\n constructor(externalProperties?: { [name: string]: { type: string; default: any } }) {\r\n super(externalProperties);\r\n this.rebuild();\r\n }\r\n}\r\n\r\n/**\r\n * GaussianSplattingMaterial material used to render Gaussian Splatting\r\n * @experimental\r\n */\r\nexport class GaussianSplattingMaterial extends PushMaterial {\r\n /**\r\n * Instantiates a Gaussian Splatting Material in the given scene\r\n * @param name The friendly name of the material\r\n * @param scene The scene to add the material to\r\n */\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n\r\n this.backFaceCulling = false;\r\n this.shadowDepthWrapper = GaussianSplattingMaterial._MakeGaussianSplattingShadowDepthWrapper(scene!, this.shaderLanguage);\r\n }\r\n\r\n /**\r\n * Point spread function (default 0.3). Can be overriden per GS material\r\n */\r\n public static KernelSize: number = 0.3;\r\n\r\n /**\r\n * Compensation\r\n */\r\n public static Compensation: boolean = false;\r\n\r\n /**\r\n * Point spread function (default 0.3). Can be overriden per GS material, otherwise, using default static `KernelSize` value\r\n */\r\n public kernelSize = GaussianSplattingMaterial.KernelSize;\r\n private _compensation = GaussianSplattingMaterial.Compensation;\r\n\r\n // set to true when material defines are dirty\r\n private _isDirty = false;\r\n\r\n /**\r\n * Set compensation default value is `GaussianSplattingMaterial.Compensation`\r\n */\r\n public set compensation(value: boolean) {\r\n this._isDirty = this._isDirty != value;\r\n this._compensation = value;\r\n }\r\n\r\n /**\r\n * Get compensation\r\n */\r\n public get compensation(): boolean {\r\n return this._compensation;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n */\r\n public override get hasRenderTargetTextures(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha test mode.\r\n * @returns false\r\n */\r\n public override needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha blend mode.\r\n * @returns true\r\n */\r\n public override needAlphaBlending(): boolean {\r\n return true;\r\n }\r\n\r\n protected static _Attribs = [VertexBuffer.PositionKind, \"splatIndex0\", \"splatIndex1\", \"splatIndex2\", \"splatIndex3\"];\r\n protected static _Samplers = [\"covariancesATexture\", \"covariancesBTexture\", \"centersTexture\", \"colorsTexture\", \"shTexture0\", \"shTexture1\", \"shTexture2\", \"partIndicesTexture\"];\r\n protected static _UniformBuffers = [\"Scene\", \"Mesh\"];\r\n protected static _Uniforms = [\r\n \"world\",\r\n \"view\",\r\n \"projection\",\r\n \"vFogInfos\",\r\n \"vFogColor\",\r\n \"logarithmicDepthConstant\",\r\n \"invViewport\",\r\n \"dataTextureSize\",\r\n \"focal\",\r\n \"eyePosition\",\r\n \"kernelSize\",\r\n \"alpha\",\r\n \"depthValues\",\r\n \"partWorld\",\r\n \"partVisibility\",\r\n ];\r\n private _sourceMesh: GaussianSplattingMesh | null = null;\r\n /**\r\n * Checks whether the material is ready to be rendered for a given mesh.\r\n * @param mesh The mesh to render\r\n * @param subMesh The submesh to check against\r\n * @returns true if all the dependencies are ready (Textures, Effects...)\r\n */\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const useInstances = true;\r\n\r\n const drawWrapper = subMesh._drawWrapper;\r\n let defines = <GaussianSplattingMaterialDefines>subMesh.materialDefines;\r\n\r\n if (defines && this._isDirty) {\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n if (drawWrapper.effect && this.isFrozen) {\r\n if (drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.GetDefineNames, this._eventInfo);\r\n defines = subMesh.materialDefines = new GaussianSplattingMaterialDefines(this._eventInfo.defineNames);\r\n }\r\n\r\n const scene = this.getScene();\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n // Check plugin readiness\r\n this._eventInfo.isReadyForSubMesh = true;\r\n this._eventInfo.defines = defines;\r\n this._eventInfo.subMesh = subMesh;\r\n this._callbackPluginEventIsReadyForSubMesh(this._eventInfo);\r\n\r\n if (!this._eventInfo.isReadyForSubMesh) {\r\n return false;\r\n }\r\n\r\n if (!this._sourceMesh) {\r\n return false;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n const gsMesh = this._sourceMesh;\r\n\r\n // Misc.\r\n PrepareDefinesForMisc(\r\n mesh,\r\n scene,\r\n this._useLogarithmicDepth,\r\n this.pointsCloud,\r\n this.fogEnabled,\r\n false,\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._isVertexOutputInvariant\r\n );\r\n\r\n // Values that need to be evaluated on every frame\r\n PrepareDefinesForFrameBoundValues(scene, engine, this, defines, useInstances, null, true);\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, false, false);\r\n\r\n // SH is disabled for webGL1\r\n if (engine.version > 1 || engine.isWebGPU) {\r\n defines[\"SH_DEGREE\"] = gsMesh.shDegree;\r\n }\r\n\r\n defines[\"IS_COMPOUND\"] = gsMesh.isCompound;\r\n defines[\"MAX_PART_COUNT\"] = GetGaussianSplattingMaxPartCount(engine);\r\n\r\n // Compensation\r\n const splatMaterial = gsMesh.material as GaussianSplattingMaterial;\r\n defines[\"COMPENSATION\"] = splatMaterial && splatMaterial.compensation ? splatMaterial.compensation : GaussianSplattingMaterial.Compensation;\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n scene.resetCachedMaterial();\r\n\r\n //Attributes\r\n PrepareAttributesForInstances(GaussianSplattingMaterial._Attribs, defines);\r\n\r\n const attribs = GaussianSplattingMaterial._Attribs.slice();\r\n const uniforms = GaussianSplattingMaterial._Uniforms.slice();\r\n const samplers = GaussianSplattingMaterial._Samplers.slice();\r\n const uniformBuffers = GaussianSplattingMaterial._UniformBuffers.slice();\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: defines,\r\n });\r\n\r\n AddClipPlaneUniforms(uniforms);\r\n\r\n // Let plugin manager prepare its uniform/sampler/ubo lists\r\n if (!this._uniformBufferLayoutBuilt) {\r\n this.buildUniformLayout();\r\n }\r\n\r\n // Prepare plugin effect\r\n this._eventInfo.fallbackRank = 0;\r\n this._eventInfo.defines = defines;\r\n this._eventInfo.attributes = attribs;\r\n this._eventInfo.uniforms = uniforms;\r\n this._eventInfo.samplers = samplers;\r\n this._eventInfo.uniformBuffersNames = uniformBuffers;\r\n this._eventInfo.customCode = undefined;\r\n this._eventInfo.mesh = mesh;\r\n\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.PrepareEffect, this._eventInfo);\r\n\r\n const join = defines.toString();\r\n const effect = scene.getEngine().createEffect(\r\n \"gaussianSplatting\",\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: join,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: {},\r\n processCodeAfterIncludes: this._eventInfo.customCode,\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/gaussianSplatting.fragment\"), import(\"../../ShadersWGSL/gaussianSplatting.vertex\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/gaussianSplatting.fragment\"), import(\"../../Shaders/gaussianSplatting.vertex\")]);\r\n }\r\n },\r\n },\r\n engine\r\n );\r\n subMesh.setEffect(effect, defines, this._materialContext);\r\n }\r\n\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n drawWrapper._wasPreviouslyUsingInstances = useInstances;\r\n this._isDirty = false;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * GaussianSplattingMaterial belongs to a single mesh\r\n * @param mesh mesh this material belongs to\r\n */\r\n public setSourceMesh(mesh: GaussianSplattingMesh) {\r\n this._sourceMesh = mesh;\r\n }\r\n\r\n /**\r\n * Gets the source mesh of this material, which is the Gaussian Splatting mesh that provides the data for rendering\r\n * @returns The Gaussian Splatting mesh that provides the data for rendering, or null if not set\r\n */\r\n public getSourceMesh(): GaussianSplattingMesh | null {\r\n return this._sourceMesh;\r\n }\r\n\r\n /**\r\n * Bind material effect for a specific Gaussian Splatting mesh\r\n * @param mesh Gaussian splatting mesh\r\n * @param effect Splatting material or node material\r\n * @param scene scene that contains mesh and camera used for rendering\r\n */\r\n public static BindEffect(mesh: Mesh, effect: Effect, scene: Scene): void {\r\n const engine = scene.getEngine();\r\n const camera = scene.activeCamera;\r\n\r\n const renderWidth = engine.getRenderWidth() * camera!.viewport.width;\r\n const renderHeight = engine.getRenderHeight() * camera!.viewport.height;\r\n\r\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\r\n\r\n if (!gsMaterial._sourceMesh) {\r\n return;\r\n }\r\n\r\n const gsMesh = gsMaterial._sourceMesh;\r\n\r\n // check if rigcamera, get number of rigs\r\n const numberOfRigs = camera?.rigParent?.rigCameras.length || 1;\r\n\r\n effect.setFloat2(\"invViewport\", 1 / (renderWidth / numberOfRigs), 1 / renderHeight);\r\n\r\n let focal = 1000;\r\n\r\n if (camera) {\r\n /*\r\n more explicit version:\r\n const t = camera.getProjectionMatrix().m[5];\r\n const FovY = Math.atan(1.0 / t) * 2.0;\r\n focal = renderHeight / 2.0 / Math.tan(FovY / 2.0);\r\n Using a shorter version here to not have tan(atan) and 2.0 factor\r\n */\r\n const t = camera.getProjectionMatrix().m[5];\r\n if (camera.fovMode == Camera.FOVMODE_VERTICAL_FIXED) {\r\n focal = (renderHeight * t) / 2.0;\r\n } else {\r\n focal = (renderWidth * t) / 2.0;\r\n }\r\n }\r\n\r\n effect.setFloat2(\"focal\", focal, focal);\r\n effect.setFloat(\"kernelSize\", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize);\r\n effect.setFloat(\"alpha\", gsMaterial.alpha);\r\n scene.bindEyePosition(effect, \"eyePosition\", true);\r\n\r\n if (gsMesh.covariancesATexture) {\r\n const textureSize = gsMesh.covariancesATexture.getSize();\r\n\r\n effect.setFloat2(\"dataTextureSize\", textureSize.width, textureSize.height);\r\n\r\n effect.setTexture(\"covariancesATexture\", gsMesh.covariancesATexture);\r\n effect.setTexture(\"covariancesBTexture\", gsMesh.covariancesBTexture);\r\n effect.setTexture(\"centersTexture\", gsMesh.centersTexture);\r\n effect.setTexture(\"colorsTexture\", gsMesh.colorsTexture);\r\n\r\n if (gsMesh.shTextures) {\r\n for (let i = 0; i < gsMesh.shTextures?.length; i++) {\r\n effect.setTexture(`shTexture${i}`, gsMesh.shTextures[i]);\r\n }\r\n }\r\n\r\n // Bind part indices texture, if the\r\n if (gsMesh.partIndicesTexture) {\r\n effect.setTexture(\"partIndicesTexture\", gsMesh.partIndicesTexture);\r\n // Bind part world matrices\r\n const partWorldData = new Float32Array(gsMesh.partCount * 16);\r\n for (let i = 0; i < gsMesh.partCount; i++) {\r\n gsMesh.getWorldMatrixForPart(i).toArray(partWorldData, i * 16);\r\n }\r\n effect.setMatrices(\"partWorld\", partWorldData);\r\n\r\n // Bind part visibility data\r\n const partVisibilityData: number[] = [];\r\n for (let i = 0; i < gsMesh.partCount; i++) {\r\n partVisibilityData.push(gsMesh.partVisibility[i] ?? 1.0);\r\n }\r\n effect.setArray(\"partVisibility\", partVisibilityData);\r\n }\r\n }\r\n }\r\n /**\r\n * Binds the submesh to this material by preparing the effect and shader to draw\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = <GaussianSplattingMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n this._activeEffect = effect;\r\n\r\n // Matrices Mesh.\r\n mesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n mesh.transferToEffect(world);\r\n\r\n // Bind data\r\n const mustRebind = this._mustRebind(scene, effect, subMesh, mesh.visibility);\r\n\r\n if (mustRebind) {\r\n this.bindView(effect);\r\n this.bindViewProjection(effect);\r\n GaussianSplattingMaterial.BindEffect(mesh, this._activeEffect, scene);\r\n // Clip plane\r\n BindClipPlane(effect, this, scene);\r\n } else if (scene.getEngine()._features.needToAlwaysBindUniformBuffers) {\r\n this._needToBindSceneUbo = true;\r\n }\r\n\r\n // Fog\r\n BindFogParameters(scene, mesh, effect);\r\n\r\n // Log. depth\r\n if (this.useLogarithmicDepth) {\r\n BindLogDepth(defines, effect, scene);\r\n }\r\n\r\n // Bind plugins\r\n this._eventInfo.subMesh = subMesh;\r\n this._callbackPluginEventBindForSubMesh(this._eventInfo);\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n protected static _BindEffectUniforms(gsMesh: GaussianSplattingMesh, gsMaterial: GaussianSplattingMaterial, shaderMaterial: ShaderMaterial, scene: Scene): void {\r\n const engine = scene.getEngine();\r\n const effect = shaderMaterial.getEffect()!;\r\n const camera = scene.activeCamera;\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n gsMesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n shaderMaterial.bindView(effect);\r\n shaderMaterial.bindViewProjection(effect);\r\n\r\n const renderWidth = engine.getRenderWidth() * camera!.viewport.width;\r\n const renderHeight = engine.getRenderHeight() * camera!.viewport.height;\r\n effect.setFloat2(\"invViewport\", 1 / renderWidth, 1 / renderHeight);\r\n\r\n let focal = 1000;\r\n\r\n if (camera) {\r\n /*\r\n more explicit version:\r\n const t = camera.getProjectionMatrix().m[5];\r\n const FovY = Math.atan(1.0 / t) * 2.0;\r\n focal = renderHeight / 2.0 / Math.tan(FovY / 2.0);\r\n Using a shorter version here to not have tan(atan) and 2.0 factor\r\n */\r\n const t = camera.getProjectionMatrix().m[5];\r\n if (camera.fovMode == Camera.FOVMODE_VERTICAL_FIXED) {\r\n focal = (renderHeight * t) / 2.0;\r\n } else {\r\n focal = (renderWidth * t) / 2.0;\r\n }\r\n }\r\n\r\n effect.setFloat2(\"focal\", focal, focal);\r\n effect.setFloat(\"kernelSize\", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize);\r\n effect.setFloat(\"alpha\", gsMaterial.alpha);\r\n\r\n let minZ: number, maxZ: number;\r\n\r\n const cameraIsOrtho = camera.mode === Camera.ORTHOGRAPHIC_CAMERA;\r\n if (cameraIsOrtho) {\r\n minZ = !engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? 0 : 1;\r\n maxZ = engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? 0 : 1;\r\n } else {\r\n minZ = engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? camera.minZ : engine.isNDCHalfZRange ? 0 : camera.minZ;\r\n maxZ = engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? 0 : camera.maxZ;\r\n }\r\n\r\n effect.setFloat2(\"depthValues\", minZ, minZ + maxZ);\r\n\r\n if (gsMesh.covariancesATexture) {\r\n const textureSize = gsMesh.covariancesATexture.getSize();\r\n effect.setFloat2(\"dataTextureSize\", textureSize.width, textureSize.height);\r\n\r\n effect.setTexture(\"covariancesATexture\", gsMesh.covariancesATexture);\r\n effect.setTexture(\"covariancesBTexture\", gsMesh.covariancesBTexture);\r\n effect.setTexture(\"centersTexture\", gsMesh.centersTexture);\r\n effect.setTexture(\"colorsTexture\", gsMesh.colorsTexture);\r\n\r\n if (gsMesh.partIndicesTexture) {\r\n effect.setTexture(\"partIndicesTexture\", gsMesh.partIndicesTexture);\r\n const partWorldData = new Float32Array(gsMesh.partCount * 16);\r\n for (let i = 0; i < gsMesh.partCount; i++) {\r\n gsMesh.getWorldMatrixForPart(i).toArray(partWorldData, i * 16);\r\n }\r\n effect.setMatrices(\"partWorld\", partWorldData);\r\n const partVisibilityData: number[] = [];\r\n for (let i = 0; i < gsMesh.partCount; i++) {\r\n partVisibilityData.push(gsMesh.partVisibility[i] ?? 1.0);\r\n }\r\n effect.setArray(\"partVisibility\", partVisibilityData);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create a depth rendering material for a Gaussian Splatting mesh\r\n * @param scene scene it belongs to\r\n * @param shaderLanguage GLSL or WGSL\r\n * @param alphaBlendedDepth whether to enable alpha blended depth rendering\r\n * @param compoundMesh whether the mesh is a compound mesh\r\n * @returns depth rendering shader material\r\n */\r\n public makeDepthRenderingMaterial(scene: Scene, shaderLanguage: ShaderLanguage, alphaBlendedDepth: boolean = false, compoundMesh: boolean = false): ShaderMaterial {\r\n const defines = [\"#define DEPTH_RENDER\"];\r\n\r\n if (alphaBlendedDepth) {\r\n defines.push(\"#define ALPHA_BLENDED_DEPTH\");\r\n }\r\n\r\n if (compoundMesh) {\r\n defines.push(\"#define IS_COMPOUND\");\r\n defines.push(`#define MAX_PART_COUNT ${GetGaussianSplattingMaxPartCount(scene.getEngine())}`);\r\n }\r\n\r\n const shaderMaterial = new ShaderMaterial(\r\n \"gaussianSplattingDepthRender\",\r\n scene,\r\n {\r\n vertex: \"gaussianSplattingDepth\",\r\n fragment: \"gaussianSplattingDepth\",\r\n },\r\n {\r\n attributes: GaussianSplattingMaterial._Attribs,\r\n uniforms: GaussianSplattingMaterial._Uniforms,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n uniformBuffers: GaussianSplattingMaterial._UniformBuffers,\r\n shaderLanguage: shaderLanguage,\r\n defines: defines,\r\n needAlphaBlending: alphaBlendedDepth,\r\n }\r\n );\r\n shaderMaterial.onBindObservable.add((mesh: AbstractMesh) => {\r\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\r\n const gsMesh = mesh as GaussianSplattingMesh;\r\n GaussianSplattingMaterial._BindEffectUniforms(gsMesh, gsMaterial, shaderMaterial, scene);\r\n });\r\n return shaderMaterial;\r\n }\r\n\r\n protected static _MakeGaussianSplattingShadowDepthWrapper(scene: Scene, shaderLanguage: ShaderLanguage): ShadowDepthWrapper {\r\n const shaderMaterial = new ShaderMaterial(\r\n \"gaussianSplattingDepth\",\r\n scene,\r\n {\r\n vertex: \"gaussianSplattingDepth\",\r\n fragment: \"gaussianSplattingDepth\",\r\n },\r\n {\r\n attributes: GaussianSplattingMaterial._Attribs,\r\n uniforms: GaussianSplattingMaterial._Uniforms,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n uniformBuffers: GaussianSplattingMaterial._UniformBuffers,\r\n shaderLanguage: shaderLanguage,\r\n }\r\n );\r\n\r\n const shadowDepthWrapper = new ShadowDepthWrapper(shaderMaterial, scene, {\r\n standalone: true,\r\n });\r\n\r\n shaderMaterial.onBindObservable.add((mesh: AbstractMesh) => {\r\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\r\n const gsMesh = mesh as GaussianSplattingMesh;\r\n\r\n GaussianSplattingMaterial._BindEffectUniforms(gsMesh, gsMaterial, shaderMaterial, scene);\r\n });\r\n\r\n return shadowDepthWrapper;\r\n }\r\n\r\n /**\r\n * Clones the material.\r\n * @param name The cloned name.\r\n * @returns The cloned material.\r\n */\r\n public override clone(name: string): GaussianSplattingMaterial {\r\n const clone = SerializationHelper.Clone(() => new GaussianSplattingMaterial(name, this.getScene()), this);\r\n\r\n clone.id = name;\r\n clone.name = name;\r\n\r\n this._clonePlugins(clone, \"\");\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Serializes the current material to its JSON representation.\r\n * @returns The JSON representation.\r\n */\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.GaussianSplattingMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Gets the class name of the material\r\n * @returns \"GaussianSplattingMaterial\"\r\n */\r\n public override getClassName(): string {\r\n return \"GaussianSplattingMaterial\";\r\n }\r\n\r\n /**\r\n * Parse a JSON input to create back a Gaussian Splatting material.\r\n * @param source The JSON data to parse\r\n * @param scene The scene to create the parsed material in\r\n * @param rootUrl The root url of the assets the material depends upon\r\n * @returns the instantiated GaussianSplattingMaterial.\r\n */\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): GaussianSplattingMaterial {\r\n const material = SerializationHelper.Parse(() => new GaussianSplattingMaterial(source.name, scene), source, scene, rootUrl);\r\n\r\n Material._ParsePlugins(source, material, scene, rootUrl);\r\n\r\n return material;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GaussianSplattingMaterial\", GaussianSplattingMaterial);\r\n"]}
1
+ {"version":3,"file":"gaussianSplattingMaterial.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SubMesh } from \"../../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Effect, IEffectCreationOptions } from \"../../Materials/effect\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Matrix } from \"../../Maths/math.vector\";\r\nimport type { GaussianSplattingMesh } from \"../../Meshes/GaussianSplatting/gaussianSplattingMesh\";\r\nimport type { AbstractEngine } from \"../../Engines/abstractEngine\";\r\nimport { SerializationHelper } from \"../../Misc/decorators.serialization\";\r\nimport { VertexBuffer } from \"../../Buffers/buffer\";\r\nimport { MaterialDefines } from \"../../Materials/materialDefines\";\r\nimport { PushMaterial } from \"../../Materials/pushMaterial\";\r\nimport { RegisterClass } from \"../../Misc/typeStore\";\r\nimport { AddClipPlaneUniforms, BindClipPlane } from \"../clipPlaneMaterialHelper\";\r\nimport { Camera } from \"../../Cameras/camera\";\r\nimport { ShadowDepthWrapper } from \"../../Materials/shadowDepthWrapper\";\r\nimport { ShaderMaterial } from \"../../Materials/shaderMaterial\";\r\nimport { MaterialPluginEvent } from \"../materialPluginEvent\";\r\nimport { Material } from \"../material\";\r\n\r\nimport \"../../Shaders/gaussianSplatting.fragment\";\r\nimport \"../../Shaders/gaussianSplatting.vertex\";\r\nimport \"../../ShadersWGSL/gaussianSplatting.fragment\";\r\nimport \"../../ShadersWGSL/gaussianSplatting.vertex\";\r\nimport \"../../Shaders/gaussianSplattingDepth.fragment\";\r\nimport \"../../Shaders/gaussianSplattingDepth.vertex\";\r\nimport \"../../ShadersWGSL/gaussianSplattingDepth.fragment\";\r\nimport \"../../ShadersWGSL/gaussianSplattingDepth.vertex\";\r\nimport {\r\n BindFogParameters,\r\n BindLogDepth,\r\n PrepareAttributesForInstances,\r\n PrepareDefinesForAttributes,\r\n PrepareDefinesForFrameBoundValues,\r\n PrepareDefinesForMisc,\r\n PrepareUniformsAndSamplersList,\r\n} from \"../materialHelper.functions\";\r\nimport { ShaderLanguage } from \"../shaderLanguage\";\r\n\r\n/**\r\n * Computes the maximum number of Gaussian Splatting compound parts supported by the given engine.\r\n * The limit is derived from the engine's maximum vertex uniform vectors capability.\r\n * @param engine - The engine to compute the limit for\r\n * @returns The maximum number of parts supported\r\n */\r\nexport function GetGaussianSplattingMaxPartCount(engine: AbstractEngine): number {\r\n // Each GS compound part requires 5 uniform vectors: 4 for the mat4 world matrix + 1 for the visibility float.\r\n // The maximum number of parts is limited by the engine's uniform vector capacity and by the uint8 partIndices texture format (max 256).\r\n\r\n const uniformsPerSplat = 5;\r\n const reservedUniforms = 40; // base shader uniforms + margin for plugins/clip planes\r\n const absoluteMax = 256; // uint8 partIndices texture format limit\r\n\r\n const maxUniformVectors = engine.getCaps().maxVertexUniformVectors;\r\n const available = Math.max(maxUniformVectors - reservedUniforms, 0);\r\n const maxFromUniforms = Math.floor(available / uniformsPerSplat);\r\n return Math.min(Math.max(maxFromUniforms, 1), absoluteMax);\r\n}\r\n\r\n/**\r\n * @deprecated Use {@link GetGaussianSplattingMaxPartCount} with an engine instance instead.\r\n */\r\nexport const GaussianSplattingMaxPartCount = 128;\r\n\r\n/**\r\n * @internal\r\n */\r\nclass GaussianSplattingMaterialDefines extends MaterialDefines {\r\n /** Defines whether fog is enabled */\r\n public FOG = false;\r\n /** Defines whether thin instances are used */\r\n public THIN_INSTANCES = true;\r\n /** Defines whether logarithmic depth is enabled */\r\n public LOGARITHMICDEPTH = false;\r\n /** Defines whether clip plane 1 is enabled */\r\n public CLIPPLANE = false;\r\n /** Defines whether clip plane 2 is enabled */\r\n public CLIPPLANE2 = false;\r\n /** Defines whether clip plane 3 is enabled */\r\n public CLIPPLANE3 = false;\r\n /** Defines whether clip plane 4 is enabled */\r\n public CLIPPLANE4 = false;\r\n /** Defines whether clip plane 5 is enabled */\r\n public CLIPPLANE5 = false;\r\n /** Defines whether clip plane 6 is enabled */\r\n public CLIPPLANE6 = false;\r\n /** Defines the spherical harmonics degree */\r\n public SH_DEGREE = 0;\r\n /** Defines whether compensation is applied */\r\n public COMPENSATION = false;\r\n /** Defines whether this is a compound splat */\r\n public IS_COMPOUND = false;\r\n /** Defines the maximum number of parts (computed from engine caps at runtime) */\r\n public MAX_PART_COUNT = GaussianSplattingMaxPartCount;\r\n\r\n /**\r\n * Constructor of the defines.\r\n * @param externalProperties External properties (e.g. from material plugins) to add to the defines.\r\n */\r\n constructor(externalProperties?: { [name: string]: { type: string; default: any } }) {\r\n super(externalProperties);\r\n this.rebuild();\r\n }\r\n}\r\n\r\n/**\r\n * GaussianSplattingMaterial material used to render Gaussian Splatting\r\n * @experimental\r\n */\r\nexport class GaussianSplattingMaterial extends PushMaterial {\r\n /**\r\n * Instantiates a Gaussian Splatting Material in the given scene\r\n * @param name The friendly name of the material\r\n * @param scene The scene to add the material to\r\n */\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n\r\n this.backFaceCulling = false;\r\n this.shadowDepthWrapper = GaussianSplattingMaterial._MakeGaussianSplattingShadowDepthWrapper(scene!, this.shaderLanguage);\r\n }\r\n\r\n /**\r\n * Point spread function (default 0.3). Can be overriden per GS material\r\n */\r\n public static KernelSize: number = 0.3;\r\n\r\n /**\r\n * Compensation\r\n */\r\n public static Compensation: boolean = false;\r\n\r\n /**\r\n * Point spread function (default 0.3). Can be overriden per GS material, otherwise, using default static `KernelSize` value\r\n */\r\n public kernelSize = GaussianSplattingMaterial.KernelSize;\r\n private _compensation = GaussianSplattingMaterial.Compensation;\r\n\r\n // set to true when material defines are dirty\r\n private _isDirty = false;\r\n\r\n /**\r\n * Set compensation default value is `GaussianSplattingMaterial.Compensation`\r\n */\r\n public set compensation(value: boolean) {\r\n this._isDirty = this._isDirty != value;\r\n this._compensation = value;\r\n }\r\n\r\n /**\r\n * Get compensation\r\n */\r\n public get compensation(): boolean {\r\n return this._compensation;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n */\r\n public override get hasRenderTargetTextures(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha test mode.\r\n * @returns false\r\n */\r\n public override needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha blend mode.\r\n * @returns true\r\n */\r\n public override needAlphaBlending(): boolean {\r\n return true;\r\n }\r\n\r\n protected static _Attribs = [VertexBuffer.PositionKind, \"splatIndex0\", \"splatIndex1\", \"splatIndex2\", \"splatIndex3\"];\r\n protected static _Samplers = [\"covariancesATexture\", \"covariancesBTexture\", \"centersTexture\", \"colorsTexture\", \"shTexture0\", \"shTexture1\", \"shTexture2\", \"partIndicesTexture\"];\r\n protected static _UniformBuffers = [\"Scene\", \"Mesh\"];\r\n protected static _Uniforms = [\r\n \"world\",\r\n \"view\",\r\n \"projection\",\r\n \"vFogInfos\",\r\n \"vFogColor\",\r\n \"logarithmicDepthConstant\",\r\n \"invViewport\",\r\n \"dataTextureSize\",\r\n \"focal\",\r\n \"eyePosition\",\r\n \"kernelSize\",\r\n \"alpha\",\r\n \"depthValues\",\r\n \"partWorld\",\r\n \"partVisibility\",\r\n ];\r\n private _sourceMesh: GaussianSplattingMesh | null = null;\r\n /**\r\n * Checks whether the material is ready to be rendered for a given mesh.\r\n * @param mesh The mesh to render\r\n * @param subMesh The submesh to check against\r\n * @returns true if all the dependencies are ready (Textures, Effects...)\r\n */\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const useInstances = true;\r\n\r\n const drawWrapper = subMesh._drawWrapper;\r\n let defines = <GaussianSplattingMaterialDefines>subMesh.materialDefines;\r\n\r\n if (defines && this._isDirty) {\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n if (drawWrapper.effect && this.isFrozen) {\r\n if (drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.GetDefineNames, this._eventInfo);\r\n defines = subMesh.materialDefines = new GaussianSplattingMaterialDefines(this._eventInfo.defineNames);\r\n }\r\n\r\n const scene = this.getScene();\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n // Check plugin readiness\r\n this._eventInfo.isReadyForSubMesh = true;\r\n this._eventInfo.defines = defines;\r\n this._eventInfo.subMesh = subMesh;\r\n this._callbackPluginEventIsReadyForSubMesh(this._eventInfo);\r\n\r\n if (!this._eventInfo.isReadyForSubMesh) {\r\n return false;\r\n }\r\n\r\n if (!this._sourceMesh) {\r\n return false;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n const gsMesh = this._sourceMesh;\r\n\r\n // Misc.\r\n PrepareDefinesForMisc(\r\n mesh,\r\n scene,\r\n this._useLogarithmicDepth,\r\n this.pointsCloud,\r\n this.fogEnabled,\r\n false,\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._isVertexOutputInvariant\r\n );\r\n\r\n // Values that need to be evaluated on every frame\r\n PrepareDefinesForFrameBoundValues(scene, engine, this, defines, useInstances, null, true);\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, false, false);\r\n\r\n // SH is disabled for webGL1\r\n if (engine.version > 1 || engine.isWebGPU) {\r\n defines[\"SH_DEGREE\"] = gsMesh.shDegree;\r\n }\r\n\r\n defines[\"IS_COMPOUND\"] = gsMesh.isCompound;\r\n defines[\"MAX_PART_COUNT\"] = GetGaussianSplattingMaxPartCount(engine);\r\n\r\n // Compensation\r\n const splatMaterial = gsMesh.material as GaussianSplattingMaterial;\r\n defines[\"COMPENSATION\"] = splatMaterial && splatMaterial.compensation ? splatMaterial.compensation : GaussianSplattingMaterial.Compensation;\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n scene.resetCachedMaterial();\r\n\r\n //Attributes\r\n PrepareAttributesForInstances(GaussianSplattingMaterial._Attribs, defines);\r\n\r\n const attribs = GaussianSplattingMaterial._Attribs.slice();\r\n const uniforms = GaussianSplattingMaterial._Uniforms.slice();\r\n const samplers = GaussianSplattingMaterial._Samplers.slice();\r\n const uniformBuffers = GaussianSplattingMaterial._UniformBuffers.slice();\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: defines,\r\n });\r\n\r\n AddClipPlaneUniforms(uniforms);\r\n\r\n // Let plugin manager prepare its uniform/sampler/ubo lists\r\n if (!this._uniformBufferLayoutBuilt) {\r\n this.buildUniformLayout();\r\n }\r\n\r\n // Prepare plugin effect\r\n this._eventInfo.fallbackRank = 0;\r\n this._eventInfo.defines = defines;\r\n this._eventInfo.attributes = attribs;\r\n this._eventInfo.uniforms = uniforms;\r\n this._eventInfo.samplers = samplers;\r\n this._eventInfo.uniformBuffersNames = uniformBuffers;\r\n this._eventInfo.customCode = undefined;\r\n this._eventInfo.mesh = mesh;\r\n\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.PrepareEffect, this._eventInfo);\r\n\r\n const join = defines.toString();\r\n const effect = scene.getEngine().createEffect(\r\n \"gaussianSplatting\",\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: join,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: {},\r\n processCodeAfterIncludes: this._eventInfo.customCode,\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/gaussianSplatting.fragment\"), import(\"../../ShadersWGSL/gaussianSplatting.vertex\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/gaussianSplatting.fragment\"), import(\"../../Shaders/gaussianSplatting.vertex\")]);\r\n }\r\n },\r\n },\r\n engine\r\n );\r\n subMesh.setEffect(effect, defines, this._materialContext);\r\n }\r\n\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n drawWrapper._wasPreviouslyUsingInstances = useInstances;\r\n this._isDirty = false;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * GaussianSplattingMaterial belongs to a single mesh\r\n * @param mesh mesh this material belongs to\r\n */\r\n public setSourceMesh(mesh: GaussianSplattingMesh) {\r\n this._sourceMesh = mesh;\r\n }\r\n\r\n /**\r\n * Gets the source mesh of this material, which is the Gaussian Splatting mesh that provides the data for rendering\r\n * @returns The Gaussian Splatting mesh that provides the data for rendering, or null if not set\r\n */\r\n public getSourceMesh(): GaussianSplattingMesh | null {\r\n return this._sourceMesh;\r\n }\r\n\r\n /**\r\n * Bind material effect for a specific Gaussian Splatting mesh\r\n * @param mesh Gaussian splatting mesh\r\n * @param effect Splatting material or node material\r\n * @param scene scene that contains mesh and camera used for rendering\r\n */\r\n public static BindEffect(mesh: Mesh, effect: Effect, scene: Scene): void {\r\n const engine = scene.getEngine();\r\n const camera = scene.activeCamera;\r\n\r\n const renderWidth = engine.getRenderWidth() * camera!.viewport.width;\r\n const renderHeight = engine.getRenderHeight() * camera!.viewport.height;\r\n\r\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\r\n\r\n if (!gsMaterial._sourceMesh) {\r\n return;\r\n }\r\n\r\n const gsMesh = gsMaterial._sourceMesh;\r\n\r\n // check if rigcamera, get number of rigs\r\n const numberOfRigs = camera?.rigParent?.rigCameras.length || 1;\r\n\r\n effect.setFloat2(\"invViewport\", 1 / (renderWidth / numberOfRigs), 1 / renderHeight);\r\n\r\n let focal = 1000;\r\n\r\n if (camera) {\r\n /*\r\n more explicit version:\r\n const t = camera.getProjectionMatrix().m[5];\r\n const FovY = Math.atan(1.0 / t) * 2.0;\r\n focal = renderHeight / 2.0 / Math.tan(FovY / 2.0);\r\n Using a shorter version here to not have tan(atan) and 2.0 factor\r\n */\r\n const t = camera.getProjectionMatrix().m[5];\r\n if (camera.fovMode == Camera.FOVMODE_VERTICAL_FIXED) {\r\n focal = (renderHeight * t) / 2.0;\r\n } else {\r\n focal = (renderWidth * t) / 2.0;\r\n }\r\n }\r\n\r\n effect.setFloat2(\"focal\", focal, focal);\r\n effect.setFloat(\"kernelSize\", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize);\r\n effect.setFloat(\"alpha\", gsMaterial.alpha);\r\n scene.bindEyePosition(effect, \"eyePosition\", true);\r\n\r\n if (gsMesh.covariancesATexture) {\r\n const textureSize = gsMesh.covariancesATexture.getSize();\r\n\r\n effect.setFloat2(\"dataTextureSize\", textureSize.width, textureSize.height);\r\n\r\n effect.setTexture(\"covariancesATexture\", gsMesh.covariancesATexture);\r\n effect.setTexture(\"covariancesBTexture\", gsMesh.covariancesBTexture);\r\n effect.setTexture(\"centersTexture\", gsMesh.centersTexture);\r\n effect.setTexture(\"colorsTexture\", gsMesh.colorsTexture);\r\n\r\n if (gsMesh.shTextures) {\r\n for (let i = 0; i < gsMesh.shTextures?.length; i++) {\r\n effect.setTexture(`shTexture${i}`, gsMesh.shTextures[i]);\r\n }\r\n }\r\n\r\n // Bind part indices texture, if the\r\n if (gsMesh.partIndicesTexture) {\r\n effect.setTexture(\"partIndicesTexture\", gsMesh.partIndicesTexture);\r\n // Bind part world matrices\r\n const partWorldData = new Float32Array(gsMesh.partCount * 16);\r\n for (let i = 0; i < gsMesh.partCount; i++) {\r\n gsMesh.getWorldMatrixForPart(i).toArray(partWorldData, i * 16);\r\n }\r\n effect.setMatrices(\"partWorld\", partWorldData);\r\n\r\n // Bind part visibility data\r\n const partVisibilityData: number[] = [];\r\n for (let i = 0; i < gsMesh.partCount; i++) {\r\n partVisibilityData.push(gsMesh.partVisibility[i] ?? 1.0);\r\n }\r\n effect.setArray(\"partVisibility\", partVisibilityData);\r\n }\r\n }\r\n }\r\n /**\r\n * Binds the submesh to this material by preparing the effect and shader to draw\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = <GaussianSplattingMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n this._activeEffect = effect;\r\n\r\n // Matrices Mesh.\r\n mesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n mesh.transferToEffect(world);\r\n\r\n // Bind data\r\n const mustRebind = this._mustRebind(scene, effect, subMesh, mesh.visibility);\r\n\r\n if (mustRebind) {\r\n this.bindView(effect);\r\n this.bindViewProjection(effect);\r\n GaussianSplattingMaterial.BindEffect(mesh, this._activeEffect, scene);\r\n // Clip plane\r\n BindClipPlane(effect, this, scene);\r\n } else if (scene.getEngine()._features.needToAlwaysBindUniformBuffers) {\r\n this._needToBindSceneUbo = true;\r\n }\r\n\r\n // Fog\r\n BindFogParameters(scene, mesh, effect);\r\n\r\n // Log. depth\r\n if (this.useLogarithmicDepth) {\r\n BindLogDepth(defines, effect, scene);\r\n }\r\n\r\n // Bind plugins\r\n this._eventInfo.subMesh = subMesh;\r\n this._callbackPluginEventBindForSubMesh(this._eventInfo);\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n protected static _BindEffectUniforms(gsMesh: GaussianSplattingMesh, gsMaterial: GaussianSplattingMaterial, shaderMaterial: ShaderMaterial, scene: Scene): void {\r\n const engine = scene.getEngine();\r\n const effect = shaderMaterial.getEffect()!;\r\n const camera = scene.activeCamera;\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n gsMesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n shaderMaterial.bindView(effect);\r\n shaderMaterial.bindViewProjection(effect);\r\n\r\n const renderWidth = engine.getRenderWidth() * camera!.viewport.width;\r\n const renderHeight = engine.getRenderHeight() * camera!.viewport.height;\r\n effect.setFloat2(\"invViewport\", 1 / renderWidth, 1 / renderHeight);\r\n\r\n let focal = 1000;\r\n\r\n if (camera) {\r\n /*\r\n more explicit version:\r\n const t = camera.getProjectionMatrix().m[5];\r\n const FovY = Math.atan(1.0 / t) * 2.0;\r\n focal = renderHeight / 2.0 / Math.tan(FovY / 2.0);\r\n Using a shorter version here to not have tan(atan) and 2.0 factor\r\n */\r\n const t = camera.getProjectionMatrix().m[5];\r\n if (camera.fovMode == Camera.FOVMODE_VERTICAL_FIXED) {\r\n focal = (renderHeight * t) / 2.0;\r\n } else {\r\n focal = (renderWidth * t) / 2.0;\r\n }\r\n }\r\n\r\n effect.setFloat2(\"focal\", focal, focal);\r\n effect.setFloat(\"kernelSize\", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize);\r\n effect.setFloat(\"alpha\", gsMaterial.alpha);\r\n\r\n let minZ: number, maxZ: number;\r\n\r\n const cameraIsOrtho = camera.mode === Camera.ORTHOGRAPHIC_CAMERA;\r\n if (cameraIsOrtho) {\r\n minZ = !engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? 0 : 1;\r\n maxZ = engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? 0 : 1;\r\n } else {\r\n minZ = engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? camera.minZ : engine.isNDCHalfZRange ? 0 : camera.minZ;\r\n maxZ = engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? 0 : camera.maxZ;\r\n }\r\n\r\n effect.setFloat2(\"depthValues\", minZ, minZ + maxZ);\r\n\r\n if (gsMesh.covariancesATexture) {\r\n const textureSize = gsMesh.covariancesATexture.getSize();\r\n effect.setFloat2(\"dataTextureSize\", textureSize.width, textureSize.height);\r\n\r\n effect.setTexture(\"covariancesATexture\", gsMesh.covariancesATexture);\r\n effect.setTexture(\"covariancesBTexture\", gsMesh.covariancesBTexture);\r\n effect.setTexture(\"centersTexture\", gsMesh.centersTexture);\r\n effect.setTexture(\"colorsTexture\", gsMesh.colorsTexture);\r\n\r\n if (gsMesh.partIndicesTexture) {\r\n effect.setTexture(\"partIndicesTexture\", gsMesh.partIndicesTexture);\r\n const partWorldData = new Float32Array(gsMesh.partCount * 16);\r\n for (let i = 0; i < gsMesh.partCount; i++) {\r\n gsMesh.getWorldMatrixForPart(i).toArray(partWorldData, i * 16);\r\n }\r\n effect.setMatrices(\"partWorld\", partWorldData);\r\n const partVisibilityData: number[] = [];\r\n for (let i = 0; i < gsMesh.partCount; i++) {\r\n partVisibilityData.push(gsMesh.partVisibility[i] ?? 1.0);\r\n }\r\n effect.setArray(\"partVisibility\", partVisibilityData);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create a depth rendering material for a Gaussian Splatting mesh\r\n * @param scene scene it belongs to\r\n * @param shaderLanguage GLSL or WGSL\r\n * @param alphaBlendedDepth whether to enable alpha blended depth rendering\r\n * @param compoundMesh whether the mesh is a compound mesh\r\n * @returns depth rendering shader material\r\n */\r\n public makeDepthRenderingMaterial(scene: Scene, shaderLanguage: ShaderLanguage, alphaBlendedDepth: boolean = false, compoundMesh: boolean = false): ShaderMaterial {\r\n const defines = [\"#define DEPTH_RENDER\"];\r\n\r\n if (alphaBlendedDepth) {\r\n defines.push(\"#define ALPHA_BLENDED_DEPTH\");\r\n }\r\n\r\n if (compoundMesh) {\r\n defines.push(\"#define IS_COMPOUND\");\r\n defines.push(`#define MAX_PART_COUNT ${GetGaussianSplattingMaxPartCount(scene.getEngine())}`);\r\n }\r\n\r\n const shaderMaterial = new ShaderMaterial(\r\n \"gaussianSplattingDepthRender\",\r\n scene,\r\n {\r\n vertex: \"gaussianSplattingDepth\",\r\n fragment: \"gaussianSplattingDepth\",\r\n },\r\n {\r\n attributes: GaussianSplattingMaterial._Attribs,\r\n uniforms: GaussianSplattingMaterial._Uniforms,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n uniformBuffers: GaussianSplattingMaterial._UniformBuffers,\r\n shaderLanguage: shaderLanguage,\r\n defines: defines,\r\n needAlphaBlending: alphaBlendedDepth,\r\n }\r\n );\r\n shaderMaterial.backFaceCulling = false;\r\n shaderMaterial.onBindObservable.add((mesh: AbstractMesh) => {\r\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\r\n const gsMesh = mesh as GaussianSplattingMesh;\r\n GaussianSplattingMaterial._BindEffectUniforms(gsMesh, gsMaterial, shaderMaterial, scene);\r\n });\r\n return shaderMaterial;\r\n }\r\n\r\n protected static _MakeGaussianSplattingShadowDepthWrapper(scene: Scene, shaderLanguage: ShaderLanguage): ShadowDepthWrapper {\r\n const shaderMaterial = new ShaderMaterial(\r\n \"gaussianSplattingDepth\",\r\n scene,\r\n {\r\n vertex: \"gaussianSplattingDepth\",\r\n fragment: \"gaussianSplattingDepth\",\r\n },\r\n {\r\n attributes: GaussianSplattingMaterial._Attribs,\r\n uniforms: GaussianSplattingMaterial._Uniforms,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n uniformBuffers: GaussianSplattingMaterial._UniformBuffers,\r\n shaderLanguage: shaderLanguage,\r\n }\r\n );\r\n shaderMaterial.backFaceCulling = false;\r\n\r\n const shadowDepthWrapper = new ShadowDepthWrapper(shaderMaterial, scene, {\r\n standalone: true,\r\n });\r\n\r\n shaderMaterial.onBindObservable.add((mesh: AbstractMesh) => {\r\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\r\n const gsMesh = mesh as GaussianSplattingMesh;\r\n\r\n GaussianSplattingMaterial._BindEffectUniforms(gsMesh, gsMaterial, shaderMaterial, scene);\r\n });\r\n\r\n return shadowDepthWrapper;\r\n }\r\n\r\n /**\r\n * Clones the material.\r\n * @param name The cloned name.\r\n * @returns The cloned material.\r\n */\r\n public override clone(name: string): GaussianSplattingMaterial {\r\n const clone = SerializationHelper.Clone(() => new GaussianSplattingMaterial(name, this.getScene()), this);\r\n\r\n clone.id = name;\r\n clone.name = name;\r\n\r\n this._clonePlugins(clone, \"\");\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Serializes the current material to its JSON representation.\r\n * @returns The JSON representation.\r\n */\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.GaussianSplattingMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Gets the class name of the material\r\n * @returns \"GaussianSplattingMaterial\"\r\n */\r\n public override getClassName(): string {\r\n return \"GaussianSplattingMaterial\";\r\n }\r\n\r\n /**\r\n * Parse a JSON input to create back a Gaussian Splatting material.\r\n * @param source The JSON data to parse\r\n * @param scene The scene to create the parsed material in\r\n * @param rootUrl The root url of the assets the material depends upon\r\n * @returns the instantiated GaussianSplattingMaterial.\r\n */\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): GaussianSplattingMaterial {\r\n const material = SerializationHelper.Parse(() => new GaussianSplattingMaterial(source.name, scene), source, scene, rootUrl);\r\n\r\n Material._ParsePlugins(source, material, scene, rootUrl);\r\n\r\n return material;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GaussianSplattingMaterial\", GaussianSplattingMaterial);\r\n"]}
@@ -187,15 +187,12 @@ export class EquiRectangularCubeTexture extends BaseTexture {
187
187
  return;
188
188
  }
189
189
  this._texture = this._getFromCache(this.url, this._noMipmap, undefined, undefined, undefined, this.isCube);
190
+ this.delayLoadState = 1;
190
191
  if (!this._texture) {
191
- this.delayLoadState = 1;
192
192
  this._loadImage(() => {
193
193
  this._loadTexture();
194
194
  }, this._onError);
195
195
  }
196
- else {
197
- this.delayLoadState = 1;
198
- }
199
196
  }
200
197
  }
201
198
  /** The six faces of the cube. */
@@ -1 +1 @@
1
- {"version":3,"file":"equiRectangularCubeTexture.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/Textures/equiRectangularCubeTexture.ts"],"names":[],"mappings":"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","sourcesContent":["import { PanoramaToCubeMapTools } from \"../../Misc/HighDynamicRange/panoramaToCubemap\";\r\nimport { BaseTexture } from \"./baseTexture\";\r\nimport { Texture } from \"./texture\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { LoadImage } from \"../../Misc/fileTools\";\r\nimport { IsDocumentAvailable } from \"core/Misc/domManagement\";\r\n\r\n/**\r\n * This represents a texture coming from an equirectangular image supported by the web browser canvas.\r\n */\r\nexport class EquiRectangularCubeTexture extends BaseTexture {\r\n /** The six faces of the cube. */\r\n private static _FacesMapping = [\"right\", \"left\", \"up\", \"down\", \"front\", \"back\"];\r\n\r\n private _noMipmap: boolean;\r\n private _onLoad: Nullable<() => void> = null;\r\n private _onError: Nullable<() => void> = null;\r\n\r\n /** The size of the cubemap. */\r\n private _size: number;\r\n\r\n /** Whether to supersample the input image */\r\n private _supersample: boolean;\r\n\r\n /** The buffer of the image. */\r\n private _buffer: ArrayBuffer;\r\n\r\n /** The width of the input image. */\r\n private _width: number;\r\n\r\n /** The height of the input image. */\r\n private _height: number;\r\n\r\n /** The URL to the image. */\r\n public url: string;\r\n\r\n /**\r\n * Instantiates an EquiRectangularCubeTexture from the following parameters.\r\n * @param url The location of the image\r\n * @param scene The scene the texture will be used in\r\n * @param size The cubemap desired size (the more it increases the longer the generation will be)\r\n * @param noMipmap Forces to not generate the mipmap if true\r\n * @param gammaSpace Specifies if the texture will be used in gamma or linear space\r\n * (the PBR material requires those textures in linear space, but the standard material would require them in Gamma space)\r\n * @param onLoad — defines a callback called when texture is loaded\r\n * @param onError — defines a callback called if there is an error\r\n * @param supersample — defines if texture must be supersampled (default: false)\r\n */\r\n constructor(\r\n url: string,\r\n scene: Scene,\r\n size: number,\r\n noMipmap: boolean = false,\r\n gammaSpace: boolean = true,\r\n onLoad: Nullable<() => void> = null,\r\n onError: Nullable<(message?: string, exception?: any) => void> = null,\r\n supersample = false\r\n ) {\r\n super(scene);\r\n\r\n if (!url) {\r\n throw new Error(\"Image url is not set\");\r\n }\r\n\r\n this._coordinatesMode = Texture.CUBIC_MODE;\r\n this.name = url;\r\n this.url = url;\r\n this._size = size;\r\n this._supersample = supersample;\r\n this._noMipmap = noMipmap;\r\n this.gammaSpace = gammaSpace;\r\n this._onLoad = onLoad;\r\n this._onError = onError;\r\n\r\n this.hasAlpha = false;\r\n this.isCube = true;\r\n\r\n this._texture = this._getFromCache(url, this._noMipmap, undefined, undefined, undefined, this.isCube);\r\n\r\n if (!this._texture) {\r\n if (!scene.useDelayedTextureLoading) {\r\n this._loadImage(() => this._loadTexture(), this._onError);\r\n } else {\r\n this.delayLoadState = Constants.DELAYLOADSTATE_NOTLOADED;\r\n }\r\n } else if (onLoad) {\r\n if (this._texture.isReady) {\r\n Tools.SetImmediate(() => onLoad());\r\n } else {\r\n this._texture.onLoadedObservable.add(onLoad);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Load the image data, by putting the image on a canvas and extracting its buffer.\r\n * @param loadTextureCallback\r\n * @param onError\r\n */\r\n private _loadImage(loadTextureCallback: () => void, onError: Nullable<(message?: string, exception?: any) => void>): void {\r\n const scene = this.getScene();\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n // Create texture before loading\r\n const texture = scene\r\n .getEngine()\r\n .createRawCubeTexture(\r\n null,\r\n this._size,\r\n Constants.TEXTUREFORMAT_RGB,\r\n scene.getEngine().getCaps().textureFloat ? Constants.TEXTURETYPE_FLOAT : Constants.TEXTURETYPE_UNSIGNED_INTEGER,\r\n !this._noMipmap,\r\n false,\r\n Constants.TEXTURE_TRILINEAR_SAMPLINGMODE\r\n );\r\n texture.generateMipMaps = !this._noMipmap;\r\n scene.addPendingData(texture);\r\n texture.url = this.url;\r\n texture.isReady = false;\r\n scene.getEngine()._internalTexturesCache.push(texture);\r\n this._texture = texture;\r\n\r\n LoadImage(\r\n this.url,\r\n (image) => {\r\n this._width = image.width;\r\n this._height = image.height;\r\n let canvas: HTMLCanvasElement | OffscreenCanvas;\r\n\r\n if (IsDocumentAvailable()) {\r\n canvas = document.createElement(\"canvas\");\r\n canvas.width = this._width;\r\n canvas.height = this._height;\r\n } else {\r\n // Canvas is not available in the current environment\r\n canvas = new OffscreenCanvas(this._width, this._height);\r\n }\r\n\r\n const ctx = canvas.getContext(\"2d\") as CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\r\n ctx.drawImage(image, 0, 0);\r\n\r\n const imageData = ctx.getImageData(0, 0, image.width, image.height);\r\n this._buffer = imageData.data.buffer as ArrayBuffer;\r\n\r\n if ((canvas as HTMLCanvasElement).remove) {\r\n (canvas as HTMLCanvasElement).remove();\r\n }\r\n loadTextureCallback();\r\n },\r\n (_, e) => {\r\n scene.removePendingData(texture);\r\n if (onError) {\r\n onError(`${this.getClassName()} could not be loaded`, e);\r\n }\r\n },\r\n scene ? scene.offlineProvider : null\r\n );\r\n }\r\n\r\n /**\r\n * Convert the image buffer into a cubemap and create a CubeTexture.\r\n */\r\n private _loadTexture(): void {\r\n const scene = this.getScene();\r\n const callback = (): ArrayBufferView[] => {\r\n const imageData = this._getFloat32ArrayFromArrayBuffer(this._buffer);\r\n\r\n // Extract the raw linear data.\r\n const data = PanoramaToCubeMapTools.ConvertPanoramaToCubemap(imageData, this._width, this._height, this._size, this._supersample);\r\n\r\n const results = [];\r\n\r\n // Push each faces.\r\n for (let i = 0; i < 6; i++) {\r\n const dataFace = (data as any)[EquiRectangularCubeTexture._FacesMapping[i]];\r\n results.push(dataFace);\r\n }\r\n\r\n return results;\r\n };\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n const faceDataArrays = callback();\r\n\r\n const texture = this._texture!;\r\n scene.getEngine().updateRawCubeTexture(texture, faceDataArrays, texture.format, texture.type, texture.invertY);\r\n texture.isReady = true;\r\n scene.removePendingData(texture);\r\n\r\n texture.onLoadedObservable.notifyObservers(texture);\r\n texture.onLoadedObservable.clear();\r\n\r\n if (this._onLoad) {\r\n this._onLoad();\r\n }\r\n }\r\n\r\n /**\r\n * Convert the ArrayBuffer into a Float32Array and drop the transparency channel.\r\n * @param buffer The ArrayBuffer that should be converted.\r\n * @returns The buffer as Float32Array.\r\n */\r\n private _getFloat32ArrayFromArrayBuffer(buffer: ArrayBuffer): Float32Array {\r\n const dataView = new DataView(buffer);\r\n const floatImageData = new Float32Array((buffer.byteLength * 3) / 4);\r\n\r\n let k = 0;\r\n for (let i = 0; i < buffer.byteLength; i++) {\r\n // We drop the transparency channel, because we do not need/want it\r\n if ((i + 1) % 4 !== 0) {\r\n floatImageData[k++] = dataView.getUint8(i) / 255;\r\n }\r\n }\r\n\r\n return floatImageData;\r\n }\r\n\r\n /**\r\n * Get the current class name of the texture useful for serialization or dynamic coding.\r\n * @returns \"EquiRectangularCubeTexture\"\r\n */\r\n public override getClassName(): string {\r\n return \"EquiRectangularCubeTexture\";\r\n }\r\n\r\n /**\r\n * Create a clone of the current EquiRectangularCubeTexture and return it.\r\n * @returns A clone of the current EquiRectangularCubeTexture.\r\n */\r\n public override clone(): EquiRectangularCubeTexture {\r\n const scene = this.getScene();\r\n if (!scene) {\r\n return this;\r\n }\r\n\r\n const newTexture = new EquiRectangularCubeTexture(this.url, scene, this._size, this._noMipmap, this.gammaSpace);\r\n\r\n // Base texture\r\n newTexture.level = this.level;\r\n newTexture.wrapU = this.wrapU;\r\n newTexture.wrapV = this.wrapV;\r\n newTexture.coordinatesIndex = this.coordinatesIndex;\r\n newTexture.coordinatesMode = this.coordinatesMode;\r\n\r\n return newTexture;\r\n }\r\n\r\n /**\r\n * Finish the loading sequence of a texture flagged as delayed load.\r\n * @internal\r\n */\r\n public override delayLoad(): void {\r\n if (this.delayLoadState !== Constants.DELAYLOADSTATE_NOTLOADED) {\r\n return;\r\n }\r\n\r\n this._texture = this._getFromCache(this.url, this._noMipmap, undefined, undefined, undefined, this.isCube);\r\n\r\n if (!this._texture) {\r\n this.delayLoadState = Constants.DELAYLOADSTATE_LOADED;\r\n this._loadImage(() => {\r\n this._loadTexture();\r\n }, this._onError);\r\n } else {\r\n this.delayLoadState = Constants.DELAYLOADSTATE_LOADED;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"equiRectangularCubeTexture.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/Textures/equiRectangularCubeTexture.ts"],"names":[],"mappings":"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","sourcesContent":["import { PanoramaToCubeMapTools } from \"../../Misc/HighDynamicRange/panoramaToCubemap\";\r\nimport { BaseTexture } from \"./baseTexture\";\r\nimport { Texture } from \"./texture\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { LoadImage } from \"../../Misc/fileTools\";\r\nimport { IsDocumentAvailable } from \"core/Misc/domManagement\";\r\n\r\n/**\r\n * This represents a texture coming from an equirectangular image supported by the web browser canvas.\r\n */\r\nexport class EquiRectangularCubeTexture extends BaseTexture {\r\n /** The six faces of the cube. */\r\n private static _FacesMapping = [\"right\", \"left\", \"up\", \"down\", \"front\", \"back\"];\r\n\r\n private _noMipmap: boolean;\r\n private _onLoad: Nullable<() => void> = null;\r\n private _onError: Nullable<() => void> = null;\r\n\r\n /** The size of the cubemap. */\r\n private _size: number;\r\n\r\n /** Whether to supersample the input image */\r\n private _supersample: boolean;\r\n\r\n /** The buffer of the image. */\r\n private _buffer: ArrayBuffer;\r\n\r\n /** The width of the input image. */\r\n private _width: number;\r\n\r\n /** The height of the input image. */\r\n private _height: number;\r\n\r\n /** The URL to the image. */\r\n public url: string;\r\n\r\n /**\r\n * Instantiates an EquiRectangularCubeTexture from the following parameters.\r\n * @param url The location of the image\r\n * @param scene The scene the texture will be used in\r\n * @param size The cubemap desired size (the more it increases the longer the generation will be)\r\n * @param noMipmap Forces to not generate the mipmap if true\r\n * @param gammaSpace Specifies if the texture will be used in gamma or linear space\r\n * (the PBR material requires those textures in linear space, but the standard material would require them in Gamma space)\r\n * @param onLoad — defines a callback called when texture is loaded\r\n * @param onError — defines a callback called if there is an error\r\n * @param supersample — defines if texture must be supersampled (default: false)\r\n */\r\n constructor(\r\n url: string,\r\n scene: Scene,\r\n size: number,\r\n noMipmap: boolean = false,\r\n gammaSpace: boolean = true,\r\n onLoad: Nullable<() => void> = null,\r\n onError: Nullable<(message?: string, exception?: any) => void> = null,\r\n supersample = false\r\n ) {\r\n super(scene);\r\n\r\n if (!url) {\r\n throw new Error(\"Image url is not set\");\r\n }\r\n\r\n this._coordinatesMode = Texture.CUBIC_MODE;\r\n this.name = url;\r\n this.url = url;\r\n this._size = size;\r\n this._supersample = supersample;\r\n this._noMipmap = noMipmap;\r\n this.gammaSpace = gammaSpace;\r\n this._onLoad = onLoad;\r\n this._onError = onError;\r\n\r\n this.hasAlpha = false;\r\n this.isCube = true;\r\n\r\n this._texture = this._getFromCache(url, this._noMipmap, undefined, undefined, undefined, this.isCube);\r\n\r\n if (!this._texture) {\r\n if (!scene.useDelayedTextureLoading) {\r\n this._loadImage(() => this._loadTexture(), this._onError);\r\n } else {\r\n this.delayLoadState = Constants.DELAYLOADSTATE_NOTLOADED;\r\n }\r\n } else if (onLoad) {\r\n if (this._texture.isReady) {\r\n Tools.SetImmediate(() => onLoad());\r\n } else {\r\n this._texture.onLoadedObservable.add(onLoad);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Load the image data, by putting the image on a canvas and extracting its buffer.\r\n * @param loadTextureCallback\r\n * @param onError\r\n */\r\n private _loadImage(loadTextureCallback: () => void, onError: Nullable<(message?: string, exception?: any) => void>): void {\r\n const scene = this.getScene();\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n // Create texture before loading\r\n const texture = scene\r\n .getEngine()\r\n .createRawCubeTexture(\r\n null,\r\n this._size,\r\n Constants.TEXTUREFORMAT_RGB,\r\n scene.getEngine().getCaps().textureFloat ? Constants.TEXTURETYPE_FLOAT : Constants.TEXTURETYPE_UNSIGNED_INTEGER,\r\n !this._noMipmap,\r\n false,\r\n Constants.TEXTURE_TRILINEAR_SAMPLINGMODE\r\n );\r\n texture.generateMipMaps = !this._noMipmap;\r\n scene.addPendingData(texture);\r\n texture.url = this.url;\r\n texture.isReady = false;\r\n scene.getEngine()._internalTexturesCache.push(texture);\r\n this._texture = texture;\r\n\r\n LoadImage(\r\n this.url,\r\n (image) => {\r\n this._width = image.width;\r\n this._height = image.height;\r\n let canvas: HTMLCanvasElement | OffscreenCanvas;\r\n\r\n if (IsDocumentAvailable()) {\r\n canvas = document.createElement(\"canvas\");\r\n canvas.width = this._width;\r\n canvas.height = this._height;\r\n } else {\r\n // Canvas is not available in the current environment\r\n canvas = new OffscreenCanvas(this._width, this._height);\r\n }\r\n\r\n const ctx = canvas.getContext(\"2d\") as CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\r\n ctx.drawImage(image, 0, 0);\r\n\r\n const imageData = ctx.getImageData(0, 0, image.width, image.height);\r\n this._buffer = imageData.data.buffer as ArrayBuffer;\r\n\r\n if ((canvas as HTMLCanvasElement).remove) {\r\n (canvas as HTMLCanvasElement).remove();\r\n }\r\n loadTextureCallback();\r\n },\r\n (_, e) => {\r\n scene.removePendingData(texture);\r\n if (onError) {\r\n onError(`${this.getClassName()} could not be loaded`, e);\r\n }\r\n },\r\n scene ? scene.offlineProvider : null\r\n );\r\n }\r\n\r\n /**\r\n * Convert the image buffer into a cubemap and create a CubeTexture.\r\n */\r\n private _loadTexture(): void {\r\n const scene = this.getScene();\r\n const callback = (): ArrayBufferView[] => {\r\n const imageData = this._getFloat32ArrayFromArrayBuffer(this._buffer);\r\n\r\n // Extract the raw linear data.\r\n const data = PanoramaToCubeMapTools.ConvertPanoramaToCubemap(imageData, this._width, this._height, this._size, this._supersample);\r\n\r\n const results = [];\r\n\r\n // Push each faces.\r\n for (let i = 0; i < 6; i++) {\r\n const dataFace = (data as any)[EquiRectangularCubeTexture._FacesMapping[i]];\r\n results.push(dataFace);\r\n }\r\n\r\n return results;\r\n };\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n const faceDataArrays = callback();\r\n\r\n const texture = this._texture!;\r\n scene.getEngine().updateRawCubeTexture(texture, faceDataArrays, texture.format, texture.type, texture.invertY);\r\n texture.isReady = true;\r\n scene.removePendingData(texture);\r\n\r\n texture.onLoadedObservable.notifyObservers(texture);\r\n texture.onLoadedObservable.clear();\r\n\r\n if (this._onLoad) {\r\n this._onLoad();\r\n }\r\n }\r\n\r\n /**\r\n * Convert the ArrayBuffer into a Float32Array and drop the transparency channel.\r\n * @param buffer The ArrayBuffer that should be converted.\r\n * @returns The buffer as Float32Array.\r\n */\r\n private _getFloat32ArrayFromArrayBuffer(buffer: ArrayBuffer): Float32Array {\r\n const dataView = new DataView(buffer);\r\n const floatImageData = new Float32Array((buffer.byteLength * 3) / 4);\r\n\r\n let k = 0;\r\n for (let i = 0; i < buffer.byteLength; i++) {\r\n // We drop the transparency channel, because we do not need/want it\r\n if ((i + 1) % 4 !== 0) {\r\n floatImageData[k++] = dataView.getUint8(i) / 255;\r\n }\r\n }\r\n\r\n return floatImageData;\r\n }\r\n\r\n /**\r\n * Get the current class name of the texture useful for serialization or dynamic coding.\r\n * @returns \"EquiRectangularCubeTexture\"\r\n */\r\n public override getClassName(): string {\r\n return \"EquiRectangularCubeTexture\";\r\n }\r\n\r\n /**\r\n * Create a clone of the current EquiRectangularCubeTexture and return it.\r\n * @returns A clone of the current EquiRectangularCubeTexture.\r\n */\r\n public override clone(): EquiRectangularCubeTexture {\r\n const scene = this.getScene();\r\n if (!scene) {\r\n return this;\r\n }\r\n\r\n const newTexture = new EquiRectangularCubeTexture(this.url, scene, this._size, this._noMipmap, this.gammaSpace);\r\n\r\n // Base texture\r\n newTexture.level = this.level;\r\n newTexture.wrapU = this.wrapU;\r\n newTexture.wrapV = this.wrapV;\r\n newTexture.coordinatesIndex = this.coordinatesIndex;\r\n newTexture.coordinatesMode = this.coordinatesMode;\r\n\r\n return newTexture;\r\n }\r\n\r\n /**\r\n * Finish the loading sequence of a texture flagged as delayed load.\r\n * @internal\r\n */\r\n public override delayLoad(): void {\r\n if (this.delayLoadState !== Constants.DELAYLOADSTATE_NOTLOADED) {\r\n return;\r\n }\r\n\r\n this._texture = this._getFromCache(this.url, this._noMipmap, undefined, undefined, undefined, this.isCube);\r\n this.delayLoadState = Constants.DELAYLOADSTATE_LOADED;\r\n\r\n if (!this._texture) {\r\n this._loadImage(() => {\r\n this._loadTexture();\r\n }, this._onError);\r\n }\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onerjs/core",
3
- "version": "8.44.6",
3
+ "version": "8.44.7",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "types": "index.d.ts",