Revision: 41245
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41245
Author:   campbellbarton
Date:     2011-10-24 12:26:14 +0000 (Mon, 24 Oct 2011)
Log Message:
-----------
fix [#28961] FCurves.range() returns wrong values for one-point curves (sic!)
also fix for case where verts were treated as found but were infact not because 
none were selected.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_fcurve.h
    trunk/blender/source/blender/blenkernel/intern/action.c
    trunk/blender/source/blender/blenkernel/intern/fcurve.c
    trunk/blender/source/blender/editors/space_action/action_edit.c
    trunk/blender/source/blender/makesrna/intern/rna_fcurve.c

Modified: trunk/blender/source/blender/blenkernel/BKE_fcurve.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_fcurve.h        2011-10-24 
10:26:37 UTC (rev 41244)
+++ trunk/blender/source/blender/blenkernel/BKE_fcurve.h        2011-10-24 
12:26:14 UTC (rev 41245)
@@ -213,10 +213,12 @@
 int binarysearch_bezt_index(struct BezTriple array[], float frame, int 
arraylen, short *replace);
 
 /* get the time extents for F-Curve */
-void calc_fcurve_range(struct FCurve *fcu, float *min, float *max, const short 
selOnly);
+void calc_fcurve_range(struct FCurve *fcu, float *min, float *max,
+                       const short do_sel_only, const short do_min_length);
 
 /* get the bounding-box extents for F-Curve */
-void calc_fcurve_bounds(struct FCurve *fcu, float *xmin, float *xmax, float 
*ymin, float *ymax, const short selOnly);
+void calc_fcurve_bounds(struct FCurve *fcu, float *xmin, float *xmax, float 
*ymin, float *ymax,
+                        const short do_sel_only);
 
 /* .............. */
 

Modified: trunk/blender/source/blender/blenkernel/intern/action.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/action.c     2011-10-24 
10:26:37 UTC (rev 41244)
+++ trunk/blender/source/blender/blenkernel/intern/action.c     2011-10-24 
12:26:14 UTC (rev 41245)
@@ -881,7 +881,7 @@
                                
                                /* get extents for this curve */
                                // TODO: allow enabling/disabling this?
-                               calc_fcurve_range(fcu, &nmin, &nmax, FALSE);
+                               calc_fcurve_range(fcu, &nmin, &nmax, FALSE, 
TRUE);
                                
                                /* compare to the running tally */
                                min= MIN2(min, nmin);

Modified: trunk/blender/source/blender/blenkernel/intern/fcurve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/fcurve.c     2011-10-24 
10:26:37 UTC (rev 41244)
+++ trunk/blender/source/blender/blenkernel/intern/fcurve.c     2011-10-24 
12:26:14 UTC (rev 41245)
@@ -433,7 +433,8 @@
 /* ...................................... */
 
 /* helper for calc_fcurve_* functions -> find first and last BezTriple to be 
used */
-static void get_fcurve_end_keyframes (FCurve *fcu, BezTriple **first, 
BezTriple **last, const short selOnly)
+static void get_fcurve_end_keyframes (FCurve *fcu, BezTriple **first, 
BezTriple **last,
+                                      const short do_sel_only)
 {
        /* init outputs */
        *first = NULL;
@@ -444,7 +445,7 @@
                return;
        
        /* only include selected items? */
-       if (selOnly) {
+       if (do_sel_only) {
                BezTriple *bezt;
                unsigned int i;
                
@@ -475,11 +476,12 @@
 
 
 /* Calculate the extents of F-Curve's data */
-void calc_fcurve_bounds (FCurve *fcu, float *xmin, float *xmax, float *ymin, 
float *ymax, const short selOnly)
+void calc_fcurve_bounds (FCurve *fcu, float *xmin, float *xmax, float *ymin, 
float *ymax,
+                         const short do_sel_only)
 {
        float xminv=999999999.0f, xmaxv=-999999999.0f;
        float yminv=999999999.0f, ymaxv=-999999999.0f;
-       short foundvert=0;
+       short foundvert= FALSE;
        unsigned int i;
        
        if (fcu->totvert) {
@@ -488,7 +490,7 @@
                        
                        if (xmin || xmax) {
                                /* get endpoint keyframes */
-                               get_fcurve_end_keyframes(fcu, &bezt_first, 
&bezt_last, selOnly);
+                               get_fcurve_end_keyframes(fcu, &bezt_first, 
&bezt_last, do_sel_only);
                                
                                if (bezt_first) {
                                        BLI_assert(bezt_last != NULL);
@@ -503,11 +505,12 @@
                                BezTriple *bezt;
                                
                                for (bezt=fcu->bezt, i=0; i < fcu->totvert; 
bezt++, i++) {
-                                       if ((selOnly == 0) || 
BEZSELECTED(bezt)) {
+                                       if ((do_sel_only == 0) || 
BEZSELECTED(bezt)) {
                                                if (bezt->vec[1][1] < yminv)
                                                        yminv= bezt->vec[1][1];
                                                if (bezt->vec[1][1] > ymaxv)
                                                        ymaxv= bezt->vec[1][1];
+                                               foundvert= TRUE;
                                        }
                                }
                        }
@@ -528,11 +531,11 @@
                                                yminv= fpt->vec[1];
                                        if (fpt->vec[1] > ymaxv)
                                                ymaxv= fpt->vec[1];
+
+                                       foundvert= TRUE;
                                }
                        }
                }
-               
-               foundvert=1;
        }
        
        if (foundvert) {
@@ -555,43 +558,50 @@
 }
 
 /* Calculate the extents of F-Curve's keyframes */
-void calc_fcurve_range (FCurve *fcu, float *start, float *end, const short 
selOnly)
+void calc_fcurve_range (FCurve *fcu, float *start, float *end,
+                        const short do_sel_only, const short do_min_length)
 {
        float min=999999999.0f, max=-999999999.0f;
-       short foundvert=0;
+       short foundvert= FALSE;
 
        if (fcu->totvert) {
                if (fcu->bezt) {
                        BezTriple *bezt_first= NULL, *bezt_last= NULL;
                        
                        /* get endpoint keyframes */
-                       get_fcurve_end_keyframes(fcu, &bezt_first, &bezt_last, 
selOnly);
-                       
+                       get_fcurve_end_keyframes(fcu, &bezt_first, &bezt_last, 
do_sel_only);
+
                        if (bezt_first) {
                                BLI_assert(bezt_last != NULL);
-                               
+
                                min= MIN2(min, bezt_first->vec[1][0]);
                                max= MAX2(max, bezt_last->vec[1][0]);
+
+                               foundvert= TRUE;
                        }
                }
                else if (fcu->fpt) {
                        min= MIN2(min, fcu->fpt[0].vec[0]);
                        max= MAX2(max, fcu->fpt[fcu->totvert-1].vec[0]);
+
+                       foundvert= TRUE;
                }
                
-               foundvert=1;
        }
        
-       /* minimum length is 1 frame */
-       if (foundvert) {
-               if (min == max) max += 1.0f;
-               *start= min;
-               *end= max;
+       if (foundvert == FALSE) {
+               min= max= 0.0f;
        }
-       else {
-               *start= 0.0f;
-               *end= 1.0f;
+
+       if (do_min_length) {
+               /* minimum length is 1 frame */
+               if (min == max) {
+                       max += 1.0f;
+               }
        }
+
+       *start= min;
+       *end= max;
 }
 
 /* ----------------- Status Checks -------------------------- */

Modified: trunk/blender/source/blender/editors/space_action/action_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_action/action_edit.c     
2011-10-24 10:26:37 UTC (rev 41244)
+++ trunk/blender/source/blender/editors/space_action/action_edit.c     
2011-10-24 12:26:14 UTC (rev 41245)
@@ -261,7 +261,7 @@
                                float tmin, tmax;
 
                                /* get range and apply necessary scaling before 
processing */
-                               calc_fcurve_range(fcu, &tmin, &tmax, onlySel);
+                               calc_fcurve_range(fcu, &tmin, &tmax, onlySel, 
TRUE);
 
                                if (adt) {
                                        tmin= BKE_nla_tweakedit_remap(adt, 
tmin, NLATIME_CONVERT_MAP);

Modified: trunk/blender/source/blender/makesrna/intern/rna_fcurve.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_fcurve.c   2011-10-24 
10:26:37 UTC (rev 41244)
+++ trunk/blender/source/blender/makesrna/intern/rna_fcurve.c   2011-10-24 
12:26:14 UTC (rev 41245)
@@ -621,7 +621,7 @@
 
 static void rna_fcurve_range(FCurve *fcu, float range[2])
 {
-       calc_fcurve_range(fcu, range, range+1, FALSE);
+       calc_fcurve_range(fcu, range, range+1, FALSE, FALSE);
 }
 
 #else

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

Reply via email to