OP_ERROR SOP_CortexConverter::cookMySop( OP_Context &context ) { if( lockInputs( context ) >= UT_ERROR_ABORT ) { return error(); } UT_Interrupt *boss = UTgetInterrupt(); boss->opStart("Building CortexConverter Geometry..."); gdp->clearAndDestroy(); UT_String nameFilterStr; evalString( nameFilterStr, pNameFilter.getToken(), 0, 0 ); UT_StringMMPattern nameFilter; nameFilter.compile( nameFilterStr ); UT_String p( "P" ); UT_String attributeFilter; evalString( attributeFilter, pAttributeFilter.getToken(), 0, 0 ); if ( !p.match( attributeFilter ) ) { attributeFilter += " P"; } const std::string attributeFilterStr = attributeFilter.toStdString(); ResultType type = (ResultType)this->evalInt( pResultType.getToken(), 0, 0 ); bool convertStandardAttributes = evalInt( pConvertStandardAttributes.getToken(), 0, 0 ); DetailSplitterPtr splitter = new DetailSplitter( inputGeoHandle( 0 ) ); std::vector<std::string> names; splitter->values( names ); for ( std::vector<std::string>::const_iterator it = names.begin(); it != names.end(); ++it ) { const std::string &name = *it; // we want match all to also match no-name if ( UT_String( name ).multiMatch( nameFilter ) || ( name == "" && UT_String( "*" ).multiMatch( nameFilter ) ) ) { doConvert( splitter->split( name ), name, type, attributeFilterStr, convertStandardAttributes ); } else { doPassThrough( splitter->split( name ), name ); } } boss->opEnd(); unlockInputs(); return error(); }
ObjectPtr FromHoudiniGroupConverter::doConversion( ConstCompoundObjectPtr operands ) const { GroupPtr result = new Group(); if ( operands->member<const IntData>( "groupingMode" )->readable() == NameAttribute ) { DetailSplitterPtr splitter = new DetailSplitter( handle() ); std::vector<std::string> children; splitter->values( children ); if ( children.empty() ) { doUnnamedConversion( GU_DetailHandleAutoReadLock( handle() ).getGdp(), result, operands ); return result; } for ( std::vector<std::string>::iterator it = children.begin(); it != children.end(); ++it ) { const std::string &name = *it; GU_DetailHandle childHandle = splitter->split( name ); if ( childHandle.isNull() ) { continue; } GU_DetailHandleAutoReadLock readHandle( childHandle ); const GU_Detail *childGeo = readHandle.getGdp(); ObjectPtr child = doDetailConversion( childGeo, operands ); if ( !child ) { // this happens when mismatched primitives share the same name doUnnamedConversion( childGeo, result, operands, name ); } else if ( VisibleRenderablePtr renderable = IECore::runTimeCast<VisibleRenderable>( child ) ) { if ( name != "" ) { renderable->blindData()->member<StringData>( "name", false, true )->writable() = name; } result->addChild( renderable ); } } } else { GU_DetailHandleAutoReadLock readHandle( handle() ); const GU_Detail *geo = readHandle.getGdp(); if ( !geo ) { return 0; } size_t numResultPrims = 0; size_t numOrigPrims = geo->getNumPrimitives(); for ( GA_GroupTable::iterator<GA_ElementGroup> it=geo->primitiveGroups().beginTraverse(); !it.atEnd(); ++it ) { GA_PrimitiveGroup *group = static_cast<GA_PrimitiveGroup*>( it.group() ); if ( group->getInternal() || group->isEmpty() ) { continue; } VisibleRenderablePtr renderable = 0; numResultPrims += doGroupConversion( geo, group, renderable, operands ); if( !renderable ) { continue; } renderable->blindData()->member<StringData>( "name", false, true )->writable() = group->getName().toStdString(); result->addChild( renderable ); } if ( numOrigPrims == numResultPrims ) { return result; } GU_Detail ungroupedGeo( (GU_Detail*)geo ); GA_PrimitiveGroup *ungrouped = static_cast<GA_PrimitiveGroup*>( ungroupedGeo.createInternalElementGroup( GA_ATTRIB_PRIMITIVE, "FromHoudiniGroupConverter__ungroupedPrimitives" ) ); for ( GA_GroupTable::iterator<GA_ElementGroup> it=geo->primitiveGroups().beginTraverse(); !it.atEnd(); ++it ) { *ungrouped |= *static_cast<GA_PrimitiveGroup*>( it.group() ); } ungrouped->toggleRange( ungroupedGeo.getPrimitiveRange() ); if ( ungrouped->isEmpty() ) { return result; } VisibleRenderablePtr renderable = 0; doGroupConversion( &ungroupedGeo, ungrouped, renderable, operands ); if ( renderable ) { result->addChild( renderable ); } } return result; }