Skip to content

Commit

Permalink
Merge pull request #64 from ynput/bugfix/json_layout_for_fbx_export
Browse files Browse the repository at this point in the history
add alembic options for extract layout
  • Loading branch information
moonyuet committed Aug 12, 2024
2 parents a0d1933 + 98b9460 commit 97e3dc0
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 35 deletions.
8 changes: 6 additions & 2 deletions client/ayon_maya/plugins/create/create_layout.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from ayon_maya.api import plugin
from ayon_core.lib import BoolDef
from ayon_core.lib import BoolDef, EnumDef


class CreateLayout(plugin.MayaCreator):
Expand All @@ -17,5 +17,9 @@ def get_instance_attr_defs(self):
label="Group Loaded Assets",
tooltip="Enable this when you want to publish group of "
"loaded asset",
default=False)
default=False),
EnumDef("layout_options",
items=["fbx", "abc"],
label="Export Layout Options",
default="fbx")
]
19 changes: 19 additions & 0 deletions client/ayon_maya/plugins/publish/collect_layout_options.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
import pyblish.api
from ayon_maya.api import plugin


class CollectLayoutOptions(plugin.MayaInstancePlugin):
"""Collect Camera for FBX export."""

order = pyblish.api.CollectorOrder + 0.2
label = "Collect Layout Options"
families = ["layout"]

def process(self, instance):
if instance.data.get("layout_options") == "fbx":
instance.data["families"] += ["layout.fbx"]
elif instance.data.get("layout_options") == "abc":
instance.data["families"] += ["layout.abc"]
else:
self.log.error("No layout options found.")
99 changes: 66 additions & 33 deletions client/ayon_maya/plugins/publish/extract_layout.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,38 +29,12 @@ def convert_matrix_to_4x4_list(
return result


def convert_transformation_matrix(transform_mm: om.MMatrix, rotation: list) -> om.MMatrix:
"""Convert matrix to list of transformation matrix for Unreal Engine import.
Args:
transform_mm (om.MMatrix): Local Matrix for the asset
rotation (list): Rotations of the asset
Returns:
List[om.MMatrix]: List of transformation matrix of the asset
"""
convert_transform = om.MTransformationMatrix(transform_mm)

convert_translation = convert_transform.translation(om.MSpace.kWorld)
convert_translation = om.MVector(convert_translation.x, convert_translation.z, convert_translation.y)
convert_scale = convert_transform.scale(om.MSpace.kObject)
convert_transform.setTranslation(convert_translation, om.MSpace.kWorld)
converted_rotation = om.MEulerRotation(
math.radians(rotation[0]), math.radians(rotation[2]), math.radians(rotation[1])
)
convert_transform.setRotation(converted_rotation)
convert_transform.setScale([convert_scale[0], convert_scale[2], convert_scale[1]], om.MSpace.kObject)

return convert_transform.asMatrix()


class ExtractLayout(plugin.MayaExtractorPlugin):
"""Extract a layout."""

label = "Extract Layout"
families = ["layout"]
label = "Extract Layout(FBX)"
families = ["layout.fbx"]
project_container = "AVALON_CONTAINERS"
optional = True

def process(self, instance):
# Define extract output file path
Expand Down Expand Up @@ -128,13 +102,10 @@ def process(self, instance):
"version": str(version_id)
}


local_matrix = cmds.xform(asset, query=True, matrix=True)
local_rotation = cmds.xform(asset, query=True, rotation=True, euler=True)

matrix = om.MMatrix(local_matrix)
matrix = convert_transformation_matrix(matrix, local_rotation)
t_matrix = convert_matrix_to_4x4_list(matrix)
t_matrix = self.create_transformation_matrix(local_matrix, local_rotation)

json_element["transform_matrix"] = [
list(row)
Expand All @@ -161,7 +132,6 @@ def process(self, instance):
"z": local_rotation[2]
}
json_data.append(json_element)

json_filename = "{}.json".format(instance.name)
json_path = os.path.join(stagingdir, json_filename)

Expand All @@ -179,3 +149,66 @@ def process(self, instance):

self.log.debug("Extracted instance '%s' to: %s",
instance.name, json_representation)

def create_transformation_matrix(self, local_matrix, local_rotation):
matrix = om.MMatrix(local_matrix)
matrix = self.convert_transformation_matrix(matrix, local_rotation)
t_matrix = convert_matrix_to_4x4_list(matrix)
return t_matrix

def convert_transformation_matrix(self, transform_mm: om.MMatrix, rotation: list) -> om.MMatrix:
"""Convert matrix to list of transformation matrix for Unreal Engine import.
Args:
transform_mm (om.MMatrix): Local Matrix for the asset
rotation (list): Rotations of the asset
Returns:
List[om.MMatrix]: List of transformation matrix of the asset
"""
convert_transform = om.MTransformationMatrix(transform_mm)

convert_translation = convert_transform.translation(om.MSpace.kWorld)
convert_translation = om.MVector(convert_translation.x, convert_translation.z, convert_translation.y)
convert_scale = convert_transform.scale(om.MSpace.kObject)
convert_transform.setTranslation(convert_translation, om.MSpace.kWorld)
converted_rotation = om.MEulerRotation(
math.radians(rotation[0]), math.radians(rotation[2]), math.radians(rotation[1])
)
convert_transform.setRotation(converted_rotation)
convert_transform.setScale([convert_scale[0], convert_scale[2], convert_scale[1]], om.MSpace.kObject)

return convert_transform.asMatrix()


class ExtractLayoutAbc(ExtractLayout):
"""Extract a layout."""

label = "Extract Layout(Abc)"
families = ["layout.abc"]
project_container = "AVALON_CONTAINERS"

def convert_transformation_matrix(self, transform_mm: om.MMatrix, rotation: list) -> om.MMatrix:
"""Convert matrix to list of transformation matrix for Unreal Engine import.
Args:
transform_mm (om.MMatrix): Local Matrix for the asset
rotation (list): Rotations of the asset
Returns:
List[om.MMatrix]: List of transformation matrix of the asset
"""
# TODO: need to find the correct implementation of layout for alembic
convert_transform = om.MTransformationMatrix(transform_mm)

convert_translation = convert_transform.translation(om.MSpace.kWorld)
convert_translation = om.MVector(convert_translation.x, convert_translation.z, convert_translation.y)
convert_scale = convert_transform.scale(om.MSpace.kObject)
convert_transform.setTranslation(convert_translation, om.MSpace.kWorld)
converted_rotation = om.MEulerRotation(
math.radians(rotation[0]), math.radians(rotation[2]), math.radians(rotation[1])
)
convert_transform.setRotation(converted_rotation)
convert_transform.setScale([convert_scale[0], convert_scale[2], convert_scale[1]], om.MSpace.kObject)

return convert_transform.asMatrix()

0 comments on commit 97e3dc0

Please sign in to comment.