[Bf-extensions-cvs] [6aa8cce8] master: Rigify: Turn Rotation Mode converter into single operator

Demeter Dzadik noreply at git.blender.org
Wed Nov 4 15:55:24 CET 2020


Commit: 6aa8cce84937f5a5f6ba0f6867ef999abc015158
Author: Demeter Dzadik
Date:   Wed Nov 4 15:53:48 2020 +0100
Branches: master
https://developer.blender.org/rBA6aa8cce84937f5a5f6ba0f6867ef999abc015158

Rigify: Turn Rotation Mode converter into single operator

This operator used to demand a huge chunk for itself as the sole inhabitant of the Rigify panel in the sidebar with a bunch of options that are only relevant when the operator is actually ran. Also for some reason it was split up to two separate operators for the sake of having "convert all actions" vs "convert current action" buttons.

So, I removed that UI from the sidebar entirely, turned all the options into parameters on a SINGLE operator which asks for those options when ran using invoke() and draw(). This operator now lives in the Pose drop-down menu, which is where you would expect to find it. This is also searchable with the new search menu, unlike the sidebar.

Also note that this operator has precisely //nothing// to do with Rigify, and should be a separate addon. I would split it out in a separate patch.

Reviewed By: angavrilov

Differential Revision: https://developer.blender.org/D9096

===================================================================

M	rigify/rot_mode.py

===================================================================

diff --git a/rigify/rot_mode.py b/rigify/rot_mode.py
index 7487a1ea..855857b8 100644
--- a/rigify/rot_mode.py
+++ b/rigify/rot_mode.py
@@ -26,12 +26,12 @@ blender.stackexchange.com/questions/40711/how-to-convert-quaternions-keyframes-t
 '''
 
 # bl_info = {
-#     "name": "Quat/Euler Rotation Mode Converter",
+#     "name": "Rotation Mode Converter",
 #     "author": "Mario Mey / Mutant Bob",
-#     "version": (0, 1),
-#     "blender": (2, 76, 0),
-#     'location': '',
-#     "description": "Converts bones rotation mode",
+#     "version": (0, 2),
+#     "blender": (2, 91, 0),
+#     'location': 'Pose Mode -> Header -> Pose -> Convert Rotation Modes',
+#     "description": "Converts Animation between different rotation orders",
 #     "warning": "",
 #     "doc_url": "",
 #     "tracker_url": "https://github.com/MarioMey/rotation_mode_addon/",
@@ -40,306 +40,217 @@ blender.stackexchange.com/questions/40711/how-to-convert-quaternions-keyframes-t
 
 import bpy
 from bpy.props import (
-    BoolProperty,
     EnumProperty,
+    StringProperty,
 )
 
 
-class convert():
-    def get_or_create_fcurve(self, action, data_path, array_index=-1, group=None):
-        for fc in action.fcurves:
-            if fc.data_path == data_path and (array_index < 0 or fc.array_index == array_index):
-                return fc
-
-        fc = action.fcurves.new(data_path, index=array_index)
-        fc.group = group
-        return fc
-
-    def add_keyframe_quat(self, action, quat, frame, bone_prefix, group):
-        for i in range(len(quat)):
-            fc = self.get_or_create_fcurve(action, bone_prefix + "rotation_quaternion", i, group)
-            pos = len(fc.keyframe_points)
-            fc.keyframe_points.add(1)
-            fc.keyframe_points[pos].co = [frame, quat[i]]
-            fc.update()
-
-    def add_keyframe_euler(self, action, euler, frame, bone_prefix, group):
-        for i in range(len(euler)):
-            fc = self.get_or_create_fcurve(action, bone_prefix + "rotation_euler", i, group)
-            pos = len(fc.keyframe_points)
-            fc.keyframe_points.add(1)
-            fc.keyframe_points[pos].co = [frame, euler[i]]
-            fc.update()
-
-    def frames_matching(self, action, data_path):
-        frames = set()
+def get_or_create_fcurve(action, data_path, array_index=-1, group=None):
+    for fc in action.fcurves:
+        if fc.data_path == data_path and (array_index < 0 or fc.array_index == array_index):
+            return fc
+
+    fc = action.fcurves.new(data_path, index=array_index)
+    fc.group = group
+    return fc
+
+def add_keyframe_quat(action, quat, frame, bone_prefix, group):
+    for i in range(len(quat)):
+        fc = get_or_create_fcurve(action, bone_prefix + "rotation_quaternion", i, group)
+        pos = len(fc.keyframe_points)
+        fc.keyframe_points.add(1)
+        fc.keyframe_points[pos].co = [frame, quat[i]]
+        fc.update()
+
+def add_keyframe_euler(action, euler, frame, bone_prefix, group):
+    for i in range(len(euler)):
+        fc = get_or_create_fcurve(action, bone_prefix + "rotation_euler", i, group)
+        pos = len(fc.keyframe_points)
+        fc.keyframe_points.add(1)
+        fc.keyframe_points[pos].co = [frame, euler[i]]
+        fc.update()
+
+def frames_matching(action, data_path):
+    frames = set()
+    for fc in action.fcurves:
+        if fc.data_path == data_path:
+            fri = [kp.co[0] for kp in fc.keyframe_points]
+            frames.update(fri)
+    return frames
+
+def group_qe(obj, action, bone, bone_prefix, order):
+    """Converts only one group/bone in one action - Quat to euler."""
+    pose_bone = bone
+    data_path = bone_prefix + "rotation_quaternion"
+    frames = frames_matching(action, data_path)
+    group = action.groups[bone.name]
+
+    for fr in frames:
+        quat = bone.rotation_quaternion.copy()
         for fc in action.fcurves:
             if fc.data_path == data_path:
-                fri = [kp.co[0] for kp in fc.keyframe_points]
-                frames.update(fri)
-        return frames
-
-    # Converts only one group/bone in one action - Quat to euler
-    def group_qe(self, obj, action, bone, bone_prefix, order):
-
-        pose_bone = bone
-        data_path = bone_prefix + "rotation_quaternion"
-        frames = self.frames_matching(action, data_path)
-        group = action.groups[bone.name]
-
-        for fr in frames:
-            quat = bone.rotation_quaternion.copy()
-            for fc in action.fcurves:
-                if fc.data_path == data_path:
-                    quat[fc.array_index] = fc.evaluate(fr)
-            euler = quat.to_euler(order)
-
-            self.add_keyframe_euler(action, euler, fr, bone_prefix, group)
-            bone.rotation_mode = order
-
-    # Converts only one group/bone in one action - Euler to Quat
-    def group_eq(self, obj, action, bone, bone_prefix, order):
-
-        pose_bone = bone
-        data_path = bone_prefix + "rotation_euler"
-        frames = self.frames_matching(action, data_path)
-        group = action.groups[bone.name]
-
-        for fr in frames:
-            euler = bone.rotation_euler.copy()
-            for fc in action.fcurves:
-                if fc.data_path == data_path:
-                    euler[fc.array_index] = fc.evaluate(fr)
-            quat = euler.to_quaternion()
-
-            self.add_keyframe_quat(action, quat, fr, bone_prefix, group)
-            bone.rotation_mode = order
-
-    # One Action - One Bone
-    def one_act_one_bon(self, obj, action, bone, order):
-        do = False
-        bone_prefix = ''
-
-        # What kind of conversion
-        cond1 = order == 'XYZ'
-        cond2 = order == 'XZY'
-        cond3 = order == 'YZX'
-        cond4 = order == 'YXZ'
-        cond5 = order == 'ZXY'
-        cond6 = order == 'ZYX'
-
-        order_euler = cond1 or cond2 or cond3 or cond4 or cond5 or cond6
-        order_quat = order == 'QUATERNION'
-
-        for fcurve in action.fcurves:
-            if fcurve.group.name == bone.name:
-
-                # If To-Euler conversion
-                if order != 'QUATERNION':
-                    if fcurve.data_path.endswith('rotation_quaternion'):
-                        do = True
-                        bone_prefix = fcurve.data_path[:-len('rotation_quaternion')]
-                        break
-
-                # If To-Quat conversion
-                else:
-                    if fcurve.data_path.endswith('rotation_euler'):
-                        do = True
-                        bone_prefix = fcurve.data_path[:-len('rotation_euler')]
-                        break
-
-        # If To-Euler conversion
-        if do and order != 'QUATERNION':
-            # Converts the group/bone from Quat to Euler
-            self.group_qe(obj, action, bone, bone_prefix, order)
-
-            # Removes quaternion fcurves
-            for key in action.fcurves:
-                if key.data_path == 'pose.bones["' + bone.name + '"].rotation_quaternion':
-                    action.fcurves.remove(key)
-
-        # If To-Quat conversion
-        elif do:
-            # Converts the group/bone from Euler to Quat
-            self.group_eq(obj, action, bone, bone_prefix, order)
-
-            # Removes euler fcurves
-            for key in action.fcurves:
-                if key.data_path == 'pose.bones["' + bone.name + '"].rotation_euler':
-                    action.fcurves.remove(key)
-
-        # Changes rotation mode to new one
-        bone.rotation_mode = order
-
-    # One Action, selected bones
-    def one_act_sel_bon(self, obj, action, pose_bones, order):
-        for bone in pose_bones:
-            self.one_act_one_bon(obj, action, bone, order)
-
-    # One action, all Bones (in Action)
-    def one_act_every_bon(self, obj, action, order):
-
-        # Collects pose_bones that are in the action
-        pose_bones = set()
-        # Checks all fcurves
-        for fcurve in action.fcurves:
-            # Look for the ones that has rotation_euler
-            if order == 'QUATERNION':
-                if fcurve.data_path.endswith('rotation_euler'):
-                    # If the bone from action really exists
-                    if fcurve.group.name in obj.pose.bones:
-                        if obj.pose.bones[fcurve.group.name] not in pose_bones:
-                            pose_bones.add(obj.pose.bones[fcurve.group.name])
-                    else:
-                        print(fcurve.group.name, 'does not exist in Armature. Fcurve-group is not affected')
-
-            # Look for the ones that has rotation_quaternion
-            else:
-                if fcurve.data_path.endswith('rotation_quaternion'):
-                    # If the bone from action really exists
-                    if fcurve.group.name in obj.pose.bones:
-                        if obj.pose.bones[fcurve.group.name] not in pose_bones:
-                            pose_bones.add(obj.pose.bones[fcurve.group.name])
-                    else:
-                        print(fcurve.group.name, 'does not exist in Armature. Fcurve-group is not affected')
-
-        # Convert current action and pose_bones that are in each action
-        for bone in pose_bones:
-            self.one_act_one_bon(obj, action, bone, order)
-
-    # All Actions, selected bones
-    def all_act_sel_bon(self, obj, pose_bones, order):
-        for action in bpy.data.actions:
-            for bone in pose_bones:
-                self.one_act_one_bon(obj, action, bone, order)
-
-    # All actions, All Bones (in each Action)
-    def all_act_every_bon(self, obj, order):
-        for action in bpy.data.actions:
-            self.one_act_every_bon(obj, action, order)
+                quat[fc.array_index] = fc.evaluate(fr)
+        euler = quat.to_euler(order)
 
+        add_keyframe_euler(action, euler, fr, bone_prefix, group)
+        bone.rotation_mode = order
 
-convert = convert()
-
-
-class VIEW3D_PT_rigify_rot_mode(bpy.types.Panel):
-    bl_space_type = 'VIEW_3D'
-    bl_region_type = 'UI'
-    bl_category = 'Rigify'
-    bl_context = "posemode"
-    bl_label = 'Rigify Quat/Euler Converter'
-
-    # draw the gui
-    def draw(self, context):
-        layout = self.l

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list