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#include "qskeletonloader.h"
5#include "qskeletonloader_p.h"
6#include <Qt3DCore/qjoint.h>
7
8QT_BEGIN_NAMESPACE
9
10namespace Qt3DCore {
11
12QSkeletonLoaderPrivate::QSkeletonLoaderPrivate()
13 : QAbstractSkeletonPrivate()
14 , m_source()
15 , m_createJoints(false)
16 , m_status(QSkeletonLoader::NotReady)
17 , m_rootJoint(nullptr)
18{
19 m_type = SkeletonLoader;
20}
21
22void QSkeletonLoaderPrivate::setStatus(QSkeletonLoader::Status status)
23{
24 Q_Q(QSkeletonLoader);
25 if (status != m_status) {
26 m_status = status;
27 const bool blocked = q->blockNotifications(block: true);
28 emit q->statusChanged(status: m_status);
29 q->blockNotifications(block: blocked);
30 }
31}
32
33void QSkeletonLoaderPrivate::setRootJoint(QJoint *rootJoint)
34{
35 Q_Q(QSkeletonLoader);
36 if (rootJoint == m_rootJoint)
37 return;
38
39 if (m_rootJoint)
40 unregisterDestructionHelper(node: m_rootJoint);
41
42 if (rootJoint && !rootJoint->parent())
43 rootJoint->setParent(q);
44
45 m_rootJoint = rootJoint;
46
47 // Ensures proper bookkeeping
48 if (m_rootJoint)
49 registerPrivateDestructionHelper(node: m_rootJoint, func: &QSkeletonLoaderPrivate::setRootJoint);
50
51 emit q->rootJointChanged(rootJoint: m_rootJoint);
52}
53
54/*!
55 \qmltype SkeletonLoader
56 \inqmlmodule Qt3D.Core
57 \inherits AbstractSkeleton
58 \instantiates Qt3DCore::QSkeletonLoader
59 \since 5.10
60 \brief Used to load a skeleton of joints from file.
61
62 Use SkeletonLoader if you wish to load a whole skeleton from file rather
63 than creating the joints yourself using Skeleton and Joints. Creating a
64 skeleton and binding the vertices of a mesh to the skeleton is most easily
65 performed in a 3D digital content creation tool such as Blender. The
66 resulting skeleton and mesh can then be exported in a suitable format such
67 as glTF 2 for consumption by Qt 3D.
68*/
69
70/*!
71 \qmlproperty url SkeletonLoader::source
72
73 Holds the source url from which to load the skeleton.
74*/
75
76/*!
77 \qmlproperty SkeletonLoader.Status SkeletonLoader::status
78
79 Holds the current status of skeleton loading.
80*/
81
82/*!
83 \class Qt3DCore::QSkeletonLoader
84 \inmodule Qt3DCore
85 \inherits Qt3DCore::QAbstractSkeleton
86 \since 5.10
87 \brief Used to load a skeleton of joints from file.
88
89 Use SkeletonLoader if you wish to load a whole skeleton from file rather
90 than creating the joints yourself using Skeleton and Joints. Creating a
91 skeleton and binding the vertices of a mesh to the skeleton is most easily
92 performed in a 3D digital content creation tool such as Blender. The
93 resulting skeleton and mesh can then be exported in a suitable format such
94 as glTF 2 for consumption by Qt 3D.
95*/
96
97/*!
98 \enum QSkeletonLoader::Status
99
100 This enum identifies the status of skeleton.
101
102 \value NotReady The skeleton has not been loaded yet
103 \value Ready The skeleton was successfully loaded
104 \value Error An error occurred while loading the skeleton
105*/
106/*!
107 \property Qt3DCore::QSkeletonLoader::createJointsEnabled
108
109 \brief A boolean to indicate whether createJoints is enabled or not.
110*/
111/*!
112 Constructs a new QSkeletonLoader with \a parent.
113*/
114QSkeletonLoader::QSkeletonLoader(Qt3DCore::QNode *parent)
115 : QAbstractSkeleton(*new QSkeletonLoaderPrivate, parent)
116{
117}
118
119/*!
120 Constructs a new QSkeletonLoader with \a parent and sets the \a source.
121*/
122QSkeletonLoader::QSkeletonLoader(const QUrl &source, QNode *parent)
123 : QAbstractSkeleton(*new QSkeletonLoaderPrivate, parent)
124{
125 setSource(source);
126}
127
128/*! \internal */
129QSkeletonLoader::QSkeletonLoader(QSkeletonLoaderPrivate &dd, Qt3DCore::QNode *parent)
130 : QAbstractSkeleton(dd, parent)
131{
132}
133
134/*! \internal */
135QSkeletonLoader::~QSkeletonLoader()
136{
137}
138
139/*!
140 \property Qt3DCore::QSkeletonLoader::source
141
142 Holds the source url from which to load the skeleton.
143*/
144QUrl QSkeletonLoader::source() const
145{
146 Q_D(const QSkeletonLoader);
147 return d->m_source;
148}
149
150/*!
151 \property Qt3DCore::QSkeletonLoader::status
152
153 Holds the current status of skeleton loading.
154*/
155QSkeletonLoader::Status QSkeletonLoader::status() const
156{
157 Q_D(const QSkeletonLoader);
158 return d->m_status;
159}
160
161/*!
162 Returns a boolean indicating whether CreateJoints
163 is enabled or not.
164 The default value is \c false.
165*/
166bool QSkeletonLoader::isCreateJointsEnabled() const
167{
168 Q_D(const QSkeletonLoader);
169 return d->m_createJoints;
170}
171/*!
172 Returns the root joint of the hierarchy of joints forming the skeleton.
173*/
174Qt3DCore::QJoint *QSkeletonLoader::rootJoint() const
175{
176 Q_D(const QSkeletonLoader);
177 return d->m_rootJoint;
178}
179
180void QSkeletonLoader::setSource(const QUrl &source)
181{
182 Q_D(QSkeletonLoader);
183 if (d->m_source == source)
184 return;
185
186 d->m_source = source;
187 emit sourceChanged(source);
188}
189
190void QSkeletonLoader::setCreateJointsEnabled(bool createJoints)
191{
192 Q_D(QSkeletonLoader);
193 if (d->m_createJoints == createJoints)
194 return;
195
196 d->m_createJoints = createJoints;
197 emit createJointsEnabledChanged(createJointsEnabled: createJoints);
198}
199
200void QSkeletonLoader::setRootJoint(QJoint *rootJoint)
201{
202 Q_D(QSkeletonLoader);
203 d->setRootJoint(rootJoint);
204}
205
206} // namespace Qt3DCore
207
208QT_END_NAMESPACE
209
210#include "moc_qskeletonloader.cpp"
211

source code of qt3d/src/core/transforms/qskeletonloader.cpp