diff --git a/libraries/model-baker/CMakeLists.txt b/libraries/model-baker/CMakeLists.txt index 1e67d04bc1..22c240b487 100644 --- a/libraries/model-baker/CMakeLists.txt +++ b/libraries/model-baker/CMakeLists.txt @@ -2,4 +2,6 @@ set(TARGET_NAME model-baker) setup_hifi_library() link_hifi_libraries(shared shaders task gpu graphics hfm material-networking) -include_hifi_library_headers(networking) \ No newline at end of file +include_hifi_library_headers(networking) +include_hifi_library_headers(image) +include_hifi_library_headers(ktx) \ No newline at end of file diff --git a/libraries/model-networking/CMakeLists.txt b/libraries/model-networking/CMakeLists.txt index 7701f54d43..e79d18f779 100644 --- a/libraries/model-networking/CMakeLists.txt +++ b/libraries/model-networking/CMakeLists.txt @@ -3,3 +3,6 @@ setup_hifi_library() link_hifi_libraries(shared shaders networking graphics fbx material-networking model-baker) include_hifi_library_headers(hfm) include_hifi_library_headers(task) +include_hifi_library_headers(gpu) +include_hifi_library_headers(image) +include_hifi_library_headers(ktx) \ No newline at end of file diff --git a/libraries/networking/src/ResourceCache.h b/libraries/networking/src/ResourceCache.h index 4693bc0613..be514f48f0 100644 --- a/libraries/networking/src/ResourceCache.h +++ b/libraries/networking/src/ResourceCache.h @@ -365,7 +365,7 @@ public: virtual ~Resource(); virtual QString getType() const { return "Resource"; } - + /// Returns the key last used to identify this resource in the unused map. int getLRUKey() const { return _lruKey; } @@ -374,13 +374,13 @@ public: /// Sets the load priority for one owner. virtual void setLoadPriority(const QPointer& owner, float priority); - + /// Sets a set of priorities at once. virtual void setLoadPriorities(const QHash, float>& priorities); - + /// Clears the load priority for one owner. virtual void clearLoadPriority(const QPointer& owner); - + /// Returns the highest load priority across all owners. float getLoadPriority(); diff --git a/libraries/render-utils/src/CauterizedModel.cpp b/libraries/render-utils/src/CauterizedModel.cpp index d4baddadee..4df933c972 100644 --- a/libraries/render-utils/src/CauterizedModel.cpp +++ b/libraries/render-utils/src/CauterizedModel.cpp @@ -64,6 +64,7 @@ void CauterizedModel::createRenderItemSet() { _modelMeshRenderItems.clear(); _modelMeshMaterialNames.clear(); _modelMeshRenderItemShapes.clear(); + _priorityMap.clear(); Transform transform; transform.setTranslation(_translation); diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index f278c5e2e9..7acdd10a8c 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -1434,6 +1434,7 @@ void Model::createRenderItemSet() { _modelMeshRenderItems.clear(); _modelMeshMaterialNames.clear(); _modelMeshRenderItemShapes.clear(); + _priorityMap.clear(); Transform transform; transform.setTranslation(_translation); @@ -1525,30 +1526,30 @@ void Model::applyMaterialMapping() { PrimitiveMode primitiveMode = getPrimitiveMode(); bool useDualQuaternionSkinning = _useDualQuaternionSkinning; - render::Transaction transaction; - std::unordered_map priorityMap; auto& materialMapping = getMaterialMapping(); - qDebug() << "boop" << materialMapping.size(); for (auto& mapping : materialMapping) { std::set shapeIDs = getMeshIDsFromMaterialID(QString(mapping.first.c_str())); - - qDebug() << "boop2" << mapping.first.c_str() << shapeIDs.size(); - if (shapeIDs.size() == 0) { + auto networkMaterialResource = mapping.second; + if (!networkMaterialResource || shapeIDs.size() == 0) { continue; } - auto networkMaterialResource = mapping.second; - qDebug() << (bool)networkMaterialResource; - if (networkMaterialResource && networkMaterialResource->isLoaded() && networkMaterialResource->parsedMaterials.names.size() > 0) { + auto materialLoaded = [this, networkMaterialResource, shapeIDs, renderItemsKey, primitiveMode, useDualQuaternionSkinning]() { + qDebug() << "boop2" << networkMaterialResource->isFailed() << networkMaterialResource->parsedMaterials.names.size(); + if (networkMaterialResource->isFailed() || networkMaterialResource->parsedMaterials.names.size() > 0) { + return; + } + render::Transaction transaction; auto networkMaterial = networkMaterialResource->parsedMaterials.networkMaterials[networkMaterialResource->parsedMaterials.names[0]]; for (auto shapeID : shapeIDs) { + qDebug() << "boop3" << shapeID << _modelMeshRenderItemIDs.size(); if (shapeID < _modelMeshRenderItemIDs.size()) { 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, ++_priorityMap[shapeID]); transaction.updateItem(itemID, [material, renderItemsKey, - invalidatePayloadShapeKey, primitiveMode, useDualQuaternionSkinning](ModelMeshPartPayload& data) { + invalidatePayloadShapeKey, primitiveMode, useDualQuaternionSkinning](ModelMeshPartPayload& data) { data.addMaterial(material); // if the material changed, we might need to update our item key or shape key data.updateKey(renderItemsKey); @@ -1556,9 +1557,15 @@ void Model::applyMaterialMapping() { }); } } + AbstractViewStateInterface::instance()->getMain3DScene()->enqueueTransaction(transaction); + }; + qDebug() << "boop" << networkMaterialResource->isLoaded(); + if (networkMaterialResource->isLoaded()) { + materialLoaded(); + } else { + connect(networkMaterialResource.data(), &Resource::finished, materialLoaded); } } - AbstractViewStateInterface::instance()->getMain3DScene()->enqueueTransaction(transaction); } void Model::addMaterial(graphics::MaterialLayer material, const std::string& parentMaterialName) { diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index c484a82705..c4d1feaa1b 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -374,6 +374,7 @@ signals: protected: + std::unordered_map _priorityMap; // only used for materialMapping void applyMaterialMapping(); void setBlendshapeCoefficients(const QVector& coefficients) { _blendshapeCoefficients = coefficients; }