fix [#35977] Bake Action doesn't work properly
authorCampbell Barton <ideasman42@gmail.com>
Thu, 4 Jul 2013 23:52:02 +0000 (23:52 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 4 Jul 2013 23:52:02 +0000 (23:52 +0000)
there are cases where you want to use visual-keying but not remove constraints, also it wasnt obvious that clearing constraints used a different method of keyframing.
So split these into 2 options.

release/scripts/modules/bpy_extras/anim_utils.py
release/scripts/startup/bl_operators/anim.py

index c9ed91d3a83da334a8fa1ab3fe466c6f7339ab57..d87c207e2d080b458ba52dbda15288ec4609bee1 100644 (file)
@@ -31,6 +31,7 @@ def bake_action(frame_start,
                 only_selected=False,
                 do_pose=True,
                 do_object=True,
+                do_visual_keying=True,
                 do_constraint_clear=False,
                 do_parents_clear=False,
                 do_clean=False,
@@ -53,7 +54,9 @@ def bake_action(frame_start,
     :type do_pose: bool
     :arg do_object: Bake objects.
     :type do_object: bool
-    :arg do_constraint_clear: Remove constraints (and do 'visual keying').
+    :arg do_visual_keying: Use the final transformations for baking ('visual keying')
+    :type do_visual_keying: bool
+    :arg do_constraint_clear: Remove constraints after baking.
     :type do_constraint_clear: bool
     :arg do_parents_clear: Unparent after baking objects.
     :type do_parents_clear: bool
@@ -83,14 +86,14 @@ def bake_action(frame_start,
     if do_parents_clear:
         def obj_frame_info(obj, do_visual_keying):
             parent = obj.parent
-            matrix = obj.matrix_local if do_visual_keying else obj.matrix_basis
+            matrix = obj.matrix_local if do_visual_keying else obj.matrix_local
             if parent:
                 return parent.matrix_world * matrix
             else:
                 return matrix.copy()
     else:
         def obj_frame_info(obj, do_visual_keying):
-            return obj.matrix_local.copy() if do_visual_keying else obj.matrix_basis.copy()
+            return obj.matrix_local.copy() if do_visual_keying else obj.matrix_local.copy()
 
     # -------------------------------------------------------------------------
     # Setup the Context
@@ -118,10 +121,11 @@ def bake_action(frame_start,
 
     for f in frame_range:
         scene.frame_set(f)
+        scene.update()
         if do_pose:
-            pose_info.append(pose_frame_info(obj, do_constraint_clear))
+            pose_info.append(pose_frame_info(obj, do_visual_keying))
         if do_object:
-            obj_info.append(obj_frame_info(obj, do_constraint_clear))
+            obj_info.append(obj_frame_info(obj, do_visual_keying))
 
     # -------------------------------------------------------------------------
     # Create action
index ed20cb22297dacfb830018aad74a23f7df94192e..6193611504e146ea1ed04b4d7eff528c0ec262aa 100644 (file)
@@ -190,6 +190,11 @@ class BakeAction(Operator):
             description="Only key selected object/bones",
             default=True,
             )
+    visual_keying = BoolProperty(
+            name="Visual Keying",
+            description="Keyframe from the final transformations (with constraints applied)",
+            default=False,
+            )
     clear_constraints = BoolProperty(
             name="Clear Constraints",
             description="Remove all constraints from keyed object/bones, and do 'visual' keying",
@@ -220,6 +225,7 @@ class BakeAction(Operator):
                                         only_selected=self.only_selected,
                                         do_pose='POSE' in self.bake_types,
                                         do_object='OBJECT' in self.bake_types,
+                                        do_visual_keying=self.visual_keying,
                                         do_constraint_clear=self.clear_constraints,
                                         do_parents_clear=self.clear_parents,
                                         do_clean=True,