import { useState, useCallback } from "react";
import { useThree } from "@react-three/fiber";
import { useSelectionHighlight } from "mujoco-react";
function useClickSelect(): number | null {
const [selectedBodyId, setSelectedBodyId] = useState<number | null>(null);
const { scene, camera, gl } = useThree();
const handleDoubleClick = useCallback((event: MouseEvent) => {
const rect = gl.domElement.getBoundingClientRect();
const mouse = new THREE.Vector2(
((event.clientX - rect.left) / rect.width) * 2 - 1,
-((event.clientY - rect.top) / rect.height) * 2 + 1
);
const raycaster = new THREE.Raycaster();
raycaster.setFromCamera(mouse, camera);
const intersects = raycaster.intersectObjects(scene.children, true);
for (const hit of intersects) {
let obj = hit.object;
while (obj) {
if (obj.userData?.bodyID != null) {
setSelectedBodyId(obj.userData.bodyID);
return;
}
obj = obj.parent!;
}
}
setSelectedBodyId(null);
}, [scene, camera, gl]);
useEffect(() => {
gl.domElement.addEventListener("dblclick", handleDoubleClick);
return () => gl.domElement.removeEventListener("dblclick", handleDoubleClick);
}, [gl, handleDoubleClick]);
return selectedBodyId;
}