Regression Bugfix T40332: Bad driver behaviour on small distances.
authorJoshua Leung <aligorith@gmail.com>
Wed, 11 Jun 2014 03:48:43 +0000 (15:48 +1200)
committerJoshua Leung <aligorith@gmail.com>
Wed, 11 Jun 2014 03:49:12 +0000 (15:49 +1200)
!!! ANIMATORS/RIGGERS PLEASE TEST !!!

I've reduced the size of the threshold for the keyframe lookup here. This threshold
determines the minimum time in frames between keyframes (i.e. "how close" to each
other they can get). Making this too small causes problems like T39207, but it seems
that the threshold we've been using makes it impossible to get accurate behaviour on
driver curves with keyframes, when the driver target only moves 2cm (i.e. 0.02 BU).

So far, all of the test cases from T39207 seem to work fine, as well as Caminandes 2
files, and Kenny the Caterpillar. The Kiribati rigs/shots (thanks jpbouza for helping
to check on these!) also seem to be fine.

source/blender/blenkernel/intern/fcurve.c

index 65b9d2159df9ac994d0eb161720c732d0a271bc1..d7d46427b8c91de89dedb1e30de48c3abc7c4565 100644 (file)
@@ -2050,8 +2050,14 @@ static float fcurve_eval_keyframes(FCurve *fcu, BezTriple *bezts, float evaltime
                /* evaltime occurs somewhere in the middle of the curve */
                bool exact = false;
                
-               /* - use binary search to find appropriate keyframes */
-               a = binarysearch_bezt_index_ex(bezts, evaltime, fcu->totvert, 0.001, &exact);
+               /* Use binary search to find appropriate keyframes...
+                * 
+                * The threshold here has the following constraints:
+                *    - 0.001   is too coarse   -> We get artifacts with 2cm driver movements at 1BU = 1m (see T40332)
+                *    - 0.00001 is too fine     -> Weird errors, like selecting the wrong keyframe range (see T39207), occur.
+                *                                 This lower bound was established in b888a32eee8147b028464336ad2404d8155c64dd
+                */
+               a = binarysearch_bezt_index_ex(bezts, evaltime, fcu->totvert, 0.0001, &exact);
                if (G.debug & G_DEBUG) printf("eval fcurve '%s' - %f => %d/%d, %d\n", fcu->rna_path, evaltime, a, fcu->totvert, exact);
                
                if (exact) {