Add support for Material Nodegraph edits when using the stage SceneIndex
authorklucknav <klucknav@users.noreply.github.com>
Tue, 19 Dec 2023 23:51:15 +0000 (15:51 -0800)
committerpixar-oss <pixar-oss@users.noreply.github.com>
Tue, 19 Dec 2023 23:51:15 +0000 (15:51 -0800)
(Internal change: 2309444)

pxr/usdImaging/usdImaging/dataSourceMaterial.cpp
pxr/usdImaging/usdImaging/materialAdapter.cpp
pxr/usdImaging/usdImaging/materialAdapter.h
pxr/usdImaging/usdImaging/plugInfo.json

index dcc79ecec257266ba4d8c0aba26712440da2cb47..74244c65fc6ce8954f0be42ad6ca2703f00b22b6 100644 (file)
@@ -430,12 +430,13 @@ public:
             } else if (UsdLuxLightFilter lightFilter =
                     UsdLuxLightFilter(_shaderNode.GetPrim())) {
                 nodeId = lightFilter.GetShaderId({});
-
             } else if (UsdLuxLightAPI light =
                     UsdLuxLightAPI(_shaderNode.GetPrim())) {
                 nodeId = light.GetShaderId({});
+            } else if (UsdShadeNodeGraph nodegraph = 
+                    UsdShadeNodeGraph(_shaderNode.GetPrim())) {
+                nodeId = TfToken();
             }
-
             _shaderNode.GetShaderId(&nodeId);
             return HdRetainedTypedSampledDataSource<TfToken>::New(nodeId);
         }
@@ -454,6 +455,7 @@ public:
             return nullptr;
             
         }
+        
         if (name == HdMaterialNodeSchemaTokens->nodeTypeInfo) {
             if (_shaderNode.GetImplementationSource() != UsdShadeTokens->id) {
                 return _UsdImagingNodeTypeInfoSource::New(
@@ -591,7 +593,6 @@ _WalkGraph(
                 materialPrefix);
         }
     }
-
 }
 
 static
@@ -604,7 +605,6 @@ _BuildNetwork(
     const SdfPath &sceneIndexPath,
     const HdDataSourceLocator &locatorPrefix)
 {
-
     _TokenDataSourceMap nodeDataSources;
     _WalkGraph(terminalNode,
                 &nodeDataSources,
@@ -655,6 +655,29 @@ _BuildNetwork(
 
 }
 
+static
+UsdShadeConnectableAPI
+_ComputeOutputSource(
+    const UsdShadeMaterial &usdMat,
+    const TfToken &outputName,
+    const TfTokenVector &renderContext,
+    UsdShadeConnectionSourceInfo sourceInfo) 
+{
+    if (outputName == UsdShadeTokens->surface) {
+        return UsdShadeConnectableAPI(usdMat.ComputeSurfaceSource(
+            renderContext, &sourceInfo.sourceName, &sourceInfo.sourceType));
+    }
+    if (outputName == UsdShadeTokens->displacement) {
+        return UsdShadeConnectableAPI(usdMat.ComputeDisplacementSource(
+            renderContext, &sourceInfo.sourceName, &sourceInfo.sourceType));        
+    }
+    if (outputName == UsdShadeTokens->volume) {
+        return UsdShadeConnectableAPI(usdMat.ComputeVolumeSource(
+            renderContext, &sourceInfo.sourceName, &sourceInfo.sourceType));        
+    }
+    return UsdShadeConnectableAPI(sourceInfo.source.GetPrim());
+}
+
 static 
 HdDataSourceBaseHandle
 _BuildMaterial(
@@ -701,7 +724,8 @@ _BuildMaterial(
                 continue;
             }
 
-            UsdShadeConnectableAPI upstreamShader(sourceInfo.source.GetPrim());
+            UsdShadeConnectableAPI upstreamShader = _ComputeOutputSource(
+                UsdShadeMaterial(usdMat), outputName, {context}, sourceInfo);
 
             _WalkGraph(upstreamShader,
                 &nodeDataSources,
index e374a4587c22af5186328a1e9eee84e05454eb92..78dc14a2ce44d480c64890e089a05ff1009af90d 100644 (file)
@@ -58,6 +58,12 @@ TF_REGISTRY_FUNCTION(TfType)
     t.SetFactory< UsdImagingPrimAdapterFactory<Adapter> >();
     }
 
+    {
+    typedef UsdImagingNodeGraphAdapter Adapter;
+    TfType t = TfType::Define<Adapter, TfType::Bases<Adapter::BaseAdapter> >();
+    t.SetFactory< UsdImagingPrimAdapterFactory<Adapter> >();
+    }
+
 }
 
 UsdImagingMaterialAdapter::~UsdImagingMaterialAdapter()
index b5e0e09ac6c4a89aea75cdd219b114e751e6710d..17db5bd66bacbabeac0b8a4bc4b717bdd38290bf 100644 (file)
@@ -177,6 +177,19 @@ public:
         : UsdImagingRepresentedByAncestorPrimAdapter() {}
 };
 
+/// \class UsdImagingNodeGraphAdapter
+/// \brief Delegates invalidation responsibility of a Noge Graph prim to an
+/// ancestor Material prim
+class UsdImagingNodeGraphAdapter :
+        public UsdImagingRepresentedByAncestorPrimAdapter
+{
+public:
+    using BaseAdapter = UsdImagingRepresentedByAncestorPrimAdapter;
+
+    UsdImagingNodeGraphAdapter()
+        : UsdImagingRepresentedByAncestorPrimAdapter() {}
+};
+
 PXR_NAMESPACE_CLOSE_SCOPE
 
 #endif // PXR_USD_IMAGING_USD_IMAGING_MATERIAL_ADAPTER_H
index 1441028f5cbae10f1a31f31aae81ec99533569a0..0143606c8addd3edac329a1d54511b2f2b928027 100644 (file)
                         "primTypeName": "Shader"
                     },
 
+                    "UsdImagingNodeGraphAdapter" : {
+                        "bases": ["UsdImagingRepresentedByAncestorPrimAdapter"],
+                        "isInternal": true,
+                        "primTypeName": "NodeGraph"
+                    },
+
                     "UsdImagingMaterialBindingAPIAdapter" : {
                         "bases": ["UsdImagingAPISchemaAdapter"],
                         "isInternal": true,