summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Määttä <antti.maatta@qt.io>2020-05-20 12:36:45 +0300
committerAntti Määttä <antti.maatta@qt.io>2020-05-25 09:35:49 +0300
commitb9b52349d0df29e2eaa30dd13644b9f42d9e4f3e (patch)
treedb7aeef03b0c3c2cac16be2658016a15c2979aec
parent7095f9fc01ce3783c11a6a0de3eeec15ced215c8 (diff)
Fix loading custom material textures with delayed loadingv2.7.0
There was no load point for these textures, so add force load flag, which forces loading textures, which are used by custom materials and effects. Task-number: QT3DS-4114 Change-Id: Ie4447c9a9bbb911d6e2e18ded7a039fb45ba459f Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
-rw-r--r--src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp50
-rw-r--r--src/runtimerender/Qt3DSRenderEffectSystem.cpp8
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderImage.cpp7
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderNode.h9
4 files changed, 49 insertions, 25 deletions
diff --git a/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp b/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp
index cb94534..03c1a01 100644
--- a/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp
+++ b/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp
@@ -1310,8 +1310,8 @@ struct SMaterialSystem : public ICustomMaterialSystem
SImage *image = (*inMaterial.m_imageMaps)[inPropertyName];
if (image) {
if (image->m_ImagePath != *theStrPtr) {
- image->m_ImagePath = *theStrPtr;
- image->m_Flags.SetDirty(true);
+ // Should not happen
+ QT3DS_ASSERT(false);
} else {
IOffscreenRenderManager &offscreenRenderer(
m_Context->GetOffscreenRenderManager());
@@ -2008,10 +2008,11 @@ struct SMaterialSystem : public ICustomMaterialSystem
{
NVConstDataRef<SPropertyDefinition> thePropDefs = inClass.m_Class->GetProperties();
for (QT3DSU32 idx = 0, end = thePropDefs.size(); idx < end; ++idx) {
- if (thePropDefs[idx].m_DataType == NVRenderShaderDataTypes::NVRenderTexture2DPtr) {
+ const SPropertyDefinition &def = thePropDefs[idx];
+ if (def.m_DataType == NVRenderShaderDataTypes::NVRenderTexture2DPtr) {
SImage *pImage = nullptr;
CRegisteredString theStrPtr = *reinterpret_cast<CRegisteredString *>(
- inMaterial.GetDataSectionBegin() + thePropDefs[idx].m_Offset);
+ inMaterial.GetDataSectionBegin() + def.m_Offset);
if (theStrPtr.IsValid()) {
QT3DSU32 index = FindAllocatedImage(theStrPtr);
@@ -2022,46 +2023,51 @@ struct SMaterialSystem : public ICustomMaterialSystem
pImage = m_AllocatedImages[index].second;
}
- switch (thePropDefs[idx].m_TexUsageType) {
+ switch (def.m_TexUsageType) {
case NVRenderTextureTypeValue::Displace:
if (inMaterial.m_DisplacementMap != pImage) {
inMaterial.m_DisplacementMap = pImage;
- inMaterial.m_DisplacementMap->m_ImagePath =
- thePropDefs[idx].m_ImagePath;
+ inMaterial.m_DisplacementMap->m_ImagePath = theStrPtr;
inMaterial.m_DisplacementMap->m_ImageShaderName =
- thePropDefs[idx].m_Name; // this is our name in the shader
+ def.m_Name; // this is our name in the shader
inMaterial.m_DisplacementMap->m_VerticalTilingMode =
- thePropDefs[idx].m_CoordOp;
+ def.m_CoordOp;
inMaterial.m_DisplacementMap->m_HorizontalTilingMode =
- thePropDefs[idx].m_CoordOp;
+ def.m_CoordOp;
+ pImage->m_Flags.SetDirty(true);
+ pImage->m_Flags.SetForceLoad(true);
}
break;
case NVRenderTextureTypeValue::Emissive2:
if (inMaterial.m_EmissiveMap2 != pImage) {
inMaterial.m_EmissiveMap2 = pImage;
- inMaterial.m_EmissiveMap2->m_ImagePath = thePropDefs[idx].m_ImagePath;
+ inMaterial.m_EmissiveMap2->m_ImagePath = theStrPtr;
inMaterial.m_EmissiveMap2->m_ImageShaderName =
- thePropDefs[idx].m_Name; // this is our name in the shader
+ def.m_Name; // this is our name in the shader
inMaterial.m_EmissiveMap2->m_VerticalTilingMode =
- thePropDefs[idx].m_CoordOp;
+ def.m_CoordOp;
inMaterial.m_EmissiveMap2->m_HorizontalTilingMode =
- thePropDefs[idx].m_CoordOp;
+ def.m_CoordOp;
+ pImage->m_Flags.SetDirty(true);
+ pImage->m_Flags.SetForceLoad(true);
}
break;
default:
if (!inMaterial.m_imageMaps)
inMaterial.m_imageMaps = newImageMap(m_CoreContext.GetAllocator());
- if ((*inMaterial.m_imageMaps)[thePropDefs[idx].m_Name] != pImage) {
- (*inMaterial.m_imageMaps)[thePropDefs[idx].m_Name] = pImage;
- pImage->m_ImagePath = thePropDefs[idx].m_ImagePath;
- pImage->m_ImageShaderName = thePropDefs[idx].m_Name;
- pImage->m_VerticalTilingMode = thePropDefs[idx].m_CoordOp;
- pImage->m_HorizontalTilingMode = thePropDefs[idx].m_CoordOp;
+ if ((*inMaterial.m_imageMaps)[def.m_Name] != pImage) {
+ (*inMaterial.m_imageMaps)[def.m_Name] = pImage;
+ pImage->m_ImagePath = theStrPtr;
+ pImage->m_ImageShaderName = def.m_Name;
+ pImage->m_VerticalTilingMode = def.m_CoordOp;
+ pImage->m_HorizontalTilingMode = def.m_CoordOp;
+ pImage->m_Flags.SetDirty(true);
+ pImage->m_Flags.SetForceLoad(true);
}
break;
}
} else {
- switch (thePropDefs[idx].m_TexUsageType) {
+ switch (def.m_TexUsageType) {
case NVRenderTextureTypeValue::Displace:
inMaterial.m_DisplacementMap = nullptr;
break;
@@ -2071,7 +2077,7 @@ struct SMaterialSystem : public ICustomMaterialSystem
default:
if (!inMaterial.m_imageMaps)
inMaterial.m_imageMaps = newImageMap(m_CoreContext.GetAllocator());
- (*inMaterial.m_imageMaps)[thePropDefs[idx].m_Name] = nullptr;
+ (*inMaterial.m_imageMaps)[def.m_Name] = nullptr;
break;
}
}
diff --git a/src/runtimerender/Qt3DSRenderEffectSystem.cpp b/src/runtimerender/Qt3DSRenderEffectSystem.cpp
index faaf4d2..b15d0bc 100644
--- a/src/runtimerender/Qt3DSRenderEffectSystem.cpp
+++ b/src/runtimerender/Qt3DSRenderEffectSystem.cpp
@@ -1079,8 +1079,8 @@ struct SEffectSystem : public IEffectSystem
SImage *image = (*inEffect.m_imageMaps)[inPropertyName];
if (image) {
if (image->m_ImagePath != *theStrPtr) {
- image->m_ImagePath = *theStrPtr;
- image->m_Flags.SetDirty(true);
+ // Should not happen
+ QT3DS_ASSERT(false);
} else {
IOffscreenRenderManager &theOffscreenRenderer(
m_Context->GetOffscreenRenderManager());
@@ -1928,10 +1928,12 @@ struct SEffectSystem : public IEffectSystem
if ((*inEffect.m_imageMaps)[theDefs[idx].m_Name] != pImage) {
(*inEffect.m_imageMaps)[theDefs[idx].m_Name] = pImage;
- pImage->m_ImagePath = theDefs[idx].m_ImagePath;
+ pImage->m_ImagePath = *theStrPtr;
pImage->m_ImageShaderName = theDefs[idx].m_Name;
pImage->m_VerticalTilingMode = theDefs[idx].m_CoordOp;
pImage->m_HorizontalTilingMode = theDefs[idx].m_CoordOp;
+ pImage->m_Flags.SetDirty(true);
+ pImage->m_Flags.SetForceLoad(true);
}
}
} else {
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderImage.cpp b/src/runtimerender/graphobjects/Qt3DSRenderImage.cpp
index 4044976..44e7f12 100644
--- a/src/runtimerender/graphobjects/Qt3DSRenderImage.cpp
+++ b/src/runtimerender/graphobjects/Qt3DSRenderImage.cpp
@@ -112,6 +112,13 @@ bool SImage::ClearDirty(IBufferManager &inBufferManager, IOffscreenRenderManager
newImage.m_Texture = m_LoadedTextureData->m_Texture;
newImage.m_TextureFlags = m_LoadedTextureData->m_TextureFlags;
newImage.m_BSDFMipMap = m_LoadedTextureData->m_BSDFMipMap;
+ } else if (m_Flags.IsForceLoad()) {
+ QSet<QString> ls;
+ ls.insert(QString(m_ImagePath));
+ inBufferManager.loadSet(ls);
+ newImage.m_Texture = m_LoadedTextureData->m_Texture;
+ newImage.m_TextureFlags = m_LoadedTextureData->m_TextureFlags;
+ newImage.m_BSDFMipMap = m_LoadedTextureData->m_BSDFMipMap;
}
replaceTexture = m_TextureData.m_Texture != newImage.m_Texture;
}
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderNode.h b/src/runtimerender/graphobjects/Qt3DSRenderNode.h
index ea0d481..7f5af1e 100644
--- a/src/runtimerender/graphobjects/Qt3DSRenderNode.h
+++ b/src/runtimerender/graphobjects/Qt3DSRenderNode.h
@@ -81,6 +81,7 @@ namespace render {
///mechanism. This can be usefulf or caching purposes.
IgnoreParentTransform = 1 << 13,
LayerEnableDepthPrePass = 1 << 14, ///< True when we render a depth pass before
+ ForceLoad = 1 << 15,
};
};
@@ -178,6 +179,14 @@ namespace render {
{
ClearOrSet(value, NodeFlagValues::LayerEnableDepthPrePass);
}
+ void SetForceLoad(bool value)
+ {
+ ClearOrSet(value, NodeFlagValues::ForceLoad);
+ }
+ bool IsForceLoad()
+ {
+ return this->operator&(NodeFlagValues::ForceLoad);
+ }
};
struct QT3DS_AUTOTEST_EXPORT SNode : public SGraphObject