From c7eba3ad36b5f68c493c182a422ac14420cb6c1f Mon Sep 17 00:00:00 2001 From: codereader Date: Fri, 26 Mar 2021 10:24:36 +0100 Subject: [PATCH] #5565: Export stage transforms --- .../shaders/MaterialSourceGenerator.cpp | 26 +++++++ test/MaterialExport.cpp | 68 +++++++++++++++++++ 2 files changed, 94 insertions(+) diff --git a/radiantcore/shaders/MaterialSourceGenerator.cpp b/radiantcore/shaders/MaterialSourceGenerator.cpp index 94897ecb6e..5bf07b5562 100644 --- a/radiantcore/shaders/MaterialSourceGenerator.cpp +++ b/radiantcore/shaders/MaterialSourceGenerator.cpp @@ -255,6 +255,32 @@ std::ostream& operator<<(std::ostream& stream, Doom3ShaderLayer& layer) stream << "\t\tprivatePolygonOffset " << layer.getPrivatePolygonOffset() << "\n"; } + // Stage Transforms + for (const auto& transform : layer.getTransformations()) + { + const auto& expr1 = transform.expression1; + const auto& expr2 = transform.expression2; + + switch (transform.type) + { + case IShaderLayer::TransformType::Translate: + stream << "\t\ttranslate " << (expr1 ? expr1->getExpressionString() : "") << ", " << (expr2 ? expr2->getExpressionString() : "") << "\n"; + break; + case IShaderLayer::TransformType::Scale: + stream << "\t\tscale " << (expr1 ? expr1->getExpressionString() : "") << ", " << (expr2 ? expr2->getExpressionString() : "") << "\n"; + break; + case IShaderLayer::TransformType::CenterScale: + stream << "\t\tcenterScale " << (expr1 ? expr1->getExpressionString() : "") << ", " << (expr2 ? expr2->getExpressionString() : "") << "\n"; + break; + case IShaderLayer::TransformType::Shear: + stream << "\t\tshear " << (expr1 ? expr1->getExpressionString() : "") << ", " << (expr2 ? expr2->getExpressionString() : "") << "\n"; + break; + case IShaderLayer::TransformType::Rotate: + stream << "\t\trotate " << (expr1 ? expr1->getExpressionString() : "") << "\n"; + break; + }; + } + stream << "\t}\n"; return stream; diff --git a/test/MaterialExport.cpp b/test/MaterialExport.cpp index 6311877834..ae4be3838a 100644 --- a/test/MaterialExport.cpp +++ b/test/MaterialExport.cpp @@ -812,4 +812,72 @@ TEST_F(MaterialExportTest, StagePrivatePolygonOffset) expectDefinitionDoesNotContain(material, "privatePolygonOffset"); } +TEST_F(MaterialExportTest, StageTransforms) +{ + auto material = GlobalMaterialManager().getMaterial("textures/exporttest/empty"); + + EXPECT_EQ(string::trim_copy(material->getDefinition()), ""); + + auto layer = material->getEditableLayer(material->addLayer(IShaderLayer::BLEND)); + layer->appendTransformation(IShaderLayer::Transformation{ IShaderLayer::TransformType::Translate }); + layer->updateTransformation(0, IShaderLayer::TransformType::Translate, "time * 0.5", "sinTable[7.6]"); + + expectDefinitionContains(material, "translate time * 0.5, sinTable[7.6]"); + expectDefinitionDoesNotContainAnyOf(material, { "rotate", "scroll", "scale", "shear", "centerScale" }); + + material->revertModifications(); + + layer = material->getEditableLayer(material->addLayer(IShaderLayer::BLEND)); + layer->appendTransformation(IShaderLayer::Transformation{ IShaderLayer::TransformType::CenterScale }); + layer->updateTransformation(0, IShaderLayer::TransformType::CenterScale, "0.4", "time"); + + expectDefinitionContains(material, "centerScale 0.4, time"); + expectDefinitionDoesNotContainAnyOf(material, { "rotate", "scroll", "scale", "shear", "translate" }); + + material->revertModifications(); + + layer = material->getEditableLayer(material->addLayer(IShaderLayer::BLEND)); + layer->appendTransformation(IShaderLayer::Transformation{ IShaderLayer::TransformType::Rotate }); + layer->updateTransformation(0, IShaderLayer::TransformType::Rotate, "time", ""); + + expectDefinitionContains(material, "rotate time"); + expectDefinitionDoesNotContainAnyOf(material, { "centerScale", "scroll", "scale", "shear", "translate" }); + + material->revertModifications(); + + layer = material->getEditableLayer(material->addLayer(IShaderLayer::BLEND)); + layer->appendTransformation(IShaderLayer::Transformation{ IShaderLayer::TransformType::Scale }); + layer->updateTransformation(0, IShaderLayer::TransformType::Scale, "time", "time % 4"); + + expectDefinitionContains(material, "scale time, time % 4.0"); + expectDefinitionDoesNotContainAnyOf(material, { "centerScale", "scroll", "rotate", "shear", "translate" }); + + material->revertModifications(); + + layer = material->getEditableLayer(material->addLayer(IShaderLayer::BLEND)); + layer->appendTransformation(IShaderLayer::Transformation{ IShaderLayer::TransformType::Shear }); + layer->updateTransformation(0, IShaderLayer::TransformType::Shear, "time / 6", "global4"); + + expectDefinitionContains(material, "shear time / 6.0, global4"); + expectDefinitionDoesNotContainAnyOf(material, { "centerScale", "scroll", "rotate", "scale", "translate" }); + + material->revertModifications(); + + layer = material->getEditableLayer(material->addLayer(IShaderLayer::BLEND)); + layer->appendTransformation(IShaderLayer::Transformation{ IShaderLayer::TransformType::Translate }); + layer->updateTransformation(0, IShaderLayer::TransformType::Translate, "1", "2"); + layer->appendTransformation(IShaderLayer::Transformation{ IShaderLayer::TransformType::Scale }); + layer->updateTransformation(1, IShaderLayer::TransformType::Scale, "1", "1"); + layer->appendTransformation(IShaderLayer::Transformation{ IShaderLayer::TransformType::Translate }); + layer->updateTransformation(2, IShaderLayer::TransformType::Translate, "time", "1"); + layer->appendTransformation(IShaderLayer::Transformation{ IShaderLayer::TransformType::Rotate }); + layer->updateTransformation(3, IShaderLayer::TransformType::Rotate, "time", ""); + + expectDefinitionContains(material, "translate 1.0, 2.0"); + expectDefinitionContains(material, "scale 1.0, 1.0"); + expectDefinitionContains(material, "translate time, 1.0"); + expectDefinitionContains(material, "rotate time"); + expectDefinitionDoesNotContainAnyOf(material, { "shear", "centerScale", "scroll" }); +} + }