MetaBox/Scripts/Animation/epic_pose_wrangler/v1/upgrade.py
2025-01-14 03:05:57 +08:00

78 lines
3.3 KiB
Python

# Copyright Epic Games, Inc. All Rights Reserved.
import collections
import json
import os
import tempfile
import uuid
from maya import cmds
from epic_pose_wrangler.log import LOG
from epic_pose_wrangler.v1 import poseWrangler
def upgrade_scene(clear_scene=True):
drivers = cmds.ls(type='UE4RBFSolverNode')
output_data = collections.OrderedDict()
for driver in drivers:
driver_data = collections.OrderedDict()
driver_obj = poseWrangler.UE4PoseDriver(existing_interpolator=driver)
solver = driver_obj.solver
driver_name = driver_obj.name.replace("_UE4RBFSolver", "_UERBFSolver")
driver_data['solver_name'] = driver_name
solver_attrs = cmds.listAttr(solver, keyable=True)
for solver_attr in solver_attrs:
try:
value = cmds.getAttr(solver + "." + solver_attr)
except:
continue
driver_data[solver_attr] = value
driver_data['drivers'] = [driver_obj.driving_transform]
driver_data['driven_transforms'] = driver_obj.driven_transforms
driver_data['mode'] = cmds.getAttr("{driver}.mode".format(driver=driver))
driver_data['radius'] = cmds.getAttr("{driver}.radius".format(driver=driver))
driver_data['weightThreshold'] = cmds.getAttr("{driver}.weightThreshold".format(driver=driver))
driver_data['automaticRadius'] = cmds.getAttr("{driver}.automaticRadius".format(driver=driver))
driver_data['distanceMethod'] = cmds.getAttr("{driver}.distanceMethod".format(driver=driver))
driver_data['poses'] = collections.OrderedDict()
driver_transform = driver_obj.driving_transform
sorted_poses = sorted([p for p in driver_obj.pose_dict.keys()])
for pose in sorted_poses:
mx_list = driver_obj.pose_dict[pose]
driver_obj.assume_pose(pose)
pose_data = {
"drivers": [cmds.xform(driver_transform, query=True, matrix=True, objectSpace=True)],
"driven": {transform: cmds.xform(transform, query=True, matrix=True, objectSpace=True)
for transform in driver_obj.driven_transforms},
"function_type": "DefaultFunctionType",
"scale_factor": 1.0,
"distance_method": "DefaultMethod"
}
# Changing default pose name
if pose == 'base_pose':
pose = 'default'
driver_data['poses'][pose] = pose_data
output_data[driver_name] = driver_data
# zero the pose
driver_obj.assume_pose("base_pose")
temp_dir = tempfile.gettempdir()
file_path = os.path.join(temp_dir, "pose_wrangler-{uuid}.json".format(uuid=uuid.uuid4()))
with open(file_path, 'w') as outfile:
json.dump(output_data, outfile, indent=4, separators=(",", ":"))
LOG.debug("Writing scene to {file_path}".format(file_path=file_path))
if clear_scene:
cmds.delete(cmds.ls(type='UE4RBFSolverNode'))
cmds.delete(cmds.ls(type='UE4PoseBlenderNode'))
cmds.delete(cmds.ls('*_pose', type='network'))
for joint in cmds.ls(type='joint'):
for attr in ['mx_pose', 'ue4_rbf_solver', 'blenderNode']:
if cmds.attributeQuery(attr, node=joint, exists=True):
cmds.deleteAttr("{joint}.{attr}".format(joint=joint, attr=attr))
return file_path