1 #ifndef DALI_INTERNAL_SCENE_GRAPH_ANIMATABLE_PROPERTY_H
2 #define DALI_INTERNAL_SCENE_GRAPH_ANIMATABLE_PROPERTY_H
5 * Copyright (c) 2023 Samsung Electronics Co., Ltd.
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
25 #include <dali/internal/common/matrix-utils.h>
27 #include <dali/internal/update/common/double-buffered.h>
28 #include <dali/internal/update/common/property-base.h>
29 #include <dali/public-api/common/dali-common.h>
30 #include <dali/public-api/object/property-input.h>
31 #include <dali/public-api/object/property-types.h>
32 #include <dali/public-api/object/property.h>
41 * Dirty flags record whether an animatable property has changed.
42 * In the frame following a change, the property is reset to a base value.
44 * If the property was "Baked", then the base value matches the (double-buffered) value from the previous frame.
45 * Therefore when reset, the property is flagged as "clean".
47 * However if the property was only "Set" (and not "Baked"), then typically the base value and previous value will not match.
48 * In this case the reset operation is equivalent to a "Bake", and the value is considered "dirty" for an additional frame.
50 static const uint32_t CLEAN_FLAG = 0x00; ///< Indicates that the value did not change in this, or the previous frame
51 static const uint32_t BAKED_FLAG = 0x01; ///< Indicates that the value was Baked during the previous frame
52 static const uint32_t SET_FLAG = 0x02; ///< Indicates that the value was Set during the previous frame
53 static const uint32_t RESET_FLAG = 0x02; ///< Indicates that the value should be reset to the base value in the next two frames
56 class AnimatableProperty;
59 * Base class to reduce code size from the templates.
61 class AnimatablePropertyBase : public PropertyBase
65 * Constructor, initialize the dirty flag
67 AnimatablePropertyBase()
69 mDirtyFlags(BAKED_FLAG)
76 ~AnimatablePropertyBase() override = default;
78 protected: // for derived classes
80 * Flag that the property has been Set during the current frame.
84 mDirtyFlags = SET_FLAG;
88 * Flag that the property has been Baked during the current frame.
92 mDirtyFlags = BAKED_FLAG;
97 * Mark the property as dirty so that it will be reset to the base value in the next two frames.
101 mDirtyFlags = RESET_FLAG;
104 public: // From PropertyBase
106 * @copydoc Dali::Internal::SceneGraph::PropertyBase::IsClean()
108 bool IsClean() const override
110 return (CLEAN_FLAG == mDirtyFlags);
114 * @copydoc Dali::Internal::PropertyInputImpl::InputInitialized()
116 bool InputInitialized() const override
118 return true; // Animatable properties are always valid
121 protected: // so that ResetToBaseValue can set it directly
122 uint32_t mDirtyFlags; ///< Flag whether value changed during previous 2 frames
126 * An boolean animatable property of a scene-graph object.
129 class AnimatableProperty<bool> : public AnimatablePropertyBase
133 * Create an animatable property.
134 * @param [in] initialValue The initial value of the property.
136 AnimatableProperty(bool initialValue)
137 : mValue(initialValue),
138 mBaseValue(initialValue)
143 * Virtual destructor.
145 ~AnimatableProperty() override = default;
148 * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
150 Dali::Property::Type GetType() const override
152 return Dali::PropertyTypes::Get<bool>();
156 * @copydoc Dali::Internal::SceneGraph::PropertyBase::ResetToBaseValue()
158 void ResetToBaseValue(BufferIndex updateBufferIndex) override
160 if(CLEAN_FLAG != mDirtyFlags)
162 mValue[updateBufferIndex] = mBaseValue;
164 mDirtyFlags = (mDirtyFlags >> 1);
169 * @copydoc Dali::Internal::PropertyInputImpl::GetBoolean()
171 const bool& GetBoolean(BufferIndex bufferIndex) const override
173 return mValue[bufferIndex];
177 * Set the property value. This will only persist for the current frame; the property
178 * will be reset with the base value, at the beginning of the next frame.
179 * @param[in] bufferIndex The buffer to write.
180 * @param[in] value The new property value.
182 void Set(BufferIndex bufferIndex, bool value)
184 // check if the value actually changed to avoid dirtying nodes unnecessarily
185 if(mValue[bufferIndex] != value)
187 mValue[bufferIndex] = value;
194 * Change the property value by a relative amount.
195 * @param[in] bufferIndex The buffer to write.
196 * @param[in] delta The property will change by this amount.
198 void SetRelative(BufferIndex bufferIndex, bool delta)
200 // check if the value actually changed to avoid dirtying nodes unnecessarily
201 // false + false does not change value, true + false does not either
202 if(delta && !mValue[bufferIndex])
204 mValue[bufferIndex] = delta;
211 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
213 bool& Get(BufferIndex bufferIndex)
215 return mValue[bufferIndex];
219 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
221 const bool& Get(BufferIndex bufferIndex) const
223 return mValue[bufferIndex];
227 * Retrieve the property value.
228 * @param[in] bufferIndex The buffer to read.
229 * @return The property value.
231 bool& operator[](BufferIndex bufferIndex)
233 return mValue[bufferIndex];
237 * Retrieve the property value.
238 * @param[in] bufferIndex The buffer to read.
239 * @return The property value.
241 const bool& operator[](BufferIndex bufferIndex) const
243 return mValue[bufferIndex];
247 * Set both the property value & base value.
248 * @param[in] bufferIndex The buffer to write for the property value.
249 * @param[in] value The new property value.
251 void Bake(BufferIndex bufferIndex, bool value)
253 // bake has to check the base value as current buffer value can be correct by constraint or something else
254 if(mBaseValue != value)
257 // It's ok to bake both buffers as render is performed in same thread as update. Reading from event side
258 // has never been atomically safe.
259 mValue[bufferIndex] = value;
260 mValue[1 - bufferIndex] = value;
267 * Change the property value & base value by a relative amount.
268 * @param[in] bufferIndex The buffer to write for the local property value.
269 * @param[in] delta The property will change by this amount.
271 void BakeRelative(BufferIndex bufferIndex, bool delta)
273 mValue[bufferIndex] = mValue[bufferIndex] || delta;
274 mBaseValue = mValue[bufferIndex];
281 AnimatableProperty(const AnimatableProperty& property);
284 AnimatableProperty& operator=(const AnimatableProperty& rhs);
287 DoubleBuffered<bool> mValue; ///< The double-buffered property value
288 bool mBaseValue; ///< Reset to this base value at the beginning of each frame
292 * An integer animatable property of a scene-graph object.
295 class AnimatableProperty<int> : public AnimatablePropertyBase
299 * Create an animatable property.
300 * @param [in] initialValue The initial value of the property.
302 AnimatableProperty(int initialValue)
303 : mValue(initialValue),
304 mBaseValue(initialValue)
309 * Virtual destructor.
311 ~AnimatableProperty() override = default;
314 * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
316 Dali::Property::Type GetType() const override
318 return Dali::PropertyTypes::Get<int>();
322 * @copydoc Dali::Internal::SceneGraph::PropertyBase::ResetToBaseValue()
324 void ResetToBaseValue(BufferIndex updateBufferIndex) override
326 if(CLEAN_FLAG != mDirtyFlags)
328 mValue[updateBufferIndex] = mBaseValue;
330 mDirtyFlags = (mDirtyFlags >> 1);
335 * @copydoc Dali::Internal::PropertyInputImpl::GetInteger()
337 const int& GetInteger(BufferIndex bufferIndex) const override
339 return mValue[bufferIndex];
343 * Set the property value. This will only persist for the current frame; the property
344 * will be reset with the base value, at the beginning of the next frame.
345 * @param[in] bufferIndex The buffer to write.
346 * @param[in] value The new property value.
348 void Set(BufferIndex bufferIndex, int value)
350 mValue[bufferIndex] = value;
356 * Change the property value by a relative amount.
357 * @param[in] bufferIndex The buffer to write.
358 * @param[in] delta The property will change by this amount.
360 void SetRelative(BufferIndex bufferIndex, int delta)
362 mValue[bufferIndex] = mValue[bufferIndex] + delta;
368 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
370 int& Get(BufferIndex bufferIndex)
372 return mValue[bufferIndex];
376 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
378 const int& Get(BufferIndex bufferIndex) const
380 return mValue[bufferIndex];
384 * Retrieve the property value.
385 * @param[in] bufferIndex The buffer to read.
386 * @return The property value.
388 int& operator[](BufferIndex bufferIndex)
390 return mValue[bufferIndex];
394 * Retrieve the property value.
395 * @param[in] bufferIndex The buffer to read.
396 * @return The property value.
398 const int& operator[](BufferIndex bufferIndex) const
400 return mValue[bufferIndex];
404 * Set both the property value & base value.
405 * @param[in] bufferIndex The buffer to write for the property value.
406 * @param[in] value The new property value.
408 void Bake(BufferIndex bufferIndex, int value)
410 mValue[bufferIndex] = value;
411 mValue[1 - bufferIndex] = value;
412 mBaseValue = mValue[bufferIndex];
418 * Change the property value & base value by a relative amount.
419 * @param[in] bufferIndex The buffer to write for the local property value.
420 * @param[in] delta The property will change by this amount.
422 void BakeRelative(BufferIndex bufferIndex, int delta)
424 mValue[bufferIndex] = mValue[bufferIndex] + delta;
425 mBaseValue = mValue[bufferIndex];
431 * Sets both double-buffered values & the base value.
432 * This should only be used when the owning object has not been connected to the scene-graph.
433 * @param[in] value The new property value.
435 void SetInitial(const int& value)
438 mValue[1] = mValue[0];
439 mBaseValue = mValue[0];
443 * Change both double-buffered values & the base value by a relative amount.
444 * This should only be used when the owning object has not been connected to the scene-graph.
445 * @param[in] delta The property will change by this amount.
447 void SetInitialRelative(const int& delta)
449 mValue[0] = mValue[0] + delta;
450 mValue[1] = mValue[0];
451 mBaseValue = mValue[0];
456 AnimatableProperty(const AnimatableProperty& property);
459 AnimatableProperty& operator=(const AnimatableProperty& rhs);
462 DoubleBuffered<int> mValue; ///< The double-buffered property value
463 int mBaseValue; ///< Reset to this base value at the beginning of each frame
467 * An float animatable property of a scene-graph object.
470 class AnimatableProperty<float> : public AnimatablePropertyBase
474 * Create an animatable property.
475 * @param [in] initialValue The initial value of the property.
477 AnimatableProperty(float initialValue)
478 : mValue(initialValue),
479 mBaseValue(initialValue)
484 * Virtual destructor.
486 ~AnimatableProperty() override = default;
489 * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
491 Dali::Property::Type GetType() const override
493 return Dali::PropertyTypes::Get<float>();
497 * @copydoc Dali::Internal::SceneGraph::PropertyBase::ResetToBaseValue()
499 void ResetToBaseValue(BufferIndex updateBufferIndex) override
501 if(CLEAN_FLAG != mDirtyFlags)
503 mValue[updateBufferIndex] = mBaseValue;
505 mDirtyFlags = (mDirtyFlags >> 1);
510 * @copydoc Dali::Internal::PropertyInputImpl::GetFloat()
512 const float& GetFloat(BufferIndex bufferIndex) const override
514 return mValue[bufferIndex];
518 * Set the property value. This will only persist for the current frame; the property
519 * will be reset with the base value, at the beginning of the next frame.
520 * @param[in] bufferIndex The buffer to write.
521 * @param[in] value The new property value.
523 void Set(BufferIndex bufferIndex, float value)
525 mValue[bufferIndex] = value;
531 * Change the property value by a relative amount.
532 * @param[in] bufferIndex The buffer to write.
533 * @param[in] delta The property will change by this amount.
535 void SetRelative(BufferIndex bufferIndex, float delta)
537 mValue[bufferIndex] = mValue[bufferIndex] + delta;
543 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
545 float& Get(BufferIndex bufferIndex)
547 return mValue[bufferIndex];
551 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
553 const float& Get(BufferIndex bufferIndex) const
555 return mValue[bufferIndex];
559 * Retrieve the property value.
560 * @param[in] bufferIndex The buffer to read.
561 * @return The property value.
563 float& operator[](BufferIndex bufferIndex)
565 return mValue[bufferIndex];
569 * Retrieve the property value.
570 * @param[in] bufferIndex The buffer to read.
571 * @return The property value.
573 const float& operator[](BufferIndex bufferIndex) const
575 return mValue[bufferIndex];
579 * Set both the property value & base value.
580 * @param[in] bufferIndex The buffer to write for the property value.
581 * @param[in] value The new property value.
583 void Bake(BufferIndex bufferIndex, float value)
585 // It's ok to bake both buffers as render is performed in same thread as update. Reading from event side
586 // has never been atomically safe.
587 mValue[bufferIndex] = value;
588 mValue[1 - bufferIndex] = value;
589 mBaseValue = mValue[bufferIndex];
595 * Change the property value & base value by a relative amount.
596 * @param[in] bufferIndex The buffer to write for the local property value.
597 * @param[in] delta The property will change by this amount.
599 void BakeRelative(BufferIndex bufferIndex, float delta)
601 mValue[bufferIndex] = mValue[bufferIndex] + delta;
602 mBaseValue = mValue[bufferIndex];
608 * Sets both double-buffered values & the base value.
609 * This should only be used when the owning object has not been connected to the scene-graph.
610 * @param[in] value The new property value.
612 void SetInitial(const float& value)
615 mValue[1] = mValue[0];
616 mBaseValue = mValue[0];
620 * Change both double-buffered values & the base value by a relative amount.
621 * This should only be used when the owning object has not been connected to the scene-graph.
622 * @param[in] delta The property will change by this amount.
624 void SetInitialRelative(const float& delta)
626 mValue[0] = mValue[0] + delta;
627 mValue[1] = mValue[0];
628 mBaseValue = mValue[0];
633 AnimatableProperty(const AnimatableProperty& property);
636 AnimatableProperty& operator=(const AnimatableProperty& rhs);
639 DoubleBuffered<float> mValue; ///< The double-buffered property value
640 float mBaseValue; ///< Reset to this base value at the beginning of each frame
644 * An Vector2 animatable property of a scene-graph object.
647 class AnimatableProperty<Vector2> : public AnimatablePropertyBase
651 * Create an animatable property.
652 * @param [in] initialValue The initial value of the property.
654 AnimatableProperty(const Vector2& initialValue)
655 : mValue(initialValue),
656 mBaseValue(initialValue)
661 * Virtual destructor.
663 ~AnimatableProperty() override = default;
666 * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
668 Dali::Property::Type GetType() const override
670 return Dali::PropertyTypes::Get<Vector2>();
674 * @copydoc Dali::Internal::SceneGraph::PropertyBase::ResetToBaseValue()
676 void ResetToBaseValue(BufferIndex updateBufferIndex) override
678 if(CLEAN_FLAG != mDirtyFlags)
680 mValue[updateBufferIndex] = mBaseValue;
682 mDirtyFlags = (mDirtyFlags >> 1);
687 * @copydoc Dali::PropertyInput::GetVector2()
689 const Vector2& GetVector2(BufferIndex bufferIndex) const override
691 return mValue[bufferIndex];
695 * Set the property value. This will only persist for the current frame; the property
696 * will be reset with the base value, at the beginning of the next frame.
697 * @param[in] bufferIndex The buffer to write.
698 * @param[in] value The new property value.
700 void Set(BufferIndex bufferIndex, const Vector2& value)
702 mValue[bufferIndex] = value;
708 * Set the property value. This will only persist for the current frame; the property
709 * will be reset with the base value, at the beginning of the next frame.
710 * @param[in] bufferIndex The buffer to write.
711 * @param[in] value The new X value.
713 void SetX(BufferIndex bufferIndex, float value)
715 mValue[bufferIndex].x = value;
721 * Set the property value. This will only persist for the current frame; the property
722 * will be reset with the base value, at the beginning of the next frame.
723 * @param[in] bufferIndex The buffer to write.
724 * @param[in] value The new Y value.
726 void SetY(BufferIndex bufferIndex, float value)
728 mValue[bufferIndex].y = value;
734 * Change the property value by a relative amount.
735 * @param[in] bufferIndex The buffer to write.
736 * @param[in] delta The property will change by this amount.
738 void SetRelative(BufferIndex bufferIndex, const Vector2& delta)
740 mValue[bufferIndex] += delta;
746 * Change the X value by a relative amount.
747 * @param[in] bufferIndex The buffer to write.
748 * @param[in] delta The X value will change by this amount.
750 void SetXRelative(BufferIndex bufferIndex, float delta)
752 mValue[bufferIndex].x += delta;
758 * Change the Y value by a relative amount.
759 * @param[in] bufferIndex The buffer to write.
760 * @param[in] delta The Y value will change by this amount.
762 void SetYRelative(BufferIndex bufferIndex, float delta)
764 mValue[bufferIndex].y += delta;
770 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
772 Vector2& Get(BufferIndex bufferIndex)
774 return mValue[bufferIndex];
778 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
780 const Vector2& Get(BufferIndex bufferIndex) const
782 return mValue[bufferIndex];
786 * Retrieve the property value.
787 * @param[in] bufferIndex The buffer to read.
788 * @return The property value.
790 Vector2& operator[](BufferIndex bufferIndex)
792 return mValue[bufferIndex];
796 * Retrieve the property value.
797 * @param[in] bufferIndex The buffer to read.
798 * @return The property value.
800 const Vector2& operator[](BufferIndex bufferIndex) const
802 return mValue[bufferIndex];
806 * Set both the property value & base value.
807 * @param[in] bufferIndex The buffer to write for the property value.
808 * @param[in] value The new property value.
810 void Bake(BufferIndex bufferIndex, const Vector2& value)
812 // It's ok to bake both buffers as render is performed in same thread as update. Reading from event side
813 // has never been atomically safe.
814 mValue[bufferIndex] = value;
815 mValue[1 - bufferIndex] = value;
822 * Set both the X value & base X value.
823 * @param[in] bufferIndex The buffer to write for the property value.
824 * @param[in] value The new property value.
826 void BakeX(BufferIndex bufferIndex, float value)
828 mValue[bufferIndex].x = value;
829 mValue[1 - bufferIndex].x = value;
830 mBaseValue.x = value;
836 * Set both the Y value & base Y value.
837 * @param[in] bufferIndex The buffer to write for the property value.
838 * @param[in] value The new property value.
840 void BakeY(BufferIndex bufferIndex, float value)
842 mValue[bufferIndex].y = value;
843 mValue[1 - bufferIndex].y = value;
844 mBaseValue.y = value;
850 * Change the property value & base value by a relative amount.
851 * @param[in] bufferIndex The buffer to write for the local property value.
852 * @param[in] delta The property will change by this amount.
854 void BakeRelative(BufferIndex bufferIndex, const Vector2& delta)
856 mValue[bufferIndex] += delta;
857 mBaseValue = mValue[bufferIndex];
863 * Change the X value & base X value by a relative amount.
864 * @param[in] bufferIndex The buffer to write for the local property value.
865 * @param[in] delta The X value will change by this amount.
867 void BakeXRelative(BufferIndex bufferIndex, float delta)
869 mValue[bufferIndex].x += delta;
870 mBaseValue.x = mValue[bufferIndex].x;
876 * Change the Y value & base Y value by a relative amount.
877 * @param[in] bufferIndex The buffer to write for the local property value.
878 * @param[in] delta The Y value will change by this amount.
880 void BakeYRelative(BufferIndex bufferIndex, float delta)
882 mValue[bufferIndex].y += delta;
883 mBaseValue.y = mValue[bufferIndex].y;
890 AnimatableProperty(const AnimatableProperty& property);
893 AnimatableProperty& operator=(const AnimatableProperty& rhs);
896 DoubleBuffered<Vector2> mValue; ///< The double-buffered property value
897 Vector2 mBaseValue; ///< Reset to this base value at the beginning of each frame
901 * A Vector3 animatable property of a scene-graph object.
904 class AnimatableProperty<Vector3> : public AnimatablePropertyBase
908 * Create an animatable property.
917 * Create an animatable property.
918 * @param [in] initialValue The initial value of the property.
920 AnimatableProperty(const Vector3& initialValue)
921 : mValue(initialValue),
922 mBaseValue(initialValue)
927 * Virtual destructor.
929 ~AnimatableProperty() override = default;
932 * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
934 Dali::Property::Type GetType() const override
936 return Dali::PropertyTypes::Get<Vector3>();
940 * @copydoc Dali::Internal::SceneGraph::PropertyBase::ResetToBaseValue()
942 void ResetToBaseValue(BufferIndex updateBufferIndex) override
944 if(CLEAN_FLAG != mDirtyFlags)
946 mValue[updateBufferIndex] = mBaseValue;
948 mDirtyFlags = (mDirtyFlags >> 1);
953 * @copydoc Dali::PropertyInput::GetVector3()
955 const Vector3& GetVector3(BufferIndex bufferIndex) const override
957 return mValue[bufferIndex];
961 * Set the property value. This will only persist for the current frame; the property
962 * will be reset with the base value, at the beginning of the next frame.
963 * @param[in] bufferIndex The buffer to write.
964 * @param[in] value The new property value.
966 void Set(BufferIndex bufferIndex, const Vector3& value)
968 mValue[bufferIndex] = value;
974 * Set the property value. This will only persist for the current frame; the property
975 * will be reset with the base value, at the beginning of the next frame.
976 * @param[in] bufferIndex The buffer to write.
977 * @param[in] value The new X value.
979 void SetX(BufferIndex bufferIndex, float value)
981 mValue[bufferIndex].x = value;
987 * Set the property value. This will only persist for the current frame; the property
988 * will be reset with the base value, at the beginning of the next frame.
989 * @param[in] bufferIndex The buffer to write.
990 * @param[in] value The new Y value.
992 void SetY(BufferIndex bufferIndex, float value)
994 mValue[bufferIndex].y = value;
1000 * Set the property value. This will only persist for the current frame; the property
1001 * will be reset with the base value, at the beginning of the next frame.
1002 * @param[in] bufferIndex The buffer to write.
1003 * @param[in] value The new Z value.
1005 void SetZ(BufferIndex bufferIndex, float value)
1007 mValue[bufferIndex].z = value;
1013 * Change the property value by a relative amount.
1014 * @param[in] bufferIndex The buffer to write.
1015 * @param[in] delta The property will change by this amount.
1017 void SetRelative(BufferIndex bufferIndex, const Vector3& delta)
1019 mValue[bufferIndex] += delta;
1025 * Change the X value by a relative amount.
1026 * @param[in] bufferIndex The buffer to write.
1027 * @param[in] delta The X value will change by this amount.
1029 void SetXRelative(BufferIndex bufferIndex, float delta)
1031 mValue[bufferIndex].x += delta;
1037 * Change the Y value by a relative amount.
1038 * @param[in] bufferIndex The buffer to write.
1039 * @param[in] delta The Y value will change by this amount.
1041 void SetYRelative(BufferIndex bufferIndex, float delta)
1043 mValue[bufferIndex].y += delta;
1049 * Change the Z value by a relative amount.
1050 * @param[in] bufferIndex The buffer to write.
1051 * @param[in] delta The Z value will change by this amount.
1053 void SetZRelative(BufferIndex bufferIndex, float delta)
1055 mValue[bufferIndex].z += delta;
1061 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
1063 Vector3& Get(BufferIndex bufferIndex)
1065 return mValue[bufferIndex];
1069 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
1071 const Vector3& Get(BufferIndex bufferIndex) const
1073 return mValue[bufferIndex];
1077 * Retrieve the property value.
1078 * @param[in] bufferIndex The buffer to read.
1079 * @return The property value.
1081 Vector3& operator[](BufferIndex bufferIndex)
1083 return mValue[bufferIndex];
1087 * Retrieve the property value.
1088 * @param[in] bufferIndex The buffer to read.
1089 * @return The property value.
1091 const Vector3& operator[](BufferIndex bufferIndex) const
1093 return mValue[bufferIndex];
1097 * Set both the property value & base value.
1098 * @param[in] bufferIndex The buffer to write for the property value.
1099 * @param[in] value The new property value.
1101 void Bake(BufferIndex bufferIndex, const Vector3& value)
1103 mValue[bufferIndex] = value;
1104 mValue[1 - bufferIndex] = value;
1111 * Set both the X value & base X value.
1112 * @param[in] bufferIndex The buffer to write for the property value.
1113 * @param[in] value The new property value.
1115 void BakeX(BufferIndex bufferIndex, float value)
1117 mValue[bufferIndex].x = value;
1118 mValue[1 - bufferIndex].x = value;
1119 mBaseValue.x = value;
1125 * Set both the Y value & base Y value.
1126 * @param[in] bufferIndex The buffer to write for the property value.
1127 * @param[in] value The new property value.
1129 void BakeY(BufferIndex bufferIndex, float value)
1131 mValue[bufferIndex].y = value;
1132 mValue[1 - bufferIndex].y = value;
1133 mBaseValue.y = value;
1139 * Set both the Z value & base Z value.
1140 * @param[in] bufferIndex The buffer to write for the property value.
1141 * @param[in] value The new property value.
1143 void BakeZ(BufferIndex bufferIndex, float value)
1145 mValue[bufferIndex].z = value;
1146 mValue[1 - bufferIndex].z = value;
1147 mBaseValue.z = value;
1153 * Change the property value & base value by a relative amount.
1154 * @param[in] bufferIndex The buffer to write for the local property value.
1155 * @param[in] delta The property will change by this amount.
1157 void BakeRelative(BufferIndex bufferIndex, const Vector3& delta)
1159 mValue[bufferIndex] += delta;
1160 mBaseValue = mValue[bufferIndex];
1166 * Change the property value & base value by a relative amount.
1167 * @param[in] bufferIndex The buffer to write for the local property value.
1168 * @param[in] delta The property will change by this amount.
1170 void BakeRelativeMultiply(BufferIndex bufferIndex, const Vector3& delta)
1172 mValue[bufferIndex] *= delta;
1173 mBaseValue = mValue[bufferIndex];
1179 * Change the X value & base X value by a relative amount.
1180 * @param[in] bufferIndex The buffer to write for the local property value.
1181 * @param[in] delta The X value will change by this amount.
1183 void BakeXRelative(BufferIndex bufferIndex, float delta)
1185 mValue[bufferIndex].x += delta;
1186 mBaseValue.x = mValue[bufferIndex].x;
1192 * Change the Y value & base Y value by a relative amount.
1193 * @param[in] bufferIndex The buffer to write for the local property value.
1194 * @param[in] delta The Y value will change by this amount.
1196 void BakeYRelative(BufferIndex bufferIndex, float delta)
1198 mValue[bufferIndex].y += delta;
1199 mBaseValue.y = mValue[bufferIndex].y;
1205 * Change the Z value & base Z value by a relative amount.
1206 * @param[in] bufferIndex The buffer to write for the local property value.
1207 * @param[in] delta The Z value will change by this amount.
1209 void BakeZRelative(BufferIndex bufferIndex, float delta)
1211 mValue[bufferIndex].z += delta;
1212 mBaseValue.z = mValue[bufferIndex].z;
1219 AnimatableProperty(const AnimatableProperty& property);
1222 AnimatableProperty& operator=(const AnimatableProperty& rhs);
1225 DoubleBuffered<Vector3> mValue; ///< The double-buffered property value
1226 Vector3 mBaseValue; ///< Reset to this base value at the beginning of each frame
1230 * A Vector4 animatable property of a scene-graph object.
1233 class AnimatableProperty<Vector4> : public AnimatablePropertyBase
1237 * Create an animatable property.
1238 * @param [in] initialValue The initial value of the property.
1240 AnimatableProperty(const Vector4& initialValue)
1241 : mValue(initialValue),
1242 mBaseValue(initialValue)
1247 * Virtual destructor.
1249 ~AnimatableProperty() override = default;
1252 * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
1254 Dali::Property::Type GetType() const override
1256 return Dali::PropertyTypes::Get<Vector4>();
1260 * @copydoc Dali::Internal::SceneGraph::PropertyBase::ResetToBaseValue()
1262 void ResetToBaseValue(BufferIndex updateBufferIndex) override
1264 if(CLEAN_FLAG != mDirtyFlags)
1266 mValue[updateBufferIndex] = mBaseValue;
1268 mDirtyFlags = (mDirtyFlags >> 1);
1273 * @copydoc Dali::PropertyInput::GetVector4()
1275 const Vector4& GetVector4(BufferIndex bufferIndex) const override
1277 return mValue[bufferIndex];
1281 * Set the property value. This will only persist for the current frame; the property
1282 * will be reset with the base value, at the beginning of the next frame.
1283 * @param[in] bufferIndex The buffer to write.
1284 * @param[in] value The new property value.
1286 void Set(BufferIndex bufferIndex, const Vector4& value)
1288 mValue[bufferIndex] = value;
1294 * Set the X value. This will only persist for the current frame; the property
1295 * will be reset with the base value, at the beginning of the next frame.
1296 * @param[in] bufferIndex The buffer to write.
1297 * @param[in] value The new X value.
1299 void SetX(BufferIndex bufferIndex, float value)
1301 mValue[bufferIndex].x = value;
1307 * Set the Y value. This will only persist for the current frame; the property
1308 * will be reset with the base value, at the beginning of the next frame.
1309 * @param[in] bufferIndex The buffer to write.
1310 * @param[in] value The new Y value.
1312 void SetY(BufferIndex bufferIndex, float value)
1314 mValue[bufferIndex].y = value;
1320 * Set the Z value. This will only persist for the current frame; the property
1321 * will be reset with the base value, at the beginning of the next frame.
1322 * @param[in] bufferIndex The buffer to write.
1323 * @param[in] value The new Z value.
1325 void SetZ(BufferIndex bufferIndex, float value)
1327 mValue[bufferIndex].z = value;
1333 * Set the W value. This will only persist for the current frame; the property
1334 * will be reset with the base value, at the beginning of the next frame.
1335 * @param[in] bufferIndex The buffer to write.
1336 * @param[in] value The new W value.
1338 void SetW(BufferIndex bufferIndex, float value)
1340 mValue[bufferIndex].w = value;
1346 * Change the property value by a relative amount.
1347 * @param[in] bufferIndex The buffer to write.
1348 * @param[in] delta The property will change by this amount.
1350 void SetRelative(BufferIndex bufferIndex, const Vector4& delta)
1352 mValue[bufferIndex] = mValue[bufferIndex] + delta;
1358 * Change the X value by a relative amount.
1359 * @param[in] bufferIndex The buffer to write.
1360 * @param[in] delta The X value will change by this amount.
1362 void SetXRelative(BufferIndex bufferIndex, float delta)
1364 mValue[bufferIndex].x = mValue[bufferIndex].x + delta;
1370 * Change the Y value by a relative amount.
1371 * @param[in] bufferIndex The buffer to write.
1372 * @param[in] delta The Y value will change by this amount.
1374 void SetYRelative(BufferIndex bufferIndex, float delta)
1376 mValue[bufferIndex].y = mValue[bufferIndex].y + delta;
1382 * Change the Z value by a relative amount.
1383 * @param[in] bufferIndex The buffer to write.
1384 * @param[in] delta The Z value will change by this amount.
1386 void SetZRelative(BufferIndex bufferIndex, float delta)
1388 mValue[bufferIndex].z = mValue[bufferIndex].z + delta;
1394 * Change the W value by a relative amount.
1395 * @param[in] bufferIndex The buffer to write.
1396 * @param[in] delta The W value will change by this amount.
1398 void SetWRelative(BufferIndex bufferIndex, float delta)
1400 mValue[bufferIndex].w = mValue[bufferIndex].w + delta;
1406 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
1408 Vector4& Get(BufferIndex bufferIndex)
1410 return mValue[bufferIndex];
1414 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
1416 const Vector4& Get(BufferIndex bufferIndex) const
1418 return mValue[bufferIndex];
1422 * Retrieve the property value.
1423 * @param[in] bufferIndex The buffer to read.
1424 * @return The property value.
1426 Vector4& operator[](BufferIndex bufferIndex)
1428 return mValue[bufferIndex];
1432 * Retrieve the property value.
1433 * @param[in] bufferIndex The buffer to read.
1434 * @return The property value.
1436 const Vector4& operator[](BufferIndex bufferIndex) const
1438 return mValue[bufferIndex];
1442 * Set both the property value & base value.
1443 * @param[in] bufferIndex The buffer to write for the property value.
1444 * @param[in] value The new property value.
1446 void Bake(BufferIndex bufferIndex, const Vector4& value)
1448 mValue[bufferIndex] = value;
1449 mValue[1 - bufferIndex] = value;
1450 mBaseValue = mValue[bufferIndex];
1456 * Set both the X value & base X value.
1457 * @param[in] bufferIndex The buffer to write for the property value.
1458 * @param[in] value The new property value.
1460 void BakeX(BufferIndex bufferIndex, float value)
1462 mValue[bufferIndex].x = value;
1463 mValue[1 - bufferIndex].x = value;
1464 mBaseValue.x = mValue[bufferIndex].x;
1470 * Set both the Y value & base Y value.
1471 * @param[in] bufferIndex The buffer to write for the property value.
1472 * @param[in] value The new property value.
1474 void BakeY(BufferIndex bufferIndex, float value)
1476 mValue[bufferIndex].y = value;
1477 mValue[1 - bufferIndex].y = value;
1478 mBaseValue.y = mValue[bufferIndex].y;
1484 * Set both the Z value & base Z value.
1485 * @param[in] bufferIndex The buffer to write for the property value.
1486 * @param[in] value The new property value.
1488 void BakeZ(BufferIndex bufferIndex, float value)
1490 mValue[bufferIndex].z = value;
1491 mValue[1 - bufferIndex].z = value;
1492 mBaseValue.z = mValue[bufferIndex].z;
1498 * Set both the W value & base W value.
1499 * @param[in] bufferIndex The buffer to write for the property value.
1500 * @param[in] value The new property value.
1502 void BakeW(BufferIndex bufferIndex, float value)
1504 mValue[bufferIndex].w = value;
1505 mValue[1 - bufferIndex].w = value;
1506 mBaseValue.w = mValue[bufferIndex].w;
1512 * Change the property value & base value by a relative amount.
1513 * @param[in] bufferIndex The buffer to write for the local property value.
1514 * @param[in] delta The property will change by this amount.
1516 void BakeRelative(BufferIndex bufferIndex, const Vector4& delta)
1518 mValue[bufferIndex] = mValue[bufferIndex] + delta;
1519 mBaseValue = mValue[bufferIndex];
1525 * Change the X value & base X value by a relative amount.
1526 * @param[in] bufferIndex The buffer to write for the local property value.
1527 * @param[in] delta The X value will change by this amount.
1529 void BakeXRelative(BufferIndex bufferIndex, float delta)
1531 mValue[bufferIndex].x = mValue[bufferIndex].x + delta;
1532 mBaseValue.x = mValue[bufferIndex].x;
1538 * Change the Y value & base Y value by a relative amount.
1539 * @param[in] bufferIndex The buffer to write for the local property value.
1540 * @param[in] delta The Y value will change by this amount.
1542 void BakeYRelative(BufferIndex bufferIndex, float delta)
1544 mValue[bufferIndex].y = mValue[bufferIndex].y + delta;
1545 mBaseValue.y = mValue[bufferIndex].y;
1551 * Change the Z value & base Z value by a relative amount.
1552 * @param[in] bufferIndex The buffer to write for the local property value.
1553 * @param[in] delta The Z value will change by this amount.
1555 void BakeZRelative(BufferIndex bufferIndex, float delta)
1557 mValue[bufferIndex].z = mValue[bufferIndex].z + delta;
1558 mBaseValue.z = mValue[bufferIndex].z;
1564 * Change the W value & base W value by a relative amount.
1565 * @param[in] bufferIndex The buffer to write for the local property value.
1566 * @param[in] delta The W value will change by this amount.
1568 void BakeWRelative(BufferIndex bufferIndex, float delta)
1570 mValue[bufferIndex].w = mValue[bufferIndex].w + delta;
1571 mBaseValue.w = mValue[bufferIndex].w;
1577 * Sets both double-buffered W values & the base W value.
1578 * This should only be used when the owning object has not been connected to the scene-graph.
1579 * @param[in] value The new W value.
1581 void SetWInitial(float value)
1583 mValue[0].w = value;
1584 mValue[1].w = mValue[0].w;
1585 mBaseValue.w = mValue[0].w;
1590 AnimatableProperty(const AnimatableProperty& property);
1593 AnimatableProperty& operator=(const AnimatableProperty& rhs);
1596 DoubleBuffered<Vector4> mValue; ///< The double-buffered property value
1597 Vector4 mBaseValue; ///< Reset to this base value at the beginning of each frame
1600 * An Quaternion animatable property of a scene-graph object.
1603 class AnimatableProperty<Quaternion> : public AnimatablePropertyBase
1607 * Create an animatable property.
1609 AnimatableProperty()
1616 * Create an animatable property.
1617 * @param [in] initialValue The initial value of the property.
1619 AnimatableProperty(const Quaternion& initialValue)
1620 : mValue(initialValue),
1621 mBaseValue(initialValue)
1626 * Virtual destructor.
1628 ~AnimatableProperty() override = default;
1631 * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
1633 Dali::Property::Type GetType() const override
1635 return Dali::PropertyTypes::Get<Quaternion>();
1639 * @copydoc Dali::Internal::SceneGraph::PropertyBase::ResetToBaseValue()
1641 void ResetToBaseValue(BufferIndex updateBufferIndex) override
1643 if(CLEAN_FLAG != mDirtyFlags)
1645 mValue[updateBufferIndex] = mBaseValue;
1647 mDirtyFlags = (mDirtyFlags >> 1);
1652 * @copydoc Dali::PropertyInput::GetQuaternion()
1654 const Quaternion& GetQuaternion(BufferIndex bufferIndex) const override
1656 return mValue[bufferIndex];
1660 * Set the property value. This will only persist for the current frame; the property
1661 * will be reset with the base value, at the beginning of the next frame.
1662 * @param[in] bufferIndex The buffer to write.
1663 * @param[in] value The new property value.
1665 void Set(BufferIndex bufferIndex, const Quaternion& value)
1667 mValue[bufferIndex] = value;
1673 * Change the property value by a relative amount.
1674 * @param[in] bufferIndex The buffer to write.
1675 * @param[in] delta The property will change by this amount.
1677 void SetRelative(BufferIndex bufferIndex, const Quaternion& delta)
1679 mValue[bufferIndex] *= delta;
1685 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
1687 Quaternion& Get(BufferIndex bufferIndex)
1689 return mValue[bufferIndex];
1693 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
1695 const Quaternion& Get(BufferIndex bufferIndex) const
1697 return mValue[bufferIndex];
1701 * Retrieve the property value.
1702 * @param[in] bufferIndex The buffer to read.
1703 * @return The property value.
1705 Quaternion& operator[](BufferIndex bufferIndex)
1707 return mValue[bufferIndex];
1711 * Retrieve the property value.
1712 * @param[in] bufferIndex The buffer to read.
1713 * @return The property value.
1715 const Quaternion& operator[](BufferIndex bufferIndex) const
1717 return mValue[bufferIndex];
1721 * Set both the property value & base value.
1722 * @param[in] bufferIndex The buffer to write for the property value.
1723 * @param[in] value The new property value.
1725 void Bake(BufferIndex bufferIndex, const Quaternion& value)
1727 // It's ok to bake both buffers as render is performed in same thread as update. Reading from event side
1728 // has never been atomically safe.
1729 mValue[bufferIndex] = value;
1730 mValue[1 - bufferIndex] = value;
1737 * Change the property value & base value by a relative amount.
1738 * @param[in] bufferIndex The buffer to write for the local property value.
1739 * @param[in] delta The property will change by this amount.
1741 void BakeRelative(BufferIndex bufferIndex, const Quaternion& delta)
1743 mValue[bufferIndex] *= delta;
1744 mBaseValue = mValue[bufferIndex];
1751 AnimatableProperty(const AnimatableProperty& property);
1754 AnimatableProperty& operator=(const AnimatableProperty& rhs);
1757 DoubleBuffered<Quaternion> mValue; ///< The double-buffered property value
1758 Quaternion mBaseValue; ///< Reset to this base value at the beginning of each frame
1762 * A Matrix animatable property of a scene-graph object.
1765 class AnimatableProperty<Matrix> : public AnimatablePropertyBase
1769 * Create an animatable property.
1770 * @param [in] initialValue The initial value of the property.
1772 AnimatableProperty(const Matrix& initialValue)
1773 : mValue(initialValue),
1774 mBaseValue(initialValue)
1779 * Virtual destructor.
1781 ~AnimatableProperty() override = default;
1784 * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
1786 Dali::Property::Type GetType() const override
1788 return Dali::PropertyTypes::Get<Matrix>();
1792 * @copydoc Dali::Internal::SceneGraph::PropertyBase::ResetToBaseValue()
1794 void ResetToBaseValue(BufferIndex updateBufferIndex) override
1796 if(CLEAN_FLAG != mDirtyFlags)
1798 mValue[updateBufferIndex] = mBaseValue;
1800 mDirtyFlags = (mDirtyFlags >> 1);
1805 * @copydoc Dali::Internal::PropertyInputImpl::GetMatrix()
1807 const Matrix& GetMatrix(BufferIndex bufferIndex) const override
1809 return mValue[bufferIndex];
1813 * Set the property value. This will only persist for the current frame; the property
1814 * will be reset with the base value, at the beginning of the next frame.
1815 * @param[in] bufferIndex The buffer to write.
1816 * @param[in] value The new property value.
1818 void Set(BufferIndex bufferIndex, const Matrix& value)
1820 mValue[bufferIndex] = value;
1825 * Change the property value by a relative amount.
1826 * @param[in] bufferIndex The buffer to write.
1827 * @param[in] delta The property will change by this amount.
1829 void SetRelative(BufferIndex bufferIndex, const Matrix& delta)
1832 MatrixUtils::Multiply(temp, mValue[bufferIndex], delta);
1833 mValue[bufferIndex] = temp;
1839 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
1841 Matrix& Get(BufferIndex bufferIndex)
1843 return mValue[bufferIndex];
1847 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
1849 const Matrix& Get(BufferIndex bufferIndex) const
1851 return mValue[bufferIndex];
1855 * Retrieve the property value.
1856 * @param[in] bufferIndex The buffer to read.
1857 * @return The property value.
1859 Matrix& operator[](BufferIndex bufferIndex)
1861 return mValue[bufferIndex];
1865 * Retrieve the property value.
1866 * @param[in] bufferIndex The buffer to read.
1867 * @return The property value.
1869 const Matrix& operator[](BufferIndex bufferIndex) const
1871 return mValue[bufferIndex];
1875 * Set both the property value & base value.
1876 * @param[in] bufferIndex The buffer to write for the property value.
1877 * @param[in] value The new property value.
1879 void Bake(BufferIndex bufferIndex, const Matrix& value)
1881 // It's ok to bake both buffers as render is performed in same thread as update. Reading from event side
1882 // has never been atomically safe.
1883 mValue[bufferIndex] = value;
1884 mValue[1 - bufferIndex] = value;
1885 mBaseValue = mValue[bufferIndex];
1891 * Change the property value & base value by a relative amount.
1892 * @param[in] bufferIndex The buffer to write for the local property value.
1893 * @param[in] delta The property will change by this amount.
1895 void BakeRelative(BufferIndex bufferIndex, const Matrix& delta)
1898 MatrixUtils::Multiply(temp, mValue[bufferIndex], delta);
1899 mValue[bufferIndex] = temp;
1907 AnimatableProperty(const AnimatableProperty& property);
1910 AnimatableProperty& operator=(const AnimatableProperty& rhs);
1913 DoubleBuffered<Matrix> mValue; ///< The double-buffered property value
1914 Matrix mBaseValue; ///< Reset to this base value at the beginning of each frame
1918 * A Matrix3 animatable property of a scene-graph object.
1921 class AnimatableProperty<Matrix3> : public AnimatablePropertyBase
1925 * Create an animatable property.
1926 * @param [in] initialValue The initial value of the property.
1928 AnimatableProperty(const Matrix3& initialValue)
1929 : mValue(initialValue),
1930 mBaseValue(initialValue)
1935 * Virtual destructor.
1937 ~AnimatableProperty() override = default;
1940 * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
1942 Dali::Property::Type GetType() const override
1944 return Dali::PropertyTypes::Get<Matrix3>();
1948 * @copydoc Dali::Internal::SceneGraph::PropertyBase::ResetToBaseValue()
1950 void ResetToBaseValue(BufferIndex updateBufferIndex) override
1952 if(CLEAN_FLAG != mDirtyFlags)
1954 mValue[updateBufferIndex] = mBaseValue;
1956 mDirtyFlags = (mDirtyFlags >> 1);
1961 * @copydoc Dali::Internal::PropertyInputImpl::GetMatrix3()
1963 const Matrix3& GetMatrix3(BufferIndex bufferIndex) const override
1965 return mValue[bufferIndex];
1969 * Set the property value. This will only persist for the current frame; the property
1970 * will be reset with the base value, at the beginning of the next frame.
1971 * @param[in] bufferIndex The buffer to write.
1972 * @param[in] value The new property value.
1974 void Set(BufferIndex bufferIndex, const Matrix3& value)
1976 mValue[bufferIndex] = value;
1981 * Change the property value by a relative amount.
1982 * @param[in] bufferIndex The buffer to write.
1983 * @param[in] delta The property will change by this amount.
1985 void SetRelative(BufferIndex bufferIndex, const Matrix3& delta)
1988 MatrixUtils::Multiply(temp, mValue[bufferIndex], delta);
1989 mValue[bufferIndex] = temp;
1994 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
1996 Matrix3& Get(BufferIndex bufferIndex)
1998 return mValue[bufferIndex];
2002 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
2004 const Matrix3& Get(BufferIndex bufferIndex) const
2006 return mValue[bufferIndex];
2010 * Retrieve the property value.
2011 * @param[in] bufferIndex The buffer to read.
2012 * @return The property value.
2014 Matrix3& operator[](BufferIndex bufferIndex)
2016 return mValue[bufferIndex];
2020 * Retrieve the property value.
2021 * @param[in] bufferIndex The buffer to read.
2022 * @return The property value.
2024 const Matrix3& operator[](BufferIndex bufferIndex) const
2026 return mValue[bufferIndex];
2030 * Set both the property value & base value.
2031 * @param[in] bufferIndex The buffer to write for the property value.
2032 * @param[in] value The new property value.
2034 void Bake(BufferIndex bufferIndex, const Matrix3& value)
2036 // It's ok to bake both buffers as render is performed in same thread as update. Reading from event side
2037 // has never been atomically safe.
2038 mValue[bufferIndex] = value;
2039 mValue[1 - bufferIndex] = value;
2040 mBaseValue = mValue[bufferIndex];
2046 * Change the property value & base value by a relative amount.
2047 * @param[in] bufferIndex The buffer to write for the local property value.
2048 * @param[in] delta The property will change by this amount.
2050 void BakeRelative(BufferIndex bufferIndex, const Matrix3& delta)
2053 MatrixUtils::Multiply(temp, mValue[bufferIndex], delta);
2054 mValue[bufferIndex] = temp;
2062 AnimatableProperty(const AnimatableProperty& property);
2065 AnimatableProperty& operator=(const AnimatableProperty& rhs);
2068 DoubleBuffered<Matrix3> mValue; ///< The double-buffered property value
2069 Matrix3 mBaseValue; ///< Reset to this base value at the beginning of each frame
2072 } // namespace SceneGraph
2074 } // namespace Internal
2078 #endif // DALI_INTERNAL_SCENE_GRAPH_ANIMATABLE_PROPERTY_H