NLA (Un)Mapping Fixes:
authorJoshua Leung <aligorith@gmail.com>
Mon, 18 Jan 2010 00:35:28 +0000 (00:35 +0000)
committerJoshua Leung <aligorith@gmail.com>
Mon, 18 Jan 2010 00:35:28 +0000 (00:35 +0000)
Hopefully this time I've finally found the proper fix for this. At least in the mini test-suite I made for this, the new inverse process seemed stable enough.

---

Also, tweaked the keyframe drawing code so that it doesn't convert the handles too when performing NLA mapping. This should provide some minor speed boosts when drawing keyframes under these conditions...

source/blender/blenkernel/intern/nla.c
source/blender/editors/animation/keyframes_draw.c
source/blender/makesrna/intern/rna_nla.c

index 3979586fb19cc9d36398d7463c28aa345ddef0ae..c9008e91646da475168f3fd7524801aa1f792121 100644 (file)
@@ -369,14 +369,7 @@ static float nlastrip_get_frame_actionclip (NlaStrip *strip, float cframe, short
                        return strip->end - scale*(cframe - strip->actstart);
                }
                else if (mode == NLATIME_CONVERT_UNMAP) {
-                       int repeatsNum = (int)((cframe - strip->start) / (actlength * scale));
-                       
-                       /* this method doesn't clip the values to lie within the action range only 
-                        *      - the '(repeatsNum * actlength * scale)' compensates for the fmod(...)
-                        *      - the fmod(...) works in the same way as for eval 
-                        */
-                       return strip->actend - (repeatsNum * actlength * scale) 
-                                       - (fmod(cframe - strip->start, actlength*scale) / scale);
+                       return strip->actend - (strip->end - cframe) / scale;   
                }
                else /* if (mode == NLATIME_CONVERT_EVAL) */{
                        if (IS_EQ(cframe, strip->end) && IS_EQ(strip->repeat, ((int)strip->repeat))) {
@@ -399,14 +392,7 @@ static float nlastrip_get_frame_actionclip (NlaStrip *strip, float cframe, short
                        return strip->start + scale*(cframe - strip->actstart);
                }
                else if (mode == NLATIME_CONVERT_UNMAP) {
-                       int repeatsNum = (int)((cframe - strip->start) / (actlength * scale));
-                       
-                       /* this method doesn't clip the values to lie within the action range only 
-                        *      - the '(repeatsNum * actlength * scale)' compensates for the fmod(...)
-                        *      - the fmod(...) works in the same way as for eval 
-                        */
-                       return strip->actstart + (repeatsNum * actlength * scale) 
-                                       + (fmod(cframe - strip->start, actlength*scale) / scale);
+                       return strip->actstart + (cframe - strip->start) / scale;
                }
                else /* if (mode == NLATIME_CONVERT_EVAL) */{
                        if (IS_EQ(cframe, strip->end) && IS_EQ(strip->repeat, ((int)strip->repeat))) {
index 3a48aa0b06312c7890eb9b8404850e88c4f5c296..da1233c17f165c5d87e405ef0c1e3761d03746af 100644 (file)
@@ -855,7 +855,7 @@ void fcurve_to_keylist(AnimData *adt, FCurve *fcu, DLRBT_Tree *keys, DLRBT_Tree
        if (fcu && fcu->totvert && fcu->bezt) {
                /* apply NLA-mapping (if applicable) */
                if (adt)        
-                       ANIM_nla_mapping_apply_fcurve(adt, fcu, 0, 1);
+                       ANIM_nla_mapping_apply_fcurve(adt, fcu, 0, 0);
                
                /* if getting long keyframes too, grab the BezTriples in a BST for 
                 * accelerated searching...
@@ -892,7 +892,7 @@ void fcurve_to_keylist(AnimData *adt, FCurve *fcu, DLRBT_Tree *keys, DLRBT_Tree
                
                /* unapply NLA-mapping if applicable */
                if (adt)
-                       ANIM_nla_mapping_apply_fcurve(adt, fcu, 1, 1);
+                       ANIM_nla_mapping_apply_fcurve(adt, fcu, 1, 0);
        }
 }
 
index 79b34a4cfe38f789232064391afc819a368ca724..79e6d52766e8e3c2556dada491b1e33b72c8f501 100644 (file)
@@ -187,7 +187,7 @@ static void rna_NlaStrip_repeat_set(PointerRNA *ptr, float value)
        NlaStrip *data= (NlaStrip*)ptr->data;
        float actlen, mapping;
        
-       /* set scale value */
+       /* set repeat value */
        CLAMP(value, 0.01f, 1000.0f); /* NOTE: these need to be synced with the values in the property definition in rna_def_nlastrip() */
        data->repeat= value;