static void loadCoshaderParameter( Gaffer::CompoundPlug *parametersPlug, const std::string &name ) { Plug *existingPlug = parametersPlug->getChild<Plug>( name ); if( existingPlug && existingPlug->typeId() == Plug::staticTypeId() ) { return; } PlugPtr plug = new Plug( name, Plug::In, Plug::Default | Plug::Dynamic ); if( existingPlug && existingPlug->getInput<Plug>() ) { plug->setInput( existingPlug->getInput<Plug>() ); } parametersPlug->setChild( name, plug ); }
static Plug *loadClosureParameter( const OSLQuery::Parameter *parameter, Gaffer::CompoundPlug *parent ) { const string name = plugName( parameter ); Plug *existingPlug = parent->getChild<Plug>( name ); if( existingPlug && existingPlug->typeId() == Plug::staticTypeId() ) { return existingPlug; } PlugPtr plug = new Plug( name, parent->direction(), Plug::Default | Plug::Dynamic ); transferConnectionOrValue( existingPlug, plug.get() ); parent->setChild( name, plug ); return plug; }
void OSLShader::loadShader( const std::string &shaderName, bool keepExistingValues ) { const char *searchPath = getenv( "OSL_SHADER_PATHS" ); OSLQuery query; if( !query.open( shaderName, searchPath ? searchPath : "" ) ) { throw Exception( query.error() ); } loadShaderParameters( query, parametersPlug(), keepExistingValues ); if( query.shadertype() == "shader" ) { CompoundPlug *existingOut = getChild<CompoundPlug>( "out" ); if( !existingOut || existingOut->typeId() != CompoundPlug::staticTypeId() ) { CompoundPlugPtr outPlug = new CompoundPlug( "out", Plug::Out, Plug::Default | Plug::Dynamic ); setChild( "out", outPlug ); } loadShaderParameters( query, getChild<CompoundPlug>( "out" ), keepExistingValues ); } else { Plug *existingOut = getChild<Plug>( "out" ); if( !existingOut || existingOut->typeId() != Plug::staticTypeId() ) { PlugPtr outPlug = new Plug( "out", Plug::Out, Plug::Default | Plug::Dynamic ); setChild( "out", outPlug ); } } namePlug()->setValue( shaderName ); typePlug()->setValue( "osl:" + query.shadertype() ); m_metadata = NULL; }
void OSLShader::loadShader( const std::string &shaderName, bool keepExistingValues ) { Plug *existingOut = outPlug(); if( shaderName.empty() ) { parametersPlug()->clearChildren(); namePlug()->setValue( "" ); typePlug()->setValue( "" ); if( existingOut ) { existingOut->clearChildren(); } return; } const char *searchPath = getenv( "OSL_SHADER_PATHS" ); OSLQuery query; if( !query.open( shaderName, searchPath ? searchPath : "" ) ) { throw Exception( query.geterror() ); } const bool outPlugHadChildren = existingOut ? existingOut->children().size() : false; if( !keepExistingValues ) { // If we're not preserving existing values then remove all existing // parameter plugs - the various plug creators above know that if a // plug exists then they should preserve its values. parametersPlug()->clearChildren(); if( existingOut ) { existingOut->clearChildren(); } } m_metadata = NULL; namePlug()->setValue( shaderName ); typePlug()->setValue( std::string( "osl:" ) + query.shadertype().c_str() ); const IECore::CompoundData *metadata = OSLShader::metadata(); const IECore::CompoundData *parameterMetadata = NULL; if( metadata ) { parameterMetadata = metadata->member<IECore::CompoundData>( "parameter" ); } loadShaderParameters( query, parametersPlug(), parameterMetadata ); if( !existingOut || existingOut->typeId() != Plug::staticTypeId() ) { PlugPtr outPlug = new Plug( "out", Plug::Out, Plug::Default | Plug::Dynamic ); if( existingOut ) { // We had an out plug but it was the wrong type (we used // to use a CompoundPlug before that was deprecated). Move // over any existing child plugs onto our replacement. for( PlugIterator it( existingOut ); !it.done(); ++it ) { outPlug->addChild( *it ); } } setChild( "out", outPlug ); } if( query.shadertype() == "shader" ) { loadShaderParameters( query, outPlug(), parameterMetadata ); } else { outPlug()->clearChildren(); } if( static_cast<bool>( outPlug()->children().size() ) != outPlugHadChildren ) { // OSLShaderUI registers a dynamic metadata entry which depends on whether or // not the plug has children, so we must notify the world that the value will // have changed. Metadata::plugValueChangedSignal()( staticTypeId(), "out", "nodule:type", outPlug() ); } }