def mirrorUnskinned(leftSuffix, rightSuffix, copyDirection): MaxPlus.Animation.SetTime(0, False) src_node = MaxPlus.SelectionManager.GetNodes() mirroredTopNode = MaxPlus.INode.CreateTreeInstance(src_node[0]) MaxPlus.SelectionManager.SelectNode(mirroredTopNode) MaxPlus.Core_EvalMAXScript( "tm = $.transform\ntm.row1 = tm.row1 * [-1,1,1]\n$.transform =tm") mirroredHierarchy = list(sdknode.getChildren(mirroredTopNode)) mirroredHierarchy.append(mirroredTopNode) for n in mirroredHierarchy: n.SetName(n.GetName()[:-7] + "right") sdkutility.ResetXForm(n, True, True) sdkutility.remove_transform_keys(n) mirror_animation(src_node[0], mirroredTopNode, leftSuffix, rightSuffix, copyDirection)
def mirror_animation(source, target, src_suffix, target_suffix, copyDirection): # mirror from parent of selection # todo: if no parent add a node on center dummyRoot = MaxPlus.INode.CreateTreeInstance(source) dummyHierarchy = list(sdknode.getChildren(dummyRoot)) dummyHierarchy.append(dummyRoot) for n in dummyHierarchy: n.SetName(n.GetName()[:-3] + "_dummy") setDummy(n) MaxPlus.SelectionManager.SelectNode(dummyRoot) MaxPlus.Core_EvalMAXScript( "tm = $.transform\ntm.row1 = tm.row1 * [-1,1,1]\n$.transform =tm") try: findObjectAndBake(target, dummyRoot, src_suffix, target_suffix, copyDirection) finally: cleanUp(src_suffix, target_suffix, copyDirection)
def mirror_skin(src, target, src_suffix, target_suffix, mirror_axis): MaxPlus.Animation.SetTime(0, False) sdknode.collapseAllModifiers(target) target_skinmodifier = sdkskin.add_skin_modifier(target) MaxPlus.SelectionManager.SelectNode(target) MaxPlus.Core.EvalMAXScript("max modify mode") src_skinmodifier = sdkskin.get_skin_modifier(src) boneslist = sdkskin.get_bones_list_from_skin_modifier(src_skinmodifier) MaxPlus.SelectionManager.SelectNode(target) if boneslist: for bone in boneslist: binomial_bone = find_binomial(bone, src_suffix, target_suffix) if binomial_bone: sdkskin.add_bone_to_skin_modifier_of_selected_node( binomial_bone) else: sdkskin.add_bone_to_skin_modifier_of_selected_node(bone) else: return MaxPlus.SelectionManager.SelectNode(src) MaxPlus.Core_EvalMAXScript("skinUtils.ExtractSkinData $") skin_data = MaxPlus.INode.GetINodeByName("SkinData_" + src.GetName()) sdknode.mirrorNode(skin_data, mirror_axis) target_bone_list = sdkskin.get_bones_list_from_skin_modifier( target_skinmodifier) for target_bone in target_bone_list: name = target_bone.GetName() new_name = re.sub(r'{0}$'.format(target_suffix), src_suffix, name) target_bone.SetName(new_name) MaxPlus.SelectionManager.ClearNodeSelection() selection = MaxPlus.INodeTab() selection.Append(target) selection.Append(skin_data) MaxPlus.SelectionManager.SelectNodes(selection) MaxPlus.Core.EvalMAXScript( "skinUtils.ImportSkinDataNoDialog true false false false false 1 0") target_bone_list = sdkskin.get_bones_list_from_skin_modifier( target_skinmodifier) for target_bone in target_bone_list: name = target_bone.GetName() new_name = re.sub(r'{0}$'.format(src_suffix), target_suffix, name) target_bone.SetName(new_name) MaxPlus.SelectionManager.ClearNodeSelection() MaxPlus.INode.Delete(skin_data)