From 9d13df4e3e88b80ef67a4fdc60315c6da25cd639 Mon Sep 17 00:00:00 2001 From: codereader Date: Mon, 2 Jan 2023 06:34:11 +0100 Subject: [PATCH] #6212: MaterialSourceGenerator can export frobstage syntax now --- libs/materials/ParseLib.h | 21 +++++++++++ .../shaders/MaterialSourceGenerator.cpp | 36 +++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/libs/materials/ParseLib.h b/libs/materials/ParseLib.h index 72a2367fb7..7b55300974 100644 --- a/libs/materials/ParseLib.h +++ b/libs/materials/ParseLib.h @@ -404,6 +404,27 @@ inline std::string getStringForClampType(ClampType type) return std::string(); } +constexpr std::pair FrobStageTypeNames[] +{ + { Material::FrobStageType::Default, "" }, + { Material::FrobStageType::Diffuse, "frobstage_diffuse" }, + { Material::FrobStageType::Texture, "frobstage_texture" }, + { Material::FrobStageType::None, "frobstage_none" }, +}; + +inline std::string getStringForFrobStageType(Material::FrobStageType type) +{ + for (const auto& pair : FrobStageTypeNames) + { + if (type == pair.first) + { + return pair.second; + } + } + + return std::string(); +} + constexpr int NUM_MAX_VERTEX_PARMS = 4; constexpr int NUM_MAX_FRAGMENT_MAPS = 8; diff --git a/radiantcore/shaders/MaterialSourceGenerator.cpp b/radiantcore/shaders/MaterialSourceGenerator.cpp index 7fe021fdf3..aad3fd8b90 100644 --- a/radiantcore/shaders/MaterialSourceGenerator.cpp +++ b/radiantcore/shaders/MaterialSourceGenerator.cpp @@ -441,6 +441,19 @@ std::ostream& operator<<(std::ostream& stream, Doom3ShaderLayer& layer) return stream; } +// Writes (x y z) or just a single number without parentheses if the vector has uniform values +void writeScalarOrVector3(std::ostream& stream, const Vector3& vec) +{ + if (vec.x() == vec.y() && vec.y() == vec.z()) + { + stream << vec.x(); + } + else + { + stream << "(" << vec.x() << " " << vec.y() << " " << vec.z() << ")"; + } +} + // Write the material to the given stream (one tab indentation) std::ostream& operator<<(std::ostream& stream, ShaderTemplate& shaderTemplate) { @@ -676,6 +689,29 @@ std::ostream& operator<<(std::ostream& stream, ShaderTemplate& shaderTemplate) stream << *layer; } + // FrobStage keywords + if (shaderTemplate.getFrobStageType() != Material::FrobStageType::Default) + { + stream << "\n"; + stream << getStringForFrobStageType(shaderTemplate.getFrobStageType()); + + if (shaderTemplate.getFrobStageType() == Material::FrobStageType::Texture) + { + stream << " "; + const auto& expr = shaderTemplate.getFrobStageMapExpression(); + stream << (expr ? expr->getExpressionString() : "_white"); // don't export invalid syntax + } + + if (shaderTemplate.getFrobStageType() == Material::FrobStageType::Diffuse || + shaderTemplate.getFrobStageType() == Material::FrobStageType::Texture) + { + stream << " "; + writeScalarOrVector3(stream, shaderTemplate.getFrobStageRgbParameter(0)); + stream << " "; + writeScalarOrVector3(stream, shaderTemplate.getFrobStageRgbParameter(1)); + } + } + return stream; }