From bcc908bfca788034573248784421891649cf6f10 Mon Sep 17 00:00:00 2001
From: Poovizhi99 <poovizhi@hexrfactory.com>
Date: Wed, 23 Apr 2025 09:13:33 +0530
Subject: [PATCH 1/2] added static agv

---
 .../builder/groups/floorItemsGroup.tsx        |  4 +-
 .../instances/instance/vehicleInstance.tsx    |  2 +-
 .../vehicle/instances/vehicleInstances.tsx    |  9 ++-
 .../modules/simulation/vehicle/vehicles.tsx   | 63 ++++++++++++++++---
 4 files changed, 66 insertions(+), 12 deletions(-)

diff --git a/app/src/modules/builder/groups/floorItemsGroup.tsx b/app/src/modules/builder/groups/floorItemsGroup.tsx
index 23fa80d..04376ce 100644
--- a/app/src/modules/builder/groups/floorItemsGroup.tsx
+++ b/app/src/modules/builder/groups/floorItemsGroup.tsx
@@ -16,10 +16,10 @@ import addAssetModel from "../geomentries/assets/addAssetModel";
 import { getFloorAssets } from "../../../services/factoryBuilder/assest/floorAsset/getFloorItemsApi";
 import useModuleStore from "../../../store/useModuleStore";
 // import { retrieveGLTF } from "../../../utils/indexDB/idbUtils";
-const assetManagerWorker = new Worker(new URL("../../../services/factoryBuilder/webWorkers/assetManagerWorker.js", import.meta.url));
-const gltfLoaderWorker = new Worker(new URL("../../../services/factoryBuilder/webWorkers/gltfLoaderWorker.js", import.meta.url));
 
 import { useEventsStore } from "../../../store/simulation/useEventsStore";
+const assetManagerWorker = new Worker(new URL("../../../services/factoryBuilder/webWorkers/assetManagerWorker.js", import.meta.url));
+const gltfLoaderWorker = new Worker(new URL("../../../services/factoryBuilder/webWorkers/gltfLoaderWorker.js", import.meta.url));
 
 const FloorItemsGroup = ({ itemsGroup, hoveredDeletableFloorItem, AttachedObject, floorGroup, tempLoader, isTempLoader, plane, }: any) => {
     const state: Types.ThreeState = useThree();
diff --git a/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx b/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx
index 0996b3c..283be58 100644
--- a/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx
+++ b/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx
@@ -1,7 +1,7 @@
 import React from 'react'
 import VehicleAnimator from '../animator/vehicleAnimator'
 
-function VehicleInstance() {
+function VehicleInstance({ agvDetails }: any) {
     return (
         <>
 
diff --git a/app/src/modules/simulation/vehicle/instances/vehicleInstances.tsx b/app/src/modules/simulation/vehicle/instances/vehicleInstances.tsx
index 13e15b7..8374080 100644
--- a/app/src/modules/simulation/vehicle/instances/vehicleInstances.tsx
+++ b/app/src/modules/simulation/vehicle/instances/vehicleInstances.tsx
@@ -1,11 +1,16 @@
 import React from 'react'
 import VehicleInstance from './instance/vehicleInstance'
 
-function VehicleInstances() {
+function VehicleInstances({ vehicles }: any) {
     return (
         <>
 
-            <VehicleInstance />
+            {vehicles.map((val: any) =>
+
+                <VehicleInstance agvDetails={val} />
+            )
+
+            }
 
         </>
     )
diff --git a/app/src/modules/simulation/vehicle/vehicles.tsx b/app/src/modules/simulation/vehicle/vehicles.tsx
index 7a270d4..b5cf86f 100644
--- a/app/src/modules/simulation/vehicle/vehicles.tsx
+++ b/app/src/modules/simulation/vehicle/vehicles.tsx
@@ -9,8 +9,8 @@ function Vehicles() {
 
     const vehicleStatusSample: VehicleStatus[] = [
         {
-            modelUuid: "veh-123",
-            modelName: "Autonomous Truck A1",
+            modelUuid: "2c01ed76-359a-485b-83d4-052cfcdb9d89",
+            modelName: "AGV",
             position: [10, 0, 5],
             rotation: [0, 0, 0],
             state: "idle",
@@ -18,7 +18,7 @@ function Vehicles() {
             speed: 2.5,
             point: {
                 uuid: "point-789",
-                position: [0, 1, 0],
+                position: [93.42159216649789, 0, 23.790878603572857],
                 rotation: [0, 0, 0],
                 action: {
                     actionUuid: "action-456",
@@ -59,9 +59,58 @@ function Vehicles() {
             distanceTraveled: 0
         },
         {
-            modelUuid: "veh-123",
-            modelName: "Autonomous Truck A1",
-            position: [10, 0, 5],
+            modelUuid: "311130b9-4f2e-425a-b3b5-5039cb348806",
+            modelName: "AGV",
+            position: [95.69567023145055, 0, 33.18042399595448],
+            rotation: [0, 0, 0],
+            state: "idle",
+            type: "vehicle",
+            speed: 2.5,
+            point: {
+                uuid: "point-789",
+                position: [0, 1, 0],
+                rotation: [0, 0, 0],
+                action: {
+                    actionUuid: "action-456",
+                    actionName: "Deliver to Zone A",
+                    actionType: "travel",
+                    material: "crate",
+                    unLoadDuration: 15,
+                    loadCapacity: 5,
+                    pickUpPoint: { x: 5, y: 0, z: 3 },
+                    unLoadPoint: { x: 20, y: 0, z: 10 },
+                    triggers: [
+                        {
+                            triggerUuid: "trig-001",
+                            triggerName: "Start Travel",
+                            triggerType: "onStart",
+                            delay: 0,
+                            triggeredAsset: {
+                                triggeredModel: { modelName: "ArmBot-X", modelUuid: "arm-001" },
+                                triggeredPoint: { pointName: "Pickup Arm Point", pointUuid: "arm-point-01" },
+                                triggeredAction: { actionName: "Grab Widget", actionUuid: "grab-001" }
+                            }
+                        },
+                        {
+                            triggerUuid: "trig-002",
+                            triggerName: "Complete Travel",
+                            triggerType: "onComplete",
+                            delay: 2,
+                            triggeredAsset: null
+                        }
+                    ]
+                }
+            },
+            productId: "prod-890",
+            isActive: false,
+            idleTime: 0,
+            activeTime: 0,
+            currentLoad: 0,
+            distanceTraveled: 0
+        }, {
+            modelUuid: "fa54132c-8333-4832-becb-5281f5e11549",
+            modelName: "AGV",
+            position: [102.71483985219794, 0, 23.66321267938962],
             rotation: [0, 0, 0],
             state: "idle",
             type: "vehicle",
@@ -124,7 +173,7 @@ function Vehicles() {
     return (
         <>
 
-            <VehicleInstances />
+            <VehicleInstances vehicles={vehicles} />
 
         </>
     )

From 4ad5e1255b864672ff1ca83f0019cf2d782ba617 Mon Sep 17 00:00:00 2001
From: Poovizhi99 <poovizhi@hexrfactory.com>
Date: Wed, 23 Apr 2025 12:25:52 +0530
Subject: [PATCH 2/2] added functionalities for vehicle

---
 .../instances/animator/vehicleAnimator.tsx    | 36 +++++++++-
 .../instances/instance/vehicleInstance.tsx    | 65 +++++++++++++++++--
 .../vehicle/instances/vehicleInstances.tsx    |  9 +--
 .../modules/simulation/vehicle/vehicles.tsx   |  1 +
 4 files changed, 97 insertions(+), 14 deletions(-)

diff --git a/app/src/modules/simulation/vehicle/instances/animator/vehicleAnimator.tsx b/app/src/modules/simulation/vehicle/instances/animator/vehicleAnimator.tsx
index 14cb6fa..db6bedb 100644
--- a/app/src/modules/simulation/vehicle/instances/animator/vehicleAnimator.tsx
+++ b/app/src/modules/simulation/vehicle/instances/animator/vehicleAnimator.tsx
@@ -1,6 +1,38 @@
-import React from 'react'
+import { useFrame, useThree } from '@react-three/fiber';
+import React, { useEffect, useState } from 'react'
 
-function VehicleAnimator() {
+interface VehicleAnimatorProps {
+    path: [number, number, number][];
+    handleCallBack: () => void;
+    currentPhase: string;
+    agvUuid: number
+}
+
+
+function VehicleAnimator({ path, handleCallBack, currentPhase, agvUuid }: VehicleAnimatorProps) {
+
+    const [currentPath, setCurrentPath] = useState<[number, number, number][]>([]);
+    const { scene } = useThree();
+
+    useEffect(() => {
+
+        if (currentPhase === 'stationed-pickup' && path.length > 0) {
+
+
+            setCurrentPath(path);
+
+        }
+
+    }, [currentPhase, path])
+
+    useFrame(() => {
+        if (currentPath.length === 0) return;
+        const object = scene.getObjectByProperty("uuid", agvUuid);
+        if (!object) return;
+
+
+
+    })
     return (
         <>
         </>
diff --git a/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx b/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx
index 283be58..e381311 100644
--- a/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx
+++ b/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx
@@ -1,14 +1,67 @@
-import React from 'react'
+import React, { useCallback, useEffect, useState } from 'react'
 import VehicleAnimator from '../animator/vehicleAnimator'
+import * as THREE from "three";
+import { NavMeshQuery } from '@recast-navigation/core';
+import { useNavMesh } from '../../../../../store/store';
+import { usePlayButtonStore } from '../../../../../store/usePlayButtonStore';
+import { useVehicleStore } from '../../../../../store/simulation/useVehicleStore';
 
 function VehicleInstance({ agvDetails }: any) {
-    return (
-        <>
+  const { navMesh } = useNavMesh();
+  const { isPlaying } = usePlayButtonStore();
+  const { setVehicleActive, setVehicleState } = useVehicleStore();
+  const [currentPhase, setCurrentPhase] = useState<(string)>("stationed");
+  const [path, setPath] = useState<[number, number, number][]>([]);
 
-            <VehicleAnimator />
+  const computePath = useCallback((start: any, end: any) => {
 
-        </>
-    )
+
+    try {
+      const navMeshQuery = new NavMeshQuery(navMesh);
+      const { path: segmentPath } = navMeshQuery.computePath(start, end);
+      return (
+        segmentPath?.map(
+          ({ x, y, z }) => [x, y + 0.1, z] as [number, number, number]
+        ) || []
+      );
+    } catch {
+      return [];
+    }
+  }, [navMesh]);
+
+  useEffect(() => {
+    // const pickupToDropPath = computePath(pickup, drop);
+    // const dropToPickupPath = computePath(drop, pickup);
+
+    if (isPlaying) {
+      if (!agvDetails.isActive && agvDetails.state == "idle" && currentPhase == "stationed") {
+        const toPickupPath = computePath(new THREE.Vector3(agvDetails.position[0], agvDetails.position[1], agvDetails.position[2]), agvDetails.point.action.pickUpPoint);
+        setPath(toPickupPath)
+        setVehicleActive(agvDetails.modelUuid, true)
+        setVehicleState(agvDetails.modelUuid, "running")
+        setCurrentPhase("stationed-pickup")
+        // 
+      }
+    }
+  }, [agvDetails, currentPhase, path, isPlaying])
+
+  function handleCallBack() {
+    if (currentPhase === "stationed-pickup") {
+      setVehicleActive(agvDetails.modelUuid, false)
+      setVehicleState(agvDetails.modelUuid, "idle")
+      setCurrentPhase("picking")
+      setPath([])
+    }
+  }
+
+
+  return (
+    <>
+
+      <VehicleAnimator path={path} handleCallBack={handleCallBack} currentPhase={currentPhase} agvUuid={agvDetails?.modelUUID} />
+
+    </>
+  )
 }
 
 export default VehicleInstance
\ No newline at end of file
diff --git a/app/src/modules/simulation/vehicle/instances/vehicleInstances.tsx b/app/src/modules/simulation/vehicle/instances/vehicleInstances.tsx
index 8374080..f3f1435 100644
--- a/app/src/modules/simulation/vehicle/instances/vehicleInstances.tsx
+++ b/app/src/modules/simulation/vehicle/instances/vehicleInstances.tsx
@@ -5,12 +5,9 @@ function VehicleInstances({ vehicles }: any) {
     return (
         <>
 
-            {vehicles.map((val: any) =>
-
-                <VehicleInstance agvDetails={val} />
-            )
-
-            }
+            {vehicles.map((val: any, i: any) =>
+                <VehicleInstance agvDetails={val} key={i} />
+            )}
 
         </>
     )
diff --git a/app/src/modules/simulation/vehicle/vehicles.tsx b/app/src/modules/simulation/vehicle/vehicles.tsx
index b5cf86f..b9bc07b 100644
--- a/app/src/modules/simulation/vehicle/vehicles.tsx
+++ b/app/src/modules/simulation/vehicle/vehicles.tsx
@@ -163,6 +163,7 @@ function Vehicles() {
     useEffect(() => {
         addVehicle('123', vehicleStatusSample[0]);
         addVehicle('123', vehicleStatusSample[1]);
+        addVehicle('123', vehicleStatusSample[2]);
     }, [])
 
     useEffect(() => {