Dwinzo_dev/app/src/modules/builder/groups/floorGroup.tsx

113 lines
3.3 KiB
TypeScript
Raw Normal View History

2025-03-25 12:04:20 +00:00
import { useFrame, useThree } from "@react-three/fiber";
import {
useAddAction,
useDeleteTool,
useRoofVisibility,
useToggleView,
useWallVisibility,
useUpdateScene,
} from "../../../store/store";
2025-03-25 12:04:20 +00:00
import hideRoof from "../geomentries/roofs/hideRoof";
import hideWalls from "../geomentries/walls/hideWalls";
import addAndUpdateReferencePillar from "../geomentries/pillars/addAndUpdateReferencePillar";
import { useEffect } from "react";
import addPillar from "../geomentries/pillars/addPillar";
import DeletePillar from "../geomentries/pillars/deletePillar";
import DeletableHoveredPillar from "../geomentries/pillars/deletableHoveredPillar";
import loadFloor from "../geomentries/floors/loadFloor";
const FloorGroup = ({
floorGroup,
lines,
referencePole,
hoveredDeletablePillar,
}: any) => {
const state = useThree();
const { roofVisibility } = useRoofVisibility();
const { wallVisibility } = useWallVisibility();
const { toggleView } = useToggleView();
const { scene, camera, raycaster, gl } = useThree();
const { addAction } = useAddAction();
const { deleteTool } = useDeleteTool();
const { updateScene, setUpdateScene } = useUpdateScene();
2025-03-25 12:04:20 +00:00
useEffect(() => {
if (updateScene) {
loadFloor(lines, floorGroup);
setUpdateScene(false);
}
}, [updateScene]);
2025-03-25 12:04:20 +00:00
useEffect(() => {
if (!addAction) {
if (referencePole.current) {
(referencePole.current as any).material.dispose();
(referencePole.current.geometry as any).dispose();
floorGroup.current.remove(referencePole.current);
referencePole.current = undefined;
}
}
}, [addAction]);
2025-03-25 12:04:20 +00:00
useEffect(() => {
const canvasElement = gl.domElement;
let drag = false;
let isLeftMouseDown = false;
2025-03-25 12:04:20 +00:00
const onMouseDown = (evt: any) => {
if (evt.button === 0) {
isLeftMouseDown = true;
drag = false;
}
};
2025-03-25 12:04:20 +00:00
const onMouseUp = (evt: any) => {
if (evt.button === 0) {
isLeftMouseDown = false;
if (!drag) {
if (addAction === "pillar") {
addPillar(referencePole, floorGroup);
}
if (deleteTool) {
DeletePillar(hoveredDeletablePillar, floorGroup);
}
}
}
};
2025-03-25 12:04:20 +00:00
const onMouseMove = () => {
if (isLeftMouseDown) {
drag = true;
}
};
2025-03-25 12:04:20 +00:00
canvasElement.addEventListener("mousedown", onMouseDown);
canvasElement.addEventListener("mouseup", onMouseUp);
canvasElement.addEventListener("mousemove", onMouseMove);
2025-03-25 12:04:20 +00:00
return () => {
canvasElement.removeEventListener("mousedown", onMouseDown);
canvasElement.removeEventListener("mouseup", onMouseUp);
canvasElement.removeEventListener("mousemove", onMouseMove);
};
}, [deleteTool, addAction]);
2025-03-25 12:04:20 +00:00
useFrame(() => {
hideRoof(roofVisibility, floorGroup, camera);
hideWalls(wallVisibility, scene, camera);
2025-03-25 12:04:20 +00:00
if (addAction === "pillar") {
addAndUpdateReferencePillar(raycaster, floorGroup, referencePole);
}
if (deleteTool) {
DeletableHoveredPillar(state, floorGroup, hoveredDeletablePillar);
}
});
2025-03-25 12:04:20 +00:00
return (
<group ref={floorGroup} visible={!toggleView} name="floorGroup"></group>
);
};
2025-03-25 12:04:20 +00:00
export default FloorGroup;