Bugfix [#27090] Available keying set fails in armature pose mode
authorJoshua Leung <aligorith@gmail.com>
Thu, 21 Apr 2011 01:21:28 +0000 (01:21 +0000)
committerJoshua Leung <aligorith@gmail.com>
Thu, 21 Apr 2011 01:21:28 +0000 (01:21 +0000)
A change in the poll callback that Available KeyingSet used to use
restricted its use to Object-mode only, while this could also be
useful in Pose Mode (though it would only affect all channels there).

Made this use a custom poll callback now that tests for whether the
active object has an action. This does mean that if you select a bunch
of objects with animation data, but the active object doesn't have it,
then the keyingset will fail to fire, but that's been marked as a todo
in the code.

release/scripts/startup/keyingsets_builtins.py
source/blender/blenkernel/intern/armature.c

index 0775d38c437d497812566a6648b37c42446c4fbb..8cb63ea48cffb2fbf41c9d0c2fdef5788ec298bd 100644 (file)
@@ -215,10 +215,14 @@ class BUILTIN_KSI_VisualLocRot(bpy.types.KeyingSetInfo):
 class BUILTIN_KSI_Available(bpy.types.KeyingSetInfo):
     bl_label = "Available"
 
-    # poll - use predefined callback for selected objects
-    # TODO: this should really check whether the selected object (or datablock)
-    #         has any animation data defined yet
-    poll = keyingsets_utils.RKS_POLL_selected_objects
+    # poll - selected objects or selected object with animation data
+    def poll(ksi, context):
+        ob = context.active_object
+        if ob:
+            # TODO: this fails if one animation-less object is active, but many others are selected
+            return ob.animation_data and ob.animation_data.action
+        else:
+            return bool(context.selected_objects)
 
     # iterator - use callback for selected bones/objects
     iterator = keyingsets_utils.RKS_ITER_selected_item
index ddfa738449dd89a29e4d6a555e88e6c598302a2a..a0511f5da2e8dd4be381f885026c399a653fe5c5 100644 (file)
@@ -1226,10 +1226,10 @@ void pchan_apply_mat4(bPoseChannel *pchan, float mat[][4], short use_compat)
  */
 void armature_mat_pose_to_delta(float delta_mat[][4], float pose_mat[][4], float arm_mat[][4])
 {
-        float imat[4][4];
-        invert_m4_m4(imat, arm_mat);
-        mul_m4_m4m4(delta_mat, pose_mat, imat);
+       float imat[4][4];
+       
+       invert_m4_m4(imat, arm_mat);
+       mul_m4_m4m4(delta_mat, pose_mat, imat);
 }
 
 /* **************** Rotation Mode Conversions ****************************** */