• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 SCENE_SRC_ECS_ANIMATION_H
17 #define SCENE_SRC_ECS_ANIMATION_H
18 
19 #include <scene/interface/resource/types.h>
20 
21 #include <meta/ext/attachment/attachment.h>
22 #include <meta/ext/implementation_macros.h>
23 #include <meta/ext/resource/resource.h>
24 #include <meta/interface/animation/intf_animation.h>
25 
26 #include "component/animation_component.h"
27 
28 SCENE_BEGIN_NAMESPACE()
29 
30 META_REGISTER_CLASS(EcsAnimation, "5513d745-958f-4aa6-bab7-7561cebdc3dd", META_NS::ObjectCategoryBits::NO_CATEGORY)
31 
32 class EcsAnimation : public META_NS::IntroduceInterfaces<META_NS::AttachmentFwd, META_NS::IStartableAnimation,
33                          META_NS::IAnimation, META_NS::Resource, IEcsObjectAccess> {
34     META_OBJECT(EcsAnimation, SCENE_NS::ClassId::EcsAnimation, IntroduceInterfaces)
35 
36 public:
37     EcsAnimation() = default;
38     ~EcsAnimation();
39 
40     bool SetEcsObject(const IEcsObject::Ptr&) override;
41     IEcsObject::Ptr GetEcsObject() const override;
42 
43     BASE_NS::string GetName() const override;
44 
45 public: // IAnimation
META_BEGIN_STATIC_DATA()46     META_BEGIN_STATIC_DATA()
47     META_STATIC_PROPERTY_DATA(META_NS::IAnimation, bool, Enabled, true)
48     META_STATIC_PROPERTY_DATA(META_NS::IAnimation, bool, Valid, false)
49     META_STATIC_PROPERTY_DATA(META_NS::IAnimation, META_NS::TimeSpan, TotalDuration)
50     META_STATIC_PROPERTY_DATA(META_NS::IAnimation, bool, Running)
51     META_STATIC_PROPERTY_DATA(META_NS::IAnimation, float, Progress)
52 
53     META_STATIC_EVENT_DATA(META_NS::IAnimation, META_NS::IOnChanged, OnFinished)
54     META_STATIC_EVENT_DATA(META_NS::IAnimation, META_NS::IOnChanged, OnStarted)
55 
56     META_STATIC_FORWARDED_PROPERTY_DATA(META_NS::INamed, BASE_NS::string, Name)
57 
58     //--- not supported
59     META_STATIC_PROPERTY_DATA(META_NS::IAnimation, META_NS::ICurve1D::Ptr, Curve)
60     META_STATIC_PROPERTY_DATA(META_NS::IAnimation, BASE_NS::weak_ptr<META_NS::IAnimationController>, Controller)
61     //---
62     META_END_STATIC_DATA()
63 
64     META_IMPLEMENT_PROPERTY(bool, Enabled)
65     META_IMPLEMENT_READONLY_PROPERTY(bool, Valid)
66     META_IMPLEMENT_READONLY_PROPERTY(META_NS::TimeSpan, TotalDuration)
67     META_IMPLEMENT_READONLY_PROPERTY(bool, Running)
68     META_IMPLEMENT_READONLY_PROPERTY(float, Progress)
69 
70     META_IMPLEMENT_EVENT(META_NS::IOnChanged, OnFinished)
71     META_IMPLEMENT_EVENT(META_NS::IOnChanged, OnStarted)
72 
73     META_FORWARD_PROPERTY(BASE_NS::string, Name, GetNameProperty())
74 
75     //--- not supported
76     META_IMPLEMENT_PROPERTY(META_NS::ICurve1D::Ptr, Curve)
77     META_IMPLEMENT_PROPERTY(BASE_NS::weak_ptr<META_NS::IAnimationController>, Controller)
78 
79     //--- not supported
80     void Step(const META_NS::IClock::ConstPtr&) override {}
81     //---
82 
GetNameProperty()83     META_NS::IProperty::Ptr GetNameProperty() const
84     {
85         auto i = interface_cast<META_NS::INamed>(GetEcsObject());
86         return i ? i->Name() : nullptr;
87     }
88 
89 public: // IStartableAnimation
90     void Pause() override;
91     void Restart() override;
92     void Seek(float position) override;
93     void Start() override;
94     void Stop() override;
95     void Finish() override;
96 
97 public:
98     bool Attach(const META_NS::IObject::Ptr& attachment, const META_NS::IObject::Ptr& dataContext) override;
99     bool Detach(const META_NS::IObject::Ptr& attachment) override;
100     bool AttachTo(const META_NS::IAttach::Ptr& target, const META_NS::IObject::Ptr& dataContext) override;
101     bool DetachFrom(const META_NS::IAttach::Ptr& target) override;
102 
GetResourceType()103     CORE_NS::ResourceType GetResourceType() const override
104     {
105         return ClassId::AnimationResource.Id().ToUid();
106     }
107 
108 private:
109     void Init();
110     void UpdateCompletion();
111     void UpdateProgressFromEcs();
112     void UpdateTotalDuration();
113     void InternalStop();
114     void SetProgress(float);
115 
116 private:
117     IInternalAnimation::Ptr anim_;
118 };
119 
120 SCENE_END_NAMESPACE()
121 
122 #endif