78 lines
3.3 KiB
Python
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
|