Ensure cached values of properties animated using AnimateTo are updated
[platform/core/uifw/dali-core.git] / dali / internal / event / animation / animation-impl.h
1 #ifndef __DALI_INTERNAL_ANIMATION_H__
2 #define __DALI_INTERNAL_ANIMATION_H__
3
4 /*
5  * Copyright (c) 2017 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20
21 // INTERNAL INCLUDES
22 #include <dali/public-api/common/vector-wrapper.h>
23 #include <dali/public-api/object/ref-object.h>
24 #include <dali/public-api/animation/animation.h>
25 #include <dali/public-api/object/base-object.h>
26 #include <dali/internal/event/animation/animator-connector-base.h>
27 #include <dali/internal/event/animation/key-frames-impl.h>
28 #include <dali/internal/event/animation/path-impl.h>
29
30 namespace Dali
31 {
32
33 namespace Internal
34 {
35
36 namespace SceneGraph
37 {
38 class Animation;
39 class UpdateManager;
40 }
41
42 class Actor;
43 class Animation;
44 class AnimationPlaylist;
45 class Object;
46
47 typedef IntrusivePtr<Animation> AnimationPtr;
48 typedef std::vector<AnimationPtr> AnimationContainer;
49
50 typedef AnimationContainer::iterator AnimationIter;
51 typedef AnimationContainer::const_iterator AnimationConstIter;
52
53 /**
54  * Animation is a proxy for a SceneGraph::Animation object.
55  * The UpdateManager owns the Animation object, but the lifetime of the animation is
56  * indirectly controlled by the Animation.
57  */
58 class Animation : public BaseObject
59 {
60 public:
61
62   typedef Dali::Animation::EndAction EndAction;
63   typedef Dali::Animation::Interpolation Interpolation;
64
65   typedef void (*FinishedCallback)(Object* object);
66
67   /**
68    * Create a new Animation object.
69    * @param[in] durationSeconds The duration of the animation.
70    * @return A smart-pointer to the newly allocated Animation.
71    */
72   static AnimationPtr New(float durationSeconds);
73
74   /**
75    * @copydoc Dali::Animation::SetDuration()
76    */
77   void SetDuration(float seconds);
78
79   /**
80    * @copydoc Dali::Animation::GetDuration()
81    */
82   float GetDuration() const;
83
84   /**
85    * @copydoc Dali::Animation::SetLooping()
86    */
87   void SetLooping(bool on);
88
89   /**
90    * @copydoc Dali::Animation::SetLoopCount()
91    */
92   void SetLoopCount(int count);
93
94   /**
95    * @copydoc Dali::Animation::GetLoopCount()
96    */
97   int GetLoopCount();
98
99   /**
100    * @copydoc Dali::Animation::GetCurrentLoop()
101    */
102   int GetCurrentLoop();
103
104   /**
105    * @copydoc Dali::Animation::IsLooping()
106    */
107   bool IsLooping() const;
108
109   /**
110    * @copydoc Dali::Animation::SetEndAction()
111    */
112   void SetEndAction(EndAction action);
113
114   /**
115    * @copydoc Dali::Animation::GetEndAction()
116    */
117   EndAction GetEndAction() const;
118
119   /**
120    * @copydoc Dali::Animation::SetDisconnectAction()
121    */
122   void SetDisconnectAction(EndAction action);
123
124   /**
125    * @copydoc Dali::Animation::GetDisconnectAction()
126    */
127   EndAction GetDisconnectAction() const;
128
129   /**
130    * @copydoc Dali::Animation::SetDefaultAlphaFunction()
131    */
132   void SetDefaultAlphaFunction(AlphaFunction alpha)
133   {
134     mDefaultAlpha = alpha;
135   }
136
137   /**
138    * @copydoc Dali::Animation::GetDefaultAlphaFunction()
139    */
140   AlphaFunction GetDefaultAlphaFunction() const
141   {
142     return mDefaultAlpha;
143   }
144
145   /**
146    * @copydoc Dali::Animation::Play()
147    */
148   void Play();
149
150   /**
151    * @copydoc Dali::Animation::PlayFrom()
152    */
153   void PlayFrom( float progress );
154
155   /**
156    * @copydoc Dali::Animation::Pause()
157    */
158   void Pause();
159
160   /**
161    * @copydoc Dali::Animation::GetState()
162    */
163   Dali::Animation::State GetState() const;
164
165   /**
166    * @copydoc Dali::Animation::Stop()
167    */
168   void Stop();
169
170   /**
171    * @copydoc Dali::Animation::Clear()
172    */
173   void Clear();
174
175   /**
176    * Query whether a Finished signal should be emitted for this animation.
177    * This should only be called by NotificationManager, before signals are emitted.
178    * @post HasFinished() will return false on subsequent calls, until the animation is replayed to completion.
179    */
180   bool HasFinished();
181
182   /**
183    * @copydoc Dali::Animation::FinishedSignal()
184    */
185   Dali::Animation::AnimationSignalType& FinishedSignal();
186
187   /**
188    * Emit the Finished signal
189    */
190   void EmitSignalFinish();
191
192   /**
193    * Connects a callback function with the object's signals.
194    * @param[in] object The object providing the signal.
195    * @param[in] tracker Used to disconnect the signal.
196    * @param[in] signalName The signal to connect to.
197    * @param[in] functor A newly allocated FunctorDelegate.
198    * @return True if the signal was connected.
199    * @post If a signal was connected, ownership of functor was passed to CallbackBase. Otherwise the caller is responsible for deleting the unused functor.
200    */
201   static bool DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor );
202
203   /**
204    * Performs actions as requested using the action name.
205    * @param[in] object The object on which to perform the action.
206    * @param[in] actionName The action to perform.
207    * @param[in] attributes The attributes with which to perfrom this action.
208    * @return true if action was done
209    */
210   static bool DoAction(BaseObject* object, const std::string& actionName, const Property::Map& attributes);
211
212   /**
213    * This callback is intended for internal use only, to avoid the overhead of using a signal.
214    * @param[in] callback The callback function to connect.
215    * @param[in] object The internal object requesting the callback, or NULL.
216    */
217   void SetFinishedCallback( FinishedCallback callback, Object* object );
218
219   /**
220    * @copydoc Dali::Animation::AnimateBy(Property target, Property::Value relativeValue)
221    */
222   void AnimateBy(Property& target, Property::Value& relativeValue);
223
224   /**
225    * @copydoc Dali::Animation::AnimateBy(Property target, Property::Value relativeValue, AlphaFunction alpha)
226    */
227   void AnimateBy(Property& target, Property::Value& relativeValue, AlphaFunction alpha);
228
229   /**
230    * @copydoc Dali::Animation::AnimateBy(Property target, Property::Value relativeValue, TimePeriod period)
231    */
232   void AnimateBy(Property& target, Property::Value& relativeValue, TimePeriod period);
233
234   /**
235    * @copydoc Dali::Animation::AnimateBy(Property target, Property::Value relativeValue, AlphaFunction alpha, TimePeriod period)
236    */
237   void AnimateBy(Property& target, Property::Value& relativeValue, AlphaFunction alpha, TimePeriod period);
238
239   /**
240    * @copydoc Dali::Animation::AnimateTo(Property target, Property::Value destinationValue)
241    */
242   void AnimateTo(Property& target, Property::Value& destinationValue);
243
244   /**
245    * @copydoc Dali::Animation::AnimateTo(Property target, Property::Value destinationValue, AlphaFunction alpha)
246    */
247   void AnimateTo(Property& target, Property::Value& destinationValue, AlphaFunction alpha);
248
249   /**
250    * @copydoc Dali::Animation::AnimateTo(Property target, Property::Value destinationValue, TimePeriod period)
251    */
252   void AnimateTo(Property& target, Property::Value& destinationValue, TimePeriod period);
253
254   /**
255    * @copydoc Dali::Animation::AnimateTo(Property target, Property::Value destinationValue, AlphaFunction alpha, TimePeriod period)
256    */
257   void AnimateTo(Property& target, Property::Value& destinationValue, AlphaFunction alpha, TimePeriod period);
258
259   /**
260    * Animate a property to a destination value.
261    * @param [in] targetObject The target object to animate.
262    * @param [in] targetPropertyIndex The index of the target property.
263    * @param [in] componentIndex Index to a sub component of a property, for use with Vector2, Vector3 and Vector4
264    * @param [in] destinationValue The destination value.
265    * @param [in] alpha The alpha function to apply.
266    * @param [in] period The effect will occur during this time period.
267    */
268   void AnimateTo(Object& targetObject, Property::Index targetPropertyIndex, int componentIndex, Property::Value& destinationValue, AlphaFunction alpha, TimePeriod period);
269
270   /**
271    * @copydoc Dali::Animation::AnimateBetween(Property target, KeyFrames& keyFrames)
272    */
273   void AnimateBetween(Property target, const KeyFrames& keyFrames);
274
275   /**
276    * @copydoc Dali::Animation::AnimateBetween(Property target, KeyFrames& keyFrames, Interpolation interpolation)
277    */
278   void AnimateBetween(Property target, const KeyFrames& keyFrames, Interpolation interpolation );
279
280   /**
281    * @copydoc Dali::Animation::AnimateBetween(Property target, KeyFrames& keyFrames, TimePeriod period)
282    */
283   void AnimateBetween(Property target, const KeyFrames& keyFrames, TimePeriod period);
284
285   /**
286    * @copydoc Dali::Animation::AnimateBetween(Property target, KeyFrames& keyFrames, TimePeriod period, Interpolation interpolation)
287    */
288   void AnimateBetween(Property target, const KeyFrames& keyFrames, TimePeriod period, Interpolation interpolation);
289
290   /**
291    * @copydoc Dali::Animation::AnimateBetween(Property target, KeyFrames& keyFrames, AlphaFunction alpha)
292    */
293   void AnimateBetween(Property target, const KeyFrames& keyFrames, AlphaFunction alpha);
294
295   /**
296    * @copydoc Dali::Animation::AnimateBetween(Property target, KeyFrames& keyFrames, AlphaFunction alpha, Interpolation interpolation)
297    */
298   void AnimateBetween(Property target, const KeyFrames& keyFrames, AlphaFunction alpha, Interpolation interpolation);
299
300   /**
301    * @copydoc Dali::Animation::AnimateBetween(Property target, KeyFrames& keyFrames, AlphaFunction alpha, TimePeriod period)
302    */
303   void AnimateBetween(Property target, const KeyFrames& keyFrames, AlphaFunction alpha, TimePeriod period);
304
305   /**
306    * @copydoc Dali::Animation::AnimateBetween(Property target, KeyFrames& keyFrames, AlphaFunction alpha, TimePeriod period, Interpolation interpolation )
307    */
308   void AnimateBetween(Property target, const KeyFrames& keyFrames, AlphaFunction alpha, TimePeriod period, Interpolation interpolation );
309
310   // Actor-specific convenience functions
311
312   /**
313    * @copydoc Dali::Animation::Animate( Actor actor, Path path, const Vector3& forward )
314    */
315   void Animate( Actor& actor, const Path& path, const Vector3& forward );
316
317   /**
318    * @copydoc Dali::Animation::Animate( Actor actor, Path path, const Vector3& forward, AlphaFunction alpha )
319    */
320   void Animate( Actor& actor, const Path& path, const Vector3& forward, AlphaFunction alpha );
321
322   /**
323    * @copydoc Dali::Animation::Animate( Actor actor, Path path, const Vector3& forward, TimePeriod period )
324    */
325   void Animate( Actor& actor, const Path& path, const Vector3& forward, TimePeriod period );
326
327   /**
328    * @copydoc Dali::Animation::Animate( Actor actor, Path path, const Vector3& forward, AlphaFunction alpha, TimePeriod period)
329    */
330   void Animate( Actor& actor, const Path& path, const Vector3& forward, AlphaFunction alpha, TimePeriod period);
331
332   /**
333    * @copydoc Dali::Animation::Show()
334    */
335   void Show(Actor& actor, float delaySeconds);
336
337   /**
338    * @copydoc Dali::Animation::Hide()
339    */
340   void Hide(Actor& actor, float delaySeconds);
341
342   /*
343    * @copydoc Dali::Animation::SetCurrentProgress()
344    */
345   void SetCurrentProgress(float progress);
346
347   /*
348    * @copydoc Dali::Animation::GetCurrentProgress()
349    */
350   float GetCurrentProgress();
351
352   /*
353    * @copydoc Dali::Animation::SetSpeedFactor()
354    */
355   void SetSpeedFactor( float factor );
356
357   /*
358    * @copydoc Dali::Animation::GetSpeedFactor()
359    */
360   float GetSpeedFactor() const;
361
362   /*
363    * @copydoc Dali::Animation::SetPlayRange()
364    */
365   void SetPlayRange( const Vector2& range );
366
367   /*
368    * @copydoc Dali::Animation::GetPlayRange
369    */
370   Vector2 GetPlayRange() const;
371
372 public: // For connecting animators to animations
373
374   /**
375    * Add an animator connector.
376    * @param[in] connector The animator connector.
377    */
378   void AddAnimatorConnector( AnimatorConnectorBase* connector );
379
380   /**
381    * Retrieve the SceneGraph::Animation object.
382    * @return The animation.
383    */
384   const SceneGraph::Animation* GetSceneObject()
385   {
386     return mAnimation;
387   }
388
389   /**
390    * Retrieve the event thread services object
391    * @return The interface for sending messages to the scene graph
392    */
393   EventThreadServices& GetEventThreadServices()
394   {
395     return mEventThreadServices;
396   }
397
398 protected:
399
400   /**
401    * Construct a new Animation.
402    * @param[in] eventThreadServices The interface for sending messages to the scene graph
403    * @param[in] playlist The list of currently playing animations.
404    * @param[in] durationSeconds The duration of the animation in seconds.
405    * @param[in] endAction The action to perform when the animation ends.
406    * @param[in] disconnectAction The action to perform when the property owner of an animator is disconnected.
407    * @param[in] defaultAlpha The default alpha function to apply to animators.
408    */
409   Animation( EventThreadServices& eventThreadServices,
410              AnimationPlaylist& playlist,
411              float durationSeconds,
412              EndAction endAction,
413              EndAction disconnectAction,
414              AlphaFunction defaultAlpha);
415
416   /**
417    * Second-phase constructor.
418    */
419   void Initialize();
420
421   /**
422    * Helper to create a scene-graph animation
423    */
424   void CreateSceneObject();
425
426   /**
427    * Helper to create a scene-graph animation
428    */
429   void DestroySceneObject();
430
431   /**
432    * A reference counted object may only be deleted by calling Unreference()
433    */
434   virtual ~Animation();
435
436 private:
437
438   /**
439    * Extends the duration when an animator is added with TimePeriod that exceeds current duration.
440    * @param[in] timePeriod The time period for an animator.
441    */
442   void ExtendDuration( const TimePeriod& timePeriod );
443
444   // Undefined
445   Animation(const Animation&);
446
447   // Undefined
448   Animation& operator=(const Animation& rhs);
449
450 private:
451
452   struct ConnectorTargetValues
453   {
454     unsigned int connectorIndex;
455     Property::Value targetValue;
456   };
457
458   EventThreadServices& mEventThreadServices;
459   AnimationPlaylist& mPlaylist;
460
461   const SceneGraph::Animation* mAnimation;
462
463   int mNotificationCount; ///< Keep track of how many Finished signals have been emitted.
464
465   Dali::Animation::AnimationSignalType mFinishedSignal;
466
467   FinishedCallback mFinishedCallback;
468   Object* mFinishedCallbackObject;
469
470   AnimatorConnectorContainer mConnectors; ///< Owned by the Animation
471
472   std::vector< ConnectorTargetValues > mConnectorTargetValues; //< Used to store animating property target value information
473
474   // Cached for public getters
475   float mDurationSeconds;
476   float mSpeedFactor;
477   int mLoopCount;
478   int mCurrentLoop;
479   Vector2 mPlayRange;
480   EndAction mEndAction;
481   EndAction mDisconnectAction;
482   AlphaFunction mDefaultAlpha;
483   Dali::Animation::State mState;
484
485 };
486
487 } // namespace Internal
488
489 // Helpers for public-api forwarding methods
490
491 inline Internal::Animation& GetImplementation(Dali::Animation& animation)
492 {
493   DALI_ASSERT_ALWAYS( animation && "Animation handle is empty" );
494
495   BaseObject& handle = animation.GetBaseObject();
496
497   return static_cast<Internal::Animation&>(handle);
498 }
499
500 inline const Internal::Animation& GetImplementation(const Dali::Animation& animation)
501 {
502   DALI_ASSERT_ALWAYS( animation && "Animation handle is empty" );
503
504   const BaseObject& handle = animation.GetBaseObject();
505
506   return static_cast<const Internal::Animation&>(handle);
507 }
508
509 } // namespace Dali
510
511 #endif // __DALI_INTERNAL_ANIMATION_H__