summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Määttä <antti.maatta@qt.io>2020-10-04 16:57:42 +0300
committerAntti Määttä <antti.maatta@qt.io>2020-10-14 12:26:09 +0300
commit111c7f7ceb828caa091f237bd8ab0808e235f00c (patch)
treeec8be53df49e4fb6d44b6edb6a558e66272e676a
parent4ff4abea88534aabdab9201140c7e610f0c709b9 (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.cpp53
-rw-r--r--src/dm/systems/Qt3DSDMMetaData.h1
-rw-r--r--src/engine/Qt3DSRenderRuntimeBinding.cpp2
-rw-r--r--src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp39
-rw-r--r--src/runtime/Qt3DSApplication.cpp5
-rw-r--r--src/runtime/Qt3DSPresentation.h10
-rw-r--r--src/runtime/Qt3DSQmlEngine.cpp18
-rw-r--r--src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp8
-rw-r--r--src/runtimerender/Qt3DSRenderDynamicObjectSystem.cpp56
-rw-r--r--src/runtimerender/Qt3DSRenderEffectSystem.cpp21
-rw-r--r--src/runtimerender/Qt3DSRenderUIPLoader.cpp26
-rw-r--r--src/runtimerender/Qt3DSRenderUIPLoader.h2
-rw-r--r--src/uipparser/Qt3DSIPresentation.h3
-rw-r--r--src/uipparser/Qt3DSUIPParser.h2
-rw-r--r--src/uipparser/Qt3DSUIPParserImpl.cpp12
-rw-r--r--src/uipparser/Qt3DSUIPParserImpl.h3
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 &parameter) {
+ 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