mirror of
https://github.com/overte-org/overte.git
synced 2025-07-23 12:24:26 +02:00
Merge pull request #7519 from zzmp/fix/avatar-crash
Fix crash from updating/resetting avatar
This commit is contained in:
commit
a7f93aa75c
2 changed files with 14 additions and 8 deletions
|
@ -859,7 +859,11 @@ void Avatar::scaleVectorRelativeToPosition(glm::vec3 &positionToScale) const {
|
||||||
|
|
||||||
void Avatar::setSkeletonModelURL(const QUrl& skeletonModelURL) {
|
void Avatar::setSkeletonModelURL(const QUrl& skeletonModelURL) {
|
||||||
AvatarData::setSkeletonModelURL(skeletonModelURL);
|
AvatarData::setSkeletonModelURL(skeletonModelURL);
|
||||||
_skeletonModel->setURL(_skeletonModelURL);
|
if (QThread::currentThread() == thread()) {
|
||||||
|
_skeletonModel->setURL(_skeletonModelURL);
|
||||||
|
} else {
|
||||||
|
QMetaObject::invokeMethod(_skeletonModel.get(), "setURL", Qt::QueuedConnection, Q_ARG(QUrl, _skeletonModelURL));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// create new model, can return an instance of a SoftAttachmentModel rather then Model
|
// create new model, can return an instance of a SoftAttachmentModel rather then Model
|
||||||
|
|
|
@ -167,13 +167,15 @@ void Model::enqueueLocationChange() {
|
||||||
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](ModelMeshPartPayload& data) {
|
||||||
|
// Ensure the model geometry was not reset between frames
|
||||||
|
if (data._model->isLoaded()) {
|
||||||
|
// 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());
|
||||||
|
|
||||||
// lazy update of cluster matrices used for rendering. We need to update them here, so we can correctly update the bounding box.
|
// update the model transform and bounding box for this render item.
|
||||||
data._model->updateClusterMatrices(modelTransform.getTranslation(), modelTransform.getRotation());
|
const Model::MeshState& state = data._model->_meshStates.at(data._meshIndex);
|
||||||
|
data.updateTransformForSkinnedMesh(modelTransform, modelMeshOffset, state.clusterMatrices);
|
||||||
// update the model transform and bounding box for this render item.
|
}
|
||||||
const Model::MeshState& state = data._model->_meshStates.at(data._meshIndex);
|
|
||||||
data.updateTransformForSkinnedMesh(modelTransform, modelMeshOffset, state.clusterMatrices);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1061,7 +1063,7 @@ void Model::simulateInternal(float deltaTime) {
|
||||||
void Model::updateClusterMatrices(glm::vec3 modelPosition, glm::quat modelOrientation) {
|
void Model::updateClusterMatrices(glm::vec3 modelPosition, glm::quat modelOrientation) {
|
||||||
PerformanceTimer perfTimer("Model::updateClusterMatrices");
|
PerformanceTimer perfTimer("Model::updateClusterMatrices");
|
||||||
|
|
||||||
if (!_needsUpdateClusterMatrices) {
|
if (!_needsUpdateClusterMatrices || !isLoaded()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_needsUpdateClusterMatrices = false;
|
_needsUpdateClusterMatrices = false;
|
||||||
|
|
Loading…
Reference in a new issue