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