mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 05:17:02 +02:00
Merge pull request #13107 from zfox23/RC67_MS14639
RC67: Fix for crash deep in QML after useFullAvatarURL
This commit is contained in:
commit
2eb171be1c
3 changed files with 22 additions and 12 deletions
|
@ -1473,6 +1473,15 @@ void MyAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) {
|
||||||
std::shared_ptr<QMetaObject::Connection> skeletonConnection = std::make_shared<QMetaObject::Connection>();
|
std::shared_ptr<QMetaObject::Connection> skeletonConnection = std::make_shared<QMetaObject::Connection>();
|
||||||
*skeletonConnection = QObject::connect(_skeletonModel.get(), &SkeletonModel::skeletonLoaded, [this, skeletonModelChangeCount, skeletonConnection]() {
|
*skeletonConnection = QObject::connect(_skeletonModel.get(), &SkeletonModel::skeletonLoaded, [this, skeletonModelChangeCount, skeletonConnection]() {
|
||||||
if (skeletonModelChangeCount == _skeletonModelChangeCount) {
|
if (skeletonModelChangeCount == _skeletonModelChangeCount) {
|
||||||
|
|
||||||
|
if (_fullAvatarModelName.isEmpty()) {
|
||||||
|
// Store the FST file name into preferences
|
||||||
|
const auto& mapping = _skeletonModel->getGeometry()->getMapping();
|
||||||
|
if (mapping.value("name").isValid()) {
|
||||||
|
_fullAvatarModelName = mapping.value("name").toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
initHeadBones();
|
initHeadBones();
|
||||||
_skeletonModel->setCauterizeBoneSet(_headBoneSet);
|
_skeletonModel->setCauterizeBoneSet(_headBoneSet);
|
||||||
_fstAnimGraphOverrideUrl = _skeletonModel->getGeometry()->getAnimGraphOverrideUrl();
|
_fstAnimGraphOverrideUrl = _skeletonModel->getGeometry()->getAnimGraphOverrideUrl();
|
||||||
|
@ -1535,12 +1544,7 @@ void MyAvatar::useFullAvatarURL(const QUrl& fullAvatarURL, const QString& modelN
|
||||||
|
|
||||||
if (_fullAvatarURLFromPreferences != fullAvatarURL) {
|
if (_fullAvatarURLFromPreferences != fullAvatarURL) {
|
||||||
_fullAvatarURLFromPreferences = fullAvatarURL;
|
_fullAvatarURLFromPreferences = fullAvatarURL;
|
||||||
if (modelName.isEmpty()) {
|
_fullAvatarModelName = modelName;
|
||||||
QVariantHash fullAvatarFST = FSTReader::downloadMapping(_fullAvatarURLFromPreferences.toString());
|
|
||||||
_fullAvatarModelName = fullAvatarFST["name"].toString();
|
|
||||||
} else {
|
|
||||||
_fullAvatarModelName = modelName;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString& urlString = fullAvatarURL.toString();
|
const QString& urlString = fullAvatarURL.toString();
|
||||||
|
@ -1548,8 +1552,8 @@ void MyAvatar::useFullAvatarURL(const QUrl& fullAvatarURL, const QString& modelN
|
||||||
setSkeletonModelURL(fullAvatarURL);
|
setSkeletonModelURL(fullAvatarURL);
|
||||||
UserActivityLogger::getInstance().changedModel("skeleton", urlString);
|
UserActivityLogger::getInstance().changedModel("skeleton", urlString);
|
||||||
}
|
}
|
||||||
|
|
||||||
markIdentityDataChanged();
|
markIdentityDataChanged();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyAvatar::setAttachmentData(const QVector<AttachmentData>& attachmentData) {
|
void MyAvatar::setAttachmentData(const QVector<AttachmentData>& attachmentData) {
|
||||||
|
|
|
@ -63,16 +63,18 @@ void GeometryMappingResource::downloadFinished(const QByteArray& data) {
|
||||||
PROFILE_ASYNC_BEGIN(resource_parse_geometry, "GeometryMappingResource::downloadFinished", _url.toString(),
|
PROFILE_ASYNC_BEGIN(resource_parse_geometry, "GeometryMappingResource::downloadFinished", _url.toString(),
|
||||||
{ { "url", _url.toString() } });
|
{ { "url", _url.toString() } });
|
||||||
|
|
||||||
auto mapping = FSTReader::readMapping(data);
|
// store parsed contents of FST file
|
||||||
|
_mapping = FSTReader::readMapping(data);
|
||||||
|
|
||||||
|
QString filename = _mapping.value("filename").toString();
|
||||||
|
|
||||||
QString filename = mapping.value("filename").toString();
|
|
||||||
if (filename.isNull()) {
|
if (filename.isNull()) {
|
||||||
qCDebug(modelnetworking) << "Mapping file" << _url << "has no \"filename\" field";
|
qCDebug(modelnetworking) << "Mapping file" << _url << "has no \"filename\" field";
|
||||||
finishedLoading(false);
|
finishedLoading(false);
|
||||||
} else {
|
} else {
|
||||||
QUrl url = _url.resolved(filename);
|
QUrl url = _url.resolved(filename);
|
||||||
|
|
||||||
QString texdir = mapping.value(TEXDIR_FIELD).toString();
|
QString texdir = _mapping.value(TEXDIR_FIELD).toString();
|
||||||
if (!texdir.isNull()) {
|
if (!texdir.isNull()) {
|
||||||
if (!texdir.endsWith('/')) {
|
if (!texdir.endsWith('/')) {
|
||||||
texdir += '/';
|
texdir += '/';
|
||||||
|
@ -82,7 +84,8 @@ void GeometryMappingResource::downloadFinished(const QByteArray& data) {
|
||||||
_textureBaseUrl = url.resolved(QUrl("."));
|
_textureBaseUrl = url.resolved(QUrl("."));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto animGraphVariant = mapping.value("animGraphUrl");
|
auto animGraphVariant = _mapping.value("animGraphUrl");
|
||||||
|
|
||||||
if (animGraphVariant.isValid()) {
|
if (animGraphVariant.isValid()) {
|
||||||
QUrl fstUrl(animGraphVariant.toString());
|
QUrl fstUrl(animGraphVariant.toString());
|
||||||
if (fstUrl.isValid()) {
|
if (fstUrl.isValid()) {
|
||||||
|
@ -95,7 +98,7 @@ void GeometryMappingResource::downloadFinished(const QByteArray& data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto modelCache = DependencyManager::get<ModelCache>();
|
auto modelCache = DependencyManager::get<ModelCache>();
|
||||||
GeometryExtra extra{ mapping, _textureBaseUrl, false };
|
GeometryExtra extra{ _mapping, _textureBaseUrl, false };
|
||||||
|
|
||||||
// Get the raw GeometryResource
|
// Get the raw GeometryResource
|
||||||
_geometryResource = modelCache->getResource(url, QUrl(), &extra).staticCast<GeometryResource>();
|
_geometryResource = modelCache->getResource(url, QUrl(), &extra).staticCast<GeometryResource>();
|
||||||
|
@ -362,6 +365,7 @@ Geometry::Geometry(const Geometry& geometry) {
|
||||||
}
|
}
|
||||||
|
|
||||||
_animGraphOverrideUrl = geometry._animGraphOverrideUrl;
|
_animGraphOverrideUrl = geometry._animGraphOverrideUrl;
|
||||||
|
_mapping = geometry._mapping;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Geometry::setTextures(const QVariantMap& textureMap) {
|
void Geometry::setTextures(const QVariantMap& textureMap) {
|
||||||
|
|
|
@ -55,6 +55,7 @@ public:
|
||||||
|
|
||||||
virtual bool areTexturesLoaded() const;
|
virtual bool areTexturesLoaded() const;
|
||||||
const QUrl& getAnimGraphOverrideUrl() const { return _animGraphOverrideUrl; }
|
const QUrl& getAnimGraphOverrideUrl() const { return _animGraphOverrideUrl; }
|
||||||
|
const QVariantHash& getMapping() const { return _mapping; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
friend class GeometryMappingResource;
|
friend class GeometryMappingResource;
|
||||||
|
@ -68,6 +69,7 @@ protected:
|
||||||
NetworkMaterials _materials;
|
NetworkMaterials _materials;
|
||||||
|
|
||||||
QUrl _animGraphOverrideUrl;
|
QUrl _animGraphOverrideUrl;
|
||||||
|
QVariantHash _mapping; // parsed contents of FST file.
|
||||||
|
|
||||||
private:
|
private:
|
||||||
mutable bool _areTexturesLoaded { false };
|
mutable bool _areTexturesLoaded { false };
|
||||||
|
|
Loading…
Reference in a new issue