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';