diff --git a/radiantcore/shaders/MaterialManager.cpp b/radiantcore/shaders/MaterialManager.cpp index 32296381bf..a58ac987cf 100644 --- a/radiantcore/shaders/MaterialManager.cpp +++ b/radiantcore/shaders/MaterialManager.cpp @@ -331,10 +331,6 @@ void MaterialManager::initialiseModule(const IApplicationContext& ctx) construct(); -#if 0 - testShaderExpressionParsing(); -#endif - // Register the mtr file extension GlobalFiletypes().registerPattern("material", FileTypePattern(_("Material File"), "mtr", "*.mtr")); } @@ -349,168 +345,6 @@ void MaterialManager::onMaterialDefsReloaded() }); } - -// Horrible evil macro to avoid assertion failures if expr is NULL -#define GET_EXPR_OR_RETURN expr = createShaderExpressionFromString(exprStr);\ - if (!expr) return; - -void MaterialManager::testShaderExpressionParsing() -{ - // Test a few things - std::string exprStr = "3"; - IShaderExpression::Ptr expr; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "3+4"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "(3+4)"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "(4.2)"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "3+5+6"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "3+(5+6)"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "3 * 3+5"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "3+3*5"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "(3+3)*5"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "(3+3*7)-5"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "3-3*5"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "blinktable[0]"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "blinktable[1]"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "blinktable[0.3]"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "blinksnaptable[0.3]"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "xianjittertable[0]"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "xianjittertable[time]"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "3-3*xianjittertable[2]"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "3+xianjittertable[3]*7"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "(3+xianjittertable[3])*7"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "2.3 % 2"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "2.0 % 0.5"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "2 == 2"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "1 == 2"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "1 != 2"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "1.2 != 1.2"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "1.2 == 1.2*3"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "1.2*3 == 1.2*3"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "3 == 3 && 1 != 0"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "1 != 1 || 3 == 3"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "4 == 3 || 1 != 0"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "time"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(2) << std::endl; - - exprStr = "-3 + 5"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "3 * -5"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "3 * -5 + 4"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "3 + -5 * 4"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "3 * 5 * -6"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; - - exprStr = "decalFade[(time - Parm3)/(parm4 - parm3)]"; - GET_EXPR_OR_RETURN; - rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; -} - void MaterialManager::shutdownModule() { rMessage() << "MaterialManager::shutdownModule called" << std::endl; diff --git a/test/Materials.cpp b/test/Materials.cpp index a8e3618825..bf55430035 100644 --- a/test/Materials.cpp +++ b/test/Materials.cpp @@ -1527,4 +1527,53 @@ TEST_F(MaterialsTest, CoverageOfMaterialWithBlendStage) EXPECT_EQ(material->getCoverage(), Material::MC_OPAQUE) << "Material should be opaque"; } +TEST_F(MaterialsTest, ShaderExpressionEvaluation) +{ + auto testExpressions = std::map + { + { "3", 3.0f }, + { "3+4", 7.0f }, + { "(3+4)", 7.0f }, + { "(4.2)", 4.2f }, + { "3+5+6", 14.0f }, + { "3+(5+6)", 14.0f }, + { "3 * 3+5", 14.0f }, + { "3+3*5", 18.0f }, + { "(3+3)*5", 30.0f }, + { "(3+3*7)-5", 19.0f }, + { "3-3*5", -12.0f }, + { "cosTable[0]", 1.0f }, + { "cosTable[1]", 1.0f }, + { "cosTable[0.3]", -0.3090f }, + { "3-3*cosTable[2]", 0.0f }, + { "3+cosTable[3]*7", 10.0f }, + { "(3+cosTable[3])*7", 28.0f }, + { "2.3 % 2", 0.3f }, + { "2.0 % 0.5", 0.0f }, + { "2 == 2", 1.0f }, + { "1 == 2", 0.0f }, + { "1 != 2", 1.0f }, + { "1.2 != 1.2", 0.0f }, + { "1.2 == 1.2*3", 0.0f }, + { "1.2*3 == 1.2*3", 1.0f }, + { "3 == 3 && 1 != 0", 1.0f }, + { "1 != 1 || 3 == 3", 1.0f }, + { "4 == 3 || 1 != 0", 1.0f }, + { "time", 0.0f }, + { "-3 + 5", 2.0f }, + { "3 * -5", -15.0f }, + { "3 * -5 + 4", -11.0f }, + { "3 + -5 * 4", -17.0f }, + { "3 * 5 * -6", -90.0f }, + }; + + for (const auto& [expressionString, expectedValue] : testExpressions) + { + auto expr = GlobalMaterialManager().createShaderExpressionFromString(expressionString); + + EXPECT_NEAR(expr->getValue(0), expectedValue, 0.01f) << + "Expression " << expressionString << " should evaluate to " << expectedValue; + } +} + }