From 21ed4a2371f527161af58b89a57cc32b477b9a2a Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 10 Sep 2024 12:13:28 +0200 Subject: [PATCH] Fix Flipbook node bug #2690 --- .../MaterialGenerator/MaterialGenerator.Textures.cpp | 10 +--------- Source/Shaders/MaterialCommon.hlsl | 8 ++++++++ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Textures.cpp b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Textures.cpp index 1ed776646..a69172e0a 100644 --- a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Textures.cpp +++ b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Textures.cpp @@ -644,20 +644,12 @@ void MaterialGenerator::ProcessGroupTextures(Box* box, Node* node, Value& value) // Flipbook case 10: { - // Get input values auto uv = Value::Cast(tryGetValue(node->GetBox(0), getUVs), VariantType::Float2); auto frame = Value::Cast(tryGetValue(node->GetBox(1), node->Values[0]), VariantType::Float); auto framesXY = Value::Cast(tryGetValue(node->GetBox(2), node->Values[1]), VariantType::Float2); auto invertX = Value::Cast(tryGetValue(node->GetBox(3), node->Values[2]), VariantType::Float); auto invertY = Value::Cast(tryGetValue(node->GetBox(4), node->Values[3]), VariantType::Float); - - // Write operations - auto framesCount = writeLocal(VariantType::Float, String::Format(TEXT("{0}.x * {1}.y"), framesXY.Value, framesXY.Value), node); - frame = writeLocal(VariantType::Float, String::Format(TEXT("fmod({0}, {1})"), frame.Value, framesCount.Value), node); - auto framesXYInv = writeOperation2(node, Value::One.AsFloat2(), framesXY, '/'); - auto frameY = writeLocal(VariantType::Float, String::Format(TEXT("abs({0} * {1}.y - (floor({2} * {3}.x) + {0} * 1))"), invertY.Value, framesXY.Value, frame.Value, framesXYInv.Value), node); - auto frameX = writeLocal(VariantType::Float, String::Format(TEXT("abs({0} * {1}.x - (({2} - {1}.x * floor({2} * {3}.x)) + {0} * 1))"), invertX.Value, framesXY.Value, frame.Value, framesXYInv.Value), node); - value = writeLocal(VariantType::Float2, String::Format(TEXT("({3} + float2({0}, {1})) * {2}"), frameX.Value, frameY.Value, framesXYInv.Value, uv.Value), node); + value = writeLocal(VariantType::Float2, String::Format(TEXT("Flipbook({0}, {1}, {2}, float2({3}, {4}))"), uv.Value, frame.Value, framesXY.Value, invertX.Value, invertY.Value), node); break; } // Sample Global SDF diff --git a/Source/Shaders/MaterialCommon.hlsl b/Source/Shaders/MaterialCommon.hlsl index 7fcfae018..75144dfeb 100644 --- a/Source/Shaders/MaterialCommon.hlsl +++ b/Source/Shaders/MaterialCommon.hlsl @@ -211,4 +211,12 @@ float3 AOMultiBounce(float visibility, float3 albedo) return max(visibility, ((visibility * a + b) * visibility + c) * visibility); } +float2 Flipbook(float2 uv, float frame, float2 sizeXY, float2 flipXY = 0.0f) +{ + float2 frameXY = float2((uint)frame % (uint)sizeXY.y, (uint)frame / (uint)sizeXY.x); + float2 flipFrameXY = sizeXY - frameXY - float2(1, 1); + frameXY = lerp(frameXY, flipFrameXY, flipXY); + return (uv + frameXY) / sizeXY; +} + #endif