def _ValidateAllAttributes(self, usdPrim, exportedAttrsDict): """ Validates that USD attributes, primvars, and UsdRi attributes exist, have the correct value, and have the correct type for each attribute prefix in exportedAttrsDict. """ self.assertTrue(usdPrim) gprim = UsdGeom.Gprim(usdPrim) self.assertTrue(gprim) # Do a quick check to see whether we have the right number of attributes # by counting the primvars (which include the Ri attributes, # encoded in USD as primvars). # Getting all primvars will also include the built-in displayColor, # displayOpacity, and st, so we add 3 to the length of the # exportedAttrsDict for that check. primvars = gprim.GetPrimvars() self.assertEqual(len(primvars), len(exportedAttrsDict)*2 + 3) riStatements = UsdRi.StatementsAPI(usdPrim) self.assertTrue(riStatements) riAttrs = riStatements.GetRiAttributes() self.assertEqual(len(riAttrs), len(exportedAttrsDict)) # UsdRi attributes store vector and point array data as just arrays of # three doubles/floats. riAttrMapping = { Sdf.ValueTypeNames.Vector3dArray: Sdf.ValueTypeNames.Double3Array, Sdf.ValueTypeNames.Vector3fArray: Sdf.ValueTypeNames.Float3Array, Sdf.ValueTypeNames.Point3dArray: Sdf.ValueTypeNames.Double3Array, Sdf.ValueTypeNames.Point3fArray: Sdf.ValueTypeNames.Float3Array } for attrPrefix in exportedAttrsDict: # Test regular USD attributes. usdAttr = usdPrim.GetAttribute('userProperties:%sUsdAttr' % attrPrefix) value = exportedAttrsDict[attrPrefix]['value'] self.assertTrue(usdAttr) self.assertEqual(usdAttr.GetTypeName(), exportedAttrsDict[attrPrefix]['typeName']) self.assertTrue(usdAttr.IsCustom()) self._assertAlmostEqualWithFallback(usdAttr.Get(), value) # Test primvars. primvar = gprim.GetPrimvar('%sPrimvar' % attrPrefix) self.assertTrue(primvar) self.assertTrue(UsdGeom.Primvar.IsPrimvar(primvar)) self._assertAlmostEqualWithFallback(primvar.Get(), value) self.assertEqual(primvar.GetTypeName(), exportedAttrsDict[attrPrefix]['typeName']) # Test UsdRi attributes. riAttr = usdPrim.GetAttribute('primvars:ri:attributes:user:%sUsdRiAttr' % attrPrefix) self.assertTrue(riAttr) self.assertTrue(UsdRi.StatementsAPI.IsRiAttribute(riAttr)) self._assertAlmostEqualWithFallback(riAttr.Get(), value) riAttrType = exportedAttrsDict[attrPrefix]['typeName'] riAttrType = riAttrMapping.get(riAttrType, riAttrType) self.assertEqual(riAttr.GetTypeName(), riAttrType)
def test_Basic(self): l = Sdf.Layer.CreateAnonymous() stage = Usd.Stage.Open(l.identifier) world = stage.DefinePrim("/World", "Xform") assert world world.SetMetadata('kind', 'group') assert world.IsModel() assert world.IsGroup() group = stage.DefinePrim("/World/Group", "Xform") assert group group.SetMetadata('kind', 'group') assert group.IsModel() assert group.IsGroup() model = stage.DefinePrim("/World/Group/Model", "Xform") assert model model.SetMetadata('kind', 'component') assert model.IsModel() p = stage.DefinePrim("/World/Group/Model/Mesh", "Scope") assert p print("Test Material") material = UsdShade.Material.Define(stage, "/World/Group/Model/Material") assert material assert material.GetPrim() material.Bind(p) print("Test shader") shader = UsdRi.RslShader.Define(stage, '/World/Group/Model/Shader') assert shader assert shader.GetPrim() assert not UsdRi.StatementsAPI.IsRiAttribute(shader.GetSloPathAttr()) shader.GetSloPathAttr().Set('foo') print("Test RiMaterialAPI") riMaterial = UsdRi.MaterialAPI(material) assert riMaterial assert riMaterial.GetPrim() # Test surface output self._TestOutput(riMaterial, UsdRi.MaterialAPI.GetSurfaceOutput, UsdRi.MaterialAPI.SetSurfaceSource, UsdRi.MaterialAPI.GetSurface, shader.GetPath()) # Test displacement output self._TestOutput(riMaterial, UsdRi.MaterialAPI.GetDisplacementOutput, UsdRi.MaterialAPI.SetDisplacementSource, UsdRi.MaterialAPI.GetDisplacement, shader.GetPath()) # Test volume output self._TestOutput(riMaterial, UsdRi.MaterialAPI.GetVolumeOutput, UsdRi.MaterialAPI.SetVolumeSource, UsdRi.MaterialAPI.GetVolume, shader.GetPath()) print("Test pattern") pattern = UsdRi.RisPattern.Define(stage, '/World/Group/Model/Pattern') assert pattern assert pattern.GetPrim() pattern.GetFilePathAttr().Set('foo') self.assertEqual(pattern.GetFilePathAttr().Get(), 'foo') pattern.GetArgsPathAttr().Set('argspath') self.assertEqual(pattern.GetArgsPathAttr().Get(), 'argspath') print("Test oslPattern") oslPattern = UsdRi.RisOslPattern.Define( stage, '/World/Group/Model/OslPattern') assert oslPattern assert oslPattern.GetPrim() self.assertEqual(oslPattern.GetFilePathAttr().Get(), 'PxrOSL') print("Test bxdf") bxdf = UsdRi.RisBxdf.Define(stage, '/World/Group/Model/Bxdf') assert bxdf assert bxdf.GetPrim() bxdf.GetFilePathAttr().Set('foo') bxdf.GetArgsPathAttr().Set('argspath') print("Test RIS Material") risMaterial = UsdRi.MaterialAPI(material.GetPrim()) assert risMaterial assert risMaterial.GetPrim() assert not risMaterial.GetBxdf() # Test the bxdf output self._TestOutput(risMaterial, UsdRi.MaterialAPI.GetBxdfOutput, UsdRi.MaterialAPI.SetBxdfSource, UsdRi.MaterialAPI.GetBxdf, bxdf.GetPath()) print("Test riStatements") riStatements = UsdRi.StatementsAPI(shader.GetPrim()) assert riStatements assert riStatements.GetPrim() attr = riStatements.CreateRiAttribute("ModelName", "string").\ Set('someModelName') assert attr props = riStatements.GetRiAttributes() assert props # this is so convoluted attr = riStatements.GetPrim().GetAttribute(props[0].GetName()) assert attr self.assertEqual(attr.GetName(), 'ri:attributes:user:ModelName') self.assertEqual(attr.Get(), 'someModelName') self.assertEqual(UsdRi.StatementsAPI.GetRiAttributeName(attr), 'ModelName') self.assertEqual(UsdRi.StatementsAPI.GetRiAttributeNameSpace(attr), 'user') assert UsdRi.StatementsAPI.IsRiAttribute(attr) self.assertEqual( UsdRi.StatementsAPI.MakeRiAttributePropertyName('myattr'), 'ri:attributes:user:myattr') self.assertEqual( UsdRi.StatementsAPI.MakeRiAttributePropertyName('dice:myattr'), 'ri:attributes:dice:myattr') self.assertEqual( UsdRi.StatementsAPI.MakeRiAttributePropertyName('dice.myattr'), 'ri:attributes:dice:myattr') self.assertEqual( UsdRi.StatementsAPI.MakeRiAttributePropertyName('dice_myattr'), 'ri:attributes:dice:myattr') # period is stronger separator than underscore, when both are present self.assertEqual( UsdRi.StatementsAPI.MakeRiAttributePropertyName('dice_my.attr'), 'ri:attributes:dice_my:attr') # multiple tokens concatted with underscores self.assertEqual( UsdRi.StatementsAPI.MakeRiAttributePropertyName( 'dice:my1:long:attr'), 'ri:attributes:dice:my1_long_attr') self.assertEqual( UsdRi.StatementsAPI.MakeRiAttributePropertyName( 'dice.my2.long.attr'), 'ri:attributes:dice:my2_long_attr') self.assertEqual( UsdRi.StatementsAPI.MakeRiAttributePropertyName( 'dice_my3_long_attr'), 'ri:attributes:dice:my3_long_attr') self.assertEqual(riStatements.GetCoordinateSystem(), '') self.assertEqual( UsdRi.StatementsAPI(model).GetModelCoordinateSystems(), []) self.assertEqual( UsdRi.StatementsAPI(model).GetModelScopedCoordinateSystems(), []) riStatements.SetCoordinateSystem('LEyeSpace') self.assertEqual(riStatements.GetCoordinateSystem(), 'LEyeSpace') self.assertEqual( UsdRi.StatementsAPI(model).GetModelCoordinateSystems(), [Sdf.Path('/World/Group/Model/Shader')]) riStatements.SetScopedCoordinateSystem('ScopedLEyeSpace') self.assertEqual(riStatements.GetScopedCoordinateSystem(), 'ScopedLEyeSpace') self.assertEqual( UsdRi.StatementsAPI(model).GetModelScopedCoordinateSystems(), [Sdf.Path('/World/Group/Model/Shader')]) self.assertEqual( UsdRi.StatementsAPI(group).GetModelCoordinateSystems(), []) self.assertEqual( UsdRi.StatementsAPI(group).GetModelScopedCoordinateSystems(), []) self.assertEqual( UsdRi.StatementsAPI(world).GetModelCoordinateSystems(), []) self.assertEqual( UsdRi.StatementsAPI(world).GetModelScopedCoordinateSystems(), []) self.assertFalse(riStatements.GetFocusRegionAttr().IsValid()) assert (riStatements.CreateFocusRegionAttr() is not None) assert (riStatements.GetFocusRegionAttr() is not None) self.assertTrue(riStatements.GetFocusRegionAttr().IsValid()) self.assertEqual(riStatements.GetFocusRegionAttr().Get(), None) riStatements.CreateFocusRegionAttr(9.0, True) self.assertEqual(riStatements.GetFocusRegionAttr().Get(), 9.0)
def test_Basic(self): l = Sdf.Layer.CreateAnonymous() stage = Usd.Stage.Open(l.identifier) world = stage.DefinePrim("/World", "Xform") assert world world.SetMetadata('kind', 'group') assert world.IsModel() assert world.IsGroup() group = stage.DefinePrim("/World/Group", "Xform") assert group group.SetMetadata('kind', 'group') assert group.IsModel() assert group.IsGroup() model = stage.DefinePrim("/World/Group/Model", "Xform") assert model model.SetMetadata('kind', 'component') assert model.IsModel() p = stage.DefinePrim("/World/Group/Model/Mesh", "Scope") assert p print("Test Material") material = UsdShade.Material.Define(stage, "/World/Group/Model/Material") assert material assert material.GetPrim() UsdShade.MaterialBindingAPI(p).Bind(material) print("Test shader") shader = UsdRi.RslShader.Define(stage, '/World/Group/Model/Shader') assert shader assert shader.GetPrim() assert not UsdRi.StatementsAPI.IsRiAttribute(shader.GetSloPathAttr()) shader.GetSloPathAttr().Set('foo') print("Test RiMaterialAPI") riMaterial = UsdRi.MaterialAPI.Apply(material.GetPrim()) assert riMaterial assert riMaterial.GetPrim() # Test surface output self._TestOutput(riMaterial, UsdRi.MaterialAPI.GetSurfaceOutput, UsdRi.MaterialAPI.SetSurfaceSource, UsdRi.MaterialAPI.GetSurface, shader.GetPath()) # Test displacement output self._TestOutput(riMaterial, UsdRi.MaterialAPI.GetDisplacementOutput, UsdRi.MaterialAPI.SetDisplacementSource, UsdRi.MaterialAPI.GetDisplacement, shader.GetPath()) # Test volume output self._TestOutput(riMaterial, UsdRi.MaterialAPI.GetVolumeOutput, UsdRi.MaterialAPI.SetVolumeSource, UsdRi.MaterialAPI.GetVolume, shader.GetPath()) print("Test pattern") pattern = UsdRi.RisPattern.Define(stage, '/World/Group/Model/Pattern') assert pattern assert pattern.GetPrim() pattern.GetFilePathAttr().Set('foo') self.assertEqual(pattern.GetFilePathAttr().Get(), 'foo') pattern.GetArgsPathAttr().Set('argspath') self.assertEqual(pattern.GetArgsPathAttr().Get(), 'argspath') print("Test oslPattern") oslPattern = UsdRi.RisOslPattern.Define( stage, '/World/Group/Model/OslPattern') assert oslPattern assert oslPattern.GetPrim() self.assertEqual(oslPattern.GetFilePathAttr().Get(), 'PxrOSL') print("Test bxdf") bxdf = UsdRi.RisBxdf.Define(stage, '/World/Group/Model/Bxdf') assert bxdf assert bxdf.GetPrim() bxdf.GetFilePathAttr().Set('foo') bxdf.GetArgsPathAttr().Set('argspath') print("Test RIS Material") risMaterial = UsdRi.MaterialAPI(material.GetPrim()) assert risMaterial assert risMaterial.GetPrim() print("Test riStatements") riStatements = UsdRi.StatementsAPI.Apply(shader.GetPrim()) assert riStatements assert riStatements.GetPrim() attr = riStatements.CreateRiAttribute("ModelName", "string").\ Set('someModelName') assert attr props = riStatements.GetRiAttributes() assert props # this is so convoluted attr = riStatements.GetPrim().GetAttribute(props[0].GetName()) assert attr prefix = ('primvars:' if Tf.GetEnvSetting('USDRI_STATEMENTS_WRITE_NEW_ATTR_ENCODING') else '') self.assertEqual(attr.GetName(), prefix + 'ri:attributes:user:ModelName') self.assertEqual(attr.Get(), 'someModelName') self.assertEqual(UsdRi.StatementsAPI.GetRiAttributeName(attr), 'ModelName') self.assertEqual(UsdRi.StatementsAPI.GetRiAttributeNameSpace(attr), 'user') assert UsdRi.StatementsAPI.IsRiAttribute(attr) self.assertEqual( UsdRi.StatementsAPI.MakeRiAttributePropertyName('myattr'), prefix + 'ri:attributes:user:myattr') self.assertEqual( UsdRi.StatementsAPI.MakeRiAttributePropertyName('dice:myattr'), prefix + 'ri:attributes:dice:myattr') self.assertEqual( UsdRi.StatementsAPI.MakeRiAttributePropertyName('dice.myattr'), prefix + 'ri:attributes:dice:myattr') self.assertEqual( UsdRi.StatementsAPI.MakeRiAttributePropertyName('dice_myattr'), prefix + 'ri:attributes:dice:myattr') # period is stronger separator than underscore, when both are present self.assertEqual( UsdRi.StatementsAPI.MakeRiAttributePropertyName('dice_my.attr'), prefix + 'ri:attributes:dice_my:attr') # multiple tokens concatted with underscores self.assertEqual( UsdRi.StatementsAPI.MakeRiAttributePropertyName( 'dice:my1:long:attr'), prefix + 'ri:attributes:dice:my1_long_attr') self.assertEqual( UsdRi.StatementsAPI.MakeRiAttributePropertyName( 'dice.my2.long.attr'), prefix + 'ri:attributes:dice:my2_long_attr') self.assertEqual( UsdRi.StatementsAPI.MakeRiAttributePropertyName( 'dice_my3_long_attr'), prefix + 'ri:attributes:dice:my3_long_attr') self.assertEqual(riStatements.GetCoordinateSystem(), '') self.assertEqual( UsdRi.StatementsAPI(model).GetModelCoordinateSystems(), []) self.assertEqual( UsdRi.StatementsAPI(model).GetModelScopedCoordinateSystems(), []) riStatements.SetCoordinateSystem('LEyeSpace') self.assertEqual(riStatements.GetCoordinateSystem(), 'LEyeSpace') self.assertEqual( UsdRi.StatementsAPI(model).GetModelCoordinateSystems(), [Sdf.Path('/World/Group/Model/Shader')]) riStatements.SetScopedCoordinateSystem('ScopedLEyeSpace') self.assertEqual(riStatements.GetScopedCoordinateSystem(), 'ScopedLEyeSpace') self.assertEqual( UsdRi.StatementsAPI(model).GetModelScopedCoordinateSystems(), [Sdf.Path('/World/Group/Model/Shader')]) self.assertEqual( UsdRi.StatementsAPI(group).GetModelCoordinateSystems(), []) self.assertEqual( UsdRi.StatementsAPI(group).GetModelScopedCoordinateSystems(), []) self.assertEqual( UsdRi.StatementsAPI(world).GetModelCoordinateSystems(), []) self.assertEqual( UsdRi.StatementsAPI(world).GetModelScopedCoordinateSystems(), []) # Test mixed old & new style encodings if (Tf.GetEnvSetting('USDRI_STATEMENTS_WRITE_NEW_ATTR_ENCODING') and Tf.GetEnvSetting('USDRI_STATEMENTS_READ_OLD_ATTR_ENCODING')): prim = stage.DefinePrim("/prim") riStatements = UsdRi.StatementsAPI.Apply(prim) self.assertEqual(len(riStatements.GetRiAttributes()), 0) # Add new-style newStyleAttr = riStatements.CreateRiAttribute('newStyle', 'string') newStyleAttr.Set('new') self.assertEqual(len(riStatements.GetRiAttributes()), 1) # Add old-style (note that we can't use UsdRi API for this, # since it doesn't let the caller choose the encoding) oldStyleAttr = prim.CreateAttribute('ri:attributes:user:oldStyle', Sdf.ValueTypeNames.String) oldStyleAttr.Set('old') self.assertEqual(len(riStatements.GetRiAttributes()), 2) # Exercise the case of an Ri attribute encoded in both # old and new styles. ignoredAttr = prim.CreateAttribute('ri:attributes:user:newStyle', Sdf.ValueTypeNames.String) self.assertEqual(len(riStatements.GetRiAttributes()), 2) self.assertFalse(ignoredAttr in riStatements.GetRiAttributes())
def testExportAttributeTypes(self): """ Tests that attributes tagged to be exported as different attribute types (Usd attributes, primvars, UsdRi attributes) are exported correctly. """ stage = self._GetExportedStage() prim = stage.GetPrimAtPath('/UserTaggedAttributesTest/Geom/CubeTypedAttrs') self.assertTrue(prim) # Validate Usd attributes. attrName = 'userProperties:myIntArrayAttr' attr = prim.GetAttribute(attrName) self.assertTrue(attr) expectedValue = Vt.IntArray([99, 98, 97, 96, 95, 94, 93, 92, 91, 90]) self.assertEqual(attr.Get(), expectedValue) self.assertEqual(attr.GetTypeName(), Sdf.ValueTypeNames.IntArray) self.assertTrue(attr.IsCustom()) # Validate UsdRi attributes. expectedRiAttrs = { 'primvars:ri:attributes:user:myIntRiAttr': {'value': 42, 'typeName': Sdf.ValueTypeNames.Int}, 'primvars:ri:attributes:user:myNamespace:myAttr': {'value': 'UsdRi string', 'typeName': Sdf.ValueTypeNames.String}, 'primvars:ri:attributes:user:myStringArrayRiAttr': {'value': Vt.StringArray(['the', 'quick', 'brown', 'fox']), 'typeName': Sdf.ValueTypeNames.StringArray}, } expectedRiAttrNames = set(expectedRiAttrs.keys()) riStatements = UsdRi.StatementsAPI(prim) self.assertTrue(riStatements) riAttrs = riStatements.GetRiAttributes() self.assertEqual(len(riAttrs), 3) riAttrNames = {attr.GetName() for attr in riAttrs} self.assertEqual(riAttrNames, expectedRiAttrNames) for riAttrName in expectedRiAttrs: riAttr = prim.GetAttribute(riAttrName) self.assertTrue(riAttr) self.assertTrue(UsdRi.StatementsAPI.IsRiAttribute(riAttr)) self.assertEqual(riAttr.Get(), expectedRiAttrs[riAttrName]['value']) self.assertEqual(riAttr.GetTypeName(), expectedRiAttrs[riAttrName]['typeName']) # Validate primvars. expectedPrimvars = { 'myConstantIntPrimvar': {'value': 123, 'typeName': Sdf.ValueTypeNames.Int, 'interpolation': UsdGeom.Tokens.constant}, 'myFaceVaryingIntPrimvar': {'value': 999, 'typeName': Sdf.ValueTypeNames.Int, 'interpolation': UsdGeom.Tokens.faceVarying}, 'myFloatArrayPrimvar': {'value': Vt.FloatArray([1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8]), 'typeName': Sdf.ValueTypeNames.FloatArray, 'interpolation': UsdGeom.Tokens.vertex}, 'myStringPrimvar': {'value': 'no interp string', 'typeName': Sdf.ValueTypeNames.String, 'interpolation': None}, 'myUniformDoublePrimvar': {'value': 3.140, 'typeName': Sdf.ValueTypeNames.Double, 'interpolation': UsdGeom.Tokens.uniform}, 'myVertexStringPrimvar': {'value': 'a vertex string', 'typeName': Sdf.ValueTypeNames.String, 'interpolation': UsdGeom.Tokens.vertex}, } expectedPrimvarNames = set(expectedPrimvars.keys()) # Getting all primvars will also include the built-in displayColor, # displayOpacity, and the Maya default "map1" UV set. expectedPrimvarNames.update(['displayColor', 'displayOpacity', 'map1']) gprim = UsdGeom.Gprim(prim) self.assertTrue(gprim) primvars = [primvar for primvar in gprim.GetPrimvars() if 'ri:attributes' not in primvar.GetNamespace()] self.assertEqual(len(primvars), 9) primvarNames = {primvar.GetPrimvarName() for primvar in primvars} self.assertEqual(primvarNames, expectedPrimvarNames) for primvarName in expectedPrimvars: primvar = gprim.GetPrimvar(primvarName) self.assertTrue(primvar) self.assertTrue(UsdGeom.Primvar.IsPrimvar(primvar)) self._assertAlmostEqualWithFallback( primvar.Get(), expectedPrimvars[primvarName]['value']) self.assertEqual(primvar.GetTypeName(), expectedPrimvars[primvarName]['typeName']) expectedInterpolation = expectedPrimvars[primvarName]['interpolation'] if expectedInterpolation is None: self.assertFalse(primvar.HasAuthoredInterpolation()) else: self.assertTrue(primvar.HasAuthoredInterpolation()) self.assertEqual(primvar.GetInterpolation(), expectedInterpolation)