Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Maya: Extractor for Unreal SkeletalMesh #4174

Merged
merged 7 commits into from
Dec 9, 2022
Prev Previous commit
Next Next commit
Implemented validator to check if the mesh is triangulated
  • Loading branch information
simonebarbieri committed Dec 5, 2022
commit 1eba935287fea5a876b56af583eec47d99ad7252
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# -*- coding: utf-8 -*-
import pyblish.api

from openpype.hosts.maya.api.action import (
SelectInvalidAction,
)
from openpype.pipeline.publish import (
RepairAction,
ValidateContentsOrder,
)

from maya import cmds


class ValidateSkeletalMeshTriangulated(pyblish.api.InstancePlugin):
"""Validates that the geometry has been triangulated."""

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

def process(self, instance):
invalid = self.get_invalid(instance)
if invalid:
raise RuntimeError(
"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)