From be395304ec7b12f548388920819e5d0b2f98051e Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Thu, 19 Sep 2024 10:11:49 +0200 Subject: [PATCH] Fix Pre-Skinned Normal and Position when accessed in Pixel Shader #2549 --- .../MaterialGenerator.Material.cpp | 40 ++++--------------- .../MaterialGenerator/MaterialGenerator.cpp | 28 +++++++++++++ .../MaterialGenerator/MaterialGenerator.h | 1 + 3 files changed, 36 insertions(+), 33 deletions(-) diff --git a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp index 03b27bfa1..f56f7843c 100644 --- a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp +++ b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp @@ -183,11 +183,15 @@ void MaterialGenerator::ProcessGroupMaterial(Box* box, Node* node, Value& value) break; // Pre-skinned Local Position case 13: - value = _treeType == MaterialTreeType::VertexShader ? Value(VariantType::Float3, TEXT("input.PreSkinnedPosition")) : Value::Zero; + value = Value(VariantType::Float3, TEXT("input.PreSkinnedPosition")); + if (_treeType != MaterialTreeType::VertexShader) + value = VsToPs(node, box).AsFloat3(); break; // Pre-skinned Local Normal case 14: - value = _treeType == MaterialTreeType::VertexShader ? Value(VariantType::Float3, TEXT("input.PreSkinnedNormal")) : Value::Zero; + value = Value(VariantType::Float3, TEXT("input.PreSkinnedNormal")); + if (_treeType != MaterialTreeType::VertexShader) + value = VsToPs(node, box).AsFloat3(); break; // Depth case 15: @@ -211,38 +215,8 @@ void MaterialGenerator::ProcessGroupMaterial(Box* box, Node* node, Value& value) break; // Interpolate VS To PS case 20: - { - const auto input = node->GetBox(0); - - // If used in VS then pass the value from the input box - if (_treeType == MaterialTreeType::VertexShader) - { - value = tryGetValue(input, Value::Zero).AsFloat4(); - break; - } - - // Check if can use more interpolants - if (_vsToPsInterpolants.Count() == 16) - { - OnError(node, box, TEXT("Too many VS to PS interpolants used.")); - value = Value::Zero; - break; - } - - // Check if can use interpolants - const auto layer = GetRootLayer(); - if (!layer || layer->Domain == MaterialDomain::Decal || layer->Domain == MaterialDomain::PostProcess) - { - OnError(node, box, TEXT("VS to PS interpolants are not supported in Decal or Post Process materials.")); - value = Value::Zero; - break; - } - - // Indicate the interpolator slot usage - value = Value(VariantType::Float4, String::Format(TEXT("input.CustomVSToPS[{0}]"), _vsToPsInterpolants.Count())); - _vsToPsInterpolants.Add(input); + value = VsToPs(node, node->GetBox(0)); break; - } // Terrain Holes Mask case 21: { diff --git a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.cpp b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.cpp index f9ca26705..858a6dc4f 100644 --- a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.cpp +++ b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.cpp @@ -832,4 +832,32 @@ void MaterialGenerator::WriteCustomGlobalCode(const ArrayDomain == MaterialDomain::Decal || layer->Domain == MaterialDomain::PostProcess) + { + OnError(node, input, TEXT("VS to PS interpolants are not supported in Decal or Post Process materials.")); + return Value::Zero; + } + + // Indicate the interpolator slot usage + _vsToPsInterpolants.Add(input); + return Value(VariantType::Float4, String::Format(TEXT("input.CustomVSToPS[{0}]"), _vsToPsInterpolants.Count() - 1)); +} + #endif diff --git a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.h b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.h index 0e55192c1..980148d97 100644 --- a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.h +++ b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.h @@ -205,6 +205,7 @@ private: MaterialValue AccessParticleAttribute(Node* caller, const StringView& name, ParticleAttributeValueTypes valueType, const Char* index = nullptr, ParticleAttributeSpace space = ParticleAttributeSpace::AsIs); void prepareLayer(MaterialLayer* layer, bool allowVisibleParams); void WriteCustomGlobalCode(const Array>& nodes, int32 templateInputsMapping); + Value VsToPs(Node* node, Box* input); public: