From 2f745a16d11141dac87210c73f208ba2e05405de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 12 May 2026 18:08:02 -0500 Subject: [PATCH] clean up --- packages/website/src/hooks/useDispose.ts | 85 ++++++++++-------------- 1 file changed, 34 insertions(+), 51 deletions(-) diff --git a/packages/website/src/hooks/useDispose.ts b/packages/website/src/hooks/useDispose.ts index dffe2dc81..2ff4e3685 100644 --- a/packages/website/src/hooks/useDispose.ts +++ b/packages/website/src/hooks/useDispose.ts @@ -1,62 +1,45 @@ -import { useLoader } from "@react-three/fiber"; +import { useLoader, type ObjectMap } from "@react-three/fiber"; import { useEffect } from "react"; -import { Cache } from "three"; -import { GLTFLoader } from "three-stdlib"; +import { Cache, Group, Mesh, MeshStandardMaterial, Object3D } from "three"; +import { GLTFLoader, type GLTF } from "three-stdlib"; -export function useDispose(gltf: any, path: string) { +export function useDispose(gltf: GLTF & ObjectMap, path: string) { useEffect(() => { return () => { - const disposedGeometries = new Set(); - const disposedMaterials = new Set(); - const disposedTextures = new Set(); + gltf.scene.traverse((object) => { + if (object instanceof Mesh) { + if (object.material instanceof MeshStandardMaterial) { + const maps = [ + object.material.map, + object.material.aoMap, + object.material.envMap, + object.material.bumpMap, + object.material.alphaMap, + object.material.lightMap, + object.material.normalMap, + object.material.emissiveMap, + object.material.roughnessMap, + object.material.metalnessMap, + object.material.displacementMap, + ]; - gltf.scene.traverse((obj: any) => { - if (obj.geometry) { - const geometry = obj.geometry; + for (const map of maps) { + if (!map) continue; - if (!disposedGeometries.has(geometry.uuid)) { - disposedGeometries.add(geometry.uuid); - geometry.dispose(); - } - } - - if (obj.material) { - const materials = Array.isArray(obj.material) - ? obj.material - : [obj.material]; - - for (const material of materials) { - if (!disposedMaterials.has(material.uuid)) { - disposedMaterials.add(material.uuid); - - for (const key in material) { - const value = material[key]; - - if ( - value && - value.isTexture && - !disposedTextures.has(value.uuid) - ) { - disposedTextures.add(value.uuid); - } - } - - for (const key in material) { - const value = material[key]; - - if (value && value.isTexture) { - value.source.data.close(); - value.dispose(); - } - } - - material.dispose(); + map.source.data.close(); + map.dispose(); } - } - } - if (obj.skeleton) { - obj.skeleton.dispose?.(); + object.material.dispose(); + } else { + throw new TypeError( + `Unexpected material type: ${object.material.type}`, + ); + } + } else if (object instanceof Group || object instanceof Object3D) { + // traverse will get children + } else { + throw new TypeError(`Unexpected object type: ${object}`); } });