diff --git a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.cpp b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.cpp index b2c998410..46368cf73 100644 --- a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.cpp +++ b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.cpp @@ -5,6 +5,7 @@ #include "MaterialGenerator.h" #include "Engine/Visject/ShaderGraphUtilities.h" #include "Engine/Platform/File.h" +#include "Engine/Platform/FileSystem.h" #include "Engine/Graphics/Materials/MaterialShader.h" #include "Engine/Graphics/Materials/MaterialShaderFeatures.h" #include "Engine/Engine/Globals.h" @@ -47,9 +48,11 @@ enum class FeatureTemplateInputsMapping struct FeatureData { MaterialShaderFeature::GeneratorData Data; + DateTime FileTime; String Inputs[(int32)FeatureTemplateInputsMapping::MAX]; bool Init(); + void CheckReload(); }; namespace @@ -69,6 +72,7 @@ bool FeatureData::Init() LOG(Error, "Cannot open file {0}", path); return true; } + FileTime = FileSystem::GetFileLastEditTime(path); int32 i = 0; const int32 length = contents.Length(); @@ -105,6 +109,20 @@ bool FeatureData::Init() return false; } +void FeatureData::CheckReload() +{ +#if COMPILE_WITH_DEV_ENV + // Reload if template has been modified + const String path = Globals::EngineContentFolder / TEXT("Editor/MaterialTemplates/") + Data.Template; + if (FileTime < FileSystem::GetFileLastEditTime(path)) + { + for (auto& e : Inputs) + e.Clear(); + Init(); + } +#endif +} + MaterialValue MaterialGenerator::getUVs(VariantType::Float2, TEXT("input.TexCoord")); MaterialValue MaterialGenerator::getTime(VariantType::Float, TEXT("TimeParam")); MaterialValue MaterialGenerator::getScaledTime(VariantType::Float, TEXT("ScaledTimeParam")); @@ -183,7 +201,7 @@ bool MaterialGenerator::Generate(WriteStream& source, MaterialInfo& materialInfo type::Generate(feature.Data); \ if (feature.Init()) \ return true; \ - } \ + } else if (COMPILE_WITH_DEV_ENV) Features[typeName].CheckReload(); \ } const bool isOpaque = materialInfo.BlendMode == MaterialBlendMode::Opaque; switch (baseLayer->Domain)