From b4741094529068c7c898d801036b14e343c79ad6 Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 24 Jul 2022 13:54:58 +0200 Subject: [PATCH] depthtest, depthwrite, polygonOffset for material loading --- .../IW4/AssetLoaders/AssetLoaderMaterial.cpp | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMaterial.cpp b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMaterial.cpp index 0e5ad492..04c4a47f 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMaterial.cpp +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMaterial.cpp @@ -442,14 +442,45 @@ namespace IW4 void depthtest_template() { + const auto depthTest = ReadEnumProperty("depthTest", GdtDepthTestNames, std::extent_v); + + SetDepthTest(depthTest); } void depthwrite_template() { + const auto depthWrite = ReadEnumProperty("depthWrite", GdtStateBitsEnabledStatusNames, std::extent_v); + const auto blendFunc = ReadStringProperty("blendFunc"); + + if (depthWrite == StateBitsEnabledStatus_e::ENABLED) + SetDepthWrite(true); + else if (depthWrite == StateBitsEnabledStatus_e::DISABLED) + SetDepthWrite(false); + else if (blendFunc == GDT_BLEND_FUNC_ADD) + SetDepthWrite(false); + else if (blendFunc == GDT_BLEND_FUNC_BLEND) + SetDepthWrite(false); + else if (blendFunc == GDT_BLEND_FUNC_MULTIPLY) + SetDepthWrite(false); + else if (blendFunc == GDT_BLEND_FUNC_REPLACE) + SetDepthWrite(true); + else if (blendFunc == GDT_BLEND_FUNC_SCREEN_ADD) + SetDepthWrite(false); + else if (blendFunc == GDT_BLEND_FUNC_CUSTOM) + SetDepthWrite(false); + else + { + std::ostringstream ss; + ss << "Invalid depthWrite blendFunc value: \"" << blendFunc << "\""; + throw GdtReadingException(ss.str()); + } } void polygonoffset_template() { + const auto polygonOffset = ReadEnumProperty("polygonOffset", GdtPolygonOffsetNames, std::extent_v); + + SetPolygonOffset(polygonOffset); } void stencil_template() @@ -623,6 +654,61 @@ namespace IW4 } } + void SetDepthTest(const DepthTest_e depthTest) + { + m_base_statebits.loadBits[1] &= GFXS1_DEPTHTEST_MASK; + + switch (depthTest) + { + case DepthTest_e::LESS_EQUAL: + m_base_statebits.loadBits[1] |= GFXS1_DEPTHTEST_LESSEQUAL; + break; + + case DepthTest_e::LESS: + m_base_statebits.loadBits[1] |= GFXS1_DEPTHTEST_LESS; + break; + + case DepthTest_e::EQUAL: + m_base_statebits.loadBits[1] |= GFXS1_DEPTHTEST_EQUAL; + break; + + case DepthTest_e::ALWAYS: + m_base_statebits.loadBits[1] |= GFXS1_DEPTHTEST_ALWAYS; + break; + + case DepthTest_e::DISABLE: + m_base_statebits.loadBits[1] |= GFXS1_DEPTHTEST_DISABLE; + break; + + case DepthTest_e::UNKNOWN: + default: + std::ostringstream ss; + ss << "Unknown depthTest values: \"\""; + throw GdtReadingException(ss.str()); + } + } + + void SetDepthWrite(const bool depthWrite) + { + m_base_statebits.loadBits[1] &= ~GFXS1_DEPTHWRITE; + + if (depthWrite) + m_base_statebits.loadBits[1] |= GFXS1_DEPTHWRITE; + } + + void SetPolygonOffset(const PolygonOffset_e polygonOffset) + { + if (polygonOffset == PolygonOffset_e::UNKNOWN) + { + std::ostringstream ss; + ss << "Unknown polygonOffset values: \"\""; + throw GdtReadingException(ss.str()); + } + + m_base_statebits.loadBits[1] &= ~GFXS1_POLYGON_OFFSET_MASK; + m_base_statebits.loadBits[1] |= ((static_cast(polygonOffset) - 1) >> GFXS1_POLYGON_OFFSET_SHIFT) & GFXS1_POLYGON_OFFSET_MASK; + } + void FinalizeMaterial() const { if (!m_textures.empty())