void AnimationGroup::changed(ConstFieldMaskArg whichField, UInt32 origin, BitVector details) { Inherited::changed(whichField, origin, details); //Do not respond to changes that have a Sync origin if(origin & ChangedOrigin::Sync) { return; } if((whichField & AnimationsFieldMask) || (whichField & OffsetFieldMask)) { for(UInt32 i = 0; i < getMFAnimations()->size(); ++i) { getAnimations(i)->setOffset(getOffset()); //commitChanges(); } } if((whichField & AnimationsFieldMask) || (whichField & SpanFieldMask)) { for(UInt32 i = 0; i < getMFAnimations()->size(); ++i) { getAnimations(i)->setSpan(getSpan()); //commitChanges(); } } }
Real32 AnimationGroup::getUnclippedCycleLength(void) const { if(getMFAnimations()->size() > 0) { return getAnimations(0)->getUnclippedCycleLength(); } else { return -1.0f; } }
/** * Destructor. * <p> * Free all stored animations. */ BaseView::~BaseView() { const std::vector<Animation*> animations = getAnimations(); for (Animation* animation : animations) { delete animation; } }
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()); }