Add hot-reload support for material feature template sources on material generation
This commit is contained in:
@@ -5,6 +5,7 @@
|
|||||||
#include "MaterialGenerator.h"
|
#include "MaterialGenerator.h"
|
||||||
#include "Engine/Visject/ShaderGraphUtilities.h"
|
#include "Engine/Visject/ShaderGraphUtilities.h"
|
||||||
#include "Engine/Platform/File.h"
|
#include "Engine/Platform/File.h"
|
||||||
|
#include "Engine/Platform/FileSystem.h"
|
||||||
#include "Engine/Graphics/Materials/MaterialShader.h"
|
#include "Engine/Graphics/Materials/MaterialShader.h"
|
||||||
#include "Engine/Graphics/Materials/MaterialShaderFeatures.h"
|
#include "Engine/Graphics/Materials/MaterialShaderFeatures.h"
|
||||||
#include "Engine/Engine/Globals.h"
|
#include "Engine/Engine/Globals.h"
|
||||||
@@ -47,9 +48,11 @@ enum class FeatureTemplateInputsMapping
|
|||||||
struct FeatureData
|
struct FeatureData
|
||||||
{
|
{
|
||||||
MaterialShaderFeature::GeneratorData Data;
|
MaterialShaderFeature::GeneratorData Data;
|
||||||
|
DateTime FileTime;
|
||||||
String Inputs[(int32)FeatureTemplateInputsMapping::MAX];
|
String Inputs[(int32)FeatureTemplateInputsMapping::MAX];
|
||||||
|
|
||||||
bool Init();
|
bool Init();
|
||||||
|
void CheckReload();
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
@@ -69,6 +72,7 @@ bool FeatureData::Init()
|
|||||||
LOG(Error, "Cannot open file {0}", path);
|
LOG(Error, "Cannot open file {0}", path);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
FileTime = FileSystem::GetFileLastEditTime(path);
|
||||||
|
|
||||||
int32 i = 0;
|
int32 i = 0;
|
||||||
const int32 length = contents.Length();
|
const int32 length = contents.Length();
|
||||||
@@ -105,6 +109,20 @@ bool FeatureData::Init()
|
|||||||
return false;
|
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::getUVs(VariantType::Float2, TEXT("input.TexCoord"));
|
||||||
MaterialValue MaterialGenerator::getTime(VariantType::Float, TEXT("TimeParam"));
|
MaterialValue MaterialGenerator::getTime(VariantType::Float, TEXT("TimeParam"));
|
||||||
MaterialValue MaterialGenerator::getScaledTime(VariantType::Float, TEXT("ScaledTimeParam"));
|
MaterialValue MaterialGenerator::getScaledTime(VariantType::Float, TEXT("ScaledTimeParam"));
|
||||||
@@ -183,7 +201,7 @@ bool MaterialGenerator::Generate(WriteStream& source, MaterialInfo& materialInfo
|
|||||||
type::Generate(feature.Data); \
|
type::Generate(feature.Data); \
|
||||||
if (feature.Init()) \
|
if (feature.Init()) \
|
||||||
return true; \
|
return true; \
|
||||||
} \
|
} else if (COMPILE_WITH_DEV_ENV) Features[typeName].CheckReload(); \
|
||||||
}
|
}
|
||||||
const bool isOpaque = materialInfo.BlendMode == MaterialBlendMode::Opaque;
|
const bool isOpaque = materialInfo.BlendMode == MaterialBlendMode::Opaque;
|
||||||
switch (baseLayer->Domain)
|
switch (baseLayer->Domain)
|
||||||
|
|||||||
Reference in New Issue
Block a user