mirror of
https://github.com/AleziaKurdis/overte.git
synced 2025-04-17 05:58:28 +02:00
change ModelBlender to use a set<WeakPointers> to safely handle model lifetime
This commit is contained in:
parent
917c4644a5
commit
eb8a6527c6
3 changed files with 9 additions and 10 deletions
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue