diff --git a/app/src/modules/simulation/process/processAnimator.tsx b/app/src/modules/simulation/process/processAnimator.tsx index ddf21be..04ddf90 100644 --- a/app/src/modules/simulation/process/processAnimator.tsx +++ b/app/src/modules/simulation/process/processAnimator.tsx @@ -1,10 +1,4 @@ -import React, { - useRef, - useEffect, - useMemo, - useCallback, - useState, -} from "react"; +import React, { useRef, useEffect, useMemo, useCallback } from "react"; import { useLoader, useFrame } from "@react-three/fiber"; import { GLTFLoader } from "three-stdlib"; import * as THREE from "three"; @@ -54,8 +48,6 @@ 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, @@ -124,6 +116,8 @@ 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) => { @@ -159,26 +153,6 @@ 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... @@ -195,6 +169,9 @@ const ProcessAnimator: React.FC = ({ const spawnPoint = findSpawnPoint(process); if (!spawnPoint || !spawnPoint.actions) { + console.log( + `Process ${process.id} has no valid spawn point or actions` + ); return; } @@ -218,10 +195,7 @@ const ProcessAnimator: React.FC = ({ return; // Don't spawn more objects for zero interval } - const effectiveSpawnInterval = Math.max( - 0.1, - spawnInterval / speedRef.current - ); + const effectiveSpawnInterval = spawnInterval / speedRef.current; if (currentTime >= processState.nextSpawnTime) { const objectId = `obj-${process.id}-${processState.objectIdCounter}`; @@ -242,9 +216,6 @@ 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, @@ -253,7 +224,7 @@ const ProcessAnimator: React.FC = ({ [objectId]: newObject, }, objectIdCounter: processState.objectIdCounter + 1, - nextSpawnTime: nextSpawnAt, + nextSpawnTime: currentTime + effectiveSpawnInterval, // Mark that we've spawned an object for zero interval case hasSpawnedZeroIntervalObject: spawnInterval === 0 @@ -269,8 +240,6 @@ 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; @@ -284,8 +253,12 @@ const ProcessAnimator: React.FC = ({ return; } - // Check connection status + // Check connection status with debugging const isConnected = isConnectedToActiveArmBot(process.id); + console.log( + `Process ${process.id} animation - connected:`, + isConnected + ); if (isConnected) { // Stop all animations when connected to active arm bot @@ -297,7 +270,6 @@ const ProcessAnimator: React.FC = ({ [id]: { ...obj, state: { - visible: true, ...obj.state, isAnimating: false, // Stop animation isDelaying: false, // Clear delays @@ -321,6 +293,9 @@ const ProcessAnimator: React.FC = ({ currentTime - processState.processDelayStartTime >= effectiveDelayTime ) { + console.log( + `Process ${process.id} delay completed, resuming animation` + ); newStates[process.id] = { ...processState, isProcessDelaying: false, @@ -356,6 +331,9 @@ const ProcessAnimator: React.FC = ({ []; if (path.length < 2) { + console.log( + `Process ${process.id} has insufficient path points: ${path.length}` + ); return; } @@ -370,6 +348,9 @@ const ProcessAnimator: React.FC = ({ const currentRef = gltf?.scene ? obj.ref.current : obj.ref.current; if (!currentRef) { + console.log( + `No reference for object ${objectId}, skipping animation` + ); return; } @@ -397,6 +378,9 @@ const ProcessAnimator: React.FC = ({ stateRef.currentDelayDuration / speedRef.current; if (currentTime - stateRef.delayStartTime >= effectiveDelayTime) { + console.log( + `Delay complete for object ${objectId}, resuming animation` + ); stateRef.isDelaying = false; stateRef.delayComplete = true; stateRef.isAnimating = true; @@ -424,6 +408,9 @@ const ProcessAnimator: React.FC = ({ // Skip non-animating objects if (!stateRef.isAnimating) { + console.log( + `Object ${objectId} not animating, skipping animation updates` + ); return; } @@ -467,6 +454,9 @@ const ProcessAnimator: React.FC = ({ if (shouldHide) { if (isAgvPicking) { + console.log( + `AGV picking at last point for object ${objectId}, hiding object` + ); updatedObjects[objectId] = { ...obj, visible: false, @@ -527,8 +517,14 @@ const ProcessAnimator: React.FC = ({ if (stateRef.delayComplete && stateRef.progress < 0.01) { stateRef.progress = 0.05; stateRef.delayComplete = false; + console.log( + `Boosting progress for object ${objectId} after delay` + ); } else { stateRef.progress += movement / distance; + console.log( + `Object ${objectId} progress: ${stateRef.progress.toFixed(3)}` + ); } // Handle point transition @@ -546,8 +542,12 @@ 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(