From 7d6df96d65a3d0fc524264f360cf4c80aba77243 Mon Sep 17 00:00:00 2001 From: DavidWyand-GG Date: Fri, 8 Nov 2013 17:31:52 -0500 Subject: [PATCH] ITickable supports object deletion This is a reworking of https://github.com/GarageGames/Torque3D/pull/436 to support object deletion of processTick() and advanceTime(). --- Engine/source/core/iTickable.cpp | 38 +++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/Engine/source/core/iTickable.cpp b/Engine/source/core/iTickable.cpp index 532a67a42..cb98e7cb9 100644 --- a/Engine/source/core/iTickable.cpp +++ b/Engine/source/core/iTickable.cpp @@ -86,15 +86,34 @@ bool ITickable::advanceTime( U32 timeDelta ) // Advance objects if( tickCount ) + { for( ; smLastTick != targetTick; smLastTick += smTickMs ) - for( ProcessListIterator i = getProcessList().begin(); i != getProcessList().end(); i++ ) - if( (*i)->isProcessingTicks() ) - (*i)->processTick(); + { + for( U32 i=0; i < getProcessList().size(); ) + { + ITickable* iTick = getProcessList()[i]; + if( iTick->isProcessingTicks() ) + { + iTick->processTick(); + + // Only advance counter if the tickable hasn't deleted itself + if( i < getProcessList().size() && iTick == getProcessList()[i] ) + ++i; + } + else + { + // Move onto the next tickable + ++i; + } + } + } + } smLastDelta = ( smTickMs - ( targetTime & smTickMask ) ) & smTickMask; F32 dt = smLastDelta / F32( smTickMs ); - // Now interpolate objects that want ticks + // Now interpolate objects that want ticks. Note that an object should never delete + // itself during an interpolateTick(). for( ProcessListIterator i = getProcessList().begin(); i != getProcessList().end(); i++ ) if( (*i)->isProcessingTicks() ) (*i)->interpolateTick( dt ); @@ -102,8 +121,15 @@ bool ITickable::advanceTime( U32 timeDelta ) // Inform ALL objects that time was advanced dt = F32( timeDelta ) / 1000.f; - for( ProcessListIterator i = getProcessList().begin(); i != getProcessList().end(); i++ ) - (*i)->advanceTime( dt ); + for( U32 i=0; i < getProcessList().size(); ) + { + ITickable* iTick = getProcessList()[i]; + iTick->advanceTime( dt ); + + // Only advance counter if the tickable hasn't deleted itself + if( i < getProcessList().size() && iTick == getProcessList()[i] ) + ++i; + } smLastTime = targetTime;