1// Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB).
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QT3DANIMATION_ANIMATION_CLIPBLENDNODE_P_H
5#define QT3DANIMATION_ANIMATION_CLIPBLENDNODE_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists for the convenience
12// of other Qt classes. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <Qt3DCore/qnodeid.h>
19#include <Qt3DAnimation/private/backendnode_p.h>
20#include <Qt3DAnimation/private/managers_p.h>
21
22QT_BEGIN_NAMESPACE
23
24namespace Qt3DAnimation {
25
26namespace Animation {
27
28class ClipBlendNodeManager;
29
30class Q_AUTOTEST_EXPORT ClipBlendNode : public BackendNode
31{
32public:
33 ~ClipBlendNode();
34
35 enum BlendType {
36 NoneBlendType,
37 LerpBlendType,
38 AdditiveBlendType,
39 ValueType
40 };
41
42 void setClipBlendNodeManager(ClipBlendNodeManager *manager);
43 inline ClipBlendNodeManager *clipBlendNodeManager() const { return m_manager; }
44
45 BlendType blendType() const;
46
47 void blend(Qt3DCore::QNodeId animatorId);
48
49 void setClipResults(Qt3DCore::QNodeId animatorId, const ClipResults &clipResults);
50 ClipResults clipResults(Qt3DCore::QNodeId animatorId) const;
51
52 virtual QList<Qt3DCore::QNodeId> allDependencyIds() const = 0;
53 virtual QList<Qt3DCore::QNodeId> currentDependencyIds() const = 0;
54 virtual double duration() const = 0;
55
56protected:
57 explicit ClipBlendNode(BlendType blendType);
58 virtual ClipResults doBlend(const QList<ClipResults> &blendData) const = 0;
59
60private:
61 ClipBlendNodeManager *m_manager;
62 BlendType m_blendType;
63
64 // Store the results of evaluations indexed by animator id
65 QList<Qt3DCore::QNodeId> m_animatorIds;
66 QList<ClipResults> m_clipResults;
67};
68
69template<typename Backend, typename Frontend>
70class ClipBlendNodeFunctor : public Qt3DCore::QBackendNodeMapper
71{
72public:
73 explicit ClipBlendNodeFunctor(Handler *handler, ClipBlendNodeManager *manager)
74 : m_handler(handler)
75 , m_manager(manager)
76 {
77 }
78
79 Qt3DCore::QBackendNode *create(Qt3DCore::QNodeId id) const final
80 {
81 if (m_manager->containsNode(id))
82 return static_cast<Backend *>(m_manager->lookupNode(id));
83 Backend *backend = new Backend();
84 backend->setClipBlendNodeManager(m_manager);
85 backend->setHandler(m_handler);
86 m_manager->appendNode(id, node: backend);
87 return backend;
88 }
89
90 Qt3DCore::QBackendNode *get(Qt3DCore::QNodeId id) const final
91 {
92 return m_manager->lookupNode(id);
93 }
94
95 void destroy(Qt3DCore::QNodeId id) const final
96 {
97 m_manager->releaseNode(id);
98 }
99
100private:
101 Handler *m_handler;
102 ClipBlendNodeManager *m_manager;
103};
104
105} // Animation
106
107} // Qt3DAnimation
108
109QT_END_NAMESPACE
110
111#endif // QT3DANIMATION_ANIMATION_CLIPBLENDNODE_P_H
112

source code of qt3d/src/animation/backend/clipblendnode_p.h