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; }