diff --git a/src/IECoreHoudini/FromHoudiniPolygonsConverter.cpp b/src/IECoreHoudini/FromHoudiniPolygonsConverter.cpp index 39bb946857..e9ec2e559d 100644 --- a/src/IECoreHoudini/FromHoudiniPolygonsConverter.cpp +++ b/src/IECoreHoudini/FromHoudiniPolygonsConverter.cpp @@ -125,7 +125,8 @@ ObjectPtr FromHoudiniPolygonsConverter::doDetailConversion( const GU_Detail *geo if ( attrHandle.isAttributeValid() ) { modifiedOperands = operands->copy(); - modifiedOperands->member( "attributeFilter" )->writable() += " ^ieMeshInterpolation"; + std::string &attributeFilter = modifiedOperands->member( "attributeFilter" )->writable(); + attributeFilter += " ^ieMeshInterpolation"; GA_Range primRange = geo->getPrimitiveRange(); const GA_ROAttributeRef attrRef( attrHandle.getAttribute() ); @@ -137,6 +138,9 @@ ObjectPtr FromHoudiniPolygonsConverter::doDetailConversion( const GU_Detail *geo if ( !strcmp( value, "subdiv" ) ) { interpolation = "catmullClark"; + // subdivision meshes should not have normals. we assume this occurred because the geo contained + // both subdiv and linear meshes, inadvertantly extending the normals attribute to both. + attributeFilter += " ^N"; break; } else if ( !strcmp( value, "poly" ) ) diff --git a/test/IECoreHoudini/FromHoudiniPolygonsConverter.py b/test/IECoreHoudini/FromHoudiniPolygonsConverter.py index c33f026474..bd2108d5b6 100644 --- a/test/IECoreHoudini/FromHoudiniPolygonsConverter.py +++ b/test/IECoreHoudini/FromHoudiniPolygonsConverter.py @@ -788,11 +788,14 @@ def testStandardAttributeConversion( self ) : def testInterpolation( self ) : torus = self.createTorus() - result = IECoreHoudini.FromHoudiniPolygonsConverter( torus ).convert() + normals = torus.createOutputNode( "facet" ) + normals.parm( "postnml" ).set( True ) + result = IECoreHoudini.FromHoudiniPolygonsConverter( normals ).convert() self.assertTrue( "ieMeshInterpolation" not in result.keys() ) self.assertEqual( result.interpolation, "linear" ) + self.assertTrue( "N" in result.keys() ) - attr = torus.createOutputNode( "attribcreate", node_name = "interpolation", exact_type_name=True ) + attr = normals.createOutputNode( "attribcreate", node_name = "interpolation", exact_type_name=True ) attr.parm( "name" ).set( "ieMeshInterpolation" ) attr.parm( "class" ).set( 1 ) # prim attr.parm( "type" ).set( 3 ) # string @@ -800,11 +803,13 @@ def testInterpolation( self ) : result = IECoreHoudini.FromHoudiniPolygonsConverter( attr ).convert() self.assertTrue( "ieMeshInterpolation" not in result.keys() ) self.assertEqual( result.interpolation, "catmullClark" ) + self.assertTrue( "N" not in result.keys() ) attr.parm( "string") .set( "poly" ) result = IECoreHoudini.FromHoudiniPolygonsConverter( attr ).convert() self.assertTrue( "ieMeshInterpolation" not in result.keys() ) self.assertEqual( result.interpolation, "linear" ) + self.assertTrue( "N" in result.keys() ) if __name__ == "__main__": unittest.main()