summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJere Tuliniemi <jere.tuliniemi@qt.io>2019-09-17 12:22:23 +0300
committerJere Tuliniemi <jere.tuliniemi@qt.io>2019-09-19 12:46:07 +0300
commit814d037a67c827a5eef0f3d166d5ada498f408fb (patch)
treeaaebc2179e5e95f2c8863dc72630748470829e19
parent9395963fdef3030136c242dc27bbd5e17566f054 (diff)
Add transparency mode selection to standard materials
ASTC textures would need to be decompressed upon loading to scan for transparency, or the texture files would need their own user-defined settings to enable transparency. Instead, as a work-around, materials can be forced to be treated as transparent without manipulating opacity. This is implemented with a transparency mode drop down list containing "Default", "Force Transparent" and "Force Opaque" options. "Force Opaque" can be used to force the material to be treated as opaque even when the textures used are transparent. By default ASTC textures are treated as non-transparent. Task-number: QT3DS-3904 Change-Id: I22255ffb2e2be5efea3e56466d58ddcc46490bb2 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Janne Kangas <janne.kangas@qt.io> Reviewed-by: Antti Määttä <antti.maatta@qt.io>
-rw-r--r--res/DataModelMetadata/en-us/MetaData.xml1
-rw-r--r--src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp1
-rw-r--r--src/dm/systems/Qt3DSDMComposerTypeDefinitions.h1
-rw-r--r--src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp1
-rw-r--r--src/runtime/Qt3DSAttributeHashes.cpp1
-rw-r--r--src/runtime/Qt3DSAttributeHashes.h1
-rw-r--r--src/runtime/Qt3DSAttributeHashes.txt1
-rw-r--r--src/runtimerender/Qt3DSRenderUIPLoader.cpp1
-rw-r--r--src/runtimerender/Qt3DSRenderUIPSharedTranslation.cpp17
-rw-r--r--src/runtimerender/Qt3DSRenderUIPSharedTranslation.h7
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.cpp1
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.h10
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp7
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderLoadedTexture.cpp29
14 files changed, 78 insertions, 1 deletions
diff --git a/res/DataModelMetadata/en-us/MetaData.xml b/res/DataModelMetadata/en-us/MetaData.xml
index 93ad17a..24ebe3a 100644
--- a/res/DataModelMetadata/en-us/MetaData.xml
+++ b/res/DataModelMetadata/en-us/MetaData.xml
@@ -172,6 +172,7 @@
<Property name="bumpamount" formalName="Bump Amount" type="float" default=".5" category="Material" description="Strength of bump/normal map effect" />
<Property name="displacementmap" formalName="Displacement Map" type="Image" category="Material" description="Grayscale image used to offset vertices\nof the geometry" />
<Property name="displaceamount" formalName="Displacement Amount" type="float" default="20" category="Material" description="Distance to offset vertices" />
+ <Property name="transparencymode" formalName="Transparency Mode" default="Default" category="Material" description="Material can be forced to be treated as transparent or opaque. Default behavior depends on the texture transparencies." list="Default:Force Transparent:Force Opaque" animatable="False" />
<Property name="opacity" formalName="Opacity" min="0" max="100" default="100" category="Material" description="Visibility of the geometry for this material." />
<Property name="opacitymap" formalName="Opacity Map" type="Image" category="Material" description="Image to vary the opacity across the material" />
<Property name="emissivecolor" formalName="Emissive Color" type="Color" default="1 1 1 1" category="Material" description="Color of self-illumination for this material" />
diff --git a/src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp
index 7aee9b5..c1c0071 100644
--- a/src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp
+++ b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp
@@ -170,6 +170,7 @@ struct DataConstructor<SObjectRefType>
#define QT3DS_WCHAR_T_specularamount L"specularamount"
#define QT3DS_WCHAR_T_specularroughness L"specularroughness"
#define QT3DS_WCHAR_T_roughnessmap L"roughnessmap"
+#define QT3DS_WCHAR_T_transparencymode L"transparencymode"
#define QT3DS_WCHAR_T_opacitymap L"opacitymap"
#define QT3DS_WCHAR_T_emissivepower L"emissivepower"
#define QT3DS_WCHAR_T_emissivecolor L"emissivecolor"
diff --git a/src/dm/systems/Qt3DSDMComposerTypeDefinitions.h b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.h
index 534a776..ce49f07 100644
--- a/src/dm/systems/Qt3DSDMComposerTypeDefinitions.h
+++ b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.h
@@ -190,6 +190,7 @@ class IPropertySystem;
HANDLE_COMPOSER_PROPERTY(ior, m_IOR, float, 0) \
HANDLE_COMPOSER_PROPERTY(fresnelPower, m_FresnelPower, float, 0) \
HANDLE_COMPOSER_PROPERTY(vertexcolors, m_VertexColors, bool, false) \
+ HANDLE_COMPOSER_PROPERTY(transparencymode, m_TransparencyMode, TDataStrPtr, L"Default") \
HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"")
#define ITERATE_COMPOSER_REFERENCED_MATERIAL_PROPERTIES \
diff --git a/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp b/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp
index f26d3cf..dbb1648 100644
--- a/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp
+++ b/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp
@@ -634,6 +634,7 @@ struct SRuntimePropertyParser
#define Material_DiffuseLightWrap ATTRIBUTE_DIFFUSELIGHTWRAP
#define Material_ReferencedMaterial ATTRIBUTE_REFERENCEDMATERIAL
#define Material_VertexColors ATTRIBUTE_VERTEXCOLORS
+#define Material_TransparencyMode ATTRIBUTE_TRANSPARENCYMODE
#define Image_ImagePath ATTRIBUTE_SOURCEPATH
#define Image_OffscreenRendererId ATTRIBUTE_SUBPRESENTATION
#define Image_Scale_X ATTRIBUTE_SCALEU
diff --git a/src/runtime/Qt3DSAttributeHashes.cpp b/src/runtime/Qt3DSAttributeHashes.cpp
index 4e320df..9d248b7 100644
--- a/src/runtime/Qt3DSAttributeHashes.cpp
+++ b/src/runtime/Qt3DSAttributeHashes.cpp
@@ -165,6 +165,7 @@ const char *GetAttributeString(const EAttribute inAttribute)
case ATTRIBUTE_DIFFUSELIGHTWRAP: return "diffuselightwrap";
case ATTRIBUTE_REFERENCEDMATERIAL: return "referencedmaterial";
case ATTRIBUTE_VERTEXCOLORS: return "vertexcolors";
+ case ATTRIBUTE_TRANSPARENCYMODE: return "transparencymode";
case ATTRIBUTE_ROTATIONUV: return "rotationuv";
case ATTRIBUTE_POSITIONU: return "positionu";
case ATTRIBUTE_POSITIONV: return "positionv";
diff --git a/src/runtime/Qt3DSAttributeHashes.h b/src/runtime/Qt3DSAttributeHashes.h
index a1cd41f..3f53541 100644
--- a/src/runtime/Qt3DSAttributeHashes.h
+++ b/src/runtime/Qt3DSAttributeHashes.h
@@ -156,6 +156,7 @@ enum EAttribute {
ATTRIBUTE_DIFFUSELIGHTWRAP = 0x038F6522, // diffuselightwrap
ATTRIBUTE_REFERENCEDMATERIAL = 0x035FDA80, // referencedmaterial
ATTRIBUTE_VERTEXCOLORS = 0x000814EC, // vertexcolors
+ ATTRIBUTE_TRANSPARENCYMODE = 0x02E77D05, // transparencymode
ATTRIBUTE_ROTATIONUV = 0x012E3A61, // rotationuv
ATTRIBUTE_POSITIONU = 0x01D05AB4, // positionu
ATTRIBUTE_POSITIONV = 0x01D15AF3, // positionv
diff --git a/src/runtime/Qt3DSAttributeHashes.txt b/src/runtime/Qt3DSAttributeHashes.txt
index 0cc3e07..b8e2a7f 100644
--- a/src/runtime/Qt3DSAttributeHashes.txt
+++ b/src/runtime/Qt3DSAttributeHashes.txt
@@ -120,6 +120,7 @@ translucentfalloff
diffuselightwrap
referencedmaterial
vertexcolors
+transparencymode
rotationuv
positionu
diff --git a/src/runtimerender/Qt3DSRenderUIPLoader.cpp b/src/runtimerender/Qt3DSRenderUIPLoader.cpp
index 3c8a0bf..073df7f 100644
--- a/src/runtimerender/Qt3DSRenderUIPLoader.cpp
+++ b/src/runtimerender/Qt3DSRenderUIPLoader.cpp
@@ -823,6 +823,7 @@ struct SRenderUIPLoader : public IDOMReferenceResolver
#define Material_DiffuseLightWrap "diffuselightwrap"
#define Material_ReferencedMaterial "referencedmaterial"
#define Material_VertexColors "vertexcolors"
+#define Material_TransparencyMode "transparencymode"
#define Image_ImagePath "sourcepath"
#define Image_OffscreenRendererId "subpresentation"
#define Image_Scale_X "scaleu"
diff --git a/src/runtimerender/Qt3DSRenderUIPSharedTranslation.cpp b/src/runtimerender/Qt3DSRenderUIPSharedTranslation.cpp
index a059493..077a337 100644
--- a/src/runtimerender/Qt3DSRenderUIPSharedTranslation.cpp
+++ b/src/runtimerender/Qt3DSRenderUIPSharedTranslation.cpp
@@ -94,6 +94,8 @@ namespace render {
#define WCHAR_T_Default L"Default"
#define WCHAR_T_KGGX L"KGGX"
#define WCHAR_T_KWard L"KWard"
+#define WCHAR_T_ForceTransparent L"Force Transparent"
+#define WCHAR_T_ForceOpaque L"Force Opaque"
#define WCHAR_T_Transparent L"Transparent"
#define WCHAR_T_Unspecified L"Unspecified"
#define WCHAR_T_Color L"SolidColor"
@@ -177,6 +179,8 @@ namespace render {
#define CHAR_T_Default "Default"
#define CHAR_T_KGGX "KGGX"
#define CHAR_T_KWard "KWard"
+#define CHAR_T_ForceTransparent "Force Transparent"
+#define CHAR_T_ForceOpaque "Force Opaque"
#define CHAR_T_Transparent "Transparent"
#define CHAR_T_Unspecified "Unspecified"
#define CHAR_T_Color "SolidColor"
@@ -353,6 +357,14 @@ namespace render {
{ (QT3DSU32)-1, NULL },
};
+ SEnumNameMap g_TransparencyModeMap[] = {
+ DEFINE_NAME_MAP_ENTRY(DefaultMaterialTransparencyMode::Default, Default),
+ DEFINE_NAME_MAP_ENTRY(DefaultMaterialTransparencyMode::ForceTransparent,
+ ForceTransparent),
+ DEFINE_NAME_MAP_ENTRY(DefaultMaterialTransparencyMode::ForceOpaque, ForceOpaque),
+ { (QT3DSU32)-1, NULL },
+ };
+
SEnumNameMap g_TessellationValuesMap[] = {
DEFINE_NAME_MAP_ENTRY(TessModeValues::NoTess, None),
DEFINE_NAME_MAP_ENTRY(TessModeValues::TessLinear, Linear),
@@ -453,6 +465,11 @@ namespace render {
return g_SpecularTypesMap;
}
+ SEnumNameMap *SEnumParseMap<DefaultMaterialTransparencyMode::Enum>::GetMap()
+ {
+ return g_TransparencyModeMap;
+ }
+
SEnumNameMap *SEnumParseMap<TessModeValues::Enum>::GetMap() { return g_TessellationValuesMap; }
SEnumNameMap *SEnumParseMap<PathCapping::Enum>::GetMap() { return g_PathCappingValuesMap; }
diff --git a/src/runtimerender/Qt3DSRenderUIPSharedTranslation.h b/src/runtimerender/Qt3DSRenderUIPSharedTranslation.h
index 06c6346..01740e6 100644
--- a/src/runtimerender/Qt3DSRenderUIPSharedTranslation.h
+++ b/src/runtimerender/Qt3DSRenderUIPSharedTranslation.h
@@ -169,6 +169,12 @@ namespace render {
};
template <>
+ struct SEnumParseMap<DefaultMaterialTransparencyMode::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
struct SEnumParseMap<TessModeValues::Enum>
{
static SEnumNameMap *GetMap();
@@ -418,6 +424,7 @@ namespace render {
HANDLE_QT3DS_RENDER_PROPERTY(Material, SpecularAmount, Dirty) \
HANDLE_QT3DS_RENDER_PROPERTY(Material, SpecularRoughness, Dirty) \
HANDLE_QT3DS_RENDER_PROPERTY(Material, RoughnessMap, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Material, TransparencyMode, Dirty) \
HANDLE_QT3DS_RENDER_OPACITY_PROPERTY(Material, Opacity, Dirty) \
HANDLE_QT3DS_RENDER_PROPERTY(Material, OpacityMap, Dirty) \
HANDLE_QT3DS_RENDER_PROPERTY(Material, BumpMap, Dirty) \
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.cpp b/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.cpp
index e18a84d..b914a5b 100644
--- a/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.cpp
+++ b/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.cpp
@@ -61,6 +61,7 @@ SDefaultMaterial::SDefaultMaterial()
, m_TranslucentFalloff(0.f)
, m_DiffuseLightWrap(0.f)
, m_VertexColors(false)
+ , m_TransparencyMode(DefaultMaterialTransparencyMode::Default)
, m_NextSibling(NULL)
, m_Parent(NULL)
{
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.h b/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.h
index 48c8d0b..22af262 100644
--- a/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.h
+++ b/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.h
@@ -69,6 +69,15 @@ namespace render {
};
};
+ struct DefaultMaterialTransparencyMode
+ {
+ enum Enum {
+ Default = 0,
+ ForceTransparent,
+ ForceOpaque
+ };
+ };
+
struct SImage;
struct QT3DS_AUTOTEST_EXPORT SDefaultMaterial : SGraphObject
@@ -106,6 +115,7 @@ namespace render {
QT3DSF32 m_TranslucentFalloff; // 0 - ??
QT3DSF32 m_DiffuseLightWrap; // 0 - 1
bool m_VertexColors;
+ DefaultMaterialTransparencyMode::Enum m_TransparencyMode;
// Materials are stored as a linked list on models.
SGraphObject *m_NextSibling;
SModel *m_Parent;
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp
index 3016ad6..34c2173 100644
--- a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp
@@ -784,8 +784,13 @@ namespace render {
renderableFlags |= RenderPreparationResultFlagValues::CompletelyTransparent;
}
- if (IsNotOne(subsetOpacity))
+ if (IsNotOne(subsetOpacity) || theMaterial->m_TransparencyMode
+ == DefaultMaterialTransparencyMode::ForceTransparent) {
renderableFlags |= RenderPreparationResultFlagValues::HasTransparency;
+ } else if (theMaterial->m_TransparencyMode
+ == DefaultMaterialTransparencyMode::ForceOpaque) {
+ renderableFlags.clearOrSet(false, RenderPreparationResultFlagValues::HasTransparency);
+ }
// Enable alpha test, but only if the whole object opacity is full
// so parts of the object might be fully opaque
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTexture.cpp b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTexture.cpp
index 9f98c9d..353e585 100644
--- a/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTexture.cpp
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTexture.cpp
@@ -790,6 +790,35 @@ bool SLoadedTexture::ScanForTransparency(bool &alsoOpaquePixels)
// integer scans.
return false;
break;
+ case NVRenderTextureFormats::RGBA_ASTC_4x4:
+ case NVRenderTextureFormats::RGBA_ASTC_5x4:
+ case NVRenderTextureFormats::RGBA_ASTC_5x5:
+ case NVRenderTextureFormats::RGBA_ASTC_6x5:
+ case NVRenderTextureFormats::RGBA_ASTC_6x6:
+ case NVRenderTextureFormats::RGBA_ASTC_8x5:
+ case NVRenderTextureFormats::RGBA_ASTC_8x6:
+ case NVRenderTextureFormats::RGBA_ASTC_8x8:
+ case NVRenderTextureFormats::RGBA_ASTC_10x5:
+ case NVRenderTextureFormats::RGBA_ASTC_10x6:
+ case NVRenderTextureFormats::RGBA_ASTC_10x8:
+ case NVRenderTextureFormats::RGBA_ASTC_10x10:
+ case NVRenderTextureFormats::RGBA_ASTC_12x10:
+ case NVRenderTextureFormats::RGBA_ASTC_12x12:
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_4x4:
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_5x4:
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_5x5:
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_6x5:
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_6x6:
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_8x5:
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_8x6:
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_8x8:
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_10x5:
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_10x6:
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_10x8:
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_10x10:
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_12x10:
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_12x12:
+ return false;
default:
break;
}