import * as THREE from "three"; import { Geometry, Base, Subtraction } from "@react-three/csg"; import { useDeleteTool } from "../../../store/store"; import { useRef } from "react"; export interface CsgProps { position: THREE.Vector3 | [number, number, number]; scale: THREE.Vector3 | [number, number, number]; model: THREE.Object3D; hoveredDeletableWallItem: { current: THREE.Mesh | null }; } export const Csg: React.FC = (props) => { const { deleteTool } = useDeleteTool(); const modelRef = useRef(); const originalMaterials = useRef>(new Map()); const handleHover = (hovered: boolean, object: THREE.Mesh | null) => { if (modelRef.current && deleteTool) { modelRef.current.traverse((child) => { if (child instanceof THREE.Mesh) { if (!originalMaterials.current.has(child)) { originalMaterials.current.set(child, child.material); } child.material = child.material.clone(); child.material.color.set(hovered && deleteTool ? 0xff0000 : (originalMaterials.current.get(child) as any).color); } }); } props.hoveredDeletableWallItem.current = hovered ? object : null; }; return ( { e.stopPropagation(); handleHover(true, e.object.parent); }} onPointerOut={(e: any) => { e.stopPropagation(); handleHover(false, null); }} /> ); };