- Updated `loadInitialFloorItems.ts` to streamline event data processing for StaticMachine and ArmBot types. - Enhanced `copyPasteControls.tsx` and `duplicationControls.tsx` to support StaticMachine and ArmBot event data creation with proper UUID generation. - Modified `moveControls.tsx`, `rotateControls.tsx`, and `transformControls.tsx` to include event data in the state. - Improved `pathConnector.tsx` to handle connections for StaticMachine and ArmBot types, including deletion functionality. - Updated store management to rename `useDeleteModels` to `useDeleteTool` for clarity. - Adjusted type definitions in `worldTypes.d.ts` to include StaticMachine and ArmBot event schemas.
55 lines
1.8 KiB
TypeScript
55 lines
1.8 KiB
TypeScript
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<CsgProps> = (props) => {
|
|
const { deleteTool } = useDeleteTool();
|
|
const modelRef = useRef<THREE.Object3D>();
|
|
const originalMaterials = useRef<Map<THREE.Mesh, THREE.Material>>(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 (
|
|
<Geometry>
|
|
<Subtraction {...props}>
|
|
<Geometry>
|
|
<Base geometry={new THREE.BoxGeometry()} />
|
|
</Geometry>
|
|
</Subtraction>
|
|
<primitive
|
|
object={props.model}
|
|
ref={modelRef}
|
|
onPointerOver={(e: any) => {
|
|
e.stopPropagation();
|
|
handleHover(true, e.object.parent);
|
|
}}
|
|
onPointerOut={(e: any) => {
|
|
e.stopPropagation();
|
|
handleHover(false, null);
|
|
}}
|
|
/>
|
|
</Geometry>
|
|
);
|
|
};
|