fix(review): address audit findings before merge
🔍 Lint / 🪄 Check lint (pull_request) Has been cancelled
🔍 Lint / 🎨 Check format (pull_request) Has been cancelled
🔍 Lint / 🔎 Typecheck (pull_request) Has been cancelled
📊 Quality / 🔒 Security Audit (pull_request) Has been cancelled
📊 Quality / 📋 Dependency Freshness (pull_request) Has been cancelled
📊 Quality / 📦 Bundle Size (pull_request) Has been cancelled
🔍 Lint / 🏗 Build (pull_request) Has been cancelled
🔍 Lint / 🪄 Check lint (pull_request) Has been cancelled
🔍 Lint / 🎨 Check format (pull_request) Has been cancelled
🔍 Lint / 🔎 Typecheck (pull_request) Has been cancelled
📊 Quality / 🔒 Security Audit (pull_request) Has been cancelled
📊 Quality / 📋 Dependency Freshness (pull_request) Has been cancelled
📊 Quality / 📦 Bundle Size (pull_request) Has been cancelled
🔍 Lint / 🏗 Build (pull_request) Has been cancelled
This commit is contained in:
@@ -2,29 +2,53 @@ import { useEffect, useMemo } from "react";
|
||||
import * as THREE from "three";
|
||||
import { disposeObject3D } from "@/utils/three/dispose";
|
||||
|
||||
function cloneObjectWithOwnedResources<T extends THREE.Object3D>(object: T): T {
|
||||
interface UseClonedObjectOptions {
|
||||
cloneResources?: boolean;
|
||||
}
|
||||
|
||||
function cloneMaterial(
|
||||
material: THREE.Material | THREE.Material[],
|
||||
): THREE.Material | THREE.Material[] {
|
||||
return Array.isArray(material)
|
||||
? material.map((item) => item.clone())
|
||||
: material.clone();
|
||||
}
|
||||
|
||||
function cloneObject<T extends THREE.Object3D>(
|
||||
object: T,
|
||||
cloneResources: boolean,
|
||||
): T {
|
||||
const clone = object.clone(true) as T;
|
||||
|
||||
if (!cloneResources) return clone;
|
||||
|
||||
clone.traverse((child) => {
|
||||
if (!(child instanceof THREE.Mesh)) return;
|
||||
|
||||
child.geometry = child.geometry.clone();
|
||||
child.material = Array.isArray(child.material)
|
||||
? child.material.map((material) => material.clone())
|
||||
: child.material.clone();
|
||||
child.material = cloneMaterial(child.material);
|
||||
});
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
export function useClonedObject<T extends THREE.Object3D>(object: T): T {
|
||||
const clone = useMemo(() => cloneObjectWithOwnedResources(object), [object]);
|
||||
export function useClonedObject<T extends THREE.Object3D>(
|
||||
object: T,
|
||||
options: UseClonedObjectOptions = {},
|
||||
): T {
|
||||
const cloneResources = options.cloneResources ?? false;
|
||||
const clone = useMemo(
|
||||
() => cloneObject(object, cloneResources),
|
||||
[cloneResources, object],
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
if (!cloneResources) return undefined;
|
||||
|
||||
return () => {
|
||||
disposeObject3D(clone);
|
||||
};
|
||||
}, [clone]);
|
||||
}, [clone, cloneResources]);
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user