* Enabled rna access to fluid sim velocity vectors
[blender-staging.git] / release / scripts / startup / keyingsets_builtins.py
index 6b0b282fd4735b8b9e68ed961191513575aab3ef..8cb63ea48cffb2fbf41c9d0c2fdef5788ec298bd 100644 (file)
@@ -23,6 +23,11 @@ Built-In Keying Sets
 None of these Keying Sets should be removed, as these
 are needed by various parts of Blender in order for them
 to work correctly.
+
+Beware also about changing the order that these are defined
+here, since this can result in old files referring to the
+wrong Keying Set as the active one, potentially resulting
+in lost (i.e. unkeyed) animation.
 """
 
 import bpy
@@ -210,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
@@ -352,6 +361,93 @@ class BUILTIN_KSI_WholeCharacter(bpy.types.KeyingSetInfo):
             # for now, just add all of 'em
             ksi.addProp(ks, bone, '["%s"]' % (prop))
 
+###############################
+
+
+# Delta Location
+class BUILTIN_KSI_DeltaLocation(bpy.types.KeyingSetInfo):
+    bl_label = "Delta Location"
+
+    # poll - selected objects only (and only if active object in object mode)
+    poll = keyingsets_utils.RKS_POLL_selected_objects
+
+    # iterator - selected objects only
+    iterator = keyingsets_utils.RKS_ITER_selected_objects
+
+    # generator - delta location channels only
+    def generate(ksi, context, ks, data):
+        # get id-block and path info
+        id_block, base_path, grouping = keyingsets_utils.get_transform_generators_base_info(data)
+
+        # add the property name to the base path
+        path = keyingsets_utils.path_add_property(base_path, "delta_location")
+
+        # add Keying Set entry for this...
+        if grouping:
+            ks.paths.add(id_block, path, group_method='NAMED', group_name=grouping)
+        else:
+            ks.paths.add(id_block, path)
+
+
+# Delta Rotation
+class BUILTIN_KSI_DeltaRotation(bpy.types.KeyingSetInfo):
+    bl_label = "Delta Rotation"
+
+    # poll - selected objects only (and only if active object in object mode)
+    poll = keyingsets_utils.RKS_POLL_selected_objects
+
+    # iterator - selected objects only
+    iterator = keyingsets_utils.RKS_ITER_selected_objects
+
+    # generator - delta location channels only
+    def generate(ksi, context, ks, data):
+        # get id-block and path info
+        id_block, base_path, grouping = keyingsets_utils.get_transform_generators_base_info(data)
+
+        # add the property name to the base path
+        #   rotation mode affects the property used
+        if data.rotation_mode == 'QUATERNION':
+            path = path_add_property(base_path, "delta_rotation_quaternion")
+        elif data.rotation_mode == 'AXIS_ANGLE':
+            # XXX: for now, this is not available yet
+            #path = path_add_property(base_path, "delta_rotation_axis_angle")
+            return
+        else:
+            path = keyingsets_utils.path_add_property(base_path, "delta_rotation_euler")
+
+        # add Keying Set entry for this...
+        if grouping:
+            ks.paths.add(id_block, path, group_method='NAMED', group_name=grouping)
+        else:
+            ks.paths.add(id_block, path)
+
+
+# Delta Scale
+class BUILTIN_KSI_DeltaScale(bpy.types.KeyingSetInfo):
+    bl_label = "Delta Scale"
+
+    # poll - selected objects only (and only if active object in object mode)
+    poll = keyingsets_utils.RKS_POLL_selected_objects
+
+    # iterator - selected objects only
+    iterator = keyingsets_utils.RKS_ITER_selected_objects
+
+    # generator - delta location channels only
+    def generate(ksi, context, ks, data):
+        # get id-block and path info
+        id_block, base_path, grouping = keyingsets_utils.get_transform_generators_base_info(data)
+
+        # add the property name to the base path
+        path = keyingsets_utils.path_add_property(base_path, "delta_scale")
+
+        # add Keying Set entry for this...
+        if grouping:
+            ks.paths.add(id_block, path, group_method='NAMED', group_name=grouping)
+        else:
+            ks.paths.add(id_block, path)
+
+###############################
+
 
 def register():
     bpy.utils.register_module(__name__)