From 9b6feb93673f30443671b6d82b3235e091a39c15 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Mon, 7 Apr 2025 10:02:20 -0500 Subject: [PATCH] Add Scaled Time to Material Time node. --- Source/Editor/Surface/Archetypes/Tools.cs | 5 +++-- .../Graphics/Materials/GUIMaterialShader.cpp | 2 +- Source/Engine/Graphics/Materials/IMaterial.h | 3 ++- .../Engine/Graphics/Materials/MaterialShader.cpp | 12 ++++++++---- .../Graphics/Materials/PostFxMaterialShader.cpp | 2 +- .../MaterialGenerator.Tools.cpp | 16 ++++++++++++++-- .../MaterialGenerator/MaterialGenerator.cpp | 3 ++- .../Tools/MaterialGenerator/MaterialGenerator.h | 4 ++-- Source/Shaders/MaterialCommon.hlsl | 3 ++- 9 files changed, 35 insertions(+), 15 deletions(-) diff --git a/Source/Editor/Surface/Archetypes/Tools.cs b/Source/Editor/Surface/Archetypes/Tools.cs index e08171ca2..eb03ac2e6 100644 --- a/Source/Editor/Surface/Archetypes/Tools.cs +++ b/Source/Editor/Surface/Archetypes/Tools.cs @@ -1386,10 +1386,11 @@ namespace FlaxEditor.Surface.Archetypes Title = "Time", Description = "Game time constant", Flags = NodeFlags.MaterialGraph, - Size = new Float2(110, 20), + Size = new Float2(110, 40), 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 diff --git a/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp b/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp index 13f8aa810..1a74348f1 100644 --- a/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp @@ -55,7 +55,7 @@ void GUIMaterialShader::Bind(BindParameters& params) materialData->ViewPos = Float3::Zero; materialData->ViewFar = 0.0f; materialData->ViewDir = Float3::Forward; - materialData->TimeParam = params.TimeParam; + materialData->TimeParam = params.UnscaledTimeParam; materialData->ViewInfo = Float4::Zero; auto& viewport = Render2D::GetViewport(); materialData->ScreenSize = Float4(viewport.Width, viewport.Height, 1.0f / viewport.Width, 1.0f / viewport.Height); diff --git a/Source/Engine/Graphics/Materials/IMaterial.h b/Source/Engine/Graphics/Materials/IMaterial.h index ba0e2acae..d85f4a836 100644 --- a/Source/Engine/Graphics/Materials/IMaterial.h +++ b/Source/Engine/Graphics/Materials/IMaterial.h @@ -148,7 +148,8 @@ public: const ::DrawCall* DrawCall = nullptr; MaterialParamsLink* ParamsLink = nullptr; void* CustomData = nullptr; - float TimeParam; + float UnscaledTimeParam; + float ScaledTimeParam; bool Instanced = false; /// diff --git a/Source/Engine/Graphics/Materials/MaterialShader.cpp b/Source/Engine/Graphics/Materials/MaterialShader.cpp index ac1b1c6f9..54be98f9d 100644 --- a/Source/Engine/Graphics/Materials/MaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/MaterialShader.cpp @@ -30,7 +30,8 @@ GPU_CB_STRUCT(MaterialShaderDataPerView { Float3 ViewPos; float ViewFar; Float3 ViewDir; - float TimeParam; + float UnscaledTimeParam; + float ScaledTimeParam; Float4 ViewInfo; Float4 ScreenSize; Float4 TemporalAAJitter; @@ -41,7 +42,8 @@ GPU_CB_STRUCT(MaterialShaderDataPerView { IMaterial::BindParameters::BindParameters(::GPUContext* context, const ::RenderContext& renderContext) : GPUContext(context) , 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) , RenderContext(renderContext) , DrawCall(&drawCall) - , TimeParam(Time::Draw.UnscaledTime.GetTotalSeconds()) + , UnscaledTimeParam(Time::Draw.UnscaledTime.GetTotalSeconds()) + , ScaledTimeParam(Time::Draw.Time.GetTotalSeconds()) , Instanced(instanced) { } @@ -77,7 +80,8 @@ void IMaterial::BindParameters::BindViewData() cb.ViewPos = view.Position; cb.ViewFar = view.Far; cb.ViewDir = view.Direction; - cb.TimeParam = TimeParam; + cb.UnscaledTimeParam = UnscaledTimeParam; + cb.ScaledTimeParam = ScaledTimeParam; cb.ViewInfo = view.ViewInfo; cb.ScreenSize = view.ScreenSize; cb.TemporalAAJitter = view.TemporalAAJitter; diff --git a/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp b/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp index c820fc613..893fc6ed3 100644 --- a/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp @@ -51,7 +51,7 @@ void PostFxMaterialShader::Bind(BindParameters& params) materialData->ViewPos = view.Position; materialData->ViewFar = view.Far; materialData->ViewDir = view.Direction; - materialData->TimeParam = params.TimeParam; + materialData->TimeParam = params.UnscaledTimeParam; materialData->ViewInfo = view.ViewInfo; materialData->ScreenSize = view.ScreenSize; materialData->TemporalAAJitter = view.TemporalAAJitter; diff --git a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Tools.cpp b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Tools.cpp index 970aa3135..1849e5ee5 100644 --- a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Tools.cpp +++ b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Tools.cpp @@ -49,7 +49,19 @@ void MaterialGenerator::ProcessGroupTools(Box* box, Node* node, Value& value) // Time case 3: { - value = getTime; + switch (box->ID) + { + // Scaled Time + case 0: + value = getScaledTime; + break; + // Unscaled Time + case 1: + value = getUnscaledTime; + break; + default: + break; + } break; } // Panner @@ -57,7 +69,7 @@ void MaterialGenerator::ProcessGroupTools(Box* box, Node* node, Value& value) { // Get inputs 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 bool useFractionalPart = (bool)node->Values[0]; diff --git a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.cpp b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.cpp index ea1478cad..3eb90b907 100644 --- a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.cpp +++ b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.cpp @@ -106,7 +106,8 @@ bool FeatureData::Init() } 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::getNormalZero(VariantType::Float3, TEXT("float3(0, 0, 1)")); MaterialValue MaterialGenerator::getVertexColor(VariantType::Float4, TEXT("GetVertexColor(input)")); diff --git a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.h b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.h index 980148d97..318e43a2d 100644 --- a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.h +++ b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.h @@ -120,7 +120,6 @@ private: MaterialValue _ddx, _ddy, _cameraVector; public: - MaterialGenerator(); ~MaterialGenerator(); @@ -210,7 +209,8 @@ private: public: static MaterialValue getUVs; - static MaterialValue getTime; + static MaterialValue getUnscaledTime; + static MaterialValue getScaledTime; static MaterialValue getNormal; static MaterialValue getNormalZero; static MaterialValue getVertexColor; diff --git a/Source/Shaders/MaterialCommon.hlsl b/Source/Shaders/MaterialCommon.hlsl index bd2030b71..ded93e27b 100644 --- a/Source/Shaders/MaterialCommon.hlsl +++ b/Source/Shaders/MaterialCommon.hlsl @@ -167,7 +167,8 @@ cbuffer ViewData : register(b1) float3 ViewPos; float ViewFar; float3 ViewDir; - float TimeParam; + float UnscaledTimeParam; + float ScaledTimeParam; float4 ViewInfo; float4 ScreenSize; float4 TemporalAAJitter;