one more crack at fixing the blender

This commit is contained in:
Brad Hefta-Gaub 2016-03-21 18:28:26 -07:00
parent 59b043d803
commit 513138ca98
2 changed files with 16 additions and 6 deletions

View file

@ -1277,20 +1277,26 @@ void ModelBlender::noteRequiresBlend(ModelPointer model) {
} }
return; return;
} }
_modelsRequiringBlends.insert(model);
{
Lock lock(_mutex);
_modelsRequiringBlends.insert(model);
}
} }
void ModelBlender::setBlendedVertices(const QPointer<Model>& model, int blendNumber, void ModelBlender::setBlendedVertices(const QPointer<Model>& model, int blendNumber,
const QWeakPointer<NetworkGeometry>& geometry, const QVector<glm::vec3>& vertices, const QVector<glm::vec3>& normals) { const QWeakPointer<NetworkGeometry>& geometry, const QVector<glm::vec3>& vertices, const QVector<glm::vec3>& normals) {
if (!model.isNull()) { if (!model.isNull()) {
model->setBlendedVertices(blendNumber, geometry, vertices, normals); model->setBlendedVertices(blendNumber, geometry, vertices, normals);
} }
_pendingBlenders--; _pendingBlenders--;
while (!_modelsRequiringBlends.empty()) { {
auto firstItem = _modelsRequiringBlends.begin(); Lock lock(_mutex);
if (firstItem != _modelsRequiringBlends.end()) { for (auto i = _modelsRequiringBlends.begin(); i != _modelsRequiringBlends.end();) {
_modelsRequiringBlends.erase(firstItem); auto weakPtr = *i;
ModelPointer nextModel = firstItem->lock(); _modelsRequiringBlends.erase(i++); // remove front of the set
ModelPointer nextModel = weakPtr.lock();
if (nextModel && nextModel->maybeStartBlender()) { if (nextModel && nextModel->maybeStartBlender()) {
_pendingBlenders++; _pendingBlenders++;
return; return;

View file

@ -402,11 +402,15 @@ public slots:
const QVector<glm::vec3>& vertices, const QVector<glm::vec3>& normals); const QVector<glm::vec3>& vertices, const QVector<glm::vec3>& normals);
private: private:
using Mutex = std::mutex;
using Lock = std::unique_lock<Mutex>;
ModelBlender(); ModelBlender();
virtual ~ModelBlender(); virtual ~ModelBlender();
std::set<ModelWeakPointer, std::owner_less<ModelWeakPointer>> _modelsRequiringBlends; std::set<ModelWeakPointer, std::owner_less<ModelWeakPointer>> _modelsRequiringBlends;
int _pendingBlenders; int _pendingBlenders;
Mutex _mutex;
}; };