From b98f47d1f3a3f9351ef2a7e9aeb72d8d3ad05bb3 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Thu, 28 Mar 2019 15:11:27 -0700 Subject: [PATCH] add baked materials to fst materialMapping --- libraries/baking/src/MaterialBaker.cpp | 8 +++++++ libraries/baking/src/MaterialBaker.h | 2 ++ libraries/baking/src/ModelBaker.cpp | 33 ++++++++++++++++++++++---- libraries/baking/src/ModelBaker.h | 1 + libraries/fbx/src/FSTReader.h | 1 + 5 files changed, 40 insertions(+), 5 deletions(-) diff --git a/libraries/baking/src/MaterialBaker.cpp b/libraries/baking/src/MaterialBaker.cpp index c35c16fc8a..fd324a4bb1 100644 --- a/libraries/baking/src/MaterialBaker.cpp +++ b/libraries/baking/src/MaterialBaker.cpp @@ -253,3 +253,11 @@ void MaterialBaker::outputMaterial() { // emit signal to indicate the material baking is finished emit finished(); } + +void MaterialBaker::setMaterials(const QHash& materials, const QString& baseURL) { + _materialResource = NetworkMaterialResourcePointer(new NetworkMaterialResource(), [](NetworkMaterialResource* ptr) { ptr->deleteLater(); }); + for (auto& material : materials) { + _materialResource->parsedMaterials.names.push_back(material.name.toStdString()); + _materialResource->parsedMaterials.networkMaterials[material.name.toStdString()] = std::make_shared(material, baseURL); + } +} \ No newline at end of file diff --git a/libraries/baking/src/MaterialBaker.h b/libraries/baking/src/MaterialBaker.h index d89f16e57e..d8526f8f8c 100644 --- a/libraries/baking/src/MaterialBaker.h +++ b/libraries/baking/src/MaterialBaker.h @@ -30,6 +30,8 @@ public: bool isURL() const { return _isURL; } QString getBakedMaterialData() const { return _bakedMaterialData; } + void setMaterials(const QHash& materials, const QString& baseURL); + static void setNextOvenWorkerThreadOperator(std::function getNextOvenWorkerThreadOperator) { _getNextOvenWorkerThreadOperator = getNextOvenWorkerThreadOperator; } public slots: diff --git a/libraries/baking/src/ModelBaker.cpp b/libraries/baking/src/ModelBaker.cpp index 66a3648579..389d177215 100644 --- a/libraries/baking/src/ModelBaker.cpp +++ b/libraries/baking/src/ModelBaker.cpp @@ -42,6 +42,8 @@ #include "baking/BakerLibrary.h" +#include + ModelBaker::ModelBaker(const QUrl& inputModelURL, const QUrl& destinationPath, const QString& bakedOutputDirectory, const QString& originalOutputDirectory, bool hasBeenBaked) : _modelURL(inputModelURL), _destinationPath(destinationPath), @@ -208,7 +210,6 @@ void ModelBaker::bakeSourceCopy() { } hifi::ByteArray modelData = modelFile.readAll(); - hfm::Model::Pointer bakedModel; std::vector dracoMeshes; std::vector> dracoMaterialLists; // Material order for per-mesh material lookup used by dracoMeshes @@ -244,23 +245,24 @@ void ModelBaker::bakeSourceCopy() { // Begin hfm baking baker.run(); - bakedModel = baker.getHFMModel(); + _hfmModel = baker.getHFMModel(); dracoMeshes = baker.getDracoMeshes(); dracoMaterialLists = baker.getDracoMaterialLists(); } // Do format-specific baking - bakeProcessedSource(bakedModel, dracoMeshes, dracoMaterialLists); + bakeProcessedSource(_hfmModel, dracoMeshes, dracoMaterialLists); if (shouldStop()) { return; } - if (bakedModel->materials.size() > 0) { + if (_hfmModel->materials.size() > 0) { _materialBaker = QSharedPointer( new MaterialBaker(_modelURL.fileName(), true, _bakedOutputDir, _destinationPath), &MaterialBaker::deleteLater ); + _materialBaker->setMaterials(_hfmModel->materials, _modelURL.toString()); connect(_materialBaker.data(), &MaterialBaker::finished, this, &ModelBaker::handleFinishedMaterialBaker); _materialBaker->bake(); } else { @@ -273,9 +275,30 @@ void ModelBaker::handleFinishedMaterialBaker() { if (baker) { if (!baker->hasErrors()) { + auto bakedMaterialURL = baker->getBakedMaterialData(); // this MaterialBaker is done and everything went according to plan - qCDebug(model_baking) << "Adding baked material to FST mapping " << baker->getBakedMaterialData(); + qCDebug(model_baking) << "Adding baked material to FST mapping " << bakedMaterialURL; + // First we add the materials in the model + QJsonArray materialMapping; + for (auto material : _hfmModel->materials) { + QJsonObject json; + json["mat::" + material.name] = bakedMaterialURL + "?" + material.name; + materialMapping.push_back(json); + } + + // The we add any existing mappings from the mapping + if (_mapping.contains(MATERIAL_MAPPING_FIELD)) { + QByteArray materialMapValue = _mapping[MATERIAL_MAPPING_FIELD].toByteArray(); + QJsonObject oldMaterialMapping = QJsonDocument::fromJson(materialMapValue).object(); + for (auto key : oldMaterialMapping.keys()) { + QJsonObject json; + json[key] = oldMaterialMapping[key]; + materialMapping.push_back(json); + } + } + + _mapping[MATERIAL_MAPPING_FIELD] = QJsonDocument(materialMapping).toJson(QJsonDocument::Compact); } else { // this material failed to bake - this doesn't fail the entire bake but we need to add the errors from // the material to our warnings diff --git a/libraries/baking/src/ModelBaker.h b/libraries/baking/src/ModelBaker.h index 89243efda2..728757b2de 100644 --- a/libraries/baking/src/ModelBaker.h +++ b/libraries/baking/src/ModelBaker.h @@ -87,6 +87,7 @@ private: bool _hasBeenBaked { false }; + hfm::Model::Pointer _hfmModel; QSharedPointer _materialBaker; }; diff --git a/libraries/fbx/src/FSTReader.h b/libraries/fbx/src/FSTReader.h index fade0fa5bc..2b13bf3078 100644 --- a/libraries/fbx/src/FSTReader.h +++ b/libraries/fbx/src/FSTReader.h @@ -32,6 +32,7 @@ static const QString JOINT_FIELD = "joint"; static const QString BLENDSHAPE_FIELD = "bs"; static const QString SCRIPT_FIELD = "script"; static const QString JOINT_NAME_MAPPING_FIELD = "jointMap"; +static const QString MATERIAL_MAPPING_FIELD = "materialMap"; class FSTReader { public: