fix: descartar geometrias clonadas do notebook

This commit is contained in:
Evandro Fonseca Junior committed 2026-08-31 00:18:48 -03:00
1 parent 1c1a6d5c6d
commit bb4bf8e7e2
1 file changed
+16 -15
+16 -15
View File
@@ -63,15 +63,20 @@ function createMaterials(): MaterialMap {
}; };
} }
function cloneNotebookScene(scene: THREE.Object3D): { type ClonedNotebookScene = {
root: THREE.Object3D; root: THREE.Object3D;
materials: MaterialMap; materials: MaterialMap;
} { meshes: THREE.Mesh[];
};
function cloneNotebookScene(scene: THREE.Object3D): ClonedNotebookScene {
const root = scene.clone(true); const root = scene.clone(true);
const materials = createMaterials(); const materials = createMaterials();
const meshes: THREE.Mesh[] = [];
root.traverse((object) => { root.traverse((object) => {
if (!(object instanceof THREE.Mesh)) return; if (!(object instanceof THREE.Mesh)) return;
meshes.push(object);
object.geometry = object.geometry.clone(); object.geometry = object.geometry.clone();
const sourceMaterial = Array.isArray(object.material) const sourceMaterial = Array.isArray(object.material)
@@ -87,7 +92,7 @@ function cloneNotebookScene(scene: THREE.Object3D): {
object.frustumCulled = false; object.frustumCulled = false;
}); });
return { root, materials }; return { root, materials, meshes };
} }
function updateMaterialOpacity(materials: MaterialMap, opacity: number) { function updateMaterialOpacity(materials: MaterialMap, opacity: number) {
@@ -96,14 +101,13 @@ function updateMaterialOpacity(materials: MaterialMap, opacity: number) {
materials.screen.opacity = opacity; materials.screen.opacity = opacity;
} }
function disposeNotebookScene(root: THREE.Object3D, materials: MaterialMap) { function disposeNotebookScene(cloned: ClonedNotebookScene) {
root.traverse((object) => { for (const mesh of cloned.meshes) {
if (!(object instanceof THREE.Mesh)) return; mesh.geometry.dispose();
object.geometry.dispose(); }
}); cloned.materials.body.dispose();
materials.body.dispose(); cloned.materials.frame.dispose();
materials.frame.dispose(); cloned.materials.screen.dispose();
materials.screen.dispose();
} }
function LoadingNotebook() { function LoadingNotebook() {
@@ -196,10 +200,7 @@ function NotebookScene({
} }
}); });
useEffect( useEffect(() => () => disposeNotebookScene(cloned), [cloned]);
() => () => disposeNotebookScene(cloned.root, cloned.materials),
[cloned],
);
return ( return (
<group ref={rig}> <group ref={rig}>