From 6aede024f40a23eada9ea5e2a07a613f84b3f7e4 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Thu, 28 Feb 2019 23:22:55 +0100 Subject: [PATCH] use fst mapping path as reference instead of model path --- .../model-baker/src/model-baker/Baker.cpp | 7 ++-- libraries/model-baker/src/model-baker/Baker.h | 3 +- .../model-baker/src/model-baker/BakerTypes.h | 2 ++ .../model-baker/ParseMaterialMappingTask.cpp | 4 +-- .../model-baker/ParseMaterialMappingTask.h | 3 +- .../src/model-baker/PrepareJointsTask.cpp | 4 +-- .../src/model-baker/PrepareJointsTask.h | 3 +- .../src/model-networking/ModelCache.cpp | 34 ++++++++++--------- .../src/model-networking/ModelCache.h | 9 +++-- 9 files changed, 40 insertions(+), 29 deletions(-) diff --git a/libraries/model-baker/src/model-baker/Baker.cpp b/libraries/model-baker/src/model-baker/Baker.cpp index f47a9dcd62..c0c473315d 100644 --- a/libraries/model-baker/src/model-baker/Baker.cpp +++ b/libraries/model-baker/src/model-baker/Baker.cpp @@ -117,7 +117,7 @@ namespace baker { class BakerEngineBuilder { public: - using Input = VaryingSet2; + using Input = VaryingSet2; using Output = VaryingSet2; using JobModel = Task::ModelIO; void build(JobModel& model, const Varying& input, Varying& output) { @@ -155,8 +155,7 @@ namespace baker { const auto jointIndices = jointInfoOut.getN(2); // Parse material mapping - const auto parseMaterialMappingInputs = ParseMaterialMappingTask::Input(url, mapping).asVarying(); - const auto materialMapping = model.addJob("ParseMaterialMapping", parseMaterialMappingInputs); + const auto materialMapping = model.addJob("ParseMaterialMapping", mapping); // Combine the outputs into a new hfm::Model const auto buildBlendshapesInputs = BuildBlendshapesTask::Input(blendshapesPerMeshIn, normalsPerBlendshapePerMesh, tangentsPerBlendshapePerMesh).asVarying(); @@ -170,7 +169,7 @@ namespace baker { } }; - Baker::Baker(const hfm::Model::Pointer& hfmModel, const QVariantHash& mapping) : + Baker::Baker(const hfm::Model::Pointer& hfmModel, const GeometryMappingPair& mapping) : _engine(std::make_shared(BakerEngineBuilder::JobModel::create("Baker"), std::make_shared())) { _engine->feedInput(0, hfmModel); _engine->feedInput(1, mapping); diff --git a/libraries/model-baker/src/model-baker/Baker.h b/libraries/model-baker/src/model-baker/Baker.h index 542be0b559..856b5f0142 100644 --- a/libraries/model-baker/src/model-baker/Baker.h +++ b/libraries/model-baker/src/model-baker/Baker.h @@ -17,13 +17,14 @@ #include #include "Engine.h" +#include "BakerTypes.h" #include "ParseMaterialMappingTask.h" namespace baker { class Baker { public: - Baker(const hfm::Model::Pointer& hfmModel, const QVariantHash& mapping); + Baker(const hfm::Model::Pointer& hfmModel, const GeometryMappingPair& mapping); void run(); diff --git a/libraries/model-baker/src/model-baker/BakerTypes.h b/libraries/model-baker/src/model-baker/BakerTypes.h index 5d14ee5420..8b80b0bde4 100644 --- a/libraries/model-baker/src/model-baker/BakerTypes.h +++ b/libraries/model-baker/src/model-baker/BakerTypes.h @@ -12,6 +12,7 @@ #ifndef hifi_BakerTypes_h #define hifi_BakerTypes_h +#include #include namespace baker { @@ -35,6 +36,7 @@ namespace baker { using TangentsPerBlendshape = std::vector>; using MeshIndicesToModelNames = QHash; + using GeometryMappingPair = std::pair; }; #endif // hifi_BakerTypes_h diff --git a/libraries/model-baker/src/model-baker/ParseMaterialMappingTask.cpp b/libraries/model-baker/src/model-baker/ParseMaterialMappingTask.cpp index f8634e4170..0a1964d8cd 100644 --- a/libraries/model-baker/src/model-baker/ParseMaterialMappingTask.cpp +++ b/libraries/model-baker/src/model-baker/ParseMaterialMappingTask.cpp @@ -11,8 +11,8 @@ #include "ModelBakerLogging.h" void ParseMaterialMappingTask::run(const baker::BakeContextPointer& context, const Input& input, Output& output) { - const auto& url = input.get0(); - const auto& mapping = input.get1(); + const auto& url = input.first; + const auto& mapping = input.second; MaterialMapping materialMapping; auto mappingIter = mapping.find("materialMap"); diff --git a/libraries/model-baker/src/model-baker/ParseMaterialMappingTask.h b/libraries/model-baker/src/model-baker/ParseMaterialMappingTask.h index 8ad98edeb9..5f5eff327d 100644 --- a/libraries/model-baker/src/model-baker/ParseMaterialMappingTask.h +++ b/libraries/model-baker/src/model-baker/ParseMaterialMappingTask.h @@ -14,12 +14,13 @@ #include #include "Engine.h" +#include "BakerTypes.h" #include class ParseMaterialMappingTask { public: - using Input = baker::VaryingSet2 ; + using Input = baker::GeometryMappingPair; using Output = MaterialMapping; using JobModel = baker::Job::ModelIO; diff --git a/libraries/model-baker/src/model-baker/PrepareJointsTask.cpp b/libraries/model-baker/src/model-baker/PrepareJointsTask.cpp index 3b1a57cb43..a896766058 100644 --- a/libraries/model-baker/src/model-baker/PrepareJointsTask.cpp +++ b/libraries/model-baker/src/model-baker/PrepareJointsTask.cpp @@ -58,7 +58,7 @@ void PrepareJointsTask::run(const baker::BakeContextPointer& context, const Inpu auto& jointIndices = output.edit2(); // Get joint renames - auto jointNameMapping = getJointNameMapping(mapping); + auto jointNameMapping = getJointNameMapping(mapping.second); // Apply joint metadata from FST file mappings for (const auto& jointIn : jointsIn) { jointsOut.push_back(jointIn); @@ -73,7 +73,7 @@ void PrepareJointsTask::run(const baker::BakeContextPointer& context, const Inpu } // Get joint rotation offsets from FST file mappings - auto offsets = getJointRotationOffsets(mapping); + auto offsets = getJointRotationOffsets(mapping.second); for (auto itr = offsets.begin(); itr != offsets.end(); itr++) { QString jointName = itr.key(); int jointIndex = jointIndices.value(jointName) - 1; diff --git a/libraries/model-baker/src/model-baker/PrepareJointsTask.h b/libraries/model-baker/src/model-baker/PrepareJointsTask.h index e12d8ffd2c..b18acdfceb 100644 --- a/libraries/model-baker/src/model-baker/PrepareJointsTask.h +++ b/libraries/model-baker/src/model-baker/PrepareJointsTask.h @@ -17,10 +17,11 @@ #include #include "Engine.h" +#include "BakerTypes.h" class PrepareJointsTask { public: - using Input = baker::VaryingSet2, QVariantHash /*mapping*/>; + using Input = baker::VaryingSet2, baker::GeometryMappingPair /*mapping*/>; using Output = baker::VaryingSet3, QMap /*jointRotationOffsets*/, QHash /*jointIndices*/>; using JobModel = baker::Job::ModelIO; diff --git a/libraries/model-networking/src/model-networking/ModelCache.cpp b/libraries/model-networking/src/model-networking/ModelCache.cpp index 581196b2cc..8852e2a262 100644 --- a/libraries/model-networking/src/model-networking/ModelCache.cpp +++ b/libraries/model-networking/src/model-networking/ModelCache.cpp @@ -35,11 +35,13 @@ class GeometryReader; class GeometryExtra { public: - const QVariantHash& mapping; + const GeometryMappingPair& mapping; const QUrl& textureBaseUrl; bool combineParts; }; +int geometryMappingPairTypeId = qRegisterMetaType("GeometryMappingPair"); + // From: https://stackoverflow.com/questions/41145012/how-to-hash-qvariant class QVariantHasher { public: @@ -78,7 +80,7 @@ namespace std { struct hash { size_t operator()(const GeometryExtra& geometryExtra) const { size_t result = 0; - hash_combine(result, geometryExtra.mapping, geometryExtra.textureBaseUrl, geometryExtra.combineParts); + hash_combine(result, geometryExtra.mapping.second, geometryExtra.textureBaseUrl, geometryExtra.combineParts); return result; } }; @@ -151,7 +153,7 @@ void GeometryMappingResource::downloadFinished(const QByteArray& data) { } auto modelCache = DependencyManager::get(); - GeometryExtra extra { _mapping, _textureBaseUrl, false }; + GeometryExtra extra { GeometryMappingPair(_url, _mapping), _textureBaseUrl, false }; // Get the raw GeometryResource _geometryResource = modelCache->getResource(url, QUrl(), &extra, std::hash()(extra)).staticCast(); @@ -191,7 +193,7 @@ void GeometryMappingResource::onGeometryMappingLoaded(bool success) { class GeometryReader : public QRunnable { public: - GeometryReader(const ModelLoader& modelLoader, QWeakPointer& resource, const QUrl& url, const QVariantHash& mapping, + GeometryReader(const ModelLoader& modelLoader, QWeakPointer& resource, const QUrl& url, const GeometryMappingPair& mapping, const QByteArray& data, bool combineParts, const QString& webMediaType) : _modelLoader(modelLoader), _resource(resource), _url(url), _mapping(mapping), _data(data), _combineParts(combineParts), _webMediaType(webMediaType) { @@ -204,7 +206,7 @@ private: ModelLoader _modelLoader; QWeakPointer _resource; QUrl _url; - QVariantHash _mapping; + GeometryMappingPair _mapping; QByteArray _data; bool _combineParts; QString _webMediaType; @@ -244,7 +246,7 @@ void GeometryReader::run() { } HFMModel::Pointer hfmModel; - QVariantHash serializerMapping = _mapping; + QVariantHash serializerMapping = _mapping.second; serializerMapping["combineParts"] = _combineParts; if (_url.path().toLower().endsWith(".gz")) { @@ -270,15 +272,14 @@ void GeometryReader::run() { } // Add scripts to hfmModel - if (!_mapping.value(SCRIPT_FIELD).isNull()) { - QVariantList scripts = _mapping.values(SCRIPT_FIELD); + if (!serializerMapping.value(SCRIPT_FIELD).isNull()) { + QVariantList scripts = serializerMapping.values(SCRIPT_FIELD); for (auto &script : scripts) { hfmModel->scripts.push_back(script.toString()); } } - QMetaObject::invokeMethod(resource.data(), "setGeometryDefinition", - Q_ARG(HFMModel::Pointer, hfmModel), Q_ARG(QVariantHash, _mapping)); + Q_ARG(HFMModel::Pointer, hfmModel), Q_ARG(GeometryMappingPair, _mapping)); } catch (const std::exception&) { auto resource = _resource.toStrongRef(); if (resource) { @@ -312,17 +313,17 @@ public: void setExtra(void* extra) override; protected: - Q_INVOKABLE void setGeometryDefinition(HFMModel::Pointer hfmModel, QVariantHash mapping); + Q_INVOKABLE void setGeometryDefinition(HFMModel::Pointer hfmModel, const GeometryMappingPair& mapping); private: ModelLoader _modelLoader; - QVariantHash _mapping; + GeometryMappingPair _mapping; bool _combineParts; }; void GeometryDefinitionResource::setExtra(void* extra) { const GeometryExtra* geometryExtra = static_cast(extra); - _mapping = geometryExtra ? geometryExtra->mapping : QVariantHash(); + _mapping = geometryExtra ? geometryExtra->mapping : GeometryMappingPair(QUrl(), QVariantHash()); _textureBaseUrl = geometryExtra ? resolveTextureBaseUrl(_url, geometryExtra->textureBaseUrl) : QUrl(); _combineParts = geometryExtra ? geometryExtra->combineParts : true; } @@ -335,7 +336,7 @@ void GeometryDefinitionResource::downloadFinished(const QByteArray& data) { QThreadPool::globalInstance()->start(new GeometryReader(_modelLoader, _self, _effectiveBaseURL, _mapping, data, _combineParts, _request->getWebMediaType())); } -void GeometryDefinitionResource::setGeometryDefinition(HFMModel::Pointer hfmModel, QVariantHash mapping) { +void GeometryDefinitionResource::setGeometryDefinition(HFMModel::Pointer hfmModel, const GeometryMappingPair& mapping) { // Do processing on the model baker::Baker modelBaker(hfmModel, mapping); modelBaker.run(); @@ -398,7 +399,7 @@ QSharedPointer ModelCache::createResourceCopy(const QSharedPointer()(geometryExtra)).staticCast(); @@ -411,7 +412,8 @@ GeometryResource::Pointer ModelCache::getGeometryResource(const QUrl& url, } GeometryResource::Pointer ModelCache::getCollisionGeometryResource(const QUrl& url, - const QVariantHash& mapping, const QUrl& textureBaseUrl) { + const GeometryMappingPair& mapping, + const QUrl& textureBaseUrl) { bool combineParts = false; GeometryExtra geometryExtra = { mapping, textureBaseUrl, combineParts }; GeometryResource::Pointer resource = getResource(url, QUrl(), &geometryExtra, std::hash()(geometryExtra)).staticCast(); diff --git a/libraries/model-networking/src/model-networking/ModelCache.h b/libraries/model-networking/src/model-networking/ModelCache.h index 4cd7048dca..ca1ceaff16 100644 --- a/libraries/model-networking/src/model-networking/ModelCache.h +++ b/libraries/model-networking/src/model-networking/ModelCache.h @@ -26,6 +26,9 @@ class MeshPart; class GeometryMappingResource; +using GeometryMappingPair = std::pair; +Q_DECLARE_METATYPE(GeometryMappingPair) + class Geometry { public: using Pointer = std::shared_ptr; @@ -145,11 +148,13 @@ class ModelCache : public ResourceCache, public Dependency { public: GeometryResource::Pointer getGeometryResource(const QUrl& url, - const QVariantHash& mapping = QVariantHash(), + const GeometryMappingPair& mapping = + GeometryMappingPair(QUrl(), QVariantHash()), const QUrl& textureBaseUrl = QUrl()); GeometryResource::Pointer getCollisionGeometryResource(const QUrl& url, - const QVariantHash& mapping = QVariantHash(), + const GeometryMappingPair& mapping = + GeometryMappingPair(QUrl(), QVariantHash()), const QUrl& textureBaseUrl = QUrl()); protected: