Merge pull request #7550 from hyperlogic/tony/avatar-thrasher

Model: fixed two crash issues when changing avatars
This commit is contained in:
Brad Hefta-Gaub 2016-04-03 13:47:35 -07:00
commit 4a78ad877e
3 changed files with 26 additions and 9 deletions

View file

@ -118,10 +118,8 @@ void GeometryReader::run() {
} }
QThread::currentThread()->setPriority(QThread::LowPriority); QThread::currentThread()->setPriority(QThread::LowPriority);
// Ensure the resource is still being requested if (!_resource.data()) {
auto resource = _resource.toStrongRef(); qCWarning(modelnetworking) << "Abandoning load of" << _url << "; resource was deleted";
if (!resource) {
qCWarning(modelnetworking) << "Abandoning load of" << _url << "; could not get strong ref";
return; return;
} }
@ -146,14 +144,28 @@ void GeometryReader::run() {
throw QString("unsupported format"); throw QString("unsupported format");
} }
QMetaObject::invokeMethod(resource.data(), "setGeometryDefinition", // Ensure the resource has not been deleted, and won't be while invokeMethod is in flight.
Q_ARG(void*, fbxGeometry)); auto resource = _resource.toStrongRef();
if (!resource) {
qCWarning(modelnetworking) << "Abandoning load of" << _url << "; could not get strong ref";
delete fbxGeometry;
} else {
QMetaObject::invokeMethod(resource.data(), "setGeometryDefinition", Qt::BlockingQueuedConnection, Q_ARG(void*, fbxGeometry));
}
} else { } else {
throw QString("url is invalid"); throw QString("url is invalid");
} }
} catch (const QString& error) { } catch (const QString& error) {
qCDebug(modelnetworking) << "Error reading " << _url << ": " << error; qCDebug(modelnetworking) << "Error reading " << _url << ": " << error;
QMetaObject::invokeMethod(resource.data(), "finishedLoading", Q_ARG(bool, false));
auto resource = _resource.toStrongRef();
// Ensure the resoruce has not been deleted, and won't be while invokeMethod is in flight.
if (!resource) {
qCWarning(modelnetworking) << "Abandoning load of" << _url << "; could not get strong ref";
} else {
QMetaObject::invokeMethod(resource.data(), "finishedLoading", Qt::BlockingQueuedConnection, Q_ARG(bool, false));
}
} }
QThread::currentThread()->setPriority(originalPriority); QThread::currentThread()->setPriority(originalPriority);

View file

@ -159,11 +159,13 @@ void Model::updateRenderItems() {
Transform collisionMeshOffset; Transform collisionMeshOffset;
collisionMeshOffset.postTranslate(self->_offset); collisionMeshOffset.postTranslate(self->_offset);
uint32_t deleteGeometryCounter = self->_deleteGeometryCounter;
render::PendingChanges pendingChanges; render::PendingChanges pendingChanges;
foreach (auto itemID, self->_modelMeshRenderItems.keys()) { foreach (auto itemID, self->_modelMeshRenderItems.keys()) {
pendingChanges.updateItem<ModelMeshPartPayload>(itemID, [modelTransform, modelMeshOffset](ModelMeshPartPayload& data) { pendingChanges.updateItem<ModelMeshPartPayload>(itemID, [modelTransform, modelMeshOffset, deleteGeometryCounter](ModelMeshPartPayload& data) {
// Ensure the model geometry was not reset between frames // Ensure the model geometry was not reset between frames
if (data._model->isLoaded()) { if (data._model && data._model->isLoaded() && deleteGeometryCounter == data._model->_deleteGeometryCounter) {
// lazy update of cluster matrices used for rendering. We need to update them here, so we can correctly update the bounding box. // lazy update of cluster matrices used for rendering. We need to update them here, so we can correctly update the bounding box.
data._model->updateClusterMatrices(modelTransform.getTranslation(), modelTransform.getRotation()); data._model->updateClusterMatrices(modelTransform.getTranslation(), modelTransform.getRotation());
@ -1146,6 +1148,7 @@ void Model::setBlendedVertices(int blendNumber, const std::weak_ptr<NetworkGeome
} }
void Model::deleteGeometry() { void Model::deleteGeometry() {
_deleteGeometryCounter++;
_blendedVertexBuffers.clear(); _blendedVertexBuffers.clear();
_meshStates.clear(); _meshStates.clear();
_rig->destroyAnimGraph(); _rig->destroyAnimGraph();

View file

@ -394,6 +394,8 @@ protected:
friend class ModelMeshPartPayload; friend class ModelMeshPartPayload;
RigPointer _rig; RigPointer _rig;
uint32_t _deleteGeometryCounter { 0 };
}; };
Q_DECLARE_METATYPE(ModelPointer) Q_DECLARE_METATYPE(ModelPointer)