diff --git a/Changes.md b/Changes.md index 5113a1680f5..d1d2366a5e7 100644 --- a/Changes.md +++ b/Changes.md @@ -19,6 +19,7 @@ API --- - OptionalValuePlug : Added a new plug type that pairs an `enabled` BoolPlug with a `value` ValuePlug. +- Shader : Added support for using OptionalValuePlug to represent optional parameters. 1.3.0.0 (relative to 1.2.10.0) ======= diff --git a/python/GafferSceneTest/ShaderTest.py b/python/GafferSceneTest/ShaderTest.py index f1c98f89fc7..721dfe268cf 100644 --- a/python/GafferSceneTest/ShaderTest.py +++ b/python/GafferSceneTest/ShaderTest.py @@ -429,5 +429,27 @@ def testSpline( self ) : with self.assertRaisesRegex( RuntimeError, "n1.__outAttributes : Cannot support monotone cubic interpolation for splines with inputs, for plug n1.parameters.spline" ): network = n1.attributes()["test:surface"] + def testOptionalParameter( self ) : + + node = GafferSceneTest.TestShader( "n1" ) + node["type"].setValue( "test:surface" ) + + shader = node.attributes()["test:surface"].outputShader() + self.assertNotIn( "optionalString", shader.parameters ) + + node["parameters"]["optionalString"]["enabled"].setValue( True ) + shader = node.attributes()["test:surface"].outputShader() + self.assertIn( "optionalString", shader.parameters ) + self.assertEqual( shader.parameters["optionalString"], IECore.StringData() ) + + node["parameters"]["optionalString"]["value"].setValue( "test" ) + shader = node.attributes()["test:surface"].outputShader() + self.assertIn( "optionalString", shader.parameters ) + self.assertEqual( shader.parameters["optionalString"], IECore.StringData( "test" ) ) + + node["parameters"]["optionalString"]["enabled"].setValue( False ) + shader = node.attributes()["test:surface"].outputShader() + self.assertNotIn( "optionalString", shader.parameters ) + if __name__ == "__main__": unittest.main() diff --git a/src/GafferScene/Shader.cpp b/src/GafferScene/Shader.cpp index 046e201c5d4..b3e0839e5f2 100644 --- a/src/GafferScene/Shader.cpp +++ b/src/GafferScene/Shader.cpp @@ -40,6 +40,7 @@ #include "Gaffer/PlugAlgo.h" #include "Gaffer/Metadata.h" #include "Gaffer/NumericPlug.h" +#include "Gaffer/OptionalValuePlug.h" #include "Gaffer/ScriptNode.h" #include "Gaffer/StringPlug.h" #include "Gaffer/SplinePlug.h" @@ -1024,10 +1025,16 @@ void Shader::compute( Gaffer::ValuePlug *output, const Gaffer::Context *context void Shader::parameterHash( const Gaffer::Plug *parameterPlug, IECore::MurmurHash &h ) const { - const ValuePlug *vplug = IECore::runTimeCast( parameterPlug ); - if( vplug ) + if( auto optionalValuePlug = IECore::runTimeCast( parameterPlug ) ) { - vplug->hash( h ); + if( optionalValuePlug->enabledPlug()->getValue() ) + { + optionalValuePlug->valuePlug()->hash( h ); + } + } + else if( auto valuePlug = IECore::runTimeCast( parameterPlug ) ) + { + valuePlug->hash( h ); } else { @@ -1037,7 +1044,18 @@ void Shader::parameterHash( const Gaffer::Plug *parameterPlug, IECore::MurmurHas IECore::DataPtr Shader::parameterValue( const Gaffer::Plug *parameterPlug ) const { - if( const Gaffer::ValuePlug *valuePlug = IECore::runTimeCast( parameterPlug ) ) + if( auto optionalValuePlug = IECore::runTimeCast( parameterPlug ) ) + { + if( optionalValuePlug->enabledPlug()->getValue() ) + { + return Gaffer::PlugAlgo::getValueAsData( optionalValuePlug->valuePlug() ); + } + else + { + return nullptr; + } + } + else if( auto valuePlug = IECore::runTimeCast( parameterPlug ) ) { return Gaffer::PlugAlgo::getValueAsData( valuePlug ); } diff --git a/src/GafferSceneTest/TestShader.cpp b/src/GafferSceneTest/TestShader.cpp index bb8faac1129..011749b464b 100644 --- a/src/GafferSceneTest/TestShader.cpp +++ b/src/GafferSceneTest/TestShader.cpp @@ -37,6 +37,7 @@ #include "GafferSceneTest/TestShader.h" #include "Gaffer/CompoundNumericPlug.h" +#include "Gaffer/OptionalValuePlug.h" #include "Gaffer/StringPlug.h" #include "Gaffer/SplinePlug.h" @@ -59,6 +60,7 @@ TestShader::TestShader( const std::string &name ) parametersPlug()->addChild( new IntPlug( "i" ) ); parametersPlug()->addChild( new Color3fPlug( "c" ) ); parametersPlug()->addChild( new SplinefColor3fPlug( "spline" ) ); + parametersPlug()->addChild( new OptionalValuePlug( "optionalString", new Gaffer::StringPlug() ) ); } TestShader::~TestShader()