static IECore::ConstCompoundDataPtr metadataGetter( const std::string &key, size_t &cost ) { cost = 1; if( !key.size() ) { return NULL; } const char *searchPath = getenv( "OSL_SHADER_PATHS" ); OSLQuery query; if( !query.open( key, searchPath ? searchPath : "" ) ) { throw Exception( query.error() ); } CompoundDataPtr metadata = new CompoundData; metadata->writable()["shader"] = convertMetadata( query.metadata() ); CompoundDataPtr parameterMetadata = new CompoundData; metadata->writable()["parameter"] = parameterMetadata; for( size_t i = 0; i < query.nparams(); ++i ) { const OSLQuery::Parameter *parameter = query.getparam( i ); if( parameter->metadata.size() ) { parameterMetadata->writable()[parameter->name] = convertMetadata( parameter->metadata ); } } return metadata; }
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; }