@babylonjs/shared-ui-components 9.15.0 → 9.16.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectFile.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/projects/projectFile.ts"],"names":[],"mappings":"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","sourcesContent":["// Side-effect import: registers the `.babylon` SceneLoader plugin so the\r\n// companion `.babylon` file produced by SerializeProject can be loaded back.\r\n// Without this, LoadAssetContainerAsync logs \"Unable to find a plugin to\r\n// load .babylon files\" and the companion load fails.\r\nimport \"core/Loading/Plugins/babylonFileLoader\";\r\n\r\nimport { type Scene } from \"core/scene\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { SceneSerializer } from \"core/Misc/sceneSerializer\";\r\nimport {\r\n FindSmartAssetKeyForObject,\r\n GetAllSmartAssets,\r\n GetSmartAssetTextureExtensions,\r\n LoadAllSmartAssetsAsync,\r\n LoadSmartAssetAsync,\r\n RegisterSmartAsset,\r\n RemoveSmartAssetAsync,\r\n SerializeSmartAssetManagerMap,\r\n} from \"core/SmartAssets/smartAssetManager.pure\";\r\nimport { type ISerializedSmartAssetMap, DeserializeSmartAssetMap, ResolveAssetUrl, ReadJsonSourceAsync } from \"core/SmartAssets/smartAssetSerializer\";\r\nimport { ClearOverrides, DeserializeAndApplyOverrides, SerializeOverrides } from \"./overrideManager\";\r\nimport { type IOverrideEntry } from \"./overrideEntry\";\r\n\r\n/**\r\n * ## `.babylonproj` project file format\r\n *\r\n * The `.babylonproj` zip on disk packages three layers:\r\n * 1. **SmartAsset registry** — URL references to external assets (glb/gltf/textures\r\n * loaded via SAM). Local blob/data assets are bundled inside the zip and\r\n * extracted to fresh blob URLs on load.\r\n * 2. **OverrideManager state** — declarative property overrides applied after load.\r\n * 3. **Companion `.babylon`** — meshes, lights, cameras, transform nodes, and\r\n * materials that are *not* tracked by SAM (i.e. user-created scene content).\r\n * Plus a `companionBindings` side table mapping material texture slots back\r\n * to SAM-tracked textures so re-attachment works without embedding texture\r\n * bytes in the companion.\r\n *\r\n * ### What round-trips cleanly\r\n * - SAM-tracked assets (re-fetched from their URLs or extracted from the zip)\r\n * - User-created `Mesh` geometry, `Material`s (Standard/PBR/Multi/Node), and\r\n * `*Texture` slot bindings to SAM textures\r\n * - `Light`s, `Camera`s, `TransformNode`s, scene/material image processing,\r\n * clear color, fog, environment intensity\r\n * - Property overrides on any of the above\r\n *\r\n * ### Known gaps (not preserved on save/load)\r\n * - `PostProcess` attachments to cameras (a post-process attaches to a *specific*\r\n * camera instance; we dispose+recreate cameras, leaving post-processes orphaned).\r\n * - `AdvancedDynamicTexture` GUI controls — not in `.babylon` format.\r\n * - Audio (`Sound` / `AudioEngine` state).\r\n * - Particle systems with runtime state, baked vertex animations.\r\n * - Complex shader-driven content like GaussianSplatting: the mesh round-trips\r\n * but its companion utility materials (`gaussianSplattingDepth`, `ProxyMaterial`)\r\n * get duplicated on each load cycle.\r\n * - Skeleton animation playback state.\r\n *\r\n * If you hit a \"the scene looks different after load\" issue, it's almost\r\n * certainly one of the gaps above rather than camera or mesh state drift.\r\n */\r\n\r\n/**\r\n * Reserved smart asset key for user-created objects (materials, lights, cameras)\r\n * that are persisted as a companion `.babylon` file alongside the project JSON.\r\n */\r\nexport const ProjectLocalsKey = \"__project_locals__\";\r\n\r\n/**\r\n * The result of serializing a project. Contains the project JSON and,\r\n * if the scene has user-created objects, a companion `.babylon` blob.\r\n */\r\nexport interface IProjectBundle {\r\n /** The project JSON document (assets + overrides, no embedded scene data). */\r\n readonly project: ISerializedProject;\r\n\r\n /**\r\n * A companion `.babylon` file containing user-created objects not owned by\r\n * any smart asset. Undefined if there are no such objects.\r\n */\r\n readonly companionBabylon?: Blob;\r\n}\r\n\r\n/**\r\n * Maps each user-created material (by name) to its texture-slot bindings.\r\n * A binding records \"this `*Texture` slot on this material should be\r\n * re-attached to the SmartAsset registered under this key\" so that texture\r\n * references survive a save/load round-trip without embedding the texture\r\n * data inside the companion `.babylon`.\r\n */\r\nexport type CompanionTextureBindings = Record<string, Record<string, string>>;\r\n\r\n/**\r\n * A versioned project file that composes a smart asset map with overrides.\r\n * This is the unified on-disk format for persisting a complete project.\r\n */\r\nexport interface ISerializedProject {\r\n /** Schema version. Must be 2 for the current version. */\r\n readonly version: 2;\r\n\r\n /** Smart asset key→URL mappings (from SmartAssetManager). */\r\n readonly assets: ISerializedSmartAssetMap[\"assets\"];\r\n\r\n /** Property overrides (from OverrideManager). */\r\n readonly overrides: IOverrideEntry[];\r\n\r\n /**\r\n * Optional bindings that re-attach SmartAsset-tracked textures to\r\n * user-created material slots after the companion `.babylon` loads.\r\n * Omitted when no user-created material references a SmartAsset texture.\r\n */\r\n readonly companionBindings?: CompanionTextureBindings;\r\n}\r\n\r\n// ── JSON layer (scene ↔ ISerializedProject) ──\r\n\r\n/**\r\n * Serializes a scene's smart asset map and override registry into a project\r\n * bundle. User-created objects (materials, lights, cameras not owned by any\r\n * smart asset) are serialized into a companion `.babylon` file rather than\r\n * embedded in the project JSON.\r\n *\r\n * Both managers are looked up (and created if missing) via their respective\r\n * `Get…Manager(scene)` accessors, so this function can be called on any scene.\r\n *\r\n * @param scene - The scene to serialize.\r\n * @param baseUrl - Optional base URL for making asset paths relative.\r\n * @returns A project bundle containing the JSON document and optional companion file.\r\n */\r\nexport function SerializeProject(scene: Scene, baseUrl?: string): IProjectBundle {\r\n const assetMap = SerializeSmartAssetManagerMap(scene, baseUrl);\r\n const overrides = SerializeOverrides(scene);\r\n\r\n // Build a minimal .babylon JSON with only user-created objects, plus the\r\n // texture-binding side table that records which SmartAsset textures should\r\n // be re-attached to which material slots after load.\r\n const companionResult = SerializeCompanionBabylon(scene);\r\n let companionBabylon: Blob | undefined;\r\n\r\n const assets = { ...assetMap.assets };\r\n\r\n if (companionResult) {\r\n companionBabylon = new Blob([JSON.stringify(companionResult.companion)], { type: \"application/json\" });\r\n assets[ProjectLocalsKey] = { url: ProjectLocalsKey + \".babylon\" };\r\n } else {\r\n // Remove stale companion entry if no locals exist\r\n delete assets[ProjectLocalsKey];\r\n }\r\n\r\n const hasBindings = companionResult && Object.keys(companionResult.bindings).length > 0;\r\n const project: ISerializedProject = {\r\n version: 2,\r\n assets,\r\n overrides,\r\n ...(hasBindings ? { companionBindings: companionResult.bindings } : {}),\r\n };\r\n\r\n return { project, companionBabylon };\r\n}\r\n\r\n/**\r\n * Loads a project file from a URL, File, or pre-parsed object.\r\n * Registers all asset entries on the scene's SmartAssetManager, loads all\r\n * assets (including the companion `.babylon` for user-created objects), then\r\n * applies all overrides via the OverrideManager.\r\n *\r\n * For loading the `.babylonproj` zip on-disk format, use {@link LoadProjectFileAsync}\r\n * instead — it extracts the zip and then calls this function with the embedded\r\n * JSON document.\r\n *\r\n * @param scene - The scene to populate.\r\n * @param source - A URL string, File object, or pre-parsed ISerializedProject.\r\n * @param rootUrl - Optional root URL for resolving relative asset paths.\r\n */\r\nexport async function LoadProjectAsync(scene: Scene, source: string | File | ISerializedProject, rootUrl?: string): Promise<void> {\r\n let resolvedRootUrl = rootUrl ?? \"\";\r\n\r\n if (typeof source === \"string\" && !rootUrl) {\r\n const { Tools } = await import(\"core/Misc/tools\");\r\n resolvedRootUrl = Tools.GetFolderPath(source);\r\n }\r\n\r\n const raw = await ReadJsonSourceAsync(source);\r\n const doc = DeserializeProject(raw);\r\n\r\n // Pause the engine's render loops for the duration of the swap. Disposing\r\n // cameras mid-frame would throw \"No camera defined\" out of `scene.render`,\r\n // which kills the render loop entirely (it is not re-queued after an\r\n // uncaught exception). Snapshot the active loops first so we can restore\r\n // exactly what was running, even if multiple callbacks were registered.\r\n const engine = scene.getEngine();\r\n const savedRenderLoops = [...engine.activeRenderLoops];\r\n engine.stopRenderLoop();\r\n\r\n try {\r\n // Clear existing state so we load fresh from the project file.\r\n // The companion `.babylon` (when present) is the source of truth for all\r\n // user-created scene content, so dispose user-owned meshes, lights,\r\n // cameras, materials, and animation groups before reloading.\r\n await Promise.all(Array.from(GetAllSmartAssets(scene).keys()).map(async (existingKey) => await RemoveSmartAssetAsync(scene, existingKey)));\r\n ClearOverrides(scene);\r\n\r\n for (const mesh of [...scene.meshes]) {\r\n mesh.dispose();\r\n }\r\n for (const tn of [...scene.transformNodes]) {\r\n tn.dispose();\r\n }\r\n for (const ag of [...scene.animationGroups]) {\r\n ag.dispose();\r\n }\r\n for (const mat of [...scene.materials]) {\r\n mat.dispose();\r\n }\r\n for (const light of [...scene.lights]) {\r\n light.dispose();\r\n }\r\n for (const camera of [...scene.cameras]) {\r\n camera.dispose();\r\n }\r\n\r\n // Register all assets. Defer the companion .babylon — it must load after\r\n // textures are available so binding re-attachment can find them.\r\n let hasCompanion = false;\r\n for (const [key, entry] of Object.entries(doc.assets)) {\r\n if (key === ProjectLocalsKey) {\r\n hasCompanion = true;\r\n continue;\r\n }\r\n const resolved = resolvedRootUrl ? ResolveAssetUrl(entry.url, resolvedRootUrl) : entry.url;\r\n RegisterSmartAsset(scene, key, resolved, { type: entry.type, extension: entry.extension, metadata: entry.metadata });\r\n }\r\n\r\n await LoadAllSmartAssetsAsync(scene);\r\n\r\n // Now load the companion .babylon. Its materials were saved with texture\r\n // slots stripped (the binding side table records which SmartAsset texture\r\n // each slot should be re-attached to), so the loader never sees a broken\r\n // texture URL. Pass the .babylon extension hint because blob URLs have\r\n // no file extension.\r\n if (hasCompanion) {\r\n const companionEntry = doc.assets[ProjectLocalsKey];\r\n const companionUrl = resolvedRootUrl ? ResolveAssetUrl(companionEntry.url, resolvedRootUrl) : companionEntry.url;\r\n await LoadSmartAssetAsync(scene, ProjectLocalsKey, companionUrl, { extension: \".babylon\" });\r\n\r\n if (doc.companionBindings) {\r\n ApplyCompanionBindings(scene, doc.companionBindings);\r\n }\r\n }\r\n\r\n // Apply overrides\r\n if (doc.overrides.length > 0) {\r\n DeserializeAndApplyOverrides(scene, doc.overrides);\r\n }\r\n\r\n // Re-assign the active camera if the companion brought in fresh cameras.\r\n // The .babylon scene loader populates scene.cameras but does not set\r\n // scene.activeCamera, so render would otherwise throw \"No camera defined\".\r\n if (!scene.activeCamera && scene.cameras.length > 0) {\r\n scene.activeCamera = scene.cameras[0];\r\n }\r\n\r\n // Attach controls so the user can rotate/zoom/pan after load. New\r\n // camera instances from the companion .babylon are not attached to\r\n // the canvas by the loader — without this, the camera renders but\r\n // ignores mouse/touch input.\r\n const canvas = engine.getRenderingCanvas();\r\n if (scene.activeCamera && canvas) {\r\n scene.activeCamera.attachControl(canvas, true);\r\n }\r\n } finally {\r\n // Always restore the render loops, even if loading threw — otherwise\r\n // the canvas stays frozen forever and the user has no way to recover.\r\n for (const loop of savedRenderLoops) {\r\n engine.runRenderLoop(loop);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Validates and parses a serialized project document.\r\n * @param data - The raw data to validate (typically parsed JSON).\r\n * @returns The validated project document.\r\n * @throws If the data does not conform to the expected schema.\r\n */\r\nexport function DeserializeProject(data: unknown): ISerializedProject {\r\n if (!data || typeof data !== \"object\") {\r\n throw new Error(\"ProjectFile: Invalid project file — expected an object.\");\r\n }\r\n\r\n const doc = data as Record<string, unknown>;\r\n\r\n if (doc.version !== 2) {\r\n throw new Error(`ProjectFile: Unsupported project version \"${doc.version}\". Expected version 2.`);\r\n }\r\n\r\n // Validate the asset map portion\r\n DeserializeSmartAssetMap({ version: 1, assets: doc.assets });\r\n\r\n // Validate overrides array\r\n if (!Array.isArray(doc.overrides)) {\r\n throw new Error(\"ProjectFile: Invalid project file — 'overrides' must be an array.\");\r\n }\r\n\r\n // Validate optional companion bindings (shape-only check)\r\n if (doc.companionBindings !== undefined) {\r\n if (typeof doc.companionBindings !== \"object\" || doc.companionBindings === null || Array.isArray(doc.companionBindings)) {\r\n throw new Error(\"ProjectFile: Invalid project file — 'companionBindings' must be an object.\");\r\n }\r\n }\r\n\r\n return data as ISerializedProject;\r\n}\r\n\r\n// ── Zip layer (.babylonproj on disk) ──\r\n\r\n/**\r\n * Serializes a scene's project (smart assets + overrides) into a `.babylonproj`\r\n * zip bundle.\r\n *\r\n * The zip contains:\r\n * - `project.json` — the project document (assets + overrides)\r\n * - `__project_locals__.babylon` — companion file for user-created objects (if any)\r\n * - Bundled local asset files (blobs the user dragged in from disk)\r\n *\r\n * Remote URLs (http/https) are left as references and not bundled.\r\n *\r\n * @param scene - The scene to serialize.\r\n * @returns A Blob containing the zip bundle.\r\n */\r\nexport async function SaveProjectFileAsync(scene: Scene): Promise<Blob> {\r\n const bundle = SerializeProject(scene);\r\n const files: Record<string, Uint8Array> = {};\r\n\r\n // Collect local (blob/data URI) assets to bundle inside the zip.\r\n // Rewrite their URLs in the project JSON to relative paths.\r\n const projectAssets = { ...bundle.project.assets };\r\n\r\n // Fetch all blob/data URIs in parallel (avoid serial awaits in a loop).\r\n const blobEntries = Object.entries(projectAssets).filter(([key, entry]) => key !== ProjectLocalsKey && (entry.url.startsWith(\"blob:\") || entry.url.startsWith(\"data:\")));\r\n const fetched = await Promise.all(\r\n blobEntries.map(async ([key, entry]) => {\r\n try {\r\n const response = await fetch(entry.url);\r\n const arrayBuffer = await response.arrayBuffer();\r\n return { key, entry, arrayBuffer };\r\n } catch {\r\n // Can't fetch blob — leave the URL as-is (will break on reload,\r\n // but at least the project structure is preserved).\r\n return null;\r\n }\r\n })\r\n );\r\n for (const result of fetched) {\r\n if (!result) {\r\n continue;\r\n }\r\n const { key, entry, arrayBuffer } = result;\r\n const ext = GuessExtension(entry.url, IsTextureEntry(entry.url, entry.extension, entry.type));\r\n const filename = `assets/${key}${ext}`;\r\n files[filename] = new Uint8Array(arrayBuffer);\r\n projectAssets[key] = { ...entry, url: filename };\r\n }\r\n\r\n // Add companion .babylon if it exists\r\n if (bundle.companionBabylon) {\r\n const companionBuffer = await bundle.companionBabylon.arrayBuffer();\r\n const companionFilename = ProjectLocalsKey + \".babylon\";\r\n files[companionFilename] = new Uint8Array(companionBuffer);\r\n projectAssets[ProjectLocalsKey] = { url: companionFilename };\r\n }\r\n\r\n // Write the project JSON with updated asset paths\r\n const projectWithBundledPaths = {\r\n ...bundle.project,\r\n assets: projectAssets,\r\n };\r\n const { zip, strToU8 } = await import(\"fflate\");\r\n files[\"project.json\"] = strToU8(JSON.stringify(projectWithBundledPaths, null, 2));\r\n\r\n // Create the zip (async — runs in a Web Worker to avoid blocking the UI thread)\r\n const zipped = await new Promise<Uint8Array>((resolve, reject) => {\r\n zip(files, { level: 6 }, (err, data) => (err ? reject(err instanceof Error ? err : new Error(String(err))) : resolve(data)));\r\n });\r\n return new Blob([zipped as BlobPart], { type: \"application/zip\" });\r\n}\r\n\r\n/**\r\n * Loads a `.babylonproj` zip bundle into a scene. Extracts all files, creates\r\n * blob URLs for bundled assets, and loads the project through SAM.\r\n *\r\n * @param scene - The scene to load the project into.\r\n * @param zipFile - The `.babylonproj` zip file to load.\r\n */\r\nexport async function LoadProjectFileAsync(scene: Scene, zipFile: File): Promise<void> {\r\n const arrayBuffer = await zipFile.arrayBuffer();\r\n const { unzip, strFromU8 } = await import(\"fflate\");\r\n const extracted = await new Promise<Record<string, Uint8Array>>((resolve, reject) => {\r\n unzip(new Uint8Array(arrayBuffer), (err, data) => (err ? reject(err instanceof Error ? err : new Error(String(err))) : resolve(data)));\r\n });\r\n\r\n // Parse project.json\r\n const projectJsonBytes = extracted[\"project.json\"];\r\n if (!projectJsonBytes) {\r\n throw new Error(\"ProjectFile: Invalid project bundle — missing project.json\");\r\n }\r\n const projectJson = JSON.parse(strFromU8(projectJsonBytes));\r\n\r\n // Create blob URLs for all bundled files and rewrite asset URLs\r\n for (const [, entry] of Object.entries(projectJson.assets as Record<string, { url: string }>)) {\r\n const filename = entry.url;\r\n const fileBytes = extracted[filename];\r\n if (fileBytes) {\r\n const mimeType = GuessMimeType(filename);\r\n // Use a named File so LoadAssetContainerAsync can detect the\r\n // format from the filename (blob URLs alone have no extension).\r\n const file = new File([fileBytes as BlobPart], filename, { type: mimeType });\r\n const blobUrl = URL.createObjectURL(file);\r\n entry.url = blobUrl;\r\n }\r\n // If no file found in zip, assume the URL is a remote reference — leave it as-is\r\n }\r\n\r\n // Load through the standard JSON path\r\n await LoadProjectAsync(scene, projectJson);\r\n\r\n // Note: textures and scene files may still reference the blob URLs created\r\n // above, so we do NOT revoke them here. They'll be cleaned up when SAM disposes.\r\n}\r\n\r\n// ── Private ──\r\n\r\n/**\r\n * Returns true if a scene object is a \"local\" — not owned by any external\r\n * smart asset, or owned by the reserved `__project_locals__` key.\r\n * @param scene - The scene that owns the object.\r\n * @param obj - The scene object to check.\r\n * @returns True if the object should be included in the companion file.\r\n */\r\nfunction IsLocalObject(scene: Scene, obj: object): boolean {\r\n const key = FindSmartAssetKeyForObject(scene, obj as any);\r\n return key === undefined || key === ProjectLocalsKey;\r\n}\r\n\r\n/**\r\n * Builds a `.babylon`-compatible JSON containing all user-created scene\r\n * content (meshes, lights, cameras, transform nodes, and materials not owned\r\n * by any external smart asset), plus a side table recording which `*Texture`\r\n * slots on each material should be re-attached to which SmartAsset textures\r\n * after load.\r\n *\r\n * Mesh, light, camera, and standalone material serialization is delegated to\r\n * `SceneSerializer.SerializeMesh`, which auto-handles geometries, sub-materials,\r\n * and skeletons. Texture slots that map to a SmartAsset-tracked texture are\r\n * stripped from the serialized material so the `.babylon` loader never sees a\r\n * broken URL; the binding table is the sole source of truth for re-attachment.\r\n *\r\n * @param scene - The scene to extract locals from.\r\n * @returns The companion document and binding table, or null if there are no local objects.\r\n */\r\nfunction SerializeCompanionBabylon(scene: Scene): { companion: Record<string, unknown>; bindings: CompanionTextureBindings } | null {\r\n const meshes = scene.meshes.filter((m) => m instanceof Mesh && m.name !== \"__root__\" && IsLocalObject(scene, m));\r\n const lights = scene.lights.filter((l) => IsLocalObject(scene, l));\r\n const cameras = scene.cameras.filter((c) => IsLocalObject(scene, c));\r\n const transformNodes = scene.transformNodes.filter((t) => IsLocalObject(scene, t));\r\n\r\n // Standalone materials (not attached to any included mesh) need to be\r\n // added explicitly — SerializeMesh only picks up materials reachable from\r\n // the supplied meshes.\r\n const meshMaterialIds = new Set(meshes.map((m) => m.material?.uniqueId).filter((id): id is number => id !== undefined));\r\n const standaloneMaterials = scene.materials.filter((mat) => mat.name !== \"default material\" && IsLocalObject(scene, mat) && !meshMaterialIds.has(mat.uniqueId));\r\n\r\n if (meshes.length === 0 && lights.length === 0 && cameras.length === 0 && transformNodes.length === 0 && standaloneMaterials.length === 0) {\r\n return null;\r\n }\r\n\r\n const companion = SceneSerializer.SerializeMesh([...meshes, ...lights, ...cameras, ...transformNodes], false, false) as Record<string, unknown>;\r\n\r\n const allMaterials = (companion.materials as any[]) ?? [];\r\n companion.materials = allMaterials;\r\n for (const mat of standaloneMaterials) {\r\n const serialized = mat.serialize();\r\n if (serialized && !allMaterials.some((m: any) => m.uniqueId === serialized.uniqueId)) {\r\n allMaterials.push(serialized);\r\n }\r\n }\r\n\r\n // Strip non-JSON-serializable metadata (e.g. metadata that references\r\n // another scene object) to avoid `Converting circular structure to JSON`\r\n // when the companion is stringified. Simple JSON metadata is preserved.\r\n SanitizeMetadataInPlace(companion);\r\n\r\n // Walk every serialized material (mesh-attached + standalone + multi-material\r\n // children) and extract SmartAsset texture bindings, stripping those slots\r\n // from the serialized data.\r\n const bindings: CompanionTextureBindings = {};\r\n for (const serializedMat of allMaterials) {\r\n const matBindings = ExtractTextureBindings(scene, serializedMat);\r\n if (Object.keys(matBindings).length > 0 && typeof serializedMat.name === \"string\") {\r\n bindings[serializedMat.name] = matBindings;\r\n }\r\n }\r\n const multiMaterials = (companion.multiMaterials as any[]) ?? [];\r\n for (const serializedMat of multiMaterials) {\r\n const matBindings = ExtractTextureBindings(scene, serializedMat);\r\n if (Object.keys(matBindings).length > 0 && typeof serializedMat.name === \"string\") {\r\n bindings[serializedMat.name] = matBindings;\r\n }\r\n }\r\n\r\n return { companion, bindings };\r\n}\r\n\r\n/**\r\n * Walks the top-level entity arrays in a serialized companion document and\r\n * strips `metadata` fields that cannot be JSON-stringified (typically because\r\n * the user put a reference to another scene object in metadata). Simple\r\n * JSON-serializable metadata is preserved.\r\n * @param companion - The serialized companion document to mutate in-place.\r\n */\r\nfunction SanitizeMetadataInPlace(companion: Record<string, unknown>): void {\r\n const arrays: (keyof typeof companion)[] = [\"meshes\", \"transformNodes\", \"lights\", \"cameras\", \"materials\", \"multiMaterials\"];\r\n for (const arrayKey of arrays) {\r\n const arr = companion[arrayKey];\r\n if (!Array.isArray(arr)) {\r\n continue;\r\n }\r\n for (const item of arr) {\r\n if (item && typeof item === \"object\" && \"metadata\" in item && item.metadata !== undefined) {\r\n try {\r\n item.metadata = JSON.parse(JSON.stringify(item.metadata));\r\n } catch {\r\n delete item.metadata;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Walks a serialized material's `*Texture` slots and, for any that reference a\r\n * SmartAsset-tracked texture, records a `{slot: samKey}` binding and removes\r\n * the slot from the serialized data so the `.babylon` loader does not try to\r\n * fetch the (now-dead) original URL.\r\n * @param scene - The scene that owns the textures.\r\n * @param serializedMaterial - The serialized material data to rewrite in-place.\r\n * @returns A map of stripped slot names to their SmartAsset keys.\r\n */\r\nfunction ExtractTextureBindings(scene: Scene, serializedMaterial: Record<string, unknown>): Record<string, string> {\r\n const bindings: Record<string, string> = {};\r\n\r\n for (const [propName, propValue] of Object.entries(serializedMaterial)) {\r\n if (!propName.endsWith(\"Texture\") || typeof propValue !== \"object\" || propValue === null) {\r\n continue;\r\n }\r\n const texData = propValue as Record<string, unknown>;\r\n const texName = typeof texData.name === \"string\" ? texData.name : undefined;\r\n const texUrl = typeof texData.url === \"string\" ? texData.url : undefined;\r\n if (!texName && !texUrl) {\r\n continue;\r\n }\r\n\r\n for (const tex of scene.textures) {\r\n const key = FindSmartAssetKeyForObject(scene, tex);\r\n if (key && (tex.name === texName || (tex as any).url === texName || tex.name === texUrl || (tex as any).url === texUrl)) {\r\n bindings[propName] = key;\r\n delete serializedMaterial[propName];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return bindings;\r\n}\r\n\r\n/**\r\n * Re-attaches SmartAsset-tracked textures to user-created material slots\r\n * after the companion `.babylon` has loaded. Silently skips bindings whose\r\n * material or texture is no longer present (e.g. the underlying SmartAsset\r\n * was removed before reload).\r\n * @param scene - The scene that owns the materials and textures.\r\n * @param bindings - The binding table from the project document.\r\n */\r\nfunction ApplyCompanionBindings(scene: Scene, bindings: CompanionTextureBindings): void {\r\n for (const [materialName, slots] of Object.entries(bindings)) {\r\n const mat = scene.materials.find((m) => m.name === materialName);\r\n if (!mat) {\r\n continue;\r\n }\r\n for (const [slotName, samKey] of Object.entries(slots)) {\r\n const texture = scene.textures.find((tex) => FindSmartAssetKeyForObject(scene, tex) === samKey);\r\n if (texture) {\r\n (mat as any)[slotName] = texture;\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Returns true if a serialized asset entry refers to a standalone texture,\r\n * based on the registered options or the URL extension.\r\n * @param url - The asset URL.\r\n * @param extension - Optional explicit extension hint from the registration options.\r\n * @param type - Optional explicit type from the registration options.\r\n * @returns True if the entry should be treated as a texture.\r\n */\r\nfunction IsTextureEntry(url: string, extension: string | undefined, type: string | undefined): boolean {\r\n if (type === \"texture\") {\r\n return true;\r\n }\r\n const textureExts = GetSmartAssetTextureExtensions();\r\n if (extension && textureExts.has(extension.toLowerCase())) {\r\n return true;\r\n }\r\n const ext = ExtractExtension(url);\r\n return ext !== \"\" && textureExts.has(ext);\r\n}\r\n\r\n/**\r\n * Extracts the file extension (with leading dot, lowercased) from a URL,\r\n * stripping query/hash and ignoring blob/data prefixes.\r\n * @param url - The URL to inspect.\r\n * @returns The extension including the leading dot, or \"\" if none found.\r\n */\r\nfunction ExtractExtension(url: string): string {\r\n if (url.startsWith(\"blob:\") || url.startsWith(\"data:\")) {\r\n return \"\";\r\n }\r\n const clean = url.split(\"?\")[0].split(\"#\")[0];\r\n const lastDot = clean.lastIndexOf(\".\");\r\n const lastSlash = Math.max(clean.lastIndexOf(\"/\"), clean.lastIndexOf(\"\\\\\"));\r\n if (lastDot > lastSlash && lastDot >= 0) {\r\n return clean.substring(lastDot).toLowerCase();\r\n }\r\n return \"\";\r\n}\r\n\r\n/**\r\n * Guesses a file extension for a blob/data URL when bundling into the zip.\r\n * @param url - The original URL.\r\n * @param isTexture - Whether the key is known to be a texture.\r\n * @returns A file extension including the dot (e.g. \".glb\", \".png\").\r\n */\r\nfunction GuessExtension(url: string, isTexture: boolean): string {\r\n // Try to extract from data URI mime type\r\n if (url.startsWith(\"data:\")) {\r\n const mimeMatch = url.match(/^data:([^;,]+)/);\r\n if (mimeMatch) {\r\n const ext = MimeToExtension(mimeMatch[1]);\r\n if (ext) {\r\n return ext;\r\n }\r\n }\r\n }\r\n return isTexture ? \".png\" : \".glb\";\r\n}\r\n\r\n// Tuple-array `Map`s rather than object literals so the MIME and extension\r\n// keys (e.g. \"model/gltf-binary\", \".glb\") don't trigger the naming-convention\r\n// rule that runs on object-literal property names.\r\nconst MimeToExtensionMap = new Map<string, string>([\r\n [\"model/gltf-binary\", \".glb\"],\r\n [\"model/gltf+json\", \".gltf\"],\r\n [\"image/png\", \".png\"],\r\n [\"image/jpeg\", \".jpg\"],\r\n [\"image/webp\", \".webp\"],\r\n [\"application/octet-stream\", \".glb\"],\r\n [\"application/json\", \".babylon\"],\r\n]);\r\n\r\nconst ExtensionToMimeMap = new Map<string, string>([\r\n [\".glb\", \"model/gltf-binary\"],\r\n [\".gltf\", \"model/gltf+json\"],\r\n [\".babylon\", \"application/json\"],\r\n [\".png\", \"image/png\"],\r\n [\".jpg\", \"image/jpeg\"],\r\n [\".jpeg\", \"image/jpeg\"],\r\n [\".env\", \"application/octet-stream\"],\r\n [\".hdr\", \"application/octet-stream\"],\r\n [\".dds\", \"application/octet-stream\"],\r\n [\".ktx\", \"application/octet-stream\"],\r\n [\".ktx2\", \"application/octet-stream\"],\r\n [\".json\", \"application/json\"],\r\n]);\r\n\r\n/**\r\n * Maps a MIME type to a file extension.\r\n * @param mime - The MIME type string.\r\n * @returns The file extension including the dot, or empty string if unknown.\r\n */\r\nfunction MimeToExtension(mime: string): string {\r\n return MimeToExtensionMap.get(mime) ?? \"\";\r\n}\r\n\r\n/**\r\n * Guesses a MIME type from a filename.\r\n * @param filename - The filename to check.\r\n * @returns The guessed MIME type string.\r\n */\r\nfunction GuessMimeType(filename: string): string {\r\n const ext = filename.substring(filename.lastIndexOf(\".\")).toLowerCase();\r\n return ExtensionToMimeMap.get(ext) ?? \"application/octet-stream\";\r\n}\r\n"]}