Skip to content

Commit ab7556a

Browse files
authored
Merge pull request #1417 from danieldresser-ie/removeUnusedCycleCrash
ShaderNetworkAlgo::removedUnusedShaders : Optimize, fix crash in case of cycle
2 parents 976e18a + 850a2a6 commit ab7556a

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

src/IECoreScene/ShaderNetworkAlgo.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,12 @@ namespace
9696

9797
void visitInputs( const ShaderNetwork *network, InternedString handle, std::unordered_set<InternedString> &visited )
9898
{
99-
visited.insert( handle );
100-
for( const auto &c : network->inputConnections( handle ) )
99+
if( visited.insert( handle ).second )
101100
{
102-
visitInputs( network, c.source.shader, visited );
101+
for( const auto &c : network->inputConnections( handle ) )
102+
{
103+
visitInputs( network, c.source.shader, visited );
104+
}
103105
}
104106
}
105107

test/IECoreScene/ShaderNetworkAlgoTest.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def testAddShaders( self ) :
8585

8686
def testRemoveUnusedShaders( self ) :
8787

88-
n = IECoreScene.ShaderNetwork(
88+
source = IECoreScene.ShaderNetwork(
8989
shaders = {
9090
"used1" : IECoreScene.Shader(),
9191
"used2" : IECoreScene.Shader(),
@@ -103,6 +103,13 @@ def testRemoveUnusedShaders( self ) :
103103
output = ( "used3", "" ),
104104
)
105105

106+
n = source.copy()
107+
IECoreScene.ShaderNetworkAlgo.removeUnusedShaders( n )
108+
self.assertEqual( set( n.shaders().keys() ), { "used1", "used2", "used3" } )
109+
110+
# Test a network with a cycle - this is invalid, but we don't want it to crash
111+
n = source.copy()
112+
n.addConnection( ( ( "used3", "out" ), ( "used2", "in2" ) ) )
106113
IECoreScene.ShaderNetworkAlgo.removeUnusedShaders( n )
107114
self.assertEqual( set( n.shaders().keys() ), { "used1", "used2", "used3" } )
108115

0 commit comments

Comments
 (0)