diff --git a/src/components/three/models/generated/EcoleModel.tsx b/src/components/three/models/generated/EcoleModel.tsx index e165e79..970d16f 100644 --- a/src/components/three/models/generated/EcoleModel.tsx +++ b/src/components/three/models/generated/EcoleModel.tsx @@ -89,25 +89,32 @@ function createMergedMeshes(scene: THREE.Group): MergedMeshData[] { }); }); - return [...groups.values()].map((group) => { - if (group.geometries.length === 1) { + return [...groups.values()] + .map((group) => { + if (group.geometries.length === 1) { + return { + geometry: group.geometries[0] as THREE.BufferGeometry, + material: group.material, + }; + } + + const geometry = mergeGeometries(group.geometries, false); + + for (const sourceGeometry of group.geometries) { + sourceGeometry.dispose(); + } + + if (!geometry) { + disposeMaterial(group.material); + return null; + } + return { - geometry: group.geometries[0] as THREE.BufferGeometry, + geometry, material: group.material, }; - } - - const geometry = mergeGeometries(group.geometries, false); - - for (const sourceGeometry of group.geometries) { - sourceGeometry.dispose(); - } - - return { - geometry, - material: group.material, - }; - }); + }) + .filter((meshData): meshData is MergedMeshData => meshData !== null); } export function EcoleModel({ diff --git a/src/world/map-instancing/InstancedMapAsset.tsx b/src/world/map-instancing/InstancedMapAsset.tsx index 640d465..dfd695f 100644 --- a/src/world/map-instancing/InstancedMapAsset.tsx +++ b/src/world/map-instancing/InstancedMapAsset.tsx @@ -93,25 +93,32 @@ function extractMeshes(scene: THREE.Group): MeshData[] { }); }); - return [...groups.values()].map((group) => { - if (group.geometries.length === 1) { + return [...groups.values()] + .map((group) => { + if (group.geometries.length === 1) { + return { + geometry: group.geometries[0] as THREE.BufferGeometry, + material: group.material, + }; + } + + const mergedGeometry = mergeGeometries(group.geometries, false); + + for (const geometry of group.geometries) { + geometry.dispose(); + } + + if (!mergedGeometry) { + disposeMaterialOnly(group.material); + return null; + } + return { - geometry: group.geometries[0] as THREE.BufferGeometry, + geometry: mergedGeometry, material: group.material, }; - } - - const mergedGeometry = mergeGeometries(group.geometries, false); - - for (const geometry of group.geometries) { - geometry.dispose(); - } - - return { - geometry: mergedGeometry, - material: group.material, - }; - }); + }) + .filter((meshData): meshData is MeshData => meshData !== null); } function setInstanceMatrices( diff --git a/src/world/vegetation/InstancedVegetation.tsx b/src/world/vegetation/InstancedVegetation.tsx index 9edb773..847ebfc 100644 --- a/src/world/vegetation/InstancedVegetation.tsx +++ b/src/world/vegetation/InstancedVegetation.tsx @@ -3,7 +3,6 @@ import * as THREE from "three"; import { useGLTF } from "@react-three/drei"; import { mergeGeometries } from "three/addons/utils/BufferGeometryUtils.js"; import type { VegetationInstance } from "@/world/vegetation/useVegetationData"; -import { disposeInstancedMesh } from "@/utils/three/dispose"; interface InstancedVegetationProps { modelPath: string; @@ -143,7 +142,7 @@ export function InstancedVegetation({ return () => { for (const mesh of instancedMeshes) { group.remove(mesh); - disposeInstancedMesh(mesh); + mesh.dispose(); } }; }, [instancedMeshes]);