From 770b86360499089e54139de14e6055c2a831047d Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Tue, 2 Apr 2019 19:04:23 -0700 Subject: [PATCH] fixing embedded textures and materialMapping priority --- libraries/baking/src/MaterialBaker.cpp | 39 ++++++++++++++------------ libraries/baking/src/MaterialBaker.h | 2 +- libraries/baking/src/ModelBaker.cpp | 2 +- libraries/render-utils/src/Model.cpp | 10 +++++-- 4 files changed, 31 insertions(+), 22 deletions(-) diff --git a/libraries/baking/src/MaterialBaker.cpp b/libraries/baking/src/MaterialBaker.cpp index d4e6d0382a..484fd8cace 100644 --- a/libraries/baking/src/MaterialBaker.cpp +++ b/libraries/baking/src/MaterialBaker.cpp @@ -107,31 +107,35 @@ void MaterialBaker::processMaterial() { auto mapChannel = texturePair.first; auto textureMap = texturePair.second; if (textureMap.texture && textureMap.texture->_textureSource) { - auto textureSource = textureMap.texture->_textureSource; auto type = textureMap.texture->getTextureType(); - QUrl url = textureSource->getUrl(); - QString cleanURL = url.adjusted(QUrl::RemoveQuery | QUrl::RemoveFragment).toDisplayString(); + QByteArray content; + QUrl textureURL; + { + bool foundEmbeddedTexture = false; + auto textureContentMapIter = _textureContentMap.find(networkMaterial.second->getName()); + if (textureContentMapIter != _textureContentMap.end()) { + auto textureUsageIter = textureContentMapIter->second.find(type); + if (textureUsageIter != textureContentMapIter->second.end()) { + content = textureUsageIter->second.first; + textureURL = textureUsageIter->second.second; + foundEmbeddedTexture = true; + } + } + if (!foundEmbeddedTexture && textureMap.texture->_textureSource) { + textureURL = textureMap.texture->_textureSource->getUrl().adjusted(QUrl::RemoveQuery | QUrl::RemoveFragment); + } + } + + QString cleanURL = textureURL.toDisplayString(); auto idx = cleanURL.lastIndexOf('.'); - auto extension = idx >= 0 ? url.toDisplayString().mid(idx + 1).toLower() : ""; + QString extension = idx >= 0 ? cleanURL.mid(idx + 1).toLower() : ""; if (QImageReader::supportedImageFormats().contains(extension.toLatin1())) { - QUrl textureURL = url.adjusted(QUrl::RemoveQuery | QUrl::RemoveFragment); - QPair textureKey(textureURL, type); if (!_textureBakers.contains(textureKey)) { auto baseTextureFileName = _textureFileNamer.createBaseTextureFileName(textureURL.fileName(), type); - QByteArray content; - { - auto textureContentMapIter = _textureContentMap.find(networkMaterial.second->getName()); - if (textureContentMapIter != _textureContentMap.end()) { - auto textureUsageIter = textureContentMapIter->second.find(type); - if (textureUsageIter != textureContentMapIter->second.end()) { - content = textureUsageIter->second; - } - } - } QSharedPointer textureBaker { new TextureBaker(textureURL, type, _textureOutputDir, "", baseTextureFileName, content), &TextureBaker::deleteLater @@ -238,11 +242,10 @@ void MaterialBaker::outputMaterial() { } void MaterialBaker::addTexture(const QString& materialName, image::TextureUsage::Type textureUsage, const hfm::Texture& texture) { - std::string name = materialName.toStdString(); auto& textureUsageMap = _textureContentMap[materialName.toStdString()]; if (textureUsageMap.find(textureUsage) == textureUsageMap.end()) { // Content may be empty, unless the data is inlined - textureUsageMap[textureUsage] = texture.content; + textureUsageMap[textureUsage] = { texture.content, texture.filename }; } }; diff --git a/libraries/baking/src/MaterialBaker.h b/libraries/baking/src/MaterialBaker.h index d696c315b0..d0ea33268e 100644 --- a/libraries/baking/src/MaterialBaker.h +++ b/libraries/baking/src/MaterialBaker.h @@ -66,7 +66,7 @@ private: TextureFileNamer _textureFileNamer; void addTexture(const QString& materialName, image::TextureUsage::Type textureUsage, const hfm::Texture& texture); - std::unordered_map> _textureContentMap; + std::unordered_map>> _textureContentMap; }; #endif // !hifi_MaterialBaker_h diff --git a/libraries/baking/src/ModelBaker.cpp b/libraries/baking/src/ModelBaker.cpp index 02f301d358..e92e4afe84 100644 --- a/libraries/baking/src/ModelBaker.cpp +++ b/libraries/baking/src/ModelBaker.cpp @@ -277,7 +277,7 @@ void ModelBaker::handleFinishedMaterialBaker() { // this MaterialBaker is done and everything went according to plan qCDebug(model_baking) << "Adding baked material to FST mapping " << baker->getBakedMaterialData(); - QString relativeBakedMaterialURL = "/" + _modelURL.fileName(); + QString relativeBakedMaterialURL = _modelURL.fileName(); auto baseName = relativeBakedMaterialURL.left(relativeBakedMaterialURL.lastIndexOf('.')); relativeBakedMaterialURL = baseName + BAKED_MATERIAL_EXTENSION; diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 865f8dba08..5e9c12bf18 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -1550,7 +1550,13 @@ void Model::applyMaterialMapping() { continue; } - auto materialLoaded = [this, networkMaterialResource, shapeIDs, renderItemsKey, primitiveMode, useDualQuaternionSkinning]() { + // This needs to be precomputed before the lambda, since the lambdas could be called out of order + std::unordered_map priorityMapPerResource; + for (auto shapeID : shapeIDs) { + priorityMapPerResource[shapeID] = ++_priorityMap[shapeID]; + } + + auto materialLoaded = [this, networkMaterialResource, shapeIDs, priorityMapPerResource, renderItemsKey, primitiveMode, useDualQuaternionSkinning]() { if (networkMaterialResource->isFailed() || networkMaterialResource->parsedMaterials.names.size() == 0) { return; } @@ -1577,7 +1583,7 @@ void Model::applyMaterialMapping() { auto itemID = _modelMeshRenderItemIDs[shapeID]; auto meshIndex = _modelMeshRenderItemShapes[shapeID].meshIndex; bool invalidatePayloadShapeKey = shouldInvalidatePayloadShapeKey(meshIndex); - graphics::MaterialLayer material = graphics::MaterialLayer(networkMaterial, ++_priorityMap[shapeID]); + graphics::MaterialLayer material = graphics::MaterialLayer(networkMaterial, priorityMapPerResource.at(shapeID)); _materialMapping[shapeID].push_back(material); transaction.updateItem(itemID, [material, renderItemsKey, invalidatePayloadShapeKey, primitiveMode, useDualQuaternionSkinning](ModelMeshPartPayload& data) {