Revision: 18096
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18096
Author:   aligorith
Date:     2008-12-27 12:44:00 +0100 (Sat, 27 Dec 2008)

Log Message:
-----------
2.5 - Action Editor 

* Started porting back keyframe editing tools for the Action Editor/Dopesheet. 
Currently, only Snap (Shift-S) and Mirror (Shift-M) are functional.

* Added keyframe-editing API method for ensuring that all IPO-curves are left 
in a valid state after modifiying the values of their keyframes.

* Added operator-register flags for most of the operators. Only mouse-select 
doesn't have it for now (as there's not much useful info stored, and no exec 
callback).

Modified Paths:
--------------
    
branches/blender2.5/blender/source/blender/editors/animation/keyframes_edit.c
    
branches/blender2.5/blender/source/blender/editors/include/ED_keyframes_edit.h
    branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
    
branches/blender2.5/blender/source/blender/editors/space_action/action_intern.h
    branches/blender2.5/blender/source/blender/editors/space_action/action_ops.c
    
branches/blender2.5/blender/source/blender/editors/space_action/action_select.c

Added Paths:
-----------
    
branches/blender2.5/blender/source/blender/editors/space_action/action_edit_keyframes.c

Modified: 
branches/blender2.5/blender/source/blender/editors/animation/keyframes_edit.c
===================================================================
--- 
branches/blender2.5/blender/source/blender/editors/animation/keyframes_edit.c   
    2008-12-27 10:54:32 UTC (rev 18095)
+++ 
branches/blender2.5/blender/source/blender/editors/animation/keyframes_edit.c   
    2008-12-27 11:44:00 UTC (rev 18096)
@@ -145,6 +145,34 @@
 }
 
 /* ************************************************************************** 
*/
+/* Keyframe Integrity Tools */
+
+/* Rearrange keyframes if some are out of order */
+// used to be recalc_*_ipos() where * was object or action
+void ANIM_editkeyframes_refresh(bAnimContext *ac)
+{
+       ListBase anim_data = {NULL, NULL};
+       bAnimListElem *ale;
+       int filter;
+       
+       /* filter animation data */
+       filter= ANIMFILTER_ONLYICU;
+       ANIM_animdata_filter(&anim_data, filter, ac->data, ac->datatype);
+       
+       /* loop over ipo-curves that are likely to have been edited, and check 
them */
+       for (ale= anim_data.first; ale; ale= ale->next) {
+               IpoCurve *icu= ale->key_data;
+               
+               /* make sure keyframes in IPO-curve are all in order, and 
handles are in valid positions */
+               sort_time_ipocurve(icu);
+               testhandles_ipocurve(icu);
+       }
+       
+       /* free temp data */
+       BLI_freelistN(&anim_data);
+}
+
+/* ************************************************************************** 
*/
 /* BezTriple Validation Callbacks */
 
 static short ok_bezier_frame(BeztEditData *bed, BezTriple *bezt)
@@ -286,45 +314,11 @@
 
 static short mirror_bezier_marker(BeztEditData *bed, BezTriple *bezt)
 {
-       static TimeMarker *marker;
-       static short initialised = 0;
-       const Scene *scene= bed->scene;
-       
-       /* In order for this mirror function to work without
-        * any extra arguments being added, we use the case
-        * of bezt==NULL to denote that we should find the 
-        * marker to mirror over. The static pointer is safe
-        * to use this way, as it will be set to null after 
-        * each cycle in which this is called.
-        */
-       
-       if (bezt) {
-               /* mirroring time */
-               if ((bezt->f2 & SELECT) && (marker)) {
-                       const float diff= (marker->frame - bezt->vec[1][0]);
-                       bezt->vec[1][0]= (marker->frame + diff);
-               }
+       /* mirroring time stored in f1 */
+       if (bezt->f2 & SELECT) {
+               const float diff= (bed->f1 - bezt->vec[1][0]);
+               bezt->vec[1][0]= (bed->f1 + diff);
        }
-       else {
-               /* initialisation time */
-               if (initialised) {
-                       /* reset everything for safety */
-                       marker = NULL;
-                       initialised = 0;
-               }
-               else {
-                       /* try to find a marker */
-                       for (marker= scene->markers.first; marker; 
marker=marker->next) {
-                               if (marker->flag & SELECT) {
-                                       initialised = 1;
-                                       break;
-                               }
-                       }                       
-                       
-                       if (initialised == 0) 
-                               marker = NULL;
-               }
-       }
        
        return 0;
 }
@@ -334,20 +328,22 @@
 BeztEditFunc ANIM_editkeyframes_mirror(short type)
 {
        switch (type) {
-               case 1: /* mirror over current frame */
+               case MIRROR_KEYS_CURFRAME: /* mirror over current frame */
                        return mirror_bezier_cframe;
-               case 2: /* mirror over frame 0 */
+               case MIRROR_KEYS_YAXIS: /* mirror over frame 0 */
                        return mirror_bezier_yaxis;
-               case 3: /* mirror over value 0 */
+               case MIRROR_KEYS_XAXIS: /* mirror over value 0 */
                        return mirror_bezier_xaxis;
-               case 4: /* mirror over marker */
-                       return mirror_bezier_marker; // XXX in past, this func 
was called before/after with NULL, probably will need globals instead
+               case MIRROR_KEYS_MARKER: /* mirror over marker */
+                       return mirror_bezier_marker; 
                default: /* just in case */
                        return mirror_bezier_yaxis;
                        break;
        }
 }
 
+/* --------- */
+
 /* This function is called to calculate the average location of the
  * selected keyframes, and place the current frame at that location.
  *
@@ -654,6 +650,7 @@
        return 0;
 }
 
+// XXX although this is still needed, it should be removed!
 void set_ipo_key_selection(Ipo *ipo, short sel)
 {
        IpoCurve *icu;
@@ -678,6 +675,7 @@
        }
 }
 
+// XXX port this over to the new system!
 // err... this is this still used?
 int fullselect_ipo_keys(Ipo *ipo)
 {
@@ -701,134 +699,3 @@
        return tvtot;
 }
 
-
-void borderselect_icu_key(IpoCurve *icu, float xmin, float xmax, BeztEditFunc 
select_cb)
-{
-       /* Selects all bezier triples in the Ipocurve 
-        * between times xmin and xmax, using the selection
-        * function.
-        */
-       BezTriple *bezt;
-       int i;
-       
-       /* loop through all of the bezier triples in
-        * the Ipocurve -- if the triple occurs between
-        * times xmin and xmax then select it using the selection
-        * function
-        */
-       for (i=0, bezt=icu->bezt; i<icu->totvert; i++, bezt++) {
-               if ((bezt->vec[1][0] > xmin) && (bezt->vec[1][0] < xmax)) {
-                       /* scene is NULL (irrelevant here) */
-                       select_cb(NULL, bezt); 
-               }
-       }
-}
-
-void borderselect_ipo_key(Ipo *ipo, float xmin, float xmax, short selectmode)
-{
-       /* Selects all bezier triples in each Ipocurve of the
-        * Ipo between times xmin and xmax, using the selection mode.
-        */
-       
-       IpoCurve *icu;
-       BeztEditFunc select_cb;
-       
-       /* If the ipo is no good then return */
-       if (ipo == NULL)
-               return;
-       
-       /* Set the selection function based on the
-        * selection mode.
-        */
-       select_cb= ANIM_editkeyframes_select(selectmode);
-       if (select_cb == NULL)
-               return;
-       
-       /* loop through all of the bezier triples in all
-               * of the Ipocurves -- if the triple occurs between
-               * times xmin and xmax then select it using the selection
-               * function
-               */
-       for (icu=ipo->curve.first; icu; icu=icu->next) {
-               borderselect_icu_key(icu, xmin, xmax, select_cb);
-       }
-}
-
-void select_icu_key(BeztEditData *bed, IpoCurve *icu, float selx, short 
selectmode)
-{
-    /* Selects all bezier triples in the Ipocurve
-        * at time selx, using the selection mode.
-        * This is kind of sloppy the obvious similarities
-        * with the above function, forgive me ...
-        */
-    BeztEditFunc select_cb;
-       BezTriple *bezt;
-       int i;
-       
-    /* If the icu is no good then return */
-    if (icu == NULL)
-        return;
-       
-    /* Set the selection function based on the selection mode. */
-    switch (selectmode) {
-               case SELECT_ADD:
-                       select_cb = select_bezier_add;
-                       break;
-               case SELECT_SUBTRACT:
-                       select_cb = select_bezier_subtract;
-                       break;
-               case SELECT_INVERT:
-                       select_cb = select_bezier_invert;
-                       break;
-               default:
-                       return;
-    }
-       
-    /* loop through all of the bezier triples in
-        * the Ipocurve -- if the triple occurs at
-        * time selx then select it using the selection
-        * function
-        */
-    for (i=0, bezt=icu->bezt; i<icu->totvert; i++, bezt++) {
-        if (bezt->vec[1][0] == selx) {
-            select_cb(bed, bezt);
-        }
-    }
-}
-
-void select_ipo_key(BeztEditData *bed, Ipo *ipo, float selx, short selectmode)
-{
-       /* Selects all bezier triples in each Ipocurve of the
-        * Ipo at time selx, using the selection mode.
-        */
-       IpoCurve *icu;
-       BezTriple *bezt;
-       BeztEditFunc select_cb;
-       int i;
-       
-       /* If the ipo is no good then return */
-       if (ipo == NULL)
-               return;
-       
-       /* Set the selection function based on the
-        * selection mode.
-        */
-       select_cb= ANIM_editkeyframes_select(selectmode);
-       if (select_cb == NULL)
-               return;
-       
-       /* loop through all of the bezier triples in all
-        * of the Ipocurves -- if the triple occurs at
-        * time selx then select it using the selection
-        * function
-        */
-       for (icu=ipo->curve.first; icu; icu=icu->next) {
-               for (i=0, bezt=icu->bezt; i<icu->totvert; i++, bezt++) {
-                       if (bezt->vec[1][0] == selx) {
-                               select_cb(bed, bezt);
-                       }
-               }
-       }
-}
-
-

Modified: 
branches/blender2.5/blender/source/blender/editors/include/ED_keyframes_edit.h
===================================================================
--- 
branches/blender2.5/blender/source/blender/editors/include/ED_keyframes_edit.h  
    2008-12-27 10:54:32 UTC (rev 18095)
+++ 
branches/blender2.5/blender/source/blender/editors/include/ED_keyframes_edit.h  
    2008-12-27 11:44:00 UTC (rev 18096)
@@ -29,6 +29,7 @@
 #ifndef ED_KEYFRAMES_EDIT_H
 #define ED_KEYFRAMES_EDIT_H
 
+struct bAnimContext;
 struct Ipo;
 struct IpoCurve;
 struct BezTriple;
@@ -67,16 +68,19 @@
 
 /* snapping tools */
 typedef enum eEditKeyframes_Snap {
-       SNAP_KEYS_NEARFRAME     = 1,
-       SNAP_KEYS_CURFRAME,
+       SNAP_KEYS_CURFRAME = 1,
+       SNAP_KEYS_NEARFRAME,
+       SNAP_KEYS_NEARSEC,
        SNAP_KEYS_NEARMARKER,
-       SNAP_KEYS_NEARSEC,
 } eEditKeyframes_Snap;
 
 /* mirroring tools */
-//typedef enum eEditKeyframes_Mirror {
-       
-//} eEditKeyframes_Mirror;
+typedef enum eEditKeyframes_Mirror {
+       MIRROR_KEYS_CURFRAME = 1,
+       MIRROR_KEYS_YAXIS,
+       MIRROR_KEYS_XAXIS,
+       MIRROR_KEYS_MARKER,
+} eEditKeyframes_Mirror;
 
 /* ************************************************ */
 /* Editing API */
@@ -92,20 +96,24 @@
        int i1, i2;                                     /* storage of 
times/values as 'whole' numbers */
 } BeztEditData;
 
-/* ------- Function Pointer Typedefs --------------- */
+/* ------- Function Pointer Typedefs ---------------- */
 
        /* callback function that refreshes the IPO curve after use */
 typedef void (*IcuEditFunc)(struct IpoCurve *icu);
        /* callback function that operates on the given BezTriple */
 typedef short (*BeztEditFunc)(BeztEditData *bed, struct BezTriple *bezt);
 
-/* ------------- Looping API ------------------- */
+/* ---------------- Looping API --------------------- */
 
+/* functions for looping over keyframes */
 short icu_keys_bezier_loop(BeztEditData *bed, struct IpoCurve *icu, 
BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, IcuEditFunc icu_cb);
 short ipo_keys_bezier_loop(BeztEditData *bed, struct Ipo *ipo, BeztEditFunc 
bezt_ok, BeztEditFunc bezt_cb, IcuEditFunc icu_cb);
 
-/* ------------ BezTriple Callback Getters --------------- */
+/* functions for making sure all keyframes are in good order */
+void ANIM_editkeyframes_refresh(struct bAnimContext *ac);
 
+/* ----------- BezTriple Callback Getters ---------- */
+
 /* accessories */
 BeztEditFunc ANIM_editkeyframes_ok(short mode);
 
@@ -120,16 +128,10 @@
 
 // XXX all of these funcs will be depreceated!
 
-void select_ipo_key(BeztEditData *bed, struct Ipo *ipo, float selx, short 
selectmode);
-void select_icu_key(BeztEditData *bed, struct IpoCurve *icu, float selx, short 
selectmode);
-
 short is_ipo_key_selected(struct Ipo *ipo);
 void set_ipo_key_selection(struct Ipo *ipo, short sel);
 
-void borderselect_ipo_key(struct Ipo *ipo, float xmin, float xmax, short 
selectmode);
-void borderselect_icu_key(struct IpoCurve *icu, float xmin, float xmax, 
BeztEditFunc select_cb);
 
-
 /* ************************************************ */
 
 #endif /* ED_KEYFRAMES_EDIT_H */

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to