SceneInterfacePtr LiveScene::retrieveScene( const Path &path, MissingBehaviour missingBehaviour ) const { Path rootPath, emptyPath; rootPath.resize( m_rootIndex ); std::copy( m_path.begin(), m_path.begin() + m_rootIndex, rootPath.begin() ); LiveScenePtr rootScene = new LiveScene(); rootScene->setDefaultTime( m_defaultTime ); for ( Path::const_iterator it = rootPath.begin(); it != rootPath.end(); ++it ) { rootScene = IECore::runTimeCast<LiveScene>( rootScene->child( *it ) ); if ( !rootScene ) { return 0; } } UT_String rootNodePath; OP_Node *node = rootScene->retrieveNode(); if ( !node ) { return 0; } node->getFullPath( rootNodePath ); /// \todo: is this really what we want? can we just pass rootIndex and contentIndex instead? SceneInterfacePtr scene = new LiveScene( rootNodePath, emptyPath, rootPath, m_defaultTime, m_splitter.get() ); for ( Path::const_iterator it = path.begin(); it != path.end(); ++it ) { scene = scene->child( *it, missingBehaviour ); if ( !scene ) { return 0; } } return scene; }
SceneInterfacePtr LinkedScene::scene( const Path &path, MissingBehaviour missingBehaviour ) { if ( missingBehaviour == SceneInterface::CreateIfMissing ) { throw Exception( "createIfMissing is not supported!" ); } SceneInterfacePtr s = m_mainScene->scene( SceneInterface::rootPath ); Path::const_iterator pIt; /// first try to get as close as possible using the m_mainScene... for ( pIt = path.begin(); pIt != path.end(); pIt++ ) { SceneInterfacePtr n = s->child( *pIt, SceneInterface::NullIfMissing ); if ( !n ) { break; } s = n; } ConstSceneInterfacePtr l = 0; int linkDepth = 0; bool atLink = false; bool timeRemapped = false; if ( s->hasAttribute( fileNameLinkAttribute ) && s->hasAttribute( rootLinkAttribute ) ) { atLink = true; timeRemapped = s->hasAttribute( timeLinkAttribute ); ConstStringDataPtr fileName = runTimeCast< const StringData >( s->readAttribute( fileNameLinkAttribute, 0 ) ); ConstInternedStringVectorDataPtr root = runTimeCast< const InternedStringVectorData >( s->readAttribute( rootLinkAttribute, 0 ) ); l = expandLink( fileName.get(), root.get(), linkDepth ); if (!l) { atLink = false; timeRemapped = false; } } else if( s->hasAttribute( linkAttribute ) ) { atLink = true; ConstCompoundDataPtr d = runTimeCast< const CompoundData >( s->readAttribute( linkAttribute, 0 ) ); l = expandLink( d->member< const StringData >( g_fileName ), d->member< const InternedStringVectorData >( g_root ), linkDepth ); if ( !l ) { atLink = false; } } if ( pIt != path.end() ) { if ( !atLink ) { if ( missingBehaviour == SceneInterface::NullIfMissing ) { return 0; } throw Exception( "Could not find child '" + pIt->value() + "'" ); } for ( ; pIt != path.end(); pIt++ ) { l = l->child( *pIt, missingBehaviour ); if ( !l ) { return 0; } } atLink = false; } return new LinkedScene( s, l, linkDepth, m_readOnly, atLink, timeRemapped ); }