IECore::ConstCompoundObjectPtr SubTree::computeGlobals( const Gaffer::Context *context, const ScenePlug *parent ) const { ConstCompoundObjectPtr inputGlobals = inPlug()->globalsPlug()->getValue(); const CompoundData *inputSets = inputGlobals->member<CompoundData>( "gaffer:sets" ); if( !inputSets ) { return inputGlobals; } CompoundObjectPtr outputGlobals = inputGlobals->copy(); CompoundDataPtr outputSets = new CompoundData; outputGlobals->members()["gaffer:sets"] = outputSets; std::string root = rootPlug()->getValue(); if( !root.size() || root[root.size()-1] != '/' ) { root += "/"; } size_t prefixSize = root.size() - 1; // number of characters to remove from front of each declaration if( includeRootPlug()->getValue() && prefixSize ) { size_t lastSlashButOne = root.rfind( "/", prefixSize-1 ); if( lastSlashButOne != string::npos ) { prefixSize = lastSlashButOne; } } for( CompoundDataMap::const_iterator it = inputSets->readable().begin(), eIt = inputSets->readable().end(); it != eIt; ++it ) { /// \todo This could be more efficient if PathMatcher exposed the internal nodes, /// and allowed sharing between matchers. Then we could just pick the subtree within /// the matcher that we wanted. const PathMatcher &inputSet = static_cast<const PathMatcherData *>( it->second.get() )->readable(); PathMatcher &outputSet = outputSets->member<PathMatcherData>( it->first, /* throwExceptions = */ false, /* createIfMissing = */ true )->writable(); vector<string> inputPaths; inputSet.paths( inputPaths ); for( vector<string>::const_iterator pIt = inputPaths.begin(), peIt = inputPaths.end(); pIt != peIt; ++pIt ) { const string &inputPath = *pIt; if( inputPath.compare( 0, root.size(), root ) == 0 ) { std::string outputPath( inputPath, prefixSize ); outputSet.addPath( outputPath ); } } } return outputGlobals; }
Parameter::Parameter( const std::string &name, const std::string &description, ObjectPtr defaultValue, const PresetsContainer &presets, bool presetsOnly, ConstCompoundObjectPtr userData ) : m_name( name ), m_description( description ), m_defaultValue( defaultValue ), m_presetsOnly( presetsOnly ), m_userData( userData ? userData->copy() : 0 ) { if ( !defaultValue ) { throw Exception( "Invalid NULL default value!" ); } for( PresetsContainer::const_iterator it=presets.begin(); it!=presets.end(); it++ ) { m_presets.push_back( PresetsContainer::value_type( it->first, it->second->copy() ) ); } /// \todo If presetsOnly is true, doesn't this allow us to set a defaultValue that isn't in the presets list? setValue( defaultValue->copy() ); }
IECore::ConstCompoundObjectPtr Prune::computeGlobals( const Gaffer::Context *context, const ScenePlug *parent ) const { ConstCompoundObjectPtr inputGlobals = inPlug()->globalsPlug()->getValue(); const CompoundData *inputSets = inputGlobals->member<CompoundData>( "gaffer:sets" ); if( !inputSets ) { return inputGlobals; } CompoundObjectPtr outputGlobals = inputGlobals->copy(); CompoundDataPtr outputSets = new CompoundData; outputGlobals->members()["gaffer:sets"] = outputSets; ContextPtr tmpContext = new Context( *Context::current() ); Context::Scope scopedContext( tmpContext ); ScenePath path; for( CompoundDataMap::const_iterator it = inputSets->readable().begin(), eIt = inputSets->readable().end(); it != eIt; ++it ) { /// \todo This could be more efficient if PathMatcher exposed the internal nodes, /// and allowed sharing between matchers. Then we could do a really lightweight copy /// and just trim out the nodes we didn't want. const PathMatcher &inputSet = static_cast<const PathMatcherData *>( it->second.get() )->readable(); PathMatcher &outputSet = outputSets->member<PathMatcherData>( it->first, /* throwExceptions = */ false, /* createIfMissing = */ true )->writable(); vector<string> inputPaths; inputSet.paths( inputPaths ); for( vector<string>::const_iterator pIt = inputPaths.begin(), peIt = inputPaths.end(); pIt != peIt; ++pIt ) { path.clear(); ScenePlug::stringToPath( *pIt, path ); tmpContext->set( ScenePlug::scenePathContextName, path ); if( !(filterPlug()->getValue() & ( Filter::ExactMatch | Filter::AncestorMatch ) ) ) { outputSet.addPath( *pIt ); } } } return outputGlobals; }