1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef META_API_ANIMATION_H
17 #define META_API_ANIMATION_H
18
19 #include <meta/api/curves/easing_curve.h>
20 #include <meta/api/internal/animation_api.h>
21
META_BEGIN_NAMESPACE()22 META_BEGIN_NAMESPACE()
23
24 /**
25 * @brief The SequentialAnimation class provides a wrapper for ISequentialAnimation.
26 */
27 class SequentialAnimation final
28 : public Internal::StaggeredAnimationInterfaceAPI<SequentialAnimation, META_NS::ClassId::SequentialAnimation> {
29 META_API(SequentialAnimation)
30 };
31
32 /**
33 * @brief The ParallelAnimation class provides a wrapper for IParallelAnimation.
34 */
35 class ParallelAnimation final
36 : public Internal::StaggeredAnimationInterfaceAPI<ParallelAnimation, META_NS::ClassId::ParallelAnimation> {
37 META_API(ParallelAnimation)
38 };
39
40 /**
41 * @brief The PropertyAnimation class provides a wrapper for IPropertyAnimation.
42 */
43 class PropertyAnimation final
44 : public Internal::PropertyAnimationInterfaceAPI<PropertyAnimation, META_NS::ClassId::PropertyAnimation> {
45 META_API(PropertyAnimation)
46 };
47
48 /**
49 * @brief The KeyframeAnimation<T> class provides a wrapper for IKeyframeAnimation,
50 * with automatic typing for From and To property.
51 */
52 template<class Type>
53 class KeyframeAnimation final : public Internal::StartablePropertyAnimationInterfaceAPI<KeyframeAnimation<Type>,
54 META_NS::ClassId::KeyframeAnimation> {
55 META_API(KeyframeAnimation<Type>)
META_API_OBJECT_CONVERTIBLE(META_NS::IKeyframeAnimation)56 META_API_OBJECT_CONVERTIBLE(META_NS::IKeyframeAnimation)
57 META_API_CACHE_INTERFACE(META_NS::IKeyframeAnimation, KeyframeAnimation)
58 public:
59 /** Creates the contained object */
60 static META_NS::IObject::Ptr Create()
61 {
62 auto object = META_NS::GetObjectRegistry().Create(META_NS::ClassId::KeyframeAnimation);
63 return object;
64 }
META_API_INTERFACE_PROPERTY_CACHED(KeyframeAnimation,From,IAny::Ptr)65 META_API_INTERFACE_PROPERTY_CACHED(KeyframeAnimation, From, IAny::Ptr)
66 META_API_INTERFACE_PROPERTY_CACHED(KeyframeAnimation, To, IAny::Ptr)
67 /** Get the starting value of the animation */
68 auto& From(const Type& value)
69 {
70 if (auto p = META_API_CACHED_INTERFACE(KeyframeAnimation)->From()) {
71 if (auto pv = p->GetValue()) { // IAny::Ptr
72 pv->SetValue(value);
73 } else {
74 p->SetValue(IAny::Ptr { new Any<Type>(value) });
75 }
76 }
77 return *this;
78 }
79 /** Set the target value of the animation */
To(const Type & value)80 auto& To(const Type& value)
81 {
82 if (auto p = META_API_CACHED_INTERFACE(KeyframeAnimation)->To()) {
83 if (auto pv = p->GetValue()) { // IAny::Ptr
84 pv->SetValue(value);
85 } else {
86 p->SetValue(IAny::Ptr { new Any<Type>(value) });
87 }
88 }
89 return *this;
90 }
91 };
92
93 /**
94 * @brief The TrackAnimation<T> class provides a wrapper for ITrackAnimation,
95 * with automatic typing for key-frames.
96 */
97 template<class Type>
98 class TrackAnimation final
99 : public Internal::StartablePropertyAnimationInterfaceAPI<TrackAnimation<Type>, META_NS::ClassId::TrackAnimation> {
100 META_API(TrackAnimation<Type>)
META_API_OBJECT_CONVERTIBLE(META_NS::ITrackAnimation)101 META_API_OBJECT_CONVERTIBLE(META_NS::ITrackAnimation)
102 META_API_CACHE_INTERFACE(META_NS::ITrackAnimation, TrackAnimation)
103 public:
104 /** Creates the contained object */
105 static META_NS::IObject::Ptr Create()
106 {
107 const auto object = META_NS::GetObjectRegistry().Create(META_NS::ClassId::TrackAnimation);
108 if (auto track = interface_cast<META_NS::ITrackAnimation>(object)) {
109 if (auto internal = interface_cast<META_NS::IPropertyInternalAny>(track->Keyframes())) {
110 internal->SetInternalAny(ArrayAny<Type>({}).Clone(false));
111 }
112 }
113 return object;
114 }
META_API_INTERFACE_ARRAY_PROPERTY_CACHED(TrackAnimation,KeyframeCurves,META_NS::ICurve1D::Ptr)115 META_API_INTERFACE_ARRAY_PROPERTY_CACHED(TrackAnimation, KeyframeCurves, META_NS::ICurve1D::Ptr)
116 META_API_INTERFACE_READONLY_PROPERTY_CACHED(TrackAnimation, CurrentKeyframeIndex, uint32_t)
117 /** Get the track timestamps */
118 META_NS::ArrayProperty<float> Timestamps()
119 {
120 return META_API_CACHED_INTERFACE(TrackAnimation)->Timestamps();
121 }
122 /** Set the track timestamps */
Timestamps(BASE_NS::array_view<float> timestamps)123 auto& Timestamps(BASE_NS::array_view<float> timestamps)
124 {
125 Timestamps()->SetValue(BASE_NS::move(timestamps));
126 return *this;
127 }
128 /** Get the track key-frames */
Keyframes()129 META_NS::ArrayProperty<Type> Keyframes()
130 {
131 return META_NS::ArrayProperty<Type>(META_API_CACHED_INTERFACE(TrackAnimation)->Keyframes());
132 }
133 /** Set the track key-frames */
Keyframes(BASE_NS::array_view<Type> keyframes)134 auto& Keyframes(BASE_NS::array_view<Type> keyframes)
135 {
136 if (auto kf = Keyframes()) {
137 kf->SetValue(BASE_NS::move(keyframes));
138 }
139 return *this;
140 }
141 /** Get the track timestamps */
KeyframeHandlers()142 META_NS::ArrayProperty<IFunction::Ptr> KeyframeHandlers()
143 {
144 return META_API_CACHED_INTERFACE(TrackAnimation)->KeyframeHandlers();
145 }
KeyframeHandlers(BASE_NS::array_view<IFunction::Ptr> handlers)146 auto& KeyframeHandlers(BASE_NS::array_view<IFunction::Ptr> handlers)
147 {
148 KeyframeHandlers()->SetValue(BASE_NS::move(handlers));
149 return *this;
150 }
AddKeyframe(float timestamp,const IAny::ConstPtr & value)151 size_t AddKeyframe(float timestamp, const IAny::ConstPtr& value)
152 {
153 return META_API_CACHED_INTERFACE(TrackAnimation)->AddKeyframe(timestamp, value);
154 }
RemoveKeyframe(size_t index)155 bool RemoveKeyframe(size_t index)
156 {
157 return META_API_CACHED_INTERFACE(TrackAnimation)->RemoveKeyframe(index);
158 }
RemoveAllKeyframes()159 void RemoveAllKeyframes()
160 {
161 return META_API_CACHED_INTERFACE(TrackAnimation)->RemoveAllKeyframes();
162 }
163 };
164
165 META_END_NAMESPACE()
166
167 #endif // META_API_ANIMATION_H
168