1/****************************************************************************
2**
3** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB).
4** Contact: http://www.qt-project.org/legal
5**
6** This file is part of the Qt3D module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL3$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see http://www.qt.io/terms-conditions. For further
15** information use the contact form at http://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPLv3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or later as published by the Free
28** Software Foundation and appearing in the file LICENSE.GPL included in
29** the packaging of this file. Please review the following information to
30** ensure the GNU General Public License version 2.0 requirements will be
31** met: http://www.gnu.org/licenses/gpl-2.0.html.
32**
33** $QT_END_LICENSE$
34**
35****************************************************************************/
36
37#ifndef QT3DRENDER_RENDER_GLTFSKELETONLOADER_P_H
38#define QT3DRENDER_RENDER_GLTFSKELETONLOADER_P_H
39
40//
41// W A R N I N G
42// -------------
43//
44// This file is not part of the Qt API. It exists for the convenience
45// of other Qt classes. This header file may change from version to
46// version without notice, or even be removed.
47//
48// We mean it.
49//
50
51#include <QtGlobal>
52#include <Qt3DRender/qattribute.h>
53
54#include <QtGui/qmatrix4x4.h>
55#include <QtCore/qjsondocument.h>
56
57#include <Qt3DRender/private/skeletondata_p.h>
58#include <Qt3DCore/private/sqt_p.h>
59
60QT_BEGIN_NAMESPACE
61
62class QJsonObject;
63
64namespace Qt3DRender {
65namespace Render {
66
67class GLTFSkeletonLoader
68{
69 class BufferData
70 {
71 public:
72 BufferData();
73 explicit BufferData(const QJsonObject &json);
74
75 quint64 byteLength;
76 QString path;
77 QByteArray data;
78 };
79
80 class BufferView
81 {
82 public:
83 BufferView();
84 explicit BufferView(const QJsonObject &json);
85
86 int bufferIndex;
87 quint64 byteOffset;
88 quint64 byteLength;
89 int target; // Only for per vertex attributes
90 };
91
92 class AccessorData
93 {
94 public:
95 AccessorData();
96 explicit AccessorData(const QJsonObject &json);
97
98 int bufferViewIndex;
99 QAttribute::VertexBaseType type;
100 uint dataSize;
101 int count;
102 int byteOffset;
103 int byteStride; // Only for per vertex attributes
104
105 // TODO: Extend to support sparse accessors
106 };
107
108 class Skin
109 {
110 public:
111 Skin();
112 explicit Skin(const QJsonObject &json);
113
114 QString name;
115 int inverseBindAccessorIndex;
116 QVector<int> jointNodeIndices;
117 };
118
119 class Node
120 {
121 public:
122 Node();
123 explicit Node(const QJsonObject &json);
124
125 Qt3DCore::Sqt localTransform;
126 QVector<int> childNodeIndices;
127 QString name;
128 int parentNodeIndex;
129 int cameraIndex;
130 int meshIndex;
131 int skinIndex;
132 };
133
134public:
135 GLTFSkeletonLoader();
136
137 bool load(QIODevice *ioDev);
138
139 SkeletonData createSkeleton(const QString &skeletonName);
140
141private:
142 static QAttribute::VertexBaseType accessorTypeFromJSON(int componentType);
143 static uint accessorTypeSize(QAttribute::VertexBaseType componentType);
144 static uint accessorDataSizeFromJson(const QString &type);
145
146 struct RawData
147 {
148 const char *data;
149 quint64 byteLength;
150 };
151
152 void setBasePath(const QString &path);
153 bool setJSON(const QJsonDocument &json);
154
155 bool parse();
156 bool parseGLTF2();
157 void cleanup();
158
159 bool processJSONBuffer(const QJsonObject &json);
160 bool processJSONBufferView(const QJsonObject &json);
161 bool processJSONAccessor(const QJsonObject &json);
162 bool processJSONSkin(const QJsonObject &json);
163 bool processJSONNode(const QJsonObject &json);
164 void setupNodeParentLinks();
165 QByteArray resolveLocalData(const QString &path) const;
166
167 SkeletonData createSkeletonFromSkin(Skin *skin) const;
168 QMatrix4x4 inverseBindMatrix(Skin *skin, int jointIndex) const;
169 RawData accessorData(int accessorIndex, int index) const;
170
171 QJsonDocument m_json;
172 QString m_basePath;
173 QVector<BufferData> m_bufferDatas;
174 QVector<BufferView> m_bufferViews;
175 QVector<AccessorData> m_accessors;
176 QVector<Skin> m_skins;
177 QVector<Node> m_nodes;
178};
179
180} // namespace Render
181} // namespace Qt3DRender
182
183QT_END_NAMESPACE
184
185#endif // QT3DRENDER_RENDER_GLTFSKELETONLOADER_P_H
186

source code of qt3d/src/render/geometry/gltfskeletonloader_p.h