diff options
author | Antti Määttä <antti.maatta@qt.io> | 2020-05-20 12:36:45 +0300 |
---|---|---|
committer | Antti Määttä <antti.maatta@qt.io> | 2020-05-25 09:35:49 +0300 |
commit | b9b52349d0df29e2eaa30dd13644b9f42d9e4f3e (patch) | |
tree | db7aeef03b0c3c2cac16be2658016a15c2979aec | |
parent | 7095f9fc01ce3783c11a6a0de3eeec15ced215c8 (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>
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 |