diff --git a/Changes b/Changes index a8b6af1948..6b4860b1e6 100644 --- a/Changes +++ b/Changes @@ -1,7 +1,9 @@ 10.5.x.x (relative to 10.5.9.5) ======== - +Improvements +------------ +- USDScene : PointInstancers are now loaded with invisibleIds and inactiveIds as primitive variables. 10.5.9.5 (relative to 10.5.9.4) ======== diff --git a/contrib/IECoreUSD/src/IECoreUSD/PointInstancerAlgo.cpp b/contrib/IECoreUSD/src/IECoreUSD/PointInstancerAlgo.cpp index ea2096e94f..db064e4f13 100644 --- a/contrib/IECoreUSD/src/IECoreUSD/PointInstancerAlgo.cpp +++ b/contrib/IECoreUSD/src/IECoreUSD/PointInstancerAlgo.cpp @@ -86,6 +86,26 @@ IECore::ObjectPtr readPointInstancer( pxr::UsdGeomPointInstancer &pointInstancer Canceller::check( canceller ); PrimitiveAlgo::readPrimitiveVariable( pointInstancer.GetAngularVelocitiesAttr(), time, newPoints.get(), "angularVelocity" ); + if( pointInstancer.GetInvisibleIdsAttr().HasAuthoredValue() ) + { + DataPtr cortexInvisIds = DataAlgo::fromUSD( pointInstancer.GetInvisibleIdsAttr(), time, true ); + if( cortexInvisIds ) + { + newPoints->variables["invisibleIds"] = IECoreScene::PrimitiveVariable( + PrimitiveVariable::Constant, cortexInvisIds + ); + } + } + + pxr::SdfInt64ListOp inactiveIdsListOp; + if( pointInstancer.GetPrim().GetMetadata( pxr::UsdGeomTokens->inactiveIds, &inactiveIdsListOp ) ) + { + newPoints->variables["inactiveIds"] = IECoreScene::PrimitiveVariable( + PrimitiveVariable::Constant, + new IECore::Int64VectorData( inactiveIdsListOp.GetExplicitItems() ) + ); + } + // Prototype paths pxr::SdfPathVector targets; @@ -120,6 +140,7 @@ bool pointInstancerMightBeTimeVarying( pxr::UsdGeomPointInstancer &instancer ) instancer.GetVelocitiesAttr().ValueMightBeTimeVarying() || instancer.GetAccelerationsAttr().ValueMightBeTimeVarying() || instancer.GetAngularVelocitiesAttr().ValueMightBeTimeVarying() || + instancer.GetInvisibleIdsAttr().ValueMightBeTimeVarying() || PrimitiveAlgo::primitiveVariablesMightBeTimeVarying( pxr::UsdGeomPrimvarsAPI( instancer ) ) diff --git a/contrib/IECoreUSD/test/IECoreUSD/USDSceneTest.py b/contrib/IECoreUSD/test/IECoreUSD/USDSceneTest.py index 8f0f53e98a..21dde18f48 100644 --- a/contrib/IECoreUSD/test/IECoreUSD/USDSceneTest.py +++ b/contrib/IECoreUSD/test/IECoreUSD/USDSceneTest.py @@ -3704,10 +3704,10 @@ def testPointInstancerPrimvars( self ) : fileName = os.path.join( self.temporaryDirectory(), "pointInstancePrimvars.usda" ) stage = pxr.Usd.Stage.CreateNew( fileName ) - points = pxr.UsdGeom.PointInstancer.Define( stage, "/points" ) - points.CreatePositionsAttr( [ ( v, v, v ) for v in range( 0, 5 ) ] ) + pointInstancer = pxr.UsdGeom.PointInstancer.Define( stage, "/points" ) + pointInstancer.CreatePositionsAttr( [ ( v, v, v ) for v in range( 0, 5 ) ] ) - primvars = pxr.UsdGeom.PrimvarsAPI( points ) + primvars = pxr.UsdGeom.PrimvarsAPI( pointInstancer ) primvar = primvars.CreatePrimvar( "myColor", pxr.Sdf.ValueTypeNames.Color3fArray, "vertex" ) primvar.Set( [ ( c, c, c ) for c in range( 1, 6 ) ] @@ -3720,6 +3720,8 @@ def testPointInstancerPrimvars( self ) : root = IECoreScene.SceneInterface.create( fileName, IECore.IndexedIO.OpenMode.Read ) points = root.child( "points" ).readObject( 0 ) + self.assertEqual( points.keys(), ['P', 'myColor', 'prototypeRoots'] ) + self.assertIsInstance( points, IECoreScene.PointsPrimitive ) self.assertIn( "myColor", points ) self.assertEqual( @@ -3729,6 +3731,21 @@ def testPointInstancerPrimvars( self ) : self.assertEqual( points["myColor"].interpolation, IECoreScene.PrimitiveVariable.Interpolation.Vertex ) self.assertEqual( points["myColor"].indices, None ) + # Now try deactivating some ids + + pointInstancer.DeactivateIds( [ 0, 2 ] ) + pointInstancer.InvisIds( [ 1, 4 ], 0 ) + + stage.GetRootLayer().Save() + + root = IECoreScene.SceneInterface.create( fileName, IECore.IndexedIO.OpenMode.Read ) + points = root.child( "points" ).readObject( 0 ) + + self.assertEqual( points.keys(), ['P', 'inactiveIds', 'invisibleIds', 'myColor', 'prototypeRoots'] ) + + self.assertEqual( points["inactiveIds"], IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Constant, IECore.Int64VectorData( [ 0, 2 ] ) ) ) + self.assertEqual( points["invisibleIds"], IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Constant, IECore.Int64VectorData( [ 1, 4 ] ) ) ) + def testArnoldArrayInputs( self ) : def assertExpectedArrayInputs( network ) :