From 4ff4abea88534aabdab9201140c7e610f0c709b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antti=20M=C3=A4=C3=A4tt=C3=A4?= Date: Sun, 4 Oct 2020 13:22:50 +0300 Subject: Implement image filtering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is needed to support custom material texture filter modes when they are being implemented using images. Task-number: QT3DS-4183 Change-Id: I9f16a9347379872a8f04ebdd08785df345939a70 Reviewed-by: Kaj Grönholm Reviewed-by: Tomi Korpipää --- res/DataModelMetadata/en-us/MetaData.xml | 2 ++ src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp | 2 ++ src/dm/systems/Qt3DSDMComposerTypeDefinitions.h | 2 ++ .../Qt3DSRenderRuntimeBindingImplTranslation.cpp | 2 ++ src/runtime/Qt3DSAttributeHashes.cpp | 2 ++ src/runtime/Qt3DSAttributeHashes.h | 2 ++ src/runtime/Qt3DSAttributeHashes.txt | 2 ++ .../Qt3DSRenderCustomMaterialShaderGenerator.cpp | 6 ++++ .../Qt3DSRenderCustomMaterialSystem.cpp | 4 +-- .../Qt3DSRenderDefaultMaterialShaderGenerator.cpp | 6 ++++ src/runtimerender/Qt3DSRenderEffectSystem.cpp | 4 +-- src/runtimerender/Qt3DSRenderUIPLoader.cpp | 2 ++ .../Qt3DSRenderUIPSharedTranslation.cpp | 38 ++++++++++++++++++++++ .../Qt3DSRenderUIPSharedTranslation.h | 16 ++++++++- .../graphobjects/Qt3DSRenderImage.cpp | 2 ++ src/runtimerender/graphobjects/Qt3DSRenderImage.h | 2 ++ 16 files changed, 89 insertions(+), 5 deletions(-) diff --git a/res/DataModelMetadata/en-us/MetaData.xml b/res/DataModelMetadata/en-us/MetaData.xml index b793df7..4e3268a 100644 --- a/res/DataModelMetadata/en-us/MetaData.xml +++ b/res/DataModelMetadata/en-us/MetaData.xml @@ -128,6 +128,8 @@ + + diff --git a/src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp index fc2500a..7f1a734 100644 --- a/src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp +++ b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp @@ -154,6 +154,8 @@ struct DataConstructor #define QT3DS_WCHAR_T_positionv L"positionv" #define QT3DS_WCHAR_T_pivotu L"pivotu" #define QT3DS_WCHAR_T_pivotv L"pivotv" +#define QT3DS_WCHAR_T_minfilter L"minfilter" +#define QT3DS_WCHAR_T_magfilter L"magfilter" #define QT3DS_WCHAR_T_subpresentation L"subpresentation" #define QT3DS_WCHAR_T_iblprobe L"iblprobe" #define QT3DS_WCHAR_T_shaderlighting L"shaderlighting" diff --git a/src/dm/systems/Qt3DSDMComposerTypeDefinitions.h b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.h index bd1dcb5..22ef680 100644 --- a/src/dm/systems/Qt3DSDMComposerTypeDefinitions.h +++ b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.h @@ -146,6 +146,8 @@ class IPropertySystem; HANDLE_COMPOSER_PROPERTY(positionv, m_PositionV, float, 0.f) \ HANDLE_COMPOSER_PROPERTY(pivotu, m_PivotU, float, 0.f) \ HANDLE_COMPOSER_PROPERTY(pivotv, m_PivotV, float, 0.f) \ + HANDLE_COMPOSER_PROPERTY(minfilter, m_MinFilter, TDataStrPtr, L"LinearMipmapLinear") \ + HANDLE_COMPOSER_PROPERTY(magfilter, m_MagFilter, TDataStrPtr, L"Linear") \ HANDLE_COMPOSER_PROPERTY(subpresentation, m_SubPresentation, TDataStrPtr, L"") \ HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"") diff --git a/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp b/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp index 9f8296a..03ad243 100644 --- a/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp +++ b/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp @@ -654,6 +654,8 @@ struct SRuntimePropertyParser #define Image_MappingMode ATTRIBUTE_MAPPINGMODE #define Image_HorizontalTilingMode ATTRIBUTE_TILINGMODEHORZ #define Image_VerticalTilingMode ATTRIBUTE_TILINGMODEVERT +#define Image_MinFilter ATTRIBUTE_MINFILTER +#define Image_MagFilter ATTRIBUTE_MAGFILTER #define Text_Text ATTRIBUTE_TEXTSTRING #define Text_Font ATTRIBUTE_FONT #define Text_FontSize ATTRIBUTE_SIZE diff --git a/src/runtime/Qt3DSAttributeHashes.cpp b/src/runtime/Qt3DSAttributeHashes.cpp index 527bc31..924e10e 100644 --- a/src/runtime/Qt3DSAttributeHashes.cpp +++ b/src/runtime/Qt3DSAttributeHashes.cpp @@ -179,6 +179,8 @@ const char *GetAttributeString(const EAttribute inAttribute) case ATTRIBUTE_MAPPINGMODE: return "mappingmode"; case ATTRIBUTE_SUBPRESENTATION: return "subpresentation"; case ATTRIBUTE_URI: return "uri"; + case ATTRIBUTE_MINFILTER: return "minfilter"; + case ATTRIBUTE_MAGFILTER: return "magfilter"; case ATTRIBUTE_TRANSPARENT: return "transparent"; case ATTRIBUTE_PROGRESSIVEAA: return "progressiveaa"; case ATTRIBUTE_MULTISAMPLEAA: return "multisampleaa"; diff --git a/src/runtime/Qt3DSAttributeHashes.h b/src/runtime/Qt3DSAttributeHashes.h index c373d62..5f9fdf1 100644 --- a/src/runtime/Qt3DSAttributeHashes.h +++ b/src/runtime/Qt3DSAttributeHashes.h @@ -170,6 +170,8 @@ enum EAttribute { ATTRIBUTE_MAPPINGMODE = 0x002715CF, // mappingmode ATTRIBUTE_SUBPRESENTATION = 0x03CA7426, // subpresentation ATTRIBUTE_URI = 0x00296894, // uri + ATTRIBUTE_MINFILTER = 0x0165D276, // minfilter + ATTRIBUTE_MAGFILTER = 0x031C0635, // magfilter ATTRIBUTE_TRANSPARENT = 0x0316BA2E, // transparent ATTRIBUTE_PROGRESSIVEAA = 0x019F1955, // progressiveaa ATTRIBUTE_MULTISAMPLEAA = 0x013D29FD, // multisampleaa diff --git a/src/runtime/Qt3DSAttributeHashes.txt b/src/runtime/Qt3DSAttributeHashes.txt index 567f737..65c2045 100644 --- a/src/runtime/Qt3DSAttributeHashes.txt +++ b/src/runtime/Qt3DSAttributeHashes.txt @@ -135,6 +135,8 @@ mappingtype mappingmode subpresentation uri +minfilter +magfilter transparent progressiveaa diff --git a/src/runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.cpp b/src/runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.cpp index 7423c0e..a09a896 100644 --- a/src/runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.cpp +++ b/src/runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.cpp @@ -442,6 +442,12 @@ struct SShaderGenerator : public ICustomMaterialShaderGenerator inImage.m_Image.m_HorizontalTilingMode); inImage.m_Image.m_TextureData.m_Texture->SetTextureWrapT( inImage.m_Image.m_VerticalTilingMode); + if (inImage.m_Image.m_MinFilter > NVRenderTextureMinifyingOp::Linear + && inImage.m_Image.m_TextureData.m_Texture->GetNumMipmaps() == 0) { + inImage.m_Image.m_TextureData.m_Texture->GenerateMipmaps(); + } + inImage.m_Image.m_TextureData.m_Texture->SetMinFilter(inImage.m_Image.m_MinFilter); + inImage.m_Image.m_TextureData.m_Texture->SetMagFilter(inImage.m_Image.m_MagFilter); theShaderProps.m_Sampler.Set(inImage.m_Image.m_TextureData.m_Texture); theShaderProps.m_Offsets.Set(offsets); diff --git a/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp b/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp index 1b2e6a0..62ff5c6 100644 --- a/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp +++ b/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp @@ -1305,8 +1305,8 @@ struct SMaterialSystem : public ICustomMaterialSystem auto *texture = image->m_TextureData.m_Texture; texture->SetTextureWrapS(image->m_HorizontalTilingMode); texture->SetTextureWrapT(image->m_VerticalTilingMode); - texture->SetMinFilter(inDefinition.m_MinFilterOp); - texture->SetMagFilter(inDefinition.m_MagFilterOp); + texture->SetMinFilter(image->m_MinFilter); + texture->SetMagFilter(image->m_MagFilter); if (inDefinition.m_MinFilterOp != NVRenderTextureMinifyingOp::Nearest && inDefinition.m_MinFilterOp != NVRenderTextureMinifyingOp::Linear && !texture->GetNumMipmaps()) { diff --git a/src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.cpp b/src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.cpp index 157434d..cfa6cff 100644 --- a/src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.cpp +++ b/src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.cpp @@ -862,6 +862,12 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator inImage.m_Image.m_HorizontalTilingMode); inImage.m_Image.m_TextureData.m_Texture->SetTextureWrapT( inImage.m_Image.m_VerticalTilingMode); + if (inImage.m_Image.m_MinFilter > NVRenderTextureMinifyingOp::Linear + && inImage.m_Image.m_TextureData.m_Texture->GetNumMipmaps() == 0) { + inImage.m_Image.m_TextureData.m_Texture->GenerateMipmaps(); + } + inImage.m_Image.m_TextureData.m_Texture->SetMinFilter(inImage.m_Image.m_MinFilter); + inImage.m_Image.m_TextureData.m_Texture->SetMagFilter(inImage.m_Image.m_MagFilter); theShaderProps.m_Sampler.Set(imageTexture); theShaderProps.m_Offsets.Set(offsets); theShaderProps.m_Rotations.Set(rotations); diff --git a/src/runtimerender/Qt3DSRenderEffectSystem.cpp b/src/runtimerender/Qt3DSRenderEffectSystem.cpp index e3da5b0..6ece380 100644 --- a/src/runtimerender/Qt3DSRenderEffectSystem.cpp +++ b/src/runtimerender/Qt3DSRenderEffectSystem.cpp @@ -1063,8 +1063,8 @@ struct SEffectSystem : public IEffectSystem auto *texture = image->m_TextureData.m_Texture; texture->SetTextureWrapS(image->m_HorizontalTilingMode); texture->SetTextureWrapT(image->m_VerticalTilingMode); - texture->SetMinFilter(inDefinition.m_MinFilterOp); - texture->SetMagFilter(inDefinition.m_MagFilterOp); + texture->SetMinFilter(image->m_MinFilter); + texture->SetMagFilter(image->m_MagFilter); if (inDefinition.m_MinFilterOp != NVRenderTextureMinifyingOp::Nearest && inDefinition.m_MinFilterOp != NVRenderTextureMinifyingOp::Linear && !texture->GetNumMipmaps()) { diff --git a/src/runtimerender/Qt3DSRenderUIPLoader.cpp b/src/runtimerender/Qt3DSRenderUIPLoader.cpp index 2cecc1a..8d26350 100644 --- a/src/runtimerender/Qt3DSRenderUIPLoader.cpp +++ b/src/runtimerender/Qt3DSRenderUIPLoader.cpp @@ -841,6 +841,8 @@ struct SRenderUIPLoader : public IDOMReferenceResolver #define Image_Rotation "rotationuv" #define Image_Position_X "positionu" #define Image_Position_Y "positionv" +#define Image_MinFilter "minfilter" +#define Image_MagFilter "magfilter" #define Image_MappingMode "mappingmode" #define Image_HorizontalTilingMode "tilingmodehorz" #define Image_VerticalTilingMode "tilingmodevert" diff --git a/src/runtimerender/Qt3DSRenderUIPSharedTranslation.cpp b/src/runtimerender/Qt3DSRenderUIPSharedTranslation.cpp index e63dd76..998de32 100644 --- a/src/runtimerender/Qt3DSRenderUIPSharedTranslation.cpp +++ b/src/runtimerender/Qt3DSRenderUIPSharedTranslation.cpp @@ -113,6 +113,12 @@ namespace render { #define WCHAR_T_Front L"Front" #define WCHAR_T_All L"All" #define WCHAR_T_None L"None" +#define WCHAR_T_Nearest L"Nearest" +#define WCHAR_T_Linear L"Linear" +#define WCHAR_T_NearestMipmapNearest L"NearestMipmapNearest" +#define WCHAR_T_LinearMipmapNearest L"LinearMipmapNearest" +#define WCHAR_T_NearestMipmapLinear L"NearestMipmapLinear" +#define WCHAR_T_LinearMipmapLinear L"LinearMipmapLinear" #define CHAR_T_Directional "Directional" #define CHAR_T_Point "Point" @@ -195,6 +201,12 @@ namespace render { #define CHAR_T_Front "Front" #define CHAR_T_All "All" #define CHAR_T_None "None" +#define CHAR_T_Nearest "Nearest" +#define CHAR_T_Linear "Linear" +#define CHAR_T_NearestMipmapNearest "NearestMipmapNearest" +#define CHAR_T_LinearMipmapNearest "LinearMipmapNearest" +#define CHAR_T_NearestMipmapLinear "NearestMipmapLinear" +#define CHAR_T_LinearMipmapLinear "LinearMipmapLinear" #define DEFINE_NAME_MAP_ENTRY(enumval, name) \ { \ @@ -246,6 +258,22 @@ namespace render { { (QT3DSU32)-1, NULL }, }; + SEnumNameMap g_RenderTextureMinifyingOpMap[] = { + DEFINE_NAME_MAP_ENTRY(NVRenderTextureMinifyingOp::Nearest, Nearest), + DEFINE_NAME_MAP_ENTRY(NVRenderTextureMinifyingOp::Linear, Linear), + DEFINE_NAME_MAP_ENTRY(NVRenderTextureMinifyingOp::NearestMipmapNearest, NearestMipmapNearest), + DEFINE_NAME_MAP_ENTRY(NVRenderTextureMinifyingOp::LinearMipmapNearest, LinearMipmapNearest), + DEFINE_NAME_MAP_ENTRY(NVRenderTextureMinifyingOp::NearestMipmapLinear, NearestMipmapLinear), + DEFINE_NAME_MAP_ENTRY(NVRenderTextureMinifyingOp::LinearMipmapLinear, LinearMipmapLinear), + { (QT3DSU32)-1, NULL }, + }; + + SEnumNameMap g_RenderTextureMagnifyingOpMap[] = { + DEFINE_NAME_MAP_ENTRY(NVRenderTextureMagnifyingOp::Nearest, Nearest), + DEFINE_NAME_MAP_ENTRY(NVRenderTextureMagnifyingOp::Linear, Linear), + { (QT3DSU32)-1, NULL }, + }; + SEnumNameMap g_TextHorizontalAlignmentMap[] = { DEFINE_NAME_MAP_ENTRY(TextHorizontalAlignment::Left, Left), DEFINE_NAME_MAP_ENTRY(TextHorizontalAlignment::Center, Center), @@ -414,6 +442,16 @@ namespace render { return g_RenderTextureCoordOpMap; } + SEnumNameMap *SEnumParseMap::GetMap() + { + return g_RenderTextureMinifyingOpMap; + } + + SEnumNameMap *SEnumParseMap::GetMap() + { + return g_RenderTextureMagnifyingOpMap; + } + SEnumNameMap *SEnumParseMap::GetMap() { return g_TextHorizontalAlignmentMap; diff --git a/src/runtimerender/Qt3DSRenderUIPSharedTranslation.h b/src/runtimerender/Qt3DSRenderUIPSharedTranslation.h index a7e8d4a..11299c9 100644 --- a/src/runtimerender/Qt3DSRenderUIPSharedTranslation.h +++ b/src/runtimerender/Qt3DSRenderUIPSharedTranslation.h @@ -87,6 +87,18 @@ namespace render { static SEnumNameMap *GetMap(); }; + template <> + struct SEnumParseMap + { + static SEnumNameMap *GetMap(); + }; + + template <> + struct SEnumParseMap + { + static SEnumNameMap *GetMap(); + }; + template <> struct SEnumParseMap { @@ -460,7 +472,9 @@ namespace render { HANDLE_QT3DS_RENDER_VEC2_PROPERTY(Image, Position, TransformDirty) \ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Image, MappingMode, Dirty) \ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Image, HorizontalTilingMode, Dirty) \ - HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Image, VerticalTilingMode, Dirty) + HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Image, VerticalTilingMode, Dirty) \ + HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Image, MinFilter, Dirty) \ + HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Image, MagFilter, Dirty) #define ITERATE_QT3DS_RENDER_TEXT_PROPERTIES \ HANDLE_QT3DS_RENDER_PROPERTY(Text, Text, TextDirty) \ diff --git a/src/runtimerender/graphobjects/Qt3DSRenderImage.cpp b/src/runtimerender/graphobjects/Qt3DSRenderImage.cpp index 78760b6..f2ca055 100644 --- a/src/runtimerender/graphobjects/Qt3DSRenderImage.cpp +++ b/src/runtimerender/graphobjects/Qt3DSRenderImage.cpp @@ -48,6 +48,8 @@ SImage::SImage() , m_MappingMode(ImageMappingModes::Normal) , m_HorizontalTilingMode(NVRenderTextureCoordOp::ClampToEdge) , m_VerticalTilingMode(NVRenderTextureCoordOp::ClampToEdge) + , m_MinFilter(NVRenderTextureMinifyingOp::LinearMipmapLinear) + , m_MagFilter(NVRenderTextureMagnifyingOp::Linear) { m_Flags.SetActive(true); m_Flags.SetDirty(true); diff --git a/src/runtimerender/graphobjects/Qt3DSRenderImage.h b/src/runtimerender/graphobjects/Qt3DSRenderImage.h index 04d890f..16cd02c 100644 --- a/src/runtimerender/graphobjects/Qt3DSRenderImage.h +++ b/src/runtimerender/graphobjects/Qt3DSRenderImage.h @@ -78,6 +78,8 @@ namespace render { ImageMappingModes::Enum m_MappingMode; NVRenderTextureCoordOp::Enum m_HorizontalTilingMode; NVRenderTextureCoordOp::Enum m_VerticalTilingMode; + NVRenderTextureMinifyingOp::Enum m_MinFilter; + NVRenderTextureMagnifyingOp::Enum m_MagFilter; // Setting any of the above variables means this object is dirty. // Setting any of the vec2 properties means this object's transform is dirty -- cgit v1.2.3