summaryrefslogtreecommitdiffstats
diff options
-rw-r--r--src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp13
-rw-r--r--src/foundation/StringTable.cpp6
-rw-r--r--src/foundation/StringTable.h1
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;