change ModelBlender to use a set<WeakPointers> to safely handle model lifetime

This commit is contained in:
Brad Hefta-Gaub 2016-03-17 19:44:42 -07:00
parent 917c4644a5
commit eb8a6527c6
3 changed files with 9 additions and 10 deletions

View file

@ -79,6 +79,6 @@ void SoftAttachmentModel::updateClusterMatrices(glm::vec3 modelPosition, glm::qu
// post the blender if we're not currently waiting for one to finish
if (geometry.hasBlendedMeshes() && _blendshapeCoefficients != _blendedBlendshapeCoefficients) {
_blendedBlendshapeCoefficients = _blendshapeCoefficients;
DependencyManager::get<ModelBlender>()->noteRequiresBlend(this);
DependencyManager::get<ModelBlender>()->noteRequiresBlend(getThisPointer());
}
}

View file

@ -1068,7 +1068,7 @@ void Model::updateClusterMatrices(glm::vec3 modelPosition, glm::quat modelOrient
// post the blender if we're not currently waiting for one to finish
if (geometry.hasBlendedMeshes() && _blendshapeCoefficients != _blendedBlendshapeCoefficients) {
_blendedBlendshapeCoefficients = _blendshapeCoefficients;
DependencyManager::get<ModelBlender>()->noteRequiresBlend(this);
DependencyManager::get<ModelBlender>()->noteRequiresBlend(getThisPointer());
}
}
@ -1276,16 +1276,14 @@ ModelBlender::ModelBlender() :
ModelBlender::~ModelBlender() {
}
void ModelBlender::noteRequiresBlend(Model* model) {
void ModelBlender::noteRequiresBlend(ModelPointer model) {
if (_pendingBlenders < QThread::idealThreadCount()) {
if (model->maybeStartBlender()) {
_pendingBlenders++;
}
return;
}
if (!_modelsRequiringBlends.contains(model)) {
_modelsRequiringBlends.append(model);
}
_modelsRequiringBlends.insert(model);
}
void ModelBlender::setBlendedVertices(const QPointer<Model>& model, int blendNumber,
@ -1294,8 +1292,9 @@ void ModelBlender::setBlendedVertices(const QPointer<Model>& model, int blendNum
model->setBlendedVertices(blendNumber, geometry, vertices, normals);
}
_pendingBlenders--;
while (!_modelsRequiringBlends.isEmpty()) {
Model* nextModel = _modelsRequiringBlends.takeFirst();
while (!_modelsRequiringBlends.empty()) {
auto fistItem = _modelsRequiringBlends.begin();
ModelPointer nextModel = fistItem->lock();
if (nextModel && nextModel->maybeStartBlender()) {
_pendingBlenders++;
return;

View file

@ -395,7 +395,7 @@ class ModelBlender : public QObject, public Dependency {
public:
/// Adds the specified model to the list requiring vertex blends.
void noteRequiresBlend(Model* model);
void noteRequiresBlend(ModelPointer model);
public slots:
void setBlendedVertices(const QPointer<Model>& model, int blendNumber, const QWeakPointer<NetworkGeometry>& geometry,
@ -405,7 +405,7 @@ private:
ModelBlender();
virtual ~ModelBlender();
QList<QPointer<Model> > _modelsRequiringBlends;
std::set<ModelWeakPointer, std::owner_less<ModelWeakPointer>> _modelsRequiringBlends;
int _pendingBlenders;
};