diff --git a/app/src/modules/builder/builder.tsx b/app/src/modules/builder/builder.tsx index d340a35..ab9434b 100644 --- a/app/src/modules/builder/builder.tsx +++ b/app/src/modules/builder/builder.tsx @@ -95,7 +95,7 @@ export default function Builder() { - {/* + @@ -103,7 +103,7 @@ export default function Builder() { - */} + @@ -113,9 +113,9 @@ export default function Builder() { - {/* */} + - {/* */} + diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/copyPasteControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/copyPasteControls3D.tsx index a147750..1466b3f 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/copyPasteControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/copyPasteControls3D.tsx @@ -31,7 +31,7 @@ const CopyPasteControls3D = ({ 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(); diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/moveControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/moveControls3D.tsx index 18f4abf..6f65300 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/moveControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/moveControls3D.tsx @@ -339,7 +339,7 @@ function MoveControls3D({ } updateAsset(movedAsset.userData.modelUuid, { - position: asset.position, + position: [position.x, position.y, position.z], rotation: [movedAsset.rotation.x, movedAsset.rotation.y, movedAsset.rotation.z], }); diff --git a/app/src/modules/scene/scene.tsx b/app/src/modules/scene/scene.tsx index 0f08a2d..e10fc4a 100644 --- a/app/src/modules/scene/scene.tsx +++ b/app/src/modules/scene/scene.tsx @@ -1,6 +1,6 @@ import { useEffect, useMemo } from "react"; import { Canvas } from "@react-three/fiber"; -import { KeyboardControls, Stats } from "@react-three/drei"; +import { KeyboardControls } from "@react-three/drei"; import { useSceneContext } from "./sceneContext"; import Builder from "../builder/builder"; @@ -52,7 +52,7 @@ export default function Scene({ layout }: { readonly layout: 'Main Layout' | 'Co }).catch((err) => { console.error(err); }); - // eslint-disable-next-line + // eslint-disable-next-line }, [activeModule, assets, loadingProgress]) return ( @@ -76,7 +76,6 @@ export default function Scene({ layout }: { readonly layout: 'Main Layout' | 'Co - ); diff --git a/app/src/modules/simulation/roboticArm/instances/animator/roboticArmAnimator.tsx b/app/src/modules/simulation/roboticArm/instances/animator/roboticArmAnimator.tsx index c382230..1f81c2d 100644 --- a/app/src/modules/simulation/roboticArm/instances/animator/roboticArmAnimator.tsx +++ b/app/src/modules/simulation/roboticArm/instances/animator/roboticArmAnimator.tsx @@ -1,15 +1,27 @@ import { useEffect, useRef, useState } from 'react'; -import { useFrame } from '@react-three/fiber'; +import { useFrame, useThree } from '@react-three/fiber'; import * as THREE from 'three'; import { Line, Text } from '@react-three/drei'; import { useAnimationPlaySpeed, usePauseButtonStore, usePlayButtonStore, useResetButtonStore } from '../../../../../store/usePlayButtonStore'; +import { useSceneContext } from '../../../../scene/sceneContext'; +import { useProductContext } from '../../../products/productContext'; type PointWithDegree = { position: [number, number, number]; degree: number; }; -function RoboticArmAnimator({ HandleCallback, restPosition, ikSolver, targetBone, armBot, path }: any) { +interface RoboticArmAnimatorProps { + HandleCallback: () => void; + restPosition: THREE.Vector3; + ikSolver: any; + targetBone: string; + armBot: ArmBotStatus; + path: [number, number, number][]; + currentPhase: string; +} + +function RoboticArmAnimator({ HandleCallback, restPosition, ikSolver, targetBone, armBot, path, currentPhase }: RoboticArmAnimatorProps) { const progressRef = useRef(0); const curveRef = useRef(null); const totalDistanceRef = useRef(0); @@ -19,6 +31,14 @@ function RoboticArmAnimator({ HandleCallback, restPosition, ikSolver, targetBone const [circlePoints, setCirclePoints] = useState<[number, number, number][]>([]); const [circlePointsWithDegrees, setCirclePointsWithDegrees] = useState([]); const [customCurvePoints, setCustomCurvePoints] = useState(null); + const { armBotStore, productStore, materialStore } = useSceneContext(); + const { getArmBotById } = armBotStore(); + const { getMaterialById } = materialStore(); + const { getEventByModelUuid } = productStore(); + const { selectedProductStore } = useProductContext(); + const { selectedProduct } = selectedProductStore(); + const { scene } = useThree(); + let curveHeight = 1.75 const CIRCLE_RADIUS = 1.6 @@ -145,8 +165,38 @@ function RoboticArmAnimator({ HandleCallback, restPosition, ikSolver, targetBone useEffect(() => { if (circlePoints.length > 0 && currentPath.length > 0) { - const start = currentPath[0]; - const end = currentPath[currentPath.length - 1]; + let start = currentPath[0]; + let end = currentPath[currentPath.length - 1]; + + const armbotStatus = getArmBotById(armBot.modelUuid); + const currentMaterial = armbotStatus?.currentAction?.materialId; + if (armbotStatus && currentMaterial && (currentPhase === 'rest-to-start' || currentPhase === 'start-to-end')) { + const materialData = getMaterialById(currentMaterial); + if (materialData) { + const prevModel = getEventByModelUuid(selectedProduct.productUuid, materialData.current.modelUuid); + + if (prevModel && prevModel.type === 'transfer') { + const material = scene.getObjectByProperty("uuid", currentMaterial); + const armbotModel = scene.getObjectByProperty("uuid", armBot.modelUuid); + if (material && armbotModel) { + const materialWorldPos = new THREE.Vector3(); + material.getWorldPosition(materialWorldPos); + + const armbotWorldPos = new THREE.Vector3(); + armbotModel.getWorldPosition(armbotWorldPos); + + const materialLocalPos = materialWorldPos.clone(); + armbotModel.worldToLocal(materialLocalPos); + + if (currentPhase === 'rest-to-start') { + end = [materialLocalPos.x, materialLocalPos.y + 0.35, materialLocalPos.z]; + } else if (currentPhase === 'start-to-end') { + start = [materialLocalPos.x, materialLocalPos.y + 0.35, materialLocalPos.z]; + } + } + } + } + } const raisedStart = [start[0], start[1] + 0.5, start[2]] as [number, number, number]; const raisedEnd = [end[0], end[1] + 0.5, end[2]] as [number, number, number]; diff --git a/app/src/modules/simulation/roboticArm/instances/armInstance/roboticArmInstance.tsx b/app/src/modules/simulation/roboticArm/instances/armInstance/roboticArmInstance.tsx index b41bef8..e1595b6 100644 --- a/app/src/modules/simulation/roboticArm/instances/armInstance/roboticArmInstance.tsx +++ b/app/src/modules/simulation/roboticArm/instances/armInstance/roboticArmInstance.tsx @@ -334,7 +334,6 @@ function RoboticArmInstance({ armBot }: { readonly armBot: ArmBotStatus }) { }, [currentPhase, armBot, isPlaying, isReset, ikSolver]) - function createCurveBetweenTwoPoints(p1: any, p2: any) { const mid = new THREE.Vector3().addVectors(p1, p2).multiplyScalar(0.5); const points = [p1, mid, p2]; @@ -342,7 +341,6 @@ function RoboticArmInstance({ armBot }: { readonly armBot: ArmBotStatus }) { } const HandleCallback = () => { - if (armBot.isActive && armBot.state == "running" && currentPhase == "init-to-rest") { logStatus(armBot.modelUuid, "Callback triggered: rest"); setArmBotActive(armBot.modelUuid, false) @@ -370,7 +368,6 @@ function RoboticArmInstance({ armBot }: { readonly armBot: ArmBotStatus }) { setArmBotState(armBot.modelUuid, "idle") setCurrentPhase("rest"); setPath([]) - } } @@ -389,7 +386,6 @@ function RoboticArmInstance({ armBot }: { readonly armBot: ArmBotStatus }) { ikSolver={ikSolver} targetBone={targetBone} armBot={armBot} - logStatus={logStatus} path={path} currentPhase={currentPhase} /> diff --git a/app/src/modules/simulation/spatialUI/arm/armBotUI.tsx b/app/src/modules/simulation/spatialUI/arm/armBotUI.tsx index 1afc206..1f4dee8 100644 --- a/app/src/modules/simulation/spatialUI/arm/armBotUI.tsx +++ b/app/src/modules/simulation/spatialUI/arm/armBotUI.tsx @@ -55,6 +55,7 @@ const ArmBotUI = () => { }) } + // Fetch and setup selected ArmBot data useEffect(() => { if (selectedEventSphere) { const selectedArmBot = getEventByModelUuid(selectedProduct.productUuid, selectedEventSphere.userData.modelUuid); @@ -85,11 +86,13 @@ const ArmBotUI = () => { const modelData = getEventByModelUuid(selectedProduct.productUuid, modelUuid); if (modelData?.type === "roboticArm") { - const baseY = modelData.point.position?.[1] || 0; + const baseX = modelData.point.position?.[0] || 0; + const baseY = modelData.point.position?.[1] || 0;; + const baseZ = modelData.point.position?.[2] || 0; return { - pick: [0, baseY, 0 + 0.5], - drop: [0, baseY, 0 - 0.5], - default: [0, baseY, 0], + pick: [baseX, baseY, baseZ + 0.5], + drop: [baseX, baseY, baseZ - 0.5], + default: [baseX, baseY, baseZ], }; } @@ -222,7 +225,7 @@ const ArmBotUI = () => { ); } else { - return null; + return null; // important! must return something } })} diff --git a/app/src/modules/simulation/spatialUI/arm/useDraggableGLTF.ts b/app/src/modules/simulation/spatialUI/arm/useDraggableGLTF.ts index 2f63234..ce2090f 100644 --- a/app/src/modules/simulation/spatialUI/arm/useDraggableGLTF.ts +++ b/app/src/modules/simulation/spatialUI/arm/useDraggableGLTF.ts @@ -183,7 +183,11 @@ export default function useDraggableGLTF( targetPosition.z = centerZ + finalLocal.z; // Clamp Y axis using variables - targetPosition.y = Math.min(Math.max(targetPosition.y, minHeight), maxHeight); + + targetPosition.y = Math.min( + Math.max(targetPosition.y, Math.min(minHeight, maxHeight)), + Math.max(minHeight, maxHeight) + ); // Convert to local if parent exists if (parent) { diff --git a/app/src/modules/simulation/vehicle/instances/animator/vehicleAnimator.tsx b/app/src/modules/simulation/vehicle/instances/animator/vehicleAnimator.tsx index 5ea19f9..2edfc58 100644 --- a/app/src/modules/simulation/vehicle/instances/animator/vehicleAnimator.tsx +++ b/app/src/modules/simulation/vehicle/instances/animator/vehicleAnimator.tsx @@ -1,8 +1,8 @@ -import React, { useEffect, useMemo, useRef, useState } from 'react' +import { useEffect, useRef, useState } from 'react' import { useFrame, useThree, ThreeEvent } from '@react-three/fiber'; import * as THREE from 'three'; -import { Line, TransformControls } from '@react-three/drei'; +import { Line } from '@react-three/drei'; import { useAnimationPlaySpeed, usePauseButtonStore, usePlayButtonStore, useResetButtonStore } from '../../../../../store/usePlayButtonStore'; import { useSceneContext } from '../../../../scene/sceneContext'; import { useActiveTool, useSelectedPath } from '../../../../../store/builder/store';