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