fix: descartar geometrias clonadas do notebook
This commit is contained in:
1 parent
1c1a6d5c6d
commit
bb4bf8e7e2
1 file changed
+16
-15
@@ -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}>
|
||||||
|
|||||||
Reference in new issue
Block a user