From 72a6254fa130bdff247b78e14af93817c67162fd Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 12 Sep 2014 15:24:38 -0700 Subject: [PATCH] Only allow one "blender" to run at a time for each model. --- interface/src/renderer/Model.cpp | 27 +++++++++++++++++++++++---- interface/src/renderer/Model.h | 3 +++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/interface/src/renderer/Model.cpp b/interface/src/renderer/Model.cpp index 280f5bd21a..0b16688056 100644 --- a/interface/src/renderer/Model.cpp +++ b/interface/src/renderer/Model.cpp @@ -61,7 +61,10 @@ Model::Model(QObject* parent) : _showTrueJointTransforms(true), _lodDistance(0.0f), _pupilDilation(0.0f), - _url("http://invalid.com") { + _url("http://invalid.com"), + _blenderPending(false), + _blendRequired(false) { + // we may have been created in the network thread, but we live in the main thread moveToThread(Application::getInstance()->thread()); } @@ -998,9 +1001,15 @@ void Model::simulateInternal(float deltaTime) { } } - // post the blender + // post the blender if we're not currently waiting for one to finish if (geometry.hasBlendedMeshes()) { - QThreadPool::globalInstance()->start(new Blender(this, _geometry, geometry.meshes, _blendshapeCoefficients)); + if (_blenderPending) { + _blendRequired = true; + } else { + _blendRequired = false; + _blenderPending = true; + QThreadPool::globalInstance()->start(new Blender(this, _geometry, geometry.meshes, _blendshapeCoefficients)); + } } } @@ -1264,10 +1273,20 @@ void Model::renderJointCollisionShapes(float alpha) { } void Model::setBlendedVertices(const QVector& vertices, const QVector& normals) { + _blenderPending = false; + + // start the next blender if required + const FBXGeometry& geometry = _geometry->getFBXGeometry(); + if (_blendRequired) { + _blendRequired = false; + if (geometry.hasBlendedMeshes()) { + _blenderPending = true; + QThreadPool::globalInstance()->start(new Blender(this, _geometry, geometry.meshes, _blendshapeCoefficients)); + } + } if (_blendedVertexBuffers.isEmpty()) { return; } - const FBXGeometry& geometry = _geometry->getFBXGeometry(); int index = 0; for (int i = 0; i < geometry.meshes.size(); i++) { const FBXMesh& mesh = geometry.meshes.at(i); diff --git a/interface/src/renderer/Model.h b/interface/src/renderer/Model.h index 6c27970d8e..396a3e576c 100644 --- a/interface/src/renderer/Model.h +++ b/interface/src/renderer/Model.h @@ -284,6 +284,9 @@ private: glm::vec4 _localLightColors[MAX_LOCAL_LIGHTS]; glm::vec4 _localLightDirections[MAX_LOCAL_LIGHTS]; + bool _blenderPending; + bool _blendRequired; + static ProgramObject _program; static ProgramObject _normalMapProgram; static ProgramObject _specularMapProgram;