From 154e77620f5275d619eb593b92159402cb9a1eda Mon Sep 17 00:00:00 2001 From: codereader Date: Sun, 28 Feb 2021 10:25:23 +0100 Subject: [PATCH] #5532: Extend material parser to be able to deal with the guisurf variants --- include/ishaders.h | 9 +++++- radiantcore/shaders/CShader.cpp | 5 ++++ radiantcore/shaders/CShader.h | 2 ++ radiantcore/shaders/ShaderTemplate.cpp | 24 ++++++++++++++-- radiantcore/shaders/ShaderTemplate.h | 9 ++++++ test/Materials.cpp | 26 +++++++++++++++++ test/resources/tdm/materials/parsertest.mtr | 32 +++++++++++++++++++++ 7 files changed, 103 insertions(+), 4 deletions(-) diff --git a/include/ishaders.h b/include/ishaders.h index e4decd7c08..e2d4a6ec83 100644 --- a/include/ishaders.h +++ b/include/ishaders.h @@ -95,7 +95,10 @@ class Material SURF_NODAMAGE = 1 << 21, SURF_LADDER = 1 << 22, SURF_NOSTEPS = 1 << 23, - SURF_ENTITYGUI = 1 << 24, + SURF_GUISURF = 1 << 24, // has guisurf in its material def + SURF_ENTITYGUI = 1 << 25, // guisurf entity + SURF_ENTITYGUI2 = 1 << 26, // guisurf entity2 + SURF_ENTITYGUI3 = 1 << 27, // guisurf entity3 }; // Surface Type (plastic, stone, etc.) @@ -362,6 +365,10 @@ class Material // Returns the argument string after the renderbumpflat keyword, or an empty string if no statement is present virtual std::string getRenderBumpFlatArguments() = 0; + + // The argument to the "guisurf" keyword, if not entity[2]3]. + // In case entity[2]3] is set, the corresponding surface flags are enabled + virtual const std::string& getGuiSurfArgument() = 0; }; typedef std::shared_ptr MaterialPtr; diff --git a/radiantcore/shaders/CShader.cpp b/radiantcore/shaders/CShader.cpp index bff1bbe1bc..192ec668e4 100644 --- a/radiantcore/shaders/CShader.cpp +++ b/radiantcore/shaders/CShader.cpp @@ -223,6 +223,11 @@ std::string CShader::getRenderBumpFlatArguments() return _template->getRenderBumpFlagArguments(); } +const std::string& CShader::getGuiSurfArgument() +{ + return _template->getGuiSurfArgument(); +} + // ----------------------------------------- void CShader::realise() { diff --git a/radiantcore/shaders/CShader.h b/radiantcore/shaders/CShader.h index ca63f819c7..78f78a6347 100644 --- a/radiantcore/shaders/CShader.h +++ b/radiantcore/shaders/CShader.h @@ -108,6 +108,8 @@ class CShader std::string getRenderBumpArguments() override; std::string getRenderBumpFlatArguments() override; + const std::string& getGuiSurfArgument() override; + // ----------------------------------------- void realise(); diff --git a/radiantcore/shaders/ShaderTemplate.cpp b/radiantcore/shaders/ShaderTemplate.cpp index e3b7420302..839a17ed07 100644 --- a/radiantcore/shaders/ShaderTemplate.cpp +++ b/radiantcore/shaders/ShaderTemplate.cpp @@ -1126,9 +1126,27 @@ bool ShaderTemplate::parseSurfaceFlags(parser::DefTokeniser& tokeniser, } else if (token == "guisurf") { - _surfaceFlags |= Material::SURF_ENTITYGUI; - // Something like "guisurf blah.gui" or "guisurf entity2", skip the argument and proceed - tokeniser.skipTokens(1); + // "guisurf blah.gui" or "guisurf entity[2|3]" + _surfaceFlags |= Material::SURF_GUISURF; + + auto argument = tokeniser.nextToken(); + + if (string::to_lower_copy(argument) == "entity") + { + _surfaceFlags |= Material::SURF_ENTITYGUI; + } + else if (string::to_lower_copy(argument) == "entity2") + { + _surfaceFlags |= Material::SURF_ENTITYGUI2; + } + else if (string::to_lower_copy(argument) == "entity3") + { + _surfaceFlags |= Material::SURF_ENTITYGUI3; + } + else + { + _guiDeclName = argument; + } } else { diff --git a/radiantcore/shaders/ShaderTemplate.h b/radiantcore/shaders/ShaderTemplate.h index 51d3d501a5..55f9e8c83a 100644 --- a/radiantcore/shaders/ShaderTemplate.h +++ b/radiantcore/shaders/ShaderTemplate.h @@ -98,6 +98,9 @@ class ShaderTemplate int _parseFlags; + // The string value specified by the guisurf keyword, if other than entity[2]3] + std::string _guiDeclName; + public: /** @@ -308,6 +311,12 @@ class ShaderTemplate // renderbumpflat argument string std::string getRenderBumpFlagArguments(); + const std::string& getGuiSurfArgument() + { + if (!_parsed) parseDefinition(); + return _guiDeclName; + } + private: // Add the given layer and assigns editor preview layer if applicable diff --git a/test/Materials.cpp b/test/Materials.cpp index c37b663325..c60c549be9 100644 --- a/test/Materials.cpp +++ b/test/Materials.cpp @@ -442,4 +442,30 @@ TEST_F(MaterialsTest, MaterialParserStageFragmentProgram) EXPECT_TRUE(material->getAllLayers().empty()); // failure to parse should end up with an empty material } +TEST_F(MaterialsTest, MaterialParserGuiSurf) +{ + auto material = GlobalMaterialManager().getMaterialForName("textures/parsertest/guisurf1"); + EXPECT_TRUE(material->getSurfaceFlags() & Material::SURF_GUISURF); + EXPECT_FALSE(material->getSurfaceFlags() & (Material::SURF_ENTITYGUI| Material::SURF_ENTITYGUI2| Material::SURF_ENTITYGUI3)); + EXPECT_EQ(material->getGuiSurfArgument(), "guis/lvlmaps/genericmap.gui"); + + material = GlobalMaterialManager().getMaterialForName("textures/parsertest/guisurf2"); + EXPECT_TRUE(material->getSurfaceFlags() & Material::SURF_GUISURF); + EXPECT_TRUE(material->getSurfaceFlags() & Material::SURF_ENTITYGUI); + EXPECT_FALSE(material->getSurfaceFlags() & (Material::SURF_ENTITYGUI2 | Material::SURF_ENTITYGUI3)); + EXPECT_EQ(material->getGuiSurfArgument(), ""); + + material = GlobalMaterialManager().getMaterialForName("textures/parsertest/guisurf3"); + EXPECT_TRUE(material->getSurfaceFlags() & Material::SURF_GUISURF); + EXPECT_TRUE(material->getSurfaceFlags() & Material::SURF_ENTITYGUI2); + EXPECT_FALSE(material->getSurfaceFlags() & (Material::SURF_ENTITYGUI | Material::SURF_ENTITYGUI3)); + EXPECT_EQ(material->getGuiSurfArgument(), ""); + + material = GlobalMaterialManager().getMaterialForName("textures/parsertest/guisurf4"); + EXPECT_TRUE(material->getSurfaceFlags() & Material::SURF_GUISURF); + EXPECT_TRUE(material->getSurfaceFlags() & Material::SURF_ENTITYGUI3); + EXPECT_FALSE(material->getSurfaceFlags() & (Material::SURF_ENTITYGUI | Material::SURF_ENTITYGUI2)); + EXPECT_EQ(material->getGuiSurfArgument(), ""); +} + } diff --git a/test/resources/tdm/materials/parsertest.mtr b/test/resources/tdm/materials/parsertest.mtr index e7ff700d08..2a302ce61e 100644 --- a/test/resources/tdm/materials/parsertest.mtr +++ b/test/resources/tdm/materials/parsertest.mtr @@ -289,3 +289,35 @@ textures/parsertest/program/fragmentProgram3 fragmentMap 8 temp/texture } } + +textures/parsertest/guisurf1 +{ + qer_editorimage textures/editor/entityGui.tga + discrete + guiSurf guis/lvlmaps/genericmap.gui + +} + +textures/parsertest/guisurf2 + { + qer_editorimage textures/editor/entityGui.tga + discrete + playerclip + guiSurf entity +} + +textures/parsertest/guisurf3 +{ + qer_editorimage textures/editor/entityGui2.tga + discrete + playerclip + guiSurf entity2 +} + +textures/parsertest/guisurf4 +{ + qer_editorimage textures/editor/entityGui3.tga + discrete + guiSurf entity3 + playerclip +} \ No newline at end of file