Refactor action handling in simulation components for improved clarity and efficiency

This commit is contained in:
2025-07-28 12:23:22 +05:30
parent 06e4d516ba
commit 10e7f2f8c4
7 changed files with 92 additions and 118 deletions

View File

@@ -137,10 +137,11 @@ const CopyPasteControls3D = ({
if (hit && centerOffset) {
pastedObjects.forEach((pastedObject: THREE.Object3D, index: number) => {
const model = scene.getObjectByProperty("uuid", pastedObject.userData.modelUuid);
if (!model) return;
const newPos = new THREE.Vector3().addVectors(hit, relativePositions[index]);
setPosition(pastedObject.userData.modelUuid, [newPos.x, 0, newPos.z]);
model.position.set(newPos.x, 0, newPos.z);
});
}
});
@@ -204,7 +205,9 @@ const CopyPasteControls3D = ({
if (pastedAsset) {
const assetUuid = pastedAsset.userData.modelUuid;
const asset = getAssetById(assetUuid);
if (!asset) return;
const model = scene.getObjectByProperty("uuid", pastedAsset.userData.modelUuid);
if (!asset || !model) return;
const position = new THREE.Vector3().copy(model.position);
const newFloorItem: Types.FloorItemType = {
modelUuid: pastedAsset.userData.modelUuid,
@@ -427,7 +430,7 @@ const CopyPasteControls3D = ({
modelUuid: newFloorItem.modelUuid,
modelName: newFloorItem.modelName,
assetId: newFloorItem.assetId,
position: newFloorItem.position,
position: [position.x, 0, position.z],
rotation: { x: pastedAsset.rotation.x, y: pastedAsset.rotation.y, z: pastedAsset.rotation.z },
isLocked: false,
isVisible: true,
@@ -450,7 +453,7 @@ const CopyPasteControls3D = ({
modelUuid: data.modelUuid,
modelName: data.modelName,
assetId: data.assetId,
position: data.position,
position: [position.x, 0, position.z],
rotation: [data.rotation.x, data.rotation.y, data.rotation.z],
isLocked: data.isLocked,
isCollidable: false,
@@ -466,7 +469,7 @@ const CopyPasteControls3D = ({
modelUuid: newFloorItem.modelUuid,
modelName: newFloorItem.modelName,
assetId: newFloorItem.assetId,
position: newFloorItem.position,
position: [position.x, 0, position.z],
rotation: { x: pastedAsset.rotation.x, y: pastedAsset.rotation.y, z: pastedAsset.rotation.z },
isLocked: false,
isVisible: true,
@@ -482,7 +485,7 @@ const CopyPasteControls3D = ({
modelUuid: data.modelUuid,
modelName: data.modelName,
assetId: data.assetId,
position: data.position,
position: [position.x, 0, position.z],
rotation: [data.rotation.x, data.rotation.y, data.rotation.z],
isLocked: data.isLocked,
isCollidable: false,

View File

@@ -29,7 +29,7 @@ const DuplicationControls3D = ({
const { assetStore, eventStore } = useSceneContext();
const { addEvent } = eventStore();
const { projectId } = useParams();
const { assets, addAsset, setPosition, updateAsset, removeAsset, getAssetById } = assetStore();
const { assets, addAsset, updateAsset, removeAsset, getAssetById } = assetStore();
const { selectedVersionStore } = useVersionContext();
const { selectedVersion } = selectedVersionStore();
const { userId, organization } = getUserData();
@@ -143,11 +143,14 @@ const DuplicationControls3D = ({
initialPosition,
initialPositions[duplicatedObjects[0].userData.modelUuid]
);
const model = scene.getObjectByProperty("uuid", duplicatedObject.userData.modelUuid);
const newPosition = new THREE.Vector3().addVectors(adjustedHit, relativeOffset);
const positionArray: [number, number, number] = [newPosition.x, newPosition.y, newPosition.z];
setPosition(duplicatedObject.userData.modelUuid, positionArray);
if (model) {
model.position.set(...positionArray);
}
}
}
});
@@ -205,7 +208,9 @@ const DuplicationControls3D = ({
if (duplicatedAsset) {
const assetUuid = duplicatedAsset.userData.modelUuid;
const asset = getAssetById(assetUuid);
if (!asset) return;
const model = scene.getObjectByProperty("uuid", duplicatedAsset.userData.modelUuid);
if (!asset || !model) return;
const position = new THREE.Vector3().copy(model.position);
const newFloorItem: Types.FloorItemType = {
modelUuid: duplicatedAsset.userData.modelUuid,
@@ -428,7 +433,7 @@ const DuplicationControls3D = ({
modelUuid: newFloorItem.modelUuid,
modelName: newFloorItem.modelName,
assetId: newFloorItem.assetId,
position: newFloorItem.position,
position: [position.x, position.y, position.z],
rotation: { x: duplicatedAsset.rotation.x, y: duplicatedAsset.rotation.y, z: duplicatedAsset.rotation.z },
isLocked: false,
isVisible: true,
@@ -451,7 +456,7 @@ const DuplicationControls3D = ({
modelUuid: data.modelUuid,
modelName: data.modelName,
assetId: data.assetId,
position: data.position,
position: [position.x, position.y, position.z],
rotation: [data.rotation.x, data.rotation.y, data.rotation.z],
isLocked: data.isLocked,
isCollidable: false,
@@ -467,7 +472,7 @@ const DuplicationControls3D = ({
modelUuid: newFloorItem.modelUuid,
modelName: newFloorItem.modelName,
assetId: newFloorItem.assetId,
position: newFloorItem.position,
position: [position.x, position.y, position.z],
rotation: { x: duplicatedAsset.rotation.x, y: duplicatedAsset.rotation.y, z: duplicatedAsset.rotation.z },
isLocked: false,
isVisible: true,
@@ -483,7 +488,7 @@ const DuplicationControls3D = ({
modelUuid: data.modelUuid,
modelName: data.modelName,
assetId: data.assetId,
position: data.position,
position: [position.x, position.y, position.z],
rotation: [data.rotation.x, data.rotation.y, data.rotation.z],
isLocked: data.isLocked,
isCollidable: false,

View File

@@ -38,7 +38,7 @@ function MoveControls3D({
const { userId, organization } = getUserData();
const { projectId } = useParams();
const { assetStore, eventStore, productStore } = useSceneContext();
const { updateAsset, setPosition, getAssetById } = assetStore();
const { updateAsset, getAssetById } = assetStore();
const { selectedVersionStore } = useVersionContext();
const { selectedVersion } = selectedVersionStore();
@@ -196,6 +196,7 @@ function MoveControls3D({
raycaster.setFromCamera(pointer, camera);
const hit = raycaster.ray.intersectPlane(plane, intersectionPoint);
if (hit) {
if (mouseButtonsDown.current.left || mouseButtonsDown.current.right) {
if (movedObjects[0]) {
@@ -231,11 +232,14 @@ function MoveControls3D({
initialPosition,
initialPositions[movedObjects[0].uuid]
);
const model = scene.getObjectByProperty("uuid", movedAsset.userData.modelUuid);
const newPosition = new THREE.Vector3().addVectors(baseNewPosition, relativeOffset);
const positionArray: [number, number, number] = [newPosition.x, newPosition.y, newPosition.z];
setPosition(movedAsset.userData.modelUuid, positionArray);
if (model) {
model.position.set(...positionArray);
}
}
}
});
@@ -288,13 +292,15 @@ function MoveControls3D({
if (movedAsset) {
const assetUuid = movedAsset.userData.modelUuid;
const asset = getAssetById(assetUuid);
if (!asset) return;
const model = scene.getObjectByProperty("uuid", movedAsset.userData.modelUuid);
if (!asset || !model) return;
const position = new THREE.Vector3().copy(model.position);
const newFloorItem: Types.FloorItemType = {
modelUuid: movedAsset.userData.modelUuid,
modelName: movedAsset.userData.modelName,
assetId: movedAsset.userData.assetId,
position: asset.position,
position: [position.x, position.y, position.z],
rotation: { x: movedAsset.rotation.x, y: movedAsset.rotation.y, z: movedAsset.rotation.z },
isLocked: false,
isVisible: true,

View File

@@ -174,12 +174,14 @@ function RotateControls3D({
);
const angleDelta = prevAngle - currentAngle;
const rotationMatrix = new THREE.Matrix4().makeRotationY(angleDelta);
rotatedObjects.forEach((obj: THREE.Object3D) => {
if (obj.userData.modelUuid) {
const relativePos = new THREE.Vector3().subVectors(obj.position, center);
relativePos.applyAxisAngle(new THREE.Vector3(0, 1, 0), angleDelta);
obj.position.copy(center).add(relativePos);
obj.rotation.y += angleDelta;
const relativePosition = new THREE.Vector3().subVectors(obj.position, center);
relativePosition.applyMatrix4(rotationMatrix);
obj.position.copy(center).add(relativePosition);
obj.rotateOnWorldAxis(new THREE.Vector3(0, 1, 0), angleDelta);
}
});