IECore::ConstInternedStringVectorDataPtr Isolate::computeChildNames( const ScenePath &path, const Gaffer::Context *context, const ScenePlug *parent ) const { ContextPtr tmpContext = filterContext( context ); Context::Scope scopedContext( tmpContext.get() ); if( mayPruneChildren( path, filterPlug()->getValue() ) ) { // we may need to delete one or more of our children ConstInternedStringVectorDataPtr inputChildNamesData = inPlug()->childNamesPlug()->getValue(); const vector<InternedString> &inputChildNames = inputChildNamesData->readable(); InternedStringVectorDataPtr outputChildNamesData = new InternedStringVectorData; vector<InternedString> &outputChildNames = outputChildNamesData->writable(); ScenePath childPath = path; childPath.push_back( InternedString() ); // for the child name for( vector<InternedString>::const_iterator it = inputChildNames.begin(), eIt = inputChildNames.end(); it != eIt; it++ ) { childPath[path.size()] = *it; tmpContext->set( ScenePlug::scenePathContextName, childPath ); if( filterPlug()->getValue() != Filter::NoMatch ) { outputChildNames.push_back( *it ); } } return outputChildNamesData; } else { // pass through return inPlug()->childNamesPlug()->getValue(); } }
SceneNode::ScenePath SubTree::sourcePath( const ScenePath &outputPath, bool &createRoot ) const { typedef boost::tokenizer<boost::char_separator<char> > Tokenizer; /// \todo We should introduce a plug type which stores its values as a ScenePath directly. string rootAsString = rootPlug()->getValue(); Tokenizer rootTokenizer( rootAsString, boost::char_separator<char>( "/" ) ); ScenePath result; for( Tokenizer::const_iterator it = rootTokenizer.begin(), eIt = rootTokenizer.end(); it != eIt; it++ ) { result.push_back( *it ); } createRoot = false; if( result.size() && includeRootPlug()->getValue() ) { if( outputPath.size() ) { result.insert( result.end(), outputPath.begin() + 1, outputPath.end() ); } else { createRoot = true; } } else { result.insert( result.end(), outputPath.begin(), outputPath.end() ); } return result; }
void Prune::hashChildNames( const ScenePath &path, const Gaffer::Context *context, const ScenePlug *parent, IECore::MurmurHash &h ) const { FilterPlug::SceneScope sceneScope( context, inPlug() ); const Filter::Result m = (Filter::Result)filterPlug()->getValue(); if( m & Filter::ExactMatch ) { h = inPlug()->childNamesPlug()->defaultValue()->Object::hash(); } else if( m & Filter::DescendantMatch ) { // we might be computing new childnames for this level. FilteredSceneProcessor::hashChildNames( path, context, parent, h ); ConstInternedStringVectorDataPtr inputChildNamesData = inPlug()->childNamesPlug()->getValue(); const vector<InternedString> &inputChildNames = inputChildNamesData->readable(); ScenePath childPath = path; childPath.push_back( InternedString() ); // for the child name for( vector<InternedString>::const_iterator it = inputChildNames.begin(), eIt = inputChildNames.end(); it != eIt; ++it ) { childPath[path.size()] = *it; sceneScope.set( ScenePlug::scenePathContextName, childPath ); filterPlug()->hash( h ); } } else { // pass through h = inPlug()->childNamesPlug()->hash(); } }
Filter::Result BranchCreator::parentAndBranchPaths( const IECore::CompoundData *mapping, const ScenePath &path, ScenePath &parentPath, ScenePath &branchPath ) const { if( !mapping->readable().size() ) { return Filter::NoMatch; } const ScenePath &parent = mapping->member<InternedStringVectorData>( "__BranchCreatorParent" )->readable(); ScenePath::const_iterator parentIterator, parentIteratorEnd, pathIterator, pathIteratorEnd; for( parentIterator = parent.begin(), parentIteratorEnd = parent.end(), pathIterator = path.begin(), pathIteratorEnd = path.end(); parentIterator != parentIteratorEnd && pathIterator != pathIteratorEnd; parentIterator++, pathIterator++ ) { if( *parentIterator != *pathIterator ) { return Filter::NoMatch; } } if( pathIterator == pathIteratorEnd ) { // path is ancestor of parent, or parent itself parentPath = parent; return parentIterator == parentIteratorEnd ? Filter::ExactMatch : Filter::DescendantMatch; } // path is descendant of parent const InternedStringData *branchName = mapping->member<InternedStringData>( *pathIterator ); if( !branchName ) { // descendant comes from the input, rather than being part of the generated branch return Filter::NoMatch; } // somewhere on the new branch parentPath = parent; branchPath.push_back( branchName->readable() ); branchPath.insert( branchPath.end(), ++pathIterator, pathIteratorEnd ); return Filter::AncestorMatch; }
SceneNode::ScenePath Group::sourcePath( const ScenePath &outputPath, const std::string &groupName, const ScenePlug **source ) const { const InternedString mappedChildName = outputPath[1]; ConstCompoundObjectPtr mapping = boost::static_pointer_cast<const CompoundObject>( mappingPlug()->getValue() ); const CompoundObject *entry = mapping->member<CompoundObject>( mappedChildName ); if( !entry ) { throw Exception( boost::str( boost::format( "Unable to find mapping for output path" ) ) ); } *source = inPlugs()->getChild<ScenePlug>( entry->member<IntData>( "i" )->readable() ); ScenePath result; result.reserve( outputPath.size() - 1 ); result.push_back( entry->member<InternedStringData>( "n" )->readable() ); result.insert( result.end(), outputPath.begin() + 2, outputPath.end() ); return result; }
void Isolate::hashChildNames( const ScenePath &path, const Gaffer::Context *context, const ScenePlug *parent, IECore::MurmurHash &h ) const { const SetsToKeep setsToKeep( this ); FilterPlug::SceneScope sceneScope( context, inPlug() ); if( mayPruneChildren( path, filterPlug()->getValue(), setsToKeep ) ) { // we might be computing new childnames for this level. FilteredSceneProcessor::hashChildNames( path, context, parent, h ); const IECore::MurmurHash inputChildNamesHash = inPlug()->childNamesPlug()->hash(); h.append( inputChildNamesHash ); ConstInternedStringVectorDataPtr inputChildNamesData = inPlug()->childNamesPlug()->getValue( &inputChildNamesHash ); const vector<InternedString> &inputChildNames = inputChildNamesData->readable(); ScenePath childPath = path; childPath.push_back( InternedString() ); // for the child name for( vector<InternedString>::const_iterator it = inputChildNames.begin(), eIt = inputChildNames.end(); it != eIt; ++it ) { childPath[path.size()] = *it; const unsigned m = setsToKeep.match( childPath ); if( m == Filter::NoMatch ) { sceneScope.set( ScenePlug::scenePathContextName, childPath ); filterPlug()->hash( h ); } else { h.append( 0 ); } } } else { // pass through h = inPlug()->childNamesPlug()->hash(); } }
IECore::ConstInternedStringVectorDataPtr Prune::computeChildNames( const ScenePath &path, const Gaffer::Context *context, const ScenePlug *parent ) const { FilterPlug::SceneScope sceneScope( context, inPlug() ); const Filter::Result m = (Filter::Result)filterPlug()->getValue(); if( m & Filter::ExactMatch ) { return inPlug()->childNamesPlug()->defaultValue(); } else if( m & Filter::DescendantMatch ) { // we may need to delete one or more of our children ConstInternedStringVectorDataPtr inputChildNamesData = inPlug()->childNamesPlug()->getValue(); const vector<InternedString> &inputChildNames = inputChildNamesData->readable(); InternedStringVectorDataPtr outputChildNamesData = new InternedStringVectorData; vector<InternedString> &outputChildNames = outputChildNamesData->writable(); ScenePath childPath = path; childPath.push_back( InternedString() ); // for the child name for( vector<InternedString>::const_iterator it = inputChildNames.begin(), eIt = inputChildNames.end(); it != eIt; ++it ) { childPath[path.size()] = *it; sceneScope.set( ScenePlug::scenePathContextName, childPath ); if( !(filterPlug()->getValue() & Filter::ExactMatch) ) { outputChildNames.push_back( *it ); } } return outputChildNamesData; } else { // pass through return inPlug()->childNamesPlug()->getValue(); } }