void SceneWriter::writeLocation( const GafferScene::ScenePlug *scene, const ScenePlug::ScenePath &scenePath, Context *context, IECore::SceneInterface *output, double time ) const { context->set( ScenePlug::scenePathContextName, scenePath ); ConstCompoundObjectPtr attributes = scene->attributesPlug()->getValue(); for( CompoundObject::ObjectMap::const_iterator it = attributes->members().begin(), eIt = attributes->members().end(); it != eIt; it++ ) { output->writeAttribute( it->first, it->second.get(), time ); } if( scenePath.empty() ) { ConstCompoundObjectPtr globals = scene->globalsPlug()->getValue(); output->writeAttribute( "gaffer:globals", globals.get(), time ); } ConstObjectPtr object = scene->objectPlug()->getValue(); if( object->typeId() != IECore::NullObjectTypeId && scenePath.size() > 0 ) { output->writeObject( object.get(), time ); } Imath::Box3f b = scene->boundPlug()->getValue(); output->writeBound( Imath::Box3d( Imath::V3f( b.min ), Imath::V3f( b.max ) ), time ); if( scenePath.size() ) { Imath::M44f t = scene->transformPlug()->getValue(); Imath::M44d transform( t[0][0], t[0][1], t[0][2], t[0][3], t[1][0], t[1][1], t[1][2], t[1][3], t[2][0], t[2][1], t[2][2], t[2][3], t[3][0], t[3][1], t[3][2], t[3][3] ); output->writeTransform( new IECore::M44dData( transform ), time ); } ConstInternedStringVectorDataPtr childNames = scene->childNamesPlug()->getValue(); ScenePlug::ScenePath childScenePath = scenePath; childScenePath.push_back( InternedString() ); for( vector<InternedString>::const_iterator it=childNames->readable().begin(); it!=childNames->readable().end(); it++ ) { childScenePath[scenePath.size()] = *it; SceneInterfacePtr outputChild = output->child( *it, SceneInterface::CreateIfMissing ); writeLocation( scene, childScenePath, context, outputChild.get(), time ); } }
GafferScene::ConstPathMatcherDataPtr BranchCreator::computeSet( const IECore::InternedString &setName, const Gaffer::Context *context, const ScenePlug *parent ) const { ConstPathMatcherDataPtr inputSetData = inPlug()->set( setName ); ConstCompoundDataPtr mapping = boost::static_pointer_cast<const CompoundData>( mappingPlug()->getValue() ); if( !mapping->readable().size() ) { return inputSetData; } ScenePlug::ScenePath parentPath = mapping->member<InternedStringVectorData>( g_parentKey )->readable(); ConstPathMatcherDataPtr branchSetData = computeBranchSet( parentPath, setName, context ); if( !branchSetData ) { return inputSetData; } const PathMatcher &branchSet = branchSetData->readable(); if( branchSet.isEmpty() ) { return inputSetData; } const CompoundData *forwardMapping = mapping->member<CompoundData>( g_forwardMappingKey ); PathMatcherDataPtr outputSetData = inputSetData->copy(); PathMatcher &outputSet = outputSetData->writable(); vector<InternedString> outputPrefix( parentPath ); for( PathMatcher::RawIterator pIt = branchSet.begin(), peIt = branchSet.end(); pIt != peIt; ++pIt ) { const ScenePlug::ScenePath &branchPath = *pIt; if( !branchPath.size() ) { continue; // Skip root } assert( branchPath.size() == 1 ); const InternedStringData *outputName = forwardMapping->member<InternedStringData>( branchPath[0], /* throwExceptions = */ true ); outputPrefix.resize( parentPath.size() + 1 ); outputPrefix.back() = outputName->readable(); outputSet.addPaths( branchSet.subTree( *pIt ), outputPrefix ); pIt.prune(); // We only want to visit the first level } return outputSetData; }
void ScenePlug::pathToString( const ScenePlug::ScenePath &path, std::string &s ) { if( !path.size() ) { s = "/"; } else { s.clear(); for( ScenePlug::ScenePath::const_iterator it = path.begin(), eIt = path.end(); it != eIt; it++ ) { s += "/" + it->string(); } } }
void InteractiveRender::updateShadersWalk( const ScenePlug::ScenePath &path ) { /// \todo Keep a track of the hashes of the shaders at each path, /// and use it to only update the shaders when they've changed. ConstCompoundObjectPtr attributes = inPlug()->attributes( path ); // terminate recursion for invisible locations ConstBoolDataPtr visibility = attributes->member<BoolData>( SceneInterface::visibilityName ); if( visibility && ( !visibility->readable() ) ) { return; } ConstObjectVectorPtr shader = attributes->member<ObjectVector>( "shader" ); if( shader ) { std::string name; ScenePlug::pathToString( path, name ); CompoundDataMap parameters; parameters["exactscopename"] = new StringData( name ); { EditBlock edit( m_renderer.get(), "attribute", parameters ); for( ObjectVector::MemberContainer::const_iterator it = shader->members().begin(), eIt = shader->members().end(); it != eIt; it++ ) { const StateRenderable *s = runTimeCast<const StateRenderable>( it->get() ); if( s ) { s->render( m_renderer.get() ); } } } } ConstInternedStringVectorDataPtr childNames = inPlug()->childNames( path ); ScenePlug::ScenePath childPath = path; childPath.push_back( InternedString() ); // for the child name for( vector<InternedString>::const_iterator it=childNames->readable().begin(); it!=childNames->readable().end(); it++ ) { childPath[path.size()] = *it; updateShadersWalk( childPath ); } }
bool GafferScene::SceneAlgo::exists( const ScenePlug *scene, const ScenePlug::ScenePath &path ) { ScenePlug::PathScope pathScope( Context::current() ); ScenePlug::ScenePath p; p.reserve( path.size() ); for( ScenePlug::ScenePath::const_iterator it = path.begin(), eIt = path.end(); it != eIt; ++it ) { pathScope.setPath( p ); ConstInternedStringVectorDataPtr childNamesData = scene->childNamesPlug()->getValue(); const vector<InternedString> &childNames = childNamesData->readable(); if( find( childNames.begin(), childNames.end(), *it ) == childNames.end() ) { return false; } p.push_back( *it ); } return true; }
bool GafferScene::exists( const ScenePlug *scene, const ScenePlug::ScenePath &path ) { ContextPtr context = new Context( *Context::current(), Context::Borrowed ); Context::Scope scopedContext( context.get() ); ScenePlug::ScenePath p; p.reserve( path.size() ); for( ScenePlug::ScenePath::const_iterator it = path.begin(), eIt = path.end(); it != eIt; ++it ) { context->set( ScenePlug::scenePathContextName, p ); ConstInternedStringVectorDataPtr childNamesData = scene->childNamesPlug()->getValue(); const vector<InternedString> &childNames = childNamesData->readable(); if( find( childNames.begin(), childNames.end(), *it ) == childNames.end() ) { return false; } p.push_back( *it ); } return true; }
bool GafferScene::SceneAlgo::visible( const ScenePlug *scene, const ScenePlug::ScenePath &path ) { ScenePlug::PathScope pathScope( Context::current() ); ScenePlug::ScenePath p; p.reserve( path.size() ); for( ScenePlug::ScenePath::const_iterator it = path.begin(), eIt = path.end(); it != eIt; ++it ) { p.push_back( *it ); pathScope.setPath( p ); ConstCompoundObjectPtr attributes = scene->attributesPlug()->getValue(); const BoolData *visibilityData = attributes->member<BoolData>( "scene:visible" ); if( visibilityData && !visibilityData->readable() ) { return false; } } return true; }
bool GafferScene::visible( const ScenePlug *scene, const ScenePlug::ScenePath &path ) { ContextPtr context = new Context( *Context::current(), Context::Borrowed ); Context::Scope scopedContext( context.get() ); ScenePlug::ScenePath p; p.reserve( path.size() ); for( ScenePlug::ScenePath::const_iterator it = path.begin(), eIt = path.end(); it != eIt; ++it ) { p.push_back( *it ); context->set( ScenePlug::scenePathContextName, p ); ConstCompoundObjectPtr attributes = scene->attributesPlug()->getValue(); const BoolData *visibilityData = attributes->member<BoolData>( "scene:visible" ); if( visibilityData && !visibilityData->readable() ) { return false; } } return true; }
void SceneView::collapseSelection() { PathMatcher &selection = const_cast<GafferScene::PathMatcherData *>( m_sceneGadget->getSelection() )->writable(); std::vector<string> toCollapse; selection.paths( toCollapse ); if( !toCollapse.size() ) { return; } GafferScene::PathMatcherData *expandedData = expandedPaths(); PathMatcher &expanded = expandedData->writable(); for( vector<string>::const_iterator it = toCollapse.begin(), eIt = toCollapse.end(); it != eIt; ++it ) { /// \todo It would be nice to be able to get ScenePaths out of /// PathMatcher::paths() directly. ScenePlug::ScenePath path; ScenePlug::stringToPath( *it, path ); if( !expanded.removePath( path ) ) { if( path.size() <= 1 ) { continue; } selection.removePath( path ); path.pop_back(); // now the parent path expanded.removePath( path ); selection.addPath( path ); } } // See comment in expandSelection(). getContext()->changedSignal()( getContext(), "ui:scene:expandedPaths" ); // See comment in expandSelection(). transferSelectionToContext(); }
virtual void *operator()( void *item ) { SceneGraph *s = (SceneGraph*)item; ScenePlug::ScenePath path; s->path( path ); std::string name; ScenePlug::pathToString( path, name ); try { if( !m_editMode ) { // outputting scene for the first time - do some attribute block tracking: if( path.size() ) { for( int i = m_previousPath.size(); i >= (int)path.size(); --i ) { --m_attrBlockCounter; m_renderer->attributeEnd(); } } m_previousPath = path; ++m_attrBlockCounter; m_renderer->attributeBegin(); // set the name for this location: m_renderer->setAttribute( "name", new StringData( name ) ); } // transform: if( !m_editMode ) { m_renderer->concatTransform( s->m_transform ); } // attributes: if( s->m_attributes ) { if( m_editMode ) { CompoundDataMap parameters; parameters["exactscopename"] = new StringData( name ); m_renderer->editBegin( "attribute", parameters ); } outputAttributes( s->m_attributes.get(), m_renderer ); s->m_attributes = NULL; if( m_editMode ) { m_renderer->editEnd(); } } // object: if( s->m_object && !m_editMode ) { if( const VisibleRenderable *renderable = runTimeCast< const VisibleRenderable >( s->m_object.get() ) ) { renderable->render( m_renderer ); } s->m_object = 0; } } catch( const std::exception &e ) { IECore::msg( IECore::Msg::Error, "InteractiveRender::update", name + ": " + e.what() ); } return NULL; }