From 4564b6201c4c75bd193a0160d7c8f8d99b5b0fab Mon Sep 17 00:00:00 2001 From: codereader Date: Thu, 25 Mar 2021 13:00:07 +0100 Subject: [PATCH] #5565: Export simple material flags --- libs/materials/ParseLib.h | 29 +++++++++++++++++++ .../shaders/MaterialSourceGenerator.cpp | 9 ++++++ test/MaterialExport.cpp | 16 ++++++++++ 3 files changed, 54 insertions(+) diff --git a/libs/materials/ParseLib.h b/libs/materials/ParseLib.h index 281d8e8ddf..02d1be380b 100644 --- a/libs/materials/ParseLib.h +++ b/libs/materials/ParseLib.h @@ -7,6 +7,35 @@ namespace shaders { +constexpr std::pair MaterialFlagKeywords[] +{ + { "noShadows", Material::FLAG_NOSHADOWS }, + { "noSelfShadow", Material::FLAG_NOSELFSHADOW }, + { "forceShadows", Material::FLAG_FORCESHADOWS }, + { "noOverlays", Material::FLAG_NOOVERLAYS }, + { "forceOverlays", Material::FLAG_FORCEOVERLAYS }, + { "translucent", Material::FLAG_TRANSLUCENT }, + { "forceOpaque", Material::FLAG_FORCEOPAQUE }, + { "noFog", Material::FLAG_NOFOG }, + { "noPortalFog", Material::FLAG_NOPORTALFOG }, + { "unsmoothedTangents", Material::FLAG_UNSMOOTHEDTANGENTS }, + { "mirror", Material::FLAG_MIRROR }, + { "isLightgemSurf", Material::FLAG_ISLIGHTGEMSURF }, +}; + +inline std::string getStringForMaterialFlag(Material::Flags flag) +{ + for (const auto& pair : MaterialFlagKeywords) + { + if (flag == pair.second) + { + return pair.first; + } + } + + return std::string(); +} + constexpr std::pair SurfaceTypeMapping[] { { "metal", Material::SURFTYPE_METAL }, diff --git a/radiantcore/shaders/MaterialSourceGenerator.cpp b/radiantcore/shaders/MaterialSourceGenerator.cpp index c82bff2398..96ad0cd78a 100644 --- a/radiantcore/shaders/MaterialSourceGenerator.cpp +++ b/radiantcore/shaders/MaterialSourceGenerator.cpp @@ -22,6 +22,15 @@ std::ostream& operator<<(std::ostream& stream, ShaderTemplate& shaderTemplate) stream << "\tdescription \"" << string::replace_all_copy(shaderTemplate.getDescription(), "\"", "'") << "\"\n"; } + // Go through the material flags which reflect a single keyword + for (const auto& pair : shaders::MaterialFlagKeywords) + { + if (shaderTemplate.getMaterialFlags() & pair.second) + { + stream << "\t" << pair.first << "\n"; + } + } + if (shaderTemplate.getMaterialFlags() & Material::FLAG_POLYGONOFFSET) { stream << fmt::format("\tpolygonOffset {0}\n", shaderTemplate.getPolygonOffset()); diff --git a/test/MaterialExport.cpp b/test/MaterialExport.cpp index 3c7551703e..b4336c464f 100644 --- a/test/MaterialExport.cpp +++ b/test/MaterialExport.cpp @@ -81,4 +81,20 @@ TEST_F(MaterialExportTest, SurfaceType) expectDefinitionDoesNotContain(material, "lastSurfaceType"); } +TEST_F(MaterialExportTest, MaterialFlags) +{ + auto material = GlobalMaterialManager().getMaterial("textures/exporttest/empty"); + + EXPECT_EQ(string::trim_copy(material->getDefinition()), ""); + + for (const auto& pair : shaders::MaterialFlagKeywords) + { + material->setMaterialFlag(pair.second); + expectDefinitionContains(material, pair.first); + + material->clearMaterialFlag(pair.second); + expectDefinitionDoesNotContain(material, pair.first); + } +} + }