merge with/from trunk at r35190
[blender.git] / source / blender / makesrna / intern / rna_fcurve.c
index 96ec09f844e60cb87db0e39f3e6298aa7e3004e1..72f74f5a3e9f0c23f0b8f323329a00c14f10e131 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * $Id$
  *
  * ***** BEGIN GPL LICENSE BLOCK *****
@@ -44,7 +44,7 @@
 
 #include "ED_keyframing.h"
 #include "ED_keyframes_edit.h"
-
 EnumPropertyItem fmodifier_type_items[] = {
        {FMODIFIER_TYPE_NULL, "NULL", 0, "Invalid", ""},
        {FMODIFIER_TYPE_GENERATOR, "GENERATOR", 0, "Generator", ""},
@@ -62,6 +62,7 @@ EnumPropertyItem beztriple_keyframe_type_items[] = {
        {BEZT_KEYTYPE_KEYFRAME, "KEYFRAME", 0, "Keyframe", ""},
        {BEZT_KEYTYPE_BREAKDOWN, "BREAKDOWN", 0, "Breakdown", ""},
        {BEZT_KEYTYPE_EXTREME, "EXTREME", 0, "Extreme", ""},
+       {BEZT_KEYTYPE_JITTER, "JITTER", 0, "Jitter", ""},
        {0, NULL, 0, NULL, NULL}};
 
 #ifdef RNA_RUNTIME
@@ -546,18 +547,27 @@ static void rna_FModifierStepped_end_frame_range(PointerRNA *ptr, float *min, fl
        *max= MAXFRAMEF;
 }
 
-static BezTriple *rna_FKeyframe_points_add(FCurve *fcu, float frame, float value, int do_replace, int do_needed, int do_fast)
+static BezTriple *rna_FKeyframe_points_insert(FCurve *fcu, float frame, float value, int flag)
 {
-       int index;
-       int flag= 0;
-
-       if(do_replace) flag |= INSERTKEY_REPLACE;
-       if(do_needed) flag |= INSERTKEY_NEEDED;
-       if(do_fast) flag |= INSERTKEY_FAST;
+       int index= insert_vert_fcurve(fcu, frame, value, flag);
+       return ((fcu->bezt) && (index >= 0))? (fcu->bezt + index) : NULL;
+}
 
+static void rna_FKeyframe_points_add(FCurve *fcu, int tot)
+{
+       if(tot > 0) {
+               if(fcu->totvert) {
+                       BezTriple *nbezt= MEM_callocN(sizeof(BezTriple) * (fcu->totvert + tot), "rna_FKeyframe_points_add");
+                       memcpy(nbezt, fcu->bezt, sizeof(BezTriple) * fcu->totvert);
+                       MEM_freeN(fcu->bezt);
+                       fcu->bezt= nbezt;
+               }
+               else {
+                       fcu->bezt= MEM_callocN(sizeof(BezTriple) * tot, "rna_FKeyframe_points_add");
+               }
 
-       index= insert_vert_fcurve(fcu, frame, value, flag);
-       return ((fcu->bezt) && (index >= 0))? (fcu->bezt + index) : NULL;
+               fcu->totvert += tot;
+       }
 }
 
 static void rna_FKeyframe_points_remove(FCurve *fcu, ReportList *reports, BezTriple *bezt, int do_fast)
@@ -1323,25 +1333,32 @@ static void rna_def_fcurve_keyframe_points(BlenderRNA *brna, PropertyRNA *cprop)
        FunctionRNA *func;
        PropertyRNA *parm;
 
+       static EnumPropertyItem keyframe_flag_items[] = {
+               {INSERTKEY_REPLACE, "REPLACE", 0, "Replace", "Don't add any new keyframes, but just replace existing ones"},
+               {INSERTKEY_NEEDED, "NEEDED", 0, "Needed", "Only adds keyframes that are needed"},
+               {INSERTKEY_FAST, "FAST", 0, "Fast", "Fast keyframe insertion to avoid recalculating the curve each time"},
+               {0, NULL, 0, NULL, NULL}};
+
        RNA_def_property_srna(cprop, "FCurveKeyframePoints");
        srna= RNA_def_struct(brna, "FCurveKeyframePoints", NULL);
        RNA_def_struct_sdna(srna, "FCurve");
        RNA_def_struct_ui_text(srna, "Keyframe Points", "Collection of keyframe points");
 
-       func= RNA_def_function(srna, "add", "rna_FKeyframe_points_add");
+       func= RNA_def_function(srna, "insert", "rna_FKeyframe_points_insert");
        RNA_def_function_ui_description(func, "Add a keyframe point to a F-Curve.");
        parm= RNA_def_float(func, "frame", 0.0f, -FLT_MAX, FLT_MAX, "", "X Value of this keyframe point", -FLT_MAX, FLT_MAX);
        RNA_def_property_flag(parm, PROP_REQUIRED);
        parm= RNA_def_float(func, "value", 0.0f, -FLT_MAX, FLT_MAX, "", "Y Value of this keyframe point", -FLT_MAX, FLT_MAX);
        RNA_def_property_flag(parm, PROP_REQUIRED);
-       /* optional */
-       RNA_def_boolean(func, "replace", 0, "Replace", "Don't add any new keyframes, but just replace existing ones");
-       RNA_def_boolean(func, "needed", 0, "Needed", "Only adds keyframes that are needed");
-       RNA_def_boolean(func, "fast", 0, "Fast", "Fast keyframe insertion to avoid recalculating the curve each time");
+
+       RNA_def_enum_flag(func, "options", keyframe_flag_items, 0, "", "Keyframe options.");
 
        parm= RNA_def_pointer(func, "keyframe", "Keyframe", "", "Newly created keyframe");
        RNA_def_function_return(func, parm);
 
+       func= RNA_def_function(srna, "add", "rna_FKeyframe_points_add");
+       RNA_def_function_ui_description(func, "Add a keyframe point to a F-Curve.");
+       RNA_def_int(func, "count", 1, 1, INT_MAX, "Number", "Number of points to add to the spline", 1, INT_MAX);
 
        func= RNA_def_function(srna, "remove", "rna_FKeyframe_points_remove");
        RNA_def_function_ui_description(func, "Remove keyframe from an fcurve.");
@@ -1349,7 +1366,7 @@ static void rna_def_fcurve_keyframe_points(BlenderRNA *brna, PropertyRNA *cprop)
        parm= RNA_def_pointer(func, "keyframe", "Keyframe", "", "Keyframe to remove.");
        RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
        /* optional */
-       parm= RNA_def_boolean(func, "fast", 0, "Fast", "Fast keyframe removal to avoid recalculating the curve each time");
+       RNA_def_boolean(func, "fast", 0, "Fast", "Fast keyframe removal to avoid recalculating the curve each time");
 }
 
 static void rna_def_fcurve(BlenderRNA *brna)