diff options
author | Antti Määttä <antti.maatta@qt.io> | 2020-10-04 16:57:42 +0300 |
---|---|---|
committer | Antti Määttä <antti.maatta@qt.io> | 2020-10-14 12:26:09 +0300 |
commit | 111c7f7ceb828caa091f237bd8ab0808e235f00c (patch) | |
tree | ec8be53df49e4fb6d44b6edb6a558e66272e676a | |
parent | 4ff4abea88534aabdab9201140c7e610f0c709b9 (diff) |
Fix issues in dynamic object texture change
-Add backwards compatibility with older presentations.
-Get dynamic object with instance handle.
-Set empty string to texture if it is not a reference.
-Create images for dynamic custom material textures.
-Add transform to effect textures and fix flipping the uv coordinates.
Task-number: QT3DS-4063
Change-Id: I5c72087e57d51679b321f017367cf93e56a32786
Reviewed-by: Kaj Grönholm <kaj.gronholm@qt.io>
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
-rw-r--r-- | src/dm/systems/Qt3DSDMMetaData.cpp | 53 | ||||
-rw-r--r-- | src/dm/systems/Qt3DSDMMetaData.h | 1 | ||||
-rw-r--r-- | src/engine/Qt3DSRenderRuntimeBinding.cpp | 2 | ||||
-rw-r--r-- | src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp | 39 | ||||
-rw-r--r-- | src/runtime/Qt3DSApplication.cpp | 5 | ||||
-rw-r--r-- | src/runtime/Qt3DSPresentation.h | 10 | ||||
-rw-r--r-- | src/runtime/Qt3DSQmlEngine.cpp | 18 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp | 8 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderDynamicObjectSystem.cpp | 56 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderEffectSystem.cpp | 21 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderUIPLoader.cpp | 26 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderUIPLoader.h | 2 | ||||
-rw-r--r-- | src/uipparser/Qt3DSIPresentation.h | 3 | ||||
-rw-r--r-- | src/uipparser/Qt3DSUIPParser.h | 2 | ||||
-rw-r--r-- | src/uipparser/Qt3DSUIPParserImpl.cpp | 12 | ||||
-rw-r--r-- | src/uipparser/Qt3DSUIPParserImpl.h | 3 |
16 files changed, 201 insertions, 60 deletions
diff --git a/src/dm/systems/Qt3DSDMMetaData.cpp b/src/dm/systems/Qt3DSDMMetaData.cpp index 8096385..2af3f76 100644 --- a/src/dm/systems/Qt3DSDMMetaData.cpp +++ b/src/dm/systems/Qt3DSDMMetaData.cpp @@ -431,16 +431,24 @@ private: public: eastl::vector<qt3ds::render::dynamic::SCommand *> m_EffectCommands; + SMetaDataEffect m_effect; + void ClearEffectCommands() { for (QT3DSU32 idx = 0, end = m_EnumValueNames.size(); idx < end; ++idx) free(m_EffectCommands[idx]); m_EffectCommands.clear(); } - SMetaDataEffect ToEffect() const + SMetaDataEffect ToEffect() + { + m_effect = SMetaDataEffect(m_Name, VecToCRef(m_Shaders), VecToCRef(m_Properties), + VecToCRef(m_EffectCommands)); + return m_effect; + } + SMetaDataEffect *ToEffectPtr() { - return SMetaDataEffect(m_Name, VecToCRef(m_Shaders), VecToCRef(m_Properties), - VecToCRef(m_EffectCommands)); + ToEffect(); + return &m_effect; } }; @@ -458,6 +466,8 @@ public: QT3DSU32 m_ShaderKey; ///< What does this shader contain ( e.g. specular, diffuse, ...) QT3DSU32 m_LayerCount; ///< How much layers does this material have + SMetaDataCustomMaterial m_customMaterial; + void ClearEffectCommands() { for (QT3DSU32 idx = 0, end = m_EnumValueNames.size(); idx < end; ++idx) { @@ -467,11 +477,18 @@ public: m_CustomerMaterialCommands.clear(); } - SMetaDataCustomMaterial ToMaterial() const + SMetaDataCustomMaterial ToMaterial() + { + m_customMaterial = + SMetaDataCustomMaterial(m_Name, VecToCRef(m_Shaders), VecToCRef(m_Properties), + VecToCRef(m_CustomerMaterialCommands), m_HasTransparency, + m_HasRefraction, m_AlwaysDirty, m_ShaderKey, m_LayerCount); + return m_customMaterial; + } + SMetaDataCustomMaterial *ToMaterialPtr() { - return SMetaDataCustomMaterial(m_Name, VecToCRef(m_Shaders), VecToCRef(m_Properties), - VecToCRef(m_CustomerMaterialCommands), m_HasTransparency, - m_HasRefraction, m_AlwaysDirty, m_ShaderKey, m_LayerCount); + ToMaterial(); + return &m_customMaterial; } }; @@ -529,6 +546,7 @@ public: TStrInstanceMap m_CanonicalTypeToInstances; TInstanceStrMap m_InstancesToCanonicalType; TDerivationMap m_DerivationMap; + TInstanceStrMap m_InstanceToDynamicObject; TCategoryMap m_Categories; TNameCategoryMap m_NameToCategories; @@ -3483,6 +3501,7 @@ public: using namespace qt3ds::render::dynamic; std::pair<TEffectMap::iterator, bool> theInserter = m_EffectMap.insert(std::make_pair(Intern(inObjectName), SMetaDataEffectImpl())); + m_InstanceToDynamicObject.insert(make_pair(inInstance, Intern(inObjectName))); /*if ( inStream.MoveToFirstChild( "Effect" ) == false ) { outWarnings.push_back( SMetaDataLoadWarning( MetaDataLoadWarningType::Unknown, @@ -3897,6 +3916,7 @@ public: // Remove the previous custom material entry so that the new shader code is used m_CustomMaterials.erase(Intern(inObjectName)); + m_InstanceToDynamicObject.insert(make_pair(inInstance, Intern(inObjectName))); std::pair<TCustomMaterialMap::iterator, bool> theInserter = m_CustomMaterials.insert( std::make_pair(Intern(inObjectName), SMetaDataCustomMaterialImpl())); @@ -4202,6 +4222,25 @@ public: return Empty(); } + virtual SMetaDataDynamicObject *GetDynamicObjectByInstance(Qt3DSDMInstanceHandle inInstance) + { + auto iter = m_InstanceToDynamicObject.find(inInstance); + if (iter != m_InstanceToDynamicObject.end()) { + TCharPtr theName(iter->second); + auto matIter = m_CustomMaterials.find(theName); + if (matIter != m_CustomMaterials.end()) { + SMetaDataCustomMaterialImpl &matImpl = matIter->second; + return matImpl.ToMaterialPtr(); + } + auto effectIter = m_EffectMap.find(theName); + if (effectIter != m_EffectMap.end()) { + SMetaDataEffectImpl &effectImpl = effectIter->second; + return effectImpl.ToEffectPtr(); + } + } + return nullptr; + } + //////////////////////////////////////////////////////////////////////////////////// // Undo/Redo void SetConsumer(TTransactionConsumerPtr inConsumer) override { m_Consumer = inConsumer; } diff --git a/src/dm/systems/Qt3DSDMMetaData.h b/src/dm/systems/Qt3DSDMMetaData.h index a35002b..e81223c 100644 --- a/src/dm/systems/Qt3DSDMMetaData.h +++ b/src/dm/systems/Qt3DSDMMetaData.h @@ -363,6 +363,7 @@ public: qt3ds::foundation::IInStream &inStream) = 0; virtual Option<SMetaDataCustomMaterial> GetMaterialBySourcePath(const char *inSourcePath) = 0; virtual Option<SMetaDataCustomMaterial> GetMaterialByName(const char *inName) = 0; + virtual SMetaDataDynamicObject *GetDynamicObjectByInstance(Qt3DSDMInstanceHandle inInstance) = 0; //////////////////////////////////////////////////////////////////////////////////// // Undo/Redo diff --git a/src/engine/Qt3DSRenderRuntimeBinding.cpp b/src/engine/Qt3DSRenderRuntimeBinding.cpp index 4499ade..db58ed4 100644 --- a/src/engine/Qt3DSRenderRuntimeBinding.cpp +++ b/src/engine/Qt3DSRenderRuntimeBinding.cpp @@ -922,7 +922,7 @@ struct Qt3DSRenderSceneManager : public Q3DStudio::ISceneManager, m_Context->m_Context->GetCustomMaterialSystem(), m_Context->m_Context->GetDynamicObjectSystem(), m_Context->m_Context->GetPathManager(), &theResolver, - variantConfig, false); + variantConfig, false, inPresentation->getUIPVersion()); if (!theScene->m_Presentation) { QT3DS_ASSERT(false); return nullptr; diff --git a/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp b/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp index 03ad243..b19cd93 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) + IDynamicObjectSystem &inSystem, int uipVersion) { bool ret = false; IStringTable &strTable = element.GetBelongedPresentation()->GetStringTable(); @@ -1406,16 +1406,35 @@ struct SDynamicObjectTranslatorContext : public STranslatorContext Q3DStudio::TElement *theElem = NULL; theElem = element.GetBelongedPresentation()->GetApplication() .GetElementAllocator().FindElementById(theStr); - auto *translator = static_cast<Qt3DSTranslator *>(theElem->GetAssociation()); + auto *translator = static_cast<Qt3DSTranslator *>( + theElem->GetAssociation()); img = static_cast<SImage *>(&translator->RenderObject()); if (img) theItem.setImage(theDefinition.m_Name, img); } if (img) { - dynObj.SetPropertyValue(theDefinition, str.c_str(), - inPresentation.m_PresentationDirectory.c_str(), - m_Workspace, inRenderContext.GetStringTable()); + dynObj.SetPropertyValue( + theDefinition, str.c_str(), + inPresentation.m_PresentationDirectory.c_str(), + m_Workspace, inRenderContext.GetStringTable()); + } else { + dynObj.SetPropertyValue( + theDefinition, {}, + 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); + 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()); } } break; default: @@ -1441,13 +1460,14 @@ struct SEffectTranslator : public Qt3DSTranslator } void OnElementChanged(SPresentation &inPresentation, IQt3DSRenderContext &inRenderContext, - Q3DStudio::IPresentation &) + Q3DStudio::IPresentation &runtimePresentation) { SRuntimePropertyParser theParser(inPresentation, inRenderContext, *m_Element); SEffect &theItem = *static_cast<SEffect *>(m_RenderObject); bool dirty = static_cast<SDynamicObjectTranslatorContext *>(m_TranslatorContext) ->ApplyChanges(inPresentation, inRenderContext, theItem, Element(), - inRenderContext.GetDynamicObjectSystem()); + inRenderContext.GetDynamicObjectSystem(), + runtimePresentation.getUIPVersion()); theItem.m_Flags.SetDirty(dirty); theItem.SetActive(Element().GetActive(), inRenderContext.GetEffectSystem()); } @@ -1464,13 +1484,14 @@ struct SCustomMaterialTranslator : public Qt3DSTranslator } void OnElementChanged(SPresentation &inPresentation, IQt3DSRenderContext &inRenderContext, - Q3DStudio::IPresentation &) + Q3DStudio::IPresentation &runtimePresentation) { SRuntimePropertyParser theParser(inPresentation, inRenderContext, *m_Element); SCustomMaterial &theItem = *static_cast<SCustomMaterial *>(m_RenderObject); bool dirty = static_cast<SDynamicObjectTranslatorContext *>(m_TranslatorContext) ->ApplyChanges(inPresentation, inRenderContext, theItem, Element(), - inRenderContext.GetDynamicObjectSystem()); + inRenderContext.GetDynamicObjectSystem(), + runtimePresentation.getUIPVersion()); theItem.m_Flags.SetDirty(dirty); bool active = m_Element->GetActive(); if (active != theItem.m_Flags.IsActive()) { diff --git a/src/runtime/Qt3DSApplication.cpp b/src/runtime/Qt3DSApplication.cpp index 4c88335..ffcfa59 100644 --- a/src/runtime/Qt3DSApplication.cpp +++ b/src/runtime/Qt3DSApplication.cpp @@ -1367,10 +1367,13 @@ struct SApp : public IApplication this); inAsset.m_Presentation = thePresentation; thePresentation->SetFilePath(theFile.c_str()); + int uipVersion = 0; NVScopedReleasable<IUIPParser> theUIPParser(IUIPParser::Create( theFile.c_str(), *m_MetaData, m_CoreFactory->GetInputStreamFactory(), - m_CoreFactory->GetStringTable())); + m_CoreFactory->GetStringTable(), + uipVersion)); + thePresentation->setUIPVersion(uipVersion); Q3DStudio::IScene *newScene = nullptr; if (theUIPParser->Load(*thePresentation, inExternalReferences, initInRenderThread)) { // Load the scene graph portion of the scene. diff --git a/src/runtime/Qt3DSPresentation.h b/src/runtime/Qt3DSPresentation.h index 5917d7b..8bb66ae 100644 --- a/src/runtime/Qt3DSPresentation.h +++ b/src/runtime/Qt3DSPresentation.h @@ -108,6 +108,7 @@ protected: TTimeUnit m_Offset; TTimeUnit m_LocalTime; TTimeUnit m_PreviousGlobalTime; + int m_UIPVersion; bool m_Paused; bool m_OffsetInvalid; bool m_Active; @@ -220,6 +221,15 @@ public: // Full file paths QString GetFilePath() const override; QString getProjectPath() const override; + void setUIPVersion(int version) override + { + m_UIPVersion = version; + } + int getUIPVersion() const override + { + return m_UIPVersion; + } + private: // Disabled Copy Construction CPresentation(CPresentation &); CPresentation &operator=(const CPresentation &); diff --git a/src/runtime/Qt3DSQmlEngine.cpp b/src/runtime/Qt3DSQmlEngine.cpp index 0bbc2a3..45fafc0 100644 --- a/src/runtime/Qt3DSQmlEngine.cpp +++ b/src/runtime/Qt3DSQmlEngine.cpp @@ -1670,7 +1670,23 @@ void CQmlEngineImpl::createMaterials(const QString &subPresId, case qt3ds::render::NVRenderShaderDataTypes::NVRenderImage2DPtr: { CRegisteredString regStr; regStr = strTable.RegisterStr(propValStr); - setDynamicObjectProperty(*dynObj, propDesc, regStr); + if (!regStr.IsValid()) + break; + + SImage *img = dynGraphObj->getImageByPropertyName(propDesc.m_Name); + if (!img) { + img = QT3DS_NEW(allocator, qt3ds::render::SImage)(); + img->m_Id = strTable.RegisterStr( + QString::fromLatin1(newMatId.c_str()) + QLatin1Char('_') + + QString::fromLatin1(propDesc.m_Name.c_str())); + setDynamicObjectProperty(*dynObj, propDesc, img->m_Id); + dynGraphObj->setImage(propDesc.m_Name, img); + } + img->m_ImagePath = regStr; + img->m_MagFilter = propDesc.m_MagFilterOp; + img->m_MinFilter = propDesc.m_MinFilterOp; + img->m_HorizontalTilingMode = img->m_VerticalTilingMode = propDesc.m_CoordOp; + img->m_Flags.SetDirty(true); break; } default: diff --git a/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp b/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp index 62ff5c6..43a7c17 100644 --- a/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp +++ b/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp @@ -1295,7 +1295,13 @@ struct SMaterialSystem : public ICustomMaterialSystem qt3ds::render::NVRenderShaderConstantBase *transformV = inShader.GetShaderConstant(strV); image->CalculateTextureTransform(); - const QT3DSMat44 &textureTransform = image->m_TextureTransform; + QT3DSMat44 textureTransform = image->m_TextureTransform; + if (image->m_TextureData.m_TextureFlags.IsInvertUVCoords()) { + QT3DSMat44 invertCoordsMat(QT3DSMat44::createIdentity()); + invertCoordsMat.scale(QT3DSVec4(1.0f, -1.0f, 1.0f, 1.0f)); + invertCoordsMat.setPosition(QT3DSVec3(0.0f, 1.0f, 0.0f)); + textureTransform = textureTransform * invertCoordsMat; + } const QT3DSF32 *dataPtr(textureTransform.front()); inShader.SetPropertyValue(transformU, QT3DSVec3(dataPtr[0], dataPtr[4], dataPtr[12])); diff --git a/src/runtimerender/Qt3DSRenderDynamicObjectSystem.cpp b/src/runtimerender/Qt3DSRenderDynamicObjectSystem.cpp index 9f867b3..fdab6d4 100644 --- a/src/runtimerender/Qt3DSRenderDynamicObjectSystem.cpp +++ b/src/runtimerender/Qt3DSRenderDynamicObjectSystem.cpp @@ -1254,9 +1254,13 @@ struct SDynamicObjectSystemImpl : public IDynamicObjectSystem // uniform sampler2D propName; \ // uniform int flag##propName; \ // uniform vec4 propName##Info; \ + // uniform vec3 propName##TransformU; \ + // uniform vec3 propName##TransformV; \ // vec4 texture2D_##propName(vec2 uv) \ // { \ - // return GetTextureValue( propName, uv, propName##Info.z ); \ + // vec3 tuv(uv, 1.0); \ + // vec2 uv2(dot(propName##TransformU, tuv), dot(propName##TransformV, tuv)); \ + // return GetTextureValue( propName, uv2, propName##Info.z ); \ // } // // #define SNAPPER_SAMPLER2DWITHDEFAULT(propName, propNiceName, texFilter, texWrap, defaultPath, showUI ) \ @@ -1272,22 +1276,31 @@ struct SDynamicObjectSystemImpl : public IDynamicObjectSystem QString snapperSamplerCube = QStringLiteral("SNAPPER_SAMPLERCUBE("); QString endingBracket = QStringLiteral(")"); + const auto insertSnapperStr = [](const QString ¶meter) { + QString insertStr; + QTextStream stream(&insertStr); + stream << "uniform sampler2D " << parameter << ";\n"; + stream << "uniform int flag" << parameter << ";\n"; + stream << "uniform vec4 " << parameter << "Info;\n"; + stream << "uniform vec3 " << parameter << "TransformU;\n"; + stream << "uniform vec3 " << parameter << "TransformV;\n"; + stream << "vec2 transformCoord" << parameter << "(vec2 uv) { return vec2(dot(" + << parameter << "TransformU, vec3(uv, 1.0)), dot(" + << parameter << "TransformV, vec3(uv, 1.0))); }\n"; + stream << "vec4 texture2D_" << parameter << "(vec2 uv) " + << "{ return GetTextureValue( " << parameter + << ", transformCoord" << parameter << "(uv), " + << parameter << "Info.z ); }\n"; + return insertStr; + }; + while ((beginIndex = str.indexOf(snapperSampler, beginIndex)) >= 0) { int endIndex = str.indexOf(endingBracket, beginIndex); const QStringList list = getParameters(str, beginIndex + snapperSampler.length(), endIndex); str.remove(beginIndex, endIndex - beginIndex + 1); - if (list.size() == 5) { - QString insertStr; - QTextStream stream(&insertStr); - stream << "uniform sampler2D " << list[0] << ";\n"; - stream << "uniform int flag" << list[0] << ";\n"; - stream << "vec4 " << list[0] << "Info;\n"; - stream << "vec4 texture2D_" << list[0] << "(vec2 uv) " - << "{ return GetTextureValue( " << list[0] << ", uv, " - << list[0] <<"Info.z ); }\n"; - str.insert(beginIndex, insertStr); - } + if (list.size() == 5) + str.insert(beginIndex, insertSnapperStr(list[0])); } beginIndex = 0; while ((beginIndex = str.indexOf(snapperSamplerDefault, beginIndex)) >= 0) { @@ -1295,17 +1308,8 @@ struct SDynamicObjectSystemImpl : public IDynamicObjectSystem const QStringList list = getParameters(str, beginIndex + snapperSamplerDefault.length(), endIndex); str.remove(beginIndex, endIndex - beginIndex + 1); - if (list.size() == 5) { - QString insertStr; - QTextStream stream(&insertStr); - stream << "uniform sampler2D " << list[0] << ";\n"; - stream << "uniform int flag" << list[0] << ";\n"; - stream << "vec4 " << list[0] << "Info;\n"; - stream << "vec4 texture2D_" << list[0] << "(vec2 uv) " - << "{ return GetTextureValue( " << list[0] << ", uv, " - << list[0] <<"Info.z ); }\n"; - str.insert(beginIndex, insertStr); - } + if (list.size() == 5) + str.insert(beginIndex, insertSnapperStr(list[0])); } beginIndex = 0; while ((beginIndex = str.indexOf(snapperSamplerCube, beginIndex)) >= 0) { @@ -1372,11 +1376,9 @@ struct SDynamicObjectSystemImpl : public IDynamicObjectSystem if (strstr(inProgramSource, "SNAPPER_SAMPLER")) { QString programSource(inProgramSource); insertSnapperDirectives(programSource); - QByteArray data = programSource.toLatin1(); - const char *source = data.constData(); - m_VertShader.append(source); - m_FragShader.append(source); + m_VertShader.append(programSource); + m_FragShader.append(programSource); } else { m_VertShader.append(inProgramSource); m_FragShader.append(inProgramSource); diff --git a/src/runtimerender/Qt3DSRenderEffectSystem.cpp b/src/runtimerender/Qt3DSRenderEffectSystem.cpp index 6ece380..40f4143 100644 --- a/src/runtimerender/Qt3DSRenderEffectSystem.cpp +++ b/src/runtimerender/Qt3DSRenderEffectSystem.cpp @@ -1060,6 +1060,27 @@ struct SEffectSystem : public IEffectSystem SImage *image = inEffect.getImageById(*theStrPtr); if (image && image->m_TextureData.m_Texture) { + CRegisteredString strU = m_Context->GetStringTable().RegisterStr( + QString::fromLatin1(inPropertyName.c_str()) + "TransformU"); + CRegisteredString strV = m_Context->GetStringTable().RegisterStr( + QString::fromLatin1(inPropertyName.c_str()) + "TransformV"); + qt3ds::render::NVRenderShaderConstantBase *transformU = + inShader.GetShaderConstant(strU); + qt3ds::render::NVRenderShaderConstantBase *transformV = + inShader.GetShaderConstant(strV); + image->CalculateTextureTransform(); + QT3DSMat44 textureTransform = image->m_TextureTransform; + if (image->m_TextureData.m_TextureFlags.IsInvertUVCoords()) { + QT3DSMat44 invertCoordsMat(QT3DSMat44::createIdentity()); + invertCoordsMat.scale(QT3DSVec4(1.0f, -1.0f, 1.0f, 1.0f)); + invertCoordsMat.setPosition(QT3DSVec3(0.0f, 1.0f, 0.0f)); + textureTransform = textureTransform * invertCoordsMat; + } + const QT3DSF32 *dataPtr(textureTransform.front()); + inShader.SetPropertyValue(transformU, + QT3DSVec3(dataPtr[0], dataPtr[4], dataPtr[12])); + inShader.SetPropertyValue(transformV, + QT3DSVec3(dataPtr[1], dataPtr[5], dataPtr[13])); auto *texture = image->m_TextureData.m_Texture; texture->SetTextureWrapS(image->m_HorizontalTilingMode); texture->SetTextureWrapT(image->m_VerticalTilingMode); diff --git a/src/runtimerender/Qt3DSRenderUIPLoader.cpp b/src/runtimerender/Qt3DSRenderUIPLoader.cpp index 8d26350..68ee30f 100644 --- a/src/runtimerender/Qt3DSRenderUIPLoader.cpp +++ b/src/runtimerender/Qt3DSRenderUIPLoader.cpp @@ -518,6 +518,7 @@ struct SRenderUIPLoader : public IDOMReferenceResolver MemoryBuffer<RawAllocator> m_ValueBuffer; TIdPathAnchorIndexMap m_AnchorIdToPathAndAnchorIndexMap; const Q3DSVariantConfig &m_variantConfig; + int m_uipVersion; SRenderUIPLoader(qt3dsdm::IDOMReader &inReader, const char8_t *inFullPathToPresentationFile, Q3DStudio::IRuntimeMetaData &inMetaData, IStringTable &inStrTable @@ -535,7 +536,8 @@ struct SRenderUIPLoader : public IDOMReferenceResolver qt3ds::render::ICustomMaterialSystem &inCMS, qt3ds::render::IDynamicObjectSystem &inDynamicSystem, qt3ds::render::IPathManager &inPathManager, IUIPReferenceResolver *inResolver, - const Q3DSVariantConfig &variantConfig) + const Q3DSVariantConfig &variantConfig, + int uipVersion) : m_Reader(inReader) , m_MetaData(inMetaData) , m_StrTable(inStrTable) @@ -553,6 +555,7 @@ struct SRenderUIPLoader : public IDOMReferenceResolver , m_PathManager(inPathManager) , m_ReferenceResolver(inResolver) , m_variantConfig(variantConfig) + , m_uipVersion(uipVersion) { std::string presentationFile = inFullPathToPresentationFile; std::string::size_type pos = presentationFile.find_last_of("\\/"); @@ -1088,12 +1091,21 @@ struct SRenderUIPLoader : public IDOMReferenceResolver if (image) inDynamicObject.setImage(theDefinition.m_Name, image); SetDynamicObjectProperty(dynObj, theDefinition, ref); - } else { + } else if (this->m_uipVersion < 7) { SImage *img = inDynamicObject.getImageByPropertyName(theDefinition.m_Name); - if (img) { - img->m_ImagePath = theStr; - img->m_Flags.SetDirty(true); + 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); } + img->m_ImagePath = theStr; + inDynamicObject.setImage(theDefinition.m_Name, img); } } } break; @@ -1932,12 +1944,12 @@ SPresentation *qt3ds::render::IUIPLoader::LoadUIPFile( const char8_t *inPresentationDir, IRenderPluginManager &inPluginManager, ICustomMaterialSystem &inCMS, IDynamicObjectSystem &inDynamicSystem, qt3ds::render::IPathManager &inPathManager, IUIPReferenceResolver *inResolver, - const Q3DSVariantConfig &variantConfig, bool inSetValuesFromSlides) + const Q3DSVariantConfig &variantConfig, bool inSetValuesFromSlides, int uipVersion) { SRenderUIPLoader theLoader(inReader, inFullPathToPresentationFile, inMetaData, inStrTable, inFoundation, inPresentationAllocator, ioObjectMap, inBufferManager, inEffectSystem, inPresentationDir, inPluginManager, inCMS, - inDynamicSystem, inPathManager, inResolver, variantConfig); + inDynamicSystem, inPathManager, inResolver, variantConfig, uipVersion); return theLoader.Load(inSetValuesFromSlides); } using namespace qt3dsdm; diff --git a/src/runtimerender/Qt3DSRenderUIPLoader.h b/src/runtimerender/Qt3DSRenderUIPLoader.h index 2b70c68..b07d0c3 100644 --- a/src/runtimerender/Qt3DSRenderUIPLoader.h +++ b/src/runtimerender/Qt3DSRenderUIPLoader.h @@ -113,7 +113,7 @@ namespace render { // Useful for quick testing, sort of equivalent to showing the first frame // of a given presentation , - bool setValuesFromSlides = false); + bool setValuesFromSlides, int uipVersion); static void CreateEffectClassFromMetaEffect(CRegisteredString inEffectName, NVFoundationBase &inFoundation, diff --git a/src/uipparser/Qt3DSIPresentation.h b/src/uipparser/Qt3DSIPresentation.h index a9d3644..982d4c7 100644 --- a/src/uipparser/Qt3DSIPresentation.h +++ b/src/uipparser/Qt3DSIPresentation.h @@ -153,6 +153,9 @@ public: // Event Callbacks public: // FrameData access virtual CPresentationFrameData &GetFrameData() = 0; + + virtual void setUIPVersion(int version) = 0; + virtual int getUIPVersion() const = 0; }; } // namespace Q3DStudio diff --git a/src/uipparser/Qt3DSUIPParser.h b/src/uipparser/Qt3DSUIPParser.h index 1bbf7ba..c740609 100644 --- a/src/uipparser/Qt3DSUIPParser.h +++ b/src/uipparser/Qt3DSUIPParser.h @@ -152,7 +152,7 @@ public: // Parse UIP file // Creation function static IUIPParser &Create(const QString &inFileName, IRuntimeMetaData &inMetaData, qt3ds::render::IInputStreamFactory &inStreamFactory, - qt3ds::foundation::IStringTable &inStrTable); + qt3ds::foundation::IStringTable &inStrTable, int &uipVersion); }; } // namespace Q3DStudio diff --git a/src/uipparser/Qt3DSUIPParserImpl.cpp b/src/uipparser/Qt3DSUIPParserImpl.cpp index e9f8104..923ff26 100644 --- a/src/uipparser/Qt3DSUIPParserImpl.cpp +++ b/src/uipparser/Qt3DSUIPParserImpl.cpp @@ -470,7 +470,8 @@ SParseSlideActionEntry *SParseSlideManager::FindAction(SParseSlide &inSlide, */ CUIPParserImpl::CUIPParserImpl(const QString &inFileName, IRuntimeMetaData &inMetaData, IInputStreamFactory &inFactory, - qt3ds::foundation::IStringTable &inStringTable) + qt3ds::foundation::IStringTable &inStringTable, + int &uipVersion) : m_MetaData(inMetaData) , m_InputStreamFactory(inFactory) , m_ParseElementManager(inMetaData, inStringTable) @@ -495,6 +496,9 @@ CUIPParserImpl::CUIPParserImpl(const QString &inFileName, IRuntimeMetaData &inMe qCCritical(qt3ds::INVALID_OPERATION) << "Invalid UIP file: " << inFileName.toLatin1().constData(); } + int version = 0; + if (m_DOMReader->Att("version", version)) + uipVersion = version; } // Create Helper class @@ -2773,9 +2777,11 @@ IRuntimeMetaData &CUIPParserImpl::GetMetaData() IUIPParser &IUIPParser::Create(const QString &inFileName, IRuntimeMetaData &inMetaData, IInputStreamFactory &inFactory, - qt3ds::foundation::IStringTable &inStrTable) + qt3ds::foundation::IStringTable &inStrTable, + int &uipVersion) { - CUIPParserImpl &retval = *new CUIPParserImpl(inFileName, inMetaData, inFactory, inStrTable); + CUIPParserImpl &retval = *new CUIPParserImpl(inFileName, inMetaData, inFactory, + inStrTable, uipVersion); return retval; } } diff --git a/src/uipparser/Qt3DSUIPParserImpl.h b/src/uipparser/Qt3DSUIPParserImpl.h index 939ba35..aef3d10 100644 --- a/src/uipparser/Qt3DSUIPParserImpl.h +++ b/src/uipparser/Qt3DSUIPParserImpl.h @@ -527,7 +527,8 @@ protected: //============================================================================== public: // Construction CUIPParserImpl(const QString &inFileName, IRuntimeMetaData &inMetaData, - IInputStreamFactory &inFactory, qt3ds::foundation::IStringTable &inStringTable); + IInputStreamFactory &inFactory, qt3ds::foundation::IStringTable &inStringTable, + int &uipVersion); virtual ~CUIPParserImpl(); public: // Parse UIP file |