/*! * \fn bool OSG::Animation::update(const Time& ElapsedTime) * * \brief Update the animation with the time since the last update * * The result of the animation will also be applied to the * object it is connected to. * * \param[in] ElapsedTime The time, in seconds, since the previous call to * update. */ bool Animation::update(const Time& ElapsedTime) { if(!_IsPlaying || _IsPaused) { return false; } //Increment the updated animations statistic StatIntElem *NAnimationsStatElem = StatCollector::getGlobalElem(statNAnimations); if(NAnimationsStatElem) { NAnimationsStatElem->inc(); } //Start the animation update time statistic StatTimeElem *AnimUpdateTimeStatElem = StatCollector::getGlobalElem(statAnimUpdateTime); if(AnimUpdateTimeStatElem) { AnimUpdateTimeStatElem->start(); } _CurrentTime += getScale()*ElapsedTime; UInt32 PreUpdateCycleCount(getCycles()); if(getCycling() < 0 || PreUpdateCycleCount < getCycling()) { Real32 CycleLength(getCycleLength() * getScale()); //Check if the Animation Time is past the end if(_CurrentTime >= CycleLength) { //Update the number of cycles completed setCycles( (CycleLength <= 0.0f) ? (0): (static_cast<UInt32>( osgFloor( _CurrentTime / CycleLength ) )) ); //commitChanges(); } Real32 t(_CurrentTime); if(getCycling() > 0 && getCycles() >= getCycling()) { if(getSpan() > 0.0f) { t = getSpan(); } t -= 0.0001f; } else { if(getSpan() > 0.0f) { t -= osgFloor(_CurrentTime/getSpan())*getSpan(); } } t += getOffset(); //Internal Update internalUpdate(t, _PrevTime); //If the number of cycles has changed if(getCycles() != PreUpdateCycleCount) { if(getCycling() > 0 && getCycles() >= getCycling()) { //Animation has reached the end //Remove the Animation from it's update producer _UpdateEventConnection.disconnect(); _IsPlaying = false; //Produce the Ended event produceAnimationEnded(); } else { //Animation hasn't finished yet //Produce the Cycled event produceAnimationCycled(); } } } _PrevTime = _CurrentTime; //Stp[ the animation update time statistic if(AnimUpdateTimeStatElem) { AnimUpdateTimeStatElem->stop(); } //Return true if the animation has completed its number of cycles, false otherwise return (getCycling() > 0 && getCycles() >= getCycling()); }
bool AnimationGroup::update(const Time& ElapsedTime) { if(!_IsPlaying || _IsPaused) { return false; } _CurrentTime += getScale()*ElapsedTime; UInt32 PreUpdateCycleCount(getCycles()); if(getCycling() < 0 || PreUpdateCycleCount < getCycling()) { Real32 CycleLength(getCycleLength() * getScale()); //Check if the Animation Time is past the end if(_CurrentTime >= CycleLength) { //Update the number of cycles completed setCycles( (CycleLength <= 0.0f) ? (0): (static_cast<UInt32>( osgFloor( _CurrentTime / CycleLength ) )) ); //commitChanges(); } Real32 t(_CurrentTime); if(getCycling() > 0 && getCycles() >= getCycling()) { if(getSpan() > 0.0f) { t = getSpan(); } else { t = CycleLength; } t -= 0.0001f; } else { if(getSpan() > 0.0f) { t -= osgFloor(_CurrentTime/getSpan())*getSpan(); } } t += getOffset(); //Internal Update for(UInt32 i = 0; i < getMFAnimations()->size(); ++i) { getAnimations(i)->internalUpdate(t, _PrevTime); } //If the number of cycles has changed if(getCycles() != PreUpdateCycleCount) { if(getCycling() > 0 && getCycles() >= getCycling()) { //Animation has reached the end //Remove the Animation from it's update producer _UpdateEventConnection.disconnect(); _IsPlaying = false; //Produce the Ended event produceAnimationEnded(); } else { //Animation hasn't finished yet //Produce the Cycled event produceAnimationCycled(); } } } _PrevTime = _CurrentTime; //Return true if the animation has completed its number of cycles, false otherwise return (getCycling() > 0 && getCycles() >= getCycling()); }