diff options
-rw-r--r-- | src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp | 13 | ||||
-rw-r--r-- | src/foundation/StringTable.cpp | 6 | ||||
-rw-r--r-- | src/foundation/StringTable.h | 1 |
3 files changed, 19 insertions, 1 deletions
diff --git a/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp b/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp index 7c1700d..6fcb6bc 100644 --- a/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp +++ b/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp @@ -410,9 +410,20 @@ struct SRuntimePropertyParser CRegisteredString theTemp; ParseProperty<Qt3DSRenderDirtyFlags::Unknown>(theTemp); CRegisteredString theNewStr = theTemp; + if (outValue.c_str() != theNewStr.c_str()) { + auto &strTable = m_RenderContext.GetStringTable(); SetDirty<TDirtyType>(); - outValue = theNewStr; + auto handle = strTable.findDynamicHandle(outValue.c_str()); + auto newHandle = strTable.findDynamicHandle(theNewStr.c_str()); + // If the new string is dynamic string, increment the ref count. + // Otherwise use the statically registered string directly. + if (newHandle) + outValue = strTable.HandleToStr(strTable.getDynamicHandle(theNewStr.c_str())); + else + outValue = theNewStr; + // Release ref count from the old string, can call even if the handle is 0. + strTable.releaseDynamicHandle(handle); return true; } return false; diff --git a/src/foundation/StringTable.cpp b/src/foundation/StringTable.cpp index 7833639..0116ac6 100644 --- a/src/foundation/StringTable.cpp +++ b/src/foundation/StringTable.cpp @@ -691,6 +691,12 @@ public: return CStringHandle::ISwearThisHasBeenRegistered(handle); } + QT3DSU32 findDynamicHandle(const QByteArray &str) override + { + QT3DSU32 handle = m_dynamicStringToHandleMap.value(str, 0); + return handle; + } + void releaseDynamicHandle(QT3DSU32 strHandle) override { DynamicString *str = m_dynamicUsedHandlesMap.value(strHandle); diff --git a/src/foundation/StringTable.h b/src/foundation/StringTable.h index 0a25a32..d44d62a 100644 --- a/src/foundation/StringTable.h +++ b/src/foundation/StringTable.h @@ -249,6 +249,7 @@ namespace foundation { virtual CStringHandle GetHandle(Qt3DSBCharPtr str) = 0; virtual CStringHandle getDynamicHandle(const QByteArray &str) = 0; + virtual QT3DSU32 findDynamicHandle(const QByteArray &str) = 0; virtual void releaseDynamicHandle(QT3DSU32 strHandle) = 0; virtual CRegisteredString HandleToStr(QT3DSU32 strHandle) = 0; |