@@ -123,10 +123,17 @@ _IsConnectionDirty(
123123 const UsdPrim& dirtyPrim,
124124 const TfTokenVector& dirtyProperties,
125125 const UsdShadeMaterial& material,
126- const UsdShadeConnectionSourceInfo& connection)
126+ const UsdShadeConnectionSourceInfo& connection,
127+ TfHashMap<UsdShadeConnectionSourceInfo, bool , TfHash>& seenConnections)
127128{
129+ if (bool seen; TfMapLookup (seenConnections, connection, &seen))
130+ return seen;
131+
128132 if (!connection.IsValid ())
133+ {
134+ seenConnections.insert ({connection, false });
129135 return false ;
136+ }
130137
131138 // If we reach the root material only dirty if we are connected to the
132139 // specific property which is dirty and don't recurse further.
@@ -141,15 +148,18 @@ _IsConnectionDirty(
141148 && dirtyProperty
142149 == connection.source .GetInput (connection.sourceName )
143150 .GetFullName ())) {
151+ seenConnections.insert ({connection, true });
144152 return true ;
145153 }
146154 }
147155 }
156+ seenConnections.insert ({connection, false });
148157 return false ;
149158 }
150159
151160 // We are connected to the dirty prim
152161 if (connection.source .GetPrim () == dirtyPrim) {
162+ seenConnections.insert ({connection, true });
153163 return true ;
154164 }
155165
@@ -162,7 +172,8 @@ _IsConnectionDirty(
162172 output.GetConnectedSources ()) {
163173 if (_IsConnectionDirty (
164174 dirtyPrim, dirtyProperties, material,
165- outputConnection)) {
175+ outputConnection, seenConnections)) {
176+ seenConnections.insert ({connection, true });
166177 return true ;
167178 }
168179 }
@@ -174,12 +185,14 @@ _IsConnectionDirty(
174185 for (UsdShadeConnectionSourceInfo& inputConnection :
175186 input.GetConnectedSources ()) {
176187 if (_IsConnectionDirty (
177- dirtyPrim, dirtyProperties, material, inputConnection)) {
188+ dirtyPrim, dirtyProperties, material, inputConnection, seenConnections)) {
189+ seenConnections.insert ({connection, true });
178190 return true ;
179191 }
180192 }
181193 }
182194
195+ seenConnections.insert ({connection, false });
183196 return false ;
184197}
185198
@@ -201,7 +214,8 @@ UsdImagingMaterialAdapter::InvalidateImagingSubprim(
201214 for (UsdShadeOutput& output : material.GetOutputs ()) {
202215 for (UsdShadeConnectionSourceInfo& connection :
203216 output.GetConnectedSources ()) {
204- if (_IsConnectionDirty (prim, properties, material, connection)) {
217+ TfHashMap<UsdShadeConnectionSourceInfo, bool , TfHash> seenConnections;
218+ if (_IsConnectionDirty (prim, properties, material, connection, seenConnections)) {
205219 result.insert (_CreateTerminalLocator (output.GetBaseName ()));
206220 }
207221 }
@@ -235,8 +249,9 @@ UsdImagingMaterialAdapter::InvalidateImagingSubprimFromDescendent(
235249 for (UsdShadeOutput& output : material.GetOutputs ()) {
236250 for (UsdShadeConnectionSourceInfo& connection :
237251 output.GetConnectedSources ()) {
252+ TfHashMap<UsdShadeConnectionSourceInfo, bool , TfHash> seenConnections;
238253 if (_IsConnectionDirty (
239- descendentPrim, properties, material, connection)) {
254+ descendentPrim, properties, material, connection, seenConnections )) {
240255 result.insert (_CreateTerminalLocator (output.GetBaseName ()));
241256 }
242257 }
0 commit comments