diff options
author | Antti Määttä <antti.maatta@qt.io> | 2020-01-10 12:47:07 +0200 |
---|---|---|
committer | Antti Määttä <antti.maatta@qt.io> | 2020-01-21 09:38:44 +0200 |
commit | 7a49e1bdc590f0d3f397dd04355fd165bbd1cb86 (patch) | |
tree | 648192e964fd5d1a0a33ae73213b0e0ef836ad25 | |
parent | 8054702ab93161ba509e5dfed4a893cca62c2481 (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>
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, |