From 9b6feb93673f30443671b6d82b3235e091a39c15 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Mon, 7 Apr 2025 10:02:20 -0500 Subject: [PATCH 1/2] 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; From 1087bd24451f7b2842b5db5bcb6c7a33cfdc9a31 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Thu, 14 Aug 2025 11:53:25 +0200 Subject: [PATCH 2/2] Fix #3342 to properly place new param in Constant Buffer #3299 --- Content/Editor/MaterialTemplates/GUI.shader | 2 ++ .../MaterialTemplates/PostProcess.shader | 2 ++ Source/Editor/Surface/Archetypes/Tools.cs | 2 +- .../Graphics/Materials/GUIMaterialShader.cpp | 5 ++++- Source/Engine/Graphics/Materials/IMaterial.h | 3 +-- .../Graphics/Materials/MaterialShader.cpp | 17 +++++++++-------- .../Engine/Graphics/Materials/MaterialShader.h | 2 +- .../Materials/PostFxMaterialShader.cpp | 5 ++++- .../MaterialGenerator.Tools.cpp | 18 ++---------------- .../MaterialGenerator/MaterialGenerator.cpp | 2 +- .../MaterialGenerator/MaterialGenerator.h | 2 +- Source/Shaders/MaterialCommon.hlsl | 5 +++-- 12 files changed, 31 insertions(+), 34 deletions(-) diff --git a/Content/Editor/MaterialTemplates/GUI.shader b/Content/Editor/MaterialTemplates/GUI.shader index fad7afa32..69b6d3539 100644 --- a/Content/Editor/MaterialTemplates/GUI.shader +++ b/Content/Editor/MaterialTemplates/GUI.shader @@ -20,6 +20,8 @@ float TimeParam; float4 ViewInfo; float4 ScreenSize; float4 ViewSize; +float3 ViewPadding0; +float UnscaledTimeParam; @1META_CB_END // Shader resources diff --git a/Content/Editor/MaterialTemplates/PostProcess.shader b/Content/Editor/MaterialTemplates/PostProcess.shader index 927d63c8c..753ccb253 100644 --- a/Content/Editor/MaterialTemplates/PostProcess.shader +++ b/Content/Editor/MaterialTemplates/PostProcess.shader @@ -19,6 +19,8 @@ float4 ViewInfo; float4 ScreenSize; float4 TemporalAAJitter; float4x4 InverseViewProjectionMatrix; +float3 ViewPadding0; +float UnscaledTimeParam; @1META_CB_END // Shader resources diff --git a/Source/Editor/Surface/Archetypes/Tools.cs b/Source/Editor/Surface/Archetypes/Tools.cs index 3ba4813bd..0e4b567b9 100644 --- a/Source/Editor/Surface/Archetypes/Tools.cs +++ b/Source/Editor/Surface/Archetypes/Tools.cs @@ -1389,7 +1389,7 @@ namespace FlaxEditor.Surface.Archetypes Size = new Float2(110, 40), Elements = new[] { - NodeElementArchetype.Factory.Output(0, "Scaled Time", typeof(float), 0), + NodeElementArchetype.Factory.Output(0, "Time", typeof(float), 0), NodeElementArchetype.Factory.Output(1, "Unscaled Time", typeof(float), 1), } }, diff --git a/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp b/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp index 002736355..874694702 100644 --- a/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp @@ -23,6 +23,8 @@ PACK_STRUCT(struct GUIMaterialShaderData { Float4 ViewInfo; Float4 ScreenSize; Float4 ViewSize; + Float3 ViewPadding0; + float UnscaledTimeParam; }); void GUIMaterialShader::Bind(BindParameters& params) @@ -55,7 +57,8 @@ void GUIMaterialShader::Bind(BindParameters& params) materialData->ViewPos = Float3::Zero; materialData->ViewFar = 0.0f; materialData->ViewDir = Float3::Forward; - materialData->TimeParam = params.UnscaledTimeParam; + materialData->TimeParam = params.Time; + materialData->UnscaledTimeParam = params.UnscaledTime; 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 879925f07..23d06589b 100644 --- a/Source/Engine/Graphics/Materials/IMaterial.h +++ b/Source/Engine/Graphics/Materials/IMaterial.h @@ -148,8 +148,7 @@ public: const ::DrawCall* DrawCall = nullptr; MaterialParamsLink* ParamsLink = nullptr; void* CustomData = nullptr; - float UnscaledTimeParam; - float ScaledTimeParam; + float Time, UnscaledTime; bool Instanced = false; /// diff --git a/Source/Engine/Graphics/Materials/MaterialShader.cpp b/Source/Engine/Graphics/Materials/MaterialShader.cpp index 527914f6e..98edca2bf 100644 --- a/Source/Engine/Graphics/Materials/MaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/MaterialShader.cpp @@ -30,20 +30,21 @@ GPU_CB_STRUCT(MaterialShaderDataPerView { Float3 ViewPos; float ViewFar; Float3 ViewDir; - float UnscaledTimeParam; - float ScaledTimeParam; + float TimeParam; Float4 ViewInfo; Float4 ScreenSize; Float4 TemporalAAJitter; Float3 LargeWorldsChunkIndex; float LargeWorldsChunkSize; + Float3 ViewPadding0; + float UnscaledTimeParam; }); IMaterial::BindParameters::BindParameters(::GPUContext* context, const ::RenderContext& renderContext) : GPUContext(context) , RenderContext(renderContext) - , UnscaledTimeParam(Time::Draw.UnscaledTime.GetTotalSeconds()) - , ScaledTimeParam(Time::Draw.Time.GetTotalSeconds()) + , Time(Time::Draw.Time.GetTotalSeconds()) + , UnscaledTime(Time::Draw.UnscaledTime.GetTotalSeconds()) { } @@ -51,8 +52,8 @@ IMaterial::BindParameters::BindParameters(::GPUContext* context, const ::RenderC : GPUContext(context) , RenderContext(renderContext) , DrawCall(&drawCall) - , UnscaledTimeParam(Time::Draw.UnscaledTime.GetTotalSeconds()) - , ScaledTimeParam(Time::Draw.Time.GetTotalSeconds()) + , Time(Time::Draw.Time.GetTotalSeconds()) + , UnscaledTime(Time::Draw.UnscaledTime.GetTotalSeconds()) , Instanced(instanced) { } @@ -80,8 +81,8 @@ void IMaterial::BindParameters::BindViewData() cb.ViewPos = view.Position; cb.ViewFar = view.Far; cb.ViewDir = view.Direction; - cb.UnscaledTimeParam = UnscaledTimeParam; - cb.ScaledTimeParam = ScaledTimeParam; + cb.TimeParam = Time; + cb.UnscaledTimeParam = UnscaledTime; cb.ViewInfo = view.ViewInfo; cb.ScreenSize = view.ScreenSize; cb.TemporalAAJitter = view.TemporalAAJitter; diff --git a/Source/Engine/Graphics/Materials/MaterialShader.h b/Source/Engine/Graphics/Materials/MaterialShader.h index ccc11c8cf..aedf2e870 100644 --- a/Source/Engine/Graphics/Materials/MaterialShader.h +++ b/Source/Engine/Graphics/Materials/MaterialShader.h @@ -10,7 +10,7 @@ /// /// Current materials shader version. /// -#define MATERIAL_GRAPH_VERSION 173 +#define MATERIAL_GRAPH_VERSION 174 class Material; class GPUShader; diff --git a/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp b/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp index 61ca23248..c82dd7447 100644 --- a/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp @@ -21,6 +21,8 @@ PACK_STRUCT(struct PostFxMaterialShaderData { Float4 ScreenSize; Float4 TemporalAAJitter; Matrix InverseViewProjectionMatrix; + Float3 ViewPadding0; + float UnscaledTimeParam; }); void PostFxMaterialShader::Bind(BindParameters& params) @@ -51,7 +53,8 @@ void PostFxMaterialShader::Bind(BindParameters& params) materialData->ViewPos = view.Position; materialData->ViewFar = view.Far; materialData->ViewDir = view.Direction; - materialData->TimeParam = params.UnscaledTimeParam; + materialData->TimeParam = params.Time; + materialData->UnscaledTimeParam = params.UnscaledTime; 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 dcaee67d8..056ddd7ce 100644 --- a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Tools.cpp +++ b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Tools.cpp @@ -48,28 +48,14 @@ void MaterialGenerator::ProcessGroupTools(Box* box, Node* node, Value& value) } // Time case 3: - { - switch (box->ID) - { - // Scaled Time - case 0: - value = getScaledTime; - break; - // Unscaled Time - case 1: - value = getUnscaledTime; - break; - default: - break; - } + value = box->ID == 1 ? getUnscaledTime : getTime; break; - } // Panner case 6: { // Get inputs const Value uv = tryGetValue(node->GetBox(0), getUVs).AsFloat2(); - const Value time = tryGetValue(node->GetBox(1), getUnscaledTime).AsFloat(); + const Value time = tryGetValue(node->GetBox(1), getTime).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 1eccf69fb..b958f5f56 100644 --- a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.cpp +++ b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.cpp @@ -106,8 +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 54ca9616c..706929d75 100644 --- a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.h +++ b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.h @@ -209,8 +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 c8bd1a3ec..897b01d7e 100644 --- a/Source/Shaders/MaterialCommon.hlsl +++ b/Source/Shaders/MaterialCommon.hlsl @@ -170,13 +170,14 @@ cbuffer ViewData : register(b1) float3 ViewPos; float ViewFar; float3 ViewDir; - float UnscaledTimeParam; - float ScaledTimeParam; + float TimeParam; float4 ViewInfo; float4 ScreenSize; float4 TemporalAAJitter; float3 LargeWorldsChunkIndex; float LargeWorldsChunkSize; + float3 ViewPadding0; + float UnscaledTimeParam; }; #endif