Skip to content

create_unreal_staticmesh

Creator for Unreal Static Meshes.

CreateUnrealStaticMesh

Bases: MayaCreator

Unreal Static Meshes with collisions.

Source code in client/ayon_maya/plugins/create/create_unreal_staticmesh.py
 7
 8
 9
10
11
12
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
class CreateUnrealStaticMesh(plugin.MayaCreator):
    """Unreal Static Meshes with collisions."""

    identifier = "io.openpype.creators.maya.unrealstaticmesh"
    label = "Unreal - Static Mesh"
    product_type = "staticMesh"
    icon = "cube"

    # Defined in settings
    collision_prefixes = []

    def get_dynamic_data(
        self,
        project_name,
        folder_entity,
        task_entity,
        variant,
        host_name,
        instance
    ):
        """
        The default product name templates for Unreal include {asset} and thus
        we should pass that along as dynamic data.
        """
        dynamic_data = super(CreateUnrealStaticMesh, self).get_dynamic_data(
            project_name,
            folder_entity,
            task_entity,
            variant,
            host_name,
            instance
        )
        dynamic_data["asset"] = folder_entity["name"]
        return dynamic_data

    def create(self, product_name, instance_data, pre_create_data):

        with lib.undo_chunk():
            instance = super(CreateUnrealStaticMesh, self).create(
                product_name, instance_data, pre_create_data)
            instance_node = instance.get("instance_node")

            # We reorganize the geometry that was originally added into the
            # set into either 'collision_SET' or 'geometry_SET' based on the
            # collision_prefixes from project settings
            members = cmds.sets(instance_node, query=True)
            cmds.sets(clear=instance_node)

            geometry_set = cmds.sets(name="geometry_SET", empty=True)
            collisions_set = cmds.sets(name="collisions_SET", empty=True)

            cmds.sets([geometry_set, collisions_set],
                      forceElement=instance_node)

            members = cmds.ls(members, long=True) or []
            children = cmds.listRelatives(members, allDescendents=True,
                                          fullPath=True) or []
            transforms = cmds.ls(members + children, type="transform")
            for transform in transforms:

                if not cmds.listRelatives(transform,
                                          type="shape",
                                          noIntermediate=True):
                    # Exclude all transforms that have no direct shapes
                    continue

                if self.has_collision_prefix(transform):
                    cmds.sets(transform, forceElement=collisions_set)
                else:
                    cmds.sets(transform, forceElement=geometry_set)

    def has_collision_prefix(self, node_path):
        """Return whether node name of path matches collision prefix.

        If the node name matches the collision prefix we add it to the
        `collisions_SET` instead of the `geometry_SET`.

        Args:
            node_path (str): Maya node path.

        Returns:
            bool: Whether the node should be considered a collision mesh.

        """
        node_name = node_path.rsplit("|", 1)[-1]
        for prefix in self.collision_prefixes:
            if node_name.startswith(prefix):
                return True
        return False

get_dynamic_data(project_name, folder_entity, task_entity, variant, host_name, instance)

The default product name templates for Unreal include {asset} and thus we should pass that along as dynamic data.

Source code in client/ayon_maya/plugins/create/create_unreal_staticmesh.py
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
def get_dynamic_data(
    self,
    project_name,
    folder_entity,
    task_entity,
    variant,
    host_name,
    instance
):
    """
    The default product name templates for Unreal include {asset} and thus
    we should pass that along as dynamic data.
    """
    dynamic_data = super(CreateUnrealStaticMesh, self).get_dynamic_data(
        project_name,
        folder_entity,
        task_entity,
        variant,
        host_name,
        instance
    )
    dynamic_data["asset"] = folder_entity["name"]
    return dynamic_data

has_collision_prefix(node_path)

Return whether node name of path matches collision prefix.

If the node name matches the collision prefix we add it to the collisions_SET instead of the geometry_SET.

Parameters:

Name Type Description Default
node_path str

Maya node path.

required

Returns:

Name Type Description
bool

Whether the node should be considered a collision mesh.

Source code in client/ayon_maya/plugins/create/create_unreal_staticmesh.py
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
def has_collision_prefix(self, node_path):
    """Return whether node name of path matches collision prefix.

    If the node name matches the collision prefix we add it to the
    `collisions_SET` instead of the `geometry_SET`.

    Args:
        node_path (str): Maya node path.

    Returns:
        bool: Whether the node should be considered a collision mesh.

    """
    node_name = node_path.rsplit("|", 1)[-1]
    for prefix in self.collision_prefixes:
        if node_name.startswith(prefix):
            return True
    return False