Skip to content

Commit

Permalink
#5565: Export condition expression
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Mar 26, 2021
1 parent 3ae66b7 commit d459f81
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 2 deletions.
9 changes: 9 additions & 0 deletions radiantcore/shaders/Doom3ShaderLayer.cpp
Expand Up @@ -898,6 +898,15 @@ void Doom3ShaderLayer::setColourExpressionFromString(ColourComponentSelector com
void Doom3ShaderLayer::setConditionExpressionFromString(const std::string& expression)
{
_expressionSlots.assignFromString(Expression::Condition, expression, REG_ONE);

// Make sure the condition expression is surrounded by parens
auto condition = std::dynamic_pointer_cast<ShaderExpression>(_expressionSlots[Expression::Condition].expression);

if (condition)
{
condition->setIsSurroundedByParentheses(true);
}

_material.onLayerChanged();
}

Expand Down
6 changes: 6 additions & 0 deletions radiantcore/shaders/MaterialSourceGenerator.cpp
Expand Up @@ -13,6 +13,12 @@ std::ostream& operator<<(std::ostream& stream, Doom3ShaderLayer& layer)
{
stream << "\t{\n";

// Condition goes first
if (layer.getConditionExpression())
{
stream << "\t\tif " << layer.getConditionExpression()->getExpressionString() << "\n";
}

// Blend types
const auto& blendFunc = layer.getBlendFuncStrings();

Expand Down
27 changes: 26 additions & 1 deletion test/MaterialExport.cpp
Expand Up @@ -880,7 +880,6 @@ TEST_F(MaterialExportTest, StageTransforms)
expectDefinitionDoesNotContainAnyOf(material, { "shear", "centerScale", "scroll" });
}


TEST_F(MaterialExportTest, StageAlphaTest)
{
auto material = GlobalMaterialManager().getMaterial("textures/exporttest/empty");
Expand All @@ -904,4 +903,30 @@ TEST_F(MaterialExportTest, StageAlphaTest)
expectDefinitionDoesNotContain(material, "alphaTest");
}

TEST_F(MaterialExportTest, StageCondition)
{
auto material = GlobalMaterialManager().getMaterial("textures/exporttest/empty");

EXPECT_EQ(string::trim_copy(material->getDefinition()), "");

// Add condition without parentheses
auto layer = material->getEditableLayer(material->addLayer(IShaderLayer::BLEND));
layer->setConditionExpressionFromString("parm5 > 3");
expectDefinitionContains(material, "if (parm5 > 3.0)");

material->revertModifications();

// Add condition with parentheses
layer = material->getEditableLayer(material->addLayer(IShaderLayer::BLEND));
layer->setConditionExpressionFromString("(parm5 > 3");
expectDefinitionContains(material, "if (parm5 > 3.0)");

material->revertModifications();

// Clear condition
layer = material->getEditableLayer(material->addLayer(IShaderLayer::BLEND));
layer->setConditionExpressionFromString("");
expectDefinitionDoesNotContain(material, "if");
}

}
11 changes: 11 additions & 0 deletions test/Materials.cpp
Expand Up @@ -1228,4 +1228,15 @@ TEST_F(MaterialsTest, MaterialParserStageAlphaTest)
EXPECT_EQ(layer->getAlphaTestExpression()->getExpressionString(), "sinTable[time]");
}

TEST_F(MaterialsTest, MaterialParserStageCondition)
{
auto material = GlobalMaterialManager().getMaterial("textures/parsertest/transform/notransform");
EXPECT_FALSE(material->getAllLayers().at(0)->getConditionExpression());

material = GlobalMaterialManager().getMaterial("textures/parsertest/condition");

auto layer = material->getAllLayers().at(0);
EXPECT_EQ(material->getAllLayers().at(0)->getConditionExpression()->getExpressionString(), "(parm4 > 0.0)");
}

}
11 changes: 10 additions & 1 deletion test/resources/tdm/materials/parsertest.mtr
Expand Up @@ -894,4 +894,13 @@ textures/parsertest/alphaTest
map _white
alphaTest sinTable[time]
}
}
}

textures/parsertest/condition
{
{
if (parm4 > 0)
blend diffusemap
map _white
}
}

0 comments on commit d459f81

Please sign in to comment.