diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 16db6532da..df186802f6 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -1277,20 +1277,26 @@ void ModelBlender::noteRequiresBlend(ModelPointer model) { } return; } - _modelsRequiringBlends.insert(model); + + { + Lock lock(_mutex); + _modelsRequiringBlends.insert(model); + } } void ModelBlender::setBlendedVertices(const QPointer& model, int blendNumber, const QWeakPointer& geometry, const QVector& vertices, const QVector& normals) { + if (!model.isNull()) { model->setBlendedVertices(blendNumber, geometry, vertices, normals); } _pendingBlenders--; - while (!_modelsRequiringBlends.empty()) { - auto firstItem = _modelsRequiringBlends.begin(); - if (firstItem != _modelsRequiringBlends.end()) { - _modelsRequiringBlends.erase(firstItem); - ModelPointer nextModel = firstItem->lock(); + { + Lock lock(_mutex); + for (auto i = _modelsRequiringBlends.begin(); i != _modelsRequiringBlends.end();) { + auto weakPtr = *i; + _modelsRequiringBlends.erase(i++); // remove front of the set + ModelPointer nextModel = weakPtr.lock(); if (nextModel && nextModel->maybeStartBlender()) { _pendingBlenders++; return; diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 1e8b3f2af6..53ed82f418 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -402,11 +402,15 @@ public slots: const QVector& vertices, const QVector& normals); private: + using Mutex = std::mutex; + using Lock = std::unique_lock; + ModelBlender(); virtual ~ModelBlender(); std::set> _modelsRequiringBlends; int _pendingBlenders; + Mutex _mutex; };