move controls snapping and slow movement added

This commit is contained in:
2025-08-14 14:43:05 +05:30
parent 75f77c4204
commit 594445ac20
2 changed files with 90 additions and 43 deletions

View File

@@ -5,7 +5,7 @@ import { useSelectedAssets, useSocketStore, useToggleView, } from "../../../../.
import * as Types from "../../../../../types/world/worldTypes";
import { detectModifierKeys } from "../../../../../utils/shortcutkeys/detectModifierKeys";
import { upsertProductOrEventApi } from "../../../../../services/simulation/products/UpsertProductOrEventApi";
import { snapControls } from "../../../../../utils/handleSnap";
import { getSnappedBasePosition } from "../../../../../utils/handleSnap";
import DistanceFindingControls from "./distanceFindingControls";
import { useParams } from "react-router-dom";
import { useProductContext } from "../../../../simulation/products/productContext";
@@ -49,6 +49,10 @@ function MoveControls3D({
const [initialStates, setInitialStates] = useState<Record<string, { position: THREE.Vector3; rotation?: THREE.Euler; }>>({});
const [isMoving, setIsMoving] = useState(false);
const mouseButtonsDown = useRef<{ left: boolean; right: boolean }>({ left: false, right: false, });
// Add a ref to track fine-move base
const fineMoveBaseRef = useRef<THREE.Vector3 | null>(null);
const lastPointerPositionRef = useRef<THREE.Vector3 | null>(null);
const wasShiftHeldRef = useRef(false);
const updateBackend = (
productName: string,
@@ -78,10 +82,21 @@ function MoveControls3D({
};
const onKeyUp = (event: KeyboardEvent) => {
const isModifierKey = (!event.shiftKey && !event.ctrlKey);
const keyCombination = detectModifierKeys(event);
if (isModifierKey && keyEvent !== "") {
if (keyCombination === "") {
setKeyEvent("");
} else if (keyCombination === "Ctrl" || keyCombination === "Ctrl+Shift" || keyCombination === "Shift") {
setKeyEvent(keyCombination);
}
if (movedObjects[0]) {
const intersectionPoint = new THREE.Vector3();
raycaster.setFromCamera(pointer, camera);
const hit = raycaster.ray.intersectPlane(plane, intersectionPoint);
if (hit) {
const newOffset = calculateDragOffset(movedObjects[0], intersectionPoint);
setDragOffset(newOffset);
}
}
};
@@ -231,30 +246,9 @@ function MoveControls3D({
}
if (dragOffset) {
let rawBasePosition = new THREE.Vector3().addVectors(intersectionPoint, dragOffset);
const rawBasePosition = new THREE.Vector3().addVectors(intersectionPoint, dragOffset);
if (axisConstraint) {
const currentBasePosition = movedObjects[0].position.clone();
if (axisConstraint === 'x') {
rawBasePosition = new THREE.Vector3(rawBasePosition.x, currentBasePosition.y, currentBasePosition.z);
} else if (axisConstraint === 'z') {
rawBasePosition = new THREE.Vector3(currentBasePosition.x, currentBasePosition.y, rawBasePosition.z);
}
}
let moveDistance = keyEvent.includes("Shift") ? 0.05 : 1;
const initialBasePosition = initialPositions[movedObjects[0].uuid];
const positionDifference = new THREE.Vector3().subVectors(rawBasePosition, initialBasePosition);
let adjustedDifference = positionDifference.multiplyScalar(moveDistance);
const baseNewPosition = new THREE.Vector3().addVectors(initialBasePosition, adjustedDifference);
if (keyEvent.includes("Ctrl")) {
baseNewPosition.x = snapControls(baseNewPosition.x, keyEvent);
baseNewPosition.z = snapControls(baseNewPosition.z, keyEvent);
}
const baseNewPosition = getSnappedBasePosition({ rawBasePosition, intersectionPoint, movedObjects, axisConstraint, keyEvent, fineMoveBaseRef, lastPointerPositionRef, wasShiftHeldRef });
movedObjects.forEach((movedAsset: THREE.Object3D) => {
if (movedAsset.userData.modelUuid) {