From 3f85997352569286e2e26c43406ea6697d352dad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antti=20M=C3=A4=C3=A4tt=C3=A4?= Date: Wed, 29 May 2019 15:32:36 +0300 Subject: Fix crash in editor when using qmlstreams Do not use filename as initial presentation id. It might be used by another presentation as an id like in this case. Instead use __initial as initial presentation id. In addition to asset map, also ordered assets need to update the presentation key. Task-number: QT3DS-3383 Change-Id: I40249f8fc496372637fd0018f43c2b29d986842b Reviewed-by: Jari Karppinen Reviewed-by: Mahmoud Badri Reviewed-by: Miikka Heikkinen --- src/Runtime/Source/runtime/Qt3DSApplication.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Runtime/Source/runtime/Qt3DSApplication.cpp b/src/Runtime/Source/runtime/Qt3DSApplication.cpp index 20e3fd57..df2f00fa 100644 --- a/src/Runtime/Source/runtime/Qt3DSApplication.cpp +++ b/src/Runtime/Source/runtime/Qt3DSApplication.cpp @@ -688,6 +688,7 @@ struct SApp : public IApplication , m_createSuccessful(false) , mRefCount(0) { + m_PresentationId.append("__initial"); m_AudioPlayer.SetApplication(*this); eastl::string tempStr(inAppDir); CFileTools::NormalizePath(tempStr); @@ -734,15 +735,22 @@ struct SApp : public IApplication if (oldId == id) return; + CRegisteredString idStr = m_CoreFactory->GetStringTable().RegisterStr(id); // Update id key in m_AssetMap TIdAssetMap::iterator iter = m_AssetMap.find(m_CoreFactory->GetStringTable().RegisterStr(oldId)); if (iter != m_AssetMap.end() && iter->second->getType() == AssetValueTypes::Presentation) { - CRegisteredString idStr = m_CoreFactory->GetStringTable().RegisterStr(id); m_AssetMap.insert(eastl::make_pair(idStr, iter->second)); m_AssetMap.erase(iter); } + for (unsigned i = 0; i < m_OrderedAssets.size(); i++) { + auto &asset = m_OrderedAssets[i]; + if (oldId == asset.first.c_str()) { + asset.first = idStr; + break; + } + } m_PresentationId.assign(qPrintable(id)); } @@ -1489,12 +1497,12 @@ struct SApp : public IApplication m_variantConfig.setVariantList(variantList); bool retval = false; if (extension.comparei("uip") == 0) { - m_PresentationId.assign(filename.c_str()); + m_PresentationId.assign("__initial"); eastl::string relativePath = "./"; relativePath.append(filename); relativePath.append("."); relativePath.append("uip"); - RegisterAsset(SPresentationAsset(RegisterStr(filename.c_str()), + RegisterAsset(SPresentationAsset(RegisterStr(m_PresentationId.c_str()), RegisterStr(relativePath.c_str()))); m_AppLoadContext = IAppLoadContext::CreateXMLLoadContext(*this, ""); -- cgit v1.2.3