Merge branch 'add-scaled-time-node' of https://github.com/Tryibion/FlaxEngine into Tryibion-add-scaled-time-node

This commit is contained in:
Wojtek Figat
2025-08-14 11:37:09 +02:00
9 changed files with 35 additions and 15 deletions

View File

@@ -1386,10 +1386,11 @@ namespace FlaxEditor.Surface.Archetypes
Title = "Time", Title = "Time",
Description = "Game time constant", Description = "Game time constant",
Flags = NodeFlags.MaterialGraph, Flags = NodeFlags.MaterialGraph,
Size = new Float2(110, 20), Size = new Float2(110, 40),
Elements = new[] Elements = new[]
{ {
NodeElementArchetype.Factory.Output(0, "", typeof(float), 0), NodeElementArchetype.Factory.Output(0, "Scaled Time", typeof(float), 0),
NodeElementArchetype.Factory.Output(1, "Unscaled Time", typeof(float), 1),
} }
}, },
new NodeArchetype new NodeArchetype

View File

@@ -55,7 +55,7 @@ void GUIMaterialShader::Bind(BindParameters& params)
materialData->ViewPos = Float3::Zero; materialData->ViewPos = Float3::Zero;
materialData->ViewFar = 0.0f; materialData->ViewFar = 0.0f;
materialData->ViewDir = Float3::Forward; materialData->ViewDir = Float3::Forward;
materialData->TimeParam = params.TimeParam; materialData->TimeParam = params.UnscaledTimeParam;
materialData->ViewInfo = Float4::Zero; materialData->ViewInfo = Float4::Zero;
auto& viewport = Render2D::GetViewport(); auto& viewport = Render2D::GetViewport();
materialData->ScreenSize = Float4(viewport.Width, viewport.Height, 1.0f / viewport.Width, 1.0f / viewport.Height); materialData->ScreenSize = Float4(viewport.Width, viewport.Height, 1.0f / viewport.Width, 1.0f / viewport.Height);

View File

@@ -148,7 +148,8 @@ public:
const ::DrawCall* DrawCall = nullptr; const ::DrawCall* DrawCall = nullptr;
MaterialParamsLink* ParamsLink = nullptr; MaterialParamsLink* ParamsLink = nullptr;
void* CustomData = nullptr; void* CustomData = nullptr;
float TimeParam; float UnscaledTimeParam;
float ScaledTimeParam;
bool Instanced = false; bool Instanced = false;
/// <summary> /// <summary>

View File

@@ -30,7 +30,8 @@ GPU_CB_STRUCT(MaterialShaderDataPerView {
Float3 ViewPos; Float3 ViewPos;
float ViewFar; float ViewFar;
Float3 ViewDir; Float3 ViewDir;
float TimeParam; float UnscaledTimeParam;
float ScaledTimeParam;
Float4 ViewInfo; Float4 ViewInfo;
Float4 ScreenSize; Float4 ScreenSize;
Float4 TemporalAAJitter; Float4 TemporalAAJitter;
@@ -41,7 +42,8 @@ GPU_CB_STRUCT(MaterialShaderDataPerView {
IMaterial::BindParameters::BindParameters(::GPUContext* context, const ::RenderContext& renderContext) IMaterial::BindParameters::BindParameters(::GPUContext* context, const ::RenderContext& renderContext)
: GPUContext(context) : GPUContext(context)
, RenderContext(renderContext) , RenderContext(renderContext)
, TimeParam(Time::Draw.UnscaledTime.GetTotalSeconds()) , UnscaledTimeParam(Time::Draw.UnscaledTime.GetTotalSeconds())
, ScaledTimeParam(Time::Draw.Time.GetTotalSeconds())
{ {
} }
@@ -49,7 +51,8 @@ IMaterial::BindParameters::BindParameters(::GPUContext* context, const ::RenderC
: GPUContext(context) : GPUContext(context)
, RenderContext(renderContext) , RenderContext(renderContext)
, DrawCall(&drawCall) , DrawCall(&drawCall)
, TimeParam(Time::Draw.UnscaledTime.GetTotalSeconds()) , UnscaledTimeParam(Time::Draw.UnscaledTime.GetTotalSeconds())
, ScaledTimeParam(Time::Draw.Time.GetTotalSeconds())
, Instanced(instanced) , Instanced(instanced)
{ {
} }
@@ -77,7 +80,8 @@ void IMaterial::BindParameters::BindViewData()
cb.ViewPos = view.Position; cb.ViewPos = view.Position;
cb.ViewFar = view.Far; cb.ViewFar = view.Far;
cb.ViewDir = view.Direction; cb.ViewDir = view.Direction;
cb.TimeParam = TimeParam; cb.UnscaledTimeParam = UnscaledTimeParam;
cb.ScaledTimeParam = ScaledTimeParam;
cb.ViewInfo = view.ViewInfo; cb.ViewInfo = view.ViewInfo;
cb.ScreenSize = view.ScreenSize; cb.ScreenSize = view.ScreenSize;
cb.TemporalAAJitter = view.TemporalAAJitter; cb.TemporalAAJitter = view.TemporalAAJitter;

View File

@@ -51,7 +51,7 @@ void PostFxMaterialShader::Bind(BindParameters& params)
materialData->ViewPos = view.Position; materialData->ViewPos = view.Position;
materialData->ViewFar = view.Far; materialData->ViewFar = view.Far;
materialData->ViewDir = view.Direction; materialData->ViewDir = view.Direction;
materialData->TimeParam = params.TimeParam; materialData->TimeParam = params.UnscaledTimeParam;
materialData->ViewInfo = view.ViewInfo; materialData->ViewInfo = view.ViewInfo;
materialData->ScreenSize = view.ScreenSize; materialData->ScreenSize = view.ScreenSize;
materialData->TemporalAAJitter = view.TemporalAAJitter; materialData->TemporalAAJitter = view.TemporalAAJitter;

View File

@@ -49,7 +49,19 @@ void MaterialGenerator::ProcessGroupTools(Box* box, Node* node, Value& value)
// Time // Time
case 3: case 3:
{ {
value = getTime; switch (box->ID)
{
// Scaled Time
case 0:
value = getScaledTime;
break;
// Unscaled Time
case 1:
value = getUnscaledTime;
break;
default:
break;
}
break; break;
} }
// Panner // Panner
@@ -57,7 +69,7 @@ void MaterialGenerator::ProcessGroupTools(Box* box, Node* node, Value& value)
{ {
// Get inputs // Get inputs
const Value uv = tryGetValue(node->GetBox(0), getUVs).AsFloat2(); const Value uv = tryGetValue(node->GetBox(0), getUVs).AsFloat2();
const Value time = tryGetValue(node->GetBox(1), getTime).AsFloat(); const Value time = tryGetValue(node->GetBox(1), getUnscaledTime).AsFloat();
const Value speed = tryGetValue(node->GetBox(2), Value::One).AsFloat2(); const Value speed = tryGetValue(node->GetBox(2), Value::One).AsFloat2();
const bool useFractionalPart = (bool)node->Values[0]; const bool useFractionalPart = (bool)node->Values[0];

View File

@@ -106,7 +106,8 @@ bool FeatureData::Init()
} }
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::getUnscaledTime(VariantType::Float, TEXT("UnscaledTimeParam"));
MaterialValue MaterialGenerator::getScaledTime(VariantType::Float, TEXT("ScaledTimeParam"));
MaterialValue MaterialGenerator::getNormal(VariantType::Float3, TEXT("input.TBN[2]")); MaterialValue MaterialGenerator::getNormal(VariantType::Float3, TEXT("input.TBN[2]"));
MaterialValue MaterialGenerator::getNormalZero(VariantType::Float3, TEXT("float3(0, 0, 1)")); MaterialValue MaterialGenerator::getNormalZero(VariantType::Float3, TEXT("float3(0, 0, 1)"));
MaterialValue MaterialGenerator::getVertexColor(VariantType::Float4, TEXT("GetVertexColor(input)")); MaterialValue MaterialGenerator::getVertexColor(VariantType::Float4, TEXT("GetVertexColor(input)"));

View File

@@ -120,7 +120,6 @@ private:
MaterialValue _ddx, _ddy, _cameraVector; MaterialValue _ddx, _ddy, _cameraVector;
public: public:
MaterialGenerator(); MaterialGenerator();
~MaterialGenerator(); ~MaterialGenerator();
@@ -210,7 +209,8 @@ private:
public: public:
static MaterialValue getUVs; static MaterialValue getUVs;
static MaterialValue getTime; static MaterialValue getUnscaledTime;
static MaterialValue getScaledTime;
static MaterialValue getNormal; static MaterialValue getNormal;
static MaterialValue getNormalZero; static MaterialValue getNormalZero;
static MaterialValue getVertexColor; static MaterialValue getVertexColor;

View File

@@ -170,7 +170,8 @@ cbuffer ViewData : register(b1)
float3 ViewPos; float3 ViewPos;
float ViewFar; float ViewFar;
float3 ViewDir; float3 ViewDir;
float TimeParam; float UnscaledTimeParam;
float ScaledTimeParam;
float4 ViewInfo; float4 ViewInfo;
float4 ScreenSize; float4 ScreenSize;
float4 TemporalAAJitter; float4 TemporalAAJitter;