104 lines
3.3 KiB
Python
104 lines
3.3 KiB
Python
from typing import List
|
|
|
|
from maya.api.OpenMaya import MDagModifier, MFnMesh, MObject
|
|
|
|
from ..config.mesh import Mesh as MeshConfig
|
|
from ..model.dna import DNA
|
|
from ..model.mesh import Mesh as MeshModel
|
|
from ..util.mesh_blend_shape import MeshBlendShape
|
|
from ..util.mesh_neutral import MeshNeutral
|
|
from ..util.mesh_normals import MeshNormals
|
|
from ..util.mesh_skin import MeshSkin
|
|
|
|
|
|
class MayaMesh:
|
|
"""
|
|
A builder class used for adding joints to the scene
|
|
|
|
Attributes
|
|
----------
|
|
@type config: MeshConfig
|
|
@param config: The mesh configuration options used for creating meshes
|
|
|
|
@type data: MeshModel
|
|
@param data: mesh data used in the mesh creation process
|
|
|
|
@type fn_mesh: om.MFnMesh
|
|
@param fn_mesh: OpenMaya class used for creating the mesh
|
|
|
|
@type mesh_object: om.MObject
|
|
@param mesh_object: the object representing the mesh
|
|
|
|
@type dag_modifier: om.MDagModifier
|
|
@param dag_modifier: OpenMaya class used for naming the mesh
|
|
"""
|
|
|
|
def __init__(self, config: MeshConfig, dna: DNA) -> None:
|
|
self.config = config
|
|
self.data: MeshModel = MeshModel()
|
|
self.fn_mesh: MFnMesh = None
|
|
self.mesh_object: MObject = None
|
|
self.dag_modifier: MDagModifier = None
|
|
self.dna = dna
|
|
|
|
def create_neutral_mesh(self) -> MObject:
|
|
"""
|
|
Creates the neutral mesh using the config provided for this builder class object
|
|
|
|
@rtype: om.MObject
|
|
@returns: the instance of the created mesh object
|
|
"""
|
|
MeshNeutral.prepare_mesh(self.config, self.dna, self.data)
|
|
self.fn_mesh, self.mesh_object = MeshNeutral.create_mesh_object(
|
|
self.config, self.data
|
|
)
|
|
self.dag_modifier = MeshNeutral.rename_mesh(
|
|
self.config, self.dna, self.mesh_object
|
|
)
|
|
MeshNeutral.add_texture_coordinates(
|
|
self.config, self.dna, self.data, self.fn_mesh
|
|
)
|
|
return self.mesh_object
|
|
|
|
def add_blend_shapes(self, add_mesh_name_to_blend_shape_channel_name: bool) -> None:
|
|
"""Adds blend shapes to the mesh"""
|
|
|
|
if self.dna.has_blend_shapes(self.config.mesh_index):
|
|
MeshBlendShape.create_all_derived_meshes(
|
|
self.config,
|
|
self.dna,
|
|
self.data,
|
|
self.fn_mesh,
|
|
self.dag_modifier,
|
|
add_mesh_name_to_blend_shape_channel_name,
|
|
)
|
|
MeshBlendShape.create_blend_shape_node(
|
|
self.dna.get_mesh_name(self.config.mesh_index),
|
|
self.data.derived_mesh_names,
|
|
)
|
|
|
|
def add_skin(self, joint_names: List[str], joint_ids: List[int]) -> None:
|
|
"""
|
|
Adds skin to the mesh
|
|
|
|
@type joint_names: List[str]
|
|
@param joint_names: Joint names needed for adding the skin cluster
|
|
|
|
@type joint_ids: List[int]
|
|
@param joint_ids: Joint indices needed for setting skin weights
|
|
"""
|
|
|
|
mesh_name = self.dna.get_mesh_name(self.config.mesh_index)
|
|
|
|
MeshSkin.add_skin_cluster(
|
|
self.dna, self.config.mesh_index, mesh_name, joint_names
|
|
)
|
|
MeshSkin.set_skin_weights(
|
|
self.dna, self.config.mesh_index, mesh_name, joint_ids
|
|
)
|
|
|
|
def add_normals(self) -> None:
|
|
"""Add normals to the mesh"""
|
|
|
|
MeshNormals.add_normals(self.config, self.dna, self.data, self.fn_mesh)
|