NLA SoC: Little optimisation + Drawing bugfix
authorJoshua Leung <aligorith@gmail.com>
Wed, 8 Jul 2009 12:30:09 +0000 (12:30 +0000)
committerJoshua Leung <aligorith@gmail.com>
Wed, 8 Jul 2009 12:30:09 +0000 (12:30 +0000)
* Text labels on NLA-Strips should now draw properly for most short-strips now. Previously, the padding on the text was a bit too extreme, so for very short strips (less than 4 frames or so), the text was often pushed down into the bottom-right corner of view.

* Optimised the keyframe-highlighting code for buttons a bit. Replaced the custom linear-search with the binary-search used when inserting keyframes (and for the 3d-view keyframe-indicator). There should be some theoretical improvements due to this at least...

source/blender/blenkernel/BKE_fcurve.h
source/blender/blenkernel/intern/fcurve.c
source/blender/editors/animation/keyframing.c
source/blender/editors/include/ED_keyframing.h
source/blender/editors/interface/interface_anim.c
source/blender/editors/space_nla/nla_draw.c

index 4dcb08dc0dfe0f6b224328cf9860e42973dda5cc..cda64c6b2416a7470d36032c408310e5dbad1e13 100644 (file)
@@ -153,9 +153,6 @@ void copy_fcurves(ListBase *dst, ListBase *src);
 /* find matching F-Curve in the given list of F-Curves */
 struct FCurve *list_find_fcurve(ListBase *list, const char rna_path[], const int array_index);
 
-/* test if there is a keyframe at cfra */
-short on_keyframe_fcurve(struct FCurve *fcu, float cfra);
-
 /* get the time extents for F-Curve */
 void calc_fcurve_range(struct FCurve *fcu, float *min, float *max);
 
index 4c2ba61fc71c4583a97c375e815209acf1715ca7..ebd94b94f8c777771a37f628f707ca78443cca28 100644 (file)
@@ -200,20 +200,6 @@ FCurve *list_find_fcurve (ListBase *list, const char rna_path[], const int array
        return NULL;
 }
 
-short on_keyframe_fcurve(FCurve *fcu, float cfra)
-{
-       BezTriple *bezt;
-       unsigned i;
-
-       bezt= fcu->bezt;
-       for (i=0; i<fcu->totvert; i++, bezt++) {
-               if (IS_EQ(bezt->vec[1][0], cfra))
-                       return 1;
-       }
-       
-       return 0;
-}
-
 /* Calculate the extents of F-Curve's data */
 void calc_fcurve_bounds (FCurve *fcu, float *xmin, float *xmax, float *ymin, float *ymax)
 {
index ac195f42f0300b73243aa9e93beee168a512edab..dd4c4c23f1ea6a0ff9e1ec7fc3097b1786f37018 100644 (file)
@@ -1430,6 +1430,31 @@ void ANIM_OT_delete_keyframe_button (wmOperatorType *ot)
 
 /* --------------- API/Per-Datablock Handling ------------------- */
 
+/* Checks if some F-Curve has a keyframe for a given frame */
+short fcurve_frame_has_keyframe (FCurve *fcu, float frame, short filter)
+{
+       /* quick sanity check */
+       if (fcu == NULL)
+               return 0;
+       
+       /* we either include all regardless of muting, or only non-muted  */
+       if ((filter & ANIMFILTER_KEYS_MUTED) || (fcu->flag & FCURVE_MUTED)==0) {
+               short replace = -1;
+               int i = binarysearch_bezt_index(fcu->bezt, frame, fcu->totvert, &replace);
+               
+               /* binarysearch_bezt_index will set replace to be 0 or 1
+                *      - obviously, 1 represents a match
+                */
+               if (replace) {                  
+                       /* sanity check: 'i' may in rare cases exceed arraylen */
+                       if ((i >= 0) && (i < fcu->totvert))
+                               return 1;
+               }
+       }
+       
+       return 0;
+}
+
 /* Checks whether an Action has a keyframe for a given frame 
  * Since we're only concerned whether a keyframe exists, we can simply loop until a match is found...
  */
@@ -1451,20 +1476,8 @@ short action_frame_has_keyframe (bAction *act, float frame, short filter)
        for (fcu= act->curves.first; fcu; fcu= fcu->next) {
                /* only check if there are keyframes (currently only of type BezTriple) */
                if (fcu->bezt && fcu->totvert) {
-                       /* we either include all regardless of muting, or only non-muted  */
-                       if ((filter & ANIMFILTER_KEYS_MUTED) || (fcu->flag & FCURVE_MUTED)==0) {
-                               short replace = -1;
-                               int i = binarysearch_bezt_index(fcu->bezt, frame, fcu->totvert, &replace);
-                               
-                               /* binarysearch_bezt_index will set replace to be 0 or 1
-                                *      - obviously, 1 represents a match
-                                */
-                               if (replace) {                  
-                                       /* sanity check: 'i' may in rare cases exceed arraylen */
-                                       if ((i >= 0) && (i < fcu->totvert))
-                                               return 1;
-                               }
-                       }
+                       if (fcurve_frame_has_keyframe(fcu, frame, filter))
+                               return 1;
                }
        }
        
index ffebb42ce99231657c49abce368addcd33e65390..503d71b0d3ec49f5d03b23f6828b20679b45a939 100644 (file)
@@ -199,6 +199,11 @@ void ANIM_OT_remove_driver_button(struct wmOperatorType *ot);
 
 /* ************ Keyframe Checking ******************** */
 
+/* Lesser Keyframe Checking API call:
+ *     - Used for the buttons to check for keyframes...
+ */
+short fcurve_frame_has_keyframe(struct FCurve *fcu, float frame, short filter);
+
 /* Main Keyframe Checking API call:
  * Checks whether a keyframe exists for the given ID-block one the given frame.
  *  - It is recommended to call this method over the other keyframe-checkers directly,
index 4a26db291603d8715bf3e566b85e830edd5b5a56..be4087de5255bbf0bd2a3d9eb8ae8f5994550d04 100644 (file)
@@ -18,6 +18,8 @@
 #include "RNA_access.h"
 #include "RNA_types.h"
 
+#include "ED_keyframing.h"
+
 #include "UI_interface.h"
 
 #include "WM_api.h"
@@ -47,7 +49,7 @@ void ui_but_anim_flag(uiBut *but, float cfra)
                                                if (fcu) {
                                                        but->flag |= UI_BUT_ANIMATED;
                                                        
-                                                       if (on_keyframe_fcurve(fcu, cfra))
+                                                       if (fcurve_frame_has_keyframe(fcu, cfra, 0))
                                                                but->flag |= UI_BUT_ANIMATED_KEY;
                                                }
                                        }
index 7b9f2faf08aa2aa6c7993f3cdbd1e8600331ba87..bbb666d01ccafbb5ab5409fae6580db511ee9329 100644 (file)
@@ -291,6 +291,9 @@ static void nla_draw_strip (AnimData *adt, NlaTrack *nlt, NlaStrip *strip, View2
        gl_round_box_shade(GL_POLYGON, strip->start, yminc, strip->end, ymaxc, 0.0, 0.5, 0.1);
        
        
+       /* draw influence 'curve' */
+       // TODO:
+       
        /* draw strip outline 
         *      - color used here is to indicate active vs non-active
         */
@@ -378,11 +381,9 @@ static void nla_draw_strip_text (NlaTrack *nlt, NlaStrip *strip, int index, View
                
                case NLASTRIP_TYPE_CLIP:        /* Action-Clip (default) */
                default:
-                       if (strip->act)
-                               sprintf(str, "%d | Act: %s | %.2f %s %.2f", 
-                                       index, strip->act->id.name+2, strip->start, dir, strip->end);
-                       else
-                               sprintf(str, "%d | Act: <NONE>", index); // xxx... need a better format?
+                       sprintf(str, "%d | Act: %s | %.2f %s %.2f", 
+                               index, ((strip->act)?strip->act->id.name+2:"<NONE>"), 
+                               strip->start, dir, strip->end);
                        break;
        }
        
@@ -396,9 +397,9 @@ static void nla_draw_strip_text (NlaTrack *nlt, NlaStrip *strip, int index, View
         *      - padding of 2 'units' on either side
         */
        // TODO: make this centered?
-       rect.xmin= strip->start + 2;
+       rect.xmin= strip->start + 0.5f;
        rect.ymin= yminc;
-       rect.xmax= strip->end - 2;
+       rect.xmax= strip->end - 0.5f;
        rect.ymax= ymaxc;
        
        /* add this string to the cache of texts to draw*/