Răsfoiți Sursa

Material canvas: switch material templates to use material pipeline

• This change switches existing standard and base PBR material graph nodes and templates from defining explicit shader and azsl files to instead use the material pipeline. This will significantly reduce the number of files that need to be directly output from material canvas and managed in source control by users. It also means that generated materials and shaders will behave more consistently with their hard coded counterparts and work with any future, compatible material pipelines, including mobile. This should also resolve any issues with inconsistent behavior with transparency.
• Along with this, a change was made to the material graph compiler to update the fingerprint on generated assets so that they get reprocessed by the AP and notifications are sent even if in some files, like the material file, are unmodified. Material source files generated by material canvas typically never change after their first generated because they only referenced the generated material type.
• Bounds checking was added to getter functions on the shader input constant layout glass. There was a potential crash while over indexing a container while interim shaders or shader variants are reloaded as part of a material that has not yet been fully reprocessed.
• Minor updates to asset status reporter messaging and sleeps.

Signed-off-by: gadams3 <[email protected]>
gadams3 1 an în urmă
părinte
comite
feb0bcdce0
48 a modificat fișierele cu 392 adăugiri și 1477 ștergeri
  1. 3 1
      Gems/Atom/RHI/Code/Source/RHI.Reflect/ConstantsLayout.cpp
  2. 1 0
      Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Graph/AssetStatusReporter.h
  3. 6 1
      Gems/Atom/Tools/AtomToolsFramework/Code/Source/Graph/AssetStatusReporter.cpp
  4. 3 4
      Gems/Atom/Tools/AtomToolsFramework/Code/Source/Graph/AssetStatusReporterSystem.cpp
  5. 1 2
      Gems/Atom/Tools/AtomToolsFramework/Code/Source/Graph/GraphCompiler.cpp
  6. 8 9
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/BasePBR.materialgraphnode
  7. 0 26
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/HandleCastShadows.lua
  8. 3 33
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName.materialtype
  9. 13 33
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_Common.azsli
  10. 0 36
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_Depth.azsl
  11. 0 20
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_DepthPass.shader
  12. 57 0
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_DepthVertexData.azsli
  13. 83 0
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_DepthVertexEval.azsli
  14. 0 24
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_Forward.azsl
  15. 0 49
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_ForwardPass.shader
  16. 0 52
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_LowEndForward.shader
  17. 0 81
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_MeshMotionVector.azsl
  18. 0 24
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_MeshMotionVector.shader
  19. 0 51
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_MultiViewForward.shader
  20. 0 28
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_Shadowmap.shader
  21. 0 26
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/HandleCastShadows.lua
  22. 0 33
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/HandleOpacityDoubleSided.lua
  23. 6 43
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/HandleOpacityMode.lua
  24. 0 106
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/HandleShaderEnable.lua
  25. 3 80
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName.materialtype
  26. 26 31
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_Common.azsli
  27. 0 36
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_Depth.azsl
  28. 0 20
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_DepthPass.shader
  29. 0 24
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_DepthPassTransparentMax.shader
  30. 0 22
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_DepthPassTransparentMin.shader
  31. 0 24
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_DepthPass_WithPS.shader
  32. 57 0
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_DepthVertexData.azsli
  33. 84 0
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_DepthVertexEval.azsli
  34. 0 24
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_Forward.azsl
  35. 0 51
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_ForwardPass.shader
  36. 0 49
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_ForwardPass_EDS.shader
  37. 0 52
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_LowEndForward.shader
  38. 0 51
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_LowEndForward_EDS.shader
  39. 0 80
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_MeshMotionVector.azsl
  40. 0 24
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_MeshMotionVector.shader
  41. 0 51
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_MultiViewForward.shader
  42. 0 51
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_MultiViewForward_EDS.shader
  43. 0 47
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_MultiViewTransparentForward_EDS.shader
  44. 0 28
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_Shadowmap.shader
  45. 0 32
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_Shadowmap_WithPS.shader
  46. 8 17
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/StandardPBR.materialgraphnode
  47. 29 1
      Gems/Atom/Tools/MaterialCanvas/Code/Source/Document/MaterialGraphCompiler.cpp
  48. 1 0
      Gems/Atom/Tools/MaterialCanvas/Code/Source/Document/MaterialGraphCompiler.h

+ 3 - 1
Gems/Atom/RHI/Code/Source/RHI.Reflect/ConstantsLayout.cpp

@@ -101,7 +101,9 @@ namespace AZ::RHI
 
     const ShaderInputConstantDescriptor& ConstantsLayout::GetShaderInput(ShaderInputConstantIndex inputIndex) const
     {
-        return m_inputs[inputIndex.GetIndex()];
+        const auto index = inputIndex.GetIndex();
+        static const ShaderInputConstantDescriptor invalidDescriptor;
+        return index < m_inputs.size() ? m_inputs[index] : invalidDescriptor;
     }
 
     AZStd::span<const ShaderInputConstantDescriptor> ConstantsLayout::GetShaderInputList() const

+ 1 - 0
Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Graph/AssetStatusReporter.h

@@ -30,6 +30,7 @@ namespace AtomToolsFramework
         AssetStatusReporterState Update();
         AssetStatusReporterState GetCurrentState() const;
         AZStd::string GetCurrentStateName() const;
+        AZStd::string GetCurrentStatusMessage() const;
         AZStd::string GetCurrentPath() const;
 
     private:

+ 6 - 1
Gems/Atom/Tools/AtomToolsFramework/Code/Source/Graph/AssetStatusReporter.cpp

@@ -20,7 +20,7 @@ namespace AtomToolsFramework
     {
         if (GetCurrentState() == AssetStatusReporterState::Processing)
         {
-            const AZStd::string& sourcePath = m_sourcePaths[m_index];
+            const AZStd::string& sourcePath = GetCurrentPath();
 
             AZ::Outcome<AzToolsFramework::AssetSystem::JobInfoContainer> jobOutcome = AZ::Failure();
             AzToolsFramework::AssetSystemJobRequestBus::BroadcastResult(
@@ -81,6 +81,11 @@ namespace AtomToolsFramework
         return "Invalid";
     }
 
+    AZStd::string AssetStatusReporter::GetCurrentStatusMessage() const
+    {
+        return AZStd::string::format("%s (%s)", GetCurrentPath().c_str(), GetCurrentStateName().c_str());
+    }
+
     AZStd::string AssetStatusReporter::GetCurrentPath() const
     {
         return m_index < m_sourcePaths.size() ? m_sourcePaths[m_index] : AZStd::string();

+ 3 - 4
Gems/Atom/Tools/AtomToolsFramework/Code/Source/Graph/AssetStatusReporterSystem.cpp

@@ -28,7 +28,7 @@ namespace AtomToolsFramework
                 while (m_threadRunning)
                 {
                     Update();
-                    AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(1));
+                    AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(10));
                 }
             });
 
@@ -107,8 +107,7 @@ namespace AtomToolsFramework
             reporterIt->second->Update();
 
             // Create a string message from the current status.
-            const AZStd::string statusMessage = AZStd::string::format(
-                "%s (%s)", reporterIt->second->GetCurrentPath().c_str(), reporterIt->second->GetCurrentStateName().c_str());
+            const AZStd::string statusMessage = reporterIt->second->GetCurrentStatusMessage();
 
             // If the message has not changed since the last update then send it to the main windows status bar.
             if (m_lastStatusMessage != statusMessage)
@@ -127,7 +126,7 @@ namespace AtomToolsFramework
             // Any complete or canceled requests will get moved to the inactive list.
             if (reporterIt->second->GetCurrentState() != AssetStatusReporterState::Processing)
             {
-                m_inactiveReporterTable.push_back(*reporterIt);
+                m_inactiveReporterTable.emplace_back(AZStd::move(*reporterIt));
                 m_activeReporterTable.erase(reporterIt);
                 m_lastStatusMessage.clear();
             }

+ 1 - 2
Gems/Atom/Tools/AtomToolsFramework/Code/Source/Graph/GraphCompiler.cpp

@@ -177,8 +177,7 @@ namespace AtomToolsFramework
                         m_toolId, &AssetStatusReporterSystemRequestBus::Events::StopReporting, m_assetReportRequestId);
                     return status == AssetStatusReporterState::Succeeded;
                 }
-
-                AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(1));
+                AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(10));
             }
 
             AssetStatusReporterSystemRequestBus::Event(

+ 8 - 9
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/BasePBR.materialgraphnode

@@ -12,15 +12,8 @@
                 "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName.material",
                 "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName.materialtype",
                 "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_Common.azsli",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_Depth.azsl",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_DepthPass.shader",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_Forward.azsl",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_ForwardPass.shader",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_LowEndForward.shader",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_MeshMotionVector.azsl",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_MeshMotionVector.shader",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_MultiViewForward.shader",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_Shadowmap.shader",
+                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_DepthVertexData.azsli",
+                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_DepthVertexEval.azsli",
                 "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_SurfaceEval.azsli",
                 "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_VertexEval.azsli"
             ]
@@ -73,6 +66,9 @@
                 "settings": {
                     "materialPropertyConnectionName": [
                         "doubleSided"
+                    ],
+                    "materialPropertyConnectionType": [
+                        "InternalProperty"
                     ]
                 }
             },
@@ -136,6 +132,9 @@
                 "settings": {
                     "materialPropertyConnectionName": [
                         "castShadows"
+                    ],
+                    "materialPropertyConnectionType": [
+                        "InternalProperty"
                     ]
                 }
             },

+ 0 - 26
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/HandleCastShadows.lua

@@ -1,26 +0,0 @@
---------------------------------------------------------------------------------------
---
--- Copyright (c) Contributors to the Open 3D Engine Project.
--- For complete copyright and license terms please see the LICENSE at the root of this distribution.
---
--- SPDX-License-Identifier: Apache-2.0 OR MIT
---
---
---
-----------------------------------------------------------------------------------------------------
-
-function GetMaterialPropertyDependencies()
-    return {"general.cast_shadows"}
-end
-
-function Process(context)
-    local castShadows = true
-    if context:HasMaterialProperty("general.cast_shadows") then
-        castShadows = context:GetMaterialPropertyValue_bool("general.cast_shadows")
-    end
-
-    local shadowMap = context:GetShaderByTag("Shadowmap")
-    if shadowMap then
-        shadowMap:SetEnabled(castShadows)
-    end
-end

+ 3 - 33
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName.materialtype

@@ -1,42 +1,12 @@
 {
     "description": "MaterialGraphName Material Type Template.",
     "version": 1,
-    "shaders": [
-        {
-            "file": "./MaterialGraphName_ForwardPass.shader",
-            "tag": "ForwardPass_EDS"
-        },
-        {
-            "file": "./MaterialGraphName_LowEndForward.shader",
-            "tag": "LowEndForward_EDS"
-        },
-        {
-            "file": "./MaterialGraphName_MultiViewForward.shader",
-            "tag": "MultiViewForward_EDS"
-        },
-        {
-            "file": "./MaterialGraphName_Shadowmap.shader",
-            "tag": "Shadowmap"
-        },
-        {
-            "file": "./MaterialGraphName_DepthPass.shader",
-            "tag": "DepthPass"
-        },
-        {
-            "file": "./MaterialGraphName_MeshMotionVector.shader",
-            "tag": "MeshMotionVector"
-        }
-    ],
+    "lightingModel": "Base",
+    "materialShaderCode": "MaterialGraphName_Common.azsli",
     "functors": [
-        {
-            "type": "Lua",
-            "args": {
-                "file": "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/HandleCastShadows.lua"
-            }
-        }
     ],
     "uvNameMap": {
         "UV0": "Tiled",
         "UV1": "Unwrapped"
     }
-}
+}

+ 13 - 33
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_Common.azsli

@@ -8,34 +8,6 @@
  
 #pragma once
 
-#ifndef ENABLE_CLEAR_COAT
-#define ENABLE_CLEAR_COAT 0
-#endif
-
-#ifndef ENABLE_TRANSMISSION
-#define ENABLE_TRANSMISSION 0
-#endif
-
-#ifndef ENABLE_AREA_LIGHT_VALIDATION
-#define ENABLE_AREA_LIGHT_VALIDATION 0
-#endif
-
-#ifndef ENABLE_SHADER_DEBUGGING
-#define ENABLE_SHADER_DEBUGGING 1
-#endif
-
-#ifndef OUTPUT_SUBSURFACE
-#define OUTPUT_SUBSURFACE 0
-#endif
-
-#ifndef OUTPUT_DEPTH
-#define OUTPUT_DEPTH 0
-#endif
-
-#ifndef FORCE_OPAQUE
-#define FORCE_OPAQUE 1
-#endif
-
 #ifndef ENABLE_PARALLAX
 // Disabled until parallax depth functions can be rewritten to not pass in the heightmap or sampler from the material SRG
 #define ENABLE_PARALLAX 0
@@ -56,7 +28,7 @@
 
 #include <Atom/Features/SrgSemantics.azsli>
 #include <Atom/RPI/TangentSpace.azsli>
-#include <../Shaders/Materials/MaterialFunctions/EvaluateTangentFrame.azsli>
+#include <Atom/Feature/Common/Assets/Shaders/Materials/MaterialFunctions/EvaluateTangentFrame.azsli>
 
 option bool o_normal_override_enabled = false;
 
@@ -83,12 +55,20 @@ bool NeedsTangentFrame()
     return true;
 }
 
-#include <../Shaders/Materials/BasePBR/BasePBR_VertexData.azsli>
+#if MATERIALPIPELINE_SHADER_HAS_PIXEL_STAGE
+
+#include <Atom/Feature/Common/Assets/Shaders/Materials/BasePBR/BasePBR_VertexData.azsli>
 #include "MaterialGraphName_VertexEval.azsli"
 
-#include <../Shaders/Materials/BasePBR/BasePBR_PixelGeometryData.azsli>
-#include <../Shaders/Materials/BasePBR/BasePBR_PixelGeometryEval.azsli>
+#include <Atom/Feature/Common/Assets/Shaders/Materials/BasePBR/BasePBR_PixelGeometryData.azsli>
+#include <Atom/Feature/Common/Assets/Shaders/Materials/BasePBR/BasePBR_PixelGeometryEval.azsli>
 
-#include <../Shaders/Materials/BasePBR/BasePBR_SurfaceData.azsli>
+#include <Atom/Feature/Common/Assets/Shaders/Materials/BasePBR/BasePBR_SurfaceData.azsli>
 #include "MaterialGraphName_SurfaceEval.azsli"
 
+#else
+
+#include "MaterialGraphName_DepthVertexData.azsli"
+#include "MaterialGraphName_DepthVertexEval.azsli"
+
+#endif

+ 0 - 36
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_Depth.azsl

@@ -1,36 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#include "MaterialGraphName_Common.azsli"
-
-VsOutput MainVS(VsInput IN, uint instanceId : SV_InstanceID)
-{
-    VsSystemValues SV;
-    SV.m_instanceId = instanceId;
-    return EvaluateVertexGeometry(IN, SV);
-}
-
-struct PsDepthOutput
-{
-    precise float depth : SV_Depth;
-};
-
-PsDepthOutput MainPS(VsOutput IN, bool isFrontFace : SV_IsFrontFace)
-{
-    PixelGeometryData geoData = EvaluatePixelGeometry(IN, isFrontFace);
-
-    Surface surface = EvaluateSurface(IN, geoData);
-
-#if !FORCE_OPAQUE
-    CheckClipping(surface.alpha, 0.5);
-#endif
-
-    PsDepthOutput OUT;
-    OUT.depth = surface.position.z;
-    return OUT;
-}

+ 0 - 20
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_DepthPass.shader

@@ -1,20 +0,0 @@
-{
-    "Source": "./MaterialGraphName_Depth.azsl",
-
-    "DepthStencilState" : { 
-        "Depth" : { "Enable" : true, "CompareFunc" : "GreaterEqual" }
-    },
-
-    "ProgramSettings":
-    {
-      "EntryPoints":
-      [
-        {
-          "name": "MainVS",
-          "type": "Vertex"
-        }
-      ]
-    },
-
-    "DrawList" : "depth"
-}

+ 57 - 0
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_DepthVertexData.azsli

@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#pragma once
+
+#ifndef VsInput
+#define VsInput VsInput_Depth
+#endif
+
+#ifndef VsSystemValues
+#define VsSystemValues VsSystemValues_Depth
+#endif
+
+#ifndef VsOutput
+#define VsOutput VsOutput_Depth
+#endif
+
+struct VsInput_Depth
+{
+    float3 m_position : POSITION;
+    float3 m_normal : NORMAL;
+    float4 m_tangent : TANGENT;
+    float3 m_bitangent : BITANGENT;
+    float2 m_uv0 : UV0;
+    float2 m_uv1 : UV1;
+ 
+#if MATERIALPIPELINE_USES_PREV_VERTEX_POSITION
+    float3 m_optional_prevPosition : POSITIONT;
+#endif
+};
+
+struct VsSystemValues_Depth
+{
+    uint m_instanceId;
+};
+
+#if MATERIALPIPELINE_USES_PREV_VERTEX_POSITION
+    option bool o_prevPosition_isBound;
+#endif
+
+struct VsOutput_Depth
+{
+    // "centroid" is needed for SV_Depth to compile
+    precise linear centroid 
+    float4 m_position : SV_Position;
+ 
+#if MATERIALPIPELINE_USES_PREV_VERTEX_POSITION
+    float3 m_worldPos : TEXCOORD0;
+    float3 m_worldPosPrev: TEXCOORD1;
+#endif
+    uint m_instanceId : SV_InstanceID;
+};

+ 83 - 0
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_DepthVertexEval.azsli

@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#pragma once
+
+#ifndef EvaluateVertexGeometry
+#define EvaluateVertexGeometry EvaluateVertexGeometry_MaterialGraphName_Depth
+#endif
+
+#include <Atom/RPI/TangentSpace.azsli>
+#include <Atom/Features/InstancedTransforms.azsli>
+
+
+float4 GenerateWorldPosition(
+    float4x4 objectToWorld,
+    float3x3 objectToWorldIT,
+    float3 position,
+    real3 normal,
+    real4 tangent,
+    float2 uv0,
+    float2 uv1)
+{
+    const float4 positionWS = mul(objectToWorld, float4(position, 1.0));
+    const real3 bitangent = cross(normal, tangent.xyz);
+
+    real3 normalWS, tangentWS, bitangentWS;
+    ConstructTBN(real3(normal), real4(tangent), objectToWorld, objectToWorldIT, normalWS, tangentWS, bitangentWS);
+
+    const float3 O3DE_MC_POSITION = position;
+    const float3 O3DE_MC_NORMAL = normal;
+    const float3 O3DE_MC_TANGENT = tangent.xyz;
+    const float3 O3DE_MC_BITANGENT = bitangent;
+    const float3 O3DE_MC_POSITION_WS = positionWS.xyz;
+    const float3 O3DE_MC_NORMAL_WS = normalWS;
+    const float3 O3DE_MC_TANGENT_WS = tangentWS;
+    const float3 O3DE_MC_BITANGENT_WS = bitangentWS;
+    #define O3DE_MC_UV(index) (index == 0 ? uv0 : uv1);
+
+    // m_placeHolder keeps MaterialSrg from being compiled out when iterating on graphs
+    const bool placeHolder = MaterialSrg::m_placeHolder;
+
+    // O3DE_GENERATED_INSTRUCTIONS_BEGIN: inPositionOffset
+    float3 inPositionOffset = {0.0, 0.0, 0.0};
+    // O3DE_GENERATED_INSTRUCTIONS_END
+
+    #undef O3DE_MC_UV
+
+    return float4((float3)positionWS + (float3)inPositionOffset, 1.0);
+}
+
+VsOutput EvaluateVertexGeometry_MaterialGraphName_Depth(VsInput IN, VsSystemValues SV)
+{
+    const float4 worldPosition = GenerateWorldPosition(
+        GetObjectToWorldMatrix(SV.m_instanceId),
+        GetObjectToWorldMatrixInverseTranspose(SV.m_instanceId),
+        IN.m_position,
+        real3(IN.m_normal),
+        real4(IN.m_tangent),
+        IN.m_uv0,
+        IN.m_uv1);
+
+    VsOutput output;
+    output.m_position = mul(ViewSrg::m_viewProjectionMatrix, worldPosition);
+    
+#if MATERIALPIPELINE_USES_PREV_VERTEX_POSITION
+    output.m_worldPos = worldPosition.xyz;
+    output.m_worldPosPrev = GenerateWorldPosition(
+        GetObjectToWorldMatrixPrev(SV.m_instanceId),
+        transpose((float3x3)GetObjectToWorldMatrixPrev(SV.m_instanceId)),
+        o_prevPosition_isBound ? IN.m_optional_prevPosition : IN.m_position,
+        real3(IN.m_normal),
+        real4(IN.m_tangent),
+        IN.m_uv0,
+        IN.m_uv1).xyz;
+#endif
+
+    return output;
+}

+ 0 - 24
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_Forward.azsl

@@ -1,24 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#include <Atom/Features/Pipeline/Forward/ForwardPassSrg.azsli>
-#include "MaterialGraphName_Common.azsli"
-
-// These cannot be included in the common file because the lighting data accesses the pass SRG which is not available on the depth pass
-#include <../Shaders/Materials/BasePBR/BasePBR_LightingData.azsli>
-#include <../Shaders/Materials/BasePBR/BasePBR_LightingBrdf.azsli>
-#include <../Shaders/Materials/BasePBR/BasePBR_LightingEval.azsli>
-
-// --- Vertex + Pixel Shader ---
-#if MULTI_VIEW_FORWARD
-#include <../Materials/Pipelines/MultiView/MultiViewForwardPassVertexAndPixel.azsli>
-#elif LOW_END_FORWARD
-#include <../Materials/Pipelines/LowEndPipeline/LowEndForwardPassVertexAndPixel.azsli>
-#else
-#include <../Materials/Pipelines/MainPipeline/ForwardPassVertexAndPixel.azsli>
-#endif

+ 0 - 49
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_ForwardPass.shader

@@ -1,49 +0,0 @@
-{
-    "Source": "./MaterialGraphName_Forward.azsl",
-
-    "DepthStencilState" :
-    {
-        "Depth" :
-        {
-            "Enable" : true,
-            "CompareFunc" : "GreaterEqual"
-        },
-        "Stencil" :
-        {
-            "Enable" : true,
-            "ReadMask" : "0x00",
-            "WriteMask" : "0xFF",
-            "FrontFace" :
-            {
-                "Func" : "Always",
-                "DepthFailOp" : "Keep",
-                "FailOp" : "Keep",
-                "PassOp" : "Replace"
-            },
-            "BackFace" :
-            {
-                "Func" : "Always",
-                "DepthFailOp" : "Keep",
-                "FailOp" : "Keep",
-                "PassOp" : "Replace"
-            }
-        }
-    },
-
-    "ProgramSettings":
-    {
-        "EntryPoints":
-        [
-            {
-                "name": "VertexShader",
-                "type": "Vertex"
-            },
-            {
-                "name": "PixelShader",
-                "type": "Fragment"
-            }
-        ]
-    },
-
-    "DrawList" : "forward"
-}

+ 0 - 52
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_LowEndForward.shader

@@ -1,52 +0,0 @@
-{
-    "Source" : "./MaterialGraphName_Forward.azsl",
-
-    "Definitions": ["QUALITY_LOW_END_TIER1=1", "LOW_END_FORWARD=1"],
-
-    "DepthStencilState" :
-    {
-        "Depth" :
-        {
-            "Enable" : true,
-            "CompareFunc" : "GreaterEqual"
-        },
-        "Stencil" :
-        {
-            "Enable" : true,
-            "ReadMask" : "0x00",
-            "WriteMask" : "0xFF",
-            "FrontFace" :
-            {
-                "Func" : "Always",
-                "DepthFailOp" : "Keep",
-                "FailOp" : "Keep",
-                "PassOp" : "Replace"
-            },
-            "BackFace" :
-            {
-                "Func" : "Always",
-                "DepthFailOp" : "Keep",
-                "FailOp" : "Keep",
-                "PassOp" : "Replace"
-            }
-        }
-    },
-
-    "ProgramSettings":
-    {
-        "EntryPoints":
-        [
-            {
-                "name": "VertexShader",
-                "type": "Vertex"
-            },
-            {
-                "name": "PixelShader",
-                "type": "Fragment"
-            }
-        ]
-    },
-
-
-    "DrawList" : "lowEndForward"
-}

+ 0 - 81
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_MeshMotionVector.azsl

@@ -1,81 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#include "MaterialGraphName_Common.azsli"
-
-#include <Atom/Features/InstancedTransforms.azsli>
-
-struct VSInput
-{
-    float3 m_position : POSITION;
-    
-    // This gets set automatically by the system at runtime only if it's available.
-    // There is a soft naming convention that associates this with o_prevPosition_isBound, which will be set to true whenever m_optional_prevPosition is available.
-    // (search "m_optional_" in ShaderVariantAssetBuilder for details on the naming convention).
-    // [GFX TODO][ATOM-14475]: Come up with a more elegant way to associate the isBound flag with the input stream.
-    // Vertex position of last frame to capture small scale motion due to vertex animation
-    float3 m_optional_prevPosition : POSITIONT;
-};
-
-struct VSOutput
-{
-    float4 m_position : SV_Position;
-    float3 m_worldPos : TEXCOORD0;
-    float3 m_worldPosPrev: TEXCOORD1;
-};
-
-struct PSOutput
-{
-    float2 m_motion : SV_Target0;
-};
-
-// Indicates whether the vertex input struct's "m_optional_prevPosition" is bound. If false, it is not safe to read from m_optional_prevPosition.
-// This option gets set automatically by the system at runtime; there is a soft naming convention that associates it with m_optional_prevPosition.
-// (search "m_optional_" in ShaderVariantAssetBuilder for details on the naming convention).
-// [GFX TODO][ATOM-14475]: Come up with a more elegant way to associate the isBound flag with the input stream.
-option bool o_prevPosition_isBound;
-
-VSOutput MainVS(VSInput IN, uint instanceId : SV_InstanceID)
-{
-    VSOutput OUT;
- 
-    OUT.m_worldPos = mul(GetObjectToWorldMatrix(instanceId), float4(IN.m_position, 1.0)).xyz;
-    OUT.m_position = mul(ViewSrg::m_viewProjectionMatrix, float4(OUT.m_worldPos, 1.0));
-
-    if (o_prevPosition_isBound)
-    {
-        OUT.m_worldPosPrev = mul(GetObjectToWorldMatrixPrev(instanceId), float4(IN.m_optional_prevPosition, 1.0)).xyz;
-    }
-    else
-    {
-        OUT.m_worldPosPrev = mul(GetObjectToWorldMatrixPrev(instanceId), float4(IN.m_position, 1.0)).xyz;
-    }
-
-    return OUT;
-}
-
-PSOutput MainPS(VSOutput IN)
-{
-    PSOutput OUT;
-
-    // Current clip position
-    float4 clipPos = mul(ViewSrg::m_viewProjectionMatrix, float4(IN.m_worldPos, 1.0));
-    
-    // Reprojected last frame's clip position, for skinned mesh it also implies last key frame
-    float4 clipPosPrev = mul(ViewSrg::m_viewProjectionPrevMatrix, float4(IN.m_worldPosPrev, 1.0));
-
-    float2 motion = (clipPos.xy / clipPos.w - clipPosPrev.xy / clipPosPrev.w) * 0.5;
-
-    OUT.m_motion = motion;
-    
-    // Flip y to line up with uv coordinates
-    OUT.m_motion.y = -OUT.m_motion.y;
-    
-    return OUT;
-}
-

+ 0 - 24
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_MeshMotionVector.shader

@@ -1,24 +0,0 @@
-{
-    "Source" : "./MaterialGraphName_MeshMotionVector.azsl",
-
-    "DepthStencilState" : { 
-        "Depth" : { "Enable" : true, "CompareFunc" : "GreaterEqual" }
-    },
-
-    "DrawList" : "motion",
-
-    "ProgramSettings":
-    {
-      "EntryPoints":
-      [
-        {
-          "name": "MainVS",
-          "type": "Vertex"
-        },
-        {
-          "name": "MainPS",
-          "type": "Fragment"
-        }
-      ]
-    }
-}

+ 0 - 51
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_MultiViewForward.shader

@@ -1,51 +0,0 @@
-{
-    "Source" : "./MaterialGraphName_Forward.azsl",
-
-    "Definitions": ["QUALITY_LOW_END_TIER1=1", "QUALITY_LOW_END_TIER2=1", "MULTI_VIEW_FORWARD=1" ],
-
-    "DepthStencilState" :
-    {
-        "Depth" :
-        {
-            "Enable" : true,
-            "CompareFunc" : "GreaterEqual"
-        },
-        "Stencil" :
-        {
-            "Enable" : true,
-            "ReadMask" : "0x00",
-            "WriteMask" : "0xFF",
-            "FrontFace" :
-            {
-                "Func" : "Always",
-                "DepthFailOp" : "Keep",
-                "FailOp" : "Keep",
-                "PassOp" : "Replace"
-            },
-            "BackFace" :
-            {
-                "Func" : "Always",
-                "DepthFailOp" : "Keep",
-                "FailOp" : "Keep",
-                "PassOp" : "Replace"
-            }
-        }
-    },
-
-    "ProgramSettings":
-    {
-        "EntryPoints":
-        [
-            {
-                "name": "VertexShader",
-                "type": "Vertex"
-            },
-            {
-                "name": "PixelShader",
-                "type": "Fragment"
-            }
-        ]
-    },
-
-    "DrawList" : "multiViewForward"
-}

+ 0 - 28
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_Shadowmap.shader

@@ -1,28 +0,0 @@
-{
-    "Source": "./MaterialGraphName_Depth.azsl",
-
-    "Definitions" : ["SHADOWMAP=1"] ,
-
-    "DepthStencilState" : {
-        "Depth" : { "Enable" : true, "CompareFunc" : "LessEqual" }
-    },
-
-    "DrawList" : "shadow",
-    
-    "RasterState" :
-    {
-        "depthBias" : "10",
-        "depthBiasSlopeScale" : "4"
-    },
-    
-    "ProgramSettings":
-    {
-      "EntryPoints":
-      [
-        {
-          "name": "MainVS",
-          "type": "Vertex"
-        }
-      ]
-    }
-}

+ 0 - 26
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/HandleCastShadows.lua

@@ -1,26 +0,0 @@
---------------------------------------------------------------------------------------
---
--- Copyright (c) Contributors to the Open 3D Engine Project.
--- For complete copyright and license terms please see the LICENSE at the root of this distribution.
---
--- SPDX-License-Identifier: Apache-2.0 OR MIT
---
---
---
-----------------------------------------------------------------------------------------------------
-
-function GetMaterialPropertyDependencies()
-    return {"general.cast_shadows"}
-end
-
-function Process(context)
-    local castShadows = true
-    if context:HasMaterialProperty("general.cast_shadows") then
-        castShadows = context:GetMaterialPropertyValue_bool("general.cast_shadows")
-    end
-
-    local shadowMap = context:GetShaderByTag("Shadowmap")
-    if shadowMap then
-        shadowMap:SetEnabled(castShadows)
-    end
-end

+ 0 - 33
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/HandleOpacityDoubleSided.lua

@@ -1,33 +0,0 @@
---------------------------------------------------------------------------------------
---
--- Copyright (c) Contributors to the Open 3D Engine Project.
--- For complete copyright and license terms please see the LICENSE at the root of this distribution.
---
--- SPDX-License-Identifier: Apache-2.0 OR MIT
---
---
---
-----------------------------------------------------------------------------------------------------
-
-function GetMaterialPropertyDependencies()
-    return {"general.double_sided"}
-end
- 
-function Process(context)
-    local doubleSided = false
-    if context:HasMaterialProperty("general.double_sided") then
-        doubleSided = context:GetMaterialPropertyValue_bool("general.double_sided")
-    end
-
-    local lastShader = context:GetShaderCount() - 1;
-
-    if doubleSided then
-        for i=0,lastShader do
-            context:GetShader(i):GetRenderStatesOverride():SetCullMode(CullMode_None)
-        end
-    else
-        for i=0,lastShader do
-            context:GetShader(i):GetRenderStatesOverride():ClearCullMode()
-        end
-    end
-end

+ 6 - 43
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/HandleOpacityMode.lua

@@ -18,51 +18,14 @@ OpacityMode_Cutout = 1
 OpacityMode_Blended = 2
 OpacityMode_TintedTransparent = 3
 
-function ConfigureAlphaBlending(shaderItem) 
-    shaderItem:GetRenderStatesOverride():SetDepthEnabled(true)
-    shaderItem:GetRenderStatesOverride():SetDepthWriteMask(DepthWriteMask_Zero)
-    shaderItem:GetRenderStatesOverride():SetBlendEnabled(0, true)
-    shaderItem:GetRenderStatesOverride():SetBlendSource(0, BlendFactor_One)
-    shaderItem:GetRenderStatesOverride():SetBlendDest(0, BlendFactor_AlphaSourceInverse)
-    shaderItem:GetRenderStatesOverride():SetBlendOp(0, BlendOp_Add)
-end
-
-function ConfigureDualSourceBlending(shaderItem)
-    -- This blend multiplies the dest against color source 1, then adds color source 0.
-    shaderItem:GetRenderStatesOverride():SetDepthEnabled(true)
-    shaderItem:GetRenderStatesOverride():SetDepthWriteMask(DepthWriteMask_Zero)
-    shaderItem:GetRenderStatesOverride():SetBlendEnabled(0, true)
-    shaderItem:GetRenderStatesOverride():SetBlendSource(0, BlendFactor_One)
-    shaderItem:GetRenderStatesOverride():SetBlendDest(0, BlendFactor_ColorSource1)
-    shaderItem:GetRenderStatesOverride():SetBlendOp(0, BlendOp_Add)
-end
-
-function ResetAlphaBlending(shaderItem)
-    shaderItem:GetRenderStatesOverride():ClearDepthEnabled()
-    shaderItem:GetRenderStatesOverride():ClearDepthWriteMask()
-    shaderItem:GetRenderStatesOverride():ClearBlendEnabled(0)
-    shaderItem:GetRenderStatesOverride():ClearBlendSource(0)
-    shaderItem:GetRenderStatesOverride():ClearBlendDest(0)
-    shaderItem:GetRenderStatesOverride():ClearBlendOp(0)
-end
-
 function Process(context)
+
     local opacityMode = OpacityMode_Opaque
     if context:HasMaterialProperty("general.opacity_mode") then
         opacityMode = context:GetMaterialPropertyValue_enum("general.opacity_mode")
     end
-
-    local forwardPassEDS = context:GetShaderByTag("ForwardPass_EDS")
-    if forwardPassEDS then
-        if opacityMode == OpacityMode_Blended then
-            ConfigureAlphaBlending(forwardPassEDS)
-            forwardPassEDS:SetDrawListTagOverride("transparent")
-        elseif opacityMode == OpacityMode_TintedTransparent then
-            ConfigureDualSourceBlending(forwardPassEDS)
-            forwardPassEDS:SetDrawListTagOverride("transparent")
-        else
-            ResetAlphaBlending(forwardPassEDS)
-            forwardPassEDS:SetDrawListTagOverride("") -- reset to default draw list
-        end
-    end
-end
+    
+    context:SetInternalMaterialPropertyValue_bool("hasPerPixelClip", opacityMode == OpacityMode_Cutout)
+    context:SetInternalMaterialPropertyValue_bool("isTransparent", opacityMode == OpacityMode_Blended)
+    context:SetInternalMaterialPropertyValue_bool("isTintedTransparent", opacityMode == OpacityMode_TintedTransparent)
+end

+ 0 - 106
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/HandleShaderEnable.lua

@@ -1,106 +0,0 @@
---------------------------------------------------------------------------------------
---
--- Copyright (c) Contributors to the Open 3D Engine Project.
--- For complete copyright and license terms please see the LICENSE at the root of this distribution.
---
--- SPDX-License-Identifier: Apache-2.0 OR MIT
---
---
---
-----------------------------------------------------------------------------------------------------
-
-function GetMaterialPropertyDependencies()
-    return {"general.opacity_mode", "general.cast_shadows"} --, "parallax.textureMap", "parallax.useTexture", "parallax.pdo"}
-end
-
-OpacityMode_Opaque = 0
-OpacityMode_Cutout = 1
-OpacityMode_Blended = 2
-OpacityMode_TintedTransparent = 3
-
-function TryGetShaderByTag(context, shaderTag)
-    if context:HasShaderWithTag(shaderTag) then
-        return context:GetShaderByTag(shaderTag)
-    else
-        return nil
-    end
-end
-
-function TrySetShaderEnabled(shader, enabled)
-    if shader then 
-        shader:SetEnabled(enabled)
-    end
-end
-
-function Process(context)
-    
-    local opacityMode = OpacityMode_Opaque
-    if context:HasMaterialProperty("general.opacity_mode") then
-        opacityMode = context:GetMaterialPropertyValue_enum("general.opacity_mode")
-    end
-
-    local castShadows = true
-    if context:HasMaterialProperty("general.cast_shadows") then
-        castShadows = context:GetMaterialPropertyValue_bool("general.cast_shadows")
-    end
-
-    local displacementMap = nil --context:GetMaterialPropertyValue_Image("parallax.textureMap")
-    local useDisplacementMap = 0 --context:GetMaterialPropertyValue_bool("parallax.useTexture")
-    local parallaxEnabled = displacementMap ~= nil and useDisplacementMap
-    local parallaxPdoEnabled = 0 --context:GetMaterialPropertyValue_bool("parallax.pdo")
-    
-    local depthPass = context:GetShaderByTag("DepthPass")
-    local shadowMap = context:GetShaderByTag("Shadowmap")
-    local forwardPassEDS = context:GetShaderByTag("ForwardPass_EDS")
-
-    local depthPassWithPS = context:GetShaderByTag("DepthPass_WithPS")
-    local shadowMapWithPS = context:GetShaderByTag("Shadowmap_WithPS")
-    local forwardPass = context:GetShaderByTag("ForwardPass")
-
-    -- Use TryGetShaderByTag because these shaders only exist in StandardPBR but this script is also used for EnhancedPBR
-    local lowEndForwardEDS = TryGetShaderByTag(context, "LowEndForward_EDS")
-    local lowEndForward = TryGetShaderByTag(context, "LowEndForward")
-
-    local multiViewForward = TryGetShaderByTag(context, "MultiViewForward")
-    local multiViewForwardEDS = TryGetShaderByTag(context, "MultiViewForward_EDS")
-    local multiViewTransparentForward = TryGetShaderByTag(context, "MultiViewTransparentForward")
-    
-    if parallaxEnabled and parallaxPdoEnabled then
-        depthPass:SetEnabled(false)
-        shadowMap:SetEnabled(false)
-        forwardPassEDS:SetEnabled(false)
-        
-        depthPassWithPS:SetEnabled(true)
-        shadowMapWithPS:SetEnabled(castShadows)
-        forwardPass:SetEnabled(true)
-
-        TrySetShaderEnabled(lowEndForwardEDS, false)
-        TrySetShaderEnabled(lowEndForward, true)
-        TrySetShaderEnabled(multiViewForwardEDS, false)
-        TrySetShaderEnabled(multiViewForward, true)
-    else
-        depthPass:SetEnabled(opacityMode == OpacityMode_Opaque)
-        shadowMap:SetEnabled(opacityMode == OpacityMode_Opaque and castShadows)
-        forwardPassEDS:SetEnabled((opacityMode == OpacityMode_Opaque) or (opacityMode == OpacityMode_Blended) or (opacityMode == OpacityMode_TintedTransparent))
-        
-        depthPassWithPS:SetEnabled(opacityMode == OpacityMode_Cutout)
-        shadowMapWithPS:SetEnabled(opacityMode == OpacityMode_Cutout and castShadows)
-        forwardPass:SetEnabled(opacityMode == OpacityMode_Cutout)
-
-        TrySetShaderEnabled(multiViewForward, opacityMode == OpacityMode_Cutout)
-        TrySetShaderEnabled(multiViewForwardEDS, opacityMode == OpacityMode_Opaque)
-        TrySetShaderEnabled(multiViewTransparentForward, (opacityMode == OpacityMode_Blended) or (opacityMode == OpacityMode_TintedTransparent))
-
-        -- Only enable lowEndForwardEDS in Opaque mode, Transparent mode will be handled by forwardPassEDS. The transparent pass uses the "transparent" draw tag
-        -- for both standard and low end pipelines, so this keeps both shaders from rendering to the transparent draw list.
-        TrySetShaderEnabled(lowEndForwardEDS, opacityMode == OpacityMode_Opaque)
-        TrySetShaderEnabled(lowEndForward, opacityMode == OpacityMode_Cutout)
-    end
-    
-    if context:HasShaderWithTag("DepthPassTransparentMin") then
-        context:GetShaderByTag("DepthPassTransparentMin"):SetEnabled((opacityMode == OpacityMode_Blended) or (opacityMode == OpacityMode_TintedTransparent))
-    end
-    if context:HasShaderWithTag("DepthPassTransparentMax") then
-        context:GetShaderByTag("DepthPassTransparentMax"):SetEnabled((opacityMode == OpacityMode_Blended) or (opacityMode == OpacityMode_TintedTransparent))
-    end
-end

+ 3 - 80
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName.materialtype

@@ -1,95 +1,18 @@
 {
     "description": "Material Type with properties used to define Base PBR, a metallic-roughness Physically-Based Rendering (PBR) material shading model.",
     "version": 1,
-    "propertyLayout": {
-    },
-    "shaders": [
-        {
-            "file": "./MaterialGraphName_ForwardPass.shader",
-            "tag": "ForwardPass"
-        },
-        {
-            "file": "./MaterialGraphName_ForwardPass_EDS.shader",
-            "tag": "ForwardPass_EDS"
-        },
-        {
-            "file": "./MaterialGraphName_LowEndForward.shader",
-            "tag": "LowEndForward"
-        },
-        {
-            "file": "./MaterialGraphName_LowEndForward_EDS.shader",
-            "tag": "LowEndForward_EDS"
-        },
-        {
-            "file": "./MaterialGraphName_MultiViewForward.shader",
-            "tag": "MultiViewForward"
-        },
-        {
-            "file": "./MaterialGraphName_MultiViewForward_EDS.shader",
-            "tag": "MultiViewForward_EDS"
-        },
-        {
-            "file": "./MaterialGraphName_MultiViewTransparentForward_EDS.shader",
-            "tag": "MultiViewTransparentForward"
-        },
-        {
-            "file": "./MaterialGraphName_Shadowmap.shader",
-            "tag": "Shadowmap"
-        },
-        {
-            "file": "./MaterialGraphName_Shadowmap_WithPS.shader",
-            "tag": "Shadowmap_WithPS"
-        },
-        {
-            "file": "./MaterialGraphName_DepthPass.shader",
-            "tag": "DepthPass"
-        },
-        {
-            "file": "./MaterialGraphName_DepthPass_WithPS.shader",
-            "tag": "DepthPass_WithPS"
-        },
-        {
-            "file": "./MaterialGraphName_MeshMotionVector.shader",
-            "tag": "MeshMotionVector"
-        },
-        // Used by the light culling system to produce accurate depth bounds for this object when it uses blended transparency
-        {
-            "file": "./MaterialGraphName_DepthPassTransparentMin.shader",
-            "tag": "DepthPassTransparentMin"
-        },
-        {
-            "file": "./MaterialGraphName_DepthPassTransparentMax.shader",
-            "tag": "DepthPassTransparentMax"
-        }
-    ],
+    "lightingModel": "Standard",
+    "materialShaderCode": "MaterialGraphName_Common.azsli",
     "functors": [
-        {
-            "type": "Lua",
-            "args": {
-                "file": "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/HandleShaderEnable.lua"
-            }
-        },
         {
             "type": "Lua",
             "args": {
                 "file": "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/HandleOpacityMode.lua"
             }
-        },
-        {
-            "type": "Lua",
-            "args": {
-                "file": "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/HandleOpacityDoubleSided.lua"
-            }
-        },
-        {
-            "type": "Lua",
-            "args": {
-                "file": "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/HandleCastShadows.lua"
-            }
         }
     ],
     "uvNameMap": {
         "UV0": "Tiled",
         "UV1": "Unwrapped"
     }
-}
+}

+ 26 - 31
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_Common.azsli

@@ -8,34 +8,10 @@
  
 #pragma once
 
-#ifndef ENABLE_CLEAR_COAT
-#define ENABLE_CLEAR_COAT 1
-#endif
-
 #ifndef ENABLE_TRANSMISSION
 #define ENABLE_TRANSMISSION 0
 #endif
 
-#ifndef ENABLE_AREA_LIGHT_VALIDATION
-#define ENABLE_AREA_LIGHT_VALIDATION 0
-#endif
-
-#ifndef ENABLE_SHADER_DEBUGGING
-#define ENABLE_SHADER_DEBUGGING 1
-#endif
-
-#ifndef OUTPUT_SUBSURFACE
-#define OUTPUT_SUBSURFACE 0
-#endif
-
-#ifndef OUTPUT_DEPTH
-#define OUTPUT_DEPTH 0
-#endif
-
-#ifndef FORCE_OPAQUE
-#define FORCE_OPAQUE 0
-#endif
-
 #ifndef ENABLE_PARALLAX
 // Disabled until parallax depth functions can be rewritten to not pass in the heightmap or sampler from the material SRG
 #define ENABLE_PARALLAX 0
@@ -56,11 +32,11 @@
 
 #include <Atom/Features/SrgSemantics.azsli>
 #include <Atom/RPI/TangentSpace.azsli>
-#include <../Shaders/Materials/MaterialFunctions/EvaluateTangentFrame.azsli>
+#include <Atom/Feature/Common/Assets/Shaders/Materials/MaterialFunctions/EvaluateTangentFrame.azsli>
 
 #if ENABLE_PARALLAX
-#include <../Shaders/Materials/MaterialFunctions/StandardGetAlphaAndClip.azsli>
-#include <../Shaders/Materials/MaterialFunctions/ParallaxDepth.azsli>
+#include <Atom/Feature/Common/Assets/Shaders/Materials/MaterialFunctions/StandardGetAlphaAndClip.azsli>
+#include <Atom/Feature/Common/Assets/Shaders/Materials/MaterialFunctions/ParallaxDepth.azsli>
 COMMON_OPTIONS_PARALLAX()
 #endif
 
@@ -114,13 +90,32 @@ bool NeedsTangentFrame()
     return true;
 }
 
-// Use same vertex logic as BasePBR
-#include <../Shaders/Materials/BasePBR/BasePBR_VertexData.azsli>
+#if MATERIALPIPELINE_SHADER_HAS_PIXEL_STAGE
+
+#include <Atom/Feature/Common/Assets/Shaders/Materials/BasePBR/BasePBR_VertexData.azsli>
 #include "MaterialGraphName_VertexEval.azsli"
 
-#include <../Shaders/Materials/StandardPBR/StandardPBR_PixelGeometryData.azsli>
+#include <Atom/Feature/Common/Assets/Shaders/Materials/StandardPBR/StandardPBR_PixelGeometryData.azsli>
 #include "MaterialGraphName_PixelGeometryEval.azsli"
 
-#include <../Shaders/Materials/StandardPBR/StandardPBR_SurfaceData.azsli>
+#include <Atom/Feature/Common/Assets/Shaders/Materials/StandardPBR/StandardPBR_SurfaceData.azsli>
 #include "MaterialGraphName_SurfaceEval.azsli"
 
+#elif MATERIALPIPELINE_SHADER_HAS_GEOMETRIC_PIXEL_STAGE
+    
+#include <Atom/Feature/Common/Assets/Shaders/Materials/BasePBR/BasePBR_VertexData.azsli>
+#include "MaterialGraphName_VertexEval.azsli"
+
+#include <Atom/Feature/Common/Assets/Shaders/Materials/StandardPBR/StandardPBR_PixelGeometryData.azsli>
+#include "MaterialGraphName_PixelGeometryEval.azsli"
+    
+void EvaluateSurface(VsOutput IN, PixelGeometryData geoData)
+{
+}
+
+#else
+
+#include "MaterialGraphName_DepthVertexData.azsli"
+#include "MaterialGraphName_DepthVertexEval.azsli"
+
+#endif

+ 0 - 36
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_Depth.azsl

@@ -1,36 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#include "MaterialGraphName_Common.azsli"
-
-VsOutput MainVS(VsInput IN, uint instanceId : SV_InstanceID)
-{
-    VsSystemValues SV;
-    SV.m_instanceId = instanceId;
-    return EvaluateVertexGeometry(IN, SV);
-}
-
-struct PsDepthOutput
-{
-    precise float depth : SV_Depth;
-};
-
-PsDepthOutput MainPS(VsOutput IN, bool isFrontFace : SV_IsFrontFace)
-{
-    PixelGeometryData geoData = EvaluatePixelGeometry(IN, isFrontFace);
-
-    Surface surface = EvaluateSurface(IN, geoData);
-
-#if !FORCE_OPAQUE
-    CheckClipping(surface.alpha, 0.5);
-#endif
-
-    PsDepthOutput OUT;
-    OUT.depth = surface.position.z;
-    return OUT;
-}

+ 0 - 20
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_DepthPass.shader

@@ -1,20 +0,0 @@
-{
-    "Source" : "./MaterialGraphName_Depth.azsl",
-
-    "DepthStencilState" : { 
-        "Depth" : { "Enable" : true, "CompareFunc" : "GreaterEqual" }
-    },
-
-    "ProgramSettings":
-    {
-      "EntryPoints":
-      [
-        {
-          "name": "MainVS",
-          "type": "Vertex"
-        }
-      ]
-    },
-
-    "DrawList" : "depth"
-}

+ 0 - 24
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_DepthPassTransparentMax.shader

@@ -1,24 +0,0 @@
-{
-    "Source" : "./MaterialGraphName_Depth.azsl",
-
-    "RasterState": { "CullMode": "None" },
-
-    "DepthStencilState" : { 
-        // Note that we assuming reversed depth buffer, which normally means we 
-        // are rendering with GreaterEqual. But in our case we want to render the maximum values (furthest) from the camera.
-        "Depth" : { "Enable" : true, "CompareFunc" : "LessEqual" }
-    },
-
-    "ProgramSettings" : 
-    {
-        "EntryPoints":
-        [
-            {
-                "name": "MainVS",
-                "type" : "Vertex"
-            }
-        ] 
-    },
-
-    "DrawList" : "depthTransparentMax"
-}

+ 0 - 22
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_DepthPassTransparentMin.shader

@@ -1,22 +0,0 @@
-{
-    "Source" : "./MaterialGraphName_Depth.azsl",
-
-    "RasterState": { "CullMode": "None" },
-
-    "DepthStencilState" : { 
-        "Depth" : { "Enable" : true, "CompareFunc" : "GreaterEqual" }
-    },
-
-    "ProgramSettings" : 
-    {
-        "EntryPoints":
-        [
-            {
-                "name": "MainVS",
-                "type" : "Vertex"
-            }
-        ] 
-    },
-
-    "DrawList" : "depthTransparentMin"
-}

+ 0 - 24
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_DepthPass_WithPS.shader

@@ -1,24 +0,0 @@
-{
-    "Source" : "./MaterialGraphName_Depth.azsl",
-
-    "DepthStencilState" : { 
-        "Depth" : { "Enable" : true, "CompareFunc" : "GreaterEqual" }
-    },
-
-    "ProgramSettings":
-    {
-      "EntryPoints":
-      [
-        {
-          "name": "MainVS",
-          "type": "Vertex"
-        },
-        {
-          "name": "MainPS",
-          "type": "Fragment"
-        }
-      ]
-    },
-
-    "DrawList" : "depth"
-}

+ 57 - 0
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_DepthVertexData.azsli

@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#pragma once
+
+#ifndef VsInput
+#define VsInput VsInput_Depth
+#endif
+
+#ifndef VsSystemValues
+#define VsSystemValues VsSystemValues_Depth
+#endif
+
+#ifndef VsOutput
+#define VsOutput VsOutput_Depth
+#endif
+
+struct VsInput_Depth
+{
+    float3 m_position : POSITION;
+    float3 m_normal : NORMAL;
+    float4 m_tangent : TANGENT;
+    float3 m_bitangent : BITANGENT;
+    float2 m_uv0 : UV0;
+    float2 m_uv1 : UV1;
+ 
+#if MATERIALPIPELINE_USES_PREV_VERTEX_POSITION
+    float3 m_optional_prevPosition : POSITIONT;
+#endif
+};
+
+struct VsSystemValues_Depth
+{
+    uint m_instanceId;
+};
+
+#if MATERIALPIPELINE_USES_PREV_VERTEX_POSITION
+    option bool o_prevPosition_isBound;
+#endif
+
+struct VsOutput_Depth
+{
+    // "centroid" is needed for SV_Depth to compile
+    precise linear centroid 
+    float4 m_position : SV_Position;
+ 
+#if MATERIALPIPELINE_USES_PREV_VERTEX_POSITION
+    float3 m_worldPos : TEXCOORD0;
+    float3 m_worldPosPrev: TEXCOORD1;
+#endif
+    uint m_instanceId : SV_InstanceID;
+};

+ 84 - 0
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_DepthVertexEval.azsli

@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#pragma once
+
+#ifndef EvaluateVertexGeometry
+#define EvaluateVertexGeometry EvaluateVertexGeometry_MaterialGraphName_Depth
+#endif
+
+#include <Atom/RPI/TangentSpace.azsli>
+#include <Atom/Features/InstancedTransforms.azsli>
+
+
+float4 GenerateWorldPosition(
+    float4x4 objectToWorld,
+    float3x3 objectToWorldIT,
+    float3 position,
+    real3 normal,
+    real4 tangent,
+    float2 uv0,
+    float2 uv1)
+{
+    const float4 positionWS = mul(objectToWorld, float4(position, 1.0));
+    const real3 bitangent = cross(normal, tangent.xyz);
+
+    real3 normalWS, tangentWS, bitangentWS;
+    ConstructTBN(real3(normal), real4(tangent), objectToWorld, objectToWorldIT, normalWS, tangentWS, bitangentWS);
+
+    const float3 O3DE_MC_POSITION = position;
+    const float3 O3DE_MC_NORMAL = normal;
+    const float3 O3DE_MC_TANGENT = tangent.xyz;
+    const float3 O3DE_MC_BITANGENT = bitangent;
+    const float3 O3DE_MC_POSITION_WS = positionWS.xyz;
+    const float3 O3DE_MC_NORMAL_WS = normalWS;
+    const float3 O3DE_MC_TANGENT_WS = tangentWS;
+    const float3 O3DE_MC_BITANGENT_WS = bitangentWS;
+    #define O3DE_MC_UV(index) (index == 0 ? uv0 : uv1);
+
+    // m_placeHolder keeps MaterialSrg from being compiled out when iterating on graphs
+    const bool placeHolder = MaterialSrg::m_placeHolder;
+
+    // O3DE_GENERATED_INSTRUCTIONS_BEGIN: inPositionOffset
+    float3 inPositionOffset = {0.0, 0.0, 0.0};
+    // O3DE_GENERATED_INSTRUCTIONS_END
+
+    #undef O3DE_MC_UV
+
+    return float4((float3)positionWS + (float3)inPositionOffset, 1.0);
+}
+
+VsOutput EvaluateVertexGeometry_MaterialGraphName_Depth(VsInput IN, VsSystemValues SV)
+{
+    const float4 worldPosition = GenerateWorldPosition(
+        GetObjectToWorldMatrix(SV.m_instanceId),
+        GetObjectToWorldMatrixInverseTranspose(SV.m_instanceId),
+        IN.m_position,
+        real3(IN.m_normal),
+        real4(IN.m_tangent),
+        IN.m_uv0,
+        IN.m_uv1);
+
+    VsOutput output;
+    output.m_position = mul(ViewSrg::m_viewProjectionMatrix, worldPosition);
+    
+#if MATERIALPIPELINE_USES_PREV_VERTEX_POSITION
+    output.m_worldPos = worldPosition.xyz;
+    output.m_worldPosPrev = GenerateWorldPosition(
+        GetObjectToWorldMatrixPrev(SV.m_instanceId),
+        transpose((float3x3)GetObjectToWorldMatrixPrev(SV.m_instanceId)),
+        o_prevPosition_isBound ? IN.m_optional_prevPosition : IN.m_position,
+        real3(IN.m_normal),
+        real4(IN.m_tangent),
+        IN.m_uv0,
+        IN.m_uv1).xyz;
+#endif
+
+    return output;
+}
+

+ 0 - 24
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_Forward.azsl

@@ -1,24 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#include <Atom/Features/Pipeline/Forward/ForwardPassSrg.azsli>
-#include "MaterialGraphName_Common.azsli"
-
-// These cannot be included in the common file because the lighting data accesses the pass SRG which is not available on the depth pass
-#include <../Shaders/Materials/BasePBR/BasePBR_LightingData.azsli>
-#include <../Shaders/Materials/StandardPBR/StandardPBR_LightingBrdf.azsli>
-#include <../Shaders/Materials/StandardPBR/StandardPBR_LightingEval.azsli>
-
-// --- Vertex + Pixel Shader ---
-#if MULTI_VIEW_FORWARD
-#include <../Materials/Pipelines/MultiView/MultiViewForwardPassVertexAndPixel.azsli>
-#elif LOW_END_FORWARD
-#include <../Materials/Pipelines/LowEndPipeline/LowEndForwardPassVertexAndPixel.azsli>
-#else
-#include <../Materials/Pipelines/MainPipeline/ForwardPassVertexAndPixel.azsli>
-#endif

+ 0 - 51
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_ForwardPass.shader

@@ -1,51 +0,0 @@
-{
-    "Source": "./MaterialGraphName_Forward.azsl",
-
-    "Definitions": ["OUTPUT_DEPTH=1"],
-
-    "DepthStencilState" :
-    {
-        "Depth" :
-        {
-            "Enable" : true,
-            "CompareFunc" : "GreaterEqual"
-        },
-        "Stencil" :
-        {
-            "Enable" : true,
-            "ReadMask" : "0x00",
-            "WriteMask" : "0xFF",
-            "FrontFace" :
-            {
-                "Func" : "Always",
-                "DepthFailOp" : "Keep",
-                "FailOp" : "Keep",
-                "PassOp" : "Replace"
-            },
-            "BackFace" :
-            {
-                "Func" : "Always",
-                "DepthFailOp" : "Keep",
-                "FailOp" : "Keep",
-                "PassOp" : "Replace"
-            }
-        }
-    },
-
-    "ProgramSettings":
-    {
-        "EntryPoints":
-        [
-            {
-                "name": "VertexShader",
-                "type": "Vertex"
-            },
-            {
-                "name": "PixelShader",
-                "type": "Fragment"
-            }
-        ]
-    },
-
-    "DrawList" : "forward"
-}

+ 0 - 49
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_ForwardPass_EDS.shader

@@ -1,49 +0,0 @@
-{
-    "Source" : "./MaterialGraphName_Forward.azsl",
-
-    "DepthStencilState" :
-    {
-        "Depth" :
-        {
-            "Enable" : true,
-            "CompareFunc" : "GreaterEqual"
-        },
-        "Stencil" :
-        {
-            "Enable" : true,
-            "ReadMask" : "0x00",
-            "WriteMask" : "0xFF",
-            "FrontFace" :
-            {
-                "Func" : "Always",
-                "DepthFailOp" : "Keep",
-                "FailOp" : "Keep",
-                "PassOp" : "Replace"
-            },
-            "BackFace" :
-            {
-                "Func" : "Always",
-                "DepthFailOp" : "Keep",
-                "FailOp" : "Keep",
-                "PassOp" : "Replace"
-            }
-        }
-    },
-
-    "ProgramSettings":
-    {
-        "EntryPoints":
-        [
-            {
-                "name": "VertexShader",
-                "type": "Vertex"
-            },
-            {
-                "name": "PixelShader",
-                "type": "Fragment"
-            }
-        ]
-    },
-
-    "DrawList" : "forward"
-}

+ 0 - 52
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_LowEndForward.shader

@@ -1,52 +0,0 @@
-{
-    "Source" : "./MaterialGraphName_Forward.azsl",
-
-    "Definitions": ["QUALITY_LOW_END_TIER1=1", "LOW_END_FORWARD=1", "OUTPUT_DEPTH=1"],
-
-    "DepthStencilState" :
-    {
-        "Depth" :
-        {
-            "Enable" : true,
-            "CompareFunc" : "GreaterEqual"
-        },
-        "Stencil" :
-        {
-            "Enable" : true,
-            "ReadMask" : "0x00",
-            "WriteMask" : "0xFF",
-            "FrontFace" :
-            {
-                "Func" : "Always",
-                "DepthFailOp" : "Keep",
-                "FailOp" : "Keep",
-                "PassOp" : "Replace"
-            },
-            "BackFace" :
-            {
-                "Func" : "Always",
-                "DepthFailOp" : "Keep",
-                "FailOp" : "Keep",
-                "PassOp" : "Replace"
-            }
-        }
-    },
-
-    "ProgramSettings":
-    {
-        "EntryPoints":
-        [
-            {
-                "name": "VertexShader",
-                "type": "Vertex"
-            },
-            {
-                "name": "PixelShader",
-                "type": "Fragment"
-            }
-        ]
-    },
-
-
-    "DrawList" : "lowEndForward"
-}

+ 0 - 51
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_LowEndForward_EDS.shader

@@ -1,51 +0,0 @@
-{
-    "Source" : "./MaterialGraphName_Forward.azsl",
-
-    "Definitions" : ["QUALITY_LOW_END_TIER1=1", "LOW_END_FORWARD=1"],
-
-    "DepthStencilState" :
-    {
-        "Depth" :
-        {
-            "Enable" : true,
-            "CompareFunc" : "GreaterEqual"
-        },
-        "Stencil" :
-        {
-            "Enable" : true,
-            "ReadMask" : "0x00",
-            "WriteMask" : "0xFF",
-            "FrontFace" :
-            {
-                "Func" : "Always",
-                "DepthFailOp" : "Keep",
-                "FailOp" : "Keep",
-                "PassOp" : "Replace"
-            },
-            "BackFace" :
-            {
-                "Func" : "Always",
-                "DepthFailOp" : "Keep",
-                "FailOp" : "Keep",
-                "PassOp" : "Replace"
-            }
-        }
-    },
-
-    "ProgramSettings":
-    {
-        "EntryPoints":
-        [
-            {
-                "name": "VertexShader",
-                "type": "Vertex"
-            },
-            {
-                "name": "PixelShader",
-                "type": "Fragment"
-            }
-        ]
-    },
-
-    "DrawList" : "lowEndForward"
-}

+ 0 - 80
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_MeshMotionVector.azsl

@@ -1,80 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#include "MaterialGraphName_Common.azsli"
-#include <Atom/Features/InstancedTransforms.azsli>
-
-struct VSInput
-{
-    float3 m_position : POSITION;
-    
-    // This gets set automatically by the system at runtime only if it's available.
-    // There is a soft naming convention that associates this with o_prevPosition_isBound, which will be set to true whenever m_optional_prevPosition is available.
-    // (search "m_optional_" in ShaderVariantAssetBuilder for details on the naming convention).
-    // [GFX TODO][ATOM-14475]: Come up with a more elegant way to associate the isBound flag with the input stream.
-    // Vertex position of last frame to capture small scale motion due to vertex animation
-    float3 m_optional_prevPosition : POSITIONT;
-};
-
-struct VSOutput
-{
-    float4 m_position : SV_Position;
-    float3 m_worldPos : TEXCOORD0;
-    float3 m_worldPosPrev: TEXCOORD1;
-};
-
-struct PSOutput
-{
-    float2 m_motion : SV_Target0;
-};
-
-// Indicates whether the vertex input struct's "m_optional_prevPosition" is bound. If false, it is not safe to read from m_optional_prevPosition.
-// This option gets set automatically by the system at runtime; there is a soft naming convention that associates it with m_optional_prevPosition.
-// (search "m_optional_" in ShaderVariantAssetBuilder for details on the naming convention).
-// [GFX TODO][ATOM-14475]: Come up with a more elegant way to associate the isBound flag with the input stream.
-option bool o_prevPosition_isBound;
-
-VSOutput MainVS(VSInput IN, uint instanceId : SV_InstanceID)
-{
-    VSOutput OUT;
- 
-    OUT.m_worldPos = mul(GetObjectToWorldMatrix(instanceId), float4(IN.m_position, 1.0)).xyz;
-    OUT.m_position = mul(ViewSrg::m_viewProjectionMatrix, float4(OUT.m_worldPos, 1.0));
-
-    if (o_prevPosition_isBound)
-    {
-        OUT.m_worldPosPrev = mul(GetObjectToWorldMatrixPrev(instanceId), float4(IN.m_optional_prevPosition, 1.0)).xyz;
-    }
-    else
-    {
-        OUT.m_worldPosPrev = mul(GetObjectToWorldMatrixPrev(instanceId), float4(IN.m_position, 1.0)).xyz;
-    }
-
-    return OUT;
-}
-
-PSOutput MainPS(VSOutput IN)
-{
-    PSOutput OUT;
-
-    // Current clip position
-    float4 clipPos = mul(ViewSrg::m_viewProjectionMatrix, float4(IN.m_worldPos, 1.0));
-    
-    // Reprojected last frame's clip position, for skinned mesh it also implies last key frame
-    float4 clipPosPrev = mul(ViewSrg::m_viewProjectionPrevMatrix, float4(IN.m_worldPosPrev, 1.0));
-
-    float2 motion = (clipPos.xy / clipPos.w - clipPosPrev.xy / clipPosPrev.w) * 0.5;
-
-    OUT.m_motion = motion;
-    
-    // Flip y to line up with uv coordinates
-    OUT.m_motion.y = -OUT.m_motion.y;
-    
-    return OUT;
-}
-

+ 0 - 24
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_MeshMotionVector.shader

@@ -1,24 +0,0 @@
-{
-    "Source" : "./MaterialGraphName_MeshMotionVector.azsl",
-
-    "DepthStencilState" : { 
-        "Depth" : { "Enable" : true, "CompareFunc" : "GreaterEqual" }
-    },
-
-    "DrawList" : "motion",
-
-    "ProgramSettings":
-    {
-      "EntryPoints":
-      [
-        {
-          "name": "MainVS",
-          "type": "Vertex"
-        },
-        {
-          "name": "MainPS",
-          "type": "Fragment"
-        }
-      ]
-    }
-}

+ 0 - 51
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_MultiViewForward.shader

@@ -1,51 +0,0 @@
-{
-    "Source" : "./MaterialGraphName_Forward.azsl",
-
-    "Definitions": ["QUALITY_LOW_END_TIER1=1", "QUALITY_LOW_END_TIER2=1", "MULTI_VIEW_FORWARD=1", "OUTPUT_DEPTH=1"],
-
-    "DepthStencilState" :
-    {
-        "Depth" :
-        {
-            "Enable" : true,
-            "CompareFunc" : "GreaterEqual"
-        },
-        "Stencil" :
-        {
-            "Enable" : true,
-            "ReadMask" : "0x00",
-            "WriteMask" : "0xFF",
-            "FrontFace" :
-            {
-                "Func" : "Always",
-                "DepthFailOp" : "Keep",
-                "FailOp" : "Keep",
-                "PassOp" : "Replace"
-            },
-            "BackFace" :
-            {
-                "Func" : "Always",
-                "DepthFailOp" : "Keep",
-                "FailOp" : "Keep",
-                "PassOp" : "Replace"
-            }
-        }
-    },
-
-    "ProgramSettings":
-    {
-        "EntryPoints":
-        [
-            {
-                "name": "VertexShader",
-                "type": "Vertex"
-            },
-            {
-                "name": "PixelShader",
-                "type": "Fragment"
-            }
-        ]
-    },
-
-    "DrawList" : "multiViewForward"
-}

+ 0 - 51
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_MultiViewForward_EDS.shader

@@ -1,51 +0,0 @@
-{
-    "Source" : "./MaterialGraphName_Forward.azsl",
-
-    "Definitions" : ["QUALITY_LOW_END_TIER1=1", "QUALITY_LOW_END_TIER2=1", "MULTI_VIEW_FORWARD=1"],
-
-    "DepthStencilState" :
-    {
-        "Depth" :
-        {
-            "Enable" : true,
-            "CompareFunc" : "GreaterEqual"
-        },
-        "Stencil" :
-        {
-            "Enable" : true,
-            "ReadMask" : "0x00",
-            "WriteMask" : "0xFF",
-            "FrontFace" :
-            {
-                "Func" : "Always",
-                "DepthFailOp" : "Keep",
-                "FailOp" : "Keep",
-                "PassOp" : "Replace"
-            },
-            "BackFace" :
-            {
-                "Func" : "Always",
-                "DepthFailOp" : "Keep",
-                "FailOp" : "Keep",
-                "PassOp" : "Replace"
-            }
-        }
-    },
-
-    "ProgramSettings":
-    {
-        "EntryPoints":
-        [
-            {
-                "name": "VertexShader",
-                "type": "Vertex"
-            },
-            {
-                "name": "PixelShader",
-                "type": "Fragment"
-            }
-        ]
-    },
-
-    "DrawList" : "multiViewForward"
-}

+ 0 - 47
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_MultiViewTransparentForward_EDS.shader

@@ -1,47 +0,0 @@
-{
-    "Source" : "./MaterialGraphName_Forward.azsl",
-
-    "Definitions" : ["QUALITY_LOW_END_TIER1=1", "QUALITY_LOW_END_TIER2=1", "MULTI_VIEW_FORWARD=1"],
-
-    "DepthStencilState" :
-    {
-        "Depth" :
-        {
-            "Enable" : true,
-            "WriteMask" : "Zero",
-            "CompareFunc" : "GreaterEqual"
-        },
-        "Stencil" : {
-            "Enable" : true,
-            "ReadMask" : "0x00",
-            "WriteMask" : "0xFF",
-            "FrontFace" : { "Func" : "Always", "DepthFailOp" : "Keep", "FailOp" : "Keep", "PassOp" : "Replace" },
-            "BackFace" : { "Func" : "Always", "DepthFailOp" : "Keep", "FailOp" : "Keep", "PassOp" : "Replace" }
-        }
-    },
-
-    "ProgramSettings":
-    {
-        "EntryPoints":
-        [
-            {
-                "name": "VertexShader",
-                "type": "Vertex"
-            },
-            {
-                "name": "PixelShader",
-                "type": "Fragment"
-            }
-        ]
-    },
-
-    "GlobalTargetBlendState" : 
-    {
-            "Enable" : true,
-            "BlendSource" : "One",
-            "BlendDest" : "AlphaSourceInverse",
-            "BlendOp" : "Add"
-    },
-
-    "DrawList" : "multiviewTransparent"
-}

+ 0 - 28
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_Shadowmap.shader

@@ -1,28 +0,0 @@
-{
-    "Source": "./MaterialGraphName_Depth.azsl",
-
-    "Definitions" : ["SHADOWMAP=1"] ,
-
-    "DepthStencilState" : {
-        "Depth" : { "Enable" : true, "CompareFunc" : "LessEqual" }
-    },
-
-    "DrawList" : "shadow",
-    
-    "RasterState" :
-    {
-        "depthBias" : "10",
-        "depthBiasSlopeScale" : "4"
-    },
-    
-    "ProgramSettings":
-    {
-      "EntryPoints":
-      [
-        {
-          "name": "MainVS",
-          "type": "Vertex"
-        }
-      ]
-    }
-}

+ 0 - 32
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_Shadowmap_WithPS.shader

@@ -1,32 +0,0 @@
-{
-    "Source" : "./MaterialGraphName_Depth.azsl",
-
-    "Definitions" : ["SHADOWMAP=1"],
-
-    "DepthStencilState" : {
-        "Depth" : { "Enable" : true, "CompareFunc" : "LessEqual" }
-    },
-
-    "DrawList" : "shadow",
-    
-    "RasterState" :
-    {
-        "depthBias" : "10",
-        "depthBiasSlopeScale" : "4"
-    },
-    
-    "ProgramSettings":
-    {
-      "EntryPoints":
-      [
-        {
-          "name": "MainVS",
-          "type": "Vertex"
-        },
-        {
-          "name": "MainPS",
-          "type": "Fragment"
-        }
-      ]
-    }
-}

+ 8 - 17
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/StandardPBR.materialgraphnode

@@ -12,24 +12,9 @@
                 "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName.material",
                 "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName.materialtype",
                 "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_Common.azsli",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_Depth.azsl",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_DepthPass.shader",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_DepthPass_WithPS.shader",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_DepthPassTransparentMax.shader",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_DepthPassTransparentMin.shader",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_Forward.azsl",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_ForwardPass.shader",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_ForwardPass_EDS.shader",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_LowEndForward.shader",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_LowEndForward_EDS.shader",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_MeshMotionVector.azsl",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_MeshMotionVector.shader",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_MultiViewForward.shader",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_MultiViewForward_EDS.shader",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_MultiViewTransparentForward_EDS.shader",
+                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_DepthVertexData.azsli",
+                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_DepthVertexEval.azsli",
                 "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_PixelGeometryEval.azsli",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_Shadowmap.shader",
-                "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_Shadowmap_WithPS.shader",
                 "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_SurfaceEval.azsli",
                 "@gemroot:MaterialCanvas@/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_VertexEval.azsli"
             ]
@@ -132,6 +117,9 @@
                 "settings": {
                     "materialPropertyConnectionName": [
                         "doubleSided"
+                    ],
+                    "materialPropertyConnectionType": [
+                        "InternalProperty"
                     ]
                 }
             },
@@ -195,6 +183,9 @@
                 "settings": {
                     "materialPropertyConnectionName": [
                         "castShadows"
+                    ],
+                    "materialPropertyConnectionType": [
+                        "InternalProperty"
                     ]
                 }
             },

+ 29 - 1
Gems/Atom/Tools/MaterialCanvas/Code/Source/Document/MaterialGraphCompiler.cpp

@@ -113,6 +113,15 @@ namespace MaterialCanvas
             // Force delete prior versions of files to be generated if settings are configured to do so.
             DeleteExistingFilesForCurrentNode();
 
+            // Reset the asset processor fingerprint for material and material type files to force them to recompile even if nothing
+            // changed. Source material files generated by material canvas graph templates never change after its first generated.
+            // Material type and shader source files change constantly based on the configuration of the graph. The AP is not
+            // reprocessing or triggering asset notifications for unmodified material assets even though the dependencies are changing.
+            // AssetSystemRequestBus::Events::ClearFingerprintForAsset is rarely used but specifically documented to resolve this problem.
+            // The consequence is that reflecting some changes in the preview may take more time because all generated assets will be
+            // reprocessed including material types where only a material input might have changed.
+            ClearFingerprintsForCurrentNode();
+
             // Perform an initial pass over all template files, injecting include files, class definitions, function definitions, simple
             // things that don't require much processing.
             PreprocessTemplatesForCurrentNode();
@@ -309,6 +318,20 @@ namespace MaterialCanvas
         }
     }
 
+    void MaterialGraphCompiler::ClearFingerprintsForCurrentNode()
+    {
+        for (const auto& templatePath : m_templatePathsForCurrentNode)
+        {
+            if (templatePath.ends_with(".material") || templatePath.ends_with(".materialtype"))
+            {
+                const auto& templateInputPath = AtomToolsFramework::GetPathWithoutAlias(templatePath);
+                const auto& templateOutputPath = GetOutputPathFromTemplatePath(templateInputPath);
+                AzToolsFramework::AssetSystemRequestBus::Broadcast(
+                    &AzToolsFramework::AssetSystemRequestBus::Events::ClearFingerprintForAsset, templateOutputPath);
+            }
+        }
+    }
+
     void MaterialGraphCompiler::PreprocessTemplatesForCurrentNode()
     {
         AZ::parallel_for_each(
@@ -1305,11 +1328,16 @@ namespace MaterialCanvas
                         property->m_outputConnections.emplace_back(
                             AZ::RPI::MaterialPropertyOutputType::ShaderInput, materialPropertyConnectionName);
                     }
-                    if (AZ::StringFunc::Equal(materialPropertyConnectionType, "ShaderOption"))
+                    else if (AZ::StringFunc::Equal(materialPropertyConnectionType, "ShaderOption"))
                     {
                         property->m_outputConnections.emplace_back(
                             AZ::RPI::MaterialPropertyOutputType::ShaderOption, materialPropertyConnectionName);
                     }
+                    else if (AZ::StringFunc::Equal(materialPropertyConnectionType, "InternalProperty"))
+                    {
+                        property->m_outputConnections.emplace_back(
+                            AZ::RPI::MaterialPropertyOutputType::InternalProperty, materialPropertyConnectionName);
+                    }
                 }
             }
         }

+ 1 - 0
Gems/Atom/Tools/MaterialCanvas/Code/Source/Document/MaterialGraphCompiler.h

@@ -40,6 +40,7 @@ namespace MaterialCanvas
         void BuildTemplatePathsForCurrentNode(const GraphModel::ConstNodePtr& currentNode);
         bool LoadTemplatesForCurrentNode();
         void DeleteExistingFilesForCurrentNode();
+        void ClearFingerprintsForCurrentNode();
         void PreprocessTemplatesForCurrentNode();
         void BuildInstructionsForCurrentNode(const GraphModel::ConstNodePtr& currentNode);
         void BuildMaterialSrgForCurrentNode();