From d8205b0301526d1357504eb816f75e663fa96186 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Mon, 18 May 2026 15:59:52 +0200 Subject: [PATCH] Clean up material references when deleting project assets --- src/assets/delete-project-asset.ts | 39 ++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/assets/delete-project-asset.ts b/src/assets/delete-project-asset.ts index ccc200b1..c93cabab 100644 --- a/src/assets/delete-project-asset.ts +++ b/src/assets/delete-project-asset.ts @@ -4,6 +4,45 @@ import { foliagePrototypeReferencesProjectAsset } from "../foliage/foliage"; import type { ProjectAssetRecord } from "./project-assets"; +function cleanupMaterialsForDeletedAsset( + materials: ProjectDocument["materials"], + asset: ProjectAssetRecord +): ProjectDocument["materials"] { + if (asset.kind !== "image") { + return materials; + } + + let didChange = false; + const nextMaterials: ProjectDocument["materials"] = {}; + + for (const [materialId, material] of Object.entries(materials)) { + if (material.kind !== "custom") { + nextMaterials[materialId] = material; + continue; + } + + const nextTextures = { ...material.textures }; + let didChangeMaterial = false; + + for (const slot of ["albedo", "normal", "roughness", "metallic"] as const) { + if (nextTextures[slot]?.assetId === asset.id) { + nextTextures[slot] = null; + didChange = true; + didChangeMaterial = true; + } + } + + nextMaterials[materialId] = didChangeMaterial + ? { + ...material, + textures: nextTextures + } + : material; + } + + return didChange ? nextMaterials : materials; +} + function removeInvalidatedInteractionLinks( interactionLinks: ProjectScene["interactionLinks"], removedModelInstanceIds: ReadonlySet,