summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Määttä <antti.maatta@qt.io>2020-10-04 13:22:50 +0300
committerAntti Määttä <antti.maatta@qt.io>2020-10-14 12:26:00 +0300
commit4ff4abea88534aabdab9201140c7e610f0c709b9 (patch)
tree70eb1e4fef41d421fc8719c3a8482067e279050d
parentef7e3400211d275077596dd848898adb876efb6e (diff)
Implement image filtering
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 <kaj.gronholm@qt.io> Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
-rw-r--r--res/DataModelMetadata/en-us/MetaData.xml2
-rw-r--r--src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp2
-rw-r--r--src/dm/systems/Qt3DSDMComposerTypeDefinitions.h2
-rw-r--r--src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp2
-rw-r--r--src/runtime/Qt3DSAttributeHashes.cpp2
-rw-r--r--src/runtime/Qt3DSAttributeHashes.h2
-rw-r--r--src/runtime/Qt3DSAttributeHashes.txt2
-rw-r--r--src/runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.cpp6
-rw-r--r--src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp4
-rw-r--r--src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.cpp6
-rw-r--r--src/runtimerender/Qt3DSRenderEffectSystem.cpp4
-rw-r--r--src/runtimerender/Qt3DSRenderUIPLoader.cpp2
-rw-r--r--src/runtimerender/Qt3DSRenderUIPSharedTranslation.cpp38
-rw-r--r--src/runtimerender/Qt3DSRenderUIPSharedTranslation.h16
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderImage.cpp2
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderImage.h2
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 @@
<Property name="positionv" formalName="V Position" description="Offset of the image along the V\ndirection of the material" />
<Property name="pivotu" formalName="U Pivot" description="Offset the image in the U direction\nwithout affecting rotation center" />
<Property name="pivotv" formalName="V Pivot" description="Offset the image in the V direction\nwithout affecting rotation center" />
+ <Property name="minfilter" formalName="Minification Filter" default="LinearMipmapLinear" description="The minification filter of the image" list="Nearest:Linear:NearestMipmapNearest:NearestMipmapLinear:LinearMipmapNearest:LinearMipmapLinear" />
+ <Property name="magfilter" formalName="Magnification Filter" default="Linear" description="The magnification filter of the image" list="Nearest:Linear" />
<!-- Texture subpresentation is not set to controllable as it does not currently work in runtime -->
<Property name="subpresentation" formalName="Sub-Presentation" description="Presentation or QML stream\nto use instead of the image" type="Renderable" />
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<SObjectRefType>
#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<NVRenderTextureMinifyingOp::Enum>::GetMap()
+ {
+ return g_RenderTextureMinifyingOpMap;
+ }
+
+ SEnumNameMap *SEnumParseMap<NVRenderTextureMagnifyingOp::Enum>::GetMap()
+ {
+ return g_RenderTextureMagnifyingOpMap;
+ }
+
SEnumNameMap *SEnumParseMap<TextHorizontalAlignment::Enum>::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
@@ -88,6 +88,18 @@ namespace render {
};
template <>
+ struct SEnumParseMap<NVRenderTextureMinifyingOp::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<NVRenderTextureMagnifyingOp::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
struct SEnumParseMap<TextHorizontalAlignment::Enum>
{
static SEnumNameMap *GetMap();
@@ -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