armbot conveyor bug fix

This commit is contained in:
2025-09-09 16:37:57 +05:30
parent 044af6d62d
commit 5482e185cd
4 changed files with 275 additions and 55 deletions

View File

@@ -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) => {

View File

@@ -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<number>();
// 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 (
<mesh
name={`Zone-${zone.zoneUuid}`}
userData={zone}
>
<mesh name={`Zone-${zone.zoneUuid}`} userData={zone}>
{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 (
<mesh
key={index}
position={midpoint}
rotation={[0, -angle, 0]}
>
<mesh key={index} position={midpoint} rotation={[0, -angle, 0]}>
<planeGeometry args={[planeWidth, planeHeight]} />
<primitive
object={zoneMaterial.clone()}
attach="material"
/>
<primitive object={zoneMaterial.clone()} attach="material" />
</mesh>
);
})}
</ mesh>
)
</mesh>
);
}
export default ZoneInstance
export default ZoneInstance;

View File

@@ -547,7 +547,6 @@ const DuplicationControls3D = () => {
projectId,
};
console.log("socket: ", socket);
if (!socket?.connected) {
// REST

View File

@@ -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") {