From 50e538a73c1bcc6e98a7d0dbd9009dc237f18812 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Wed, 1 May 2019 17:05:35 -0700 Subject: [PATCH] try to fix materialMapping crash --- libraries/render-utils/src/Model.cpp | 36 +++++++++++++++++++--------- libraries/render-utils/src/Model.h | 1 + 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index e2d78a8d94..ec55601d49 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -774,11 +774,14 @@ scriptable::ScriptableModelBase Model::getScriptableModel() { auto& materialName = _modelMeshMaterialNames[shapeID]; result.appendMaterial(graphics::MaterialLayer(getGeometry()->getShapeMaterial(shapeID), 0), shapeID, materialName); - auto mappedMaterialIter = _materialMapping.find(shapeID); - if (mappedMaterialIter != _materialMapping.end()) { - auto mappedMaterials = mappedMaterialIter->second; - for (auto& mappedMaterial : mappedMaterials) { - result.appendMaterial(mappedMaterial, shapeID, materialName); + { + std::unique_lock lock(_materialMappingMutex); + auto mappedMaterialIter = _materialMapping.find(shapeID); + if (mappedMaterialIter != _materialMapping.end()) { + auto mappedMaterials = mappedMaterialIter->second; + for (auto& mappedMaterial : mappedMaterials) { + result.appendMaterial(mappedMaterial, shapeID, materialName); + } } } shapeID++; @@ -1569,6 +1572,13 @@ void Model::applyMaterialMapping() { auto renderItemsKey = _renderItemKeyGlobalFlags; PrimitiveMode primitiveMode = getPrimitiveMode(); bool useDualQuaternionSkinning = _useDualQuaternionSkinning; + auto modelMeshRenderItemIDs = _modelMeshRenderItemIDs; + auto modelMeshRenderItemShapes = _modelMeshRenderItemShapes; + std::unordered_map shouldInvalidatePayloadShapeKeyMap; + + for (auto& shape : _modelMeshRenderItemShapes) { + shouldInvalidatePayloadShapeKeyMap[shape.meshIndex] = shouldInvalidatePayloadShapeKey(shape.meshIndex); + } auto& materialMapping = getMaterialMapping(); for (auto& mapping : materialMapping) { @@ -1588,7 +1598,8 @@ void Model::applyMaterialMapping() { priorityMapPerResource[shapeID] = ++_priorityMap[shapeID]; } - auto materialLoaded = [this, networkMaterialResource, shapeIDs, priorityMapPerResource, renderItemsKey, primitiveMode, useDualQuaternionSkinning]() { + auto materialLoaded = [this, networkMaterialResource, shapeIDs, priorityMapPerResource, renderItemsKey, primitiveMode, useDualQuaternionSkinning, + modelMeshRenderItemIDs, modelMeshRenderItemShapes, shouldInvalidatePayloadShapeKeyMap]() { if (networkMaterialResource->isFailed() || networkMaterialResource->parsedMaterials.names.size() == 0) { return; } @@ -1611,12 +1622,15 @@ void Model::applyMaterialMapping() { } } for (auto shapeID : shapeIDs) { - if (shapeID < _modelMeshRenderItemIDs.size()) { - auto itemID = _modelMeshRenderItemIDs[shapeID]; - auto meshIndex = _modelMeshRenderItemShapes[shapeID].meshIndex; - bool invalidatePayloadShapeKey = shouldInvalidatePayloadShapeKey(meshIndex); + if (shapeID < modelMeshRenderItemIDs.size()) { + auto itemID = modelMeshRenderItemIDs[shapeID]; + auto meshIndex = modelMeshRenderItemShapes[shapeID].meshIndex; + bool invalidatePayloadShapeKey = shouldInvalidatePayloadShapeKeyMap.at(meshIndex); graphics::MaterialLayer material = graphics::MaterialLayer(networkMaterial, priorityMapPerResource.at(shapeID)); - _materialMapping[shapeID].push_back(material); + { + std::unique_lock lock(_materialMappingMutex); + _materialMapping[shapeID].push_back(material); + } transaction.updateItem(itemID, [material, renderItemsKey, invalidatePayloadShapeKey, primitiveMode, useDualQuaternionSkinning](ModelMeshPartPayload& data) { data.addMaterial(material); diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 1431b5e3f9..597015cece 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -379,6 +379,7 @@ protected: std::unordered_map _priorityMap; // only used for materialMapping std::unordered_map> _materialMapping; // generated during applyMaterialMapping + std::mutex _materialMappingMutex; void applyMaterialMapping(); void setBlendshapeCoefficients(const QVector& coefficients) { _blendshapeCoefficients = coefficients; }