NLA SoC: Start of integration of Meta-strips in Transform
authorJoshua Leung <aligorith@gmail.com>
Tue, 7 Jul 2009 02:12:50 +0000 (02:12 +0000)
committerJoshua Leung <aligorith@gmail.com>
Tue, 7 Jul 2009 02:12:50 +0000 (02:12 +0000)
* Chains of selected strips are now converted to meta-strips before transforms begin, and converted back afterwards. This simplifies the transform code needed in later stages...

* Transform-flushing code for Meta-Strips should now work. There seems to be a little bit of numeric inaccuracy problems somewhere, as two strips which met at the same frame can get separated when scaling.

* Meta-strips now draw with proper text identification

* Snapping strips now properly clears meta-strips if a moved strip needs to be moved into a new track to be accomodated.

* Fixed a filter used by a selection-operator.

source/blender/blenkernel/intern/nla.c
source/blender/editors/space_nla/nla_draw.c
source/blender/editors/space_nla/nla_edit.c
source/blender/editors/space_nla/nla_select.c
source/blender/editors/transform/transform_conversions.c
source/blender/editors/transform/transform_generics.c

index a83fa0a..851a0d7 100644 (file)
@@ -781,6 +781,8 @@ void BKE_nlameta_flush_transforms (NlaStrip *mstrip)
 {
        NlaStrip *strip;
        float oStart, oEnd, offset;
+       float oLen, nLen;
+       short scaleChanged= 0;
        
        /* sanity checks 
         *      - strip must exist
@@ -806,16 +808,43 @@ void BKE_nlameta_flush_transforms (NlaStrip *mstrip)
        if (IS_EQ(oStart, mstrip->start) && IS_EQ(oEnd, mstrip->end))
                return;
        
+       /* check if scale changed */
+       oLen = oEnd - oStart;
+       nLen = mstrip->end - mstrip->start;
+       if (IS_EQ(nLen, oLen) == 0)
+               scaleChanged= 1;
+       
        /* for each child-strip, calculate new start/end points based on this new info */
        for (strip= mstrip->strips.first; strip; strip= strip->next) {
-               //PointerRNA strip_ptr;
-               
-               /* firstly, just apply the changes in offset to both ends of the strip */
-               strip->start += offset;
-               strip->end += offset;
-               
-               /* now, we need to fix the endpoint to take into account scaling */
-               // TODO..
+               if (scaleChanged) {
+                       PointerRNA ptr;
+                       float p1, p2, nStart, nEnd;
+                       
+                       /* compute positions of endpoints relative to old extents of strip */
+                       p1= (strip->start - oStart) / oLen;
+                       p2= (strip->end - oStart) / oLen;
+                       
+                       /* compute the new strip endpoints using the proportions */
+                       nStart= (p1 * nLen) + mstrip->start;
+                       nEnd= (p2 * nLen) + mstrip->start;
+                       
+                       /* firstly, apply the new positions manually, then apply using RNA 
+                        *      - first time is to make sure no truncation errors from one endpoint not being 
+                        *        set yet occur
+                        *      - second time is to make sure scale is computed properly...
+                        */
+                       strip->start= nStart;
+                       strip->end= nEnd;
+                       
+                       RNA_pointer_create(NULL, &RNA_NlaStrip, strip, &ptr);
+                       RNA_float_set(&ptr, "start_frame", nStart);
+                       RNA_float_set(&ptr, "end_frame", nEnd);
+               }
+               else {
+                       /* just apply the changes in offset to both ends of the strip */
+                       strip->start += offset;
+                       strip->end += offset;
+               }
                
                /* finally, make sure the strip's children (if it is a meta-itself), get updated */
                BKE_nlameta_flush_transforms(strip);
index e31aebf..7b9f2fa 100644 (file)
@@ -366,13 +366,21 @@ static void nla_draw_strip_text (NlaTrack *nlt, NlaStrip *strip, int index, View
        /* for now, just init the string with fixed-formats */
        switch (strip->type) {
                case NLASTRIP_TYPE_TRANSITION: /* Transition */
-                       sprintf(str, "%d | Transition | %.2f %s %.2f", index, strip->start, dir, strip->end);
+                       sprintf(str, "%d | Transition | %.2f %s %.2f", 
+                               index, strip->start, dir, strip->end);
+                       break;
+                       
+               case NLASTRIP_TYPE_META: /* Meta */
+                       sprintf(str, "%d | %sMeta | %.2f %s %.2f", 
+                               index, ((strip->flag & NLASTRIP_FLAG_TEMP_META)?"Temp-":""), 
+                               strip->start, dir, strip->end);
                        break;
                
                case NLASTRIP_TYPE_CLIP:        /* Action-Clip (default) */
                default:
                        if (strip->act)
-                               sprintf(str, "%d | Act: %s | %.2f %s %.2f", index, strip->act->id.name+2, strip->start, dir, strip->end);
+                               sprintf(str, "%d | Act: %s | %.2f %s %.2f", 
+                                       index, strip->act->id.name+2, strip->start, dir, strip->end);
                        else
                                sprintf(str, "%d | Act: <NONE>", index); // xxx... need a better format?
                        break;
index 676d0aa..d663b76 100644 (file)
@@ -1264,6 +1264,9 @@ static int nlaedit_snap_exec (bContext *C, wmOperator *op)
                                /* need to add a new track above the current one */
                                track= add_nlatrack(adt, nlt);
                                BKE_nlatrack_add_strip(track, strip);
+                               
+                               /* clear temp meta-strips on this new track, as we may not be able to get back to it */
+                               BKE_nlastrips_clear_metas(&track->strips, 0, 1);
                        }
                }
                
index c238818..ca186dc 100644 (file)
@@ -513,7 +513,7 @@ static void nlaedit_mselect_leftright (bContext *C, bAnimContext *ac, short left
        
        
        /* filter data */
-       filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY);
+       filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NLATRACKS);
        ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
        
        /* select strips on the side where most data occurs */
index b2afaac..758be54 100644 (file)
@@ -2617,6 +2617,9 @@ static void createTransNlaData(bContext *C, TransInfo *t)
                NlaTrack *nlt= (NlaTrack *)ale->data;
                NlaStrip *strip;
                
+               /* make some meta-strips for chains of selected strips */
+               BKE_nlastrips_make_metas(&nlt->strips, 1);
+               
                /* only consider selected strips */
                for (strip= nlt->strips.first; strip; strip= strip->next) {
                        // TODO: we can make strips have handles later on...
@@ -4754,6 +4757,26 @@ void special_aftertrans_update(TransInfo *t)
                if (ANIM_animdata_context_getdata(&ac) == 0)
                        return;
                
+               if (ac.datatype) 
+               {
+                       ListBase anim_data = {NULL, NULL};
+                       bAnimListElem *ale;
+                       short filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_NLATRACKS);
+                       
+                       /* get channels to work on */
+                       ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+                       
+                       for (ale= anim_data.first; ale; ale= ale->next) {
+                               NlaTrack *nlt= (NlaTrack *)ale->data;
+                               
+                               /* remove the temp metas */
+                               BKE_nlastrips_clear_metas(&nlt->strips, 0, 1);
+                       }
+                       
+                       /* free temp memory */
+                       BLI_freelistN(&anim_data);
+               }
+               
                // XXX check on the calls below... we need some of these sanity checks
                //synchronize_action_strips();
                //ANIM_editkeyframes_refresh(&ac);
index 1474a30..e228dc2 100644 (file)
@@ -82,6 +82,7 @@
 #include "BKE_key.h"
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
+#include "BKE_nla.h"
 #include "BKE_object.h"
 #include "BKE_utildefines.h"
 #include "BKE_context.h"
@@ -388,6 +389,20 @@ void recalcData(TransInfo *t)
                                }
                        }
                }
+               
+               /* loop over the TransDataNla again, flushing the transforms (since we use Metas to make transforms easier) */
+               td= t->data;
+               for (i = 0; i < t->total; i++, td++)
+               {
+                       if (td->extra)
+                       {
+                               TransDataNla *tdn= td->extra;
+                               NlaStrip *strip= tdn->strip;
+                               
+                               // TODO: this may flush some things twice, but that's fine as there's no impact from that
+                               BKE_nlameta_flush_transforms(strip);
+                       }
+               }
        }
        else if (t->obedit) {
                if ELEM(t->obedit->type, OB_CURVE, OB_SURF) {