#define __DALI_INTERNAL_ANIMATION_H__
/*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 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.
#include <dali/public-api/object/ref-object.h>
#include <dali/public-api/animation/animation.h>
#include <dali/public-api/object/base-object.h>
-#include <dali/internal/event/animation/animator-connector-base.h>
+#include <dali/devel-api/animation/animation-devel.h>
+#include <dali/devel-api/common/owner-container.h>
#include <dali/internal/event/animation/key-frames-impl.h>
-#include <dali/internal/event/animation/path-impl.h>
+#include <dali/internal/event/common/event-thread-services.h>
namespace Dali
{
class Actor;
class Animation;
class AnimationPlaylist;
+class AnimatorConnectorBase;
class Object;
-class ShaderEffect;
+class Path;
typedef IntrusivePtr<Animation> AnimationPtr;
typedef std::vector<AnimationPtr> AnimationContainer;
{
public:
+ enum Type
+ {
+ TO, ///< Animating TO the given value
+ BY, ///< Animating BY the given value
+ BETWEEN ///< Animating BETWEEN key-frames
+ };
+
typedef Dali::Animation::EndAction EndAction;
typedef Dali::Animation::Interpolation Interpolation;
- typedef void (*FinishedCallback)(Object* object);
-
/**
* Create a new Animation object.
* @param[in] durationSeconds The duration of the animation.
void SetDuration(float seconds);
/**
+ * @copydoc Dali::DevelAnimation::SetProgressNotification()
+ */
+ void SetProgressNotification( float progress );
+
+ /**
+ * @copydoc Dali::DevelAnimation::GetProgressNotification()
+ */
+ float GetProgressNotification();
+
+ /**
* @copydoc Dali::Animation::GetDuration()
*/
float GetDuration() const;
/**
* @copydoc Dali::Animation::SetLooping()
*/
- void SetLooping(bool looping);
+ void SetLooping(bool on);
+
+ /**
+ * @copydoc Dali::Animation::SetLoopCount()
+ */
+ void SetLoopCount(int count);
+
+ /**
+ * @copydoc Dali::Animation::GetLoopCount()
+ */
+ int GetLoopCount();
+
+ /**
+ * @copydoc Dali::Animation::GetCurrentLoop()
+ */
+ int GetCurrentLoop();
/**
* @copydoc Dali::Animation::IsLooping()
void PlayFrom( float progress );
/**
+ * @copydoc Dali::Animation::PlayAfter()
+ */
+ void PlayAfter( float delaySeconds );
+
+ /**
* @copydoc Dali::Animation::Pause()
*/
void Pause();
/**
+ * @copydoc Dali::Animation::GetState()
+ */
+ Dali::Animation::State GetState() const;
+
+ /**
* @copydoc Dali::Animation::Stop()
*/
void Stop();
Dali::Animation::AnimationSignalType& FinishedSignal();
/**
+ * @copydoc Dali::DevelAnimation::ProgressHasBeenReachedSignal()
+ */
+ Dali::Animation::AnimationSignalType& ProgressReachedSignal();
+
+ /**
* Emit the Finished signal
*/
void EmitSignalFinish();
/**
+ * Emit the ProgressReached signal
+ */
+ void EmitSignalProgressReached();
+
+ /**
* Connects a callback function with the object's signals.
* @param[in] object The object providing the signal.
* @param[in] tracker Used to disconnect the signal.
* @param[in] attributes The attributes with which to perfrom this action.
* @return true if action was done
*/
- static bool DoAction(BaseObject* object, const std::string& actionName, const std::vector<Property::Value>& attributes);
-
- /**
- * This callback is intended for internal use only, to avoid the overhead of using a signal.
- * @param[in] callback The callback function to connect.
- * @param[in] object The internal object requesting the callback, or NULL.
- */
- void SetFinishedCallback( FinishedCallback callback, Object* object );
+ static bool DoAction(BaseObject* object, const std::string& actionName, const Property::Map& attributes);
/**
* @copydoc Dali::Animation::AnimateBy(Property target, Property::Value relativeValue)
void Animate( Actor& actor, const Path& path, const Vector3& forward, AlphaFunction alpha, TimePeriod period);
/**
- * @copydoc Dali::Animation::MoveBy(Actor actor, float x, float y, float z)
- */
- void MoveBy(Actor& actor, float x, float y, float z);
-
- /**
- * @copydoc Dali::Animation::MoveBy(Actor actor, Vector3 displacement, AlphaFunction alpha)
- */
- void MoveBy(Actor& actor, const Vector3& translation, AlphaFunction alpha);
-
- /**
- * @copydoc Dali::Animation::MoveBy(Actor actor, Vector3 displacement, AlphaFunction alpha, float delaySeconds, float durationSeconds)
- */
- void MoveBy(Actor& actor, const Vector3& translation, AlphaFunction alpha, float delaySeconds, float durationSeconds);
-
- /**
- * @copydoc Dali::Animation::MoveTo(Actor actor, float x, float y, float z)
- */
- void MoveTo(Actor& actor, float x, float y, float z);
-
- /**
- * @copydoc Dali::Animation::MoveTo(Actor actor, Vector3 position, AlphaFunction alpha)
- */
- void MoveTo(Actor& actor, const Vector3& translation, AlphaFunction alpha);
-
- /**
- * @copydoc Dali::Animation::MoveTo(Actor actor, Vector3 position, AlphaFunction alpha, float delaySeconds, float durationSeconds)
- */
- void MoveTo(Actor& actor, const Vector3& translation, AlphaFunction alpha, float delaySeconds, float durationSeconds);
-
- /**
- * @copydoc Dali::Animation::RotateBy(Actor actor, Radian angle, Vector3 axis)
- */
- void RotateBy(Actor& actor, Radian angle, const Vector3& axis);
-
- /**
- * @copydoc Dali::Animation::RotateBy(Actor actor, Radian angle, Vector3 axis, AlphaFunction alpha)()
- */
- void RotateBy(Actor& actor, Radian angle, const Vector3& axis, AlphaFunction alpha);
-
- /**
- * @copydoc Dali::Animation::RotateBy(Actor actor, Radian angle, Vector3 axis, AlphaFunction alpha, float delaySeconds, float durationSeconds)
- */
- void RotateBy(Actor& actor, Radian angle, const Vector3& axis, AlphaFunction alpha, float delaySeconds, float durationSeconds);
-
- /**
- * @copydoc Dali::Animation::RotateTo(Actor actor, Radian angle, Vector3 axis)
- */
- void RotateTo(Actor& actor, Radian angle, const Vector3& axis);
-
- /**
- * @copydoc Dali::Animation::RotateTo(Actor actor, Quaternion orientation)
- */
- void RotateTo(Actor& actor, const Quaternion& orientation);
-
- /**
- * @copydoc Dali::Animation::RotateTo(Actor actor, Radian angle, Vector3 axis, AlphaFunction alpha)
- */
- void RotateTo(Actor& actor, Radian angle, const Vector3& axis, AlphaFunction alpha);
-
- /**
- * @copydoc Dali::Animation::RotateTo(Actor actor, Quaternion orientation, AlphaFunction alpha)
- */
- void RotateTo(Actor& actor, const Quaternion& orientation, AlphaFunction alpha);
-
- /**
- * @copydoc Dali::Animation::RotateTo(Actor actor, Quaternion orientation, AlphaFunction alpha, float delaySeconds, float durationSeconds)
- */
- void RotateTo(Actor& actor, const Quaternion& orientation, AlphaFunction alpha, float delaySeconds, float durationSeconds);
-
- /**
- * @copydoc Dali::Animation::RotateTo(Actor actor, Radian angle, Vector3 axis, AlphaFunction alpha, float delaySeconds, float durationSeconds)()
- */
- void RotateTo(Actor& actor, Radian angle, const Vector3& axis, AlphaFunction alpha, float delaySeconds, float durationSeconds);
-
- /**
- * @copydoc Dali::Animation::ScaleBy(Actor actor, float x, float y, float z)()
- */
- void ScaleBy(Actor& actor, float x, float y, float z);
-
- /**
- * @copydoc Dali::Animation::ScaleBy(Actor actor, Vector3 scale, AlphaFunction alpha)
- */
- void ScaleBy(Actor& actor, const Vector3& scale, AlphaFunction alpha);
-
- /**
- * @copydoc Dali::Animation::ScaleBy(Actor actor, Vector3 scale, AlphaFunction alpha, float delaySeconds, float durationSeconds)
- */
- void ScaleBy(Actor& actor, const Vector3& scale, AlphaFunction alpha, float delaySeconds, float durationSeconds);
-
- /**
- * @copydoc Dali::Animation::ScaleTo(Actor actor, float x, float y, float z)
- */
- void ScaleTo(Actor& actor, float x, float y, float z);
-
- /**
- * @copydoc Dali::Animation::ScaleTo(Actor actor, Vector3 scale, AlphaFunction alpha)
- */
- void ScaleTo(Actor& actor, const Vector3& scale, AlphaFunction alpha);
-
- /**
- * @copydoc Dali::Animation::ScaleTo(Actor actor, Vector3 scale, AlphaFunction alpha, float delaySeconds, float durationSeconds)
- */
- void ScaleTo(Actor& actor, const Vector3& scale, AlphaFunction alpha, float delaySeconds, float durationSeconds);
-
- /**
* @copydoc Dali::Animation::Show()
*/
void Show(Actor& actor, float delaySeconds);
void Hide(Actor& actor, float delaySeconds);
/**
- * @copydoc Dali::Animation::OpacityBy(Actor actor, float opacity)
- */
- void OpacityBy(Actor& actor, float opacity);
-
- /**
- * @copydoc Dali::Animation::OpacityBy(Actor actor, float opacity, AlphaFunction alpha)
- */
- void OpacityBy(Actor& actor, float opacity, AlphaFunction alpha);
-
- /**
- * @copydoc Dali::Animation::OpacityBy(Actor actor, float opacity, AlphaFunction alpha, float delaySeconds, float durationSeconds)()
- */
- void OpacityBy(Actor& actor, float opacity, AlphaFunction alpha, float delaySeconds, float durationSeconds);
-
- /**
- * @copydoc Dali::Animation::OpacityTo(Actor actor, float opacity)
- */
- void OpacityTo(Actor& actor, float opacity);
-
- /**
- * @copydoc Dali::Animation::OpacityTo(Actor actor, float opacity, AlphaFunction alpha)
- */
- void OpacityTo(Actor& actor, float opacity, AlphaFunction alpha);
-
- /**
- * @copydoc Dali::Animation::OpacityTo(Actor actor, float opacity, AlphaFunction alpha, float delaySeconds, float durationSeconds)
- */
- void OpacityTo(Actor& actor, float opacity, AlphaFunction alpha, float delaySeconds, float durationSeconds);
-
- /**
- * @copydoc Dali::Animation::ColorBy(Actor actor, Vector4 color)
- */
- void ColorBy(Actor& actor, const Vector4& color);
-
- /**
- * @copydoc Dali::Animation::ColorBy(Actor actor, Vector4 color, AlphaFunction alpha)
- */
- void ColorBy(Actor& actor, const Vector4& color, AlphaFunction alpha);
-
- /**
- * @copydoc Dali::Animation::ColorBy(Actor actor, Vector4 color, AlphaFunction alpha, float delaySeconds, float durationSeconds)
- */
- void ColorBy(Actor& actor, const Vector4& color, AlphaFunction alpha, float delaySeconds, float durationSeconds);
-
- /**
- * @copydoc Dali::Animation::ColorTo(Actor actor, Vector4 color)
- */
- void ColorTo(Actor& actor, const Vector4& color);
-
- /**
- * @copydoc Dali::Animation::ColorTo(Actor actor, Vector4 color, AlphaFunction alpha)
- */
- void ColorTo(Actor& actor, const Vector4& color, AlphaFunction alpha);
-
- /**
- * @copydoc Dali::Animation::ColorTo(Actor actor, Vector4 color, AlphaFunction alpha, float delaySeconds, float durationSeconds)
- */
- void ColorTo(Actor& actor, const Vector4& color, AlphaFunction alpha, float delaySeconds, float durationSeconds);
-
- /**
- * @copydoc Dali::Animation::Resize(Actor actor, float width, float height)
- */
- void Resize(Actor& actor, float width, float height);
-
- /**
- * @copydoc Dali::Animation::Resize(Actor actor, float width, float height, AlphaFunction alpha)
- */
- void Resize(Actor& actor, float width, float height, AlphaFunction alpha);
-
- /**
- * @copydoc Dali::Animation::Resize(Actor actor, float width, float height, AlphaFunction alpha, float delaySeconds, float durationSeconds)
- */
- void Resize(Actor& actor, float width, float height, AlphaFunction alpha, float delaySeconds, float durationSeconds);
-
- /**
- * @copydoc Dali::Animation::Resize(Actor actor, Vector3 size)
- */
- void Resize(Actor& actor, const Vector3& size);
-
- /**
- * @copydoc Dali::Animation::Resize(Actor actor, Vector3 size, AlphaFunction alpha)
- */
- void Resize(Actor& actor, const Vector3& size, AlphaFunction alpha);
-
- /**
- * @copydoc Dali::Animation::Resize(Actor actor, Vector3 size, AlphaFunction alpha, float delaySeconds, float durationSeconds)
- */
- void Resize(Actor& actor, const Vector3& size, AlphaFunction alpha, float delaySeconds, float durationSeconds);
-
- /*
* @copydoc Dali::Animation::SetCurrentProgress()
*/
void SetCurrentProgress(float progress);
- /*
+ /**
* @copydoc Dali::Animation::GetCurrentProgress()
*/
float GetCurrentProgress();
- /*
+ /**
* @copydoc Dali::Animation::SetSpeedFactor()
*/
void SetSpeedFactor( float factor );
- /*
+ /**
* @copydoc Dali::Animation::GetSpeedFactor()
*/
float GetSpeedFactor() const;
- /*
+ /**
* @copydoc Dali::Animation::SetPlayRange()
*/
void SetPlayRange( const Vector2& range );
- /*
- * @copydoc Dali::Animation::GetPlayRange
+ /**
+ * @copydoc Dali::Animation::GetPlayRange()
*/
Vector2 GetPlayRange() const;
+ /**
+ * @copydoc Dali::Animation::SetLoopingMode()
+ */
+ void SetLoopingMode( Dali::DevelAnimation::LoopingMode loopingMode );
+
+ /**
+ * @copydoc Dali::Animation::GetLoopingMode()
+ */
+ Dali::DevelAnimation::LoopingMode GetLoopingMode();
+
public: // For connecting animators to animations
/**
Animation& operator=(const Animation& rhs);
private:
- EventThreadServices& mEventThreadServices;
- AnimationPlaylist& mPlaylist;
+
+ struct ConnectorTargetValues
+ {
+ ConnectorTargetValues()
+ : targetValue(),
+ timePeriod( 0.0f ),
+ connectorIndex( 0 ),
+ animatorType( TO )
+ {
+ }
+
+ Property::Value targetValue;
+ TimePeriod timePeriod;
+ unsigned int connectorIndex;
+ Animation::Type animatorType;
+ };
+
+private:
+
+ /**
+ * Compares the end times of the animators returning true if lhs end time is less than rhs end time.
+ * @param[in] lhs The first comparator
+ * @param[in] rhs The second comparator
+ * @return True if end time of lhs is less, false otherwise.
+ */
+ static bool CompareConnectorEndTimes( const ConnectorTargetValues& lhs, const ConnectorTargetValues& rhs );
+
+ /**
+ * Notifies all the objects whose properties are being animated.
+ */
+ void NotifyObjects();
+
+ /**
+ * Sends message to SceneGraph with final progress value
+ */
+ void SendFinalProgressNotificationMessage();
+
+private:
const SceneGraph::Animation* mAnimation;
- int mNotificationCount; ///< Keep track of how many Finished signals have been emitted.
+ EventThreadServices& mEventThreadServices;
+ AnimationPlaylist& mPlaylist;
Dali::Animation::AnimationSignalType mFinishedSignal;
- FinishedCallback mFinishedCallback;
- Object* mFinishedCallbackObject;
+ Dali::Animation::AnimationSignalType mProgressReachedSignal;
+ typedef OwnerContainer< AnimatorConnectorBase* > AnimatorConnectorContainer;
AnimatorConnectorContainer mConnectors; ///< Owned by the Animation
- // Cached for public getters
+ typedef std::vector< ConnectorTargetValues > ConnectorTargetValuesContainer;
+ ConnectorTargetValuesContainer mConnectorTargetValues; //< Used to store animating property target value information
+
+ Vector2 mPlayRange;
+
float mDurationSeconds;
float mSpeedFactor;
- bool mIsLooping;
- Vector2 mPlayRange;
+ int mNotificationCount; ///< Keep track of how many Finished signals have been emitted.
+ int mLoopCount;
+ int mCurrentLoop;
EndAction mEndAction;
EndAction mDisconnectAction;
AlphaFunction mDefaultAlpha;
-
+ Dali::Animation::State mState;
+ float mProgressReachedMarker;
+ float mDelaySeconds;
+ bool mAutoReverseEnabled; ///< Flag to identify that the looping mode is auto reverse.
};
} // namespace Internal