Revision: 21212
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21212
Author:   aligorith
Date:     2009-06-28 09:32:00 +0200 (Sun, 28 Jun 2009)

Log Message:
-----------
NLA SoC: NLA Mapping Cleanup 

While trying to fix the mapping conversions for repeat, I came across some 
limitations with the current (soon to be previous) mapping methods. 

Now the mapping conversions should work nicely for all places that use them.

Modified Paths:
--------------
    branches/soc-2009-aligorith/source/blender/blenkernel/BKE_nla.h
    branches/soc-2009-aligorith/source/blender/blenkernel/intern/anim_sys.c
    branches/soc-2009-aligorith/source/blender/blenkernel/intern/nla.c
    branches/soc-2009-aligorith/source/blender/blenkernel/nla_private.h
    branches/soc-2009-aligorith/source/blender/editors/animation/anim_draw.c
    
branches/soc-2009-aligorith/source/blender/editors/space_action/action_edit.c
    
branches/soc-2009-aligorith/source/blender/editors/space_action/action_select.c
    branches/soc-2009-aligorith/source/blender/editors/space_graph/graph_edit.c
    
branches/soc-2009-aligorith/source/blender/editors/space_graph/graph_select.c
    branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_edit.c
    
branches/soc-2009-aligorith/source/blender/editors/space_view3d/drawarmature.c
    branches/soc-2009-aligorith/source/blender/editors/transform/transform.c
    
branches/soc-2009-aligorith/source/blender/editors/transform/transform_conversions.c

Modified: branches/soc-2009-aligorith/source/blender/blenkernel/BKE_nla.h
===================================================================
--- branches/soc-2009-aligorith/source/blender/blenkernel/BKE_nla.h     
2009-06-28 07:26:16 UTC (rev 21211)
+++ branches/soc-2009-aligorith/source/blender/blenkernel/BKE_nla.h     
2009-06-28 07:32:00 UTC (rev 21212)
@@ -73,7 +73,22 @@
 short BKE_nla_tweakmode_enter(struct AnimData *adt);
 void BKE_nla_tweakmode_exit(struct AnimData *adt);
 
-float BKE_nla_tweakedit_remap(struct AnimData *adt, float cframe, short 
invert);
+/* ----------------------------- */
+/* Time Mapping */
 
+/* time mapping conversion modes */
+enum {
+               /* convert from global time to strip time - for evaluation */
+       NLATIME_CONVERT_EVAL = 0,
+               /* convert from global time to strip time - for editing 
corrections */
+               // XXX old 0 invert
+       NLATIME_CONVERT_UNMAP,
+               /* convert from strip time to global time */
+               // xxx old 1 invert
+       NLATIME_CONVERT_MAP,
+} eNlaTime_ConvertModes;
+
+float BKE_nla_tweakedit_remap(struct AnimData *adt, float cframe, short mode);
+
 #endif
 

Modified: 
branches/soc-2009-aligorith/source/blender/blenkernel/intern/anim_sys.c
===================================================================
--- branches/soc-2009-aligorith/source/blender/blenkernel/intern/anim_sys.c     
2009-06-28 07:26:16 UTC (rev 21211)
+++ branches/soc-2009-aligorith/source/blender/blenkernel/intern/anim_sys.c     
2009-06-28 07:32:00 UTC (rev 21212)
@@ -604,7 +604,7 @@
 {
        /* firstly, analytically generate values for influence and time (if 
applicable) */
        if ((strip->flag & NLASTRIP_FLAG_USR_TIME) == 0)
-               strip->strip_time= nlastrip_get_frame(strip, ctime, 0);
+               strip->strip_time= nlastrip_get_frame(strip, ctime, 
NLATIME_CONVERT_EVAL);
        if ((strip->flag & NLASTRIP_FLAG_USR_INFLUENCE) == 0)
                strip->influence= nlastrip_get_influence(strip, ctime);
        

Modified: branches/soc-2009-aligorith/source/blender/blenkernel/intern/nla.c
===================================================================
--- branches/soc-2009-aligorith/source/blender/blenkernel/intern/nla.c  
2009-06-28 07:26:16 UTC (rev 21211)
+++ branches/soc-2009-aligorith/source/blender/blenkernel/intern/nla.c  
2009-06-28 07:32:00 UTC (rev 21212)
@@ -329,7 +329,7 @@
 /* non clipped mapping for strip-time <-> global time (for Action-Clips)
  *     invert = convert action-strip time to global time 
  */
-static float nlastrip_get_frame_actionclip (NlaStrip *strip, float cframe, 
short invert)
+static float nlastrip_get_frame_actionclip (NlaStrip *strip, float cframe, 
short mode)
 {
        float actlength, repeat, scale;
        
@@ -347,9 +347,20 @@
        
        /* reversed = play strip backwards */
        if (strip->flag & NLASTRIP_FLAG_REVERSE) {
-               /* invert = convert action-strip time to global time */
-               if (invert)
-                       return scale*(strip->actend - cframe) + strip->start; 
// FIXME: this doesn't work for multiple repeats yet
+               // FIXME: this won't work right with Graph Editor?
+               if (mode == NLATIME_CONVERT_MAP) {
+                       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);
+               }
                else {
                        if (IS_EQ(cframe, strip->end) && IS_EQ(strip->repeat, 
((int)strip->repeat))) {
                                /* this case prevents the motion snapping back 
to the first frame at the end of the strip 
@@ -367,10 +378,20 @@
                }
        }
        else {
-               /* invert = convert action-strip time to global time */
-               if (invert)
-                       return scale*(cframe - strip->actstart) + strip->start; 
// FIXME: this doesn't work for mutiple repeats yet
-               else {
+               if (mode == NLATIME_CONVERT_MAP) {
+                       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);
+               }
+               else /* if (mode == NLATIME_CONVERT_EVAL) */{
                        if (IS_EQ(cframe, strip->end) && IS_EQ(strip->repeat, 
((int)strip->repeat))) {
                                /* this case prevents the motion snapping back 
to the first frame at the end of the strip 
                                 * by catching the case where repeats is a 
whole number, which means that the end of the strip
@@ -391,7 +412,7 @@
 /* non clipped mapping for strip-time <-> global time (for Transitions)
  *     invert = convert action-strip time to global time 
  */
-static float nlastrip_get_frame_transition (NlaStrip *strip, float cframe, 
short invert)
+static float nlastrip_get_frame_transition (NlaStrip *strip, float cframe, 
short mode)
 {
        float length;
        
@@ -400,15 +421,13 @@
        
        /* reversed = play strip backwards */
        if (strip->flag & NLASTRIP_FLAG_REVERSE) {
-               /* invert = convert within-strip-time to global time */
-               if (invert)
+               if (mode == NLATIME_CONVERT_MAP)
                        return strip->end - (length * cframe);
                else
                        return (strip->end - cframe) / length;
        }
        else {
-               /* invert = convert within-strip-time to global time */
-               if (invert)
+               if (mode == NLATIME_CONVERT_MAP)
                        return (length * cframe) + strip->start;
                else
                        return (cframe - strip->start) / length;
@@ -416,31 +435,31 @@
 }
 
 /* non clipped mapping for strip-time <-> global time
- *     invert = convert action-strip time to global time 
+ *     mode = eNlaTime_ConvertModes[] -> NLATIME_CONVERT_*
  *
  * only secure for 'internal' (i.e. within AnimSys evaluation) operations,
  * but should not be directly relied on for stuff which interacts with editors
  */
-float nlastrip_get_frame (NlaStrip *strip, float cframe, short invert)
+float nlastrip_get_frame (NlaStrip *strip, float cframe, short mode)
 {
        switch (strip->type) {
                case NLASTRIP_TYPE_TRANSITION: /* transition */
-                       return nlastrip_get_frame_transition(strip, cframe, 
invert);
+                       return nlastrip_get_frame_transition(strip, cframe, 
mode);
                
                case NLASTRIP_TYPE_CLIP: /* action-clip (default) */
                default:
-                       return nlastrip_get_frame_actionclip(strip, cframe, 
invert);
+                       return nlastrip_get_frame_actionclip(strip, cframe, 
mode);
        }       
 }
 
 
 /* Non clipped mapping for strip-time <-> global time
- *     invert = convert strip-time to global time 
+ *     mode = eNlaTime_ConvertModesp[] -> NLATIME_CONVERT_*
  *
  * Public API method - perform this mapping using the given AnimData block
  * and perform any necessary sanity checks on the value
  */
-float BKE_nla_tweakedit_remap (AnimData *adt, float cframe, short invert)
+float BKE_nla_tweakedit_remap (AnimData *adt, float cframe, short mode)
 {
        NlaStrip *strip;
        
@@ -469,7 +488,7 @@
                return cframe;
                
        /* perform the correction now... */
-       return nlastrip_get_frame(strip, cframe, invert);
+       return nlastrip_get_frame(strip, cframe, mode);
 }
 
 /* *************************************************** */

Modified: branches/soc-2009-aligorith/source/blender/blenkernel/nla_private.h
===================================================================
--- branches/soc-2009-aligorith/source/blender/blenkernel/nla_private.h 
2009-06-28 07:26:16 UTC (rev 21211)
+++ branches/soc-2009-aligorith/source/blender/blenkernel/nla_private.h 
2009-06-28 07:32:00 UTC (rev 21212)
@@ -73,6 +73,7 @@
 /* --------------- NLA Functions (not to be used as a proper API) 
----------------------- */
 
 /* convert from strip time <-> global time */
-float nlastrip_get_frame(NlaStrip *strip, float cframe, short invert);
+float nlastrip_get_frame(NlaStrip *strip, float cframe, short mode);
 
+
 #endif // NLA_PRIVATE

Modified: 
branches/soc-2009-aligorith/source/blender/editors/animation/anim_draw.c
===================================================================
--- branches/soc-2009-aligorith/source/blender/editors/animation/anim_draw.c    
2009-06-28 07:26:16 UTC (rev 21211)
+++ branches/soc-2009-aligorith/source/blender/editors/animation/anim_draw.c    
2009-06-28 07:32:00 UTC (rev 21212)
@@ -270,8 +270,8 @@
                gla2DGetMap(di, &stored);
                map= stored;
                
-               map.xmin= BKE_nla_tweakedit_remap(adt, map.xmin, 0);
-               map.xmax= BKE_nla_tweakedit_remap(adt, map.xmax, 0);
+               map.xmin= BKE_nla_tweakedit_remap(adt, map.xmin, 
NLATIME_CONVERT_MAP);
+               map.xmax= BKE_nla_tweakedit_remap(adt, map.xmax, 
NLATIME_CONVERT_MAP);
                
                if (map.xmin == map.xmax) map.xmax += 1.0f;
                gla2DSetMap(di, &map);
@@ -289,11 +289,11 @@
        
        /* adjust BezTriple handles only if allowed to */
        if (only_keys == 0) {
-               bezt->vec[0][0]= BKE_nla_tweakedit_remap(adt, bezt->vec[0][0], 
0);
-               bezt->vec[2][0]= BKE_nla_tweakedit_remap(adt, bezt->vec[2][0], 
0);
+               bezt->vec[0][0]= BKE_nla_tweakedit_remap(adt, bezt->vec[0][0], 
NLATIME_CONVERT_UNMAP);
+               bezt->vec[2][0]= BKE_nla_tweakedit_remap(adt, bezt->vec[2][0], 
NLATIME_CONVERT_UNMAP);
        }
        
-       bezt->vec[1][0]= BKE_nla_tweakedit_remap(adt, bezt->vec[1][0], 0);
+       bezt->vec[1][0]= BKE_nla_tweakedit_remap(adt, bezt->vec[1][0], 
NLATIME_CONVERT_UNMAP);
        
        return 0;
 }
@@ -307,11 +307,11 @@
        
        /* adjust BezTriple handles only if allowed to */
        if (only_keys == 0) {
-               bezt->vec[0][0]= BKE_nla_tweakedit_remap(adt, bezt->vec[0][0], 
1);
-               bezt->vec[2][0]= BKE_nla_tweakedit_remap(adt, bezt->vec[2][0], 
1);
+               bezt->vec[0][0]= BKE_nla_tweakedit_remap(adt, bezt->vec[0][0], 
NLATIME_CONVERT_MAP);
+               bezt->vec[2][0]= BKE_nla_tweakedit_remap(adt, bezt->vec[2][0], 
NLATIME_CONVERT_MAP);
        }
        
-       bezt->vec[1][0]= BKE_nla_tweakedit_remap(adt, bezt->vec[1][0], 1);
+       bezt->vec[1][0]= BKE_nla_tweakedit_remap(adt, bezt->vec[1][0], 
NLATIME_CONVERT_MAP);
        
        return 0;
 }

Modified: 
branches/soc-2009-aligorith/source/blender/editors/space_action/action_edit.c
===================================================================
--- 
branches/soc-2009-aligorith/source/blender/editors/space_action/action_edit.c   
    2009-06-28 07:26:16 UTC (rev 21211)
+++ 
branches/soc-2009-aligorith/source/blender/editors/space_action/action_edit.c   
    2009-06-28 07:32:00 UTC (rev 21212)

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to