X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fevent%2Fanimation%2Fanimation-impl.cpp;h=c09c4b166a87732955227da9367b13cd9e69c7ae;hb=5423c4b15c35798056e3f6a3af8d0275105e9517;hp=005e6b04e260223b312eb6eff4ec4c1af76ebf15;hpb=3bcb54791a6777e77f02612a1f7916e83ef1c86f;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/event/animation/animation-impl.cpp b/dali/internal/event/animation/animation-impl.cpp index 005e6b0..c09c4b1 100644 --- a/dali/internal/event/animation/animation-impl.cpp +++ b/dali/internal/event/animation/animation-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2016 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,10 +17,13 @@ // CLASS HEADER #include +#include + +// EXTERNAL INCLUDES // INTERNAL INCLUDES #include -#include +#include #include #include #include @@ -33,7 +36,7 @@ #include #include #include -#include +#include #include using Dali::Internal::SceneGraph::UpdateManager; @@ -78,6 +81,7 @@ TypeAction action3( mType, ACTION_PAUSE, &Animation::DoAction ); const Dali::Animation::EndAction DEFAULT_END_ACTION( Dali::Animation::Bake ); const Dali::Animation::EndAction DEFAULT_DISCONNECT_ACTION( Dali::Animation::BakeFinal ); const Dali::Animation::Interpolation DEFAULT_INTERPOLATION( Dali::Animation::Linear ); +const Dali::AlphaFunction DEFAULT_ALPHA_FUNCTION( Dali::AlphaFunction::DEFAULT ); } // anon namespace @@ -86,14 +90,27 @@ AnimationPtr Animation::New(float durationSeconds) { Stage* stage = Stage::GetCurrent(); - AnimationPlaylist& playlist = stage->GetAnimationPlaylist(); + if( stage ) + { + AnimationPlaylist& playlist = stage->GetAnimationPlaylist(); + + if( durationSeconds < 0.0f ) + { + DALI_LOG_WARNING("duration should be greater than 0.0f.\n"); + durationSeconds = 0.0f; + } - AnimationPtr animation = new Animation( *stage, playlist, durationSeconds, DEFAULT_END_ACTION, DEFAULT_DISCONNECT_ACTION, Dali::AlphaFunctions::Linear ); + AnimationPtr animation = new Animation( *stage, playlist, durationSeconds, DEFAULT_END_ACTION, DEFAULT_DISCONNECT_ACTION, DEFAULT_ALPHA_FUNCTION ); - // Second-phase construction - animation->Initialize(); + // Second-phase construction + animation->Initialize(); - return animation; + return animation; + } + else + { + return NULL; + } } Animation::Animation( EventThreadServices& eventThreadServices, AnimationPlaylist& playlist, float durationSeconds, EndAction endAction, EndAction disconnectAction, AlphaFunction defaultAlpha ) @@ -105,11 +122,13 @@ Animation::Animation( EventThreadServices& eventThreadServices, AnimationPlaylis mFinishedCallbackObject( NULL ), mDurationSeconds( durationSeconds ), mSpeedFactor(1.0f), - mIsLooping( false ), + mLoopCount(1), + mCurrentLoop(0), mPlayRange( Vector2(0.0f,1.0f)), mEndAction( endAction ), mDisconnectAction( disconnectAction ), - mDefaultAlpha( defaultAlpha ) + mDefaultAlpha( defaultAlpha ), + mState(Dali::Animation::STOPPED) { } @@ -142,7 +161,7 @@ void Animation::CreateSceneObject() DALI_ASSERT_DEBUG( mAnimation == NULL ); // Create a new animation, temporarily owned - SceneGraph::Animation* animation = SceneGraph::Animation::New( mDurationSeconds, mSpeedFactor, mPlayRange, mIsLooping, mEndAction, mDisconnectAction ); + SceneGraph::Animation* animation = SceneGraph::Animation::New( mDurationSeconds, mSpeedFactor, mPlayRange, mLoopCount, mEndAction, mDisconnectAction ); // Keep a const pointer to the animation. mAnimation = animation; @@ -163,6 +182,12 @@ void Animation::DestroySceneObject() void Animation::SetDuration(float seconds) { + if( seconds < 0.0f ) + { + DALI_LOG_WARNING("duration should be greater than 0.0f.\n"); + seconds = 0.0f; + } + // Cache for public getters mDurationSeconds = seconds; @@ -176,19 +201,33 @@ float Animation::GetDuration() const return mDurationSeconds; } -void Animation::SetLooping(bool looping) +void Animation::SetLooping(bool on) +{ + SetLoopCount( on ? 0 : 1 ); +} + +void Animation::SetLoopCount(int count) { // Cache for public getters - mIsLooping = looping; + mLoopCount = count; // mAnimation is being used in a separate thread; queue a message to set the value - SetLoopingMessage( mEventThreadServices, *mAnimation, looping ); + SetLoopingMessage( mEventThreadServices, *mAnimation, mLoopCount ); +} + +int Animation::GetLoopCount() +{ + return mLoopCount; +} + +int Animation::GetCurrentLoop() +{ + return mCurrentLoop; } bool Animation::IsLooping() const { - // This is not animatable; the cached value is up-to-date. - return mIsLooping; + return mLoopCount != 1; } void Animation::SetEndAction(EndAction action) @@ -226,6 +265,79 @@ void Animation::Play() // Update the current playlist mPlaylist.OnPlay( *this ); + mState = Dali::Animation::PLAYING; + + unsigned int connectorTargetValuesIndex( 0 ); + unsigned int numberOfConnectorTargetValues = mConnectorActorTargetValues.size(); + + /* + * Loop through all Animator connectors, if connector index matches the current index stored in mConnectorActorTargetValues container then + * should apply target values for this index to the Actor. + * Confirm object is an actor and it is a POSITION or SIZE Property Index before sending Notify message to Actor. + */ + for ( unsigned int connectorIndex = 0; connectorIndex < mConnectors.Count(); connectorIndex ++) + { + // Use index to check if the current connector is next in the mConnectorActorTargetValues container, meaning targetValues have been pushed in AnimateXXFunction + if ( connectorTargetValuesIndex < numberOfConnectorTargetValues ) + { + ConnectorTargetValues& connectorPair = mConnectorActorTargetValues[ connectorTargetValuesIndex ]; + + if ( connectorPair.connectorIndex == connectorIndex ) + { + // Current connector index matches next in the stored connectors with target values so apply target value. + connectorTargetValuesIndex++; // Found a match for connector so increment index to next one + + AnimatorConnectorBase* connector = mConnectors[ connectorIndex ]; + + Actor* maybeActor = static_cast( connector->GetObject() ); // Only Actors would be in mConnectorActorTargetValues container + + if ( maybeActor ) + { + // Get Stored Target Value and corresponding connector index + const Property::Type valueType = connectorPair.targetValue.GetType(); + Property::Index propertyIndex = connector->GetPropertyIndex(); + + if ( valueType == Property::VECTOR3 ) + { + Vector3 targetVector3 = connectorPair.targetValue.Get(); + + if ( propertyIndex == Dali::Actor::Property::POSITION ) + { + maybeActor->NotifyPositionAnimation( *this, targetVector3 ); + } + else if ( propertyIndex == Dali::Actor::Property::SIZE ) + { + maybeActor->NotifySizeAnimation( *this, targetVector3 ); + } + } + else if ( valueType == Property::FLOAT ) + { + float targetFloat = connectorPair.targetValue.Get(); + + if ( ( Dali::Actor::Property::POSITION_X == propertyIndex ) || + ( Dali::Actor::Property::POSITION_Y == propertyIndex ) || + ( Dali::Actor::Property::POSITION_Z == propertyIndex ) ) + { + maybeActor->NotifyPositionAnimation( *this, targetFloat, propertyIndex ); + } + else if ( ( Dali::Actor::Property::SIZE_WIDTH == propertyIndex ) || + ( Dali::Actor::Property::SIZE_HEIGHT == propertyIndex ) || + ( Dali::Actor::Property::SIZE_DEPTH == propertyIndex ) ) + + { + maybeActor->NotifySizeAnimation( *this, targetFloat, propertyIndex ); + } + } + else + { + // Currently only FLOAT and VECTOR3 is supported for Target values in AnimateXXFunctions + DALI_LOG_WARNING("Animation::Play Unsupported Value Type provided as TargetValue\n"); + } + } + } + } + } + // mAnimation is being used in a separate thread; queue a Play message PlayAnimationMessage( mEventThreadServices, *mAnimation ); } @@ -237,6 +349,8 @@ void Animation::PlayFrom( float progress ) // Update the current playlist mPlaylist.OnPlay( *this ); + mState = Dali::Animation::PLAYING; + // mAnimation is being used in a separate thread; queue a Play message PlayAnimationFromMessage( mEventThreadServices, *mAnimation, progress ); } @@ -244,12 +358,21 @@ void Animation::PlayFrom( float progress ) void Animation::Pause() { + mState = Dali::Animation::PAUSED; + // mAnimation is being used in a separate thread; queue a Pause message PauseAnimationMessage( mEventThreadServices, *mAnimation ); } +Dali::Animation::State Animation::GetState() const +{ + return mState; +} + void Animation::Stop() { + mState = Dali::Animation::STOPPED; + // mAnimation is being used in a separate thread; queue a Stop message StopAnimationMessage( mEventThreadServices.GetUpdateManager(), *mAnimation ); } @@ -274,26 +397,29 @@ void Animation::Clear() void Animation::AnimateBy(Property& target, Property::Value& relativeValue) { - AnimateBy(target, relativeValue, AlphaFunctions::Default, mDurationSeconds); + AnimateBy(target, relativeValue, mDefaultAlpha, TimePeriod(mDurationSeconds)); } void Animation::AnimateBy(Property& target, Property::Value& relativeValue, AlphaFunction alpha) { - AnimateBy(target, relativeValue, alpha, mDurationSeconds); + AnimateBy(target, relativeValue, alpha, TimePeriod(mDurationSeconds)); } void Animation::AnimateBy(Property& target, Property::Value& relativeValue, TimePeriod period) { - AnimateBy(target, relativeValue, AlphaFunctions::Default, period); + AnimateBy(target, relativeValue, mDefaultAlpha, period); } void Animation::AnimateBy(Property& target, Property::Value& relativeValue, AlphaFunction alpha, TimePeriod period) { - Object& object = dynamic_cast( GetImplementation(target.object) ); + Object& object = GetImplementation( target.object ); + const Property::Type targetType = object.GetPropertyType( target.propertyIndex ); + const Property::Type destinationType = relativeValue.GetType(); + DALI_ASSERT_ALWAYS( targetType == destinationType && "Animated value and Property type don't match" ); ExtendDuration( period ); - switch ( relativeValue.GetType() ) + switch ( targetType ) { case Property::BOOLEAN: { @@ -306,17 +432,6 @@ void Animation::AnimateBy(Property& target, Property::Value& relativeValue, Alph break; } - case Property::FLOAT: - { - AddAnimatorConnector( AnimatorConnector::New( object, - target.propertyIndex, - target.componentIndex, - new AnimateByFloat(relativeValue.Get()), - alpha, - period ) ); - break; - } - case Property::INTEGER: { AddAnimatorConnector( AnimatorConnector::New( object, @@ -328,6 +443,17 @@ void Animation::AnimateBy(Property& target, Property::Value& relativeValue, Alph break; } + case Property::FLOAT: + { + AddAnimatorConnector( AnimatorConnector::New( object, + target.propertyIndex, + target.componentIndex, + new AnimateByFloat(relativeValue.Get()), + alpha, + period ) ); + break; + } + case Property::VECTOR2: { AddAnimatorConnector( AnimatorConnector::New( object, @@ -375,50 +501,52 @@ void Animation::AnimateBy(Property& target, Property::Value& relativeValue, Alph } default: - DALI_ASSERT_ALWAYS( false && "Property type enumeration out of bounds" ); // should never come here - break; + { + // non animatable types handled already + } } } void Animation::AnimateTo(Property& target, Property::Value& destinationValue) { - AnimateTo(target, destinationValue, AlphaFunctions::Default, mDurationSeconds); + AnimateTo(target, destinationValue, mDefaultAlpha, TimePeriod(mDurationSeconds)); } void Animation::AnimateTo(Property& target, Property::Value& destinationValue, AlphaFunction alpha) { - AnimateTo(target, destinationValue, alpha, mDurationSeconds); + AnimateTo(target, destinationValue, alpha, TimePeriod(mDurationSeconds)); } void Animation::AnimateTo(Property& target, Property::Value& destinationValue, TimePeriod period) { - AnimateTo(target, destinationValue, AlphaFunctions::Default, period); + AnimateTo(target, destinationValue, mDefaultAlpha, period); } void Animation::AnimateTo(Property& target, Property::Value& destinationValue, AlphaFunction alpha, TimePeriod period) { - Object& object = dynamic_cast( GetImplementation(target.object) ); + Object& object = GetImplementation(target.object); AnimateTo( object, target.propertyIndex, target.componentIndex, destinationValue, alpha, period ); } void Animation::AnimateTo(Object& targetObject, Property::Index targetPropertyIndex, int componentIndex, Property::Value& destinationValue, AlphaFunction alpha, TimePeriod period) { - Property::Type type = targetObject.GetPropertyType(targetPropertyIndex); - if(componentIndex != Property::INVALID_COMPONENT_INDEX) + Property::Type targetType = targetObject.GetPropertyType(targetPropertyIndex); + if( componentIndex != Property::INVALID_COMPONENT_INDEX ) { - if( type == Property::VECTOR2 - || type == Property::VECTOR3 - || type == Property::VECTOR4 ) + if( ( targetType == Property::VECTOR2 ) || + ( targetType == Property::VECTOR3 ) || + ( targetType == Property::VECTOR4 ) ) { - type = Property::FLOAT; + targetType = Property::FLOAT; } } - DALI_ASSERT_ALWAYS( type == destinationValue.GetType() && "DestinationValue does not match Target Property type" ); + const Property::Type destinationType = destinationValue.GetType(); + DALI_ASSERT_ALWAYS( targetType == destinationType && "Animated value and Property type don't match" ); ExtendDuration( period ); - switch (destinationValue.GetType()) + switch ( destinationType ) { case Property::BOOLEAN: { @@ -431,17 +559,6 @@ void Animation::AnimateTo(Object& targetObject, Property::Index targetPropertyIn break; } - case Property::FLOAT: - { - AddAnimatorConnector( AnimatorConnector::New( targetObject, - targetPropertyIndex, - componentIndex, - new AnimateToFloat( destinationValue.Get() ), - alpha, - period ) ); - break; - } - case Property::INTEGER: { AddAnimatorConnector( AnimatorConnector::New( targetObject, @@ -453,6 +570,37 @@ void Animation::AnimateTo(Object& targetObject, Property::Index targetPropertyIn break; } + case Property::FLOAT: + { + if ( ( Dali::Actor::Property::SIZE_WIDTH == targetPropertyIndex ) || + ( Dali::Actor::Property::SIZE_HEIGHT == targetPropertyIndex ) || + ( Dali::Actor::Property::SIZE_DEPTH == targetPropertyIndex ) || + ( Dali::Actor::Property::POSITION_X == targetPropertyIndex ) || + ( Dali::Actor::Property::POSITION_Y == targetPropertyIndex ) || + ( Dali::Actor::Property::POSITION_Z == targetPropertyIndex ) ) + { + + Actor* maybeActor = dynamic_cast( &targetObject ); + if ( maybeActor ) + { + // Store data to later notify the actor that its size or position is being animated + ConnectorTargetValues connectorPair; + connectorPair.targetValue = destinationValue; + connectorPair.connectorIndex = mConnectors.Count(); + + mConnectorActorTargetValues.push_back( connectorPair ); + } + } + + AddAnimatorConnector( AnimatorConnector::New( targetObject, + targetPropertyIndex, + componentIndex, + new AnimateToFloat( destinationValue.Get() ), + alpha, + period ) ); + break; + } + case Property::VECTOR2: { AddAnimatorConnector( AnimatorConnector::New( targetObject, @@ -466,14 +614,18 @@ void Animation::AnimateTo(Object& targetObject, Property::Index targetPropertyIn case Property::VECTOR3: { - if ( Dali::Actor::Property::SIZE == targetPropertyIndex ) + if ( Dali::Actor::Property::SIZE == targetPropertyIndex || Dali::Actor::Property::POSITION == targetPropertyIndex ) { // Test whether this is actually an Actor Actor* maybeActor = dynamic_cast( &targetObject ); if ( maybeActor ) { - // Notify the actor that its size is being animated - maybeActor->NotifySizeAnimation( *this, destinationValue.Get() ); + // Store data to later notify the actor that its size or position is being animated + ConnectorTargetValues connectorPair; + connectorPair.targetValue = destinationValue; + connectorPair.connectorIndex = mConnectors.Count(); + + mConnectorActorTargetValues.push_back( connectorPair ); } } @@ -509,19 +661,20 @@ void Animation::AnimateTo(Object& targetObject, Property::Index targetPropertyIn } default: - DALI_ASSERT_ALWAYS( false && "Property type enumeration out of bounds" ); // should never come here - break; + { + // non animatable types handled already + } } } void Animation::AnimateBetween(Property target, const KeyFrames& keyFrames) { - AnimateBetween(target, keyFrames, mDefaultAlpha, mDurationSeconds, DEFAULT_INTERPOLATION ); + AnimateBetween(target, keyFrames, mDefaultAlpha, TimePeriod(mDurationSeconds), DEFAULT_INTERPOLATION ); } void Animation::AnimateBetween(Property target, const KeyFrames& keyFrames, Interpolation interpolation ) { - AnimateBetween(target, keyFrames, mDefaultAlpha, mDurationSeconds, interpolation ); + AnimateBetween(target, keyFrames, mDefaultAlpha, TimePeriod(mDurationSeconds), interpolation ); } void Animation::AnimateBetween(Property target, const KeyFrames& keyFrames, TimePeriod period) @@ -536,12 +689,12 @@ void Animation::AnimateBetween(Property target, const KeyFrames& keyFrames, Time void Animation::AnimateBetween(Property target, const KeyFrames& keyFrames, AlphaFunction alpha) { - AnimateBetween(target, keyFrames, alpha, mDurationSeconds, DEFAULT_INTERPOLATION); + AnimateBetween(target, keyFrames, alpha, TimePeriod(mDurationSeconds), DEFAULT_INTERPOLATION); } void Animation::AnimateBetween(Property target, const KeyFrames& keyFrames, AlphaFunction alpha, Interpolation interpolation) { - AnimateBetween(target, keyFrames, alpha, mDurationSeconds, interpolation); + AnimateBetween(target, keyFrames, alpha, TimePeriod(mDurationSeconds), interpolation); } void Animation::AnimateBetween(Property target, const KeyFrames& keyFrames, AlphaFunction alpha, TimePeriod period) @@ -551,7 +704,7 @@ void Animation::AnimateBetween(Property target, const KeyFrames& keyFrames, Alph void Animation::AnimateBetween(Property target, const KeyFrames& keyFrames, AlphaFunction alpha, TimePeriod period, Interpolation interpolation) { - Object& object = dynamic_cast( GetImplementation(target.object) ); + Object& object = GetImplementation( target.object ); ExtendDuration( period ); @@ -571,20 +724,6 @@ void Animation::AnimateBetween(Property target, const KeyFrames& keyFrames, Alph break; } - case Dali::Property::FLOAT: - { - const KeyFrameNumber* kf; - GetSpecialization(keyFrames, kf); - KeyFrameNumberPtr kfCopy = KeyFrameNumber::Clone(*kf); - AddAnimatorConnector( AnimatorConnector::New( object, - target.propertyIndex, - target.componentIndex, - new KeyFrameNumberFunctor(kfCopy,interpolation), - alpha, - period ) ); - break; - } - case Dali::Property::INTEGER: { const KeyFrameInteger* kf; @@ -599,6 +738,20 @@ void Animation::AnimateBetween(Property target, const KeyFrames& keyFrames, Alph break; } + case Dali::Property::FLOAT: + { + const KeyFrameNumber* kf; + GetSpecialization(keyFrames, kf); + KeyFrameNumberPtr kfCopy = KeyFrameNumber::Clone(*kf); + AddAnimatorConnector( AnimatorConnector::New( object, + target.propertyIndex, + target.componentIndex, + new KeyFrameNumberFunctor(kfCopy,interpolation), + alpha, + period ) ); + break; + } + case Dali::Property::VECTOR2: { const KeyFrameVector2* kf; @@ -655,23 +808,29 @@ void Animation::AnimateBetween(Property target, const KeyFrames& keyFrames, Alph break; } - default: // not all property types are animateable - break; + default: + { + // non animatable types handled by keyframes + } } } bool Animation::HasFinished() { bool hasFinished(false); - const int playCount(mAnimation->GetPlayCount()); + const int playedCount(mAnimation->GetPlayedCount()); // If the play count has been incremented, then another notification is required - if (playCount > mNotificationCount) + mCurrentLoop = mAnimation->GetCurrentLoop(); + + if (playedCount > mNotificationCount) { // Note that only one signal is emitted, if the animation has been played repeatedly - mNotificationCount = playCount; + mNotificationCount = playedCount; hasFinished = true; + + mState = Dali::Animation::STOPPED; } return hasFinished; @@ -700,9 +859,9 @@ void Animation::EmitSignalFinish() bool Animation::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor ) { bool connected( true ); - Animation* animation = dynamic_cast(object); + Animation* animation = static_cast< Animation* >(object); // TypeRegistry guarantees that this is the correct type. - if ( 0 == strcmp( signalName.c_str(), SIGNAL_FINISHED ) ) + if( 0 == signalName.compare( SIGNAL_FINISHED ) ) { animation->FinishedSignal().Connect( tracker, functor ); } @@ -732,12 +891,12 @@ void Animation::AddAnimatorConnector( AnimatorConnectorBase* connector ) void Animation::Animate( Actor& actor, const Path& path, const Vector3& forward ) { - Animate( actor, path, forward, mDefaultAlpha, TimePeriod(0.0f,GetDuration()) ); + Animate( actor, path, forward, mDefaultAlpha, TimePeriod(mDurationSeconds) ); } void Animation::Animate( Actor& actor, const Path& path, const Vector3& forward, AlphaFunction alpha ) { - Animate( actor, path, forward, alpha, TimePeriod(0.0f,GetDuration()) ); + Animate( actor, path, forward, alpha, TimePeriod(mDurationSeconds) ); } void Animation::Animate( Actor& actor, const Path& path, const Vector3& forward, TimePeriod period ) @@ -772,168 +931,6 @@ void Animation::Animate( Actor& actor, const Path& path, const Vector3& forward, } } -void Animation::MoveBy(Actor& actor, float x, float y, float z) -{ - MoveBy(actor, Vector3(x, y, z), mDefaultAlpha, 0.0f, GetDuration()); -} - -void Animation::MoveBy(Actor& actor, const Vector3& displacement, AlphaFunction alpha) -{ - MoveBy(actor, displacement, alpha, 0.0f, GetDuration()); -} - -void Animation::MoveBy(Actor& actor, const Vector3& displacement, AlphaFunction alpha, float delaySeconds, float durationSeconds) -{ - ExtendDuration( TimePeriod(delaySeconds, durationSeconds) ); - - AddAnimatorConnector( AnimatorConnector::New( actor, - Dali::Actor::Property::POSITION, - Property::INVALID_COMPONENT_INDEX, - new AnimateByVector3(displacement), - alpha, - TimePeriod(delaySeconds, durationSeconds) ) ); -} - -void Animation::MoveTo(Actor& actor, float x, float y, float z) -{ - MoveTo(actor, Vector3(x, y, z), mDefaultAlpha, 0.0f, GetDuration()); -} - -void Animation::MoveTo(Actor& actor, const Vector3& position, AlphaFunction alpha) -{ - MoveTo(actor, position, alpha, 0.0f, GetDuration()); -} - -void Animation::MoveTo(Actor& actor, const Vector3& position, AlphaFunction alpha, float delaySeconds, float durationSeconds) -{ - ExtendDuration( TimePeriod(delaySeconds, durationSeconds) ); - - AddAnimatorConnector( AnimatorConnector::New( actor, - Dali::Actor::Property::POSITION, - Property::INVALID_COMPONENT_INDEX, - new AnimateToVector3(position), - alpha, - TimePeriod(delaySeconds, durationSeconds) ) ); -} - -void Animation::RotateBy(Actor& actor, Radian angle, const Vector3& axis) -{ - RotateBy(actor, angle, axis, mDefaultAlpha, 0.0f, GetDuration()); -} - -void Animation::RotateBy(Actor& actor, Radian angle, const Vector3& axis, AlphaFunction alpha) -{ - RotateBy(actor, angle, axis, alpha, 0.0f, GetDuration()); -} - -void Animation::RotateBy(Actor& actor, Radian angle, const Vector3& axis, AlphaFunction alpha, float delaySeconds, float durationSeconds) -{ - ExtendDuration( TimePeriod(delaySeconds, durationSeconds) ); - - AddAnimatorConnector( AnimatorConnector::New( actor, - Dali::Actor::Property::ORIENTATION, - Property::INVALID_COMPONENT_INDEX, - new RotateByAngleAxis(angle, axis), - alpha, - TimePeriod(delaySeconds, durationSeconds) ) ); -} - -void Animation::RotateTo(Actor& actor, Radian angle, const Vector3& axis) -{ - Vector4 normalizedAxis(axis.x, axis.y, axis.z, 0.0f); - normalizedAxis.Normalize(); - - Quaternion orientation(Quaternion::FromAxisAngle(normalizedAxis, angle)); - - RotateTo(actor, orientation, mDefaultAlpha, 0.0f, GetDuration()); -} - -void Animation::RotateTo(Actor& actor, const Quaternion& orientation) -{ - RotateTo(actor, orientation, mDefaultAlpha, 0.0f, GetDuration()); -} - -void Animation::RotateTo(Actor& actor, Radian angle, const Vector3& axis, AlphaFunction alpha) -{ - Vector4 normalizedAxis(axis.x, axis.y, axis.z, 0.0f); - normalizedAxis.Normalize(); - - Quaternion orientation(Quaternion::FromAxisAngle(normalizedAxis, angle)); - - RotateTo(actor, orientation, alpha, 0.0f, GetDuration()); -} - -void Animation::RotateTo(Actor& actor, const Quaternion& orientation, AlphaFunction alpha) -{ - RotateTo(actor, orientation, alpha, 0.0f, GetDuration()); -} - -void Animation::RotateTo(Actor& actor, Radian angle, const Vector3& axis, AlphaFunction alpha, float delaySeconds, float durationSeconds) -{ - Vector4 normalizedAxis(axis.x, axis.y, axis.z, 0.0f); - normalizedAxis.Normalize(); - - Quaternion orientation(Quaternion::FromAxisAngle(normalizedAxis, angle)); - - RotateTo(actor, orientation, alpha, delaySeconds, durationSeconds); -} - -void Animation::RotateTo(Actor& actor, const Quaternion& rotation, AlphaFunction alpha, float delaySeconds, float durationSeconds) -{ - ExtendDuration( TimePeriod(delaySeconds, durationSeconds) ); - - AddAnimatorConnector( AnimatorConnector::New( actor, - Dali::Actor::Property::ORIENTATION, - Property::INVALID_COMPONENT_INDEX, - new RotateToQuaternion(rotation), - alpha, - TimePeriod(delaySeconds, durationSeconds) ) ); -} - -void Animation::ScaleBy(Actor& actor, float x, float y, float z) -{ - ScaleBy(actor, Vector3(x, y, z), mDefaultAlpha, 0.0f, GetDuration()); -} - -void Animation::ScaleBy(Actor& actor, const Vector3& scale, AlphaFunction alpha) -{ - ScaleBy(actor, scale, alpha, 0.0f, GetDuration()); -} - -void Animation::ScaleBy(Actor& actor, const Vector3& scale, AlphaFunction alpha, float delaySeconds, float durationSeconds) -{ - ExtendDuration( TimePeriod(delaySeconds, durationSeconds) ); - - AddAnimatorConnector( AnimatorConnector::New( actor, - Dali::Actor::Property::SCALE, - Property::INVALID_COMPONENT_INDEX, - new AnimateByVector3(scale), - alpha, - TimePeriod(delaySeconds, durationSeconds) ) ); -} - -void Animation::ScaleTo(Actor& actor, float x, float y, float z) -{ - ScaleTo(actor, Vector3(x, y, z), mDefaultAlpha, 0.0f, GetDuration()); -} - -void Animation::ScaleTo(Actor& actor, const Vector3& scale, AlphaFunction alpha) -{ - ScaleTo(actor, scale, alpha, 0.0f, GetDuration()); -} - -void Animation::ScaleTo(Actor& actor, const Vector3& scale, AlphaFunction alpha, float delaySeconds, float durationSeconds) -{ - ExtendDuration( TimePeriod(delaySeconds, durationSeconds) ); - - AddAnimatorConnector( AnimatorConnector::New( actor, - Dali::Actor::Property::SCALE, - Property::INVALID_COMPONENT_INDEX, - new AnimateToVector3(scale), - alpha, - TimePeriod(delaySeconds, durationSeconds) ) ); -} - void Animation::Show(Actor& actor, float delaySeconds) { ExtendDuration( TimePeriod(delaySeconds, 0) ); @@ -942,7 +939,7 @@ void Animation::Show(Actor& actor, float delaySeconds) Dali::Actor::Property::VISIBLE, Property::INVALID_COMPONENT_INDEX, new AnimateToBoolean(SHOW_VALUE), - AlphaFunctions::Default, + mDefaultAlpha, TimePeriod(delaySeconds, 0.0f/*immediate*/) ) ); } @@ -954,173 +951,33 @@ void Animation::Hide(Actor& actor, float delaySeconds) Dali::Actor::Property::VISIBLE, Property::INVALID_COMPONENT_INDEX, new AnimateToBoolean(HIDE_VALUE), - AlphaFunctions::Default, + mDefaultAlpha, TimePeriod(delaySeconds, 0.0f/*immediate*/) ) ); } -void Animation::OpacityBy(Actor& actor, float opacity) -{ - OpacityBy(actor, opacity, mDefaultAlpha, 0.0f, GetDuration()); -} - -void Animation::OpacityBy(Actor& actor, float opacity, AlphaFunction alpha) -{ - OpacityBy(actor, opacity, alpha, 0.0f, GetDuration()); -} - -void Animation::OpacityBy(Actor& actor, float opacity, AlphaFunction alpha, float delaySeconds, float durationSeconds) -{ - ExtendDuration( TimePeriod(delaySeconds, durationSeconds) ); - - AddAnimatorConnector( AnimatorConnector::New( actor, - Dali::Actor::Property::COLOR, - Property::INVALID_COMPONENT_INDEX, - new AnimateByOpacity(opacity), - alpha, - TimePeriod(delaySeconds, durationSeconds) ) ); -} - -void Animation::OpacityTo(Actor& actor, float opacity) -{ - OpacityTo(actor, opacity, mDefaultAlpha, 0.0f, GetDuration()); -} - -void Animation::OpacityTo(Actor& actor, float opacity, AlphaFunction alpha) -{ - OpacityTo(actor, opacity, alpha, 0.0f, GetDuration()); -} - -void Animation::OpacityTo(Actor& actor, float opacity, AlphaFunction alpha, float delaySeconds, float durationSeconds) -{ - ExtendDuration( TimePeriod(delaySeconds, durationSeconds) ); - - AddAnimatorConnector( AnimatorConnector::New( actor, - Dali::Actor::Property::COLOR, - Property::INVALID_COMPONENT_INDEX, - new AnimateToOpacity(opacity), - alpha, - TimePeriod(delaySeconds, durationSeconds) ) ); -} - -void Animation::ColorBy(Actor& actor, const Vector4& color) -{ - ColorBy(actor, color, mDefaultAlpha, 0.0f, GetDuration()); -} - -void Animation::ColorBy(Actor& actor, const Vector4& color, AlphaFunction alpha) -{ - ColorBy(actor, color, alpha, 0.0f, GetDuration()); -} - -void Animation::ColorBy(Actor& actor, const Vector4& color, AlphaFunction alpha, float delaySeconds, float durationSeconds) -{ - ExtendDuration( TimePeriod(delaySeconds, durationSeconds) ); - - AddAnimatorConnector( AnimatorConnector::New( actor, - Dali::Actor::Property::COLOR, - Property::INVALID_COMPONENT_INDEX, - new AnimateByVector4(color), - alpha, - TimePeriod(delaySeconds, durationSeconds) ) ); -} - -void Animation::ColorTo(Actor& actor, const Vector4& color) -{ - ColorTo(actor, color, mDefaultAlpha, 0.0f, GetDuration()); -} - -void Animation::ColorTo(Actor& actor, const Vector4& color, AlphaFunction alpha) -{ - ColorTo(actor, color, alpha, 0.0f, GetDuration()); -} - -void Animation::ColorTo(Actor& actor, const Vector4& color, AlphaFunction alpha, float delaySeconds, float durationSeconds) -{ - ExtendDuration( TimePeriod(delaySeconds, durationSeconds) ); - - AddAnimatorConnector( AnimatorConnector::New( actor, - Dali::Actor::Property::COLOR, - Property::INVALID_COMPONENT_INDEX, - new AnimateToVector4(color), - alpha, - TimePeriod(delaySeconds, durationSeconds) ) ); -} - -void Animation::Resize(Actor& actor, float width, float height) -{ - Resize(actor, width, height, mDefaultAlpha, 0.0f, GetDuration()); -} - -void Animation::Resize(Actor& actor, float width, float height, AlphaFunction alpha) -{ - Resize(actor, width, height, alpha, 0.0f, GetDuration()); -} - -void Animation::Resize(Actor& actor, float width, float height, AlphaFunction alpha, float delaySeconds, float durationSeconds) -{ - Vector3 targetSize( width, height, std::min(width, height) ); - - ExtendDuration( TimePeriod(delaySeconds, durationSeconds) ); - - // Notify the actor impl that its size is being animated - actor.NotifySizeAnimation( *this, targetSize ); - - AddAnimatorConnector( AnimatorConnector::New( actor, - Dali::Actor::Property::SIZE, - Property::INVALID_COMPONENT_INDEX, - new AnimateToVector3(targetSize), - alpha, - TimePeriod(delaySeconds, durationSeconds) ) ); -} - -void Animation::Resize(Actor& actor, const Vector3& size) -{ - Resize(actor, size, mDefaultAlpha, 0.0f, GetDuration()); -} - -void Animation::Resize(Actor& actor, const Vector3& size, AlphaFunction alpha) -{ - Resize(actor, size, alpha, 0.0f, GetDuration()); -} - -void Animation::Resize(Actor& actor, const Vector3& size, AlphaFunction alpha, float delaySeconds, float durationSeconds) -{ - ExtendDuration( TimePeriod(delaySeconds, durationSeconds) ); - - // Notify the actor impl that its size is being animated - actor.NotifySizeAnimation( *this, size ); - - AddAnimatorConnector( AnimatorConnector::New( actor, - Dali::Actor::Property::SIZE, - Property::INVALID_COMPONENT_INDEX, - new AnimateToVector3(size), - alpha, - TimePeriod(delaySeconds, durationSeconds) ) ); -} - -bool Animation::DoAction( BaseObject* object, const std::string& actionName, const std::vector& attributes ) +bool Animation::DoAction( BaseObject* object, const std::string& actionName, const Property::Map& attributes ) { bool done = false; Animation* animation = dynamic_cast( object ); if( animation ) { - if( 0 == strcmp( actionName.c_str(), ACTION_PLAY ) ) + if( 0 == actionName.compare( ACTION_PLAY ) ) { - if( attributes.size() > 0 ) + if( Property::Value* value = attributes.Find("duration", Property::FLOAT) ) { - animation->SetDuration( attributes[0].Get() ); + animation->SetDuration( value->Get() ); } animation->Play(); done = true; } - else if( 0 == strcmp( actionName.c_str(), ACTION_STOP ) ) + else if( 0 == actionName.compare( ACTION_STOP ) ) { animation->Stop(); done = true; } - else if( 0 == strcmp( actionName.c_str(), ACTION_PAUSE ) ) + else if( 0 == actionName.compare( ACTION_PAUSE ) ) { animation->Pause(); done = true;