summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Määttä <antti.maatta@qt.io>2020-01-10 12:47:07 +0200
committerAntti Määttä <antti.maatta@qt.io>2020-01-21 09:38:44 +0200
commit7a49e1bdc590f0d3f397dd04355fd165bbd1cb86 (patch)
tree648192e964fd5d1a0a33ae73213b0e0ef836ad25
parent8054702ab93161ba509e5dfed4a893cca62c2481 (diff)
Implement culling mode for materials
-Add culling mode for default material -Add Culling command to custom material. Task-number: QT3DS-1627 Change-Id: I519498ce4508c02527df628c36c0a62621e8e294 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Tomi Korpipää <tomi.korpipaa@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/dm/systems/Qt3DSDMMetaData.cpp44
-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/Qt3DSRenderCustomMaterialSystem.cpp39
-rw-r--r--src/runtimerender/Qt3DSRenderDynamicObjectSystem.cpp5
-rw-r--r--src/runtimerender/Qt3DSRenderDynamicObjectSystemCommands.h19
-rw-r--r--src/runtimerender/Qt3DSRenderUIPLoader.cpp1
-rw-r--r--src/runtimerender/Qt3DSRenderUIPSharedTranslation.cpp32
-rw-r--r--src/runtimerender/Qt3DSRenderUIPSharedTranslation.h8
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.cpp1
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.h11
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp26
17 files changed, 172 insertions, 21 deletions
diff --git a/res/DataModelMetadata/en-us/MetaData.xml b/res/DataModelMetadata/en-us/MetaData.xml
index 6cb3893..99a5254 100644
--- a/res/DataModelMetadata/en-us/MetaData.xml
+++ b/res/DataModelMetadata/en-us/MetaData.xml
@@ -154,6 +154,7 @@
<Property name="shaderlighting" formalName="Lighting" default="Pixel" category="Material" description="Light model" list="Pixel:None" />
<Property name="blendmode" formalName="Blending Mode" default="Normal" category="Material" description="How this material blends with content\nbehind it. Modes marked with * are\navailable only with HW supporting\nadvanced blending modes." list="Normal:Screen:Multiply:*Overlay:*ColorBurn:*ColorDodge" />
<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="cullmode" formalName="Culling Mode" default="Back" category="Material" description="Disable drawing of polygons facing certain direction." list="Back:Front:All:None" />
<Property name="vertexcolors" formalName="Enable Vertex Colors" type="Boolean" default="False" category="Material" description="Use vertex colors from the mesh" animatable="False" />
<Property name="diffuse" formalName="Diffuse Color" type="Color" default="1 1 1 1" category="Material" description="Color when lit from any direction" />
<Property name="diffusemap" formalName="Diffuse Map" type="Image" category="Material" description="Image to multiply with diffuse color" />
diff --git a/src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp
index a4f6959..53fed0c 100644
--- a/src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp
+++ b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp
@@ -319,6 +319,7 @@ struct DataConstructor<SObjectRefType>
#define QT3DS_WCHAR_T_controlledproperty L"controlledproperty"
#define QT3DS_WCHAR_T_variants L"variants"
#define QT3DS_WCHAR_T_ordered L"ordered"
+#define QT3DS_WCHAR_T_cullmode L"cullmode"
const wchar_t *ComposerObjectTypes::Convert(ComposerObjectTypes::Enum inType)
{
diff --git a/src/dm/systems/Qt3DSDMComposerTypeDefinitions.h b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.h
index d347e6d..e8deeb8 100644
--- a/src/dm/systems/Qt3DSDMComposerTypeDefinitions.h
+++ b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.h
@@ -191,6 +191,7 @@ class IPropertySystem;
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(cullmode, m_CullMode, TDataStrPtr, L"Back") \
HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"")
#define ITERATE_COMPOSER_REFERENCED_MATERIAL_PROPERTIES \
diff --git a/src/dm/systems/Qt3DSDMMetaData.cpp b/src/dm/systems/Qt3DSDMMetaData.cpp
index 5e861cc..6cae7f8 100644
--- a/src/dm/systems/Qt3DSDMMetaData.cpp
+++ b/src/dm/systems/Qt3DSDMMetaData.cpp
@@ -2998,10 +2998,27 @@ public:
}
}
+ static inline qt3ds::render::NVRenderFaces::Enum
+ ConvertToCullFace(const char8_t *inMode)
+ {
+ if (AreEqual(inMode, "Back"))
+ return qt3ds::render::NVRenderFaces::Back;
+ if (AreEqual(inMode, "Front"))
+ return qt3ds::render::NVRenderFaces::Front;
+ if (AreEqual(inMode, "All")) {
+ return qt3ds::render::NVRenderFaces::FrontAndBack;
+ } else {
+ QT3DS_ASSERT(false);
+ return qt3ds::render::NVRenderFaces::Back;
+ }
+ }
+
static inline qt3ds::render::NVRenderState::Enum ConvertRenderState(const char8_t *inState)
{
if (AreEqual(inState, "Stencil"))
return qt3ds::render::NVRenderState::StencilTest;
+ if (AreEqual(inState, "Culling"))
+ return qt3ds::render::NVRenderState::CullFace;
else {
QT3DS_ASSERT(false);
// inFoundation.error( QT3DS_INVALID_PARAMETER, "Unsupported filter type %s, defaulting
@@ -4030,8 +4047,31 @@ public:
theMaterial.m_HasTransparency = true;
} else if (AreEqual("RenderState",
inStream.GetNarrowElementName())) {
- // UdoL Todo: add this one
- }
+ const char8_t *name = "";
+ inStream.Att("name", name);
+ const char8_t *value = "";
+ inStream.Att("value", value);
+ // find the param and the type.
+ bool theStateEnable = false;
+ qt3ds::render::NVRenderState::Enum theState
+ = ConvertRenderState(name);
+ if (AreEqual("true", value))
+ theStateEnable = true;
+
+ theMaterial.m_CustomerMaterialCommands.push_back(
+ new SApplyRenderState(theState, theStateEnable));
+ } else if (AreEqual("Culling",
+ inStream.GetNarrowElementName())) {
+ const char8_t *cullMode = "";
+ inStream.Att("mode", cullMode);
+
+ qt3ds::render::NVRenderFaces::Enum face =
+ ConvertToCullFace(cullMode);
+
+ // this will setup blending
+ theMaterial.m_CustomerMaterialCommands.push_back(
+ new SApplyCulling(face));
+ }
}
}
// add the render command as last thing in the pass, it is a render
diff --git a/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp b/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp
index bdf92e5..88d591f 100644
--- a/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp
+++ b/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp
@@ -637,6 +637,7 @@ struct SRuntimePropertyParser
#define Material_ReferencedMaterial ATTRIBUTE_REFERENCEDMATERIAL
#define Material_VertexColors ATTRIBUTE_VERTEXCOLORS
#define Material_TransparencyMode ATTRIBUTE_TRANSPARENCYMODE
+#define Material_CullMode ATTRIBUTE_CULLMODE
#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 db92917..e9ef5d1 100644
--- a/src/runtime/Qt3DSAttributeHashes.cpp
+++ b/src/runtime/Qt3DSAttributeHashes.cpp
@@ -287,6 +287,7 @@ const char *GetAttributeString(const EAttribute inAttribute)
case ATTRIBUTE_CONTROLLEDPROPERTY: return "controlledproperty";
case ATTRIBUTE_OBSERVEDPROPERTY: return "observedproperty";
case ATTRIBUTE_ORDERED: return "ordered";
+ case ATTRIBUTE_CULLMODE: return "cullmode";
case ATTRIBUTE_QT_IO: return "qt.io";
default: {
static char s_UnknownHash[16];
diff --git a/src/runtime/Qt3DSAttributeHashes.h b/src/runtime/Qt3DSAttributeHashes.h
index d491ef0..5127d1a 100644
--- a/src/runtime/Qt3DSAttributeHashes.h
+++ b/src/runtime/Qt3DSAttributeHashes.h
@@ -278,6 +278,7 @@ enum EAttribute {
ATTRIBUTE_CONTROLLEDPROPERTY = 0x022C0A1D, // controlledproperty
ATTRIBUTE_OBSERVEDPROPERTY = 0x02D1CE03, // observedproperty
ATTRIBUTE_ORDERED = 0x038AEAD3, // ordered
+ ATTRIBUTE_CULLMODE = 0x009C792B, // cullmode
ATTRIBUTE_QT_IO = 0x010EF2CF, // qt.io
}; // enum EAttribute
diff --git a/src/runtime/Qt3DSAttributeHashes.txt b/src/runtime/Qt3DSAttributeHashes.txt
index b62d54c..882517a 100644
--- a/src/runtime/Qt3DSAttributeHashes.txt
+++ b/src/runtime/Qt3DSAttributeHashes.txt
@@ -252,3 +252,4 @@ controlledproperty
observedproperty
ordered
+cullmode
diff --git a/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp b/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp
index b40e10e..6c3f0c1 100644
--- a/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp
+++ b/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp
@@ -1397,6 +1397,31 @@ struct SMaterialSystem : public ICustomMaterialSystem
theContext.SetBlendEquation(blendEqu);
}
+ void ApplyRenderState(const SApplyRenderState &inCommand)
+ {
+ NVRenderContext &theContext(m_Context->GetRenderContext());
+
+ switch (inCommand.m_RenderState) {
+ case NVRenderState::CullFace:
+ theContext.SetCullingEnabled(inCommand.m_Enabled);
+ break;
+ case NVRenderState::StencilTest:
+ theContext.SetStencilTestEnabled(inCommand.m_Enabled);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void ApplyCulling(const SApplyCulling &inCommand)
+ {
+ NVRenderContext &theContext(m_Context->GetRenderContext());
+
+ NVScopedRefCounted<qt3ds::render::NVRenderRasterizerState> state =
+ theContext.CreateRasterizerState(0.0, 0.0, inCommand.m_CullMode);
+ theContext.SetRasterizerState(state);
+ }
+
// we currently only bind a source texture
const NVRenderTexture2D *ApplyBufferValue(const SCustomMaterial &inMaterial,
NVRenderShaderProgram &inShader,
@@ -1735,7 +1760,6 @@ struct SMaterialSystem : public ICustomMaterialSystem
theContext.SetInputAssembler(&inAssembler);
- theContext.SetCullingEnabled(true);
QT3DSU32 count = inCount;
QT3DSU32 offset = inOffset;
@@ -1756,8 +1780,10 @@ struct SMaterialSystem : public ICustomMaterialSystem
// for refrative materials we come from the transparent render path
// but we do not want to do blending
bool wasBlendingEnabled = theContext.IsBlendingEnabled();
+ bool wasStencilEnabled = theContext.IsStencilTestEnabled();
if (inMaterial.m_hasRefraction)
theContext.SetBlendingEnabled(false);
+ theContext.SetCullingEnabled(true);
NVRenderContextScopedProperty<NVRenderFrameBuffer *> __framebuffer(
theContext, &NVRenderContext::GetRenderTarget, &NVRenderContext::SetRenderTarget);
@@ -1810,6 +1836,12 @@ struct SMaterialSystem : public ICustomMaterialSystem
// reset
theRenderTargetNeedsClear = false;
break;
+ case CommandTypes::ApplyCulling:
+ ApplyCulling(static_cast<const SApplyCulling &>(theCommand));
+ break;
+ case CommandTypes::ApplyRenderState:
+ ApplyRenderState(static_cast<const SApplyRenderState &>(theCommand));
+ break;
case CommandTypes::ApplyBlending:
ApplyBlending(static_cast<const SApplyBlending &>(theCommand));
break;
@@ -1831,6 +1863,11 @@ struct SMaterialSystem : public ICustomMaterialSystem
if (inMaterial.m_hasRefraction)
theContext.SetBlendingEnabled(wasBlendingEnabled);
+ theContext.SetStencilTestEnabled(wasStencilEnabled);
+ NVScopedRefCounted<qt3ds::render::NVRenderRasterizerState> state =
+ theContext.CreateRasterizerState(0.0, 0.0, qt3ds::render::NVRenderFaces::Back);
+ theContext.SetRasterizerState(state);
+ theContext.SetCullingEnabled(true);
// Release any per-frame buffers
for (QT3DSU32 idx = 0; idx < m_AllocatedBuffers.size(); ++idx) {
diff --git a/src/runtimerender/Qt3DSRenderDynamicObjectSystem.cpp b/src/runtimerender/Qt3DSRenderDynamicObjectSystem.cpp
index cb629cc..a836989 100644
--- a/src/runtimerender/Qt3DSRenderDynamicObjectSystem.cpp
+++ b/src/runtimerender/Qt3DSRenderDynamicObjectSystem.cpp
@@ -109,6 +109,8 @@ namespace render {
return sizeof(SAllocateDataBuffer);
case CommandTypes::ApplyDataBufferValue:
return sizeof(SApplyDataBufferValue);
+ case CommandTypes::ApplyCulling:
+ return sizeof(SApplyCulling);
default:
break;
}
@@ -159,6 +161,9 @@ namespace render {
case CommandTypes::ApplyRenderState:
CopyConstructCommandT<SApplyRenderState>(inDataBuffer, inCommand, inStrTable);
break;
+ case CommandTypes::ApplyCulling:
+ CopyConstructCommandT<SApplyCulling>(inDataBuffer, inCommand, inStrTable);
+ break;
case CommandTypes::ApplyBlitFramebuffer:
CopyConstructCommandT<SApplyBlitFramebuffer>(inDataBuffer, inCommand, inStrTable);
break;
diff --git a/src/runtimerender/Qt3DSRenderDynamicObjectSystemCommands.h b/src/runtimerender/Qt3DSRenderDynamicObjectSystemCommands.h
index 857dfa9..d42507b 100644
--- a/src/runtimerender/Qt3DSRenderDynamicObjectSystemCommands.h
+++ b/src/runtimerender/Qt3DSRenderDynamicObjectSystemCommands.h
@@ -63,6 +63,7 @@ namespace render {
ApplyImageValue,
AllocateDataBuffer,
ApplyDataBufferValue,
+ ApplyCulling
};
};
@@ -83,7 +84,8 @@ namespace render {
QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(AllocateImage) \
QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(ApplyImageValue) \
QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(AllocateDataBuffer) \
- QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(ApplyDataBufferValue)
+ QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(ApplyDataBufferValue) \
+ QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(ApplyCulling)
// All commands need at least two constructors. One for when they are created that should
// setup all their member variables and one for when we are copying commands from an outside
@@ -473,6 +475,21 @@ namespace render {
}
};
+ struct SApplyCulling : public SCommand
+ {
+ NVRenderFaces::Enum m_CullMode;
+ SApplyCulling(NVRenderFaces::Enum cullMode)
+ : SCommand(CommandTypes::ApplyCulling)
+ , m_CullMode(cullMode)
+ {
+ }
+ SApplyCulling(const SApplyCulling &inOther, IStringTable &)
+ : SCommand(CommandTypes::ApplyCulling)
+ , m_CullMode(inOther.m_CullMode)
+ {
+ }
+ };
+
struct SApplyBlending : public SCommand
{
NVRenderSrcBlendFunc::Enum m_SrcBlendFunc;
diff --git a/src/runtimerender/Qt3DSRenderUIPLoader.cpp b/src/runtimerender/Qt3DSRenderUIPLoader.cpp
index 0187546..7d3ec0a 100644
--- a/src/runtimerender/Qt3DSRenderUIPLoader.cpp
+++ b/src/runtimerender/Qt3DSRenderUIPLoader.cpp
@@ -826,6 +826,7 @@ struct SRenderUIPLoader : public IDOMReferenceResolver
#define Material_ReferencedMaterial "referencedmaterial"
#define Material_VertexColors "vertexcolors"
#define Material_TransparencyMode "transparencymode"
+#define Material_CullMode "cullmode"
#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 077a337..e63dd76 100644
--- a/src/runtimerender/Qt3DSRenderUIPSharedTranslation.cpp
+++ b/src/runtimerender/Qt3DSRenderUIPSharedTranslation.cpp
@@ -66,13 +66,11 @@ namespace render {
#define WCHAR_T_4x L"4x"
#define WCHAR_T_8x L"8x"
#define WCHAR_T_SSAA L"SSAA"
-#define WCHAR_T_NoRotation L"NoRotation"
#define WCHAR_T_Clockwise90 L"90"
#define WCHAR_T_Clockwise180 L"180"
#define WCHAR_T_Clockwise270 L"270"
#define WCHAR_T_Fit L"Fit"
#define WCHAR_T_Same_Size L"Same Size"
-#define WCHAR_T_CENTER L"Center"
#define WCHAR_T_North L"N"
#define WCHAR_T_NorthEast L"NE"
#define WCHAR_T_East L"E"
@@ -108,14 +106,13 @@ namespace render {
#define WCHAR_T_Filled L"Filled"
#define WCHAR_T_Stroked L"Stroked"
#define WCHAR_T_FilledAndStroked L"Filled and Stroked"
-#define WCHAR_T_Simple L"Simple"
-#define WCHAR_T_Smoke L"Smoke"
-#define WCHAR_T_Cloud L"Cloud"
-#define WCHAR_T_Fluid L"Fluid"
-#define WCHAR_T_User L"User"
#define WCHAR_T_Clip L"Clip"
#define WCHAR_T_WrapWord L"WrapWord"
#define WCHAR_T_WrapAnywhere L"WrapAnywhere"
+#define WCHAR_T_Back L"Back"
+#define WCHAR_T_Front L"Front"
+#define WCHAR_T_All L"All"
+#define WCHAR_T_None L"None"
#define CHAR_T_Directional "Directional"
#define CHAR_T_Point "Point"
@@ -151,13 +148,11 @@ namespace render {
#define CHAR_T_4x "4x"
#define CHAR_T_8x "8x"
#define CHAR_T_SSAA "SSAA"
-#define CHAR_T_NoRotation "NoRotation"
#define CHAR_T_Clockwise90 "90"
#define CHAR_T_Clockwise180 "180"
#define CHAR_T_Clockwise270 "270"
#define CHAR_T_Fit "Fit"
#define CHAR_T_Same_Size "Same Size"
-#define CHAR_T_CENTER "Center"
#define CHAR_T_North "N"
#define CHAR_T_NorthEast "NE"
#define CHAR_T_East "E"
@@ -193,14 +188,13 @@ namespace render {
#define CHAR_T_Filled "Filled"
#define CHAR_T_Stroked "Stroked"
#define CHAR_T_FilledAndStroked "Filled and Stroked"
-#define CHAR_T_Simple "Simple"
-#define CHAR_T_Smoke "Smoke"
-#define CHAR_T_Cloud "Cloud"
-#define CHAR_T_Fluid "Fluid"
-#define CHAR_T_User "User"
#define CHAR_T_Clip "Clip"
#define CHAR_T_WrapWord "WrapWord"
#define CHAR_T_WrapAnywhere "WrapAnywhere"
+#define CHAR_T_Back "Back"
+#define CHAR_T_Front "Front"
+#define CHAR_T_All "All"
+#define CHAR_T_None "None"
#define DEFINE_NAME_MAP_ENTRY(enumval, name) \
{ \
@@ -237,6 +231,14 @@ namespace render {
{ (QT3DSU32)-1, NULL },
};
+ SEnumNameMap g_CullModeMap[] = {
+ DEFINE_NAME_MAP_ENTRY(DefaultMaterialCullMode::Back, Back),
+ DEFINE_NAME_MAP_ENTRY(DefaultMaterialCullMode::Front, Front),
+ DEFINE_NAME_MAP_ENTRY(DefaultMaterialCullMode::FrontAndBack, All),
+ DEFINE_NAME_MAP_ENTRY(DefaultMaterialCullMode::None, None),
+ { (QT3DSU32)-1, NULL },
+ };
+
SEnumNameMap g_RenderTextureCoordOpMap[] = {
DEFINE_NAME_MAP_ENTRY(NVRenderTextureCoordOp::ClampToEdge, No_Tiling),
DEFINE_NAME_MAP_ENTRY(NVRenderTextureCoordOp::MirroredRepeat, Mirrored),
@@ -405,6 +407,8 @@ namespace render {
SEnumNameMap *SEnumParseMap<ImageMappingModes::Enum>::GetMap() { return g_ImageMappingModeMap; }
+ SEnumNameMap *SEnumParseMap<DefaultMaterialCullMode::Enum>::GetMap() { return g_CullModeMap; }
+
SEnumNameMap *SEnumParseMap<NVRenderTextureCoordOp::Enum>::GetMap()
{
return g_RenderTextureCoordOpMap;
diff --git a/src/runtimerender/Qt3DSRenderUIPSharedTranslation.h b/src/runtimerender/Qt3DSRenderUIPSharedTranslation.h
index 3c51ff0..053b267 100644
--- a/src/runtimerender/Qt3DSRenderUIPSharedTranslation.h
+++ b/src/runtimerender/Qt3DSRenderUIPSharedTranslation.h
@@ -197,6 +197,11 @@ namespace render {
{
static SEnumNameMap *GetMap();
};
+ template <>
+ struct SEnumParseMap<DefaultMaterialCullMode::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
#define QT3DS_RENDER_WCHAR_T_XYZs L"XYZ"
#define QT3DS_RENDER_WCHAR_T_YZXs L"YZX"
@@ -435,7 +440,8 @@ namespace render {
HANDLE_QT3DS_RENDER_PROPERTY(Material, DisplaceAmount, Dirty) \
HANDLE_QT3DS_RENDER_PROPERTY(Material, TranslucencyMap, Dirty) \
HANDLE_QT3DS_RENDER_PROPERTY(Material, TranslucentFalloff, Dirty) \
- HANDLE_QT3DS_RENDER_PROPERTY(Material, DiffuseLightWrap, Dirty)
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, DiffuseLightWrap, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Material, CullMode, Dirty)
#define ITERATE_QT3DS_RENDER_REFERENCED_MATERIAL_PROPERTIES \
HANDLE_QT3DS_RENDER_PROPERTY(Material, ReferencedMaterial, Dirty)
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.cpp b/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.cpp
index b914a5b..184d61d 100644
--- a/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.cpp
+++ b/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.cpp
@@ -62,6 +62,7 @@ SDefaultMaterial::SDefaultMaterial()
, m_DiffuseLightWrap(0.f)
, m_VertexColors(false)
, m_TransparencyMode(DefaultMaterialTransparencyMode::Default)
+ , m_CullMode(DefaultMaterialCullMode::Back)
, m_NextSibling(NULL)
, m_Parent(NULL)
{
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.h b/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.h
index 22af262..39015fe 100644
--- a/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.h
+++ b/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.h
@@ -78,6 +78,16 @@ namespace render {
};
};
+ struct DefaultMaterialCullMode
+ {
+ enum Enum {
+ Back = 0,
+ Front,
+ FrontAndBack,
+ None
+ };
+ };
+
struct SImage;
struct QT3DS_AUTOTEST_EXPORT SDefaultMaterial : SGraphObject
@@ -116,6 +126,7 @@ namespace render {
QT3DSF32 m_DiffuseLightWrap; // 0 - 1
bool m_VertexColors;
DefaultMaterialTransparencyMode::Enum m_TransparencyMode;
+ DefaultMaterialCullMode::Enum m_CullMode;
// Materials are stored as a linked list on models.
SGraphObject *m_NextSibling;
SModel *m_Parent;
diff --git a/src/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp b/src/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp
index 2705b18..095badc 100644
--- a/src/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp
+++ b/src/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp
@@ -290,9 +290,31 @@ namespace render {
}
}
- context.SetCullingEnabled(true);
+ context.SetCullingEnabled(m_Material.m_CullMode != DefaultMaterialCullMode::None);
context.SetInputAssembler(m_Subset.m_InputAssembler);
- context.Draw(m_Subset.m_PrimitiveType, m_Subset.m_Count, m_Subset.m_Offset);
+ if (m_Material.m_CullMode != DefaultMaterialCullMode::None) {
+ NVScopedRefCounted<qt3ds::render::NVRenderRasterizerState> rsdefaultstate =
+ context.CreateRasterizerState(0.0, 0.0, qt3ds::render::NVRenderFaces::Back);
+ qt3ds::render::NVRenderFaces::Enum face = qt3ds::render::NVRenderFaces::Back;
+ switch (m_Material.m_CullMode) {
+ case DefaultMaterialCullMode::Front:
+ face = qt3ds::render::NVRenderFaces::Front;
+ break;
+ case DefaultMaterialCullMode::FrontAndBack:
+ face = qt3ds::render::NVRenderFaces::FrontAndBack;
+ break;
+ default:
+ break;
+ }
+
+ NVScopedRefCounted<qt3ds::render::NVRenderRasterizerState> rasterState =
+ context.CreateRasterizerState(0.0, 0.0, face);
+ context.SetRasterizerState(rasterState);
+ context.Draw(m_Subset.m_PrimitiveType, m_Subset.m_Count, m_Subset.m_Offset);
+ context.SetRasterizerState(rsdefaultstate);
+ } else {
+ context.Draw(m_Subset.m_PrimitiveType, m_Subset.m_Count, m_Subset.m_Offset);
+ }
}
void SSubsetRenderable::RenderShadow(const QT3DSVec2 &inCameraVec,