diff --git a/python/GafferRenderManTest/RenderManShaderTest.py b/python/GafferRenderManTest/RenderManShaderTest.py index fcff2a3dd14..c2bbe352f6c 100644 --- a/python/GafferRenderManTest/RenderManShaderTest.py +++ b/python/GafferRenderManTest/RenderManShaderTest.py @@ -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() diff --git a/src/GafferScene/Shader.cpp b/src/GafferScene/Shader.cpp index 7c35ebf0fb4..4e13e8e7bf8 100644 --- a/src/GafferScene/Shader.cpp +++ b/src/GafferScene/Shader.cpp @@ -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( shaderNode ) ); - s->parameters()["__handle"] = handleData; + IECore::StringDataPtr handleData = s->parametersData()->member( "__handle" ); + if( !handleData ) + { + s->setType( "shader" ); + handleData = new IECore::StringData( boost::lexical_cast( s ) ); + s->parameters()["__handle"] = handleData; + } return handleData->readable(); }