bool GeoAttributeCopier::createHandles(const attrib_copy& copy, GEO_AttributeHandle& hSrc, GEO_AttributeHandle& hDest) { // find source attrib hSrc = copy.m_srcGeo->getAttribute(copy.m_srcDict, copy.m_srcName.c_str()); if(!hSrc.isAttributeValid()) return false; const char* destName_ = copy.m_destName.c_str(); const GB_Attribute* srcAttrib = hSrc.getAttribute(); assert(srcAttrib); // create attrib if it doesn't exist, or does but data type doesn't match bool createAttrib = true; GEO_AttributeHandle hExist = m_destGeo.getAttribute(copy.m_destDict, destName_); if(hExist.isAttributeValid()) { const GB_Attribute* destAttrib = hExist.getAttribute(); assert(destAttrib); createAttrib = (destAttrib->getType() != srcAttrib->getType()); } if(createAttrib) { GB_AttributeRef aref = m_destGeo.addAttribute(destName_, srcAttrib->getSize(), srcAttrib->getType(), srcAttrib->getDefault(), copy.m_destDict); if(!aref.isValid()) return false; } hDest = m_destGeo.getAttribute(copy.m_destDict, destName_); hDest.setSourceMap(hSrc); return true; }
FromHoudiniGeometryConverter::Convertability FromHoudiniPolygonsConverter::canConvert( const GU_Detail *geo ) { const GA_PrimitiveList &primitives = geo->getPrimitiveList(); for ( GA_Iterator it=geo->getPrimitiveRange().begin(); !it.atEnd(); ++it ) { const GA_Primitive *prim = primitives.get( it.getOffset() ); if ( prim->getTypeId() != GEO_PRIMPOLY ) { return Inapplicable; } } // is there a single named shape? const GEO_AttributeHandle attrHandle = geo->getPrimAttribute( "name" ); if ( attrHandle.isAttributeValid() ) { const GA_ROAttributeRef attrRef( attrHandle.getAttribute() ); if ( geo->getUniqueValueCount( attrRef ) < 2 ) { return Ideal; } } return Suitable; }
void detail::getStringTableMapping(GEO_AttributeHandle &srcAttrH, GEO_AttributeHandle &destAttrH, detail::stringTableMapping& o_stm) { o_stm.clear(); const GB_Attribute* srcAttr = srcAttrH.getAttribute(); GB_Attribute* destAttr = destAttrH.getAttribute(); if( srcAttr->getType() == GB_ATTRIB_INDEX && destAttr->getType() == GB_ATTRIB_INDEX) { for( int i=0; i<srcAttr->getIndexSize(); ++i) { int destIndex = destAttr->addIndex(srcAttr->getIndex(i)); o_stm.insert(stringTableMapping::value_type(i, destIndex)); } } }
FromHoudiniGeometryConverter::Convertability FromHoudiniCurvesConverter::canConvert( const GU_Detail *geo ) { const GA_PrimitiveList &primitives = geo->getPrimitiveList(); unsigned numPrims = geo->getNumPrimitives(); GA_Iterator firstPrim = geo->getPrimitiveRange().begin(); if ( !numPrims || !compatiblePrimitive( primitives.get( firstPrim.getOffset() )->getTypeId() ) ) { return Inapplicable; } const GEO_Curve *firstCurve = (const GEO_Curve*)primitives.get( firstPrim.getOffset() ); bool periodic = firstCurve->isClosed(); unsigned order = firstCurve->getOrder(); for ( GA_Iterator it=firstPrim; !it.atEnd(); ++it ) { const GA_Primitive *prim = primitives.get( it.getOffset() ); if ( !compatiblePrimitive( prim->getTypeId() ) ) { return Inapplicable; } const GEO_Curve *curve = (const GEO_Curve*)prim; if ( curve->getOrder() != order ) { return Inapplicable; } if ( curve->isClosed() != periodic ) { return Inapplicable; } } // is there a single named shape? const GEO_AttributeHandle attrHandle = geo->getPrimAttribute( "name" ); if ( attrHandle.isAttributeValid() ) { const GA_ROAttributeRef attrRef( attrHandle.getAttribute() ); if ( geo->getUniqueValueCount( attrRef ) < 2 ) { return Ideal; } } return Suitable; }
FromHoudiniGeometryConverter::Convertability FromHoudiniGroupConverter::canConvert( const GU_Detail *geo ) { const GA_PrimitiveList &primitives = geo->getPrimitiveList(); // are there multiple primitives? unsigned numPrims = geo->getNumPrimitives(); if ( numPrims < 2 ) { return Admissible; } // are there mixed primitive types? GA_Iterator firstPrim = geo->getPrimitiveRange().begin(); GA_PrimitiveTypeId firstPrimId = primitives.get( firstPrim.getOffset() )->getTypeId(); for ( GA_Iterator it=firstPrim; !it.atEnd(); ++it ) { if ( primitives.get( it.getOffset() )->getTypeId() != firstPrimId ) { return Ideal; } } // are there multiple named shapes? const GEO_AttributeHandle attrHandle = geo->getPrimAttribute( "name" ); if ( attrHandle.isAttributeValid() ) { const GA_ROAttributeRef attrRef( attrHandle.getAttribute() ); if ( geo->getUniqueValueCount( attrRef ) > 1 ) { return Ideal; } } // are the primitives split into groups? UT_PtrArray<const GA_ElementGroup*> primGroups; geo->getElementGroupList( GA_ATTRIB_PRIMITIVE, primGroups ); if ( primGroups.isEmpty() ) { return Admissible; } bool externalGroups = false; for ( unsigned i=0; i < primGroups.entries(); ++i ) { const GA_ElementGroup *group = primGroups[i]; if ( group->getInternal() ) { continue; } if ( group->entries() == numPrims ) { return Admissible; } externalGroups = true; } if ( externalGroups ) { return Ideal; } return Admissible; }