@ -35,7 +35,7 @@
namespace Magnum { namespace SceneGraph {
template < UnsignedInt dimensions , class T > Animable < dimensions , T > : : Animable ( AbstractObject < dimensions , T > * object , AnimableGroup < dimensions , T > * group ) : AbstractGroupedFeature < dimensions , Animable < dimensions , T > , T > ( object , group ) , _duration ( 0.0f ) , startTime ( std : : numeric_limits < Float > : : infinity ( ) ) , pauseTime ( - std : : numeric_limits < Float > : : infinity ( ) ) , previousState ( AnimationState : : Stopped ) , currentState ( AnimationState : : Stopped ) , _repeated ( false ) , _repeatCount ( 0 ) , repeats ( 0 ) { }
template < UnsignedInt dimensions , class T > Animable < dimensions , T > : : Animable ( AbstractObject < dimensions , T > & object , AnimableGroup < dimensions , T > * group ) : AbstractGroupedFeature < dimensions , Animable < dimensions , T > , T > ( object , group ) , _duration ( 0.0f ) , startTime ( std : : numeric_limits < Float > : : infinity ( ) ) , pauseTime ( - std : : numeric_limits < Float > : : infinity ( ) ) , previousState ( AnimationState : : Stopped ) , currentState ( AnimationState : : Stopped ) , _repeated ( false ) , _repeatCount ( 0 ) , repeats ( 0 ) { }
template < UnsignedInt dimensions , class T > Animable < dimensions , T > : : ~ Animable ( ) { }
@ -65,74 +65,74 @@ template<UnsignedInt dimensions, class T> void AnimableGroup<dimensions, T>::ste
wakeUp = false ;
for ( std : : size_t i = 0 ; i ! = AnimableGroup < dimensions , T > : : size ( ) ; + + i ) {
Animable < dimensions , T > * animable = ( * this ) [ i ] ;
Animable < dimensions , T > & animable = ( * this ) [ i ] ;
/* The animation was stopped recently, just decrease count of running
animations if the animation was running before */
if ( animable - > previousState ! = AnimationState : : Stopped & & animable - > currentState = = AnimationState : : Stopped ) {
if ( animable - > previousState = = AnimationState : : Running )
if ( animable . previousState ! = AnimationState : : Stopped & & animable . currentState = = AnimationState : : Stopped ) {
if ( animable . previousState = = AnimationState : : Running )
- - _runningCount ;
animable - > previousState = AnimationState : : Stopped ;
animable - > animationStopped ( ) ;
animable . previousState = AnimationState : : Stopped ;
animable . animationStopped ( ) ;
continue ;
/* The animation was paused recently, set pause time to previous frame time */
} else if ( animable - > previousState = = AnimationState : : Running & & animable - > currentState = = AnimationState : : Paused ) {
animable - > previousState = AnimationState : : Paused ;
animable - > pauseTime = time ;
} else if ( animable . previousState = = AnimationState : : Running & & animable . currentState = = AnimationState : : Paused ) {
animable . previousState = AnimationState : : Paused ;
animable . pauseTime = time ;
- - _runningCount ;
animable - > animationPaused ( ) ;
animable . animationPaused ( ) ;
continue ;
/* Skip the rest for not running animations */
} else if ( animable - > currentState ! = AnimationState : : Running ) {
CORRADE_INTERNAL_ASSERT ( animable - > previousState = = animable - > currentState ) ;
} else if ( animable . currentState ! = AnimationState : : Running ) {
CORRADE_INTERNAL_ASSERT ( animable . previousState = = animable . currentState ) ;
continue ;
/* The animation was started recently, set start time to previous frame
time , reset repeat count */
} else if ( animable - > previousState = = AnimationState : : Stopped ) {
animable - > previousState = AnimationState : : Running ;
animable - > startTime = time ;
animable - > repeats = 0 ;
} else if ( animable . previousState = = AnimationState : : Stopped ) {
animable . previousState = AnimationState : : Running ;
animable . startTime = time ;
animable . repeats = 0 ;
+ + _runningCount ;
animable - > animationStarted ( ) ;
animable . animationStarted ( ) ;
/* The animation was resumed recently, add pause duration to start time */
} else if ( animable - > previousState = = AnimationState : : Paused ) {
animable - > previousState = AnimationState : : Running ;
animable - > startTime + = time - animable - > pauseTime ;
} else if ( animable . previousState = = AnimationState : : Paused ) {
animable . previousState = AnimationState : : Running ;
animable . startTime + = time - animable . pauseTime ;
+ + _runningCount ;
animable - > animationResumed ( ) ;
animable . animationResumed ( ) ;
}
CORRADE_INTERNAL_ASSERT ( animable - > previousState = = AnimationState : : Running ) ;
CORRADE_INTERNAL_ASSERT ( animable . previousState = = AnimationState : : Running ) ;
/* Animation time exceeded duration */
if ( animable - > _duration ! = 0.0f & & time - animable - > startTime > animable - > _duration ) {
if ( animable . _duration ! = 0.0f & & time - animable . startTime > animable . _duration ) {
/* Not repeated or repeat count exceeded, stop */
if ( ! animable - > _repeated | | animable - > repeats + 1 = = animable - > _repeatCount ) {
animable - > previousState = AnimationState : : Stopped ;
animable - > currentState = AnimationState : : Stopped ;
if ( ! animable . _repeated | | animable . repeats + 1 = = animable . _repeatCount ) {
animable . previousState = AnimationState : : Stopped ;
animable . currentState = AnimationState : : Stopped ;
- - _runningCount ;
animable - > animationStopped ( ) ;
animable . animationStopped ( ) ;
continue ;
}
/* Increase repeat count and add duration to startTime */
+ + animable - > repeats ;
animable - > startTime + = animable - > _duration ;
+ + animable . repeats ;
animable . startTime + = animable . _duration ;
}
/* Animation is still running, perform animation step */
CORRADE_ASSERT ( time - animable - > startTime > = 0.0f ,
CORRADE_ASSERT ( time - animable . startTime > = 0.0f ,
" SceneGraph::AnimableGroup::step(): animation was started in future - probably wrong time passed " , ) ;
CORRADE_ASSERT ( delta > = 0.0f ,
" SceneGraph::AnimableGroup::step(): negative delta passed " , ) ;
animable - > animationStep ( time - animable - > startTime , delta ) ;
animable . animationStep ( time - animable . startTime , delta ) ;
}
CORRADE_INTERNAL_ASSERT ( _runningCount < = AnimableGroup < dimensions , T > : : size ( ) ) ;
CORRADE_INTERNAL_ASSERT ( ( _runningCount < = AnimableGroup < dimensions , T > : : size ( ) ) ) ;
}
} }