summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Määttä <antti.maatta@qt.io>2019-09-16 13:15:00 +0300
committerAntti Määttä <antti.maatta@qt.io>2019-09-18 12:21:10 +0300
commit0d60954c66b58c6762b03eadcd1bd00e040d2f80 (patch)
tree5023bfbd66ad6676bb023e375b192b1acc356f62
parentd80834101611ed2d2cf8f583aa145382477bb4dc (diff)
Fix generating unique ids for objects
Task-number: QT3DS-3816 Change-Id: I99c905d0b29db5d8a80f46992b3ade6a4b703dc5 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io> Reviewed-by: Antti Määttä <antti.maatta@qt.io>
-rw-r--r--src/Authoring/Client/Code/Core/Doc/Doc.cpp1
-rw-r--r--src/Authoring/Client/Code/Core/Doc/IComposerSerializer.cpp347
-rw-r--r--src/Authoring/Client/Code/Core/Doc/IComposerSerializer.h1
3 files changed, 205 insertions, 144 deletions
diff --git a/src/Authoring/Client/Code/Core/Doc/Doc.cpp b/src/Authoring/Client/Code/Core/Doc/Doc.cpp
index ba7e987c..e0b6af8c 100644
--- a/src/Authoring/Client/Code/Core/Doc/Doc.cpp
+++ b/src/Authoring/Client/Code/Core/Doc/Doc.cpp
@@ -2099,7 +2099,6 @@ bool CDoc::VerifyCanRename(qt3dsdm::Qt3DSDMInstanceHandle inAsset)
*/
void CDoc::LoadPresentationFile(CBufferedInputStream *inInputStream)
{
- Q3DStudio::IComposerSerializer::clear();
// Let any interested parties know that a presentation is going to be loaded
m_Core->GetDispatch()->FireOnLoadingPresentation();
diff --git a/src/Authoring/Client/Code/Core/Doc/IComposerSerializer.cpp b/src/Authoring/Client/Code/Core/Doc/IComposerSerializer.cpp
index bd40dfb0..c62d3fa1 100644
--- a/src/Authoring/Client/Code/Core/Doc/IComposerSerializer.cpp
+++ b/src/Authoring/Client/Code/Core/Doc/IComposerSerializer.cpp
@@ -306,17 +306,16 @@ struct SMetaDataPropertyEraser
using std::unordered_set;
using std::unordered_map;
-typedef unordered_map<int, TCharPtr> THandleToIdMap;
-typedef unordered_map<TCharPtr, int> TIdToHandleMap;
-typedef unordered_map<SLong4, int> TGUIDToHandleMap;
-typedef unordered_map<int, SLong4> THandleToGUIDMap;
-typedef unordered_map<Qt3DSDMInstanceHandle, int, hash<int>> TInstanceIntMap;
-typedef unordered_map<Qt3DSDMInstanceHandle, TCharPtr, hash<int>> TInstanceToSiblingMap;
-
// Algorithm to write is to run through the graph, starting at the root instances
// and write out the instances as we come to them.
struct SComposerSerializerImpl : public IComposerSerializer
{
+ typedef unordered_map<int, TCharPtr> THandleToIdMap;
+ typedef unordered_map<TCharPtr, int> TIdToHandleMap;
+ typedef unordered_map<SLong4, int> TGUIDToHandleMap;
+ typedef unordered_map<int, SLong4> THandleToGUIDMap;
+ typedef unordered_map<Qt3DSDMInstanceHandle, int, hash<int>> TInstanceIntMap;
+ typedef unordered_map<Qt3DSDMInstanceHandle, TCharPtr, hash<int>> TInstanceToSiblingMap;
typedef unordered_set<Qt3DSDMInstanceHandle, hash<int>> TInstanceSet;
typedef unordered_set<Qt3DSDMSlideHandle, hash<int>> TSlideSet;
typedef unordered_set<Qt3DSDMActionHandle, hash<int>> TActionSet;
@@ -342,14 +341,14 @@ struct SComposerSerializerImpl : public IComposerSerializer
Qt3DSDMSlideHandle m_ActiveSlideParent;
// The unique ids for instances
- static THandleToIdMap s_HandleToIdMap;
- static TIdToHandleMap s_IdToHandleMap;
- static TGUIDToHandleMap s_GUIDToHandleMap;
- static THandleToGUIDMap s_HandleToGUIDMap;
- static THandleToIdMap s_ActionToIdMap;
- static TIdToHandleMap s_IdToActionMap;
- static THandleToIdMap s_SlideToIdMap;
- static TIdToHandleMap s_IdToSlideMap;
+ THandleToIdMap m_HandleToIdMap;
+ TIdToHandleMap m_IdToHandleMap;
+ TGUIDToHandleMap m_GUIDToHandleMap;
+ THandleToGUIDMap m_HandleToGUIDMap;
+ THandleToIdMap m_ActionToIdMap;
+ TIdToHandleMap m_IdToActionMap;
+ THandleToIdMap m_SlideToIdMap;
+ TIdToHandleMap m_IdToSlideMap;
TInstanceSet m_InstanceSet;
TSlideSet m_SlideSet;
@@ -387,8 +386,7 @@ struct SComposerSerializerImpl : public IComposerSerializer
SComposerObjectDefinitions &inObjectDefinitions,
std::shared_ptr<Q3DStudio::IImportFailedHandler> inFailedHandler,
IGuideSystem &inGuideSystem, qt3ds::render::IPathManager &inPathManager,
- IPropertySystem &inPropSystem,
- const QString &documentPath)
+ IPropertySystem &inPropSystem, const QString &documentPath)
: m_DataCore(inDataCore)
, m_MetaData(inMetaData)
, m_SlideCore(inSlideCore)
@@ -412,10 +410,19 @@ struct SComposerSerializerImpl : public IComposerSerializer
m_randomGenerator.seed(quint32(QTime::currentTime().msecsSinceStartOfDay()));
}
- void reset(bool resetAll = false)
+ void reset()
{
- if (resetAll)
- clear();
+ m_HandleToIdMap.clear();
+ m_IdToHandleMap.clear();
+
+ m_GUIDToHandleMap.clear();
+ m_HandleToGUIDMap.clear();
+
+ m_ActionToIdMap.clear();
+ m_IdToActionMap.clear();
+
+ m_SlideToIdMap.clear();
+ m_IdToSlideMap.clear();
m_ActiveSlide = 0;
m_ActiveSlideParent = 0;
@@ -439,15 +446,15 @@ struct SComposerSerializerImpl : public IComposerSerializer
TCharPtr AddId(const wstring &inId, Qt3DSDMInstanceHandle inHandle)
{
TCharPtr theIdStr = m_StringTable.RegisterStr(inId.c_str());
- if (s_IdToHandleMap.find(theIdStr) != s_IdToHandleMap.end()
- && s_IdToHandleMap.find(theIdStr)->second != inHandle) {
+ if (m_IdToHandleMap.find(theIdStr) != m_IdToHandleMap.end()
+ && m_IdToHandleMap.find(theIdStr)->second != inHandle) {
m_ImportFailedHandler->DisplayImportFailed(
m_documentPath, QObject::tr("Duplicate object id detected: ")
+ QString::fromWCharArray(theIdStr), false);
return theIdStr;
}
- s_IdToHandleMap.insert(make_pair(theIdStr, inHandle));
- s_HandleToIdMap.insert(make_pair(inHandle, theIdStr));
+ m_IdToHandleMap.insert(make_pair(theIdStr, inHandle));
+ m_HandleToIdMap.insert(make_pair(inHandle, theIdStr));
if (m_PreserveFileIds)
m_DataCore.SetInstancePropertyValue(inHandle, m_ObjectDefinitions.m_Asset.m_FileId,
std::make_shared<CDataStr>(inId.c_str()));
@@ -457,8 +464,8 @@ struct SComposerSerializerImpl : public IComposerSerializer
TCharPtr SetId(const wstring &inId, Qt3DSDMInstanceHandle inHandle)
{
TCharPtr theIdStr = m_StringTable.RegisterStr(inId.c_str());
- s_IdToHandleMap.insert(make_pair(theIdStr, inHandle)).first->second = inHandle;
- s_HandleToIdMap.insert(make_pair(inHandle, theIdStr)).first->second = theIdStr;
+ m_IdToHandleMap.insert(make_pair(theIdStr, inHandle)).first->second = inHandle;
+ m_HandleToIdMap.insert(make_pair(inHandle, theIdStr)).first->second = theIdStr;
if (m_PreserveFileIds)
m_DataCore.SetInstancePropertyValue(inHandle, m_ObjectDefinitions.m_Asset.m_FileId,
std::make_shared<CDataStr>(inId.c_str()));
@@ -468,30 +475,39 @@ struct SComposerSerializerImpl : public IComposerSerializer
TCharPtr AddActionId(const wstring &inId, Qt3DSDMActionHandle inHandle)
{
TCharPtr theIdStr = m_StringTable.RegisterStr(inId.c_str());
- if (s_IdToActionMap.find(theIdStr) != s_IdToActionMap.end()
- && s_IdToActionMap.find(theIdStr)->second != inHandle) {
+ if (m_IdToActionMap.find(theIdStr) != m_IdToActionMap.end()
+ && m_IdToActionMap.find(theIdStr)->second != inHandle) {
m_ImportFailedHandler->DisplayImportFailed(
m_documentPath, QObject::tr("Duplicate action id detected: ")
+ QString::fromWCharArray(theIdStr), false);
return theIdStr;
}
- s_IdToActionMap.insert(make_pair(theIdStr, inHandle));
- s_ActionToIdMap.insert(make_pair(inHandle, theIdStr));
+ m_IdToActionMap.insert(make_pair(theIdStr, inHandle));
+ m_ActionToIdMap.insert(make_pair(inHandle, theIdStr));
+ if (m_PreserveFileIds) {
+ m_DataCore.SetInstancePropertyValue(m_ActionCore.GetActionInstance(inHandle),
+ m_ObjectDefinitions.m_Action.m_FileId,
+ std::make_shared<CDataStr>(inId.c_str()));
+ }
return theIdStr;
}
TCharPtr AddSlideId(const wstring &inId, Qt3DSDMSlideHandle inHandle)
{
TCharPtr theIdStr = m_StringTable.RegisterStr(inId.c_str());
- if (s_IdToSlideMap.find(theIdStr) != s_IdToSlideMap.end()
- && s_IdToSlideMap.find(theIdStr)->second != inHandle) {
+ if (m_IdToActionMap.find(theIdStr) != m_IdToActionMap.end()
+ && m_IdToActionMap.find(theIdStr)->second != inHandle) {
m_ImportFailedHandler->DisplayImportFailed(
m_documentPath, QObject::tr("Duplicate slide id detected: ")
+ QString::fromWCharArray(theIdStr), false);
return theIdStr;
}
- s_IdToSlideMap.insert(make_pair(theIdStr, inHandle));
- s_SlideToIdMap.insert(make_pair(inHandle, theIdStr));
+ m_IdToSlideMap.insert(make_pair(theIdStr, inHandle));
+ m_SlideToIdMap.insert(make_pair(inHandle, theIdStr));
+ if (m_PreserveFileIds)
+ m_DataCore.SetInstancePropertyValue(m_SlideCore.GetSlideInstance(inHandle),
+ m_ObjectDefinitions.m_Slide.m_FileId,
+ std::make_shared<CDataStr>(inId.c_str()));
return theIdStr;
}
@@ -503,8 +519,8 @@ struct SComposerSerializerImpl : public IComposerSerializer
++inId;
inId = m_StringTable.RegisterStr(inId);
- TIdToHandleMap::iterator find = s_IdToHandleMap.find(inId);
- if (find != s_IdToHandleMap.end())
+ TIdToHandleMap::iterator find = m_IdToHandleMap.find(inId);
+ if (find != m_IdToHandleMap.end())
return find->second;
return 0;
}
@@ -517,8 +533,8 @@ struct SComposerSerializerImpl : public IComposerSerializer
++inId;
inId = m_StringTable.RegisterStr(inId);
- TIdToHandleMap::iterator find = s_IdToSlideMap.find(inId);
- if (find != s_IdToSlideMap.end())
+ TIdToHandleMap::iterator find = m_IdToSlideMap.find(inId);
+ if (find != m_IdToSlideMap.end())
return find->second;
return 0;
}
@@ -531,22 +547,22 @@ struct SComposerSerializerImpl : public IComposerSerializer
++inId;
inId = m_StringTable.RegisterStr(inId);
- TIdToHandleMap::iterator find = s_IdToActionMap.find(inId);
- if (find != s_IdToActionMap.end())
+ TIdToHandleMap::iterator find = m_IdToActionMap.find(inId);
+ if (find != m_IdToActionMap.end())
return find->second;
return 0;
}
void AddGuid(SLong4 inId, int inHandle)
{
- s_GUIDToHandleMap.insert(make_pair(inId, inHandle));
- s_HandleToGUIDMap.insert(make_pair(inHandle, inId));
+ m_GUIDToHandleMap.insert(make_pair(inId, inHandle));
+ m_HandleToGUIDMap.insert(make_pair(inHandle, inId));
}
SLong4 GetInstanceGuid(Qt3DSDMInstanceHandle inInstance)
{
- THandleToGUIDMap::iterator find = s_HandleToGUIDMap.find(inInstance);
- if (find != s_HandleToGUIDMap.end())
+ THandleToGUIDMap::iterator find = m_HandleToGUIDMap.find(inInstance);
+ if (find != m_HandleToGUIDMap.end())
return find->second;
SValue theValue;
if (m_DataCore.GetInstancePropertyValue(inInstance, m_ObjectDefinitions.m_Guided.m_GuidProp,
@@ -599,58 +615,77 @@ struct SComposerSerializerImpl : public IComposerSerializer
return GetInstanceName(inInstance);
}
- // Create id for instance. Pass reference handle to id map so that correct
- // id map is checked against(same handle value can exist in instance, slides and actions).
- TCharPtr GetId(const wstring &inIdStem, CDataModelHandle handle, const THandleToIdMap &refMap)
- {
- // Check old id
- QString stem(QString::fromWCharArray(inIdStem.c_str()));
- int pos = stem.lastIndexOf(QLatin1Char('_'));
- if (pos > 0) {
- // Already has unique id
- bool isNumber;
- stem.mid(pos+2).toInt(&isNumber);
- if (stem.at(pos+1) == QLatin1Char('u') && isNumber)
- return m_StringTable.RegisterStr(inIdStem.c_str());
- stem = stem.left(pos);
- } else {
- const wchar_t *savedId = nullptr;
- if (refMap.find(handle) != refMap.end())
- savedId = refMap.find(handle)->second;
-
- if (savedId) {
- QString id(QString::fromWCharArray(savedId));
- // Already has unique id?
- pos = id.lastIndexOf(QLatin1Char('_'));
+ TCharPtr GetId(const wstring &inIdStem, CDataModelHandle instance)
+ {
+ // Create an ID for this instance
+ if (m_PreserveFileIds) {
+ // permanent id
+ QString stem = instanceId(instance);
+ if (stem.isEmpty())
+ stem = QString::fromWCharArray(inIdStem.c_str());
+ int pos = stem.lastIndexOf(QLatin1Char('_'));
+ if (pos > 0) {
+ // Already has unique id
bool isNumber;
- id.mid(pos+2).toInt(&isNumber);
- if (id.at(pos+1) == QLatin1Char('u') && isNumber)
- return m_StringTable.RegisterStr(savedId);
+ stem.mid(pos+2).toInt(&isNumber);
+ if (stem.at(pos+1) == QLatin1Char('u') && isNumber) {
+ QByteArray warr;
+ warr.resize(sizeof(wchar_t) * (stem.length() + 1));
+ warr.fill(0);
+ stem.toWCharArray(reinterpret_cast<wchar_t *>(warr.data()));
+ return m_StringTable.RegisterStr(reinterpret_cast<wchar_t *>(warr.data()));
+ }
+ stem = stem.left(pos);
}
+
+ // Create an ID for this instance
+ QByteArray buffer;
+ wchar_t *str;
+ do {
+ int rid = m_randomGenerator.bounded(65536);
+ QString nid = QStringLiteral("%1_u%2").arg(stem).arg(rid);
+ buffer.resize((nid.length() + 1) * sizeof(wchar_t));
+ buffer.fill(0);
+ str = reinterpret_cast<wchar_t *>(buffer.data());
+ nid.toWCharArray(str);
+ } while (m_IdToActionMap.find(m_StringTable.RegisterStr(str)) != m_IdToActionMap.end()
+ || m_IdToHandleMap.find(m_StringTable.RegisterStr(str))
+ != m_IdToHandleMap.end()
+ || m_IdToSlideMap.find(m_StringTable.RegisterStr(str))
+ != m_IdToSlideMap.end());
+
+ return m_StringTable.RegisterStr(str);
+ } else {
+ // temporary id
+ wstring theTypeStr(inIdStem);
+ wstring theTypeStem(theTypeStr);
+ wstring::size_type thePos = theTypeStem.find_last_of('_');
+ if (thePos != wstring::npos && thePos < theTypeStem.size() - 2) {
+ if (theTypeStem[thePos + 1] >= '0' && theTypeStem[thePos + 1] <= '9')
+ theTypeStem = theTypeStem.substr(0, thePos);
+ }
+ QT3DSU32 idIdx = 1;
+
+ while (m_IdToActionMap.find(m_StringTable.RegisterStr(theTypeStr.c_str()))
+ != m_IdToActionMap.end()
+ || m_IdToHandleMap.find(m_StringTable.RegisterStr(theTypeStr.c_str()))
+ != m_IdToHandleMap.end()
+ || m_IdToSlideMap.find(m_StringTable.RegisterStr(theTypeStr.c_str()))
+ != m_IdToSlideMap.end()) {
+ wchar_t theBuffer[16];
+ swprintf(theBuffer, 16, L"_%03d", idIdx);
+ theTypeStr = theTypeStem + theBuffer;
+ ++idIdx;
+ }
+ return m_StringTable.RegisterStr(theTypeStr.c_str());
}
- // Create an ID for this instance
- QByteArray buffer;
- wchar_t *str;
- do {
- int rid = m_randomGenerator.bounded(65536);
- QString nid = QStringLiteral("%1_u%2").arg(stem).arg(rid);
- buffer.resize((nid.length() + 1) * sizeof(wchar_t));
- buffer.fill(0);
- str = reinterpret_cast<wchar_t *>(buffer.data());
- nid.toWCharArray(str);
- } while (s_IdToActionMap.find(m_StringTable.RegisterStr(str)) != s_IdToActionMap.end()
- || s_IdToHandleMap.find(m_StringTable.RegisterStr(str))
- != s_IdToHandleMap.end()
- || s_IdToSlideMap.find(m_StringTable.RegisterStr(str))
- != s_IdToSlideMap.end());
- return m_StringTable.RegisterStr(str);
}
TCharPtr GetInstanceId(Qt3DSDMInstanceHandle inInstance)
{
QT3DS_ASSERT(inInstance.Valid());
- THandleToIdMap::iterator theFind(s_HandleToIdMap.find(inInstance));
- if (theFind != s_HandleToIdMap.end())
+ THandleToIdMap::iterator theFind(m_HandleToIdMap.find(inInstance));
+ if (theFind != m_HandleToIdMap.end())
return theFind->second;
TCharStr theName(GetInstanceName(inInstance));
@@ -698,13 +733,13 @@ struct SComposerSerializerImpl : public IComposerSerializer
}
if (theProperty.Valid()) {
theIdStr.append(m_DataCore.GetProperty(theProperty).m_Name.wide_str());
- theNewId = GetId(theIdStr, inInstance, s_HandleToIdMap);
+ theNewId = GetId(theIdStr, inInstance);
}
}
}
if (IsTrivial(theNewId))
- theNewId = GetId(theName.wide_str(), inInstance, s_HandleToIdMap);
+ theNewId = GetId(theName.wide_str(), inInstance);
return AddId(theNewId, inInstance);
}
@@ -712,24 +747,34 @@ struct SComposerSerializerImpl : public IComposerSerializer
Qt3DSDMInstanceHandle inInstance)
{
QT3DS_ASSERT(inAction.Valid());
- THandleToIdMap::iterator theFind(s_ActionToIdMap.find(inAction));
- if (theFind != s_ActionToIdMap.end())
+ THandleToIdMap::iterator theFind(m_ActionToIdMap.find(inAction));
+ if (theFind != m_ActionToIdMap.end())
return theFind->second;
wstring theActionName(GetInstanceName(inInstance, inSlide));
theActionName.append(L"-Action");
-
- TCharPtr theNewId = GetId(theActionName, inAction, s_ActionToIdMap);
+ TCharPtr theNewId;
+ if (m_PreserveFileIds) {
+ Qt3DSDMInstanceHandle actionInstance = m_ActionCore.GetActionInstance(inAction);
+ SValue theValue;
+ if (m_DataCore.GetInstancePropertyValue(
+ actionInstance, m_ObjectDefinitions.m_Action.m_FileId, theValue)) {
+ TDataStrPtr fileId(get<TDataStrPtr>(theValue));
+ theNewId = fileId->GetData();
+ if (!IsTrivial(theNewId))
+ return AddSlideId(GetId(theNewId, actionInstance), inSlide);
+ return AddSlideId(GetId(theActionName, actionInstance), inSlide);
+ }
+ }
+ theNewId = GetId(theActionName, inInstance);
return AddActionId(theNewId, inAction);
}
- // If this function is called with an invalid instance and we don't already have an id
- // then we assume we have an external reference and lookup the instance via the component id.
TCharPtr GetSlideId(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance)
{
QT3DS_ASSERT(inSlide.Valid());
- THandleToIdMap::iterator theFind(s_SlideToIdMap.find(inSlide));
- if (theFind != s_SlideToIdMap.end())
+ THandleToIdMap::iterator theFind(m_SlideToIdMap.find(inSlide));
+ if (theFind != m_SlideToIdMap.end())
return theFind->second;
if (inInstance.Valid() == false) {
@@ -748,7 +793,21 @@ struct SComposerSerializerImpl : public IComposerSerializer
theSlideName.append(L"-");
theSlideName.append(GetSlideName(inSlide));
- TCharPtr theNewId = GetId(theSlideName, inSlide, s_SlideToIdMap);
+ TCharPtr theNewId;
+ if (m_PreserveFileIds) {
+ Qt3DSDMInstanceHandle slideInstance = m_SlideCore.GetSlideInstance(inSlide);
+ SValue theValue;
+ if (m_DataCore.GetInstancePropertyValue(
+ slideInstance, m_ObjectDefinitions.m_Slide.m_FileId, theValue)) {
+ TDataStrPtr fileId(get<TDataStrPtr>(theValue));
+ theNewId = fileId->GetData();
+ if (!IsTrivial(theNewId))
+ return AddSlideId(GetId(theNewId, slideInstance), inSlide);
+ return AddSlideId(GetId(theSlideName, slideInstance), inSlide);
+ }
+ }
+
+ theNewId = GetId(theSlideName, inInstance);
return AddSlideId(theNewId, inSlide);
}
@@ -772,6 +831,24 @@ struct SComposerSerializerImpl : public IComposerSerializer
return SLong4();
}
+ QString instanceId(CDataModelHandle inInstance) {
+ SValue theInstanceIdValue;
+ TDataStrPtr theNamePtr;
+ if (!m_DataCore.GetInstancePropertyValue(
+ inInstance, m_ObjectDefinitions.m_Asset.m_FileId, theInstanceIdValue)) {
+ if (!m_DataCore.GetInstancePropertyValue(
+ inInstance, m_ObjectDefinitions.m_Slide.m_FileId, theInstanceIdValue)) {
+ m_DataCore.GetInstancePropertyValue(
+ inInstance, m_ObjectDefinitions.m_Action.m_FileId, theInstanceIdValue);
+ }
+ }
+ theNamePtr = qt3dsdm::get<TDataStrPtr>(theInstanceIdValue);
+ if (theNamePtr && !IsTrivial(theNamePtr->GetData()))
+ return theNamePtr->toQString();
+ return {};
+ }
+
+
void GetAllInstanceGuids()
{
TInstanceHandleList theInstances;
@@ -790,10 +867,23 @@ struct SComposerSerializerImpl : public IComposerSerializer
theInstance, m_ObjectDefinitions.m_Asset.m_FileId, theInstanceIdValue)) {
TDataStrPtr theNamePtr = qt3dsdm::get<TDataStrPtr>(theInstanceIdValue);
if (theNamePtr && !IsTrivial(theNamePtr->GetData())) {
- const wchar_t *theId = GetId(theNamePtr->GetData(), theInstance,
- s_HandleToIdMap);
+ const wchar_t *theId = GetId(theNamePtr->GetData(), theInstance);
AddId(theId, theInstance);
}
+ } else if (m_DataCore.GetInstancePropertyValue(
+ theInstance, m_ObjectDefinitions.m_Slide.m_FileId, theInstanceIdValue)) {
+ TDataStrPtr theNamePtr = qt3dsdm::get<TDataStrPtr>(theInstanceIdValue);
+ if (theNamePtr && !IsTrivial(theNamePtr->GetData())) {
+ const wchar_t *theId = GetId(theNamePtr->GetData(), theInstance);
+ AddSlideId(theId, theInstance);
+ }
+ } else if (m_DataCore.GetInstancePropertyValue(
+ theInstance, m_ObjectDefinitions.m_Action.m_FileId, theInstanceIdValue)) {
+ TDataStrPtr theNamePtr = qt3dsdm::get<TDataStrPtr>(theInstanceIdValue);
+ if (theNamePtr && !IsTrivial(theNamePtr->GetData())) {
+ const wchar_t *theId = GetId(theNamePtr->GetData(), theInstance);
+ AddActionId(theId, theInstance);
+ }
}
}
}
@@ -832,13 +922,13 @@ struct SComposerSerializerImpl : public IComposerSerializer
Qt3DSDMInstanceHandle FindInstanceByGUID(SLong4 theGuid)
{
- if (s_GUIDToHandleMap.size() == 0)
+ if (m_GUIDToHandleMap.size() == 0)
GetAllInstanceGuids();
if (theGuid.Valid() == false)
return 0;
- TGUIDToHandleMap::iterator theIter(s_GUIDToHandleMap.find(theGuid));
- if (theIter != s_GUIDToHandleMap.end())
+ TGUIDToHandleMap::iterator theIter(m_GUIDToHandleMap.find(theGuid));
+ if (theIter != m_GUIDToHandleMap.end())
return theIter->second;
return 0;
}
@@ -941,8 +1031,8 @@ struct SComposerSerializerImpl : public IComposerSerializer
SStringRef theRef(get<SStringRef>(retval));
Qt3DSDMInstanceHandle theRefInstance(GetInstanceById(theRef.m_Id));
if (theRefInstance.Valid()) {
- THandleToGUIDMap::iterator theGuidFind = s_HandleToGUIDMap.find(theRefInstance);
- if (theGuidFind != s_HandleToGUIDMap.end())
+ THandleToGUIDMap::iterator theGuidFind = m_HandleToGUIDMap.find(theRefInstance);
+ if (theGuidFind != m_HandleToGUIDMap.end())
theFinalValue = theGuidFind->second;
}
return theFinalValue;
@@ -1518,6 +1608,7 @@ struct SComposerSerializerImpl : public IComposerSerializer
erase_if(outList, SPropertyMatches(m_ObjectDefinitions.m_Slide.m_ComponentId));
erase_if(outList, SPropertyMatches(m_ObjectDefinitions.m_Named.m_NameProp));
erase_if(outList, SPropertyMatches(m_ObjectDefinitions.m_Typed.m_TypeProp));
+ erase_if(outList, SPropertyMatches(m_ObjectDefinitions.m_Slide.m_FileId));
}
Option<pair<Qt3DSDMPropertyHandle, SValue>> ParseValue(Qt3DSDMInstanceHandle inInstance,
@@ -1790,10 +1881,6 @@ struct SComposerSerializerImpl : public IComposerSerializer
m_NewInstancesToSiblings.insert(std::make_pair(theNewInstance, theSiblingRef + 1));
SLong4 theGuid = GetGuid(theNewInstance, m_ObjectDefinitions.m_Guided.m_GuidProp);
- if (m_PreserveFileIds)
- m_DataCore.SetInstancePropertyValue(theNewInstance,
- m_ObjectDefinitions.m_Asset.m_FileId,
- std::make_shared<CDataStr>(theId));
SetId(theId, theNewInstance);
AddGuid(theGuid, theNewInstance);
@@ -1892,7 +1979,7 @@ struct SComposerSerializerImpl : public IComposerSerializer
Qt3DSDMActionHandle theAction(theMasterActions[theEyeballChanges[idx].first]);
IDOMWriter::Scope __actionScope(inWriter, L"Action");
wstring theRef(L"#");
- bool hadAction = s_ActionToIdMap.find(theAction) != s_ActionToIdMap.end();
+ bool hadAction = m_ActionToIdMap.find(theAction) != m_ActionToIdMap.end();
theRef.append(GetActionId(theAction, inParent, inInstance));
inWriter.Att(L"ref", theRef.c_str());
inWriter.Att("eyeball", theEyeballChanges[idx].second);
@@ -2892,8 +2979,8 @@ struct SComposerSerializerImpl : public IComposerSerializer
}
Qt3DSDMSlideHandle SerializeSlide(qt3dsdm::IDOMReader &inReader,
- const CFilePath &inDocumentDirectory,
- qt3dsdm::Qt3DSDMSlideHandle inMaster, int newIndex) override
+ const CFilePath &inDocumentDirectory,
+ qt3dsdm::Qt3DSDMSlideHandle inMaster, int newIndex) override
{
reset();
m_PreserveFileIds = false;
@@ -2912,38 +2999,14 @@ struct SComposerSerializerImpl : public IComposerSerializer
};
}
-THandleToIdMap SComposerSerializerImpl::s_HandleToIdMap = THandleToIdMap();
-TIdToHandleMap SComposerSerializerImpl::s_IdToHandleMap = TIdToHandleMap();
-TGUIDToHandleMap SComposerSerializerImpl::s_GUIDToHandleMap = TGUIDToHandleMap();
-THandleToGUIDMap SComposerSerializerImpl::s_HandleToGUIDMap = THandleToGUIDMap();
-THandleToIdMap SComposerSerializerImpl::s_ActionToIdMap = THandleToIdMap();
-TIdToHandleMap SComposerSerializerImpl::s_IdToActionMap = TIdToHandleMap();
-THandleToIdMap SComposerSerializerImpl::s_SlideToIdMap = THandleToIdMap();
-TIdToHandleMap SComposerSerializerImpl::s_IdToSlideMap = TIdToHandleMap();
-
-void IComposerSerializer::clear()
-{
- SComposerSerializerImpl::s_HandleToIdMap.clear();
- SComposerSerializerImpl::s_IdToHandleMap.clear();
-
- SComposerSerializerImpl::s_GUIDToHandleMap.clear();
- SComposerSerializerImpl::s_HandleToGUIDMap.clear();
-
- SComposerSerializerImpl::s_ActionToIdMap.clear();
- SComposerSerializerImpl::s_IdToActionMap.clear();
-
- SComposerSerializerImpl::s_SlideToIdMap.clear();
- SComposerSerializerImpl::s_IdToSlideMap.clear();
-}
-
std::shared_ptr<IComposerSerializer> IComposerSerializer::CreateGraphSlideSerializer(
IDataCore &inDataCore, IMetaData &inMetaData, ISlideCore &inSlideCore,
IAnimationCore &inAnimationCore, IActionCore &inActionCore, CGraph &inAssetGraph,
- ISlideSystem &inSlideSystem, IActionSystem &inActionSystem, ISlideGraphCore &inSlideGraphCore,
- SComposerObjectDefinitions &inObjectDefinitions,
- std::shared_ptr<Q3DStudio::IImportFailedHandler> inFailedHandler, IGuideSystem &inGuideSystem,
- qt3ds::render::IPathManager &inPathManager, IPropertySystem &inPropSystem,
- const QString &documentPath)
+ ISlideSystem &inSlideSystem, IActionSystem &inActionSystem,
+ ISlideGraphCore &inSlideGraphCore, SComposerObjectDefinitions &inObjectDefinitions,
+ std::shared_ptr<Q3DStudio::IImportFailedHandler> inFailedHandler,
+ IGuideSystem &inGuideSystem, qt3ds::render::IPathManager &inPathManager,
+ IPropertySystem &inPropSystem, const QString &documentPath)
{
return std::shared_ptr<SComposerSerializerImpl>(
new SComposerSerializerImpl(
diff --git a/src/Authoring/Client/Code/Core/Doc/IComposerSerializer.h b/src/Authoring/Client/Code/Core/Doc/IComposerSerializer.h
index 70d43697..e2882cb8 100644
--- a/src/Authoring/Client/Code/Core/Doc/IComposerSerializer.h
+++ b/src/Authoring/Client/Code/Core/Doc/IComposerSerializer.h
@@ -64,7 +64,6 @@ class IComposerSerializer
protected:
virtual ~IComposerSerializer() {}
public:
- static void clear();
// Empty graph roots means use the actual graph roots in the asset graph
virtual void SerializeScene(qt3dsdm::IDOMWriter &inWriter) = 0;
// Write properties into the active slide until we get to a slide owner, then create new slides.