// Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB). // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef GLTFGEOMETRYLOADER_H #define GLTFGEOMETRYLOADER_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include #include #include #include QT_BEGIN_NAMESPACE namespace Qt3DCore { class QGeometry; } namespace Qt3DRender { #define GLTFGEOMETRYLOADER_EXT QLatin1String("gltf") #define JSONGEOMETRYLOADER_EXT QLatin1String("json") #define QGLTFGEOMETRYLOADER_EXT QLatin1String("qgltf") class QCamera; class QCameraLens; class QMaterial; class QShaderProgram; class QEffect; class QAbstractTexture; class QRenderState; class QTechnique; class QParameter; class QGeometryRenderer; class GLTFGeometryLoader : public QGeometryLoaderInterface { class BufferData { public: BufferData(); explicit BufferData(const QJsonObject &json); quint64 length; QString path; QByteArray *data; // type if ever useful }; class ParameterData { public: ParameterData(); explicit ParameterData(const QJsonObject &json); QString semantic; int type; }; class AccessorData { public: AccessorData(); explicit AccessorData(const QJsonObject &json); QString bufferViewName; int bufferViewIndex; Qt3DCore::QAttribute::VertexBaseType type; uint dataSize; int count; int offset; int stride; }; struct Gltf1 { QHash m_accessorDict; QHash m_bufferDatas; QHash m_buffers; }; struct Gltf2 { QVector m_bufferDatas; QVector m_buffers; QVector m_accessors; }; Q_OBJECT public: GLTFGeometryLoader(); ~GLTFGeometryLoader(); Qt3DCore::QGeometry *geometry() const final; bool load(QIODevice *ioDev, const QString &subMesh = QString()) final; protected: void setBasePath(const QString &path); bool setJSON(const QJsonDocument &json); static QString standardAttributeNameFromSemantic(const QString &semantic); void parse(); void parseGLTF1(); void parseGLTF2(); void cleanup(); void processJSONBuffer(const QString &id, const QJsonObject &json); void processJSONBufferView(const QString &id, const QJsonObject &json); void processJSONAccessor(const QString &id, const QJsonObject &json); void processJSONMesh(const QString &id, const QJsonObject &json); void loadBufferData(); void unloadBufferData(); void processJSONBufferV2(const QJsonObject &json); void processJSONBufferViewV2(const QJsonObject &json); void processJSONAccessorV2(const QJsonObject &json); void processJSONMeshV2(const QJsonObject &json); void loadBufferDataV2(); void unloadBufferDataV2(); QByteArray resolveLocalData(const QString &path) const; static Qt3DCore::QAttribute::VertexBaseType accessorTypeFromJSON(int componentType); static uint accessorDataSizeFromJson(const QString &type); private: QJsonDocument m_json; QString m_basePath; QString m_mesh; Gltf1 m_gltf1; Gltf2 m_gltf2; Qt3DCore::QGeometry *m_geometry; }; } // namespace Qt3DRender QT_END_NAMESPACE #endif // GLTFGEOMETRYLOADER_H