From b9b52349d0df29e2eaa30dd13644b9f42d9e4f3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antti=20M=C3=A4=C3=A4tt=C3=A4?= Date: Wed, 20 May 2020 12:36:45 +0300 Subject: Fix loading custom material textures with delayed loading MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Tomi Korpipää --- .../Qt3DSRenderCustomMaterialSystem.cpp | 50 ++++++++++++---------- src/runtimerender/Qt3DSRenderEffectSystem.cpp | 8 ++-- .../graphobjects/Qt3DSRenderImage.cpp | 7 +++ src/runtimerender/graphobjects/Qt3DSRenderNode.h | 9 ++++ 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 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( - 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 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 -- cgit v1.2.3