Revision: 59427
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59427
Author:   mont29
Date:     2013-08-23 15:17:54 +0000 (Fri, 23 Aug 2013)
Log Message:
-----------
Fix [#36538] Discontinuity (Euler) Filter - never ends - (deadlock?)

Code could enter in an infinite loop when curve value was an odd multiple of PI 
(i.e. 180?\194?\176)...

Current code was also factorized and got rid of fabs calls! ;)

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_graph/graph_edit.c

Modified: trunk/blender/source/blender/editors/space_graph/graph_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_graph/graph_edit.c       
2013-08-23 14:51:20 UTC (rev 59426)
+++ trunk/blender/source/blender/editors/space_graph/graph_edit.c       
2013-08-23 15:17:54 UTC (rev 59427)
@@ -1676,7 +1676,7 @@
                /* FIXME: there are more complicated methods that will be 
needed to fix more cases than just some */
                for (f = 0; f < 3; f++) {
                        FCurve *fcu = euf->fcurves[f];
-                       BezTriple *bezt, *prev = NULL;
+                       BezTriple *bezt, *prev;
                        unsigned int i;
                        
                        /* skip if not enough vets to do a decent analysis 
of... */
@@ -1684,30 +1684,20 @@
                                continue;
                        
                        /* prev follows bezt, bezt = "current" point to be 
fixed */
-                       for (i = 0, bezt = fcu->bezt; i < fcu->totvert; i++, 
prev = bezt, bezt++) {
-                               /* our method depends on determining a 
"difference" from the previous vert */
-                               if (prev == NULL)
-                                       continue;
+                       /* our method depends on determining a "difference" 
from the previous vert */
+                       for (i = 1, prev = fcu->bezt, bezt = fcu->bezt + 1; i < 
fcu->totvert; i++, prev = bezt++) {
+                               const float sign = (prev->vec[1][1] > 
bezt->vec[1][1]) ? 1.0f : -1.0f;
                                
                                /* > 180 degree flip? */
-                               if (fabs(prev->vec[1][1] - bezt->vec[1][1]) >= 
M_PI) {
+                               if ((sign * (prev->vec[1][1] - 
bezt->vec[1][1])) >= (float)M_PI) {
                                        /* 360 degrees to add/subtract frame 
value until difference is acceptably small that there's no more flip */
-                                       const float fac = 2.0f * (float)M_PI;
+                                       const float fac = sign * 2.0f * 
(float)M_PI;
                                        
-                                       if (prev->vec[1][1] > bezt->vec[1][1]) {
-                                               while (fabsf(bezt->vec[1][1] - 
prev->vec[1][1]) >= (float)M_PI) {
-                                                       bezt->vec[0][1] += fac;
-                                                       bezt->vec[1][1] += fac;
-                                                       bezt->vec[2][1] += fac;
-                                               }
+                                       while ((sign * (prev->vec[1][1] - 
bezt->vec[1][1])) >= (float)M_PI) {
+                                               bezt->vec[0][1] += fac;
+                                               bezt->vec[1][1] += fac;
+                                               bezt->vec[2][1] += fac;
                                        }
-                                       else { /* if (prev->vec[1][1] < 
bezt->vec[1][1]) */
-                                               while (fabsf(bezt->vec[1][1] - 
prev->vec[1][1]) >= (float)M_PI) {
-                                                       bezt->vec[0][1] -= fac;
-                                                       bezt->vec[1][1] -= fac;
-                                                       bezt->vec[2][1] -= fac;
-                                               }
-                                       }
                                }
                        }
                }

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to