diff --git a/app/src/modules/simulation/process/processAnimator.tsx b/app/src/modules/simulation/process/processAnimator.tsx index a32b34b..981846b 100644 --- a/app/src/modules/simulation/process/processAnimator.tsx +++ b/app/src/modules/simulation/process/processAnimator.tsx @@ -1,4 +1,10 @@ -import React, { useRef, useEffect, useMemo, useCallback } from "react"; +import React, { + useRef, + useEffect, + useMemo, + useCallback, + useState, +} from "react"; import { useLoader, useFrame } from "@react-three/fiber"; import { GLTFLoader } from "three-stdlib"; import * as THREE from "three"; @@ -48,6 +54,8 @@ const ProcessAnimator: React.FC = ({ const gltf = useLoader(GLTFLoader, crate) as GLTF; const groupRef = useRef(null); const tempStackedObjectsRef = useRef>({}); + const [previouslyConnected, setPreviouslyConnected] = useState({}); + const currentSpawnedObjectRef = useRef(null); const { animationStates, @@ -116,8 +124,6 @@ const ProcessAnimator: React.FC = ({ }); }, [animationStates, MaterialRef, agvRef]); - // In processAnimator.tsx - only the relevant spawn logic part that needs fixes - // Add this function to ProcessAnimator component const isConnectedToActiveArmBot = useCallback( (processId: any) => { @@ -153,6 +159,26 @@ const ProcessAnimator: React.FC = ({ // Check connection status const isConnected = isConnectedToActiveArmBot(process.id); + const wasConnected = previouslyConnected[process.id] || false; + + // Track connection state changes + if (wasConnected !== isConnected) { + setTimeout(() => { + setPreviouslyConnected((prev: any) => ({ + ...prev, + [process.id]: isConnected, + })); + }, 0); + } + + // If just disconnected, reset the spawn timer to allow new spawns + if (wasConnected && !isConnected) { + newStates[process.id] = { + ...processState, + nextSpawnTime: currentTime + 0.1, + hasSpawnedZeroIntervalObject: false, + }; + } if (processState.isProcessDelaying) { // Existing delay handling logic... @@ -192,7 +218,10 @@ const ProcessAnimator: React.FC = ({ return; // Don't spawn more objects for zero interval } - const effectiveSpawnInterval = spawnInterval / speedRef.current; + const effectiveSpawnInterval = Math.max( + 0.1, + spawnInterval / speedRef.current + ); if (currentTime >= processState.nextSpawnTime) { const objectId = `obj-${process.id}-${processState.objectIdCounter}`; @@ -213,6 +242,9 @@ const ProcessAnimator: React.FC = ({ progress: 0.005, // Start with tiny progress to ensure animation begins }; + // Calculate next spawn time + const nextSpawnAt = currentTime + effectiveSpawnInterval; + // Update state with the new object and flag for zero interval newStates[process.id] = { ...processState, @@ -221,7 +253,7 @@ const ProcessAnimator: React.FC = ({ [objectId]: newObject, }, objectIdCounter: processState.objectIdCounter + 1, - nextSpawnTime: currentTime + effectiveSpawnInterval, + nextSpawnTime: nextSpawnAt, // Mark that we've spawned an object for zero interval case hasSpawnedZeroIntervalObject: spawnInterval === 0 @@ -237,6 +269,8 @@ const ProcessAnimator: React.FC = ({ // Second useFrame for animation logic useFrame((_, delta) => { + let currentProcessObject: any = null; + // Animation logic frame const currentTime = clockRef.current.getElapsedTime() - elapsedBeforePauseRef.current; @@ -250,7 +284,7 @@ const ProcessAnimator: React.FC = ({ return; } - // Check connection status with debugging + // Check connection status const isConnected = isConnectedToActiveArmBot(process.id); if (isConnected) { @@ -263,6 +297,7 @@ const ProcessAnimator: React.FC = ({ [id]: { ...obj, state: { + visible: true, ...obj.state, isAnimating: false, // Stop animation isDelaying: false, // Clear delays @@ -511,12 +546,8 @@ const ProcessAnimator: React.FC = ({ currentTime ); - const newPointData = getPointDataForAnimationIndex( - process, - stateRef.currentIndex - ); - // No action needed with newPointData here - will be handled in next frame + getPointDataForAnimationIndex(process, stateRef.currentIndex); } else { // Update position with lerp currentRef.position.lerpVectors( @@ -533,9 +564,9 @@ const ProcessAnimator: React.FC = ({ // Log if no animation is occurring when it should if (!animationOccurring && !isConnected) { - // console.log( - // `Warning: No animation occurring for process ${process.id} despite not being connected` - // ); + console.log( + `Warning: No animation occurring for process ${process.id} despite not being connected` + ); } newStates[process.id] = {