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;
|
||||
materials: MaterialMap;
|
||||
} {
|
||||
meshes: THREE.Mesh[];
|
||||
};
|
||||
|
||||
function cloneNotebookScene(scene: THREE.Object3D): ClonedNotebookScene {
|
||||
const root = scene.clone(true);
|
||||
const materials = createMaterials();
|
||||
const meshes: THREE.Mesh[] = [];
|
||||
|
||||
root.traverse((object) => {
|
||||
if (!(object instanceof THREE.Mesh)) return;
|
||||
meshes.push(object);
|
||||
|
||||
object.geometry = object.geometry.clone();
|
||||
const sourceMaterial = Array.isArray(object.material)
|
||||
@@ -87,7 +92,7 @@ function cloneNotebookScene(scene: THREE.Object3D): {
|
||||
object.frustumCulled = false;
|
||||
});
|
||||
|
||||
return { root, materials };
|
||||
return { root, materials, meshes };
|
||||
}
|
||||
|
||||
function updateMaterialOpacity(materials: MaterialMap, opacity: number) {
|
||||
@@ -96,14 +101,13 @@ function updateMaterialOpacity(materials: MaterialMap, opacity: number) {
|
||||
materials.screen.opacity = opacity;
|
||||
}
|
||||
|
||||
function disposeNotebookScene(root: THREE.Object3D, materials: MaterialMap) {
|
||||
root.traverse((object) => {
|
||||
if (!(object instanceof THREE.Mesh)) return;
|
||||
object.geometry.dispose();
|
||||
});
|
||||
materials.body.dispose();
|
||||
materials.frame.dispose();
|
||||
materials.screen.dispose();
|
||||
function disposeNotebookScene(cloned: ClonedNotebookScene) {
|
||||
for (const mesh of cloned.meshes) {
|
||||
mesh.geometry.dispose();
|
||||
}
|
||||
cloned.materials.body.dispose();
|
||||
cloned.materials.frame.dispose();
|
||||
cloned.materials.screen.dispose();
|
||||
}
|
||||
|
||||
function LoadingNotebook() {
|
||||
@@ -196,10 +200,7 @@ function NotebookScene({
|
||||
}
|
||||
});
|
||||
|
||||
useEffect(
|
||||
() => () => disposeNotebookScene(cloned.root, cloned.materials),
|
||||
[cloned],
|
||||
);
|
||||
useEffect(() => () => disposeNotebookScene(cloned), [cloned]);
|
||||
|
||||
return (
|
||||
<group ref={rig}>
|
||||
|
||||
Reference in new issue
Block a user