fix: harden merged map resource cleanup

This commit is contained in:
Tom Boullay
2026-05-24 23:51:28 +02:00
parent f035195b56
commit 1f6335092a
3 changed files with 47 additions and 34 deletions
@@ -89,7 +89,8 @@ function createMergedMeshes(scene: THREE.Group): MergedMeshData[] {
}); });
}); });
return [...groups.values()].map((group) => { return [...groups.values()]
.map((group) => {
if (group.geometries.length === 1) { if (group.geometries.length === 1) {
return { return {
geometry: group.geometries[0] as THREE.BufferGeometry, geometry: group.geometries[0] as THREE.BufferGeometry,
@@ -103,11 +104,17 @@ function createMergedMeshes(scene: THREE.Group): MergedMeshData[] {
sourceGeometry.dispose(); sourceGeometry.dispose();
} }
if (!geometry) {
disposeMaterial(group.material);
return null;
}
return { return {
geometry, geometry,
material: group.material, material: group.material,
}; };
}); })
.filter((meshData): meshData is MergedMeshData => meshData !== null);
} }
export function EcoleModel({ export function EcoleModel({
@@ -93,7 +93,8 @@ function extractMeshes(scene: THREE.Group): MeshData[] {
}); });
}); });
return [...groups.values()].map((group) => { return [...groups.values()]
.map((group) => {
if (group.geometries.length === 1) { if (group.geometries.length === 1) {
return { return {
geometry: group.geometries[0] as THREE.BufferGeometry, geometry: group.geometries[0] as THREE.BufferGeometry,
@@ -107,11 +108,17 @@ function extractMeshes(scene: THREE.Group): MeshData[] {
geometry.dispose(); geometry.dispose();
} }
if (!mergedGeometry) {
disposeMaterialOnly(group.material);
return null;
}
return { return {
geometry: mergedGeometry, geometry: mergedGeometry,
material: group.material, material: group.material,
}; };
}); })
.filter((meshData): meshData is MeshData => meshData !== null);
} }
function setInstanceMatrices( function setInstanceMatrices(
+1 -2
View File
@@ -3,7 +3,6 @@ import * as THREE from "three";
import { useGLTF } from "@react-three/drei"; import { useGLTF } from "@react-three/drei";
import { mergeGeometries } from "three/addons/utils/BufferGeometryUtils.js"; import { mergeGeometries } from "three/addons/utils/BufferGeometryUtils.js";
import type { VegetationInstance } from "@/world/vegetation/useVegetationData"; import type { VegetationInstance } from "@/world/vegetation/useVegetationData";
import { disposeInstancedMesh } from "@/utils/three/dispose";
interface InstancedVegetationProps { interface InstancedVegetationProps {
modelPath: string; modelPath: string;
@@ -143,7 +142,7 @@ export function InstancedVegetation({
return () => { return () => {
for (const mesh of instancedMeshes) { for (const mesh of instancedMeshes) {
group.remove(mesh); group.remove(mesh);
disposeInstancedMesh(mesh); mesh.dispose();
} }
}; };
}, [instancedMeshes]); }, [instancedMeshes]);