Add hot-reload support for material feature template sources on material generation

This commit is contained in:
Wojtek Figat
2025-09-30 15:45:45 +02:00
parent 2a5898c1de
commit c46e1164d6

View File

@@ -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)