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,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({
+23 -16
View File
@@ -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(
+1 -2
View File
@@ -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]);