diff --git a/radiantcore/shaders/MaterialSourceGenerator.cpp b/radiantcore/shaders/MaterialSourceGenerator.cpp index 7af4abcd74..76dafbceff 100644 --- a/radiantcore/shaders/MaterialSourceGenerator.cpp +++ b/radiantcore/shaders/MaterialSourceGenerator.cpp @@ -134,6 +134,18 @@ std::ostream& operator<<(std::ostream& stream, ShaderTemplate& shaderTemplate) } } + // DecalInfo + if (shaderTemplate.getParseFlags() & Material::PF_HasDecalInfo) + { + const auto& decalInfo = shaderTemplate.getDecalInfo(); + stream << "\tdecalinfo " << (decalInfo.stayMilliSeconds / 1000.0f) << " " + << (decalInfo.fadeMilliSeconds / 1000.0f) << " " + << "( " << decalInfo.startColour.x() << " " << decalInfo.startColour.y() << " " + << decalInfo.startColour.z() << " " << decalInfo.startColour.w() << " ) " + << "( " << decalInfo.endColour.x() << " " << decalInfo.endColour.y() << " " + << decalInfo.endColour.z() << " " << decalInfo.endColour.w() << " )\n"; + } + for (const auto& layer : shaderTemplate.getLayers()) { stream << "\t{\n"; diff --git a/test/MaterialExport.cpp b/test/MaterialExport.cpp index eca3a0a691..6e0ac83eec 100644 --- a/test/MaterialExport.cpp +++ b/test/MaterialExport.cpp @@ -266,4 +266,15 @@ TEST_F(MaterialExportTest, Deform) expectDefinitionContains(material, "deform particle2 testparticle"); } +TEST_F(MaterialExportTest, DecalInfo) +{ + auto material = GlobalMaterialManager().getMaterial("textures/exporttest/decalinfo"); + expectDefinitionContains(material, "decalinfo"); + + // Mark the definition as modified by setting the description + material->setDescription("-"); + + expectDefinitionContains(material, "decalinfo 14.3 1.5 ( 0.9 0.8 0.7 0.6 ) ( 0.5 0.5 0.4 0.3 )"); +} + } diff --git a/test/Materials.cpp b/test/Materials.cpp index da7d69ebaf..8202cc6898 100644 --- a/test/Materials.cpp +++ b/test/Materials.cpp @@ -936,4 +936,21 @@ TEST_F(MaterialsTest, MaterialParserLightfallOff) EXPECT_EQ(material->getLightFalloffExpression()->getExpressionString(), "lights/squarelight1a"); } +TEST_F(MaterialsTest, MaterialParserDecalInfo) +{ + auto material = GlobalMaterialManager().getMaterial("textures/parsertest/decalinfo"); + + EXPECT_EQ(material->getDecalInfo().stayMilliSeconds, 14300); + EXPECT_EQ(material->getDecalInfo().fadeMilliSeconds, 1500); + + EXPECT_NEAR(material->getDecalInfo().startColour.x(), 0.9, TestEpsilon); + EXPECT_NEAR(material->getDecalInfo().startColour.y(), 0.8, TestEpsilon); + EXPECT_NEAR(material->getDecalInfo().startColour.z(), 0.7, TestEpsilon); + EXPECT_NEAR(material->getDecalInfo().startColour.w(), 0.6, TestEpsilon); + + EXPECT_NEAR(material->getDecalInfo().endColour.x(), 0.5, TestEpsilon); + EXPECT_NEAR(material->getDecalInfo().endColour.y(), 0.5, TestEpsilon); + EXPECT_NEAR(material->getDecalInfo().endColour.z(), 0.4, TestEpsilon); + EXPECT_NEAR(material->getDecalInfo().endColour.w(), 0.3, TestEpsilon); +} } diff --git a/test/resources/tdm/materials/exporttest.mtr b/test/resources/tdm/materials/exporttest.mtr index 25607b9396..0319be4e5f 100644 --- a/test/resources/tdm/materials/exporttest.mtr +++ b/test/resources/tdm/materials/exporttest.mtr @@ -52,4 +52,9 @@ textures/exporttest/deform5 textures/exporttest/deform6 { deform particle2 testparticle -} \ No newline at end of file +} + +textures/exporttest/decalinfo +{ + decalinfo 14.3 1.5 ( 0.9 0.8 0.7 0.6 ) (0.5 0.5 0.4 0.3) +} diff --git a/test/resources/tdm/materials/parsertest.mtr b/test/resources/tdm/materials/parsertest.mtr index 4746762f3a..625f575cd9 100644 --- a/test/resources/tdm/materials/parsertest.mtr +++ b/test/resources/tdm/materials/parsertest.mtr @@ -516,3 +516,9 @@ textures/parsertest/expressions/rotationCalculation rotate 0.005 * sintable [ time * 0.1] } } + +textures/parsertest/decalinfo +{ + decalinfo 14.3 1.5 ( 0.9 0.8 0.7 0.6 ) (0.5 0.5 0.4 0.3) +} +