diff options
author | Antti Määttä <antti.maatta@qt.io> | 2020-10-12 13:51:44 +0300 |
---|---|---|
committer | Antti Määttä <antti.maatta@qt.io> | 2020-10-14 12:26:25 +0300 |
commit | 8e7f57eaf3cd18265af539fcba88f2c8927fd566 (patch) | |
tree | 08d10cc932d1ebff1576c84ce63a6ae0aeee0c16 | |
parent | 111c7f7ceb828caa091f237bd8ab0808e235f00c (diff) |
Fix custom materials now showing before reload
Use property name instead of image id, since the id is only available
after serialization.
Change-Id: Ie00bac32e61607ce481e5eb74a9e61c2d4fd317e
Reviewed-by: Kaj Grönholm <kaj.gronholm@qt.io>
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
7 files changed, 21 insertions, 38 deletions
diff --git a/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp b/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp index b19cd93..7c1700d 100644 --- a/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp +++ b/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp @@ -1362,7 +1362,7 @@ struct SDynamicObjectTranslatorContext : public STranslatorContext } bool ApplyChanges(SPresentation &inPresentation, IQt3DSRenderContext &inRenderContext, SDynamicGraphObject &inObject, Q3DStudio::TElement &element, - IDynamicObjectSystem &inSystem, int uipVersion) + IDynamicObjectSystem &inSystem) { bool ret = false; IStringTable &strTable = element.GetBelongedPresentation()->GetStringTable(); @@ -1399,10 +1399,10 @@ struct SDynamicObjectTranslatorContext : public STranslatorContext case Q3DStudio::ATTRIBUTETYPE_STRING: { CRegisteredString theStr = strTable.HandleToStr(thePropInfo.second->m_StringHandle); + SImage *img = theItem.getImage(theDefinition.m_Name); if (theStr.c_str()[0] == '#') { - CRegisteredString str = strTable.RegisterStr(theStr.c_str() + 1); - SImage *img = theItem.getImageById(str); - if (!img) { + CRegisteredString imgId = strTable.RegisterStr(theStr.c_str() + 1); + if (!img || img->m_Id != imgId) { Q3DStudio::TElement *theElem = NULL; theElem = element.GetBelongedPresentation()->GetApplication() .GetElementAllocator().FindElementById(theStr); @@ -1414,7 +1414,7 @@ struct SDynamicObjectTranslatorContext : public STranslatorContext } if (img) { dynObj.SetPropertyValue( - theDefinition, str.c_str(), + theDefinition, theDefinition.m_Name, inPresentation.m_PresentationDirectory.c_str(), m_Workspace, inRenderContext.GetStringTable()); } else { @@ -1423,18 +1423,16 @@ struct SDynamicObjectTranslatorContext : public STranslatorContext inPresentation.m_PresentationDirectory.c_str(), m_Workspace, inRenderContext.GetStringTable()); } - } else if (uipVersion < 7) { - // Backwards compatibility for older versions - SImage *img = theItem.getImageByPropertyName(theDefinition.m_Name); + } else { if (img) { img->m_ImagePath = strTable.RegisterStr(theStr.c_str()); img->m_Flags.SetDirty(true); + } else { + dynObj.SetPropertyValue( + theDefinition, {}, + inPresentation.m_PresentationDirectory.c_str(), + m_Workspace, inRenderContext.GetStringTable()); } - } else { - dynObj.SetPropertyValue( - theDefinition, {}, - inPresentation.m_PresentationDirectory.c_str(), - m_Workspace, inRenderContext.GetStringTable()); } } break; default: @@ -1466,8 +1464,7 @@ struct SEffectTranslator : public Qt3DSTranslator SEffect &theItem = *static_cast<SEffect *>(m_RenderObject); bool dirty = static_cast<SDynamicObjectTranslatorContext *>(m_TranslatorContext) ->ApplyChanges(inPresentation, inRenderContext, theItem, Element(), - inRenderContext.GetDynamicObjectSystem(), - runtimePresentation.getUIPVersion()); + inRenderContext.GetDynamicObjectSystem()); theItem.m_Flags.SetDirty(dirty); theItem.SetActive(Element().GetActive(), inRenderContext.GetEffectSystem()); } @@ -1490,8 +1487,7 @@ struct SCustomMaterialTranslator : public Qt3DSTranslator SCustomMaterial &theItem = *static_cast<SCustomMaterial *>(m_RenderObject); bool dirty = static_cast<SDynamicObjectTranslatorContext *>(m_TranslatorContext) ->ApplyChanges(inPresentation, inRenderContext, theItem, Element(), - inRenderContext.GetDynamicObjectSystem(), - runtimePresentation.getUIPVersion()); + inRenderContext.GetDynamicObjectSystem()); theItem.m_Flags.SetDirty(dirty); bool active = m_Element->GetActive(); if (active != theItem.m_Flags.IsActive()) { diff --git a/src/runtime/Qt3DSQmlEngine.cpp b/src/runtime/Qt3DSQmlEngine.cpp index 45fafc0..afe07ed 100644 --- a/src/runtime/Qt3DSQmlEngine.cpp +++ b/src/runtime/Qt3DSQmlEngine.cpp @@ -1673,7 +1673,7 @@ void CQmlEngineImpl::createMaterials(const QString &subPresId, if (!regStr.IsValid()) break; - SImage *img = dynGraphObj->getImageByPropertyName(propDesc.m_Name); + SImage *img = dynGraphObj->getImage(propDesc.m_Name); if (!img) { img = QT3DS_NEW(allocator, qt3ds::render::SImage)(); img->m_Id = strTable.RegisterStr( diff --git a/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp b/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp index 43a7c17..4e090a9 100644 --- a/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp +++ b/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp @@ -1284,7 +1284,7 @@ struct SMaterialSystem : public ICustomMaterialSystem == sizeof(NVRenderTexture2DPtr)>::valid_expression(); CRegisteredString *theStrPtr = reinterpret_cast<CRegisteredString *>(inDataPtr); - SImage *image = inMaterial.getImageById(*theStrPtr); + SImage *image = inMaterial.getImage(*theStrPtr); if (image) { CRegisteredString strU = strTable.RegisterStr( QString::fromLatin1(inPropertyName.c_str()) + "TransformU"); diff --git a/src/runtimerender/Qt3DSRenderEffectSystem.cpp b/src/runtimerender/Qt3DSRenderEffectSystem.cpp index 40f4143..081ad7e 100644 --- a/src/runtimerender/Qt3DSRenderEffectSystem.cpp +++ b/src/runtimerender/Qt3DSRenderEffectSystem.cpp @@ -1058,7 +1058,7 @@ struct SEffectSystem : public IEffectSystem if (inPropertyType == NVRenderShaderDataTypes::NVRenderTexture2DPtr) { CRegisteredString *theStrPtr = reinterpret_cast<CRegisteredString *>(inDataPtr); - SImage *image = inEffect.getImageById(*theStrPtr); + SImage *image = inEffect.getImage(*theStrPtr); if (image && image->m_TextureData.m_Texture) { CRegisteredString strU = m_Context->GetStringTable().RegisterStr( QString::fromLatin1(inPropertyName.c_str()) + "TransformU"); diff --git a/src/runtimerender/Qt3DSRenderUIPLoader.cpp b/src/runtimerender/Qt3DSRenderUIPLoader.cpp index 68ee30f..a63b797 100644 --- a/src/runtimerender/Qt3DSRenderUIPLoader.cpp +++ b/src/runtimerender/Qt3DSRenderUIPLoader.cpp @@ -1090,19 +1090,16 @@ struct SRenderUIPLoader : public IDOMReferenceResolver image = static_cast<SImage *>(result->second); if (image) inDynamicObject.setImage(theDefinition.m_Name, image); - SetDynamicObjectProperty(dynObj, theDefinition, ref); + SetDynamicObjectProperty(dynObj, theDefinition, theDefinition.m_Name); } else if (this->m_uipVersion < 7) { - SImage *img = inDynamicObject.getImageByPropertyName(theDefinition.m_Name); + SImage *img = inDynamicObject.getImage(theDefinition.m_Name); if (!img) { img = QT3DS_NEW(m_PresentationAllocator, SImage); - img->m_Id = m_StrTable.RegisterStr( - QString::fromLatin1(inDynamicObject.m_Id) + QLatin1Char('_') - + QString::fromLatin1(theDefinition.m_Name)); img->m_HorizontalTilingMode = theDefinition.m_CoordOp; img->m_VerticalTilingMode = theDefinition.m_CoordOp; img->m_MagFilter = theDefinition.m_MagFilterOp; img->m_MinFilter = theDefinition.m_MinFilterOp; - SetDynamicObjectProperty(dynObj, theDefinition, img->m_Id); + SetDynamicObjectProperty(dynObj, theDefinition, theDefinition.m_Name); } img->m_ImagePath = theStr; inDynamicObject.setImage(theDefinition.m_Name, img); diff --git a/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.cpp b/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.cpp index 0f7b87f..0dede4b 100644 --- a/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.cpp +++ b/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.cpp @@ -190,18 +190,9 @@ void SDynamicGraphObject::setImage(CRegisteredString propertyName, SImage *image m_images.insert(propertyName, image); } -SImage *SDynamicGraphObject::getImageByPropertyName(CRegisteredString propertyName) +SImage *SDynamicGraphObject::getImage(CRegisteredString propertyName) { if (m_images.contains(propertyName)) return m_images.value(propertyName); return nullptr; } - -SImage *SDynamicGraphObject::getImageById(CRegisteredString imageId) -{ - for (auto *img : qAsConst(m_images)) { - if (img->m_Id == imageId) - return img; - } - return nullptr; -} diff --git a/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.h b/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.h index 95ec27e..7211a15 100644 --- a/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.h +++ b/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.h @@ -126,8 +126,7 @@ namespace render { SDynamicGraphObject(GraphObjectTypes::Enum inType, SDynamicObject *dynamicObject); - SImage *getImageById(CRegisteredString imageId); - SImage *getImageByPropertyName(CRegisteredString propertyName); + SImage *getImage(CRegisteredString propertyName); void setImage(CRegisteredString propertyName, SImage *image); // Generic method used during serialization |