From 5482e185cd523b6b84093503e8f8a60747fcbe2e Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Tue, 9 Sep 2025 16:37:57 +0530 Subject: [PATCH] armbot conveyor bug fix --- .../sidebarRight/simulation/Simulations.tsx | 29 ++- .../zone/Instances/Instance/zoneInstance.tsx | 218 +++++++++++++++--- .../selection3D/duplicationControls3D.tsx | 1 - .../triggerHandler/useTriggerHandler.ts | 82 ++++++- 4 files changed, 275 insertions(+), 55 deletions(-) diff --git a/app/src/components/layout/sidebarRight/simulation/Simulations.tsx b/app/src/components/layout/sidebarRight/simulation/Simulations.tsx index 90b04ee..4e0ab3a 100644 --- a/app/src/components/layout/sidebarRight/simulation/Simulations.tsx +++ b/app/src/components/layout/sidebarRight/simulation/Simulations.tsx @@ -55,15 +55,26 @@ const Simulations: React.FC = () => { }; const handleAddProduct = () => { - const id = generateUUID(); - const name = `Product ${products.length + 1}`; - addProduct(name, id); - upsertProductOrEventApi({ - productName: name, - productUuid: id, - projectId: projectId, - versionId: selectedVersion?.versionId || "", - }); + if (selectedVersion) { + const id = generateUUID(); + const name = `Product ${products.length + 1}`; + addProduct(name, id); + upsertProductOrEventApi({ + productName: name, + productUuid: id, + projectId: projectId, + versionId: selectedVersion?.versionId || "", + }); + + setSelectedProduct(id, name); + const data = { + productUuid: id, + productName: name, + versionUuid: selectedVersion.versionId, + versionName: selectedVersion.versionName, + }; + setMainState(data); + } }; const handleRemoveProduct = (productUuid: string) => { diff --git a/app/src/modules/builder/zone/Instances/Instance/zoneInstance.tsx b/app/src/modules/builder/zone/Instances/Instance/zoneInstance.tsx index d00d398..7ed053a 100644 --- a/app/src/modules/builder/zone/Instances/Instance/zoneInstance.tsx +++ b/app/src/modules/builder/zone/Instances/Instance/zoneInstance.tsx @@ -1,45 +1,199 @@ -import { useMemo } from 'react' -import { Color, DoubleSide, ShaderMaterial, Vector3 } from 'three'; +import { useMemo, useState } from "react"; +import { Color, DoubleSide, ShaderMaterial, Vector3 } from "three"; +import { useFrame } from "@react-three/fiber"; +import { useSceneStore } from "../../../../../store/scene/useSceneStore"; function ZoneInstance({ zone }: { readonly zone: Zone }) { const zoneLayer = zone.points[0].layer; + const { limitFps } = useSceneStore(); + const [time, setTime] = useState(); + + // const zoneMaterial = useMemo(() => { + // return new ShaderMaterial({ + // side: DoubleSide, + // vertexShader: ` + // varying vec2 vUv; + // void main() { + // vUv = uv; + // gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); + // } + // `, + // fragmentShader: ` + // varying vec2 vUv; + // uniform vec3 uOuterColor; + // uniform float uTime; + + // void main() { + // // Map vUv into -1..1 range like Shadertoy + // vec2 uv = (vUv - 1.0) * 0.5; + + // // Distortion loop – slowed down (uTime * 0.25) + // for (float i = 1.0; i < 8.0; i++) { + // uv.y += 0.1 * sin(uv.x * i * i + uTime * 0.25) + // * sin(uv.y * i * i + uTime * 0.25); + // } + + // // Base color influenced by uv + zone color + // vec3 col = uOuterColor; + // col.r += uv.y * 0.2; + // col.g += uv.y * 0.3; + // col.b += uv.y * 0.4; + + // // Fade vertically for a nicer top fade-out + // float verticalFade = 1.0 - vUv.y; + + // gl_FragColor = vec4(col * verticalFade, verticalFade); + // } + // `, + // uniforms: { + // uOuterColor: { value: new Color(zone.zoneColor) }, + // uTime: { value: time }, + // }, + // transparent: true, + // depthWrite: false, + // }); + // }, [time]); + + // const zoneMaterial = useMemo(() => { + // return new ShaderMaterial({ + // side: DoubleSide, + // vertexShader: ` + // varying vec2 vUv; + // void main(){ + // vUv = uv; + // gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); + // } + // `, + // fragmentShader: ` + // varying vec2 vUv; + // uniform float uTime; + // uniform vec3 uOuterColor; + + // void main() { + // // UV mapping like fragCoord + // vec2 uv = vUv; + // vec2 p = uv * 2.0 - 1.0; + // float t = uTime * 0.3; + + // // Flow direction and movement + // vec2 flowDir = normalize(vec2(-0.7, -1.0)); + // float flowSpeed = 2.0; + // float flow = dot(p, flowDir) * flowSpeed + t; + + // // Ripples + // float rippleX = sin(p.x * 12.0 + t * 1.5) * cos(p.y * 8.0 + t * 2.0) * 0.3; + // float rippleY = cos(p.y * 10.0 - t * 1.2) * sin(p.x * 7.0 + t * 0.8) * 0.4; + // float distort = rippleX + rippleY; + + // // Gradient to drive stripes + // float gradient = fract(flow + distort * 0.5); + + // // Smooth liquid band + // float band = smoothstep(0.2, 0.6, gradient) - smoothstep(0.6, 0.9, gradient); + + // // Darker zone color + // vec3 darkColor = uOuterColor * 0.4; + + // // Mix between dark and bright zone color + // vec3 col = mix(darkColor, uOuterColor, band); + + // // Vertical fade + // float verticalFade = 1.0 - vUv.y; + + // gl_FragColor = vec4(col * verticalFade, verticalFade); + // } + // `, + // uniforms: { + // uOuterColor: { value: new Color(zone.zoneColor) }, + // uTime: { value: time }, + // }, + // transparent: true, + // depthWrite: false, + // }); + // }, [zone.zoneColor, time]); const zoneMaterial = useMemo(() => { return new ShaderMaterial({ side: DoubleSide, vertexShader: ` - varying vec2 vUv; - void main(){ - gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); - vUv = uv; - } - `, + varying vec2 vUv; + void main() { + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); + } + `, fragmentShader: ` - varying vec2 vUv; - uniform vec3 uOuterColor; - void main(){ - float alpha = 1.0 - vUv.y; - gl_FragColor = vec4(uOuterColor, alpha); - } - `, + #define TAU 6.28318530718 + #define MAX_ITER 5 + + varying vec2 vUv; + uniform float uTime; + uniform vec3 uOuterColor; + + void main() { + float time = uTime * 0.25; + + // uv in [0,1] + vec2 uv = vUv; + + // convert to p space like Shadertoy + vec2 p = mod(uv * TAU, TAU) - 250.0; + vec2 i = vec2(p); + + float c = 1.0; + float inten = 0.005; + + for (int n = 0; n < MAX_ITER; n++) { + float t = time * (1.0 - (3.5 / float(n + 1))); + i = p + vec2( + cos(t - i.x) + sin(t + i.y), + sin(t - i.y) + cos(t + i.x) + ); + c += 1.0 / length(vec2( + p.x / (sin(i.x + t) / inten), + p.y / (cos(i.y + t) / inten) + )); + } + + c /= float(MAX_ITER); + c = 1.17 - pow(c, 1.4); + + // base fractal color + vec3 fractalCol = vec3(pow(abs(c), 8.0)); + fractalCol = clamp(fractalCol + vec3(0.0, 0.35, 0.5), 0.0, 1.0); + + // Mix between dark and bright zone color + vec3 darkColor = uOuterColor * 0.4; + vec3 col = mix(darkColor, uOuterColor, fractalCol.r); + + // Vertical fade + float verticalFade = 1.0 - vUv.y; + + gl_FragColor = vec4(col * verticalFade, verticalFade); + } + `, uniforms: { uOuterColor: { value: new Color(zone.zoneColor) }, + uTime: { value: time }, }, transparent: true, depthWrite: false, - }) - }, []); + }); + }, [zone.zoneColor, time]); + + useFrame(({ clock }) => { + if (!limitFps) { + setTime(clock.getElapsedTime()); + } + }); return ( - + {zone.points.map((point, index: number) => { const nextPoint = zone.points[(index + 1) % zone.points.length]; - const point1 = new Vector3(point.position[0], point.position[1], point.position[2]); - const point2 = new Vector3(nextPoint.position[0], nextPoint.position[1], nextPoint.position[2]); + const point1 = new Vector3(...point.position); + const point2 = new Vector3(...nextPoint.position); const planeWidth = point1.distanceTo(point2); const planeHeight = zone.zoneHeight; @@ -49,22 +203,14 @@ function ZoneInstance({ zone }: { readonly zone: Zone }) { const angle = Math.atan2(point2.z - point1.z, point2.x - point1.x); return ( - + - + ); })} - - - ) + + ); } -export default ZoneInstance \ No newline at end of file +export default ZoneInstance; diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/duplicationControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/duplicationControls3D.tsx index 2e68cb6..a6d0e65 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/duplicationControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/duplicationControls3D.tsx @@ -547,7 +547,6 @@ const DuplicationControls3D = () => { projectId, }; - console.log("socket: ", socket); if (!socket?.connected) { // REST diff --git a/app/src/modules/simulation/triggers/triggerHandler/useTriggerHandler.ts b/app/src/modules/simulation/triggers/triggerHandler/useTriggerHandler.ts index d161daf..0417f7e 100644 --- a/app/src/modules/simulation/triggers/triggerHandler/useTriggerHandler.ts +++ b/app/src/modules/simulation/triggers/triggerHandler/useTriggerHandler.ts @@ -134,7 +134,12 @@ export function useTriggerHandler() { if (action) { if (armBot) { - if (action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { + if ( + action.triggers.length > 0 && + action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && + action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && + action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid + ) { const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); if (model?.type === "vehicle") { @@ -161,7 +166,12 @@ export function useTriggerHandler() { addArmBotToMonitor(armBot.modelUuid, () => { const vehicle = getVehicleById(action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid || ""); if (vehicle) { - if (vehicle.isActive === false && vehicle.state === "idle" && vehicle.isPicking && vehicle.currentLoad < vehicle.point.action.loadCapacity) { + if ( + vehicle.isActive === false && + vehicle.state === "idle" && + vehicle.isPicking && + vehicle.currentLoad < vehicle.point.action.loadCapacity + ) { // Handle current action from vehicle setIsPaused(materialId, true); handleAction(action, materialId); @@ -192,6 +202,21 @@ export function useTriggerHandler() { } }); } + } else if (model?.type === "transfer") { + const armBot = getArmBotById(trigger.triggeredAsset?.triggeredModel.modelUuid); + if (armBot) { + setIsPaused(materialId, true); + addArmBotToMonitor(armBot.modelUuid, () => { + const conveyor = getConveyorById(action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid || ""); + if (conveyor) { + setIsPaused(materialId, true); + + addConveyorToMonitor(conveyor.modelUuid, () => { + handleAction(action, materialId); + }); + } + }); + } } else { if (armBot.isActive === false && armBot.state === "idle") { // Handle current action from arm bot @@ -249,7 +274,12 @@ export function useTriggerHandler() { if (action) { if (human) { - if (action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { + if ( + action.triggers.length > 0 && + action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && + action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && + action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid + ) { const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); if (model?.type === "vehicle") { @@ -370,7 +400,12 @@ export function useTriggerHandler() { if (action) { if (crane) { - if (action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { + if ( + action.triggers.length > 0 && + action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && + action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && + action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid + ) { const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); if (model?.type === "human") { @@ -580,7 +615,12 @@ export function useTriggerHandler() { if (action) { if (crane) { - if (action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { + if ( + action.triggers.length > 0 && + action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && + action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && + action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid + ) { const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); if (model?.type === "human") { @@ -818,7 +858,13 @@ export function useTriggerHandler() { const action = getActionByUuid(selectedProduct.productUuid, trigger.triggeredAsset.triggeredAction.actionUuid); - if (action && action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { + if ( + action && + action.triggers.length > 0 && + action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && + action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && + action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid + ) { const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); if (model?.type === "roboticArm") { @@ -1104,7 +1150,13 @@ export function useTriggerHandler() { const action = getActionByUuid(selectedProduct.productUuid, trigger.triggeredAsset.triggeredAction.actionUuid); - if (action && action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { + if ( + action && + action.triggers.length > 0 && + action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && + action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && + action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid + ) { const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); if (model?.type === "roboticArm") { @@ -1214,7 +1266,13 @@ export function useTriggerHandler() { const action = getActionByUuid(selectedProduct.productUuid, trigger.triggeredAsset.triggeredAction.actionUuid); - if (action && action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { + if ( + action && + action.triggers.length > 0 && + action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && + action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && + action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid + ) { const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); if (model?.type === "roboticArm") { @@ -1327,7 +1385,13 @@ export function useTriggerHandler() { const action = getActionByUuid(selectedProduct.productUuid, trigger.triggeredAsset.triggeredAction.actionUuid); - if (action && action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { + if ( + action && + action.triggers.length > 0 && + action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && + action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && + action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid + ) { const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); if (model?.type === "roboticArm") {