Skip to content

Commit

Permalink
Fixed disabled Shader pass-through bug.
Browse files Browse the repository at this point in the history
We were overwriting the handle of the shader every time we accessed it, and the handle was being based on the node passed to shaderHandle(). We now never overwrite a handle once it has been generated, and also base the handle on the shader itself rather than the node it was computed for. When we do GafferHQ#335, we'll now be able to extract a useful label from the shader to use as part of the handle.
  • Loading branch information
johnhaddon committed Aug 9, 2013
1 parent d90ceb2 commit 15b58f2
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 3 deletions.
42 changes: 42 additions & 0 deletions python/GafferRenderManTest/RenderManShaderTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -1003,6 +1003,48 @@ def testCoshaderTypeAnnotations( self ) :
self.assertFalse( shaderNode["parameters"]["coshaderArrayParameterType2"]["in1"].acceptsInput( coshaderNode["out"] ) )
self.assertFalse( shaderNode["parameters"]["coshaderArrayParameterType2"]["in1"].acceptsInput( coshaderType1Node["out"] ) )
self.assertTrue( shaderNode["parameters"]["coshaderArrayParameterType2"]["in1"].acceptsInput( coshaderType2Node["out"] ) )

def testSplitCoshaderPassThrough( self ) :

# C ----S S is connected to C both directly
# | | and as a pass-through of the disabled
# D ---- node D.
#

shader = self.compileShader( os.path.dirname( __file__ ) + "/shaders/coshaderArrayParameters.sl" )
S = GafferRenderMan.RenderManShader()
S.loadShader( shader )

passThroughCoshader = self.compileShader( os.path.dirname( __file__ ) + "/shaders/coshaderWithPassThrough.sl" )
D = GafferRenderMan.RenderManShader()
D.loadShader( passThroughCoshader )

coshader = self.compileShader( os.path.dirname( __file__ ) + "/shaders/coshader.sl" )
C = GafferRenderMan.RenderManShader()
C.loadShader( coshader )

S["parameters"]["fixedShaderArray"][0].setInput( C["out"] )
S["parameters"]["fixedShaderArray"][1].setInput( D["out"] )
D["parameters"]["aColorIWillTint"].setInput( C["out"] )

h = S.stateHash()
s = S.state()

self.assertEqual( len( s ), 3 )
self.assertEqual( s[2].parameters["fixedShaderArray"], IECore.StringVectorData( [ s[0].parameters["__handle"].value, s[1].parameters["__handle"].value, "", "" ] ) )
self.assertEqual( s[0].name, coshader )
self.assertEqual( s[1].parameters["aColorIWillTint"], s[0].parameters["__handle"] )
self.assertEqual( s[1].name, passThroughCoshader )

D["enabled"].setValue( False )

self.assertNotEqual( S.stateHash(), h )

s = S.state()

self.assertEqual( len( s ), 2 )
self.assertEqual( s[1].parameters["fixedShaderArray"], IECore.StringVectorData( [ s[0].parameters["__handle"].value, s[0].parameters["__handle"].value, "", "" ] ) )
self.assertEqual( s[0].name, coshader )

if __name__ == "__main__":
unittest.main()
10 changes: 7 additions & 3 deletions src/GafferScene/Shader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -284,9 +284,13 @@ const std::string &Shader::NetworkBuilder::shaderHandle( const Shader *shaderNod
return emptyString;
}

s->setType( "shader" );
IECore::StringDataPtr handleData = new IECore::StringData( boost::lexical_cast<std::string>( shaderNode ) );
s->parameters()["__handle"] = handleData;
IECore::StringDataPtr handleData = s->parametersData()->member<IECore::StringData>( "__handle" );
if( !handleData )
{
s->setType( "shader" );
handleData = new IECore::StringData( boost::lexical_cast<std::string>( s ) );
s->parameters()["__handle"] = handleData;
}
return handleData->readable();
}

Expand Down

0 comments on commit 15b58f2

Please sign in to comment.