From 112972d4bda1d1fb07ebd7b20bb7a87531dc7c8b Mon Sep 17 00:00:00 2001 From: codereader Date: Fri, 26 Mar 2021 17:10:17 +0100 Subject: [PATCH] #5565: Export ambientRimColour, and store the expressions beforehand --- radiantcore/shaders/MaterialSourceGenerator.cpp | 10 ++++++++++ radiantcore/shaders/ShaderTemplate.cpp | 7 +++++++ radiantcore/shaders/ShaderTemplate.h | 9 +++++++++ test/MaterialExport.cpp | 8 ++++++++ 4 files changed, 34 insertions(+) diff --git a/radiantcore/shaders/MaterialSourceGenerator.cpp b/radiantcore/shaders/MaterialSourceGenerator.cpp index f9fc0d6824..c0cb7fec07 100644 --- a/radiantcore/shaders/MaterialSourceGenerator.cpp +++ b/radiantcore/shaders/MaterialSourceGenerator.cpp @@ -553,6 +553,16 @@ std::ostream& operator<<(std::ostream& stream, ShaderTemplate& shaderTemplate) } } + // AmbientRimColor + if (shaderTemplate.getAmbientRimColourExpression(0) && + shaderTemplate.getAmbientRimColourExpression(1) && + shaderTemplate.getAmbientRimColourExpression(2)) + { + stream << "\tambientRimColor " << shaderTemplate.getAmbientRimColourExpression(0)->getExpressionString() << ", " + << shaderTemplate.getAmbientRimColourExpression(1)->getExpressionString() << ", " + << shaderTemplate.getAmbientRimColourExpression(2)->getExpressionString() << "\n"; + } + for (const auto& layer : shaderTemplate.getLayers()) { stream << *layer; diff --git a/radiantcore/shaders/ShaderTemplate.cpp b/radiantcore/shaders/ShaderTemplate.cpp index 1dd9afb90b..907b736770 100644 --- a/radiantcore/shaders/ShaderTemplate.cpp +++ b/radiantcore/shaders/ShaderTemplate.cpp @@ -56,6 +56,10 @@ ShaderTemplate::ShaderTemplate(const ShaderTemplate& other) : _parseFlags(other._parseFlags), _guiDeclName(other._guiDeclName) { + _ambientRimColour[0] = other._ambientRimColour[0]; + _ambientRimColour[1] = other._ambientRimColour[1]; + _ambientRimColour[2] = other._ambientRimColour[2]; + // Clone the layers for (const auto& otherLayer : other._layers) { @@ -444,6 +448,9 @@ bool ShaderTemplate::parseShaderFlags(parser::DefTokeniser& tokeniser, if (red && green && blue) { // ambientrimcolor support not yet added, we need material registers first + _ambientRimColour[0] = red; + _ambientRimColour[1] = green; + _ambientRimColour[2] = blue; } else { diff --git a/radiantcore/shaders/ShaderTemplate.h b/radiantcore/shaders/ShaderTemplate.h index 1788ea9f1e..daa3a9dcd4 100644 --- a/radiantcore/shaders/ShaderTemplate.h +++ b/radiantcore/shaders/ShaderTemplate.h @@ -102,6 +102,9 @@ class ShaderTemplate final // The string value specified by the guisurf keyword, if other than entity[2]3] std::string _guiDeclName; + // The three ambient rim colour expressions (empty if not defined) + IShaderExpression::Ptr _ambientRimColour[3]; + // Private copy ctor, used for cloning ShaderTemplate(const ShaderTemplate& other); @@ -484,6 +487,12 @@ class ShaderTemplate final return _guiDeclName; } + IShaderExpression::Ptr getAmbientRimColourExpression(std::size_t index) + { + assert(index < 3); + return _ambientRimColour[index]; + } + void onTemplateChanged() { if (_suppressChangeSignal) return; diff --git a/test/MaterialExport.cpp b/test/MaterialExport.cpp index ee4d2a9cf3..edb1ddba72 100644 --- a/test/MaterialExport.cpp +++ b/test/MaterialExport.cpp @@ -1021,4 +1021,12 @@ TEST_F(MaterialExportTest, EditorImage) expectDefinitionDoesNotContain(material, "qer_editorimage"); } +TEST_F(MaterialExportTest, AmbientRimColour) +{ + auto material = GlobalMaterialManager().getMaterial("textures/parsertest/withAmbientRimColor"); + + material->setDescription("-"); + expectDefinitionContains(material, "ambientRimColor parm1 * 3.0, 0.0, time * 6.0"); +} + }