"multiple spawn bug fixed"

This commit is contained in:
SreeNath14 2025-04-16 15:07:11 +05:30
parent 8b7b7f589a
commit 0eedbdd58e
1 changed files with 45 additions and 14 deletions

View File

@ -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<ProcessContainerProps> = ({
const gltf = useLoader(GLTFLoader, crate) as GLTF;
const groupRef = useRef<THREE.Group>(null);
const tempStackedObjectsRef = useRef<Record<string, boolean>>({});
const [previouslyConnected, setPreviouslyConnected] = useState<any>({});
const currentSpawnedObjectRef = useRef<any>(null);
const {
animationStates,
@ -116,8 +124,6 @@ const ProcessAnimator: React.FC<ProcessContainerProps> = ({
});
}, [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<ProcessContainerProps> = ({
// 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<ProcessContainerProps> = ({
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<ProcessContainerProps> = ({
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<ProcessContainerProps> = ({
[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<ProcessContainerProps> = ({
// 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<ProcessContainerProps> = ({
return;
}
// Check connection status with debugging
// Check connection status
const isConnected = isConnectedToActiveArmBot(process.id);
if (isConnected) {
@ -263,6 +297,7 @@ const ProcessAnimator: React.FC<ProcessContainerProps> = ({
[id]: {
...obj,
state: {
visible: true,
...obj.state,
isAnimating: false, // Stop animation
isDelaying: false, // Clear delays
@ -511,12 +546,8 @@ const ProcessAnimator: React.FC<ProcessContainerProps> = ({
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<ProcessContainerProps> = ({
// 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] = {