def testExportStrokeNode(self):
        """
        Tests that a Maya stroke node created using Paint Effects exports
        correctly as a UsdGeomBasisCurves schema prim.
        """
        strokePrim = self._stage.GetPrimAtPath('/%s/Geom/StrokeCrystals' %
                                               self._testName)
        basisCurves = UsdGeom.BasisCurves(strokePrim)
        self.assertTrue(basisCurves)

        # As authored in Maya, there are expected to be 503 total curves,
        # composed of 3318 vertices.
        expectedNumCurves = 503
        expectedNumVertices = 3318

        curveVertexCounts = basisCurves.GetCurveVertexCountsAttr().Get()
        self.assertEqual(len(curveVertexCounts), expectedNumCurves)

        points = basisCurves.GetPointsAttr().Get()
        self.assertEqual(len(points), expectedNumVertices)

        widths = basisCurves.GetWidthsAttr().Get()
        self.assertEqual(len(widths), expectedNumVertices)

        displayColors = basisCurves.GetDisplayColorPrimvar().ComputeFlattened()
        self.assertEqual(len(displayColors), expectedNumVertices)

        displayOpacities = basisCurves.GetDisplayOpacityPrimvar(
        ).ComputeFlattened()
        self.assertEqual(len(displayOpacities), expectedNumVertices)
    def test_ComputeCurveCount(self):
        stage = Usd.Stage.Open('basisCurves.usda')
        unset = UsdGeom.BasisCurves.Get(stage, '/UnsetVertexCounts')
        blocked = UsdGeom.BasisCurves.Get(stage, '/BlockedVertexCounts')
        empty = UsdGeom.BasisCurves.Get(stage, '/EmptyVertexCounts')
        timeSampled = UsdGeom.BasisCurves.Get(stage,
                                              '/TimeSampledVertexCounts')
        timeSampledAndDefault = UsdGeom.BasisCurves.Get(
            stage, '/TimeSampledAndDefaultVertexCounts')

        testTimeSamples = [(unset, Usd.TimeCode.EarliestTime(), 0),
                           (blocked, Usd.TimeCode.EarliestTime(), 0),
                           (empty, Usd.TimeCode.EarliestTime(), 0),
                           (timeSampled, Usd.TimeCode.EarliestTime(), 3),
                           (timeSampledAndDefault, Usd.TimeCode.EarliestTime(),
                            5)]
        testDefaults = [(unset, 0), (blocked, 0), (empty, 0), (timeSampled, 0),
                        (timeSampledAndDefault, 4)]

        for (schema, timeCode, expected) in testTimeSamples:
            self.assertTrue(schema)
            self.assertEqual(schema.GetCurveCount(timeCode), expected)
        for (schema, expected) in testDefaults:
            self.assertTrue(schema)
            self.assertEqual(schema.GetCurveCount(), expected)

        invalid = UsdGeom.BasisCurves(Usd.Prim())
        self.assertFalse(invalid)
        with self.assertRaises(RuntimeError):
            self.assertEqual(invalid.ComputeCurveCount(), 0)
        with self.assertRaises(RuntimeError):
            self.assertEqual(
                invalid.ComputeCurveCount(Usd.TimeCode.EarliestTime()), 0)
Exemple #3
0
    def test_RoundTripCubic(self):
        time = Usd.TimeCode.EarliestTime()
        prim = self.stage.GetPrimAtPath('/Cubic/Ribbons/VertexWidth')
        schema = UsdGeom.BasisCurves(prim)

        # These attributes are uniformly time sampled
        curveType = schema.GetTypeAttr().Get()
        basis = schema.GetBasisAttr().Get()
        wrap = schema.GetWrapAttr().Get()

        self.assertEqual(curveType, UsdGeom.Tokens.cubic)
        self.assertEqual(basis, UsdGeom.Tokens.bezier)
        self.assertEqual(wrap, UsdGeom.Tokens.nonperiodic)

        # Interpolation metadata
        normalsInterpolation = schema.GetNormalsInterpolation()
        widthsInterpolation = schema.GetWidthsInterpolation()
        self.assertEqual(normalsInterpolation, UsdGeom.Tokens.varying)
        self.assertEqual(widthsInterpolation, UsdGeom.Tokens.vertex)

        # These attributes may be varying time sampled
        curveVertexCounts = schema.GetCurveVertexCountsAttr().Get(time)
        points = schema.GetPointsAttr().Get(time)
        widths = schema.GetWidthsAttr().Get(time)
        normals = schema.GetNormalsAttr().Get(time)

        self._assertElementsAlmostEqual(points, [(0, 0, 0), (1, 1, 0),
                                                 (1, 2, 0), (0, 3, 0),
                                                 (-1, 4, 0), (-1, 5, 0),
                                                 (0, 6, 0)])
        self._assertElementsAlmostEqual(widths, [0, .5, .5, .8, .5, .5, 0])
        self._assertElementsAlmostEqual(normals, [(1, 0, 0), (.98, 0, .44),
                                                  (.707, 0, .707)])
        self.assertEqual(list(curveVertexCounts), [7])
Exemple #4
0
def emit_pointcloud(app,
                    options,
                    pointloud_name,
                    usd_tfm,
                    visibility,
                    usd_prim,
                    is_strands,
                    xsi_parent,
                    is_simple=False):
    '''if is_simple is True, then we should ignore in-object ransform
    '''
    if DEBUG_MODE:
        imp.reload(materials)
        imp.reload(utils)

    usd_object = UsdGeom.BasisCurves(
        usd_prim) if is_strands else UsdGeom.Points(usd_prim)
    xsi_points = app.GetPrim("PointCloud", pointloud_name, xsi_parent)

    if options.get("is_materials", False):
        usd_material = UsdShade.MaterialBindingAPI(
            usd_prim).GetDirectBinding().GetMaterial()
        xsi_material = materials.import_material(
            app, usd_material, library_name=options["file_name"])
        if xsi_material is not None:
            app.AssignMaterial(xsi_material.FullName + "," +
                               xsi_points.FullName)

    utils.set_xsi_transform(app,
                            xsi_points,
                            usd_tfm,
                            up_key=options["up_axis"])
    utils.set_xsi_visibility(xsi_points, visibility)
    if "project_path" in options:
        is_constant = write_ice_cache(usd_object, is_strands, xsi_points,
                                      options["project_path"],
                                      options["file_name"], options["up_axis"],
                                      is_simple)
        # build ice-tree with caching node
        build_ice_tree(app, xsi_points, is_constant, options["file_name"])

    return xsi_points