From 74015a1a5ed961aa8d5e84472bf36a8c436afde7 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Fri, 30 Nov 2018 11:19:27 -0800 Subject: [PATCH] Implement hfm::Format/hfm::Factory for model serializers --- libraries/fbx/src/FBXSerializer.cpp | 16 ++++++++++++++++ libraries/fbx/src/FBXSerializer.h | 13 +++++++++++++ libraries/fbx/src/GLTFSerializer.cpp | 16 ++++++++++++++++ libraries/fbx/src/GLTFSerializer.h | 12 ++++++++++++ libraries/fbx/src/OBJSerializer.cpp | 14 ++++++++++++++ libraries/fbx/src/OBJSerializer.h | 12 ++++++++++++ 6 files changed, 83 insertions(+) diff --git a/libraries/fbx/src/FBXSerializer.cpp b/libraries/fbx/src/FBXSerializer.cpp index a9887cde15..dc39143f6b 100644 --- a/libraries/fbx/src/FBXSerializer.cpp +++ b/libraries/fbx/src/FBXSerializer.cpp @@ -1833,6 +1833,22 @@ HFMModel* FBXSerializer::extractHFMModel(const QVariantHash& mapping, const QStr return hfmModelPtr; } +void FBXFormat::registerFormat(hfm::FormatRegistry& registry) { + MIMEType mimeType("fbx"); + mimeType.extensions.push_back("fbx"); + mimeType.fileSignatures.emplace_back("Kaydara FBX Binary \x00", 0); + mimeTypeID = registry.registerMIMEType(mimeType, std::make_shared()); +} + +void FBXFormat::unregisterFormat(hfm::FormatRegistry& registry) { + registry.unregisterMIMEType(mimeTypeID); + mimeTypeID = hfm::FormatRegistry::INVALID_MIME_TYPE_ID; +} + +std::shared_ptr FBXSerializer::Factory::get() { + return std::make_shared(); +} + HFMModel::Pointer FBXSerializer::read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url) { QBuffer buffer(const_cast(&data)); buffer.open(QIODevice::ReadOnly); diff --git a/libraries/fbx/src/FBXSerializer.h b/libraries/fbx/src/FBXSerializer.h index c69f75cc5c..231fc5316c 100644 --- a/libraries/fbx/src/FBXSerializer.h +++ b/libraries/fbx/src/FBXSerializer.h @@ -28,6 +28,7 @@ #include "FBX.h" #include +#include #include #include @@ -94,8 +95,20 @@ public: class ExtractedMesh; +class FBXFormat : public hfm::Format { +public: + virtual void registerFormat(hfm::FormatRegistry& registry) override; + virtual void unregisterFormat(hfm::FormatRegistry& registry) override; +protected: + hfm::FormatRegistry::MIMETypeID mimeTypeID { hfm::FormatRegistry::INVALID_MIME_TYPE_ID }; +}; + class FBXSerializer : public HFMSerializer { public: + class Factory : public HFMSerializer::Factory { + std::shared_ptr get() override; + }; + HFMModel* _hfmModel; /// Reads HFMModel from the supplied model and mapping data. /// \exception QString if an error occurs in parsing diff --git a/libraries/fbx/src/GLTFSerializer.cpp b/libraries/fbx/src/GLTFSerializer.cpp index 28d377c605..801adf6bc5 100644 --- a/libraries/fbx/src/GLTFSerializer.cpp +++ b/libraries/fbx/src/GLTFSerializer.cpp @@ -910,6 +910,22 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const QUrl& url) { return true; } +void GLTFFormat::registerFormat(hfm::FormatRegistry& registry) { + MIMEType mimeType("gltf"); + mimeType.extensions.push_back("gltf"); + mimeType.webMediaTypes.push_back("model/gltf+json"); + mimeTypeID = registry.registerMIMEType(mimeType, std::make_shared()); +} + +void GLTFFormat::unregisterFormat(hfm::FormatRegistry& registry) { + registry.unregisterMIMEType(mimeTypeID); + mimeTypeID = hfm::FormatRegistry::INVALID_MIME_TYPE_ID; +} + +std::shared_ptr GLTFSerializer::Factory::get() { + return std::make_shared(); +} + HFMModel::Pointer GLTFSerializer::read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url) { _url = url; diff --git a/libraries/fbx/src/GLTFSerializer.h b/libraries/fbx/src/GLTFSerializer.h index 1ec1183e36..154ba08e9d 100644 --- a/libraries/fbx/src/GLTFSerializer.h +++ b/libraries/fbx/src/GLTFSerializer.h @@ -16,6 +16,7 @@ #include #include #include +#include #include "FBXSerializer.h" @@ -700,9 +701,20 @@ struct GLTFFile { } }; +class GLTFFormat : public hfm::Format { +public: + virtual void registerFormat(hfm::FormatRegistry& registry) override; + virtual void unregisterFormat(hfm::FormatRegistry& registry) override; +protected: + hfm::FormatRegistry::MIMETypeID mimeTypeID; +}; + class GLTFSerializer : public QObject, public HFMSerializer { Q_OBJECT public: + class Factory : public HFMSerializer::Factory { + std::shared_ptr get() override; + }; GLTFSerializer(); HFMModel::Pointer read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url = QUrl()) override; private: diff --git a/libraries/fbx/src/OBJSerializer.cpp b/libraries/fbx/src/OBJSerializer.cpp index af8dfb5562..ae279bf0a7 100644 --- a/libraries/fbx/src/OBJSerializer.cpp +++ b/libraries/fbx/src/OBJSerializer.cpp @@ -651,6 +651,20 @@ done: return result; } +void OBJFormat::registerFormat(hfm::FormatRegistry& registry) { + MIMEType mimeType("obj"); + mimeType.extensions.push_back("obj"); + mimeTypeID = registry.registerMIMEType(mimeType, std::make_shared()); +} + +void OBJFormat::unregisterFormat(hfm::FormatRegistry& registry) { + registry.unregisterMIMEType(mimeTypeID); + mimeTypeID = hfm::FormatRegistry::INVALID_MIME_TYPE_ID; +} + +std::shared_ptr OBJSerializer::Factory::get() { + return std::make_shared(); +} HFMModel::Pointer OBJSerializer::read(const QByteArray& data, const QVariantHash& mapping, const QUrl& url) { PROFILE_RANGE_EX(resource_parse, __FUNCTION__, 0xffff0000, nullptr); diff --git a/libraries/fbx/src/OBJSerializer.h b/libraries/fbx/src/OBJSerializer.h index a6fe3817ca..0a3f4c93ac 100644 --- a/libraries/fbx/src/OBJSerializer.h +++ b/libraries/fbx/src/OBJSerializer.h @@ -14,6 +14,7 @@ #include #include +#include #include "FBXSerializer.h" class OBJTokenizer { @@ -89,9 +90,20 @@ public: OBJMaterial() : shininess(0.0f), opacity(1.0f), diffuseColor(0.9f), specularColor(0.9f), emissiveColor(0.0f), illuminationModel(-1) {} }; +class OBJFormat : public hfm::Format { +public: + virtual void registerFormat(hfm::FormatRegistry& registry) override; + virtual void unregisterFormat(hfm::FormatRegistry& registry) override; +protected: + hfm::FormatRegistry::MIMETypeID mimeTypeID; +}; + class OBJSerializer: public QObject, public HFMSerializer { // QObject so we can make network requests. Q_OBJECT public: + class Factory : public HFMSerializer::Factory { + std::shared_ptr get() override; + }; typedef QVector FaceGroup; QVector vertices; QVector vertexColors;