Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
#5565: Export stage transforms
  • Loading branch information
codereader committed Mar 26, 2021
1 parent ff4b119 commit c7eba3a
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 0 deletions.
26 changes: 26 additions & 0 deletions radiantcore/shaders/MaterialSourceGenerator.cpp
Expand Up @@ -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;
Expand Down
68 changes: 68 additions & 0 deletions test/MaterialExport.cpp
Expand Up @@ -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" });
}

}

0 comments on commit c7eba3a

Please sign in to comment.