Skip to content

validate_skeletalmesh_triangulated

ValidateSkeletalMeshTriangulated

Bases: MayaInstancePlugin

Validates that the geometry has been triangulated.

Source code in client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
class ValidateSkeletalMeshTriangulated(plugin.MayaInstancePlugin):
    """Validates that the geometry has been triangulated."""

    order = ValidateContentsOrder
    families = ["skeletalMesh"]
    label = "Skeletal Mesh Triangulated"
    optional = True
    actions = [
        SelectInvalidAction,
        RepairAction
    ]

    def process(self, instance):
        invalid = self.get_invalid(instance)
        if invalid:
            raise PublishValidationError(
                "The following objects needs to be triangulated: "
                "{}".format(invalid))

    @classmethod
    def get_invalid(cls, instance):
        geo = instance.data.get("geometry")

        invalid = []

        for obj in cmds.listRelatives(
                cmds.ls(geo), allDescendents=True, fullPath=True):
            n_triangles = cmds.polyEvaluate(obj, triangle=True)
            n_faces = cmds.polyEvaluate(obj, face=True)

            if not (isinstance(n_triangles, int) and isinstance(n_faces, int)):
                continue

            # We check if the number of triangles is equal to the number of
            # faces for each transform node.
            # If it is, the object is triangulated.
            if cmds.objectType(obj, i="transform") and n_triangles != n_faces:
                invalid.append(obj)

        return invalid

    @classmethod
    def repair(cls, instance):
        for node in cls.get_invalid(instance):
            cmds.polyTriangulate(node)