Revision: 21381
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21381
Author:   aligorith
Date:     2009-07-06 13:06:34 +0200 (Mon, 06 Jul 2009)

Log Message:
-----------
NLA SoC: More work on Meta-Strips 

* Added several API functions for Meta-Strips editing. One of these (flush 
transform) still needs a few tweaks before it does its job well enough for all 
cases.

* Meta strips are now drawn with a purple-ish colour. The start/end points of 
the strips they encompass are shown with lines along the length of the strips, 
with lines starting from the top indicating start-points and lines starting 
from the bottom indicating end-points.

* Meta strips can be made (i.e. strips can be assigned to meta-strips) by 
selecting some strips and pressing Shift-G. 
Meta strips can be removed by selecting some meta-strips and pressing Alt-G.

* Strips can now be 'snapped' to start from: the current frame, the nearest 
frame, the nearest second, or the nearest marker; using the Shift-S hotkey. 
'Islands' of adjacent selected strips occurring in the same track are moved 
together as a single strip so that the start-point of the first strip is on the 
sepcified time, but all the relative lengths of strips stay the same. 
Internally, temporary meta-strips are created to facilitate this.

Modified Paths:
--------------
    branches/soc-2009-aligorith/source/blender/blenkernel/BKE_nla.h
    branches/soc-2009-aligorith/source/blender/blenkernel/intern/nla.c
    branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_draw.c
    branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_edit.c
    branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_header.c
    branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_intern.h
    branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_ops.c
    branches/soc-2009-aligorith/source/blender/makesdna/DNA_anim_types.h
    branches/soc-2009-aligorith/source/blender/makesrna/intern/rna_nla.c

Modified: branches/soc-2009-aligorith/source/blender/blenkernel/BKE_nla.h
===================================================================
--- branches/soc-2009-aligorith/source/blender/blenkernel/BKE_nla.h     
2009-07-06 10:45:14 UTC (rev 21380)
+++ branches/soc-2009-aligorith/source/blender/blenkernel/BKE_nla.h     
2009-07-06 11:06:34 UTC (rev 21381)
@@ -58,6 +58,12 @@
 
 short BKE_nlastrips_add_strip(ListBase *strips, struct NlaStrip *strip);
 
+
+void BKE_nlastrips_make_metas(ListBase *strips, short temp);
+void BKE_nlastrips_clear_metas(ListBase *strips, short onlySel, short 
onlyTemp);
+short BKE_nlameta_add_strip(struct NlaStrip *mstrip, struct NlaStrip *strip);
+void BKE_nlameta_flush_transforms(struct NlaStrip *mstrip);
+
 /* ............ */
 
 struct NlaTrack *BKE_nlatrack_find_active(ListBase *tracks);

Modified: branches/soc-2009-aligorith/source/blender/blenkernel/intern/nla.c
===================================================================
--- branches/soc-2009-aligorith/source/blender/blenkernel/intern/nla.c  
2009-07-06 10:45:14 UTC (rev 21380)
+++ branches/soc-2009-aligorith/source/blender/blenkernel/intern/nla.c  
2009-07-06 11:06:34 UTC (rev 21381)
@@ -616,6 +616,199 @@
        return 1;
 }
 
+
+/* Meta-Strips ------------------------------------ */
+
+/* Convert 'islands' (i.e. continuous string of) selected strips to be
+ * contained within 'Meta-Strips' which act as strips which contain strips.
+ *     temp: are the meta-strips to be created 'temporary' ones used for 
transforms?
+ */
+void BKE_nlastrips_make_metas (ListBase *strips, short temp)
+{
+       NlaStrip *mstrip = NULL;
+       NlaStrip *strip, *stripn;
+       
+       /* sanity checks */
+       if ELEM(NULL, strips, strips->first)
+               return;
+       
+       /* group all continuous chains of selected strips into meta-strips */
+       for (strip= strips->first; strip; strip= stripn) {
+               stripn= strip->next;
+               
+               if (strip->flag & NLASTRIP_FLAG_SELECT) {
+                       /* if there is an existing meta-strip, add this strip 
to it, otherwise, create a new one */
+                       if (mstrip == NULL) {
+                               /* add a new meta-strip, and add it before the 
current strip that it will replace... */
+                               mstrip= MEM_callocN(sizeof(NlaStrip), 
"Meta-NlaStrip");
+                               mstrip->type = NLASTRIP_TYPE_META;
+                               BLI_insertlinkbefore(strips, strip, mstrip);
+                               
+                               /* set flags */
+                               mstrip->flag = NLASTRIP_FLAG_SELECT;
+                               
+                               /* set temp flag if appropriate (i.e. for 
transform-type editing) */
+                               if (temp)
+                                       mstrip->flag |= NLASTRIP_FLAG_TEMP_META;
+                               
+                               /* make its start frame be set to the start 
frame of the current strip */
+                               mstrip->start= strip->start;
+                       }
+                       
+                       /* remove the selected strips from the track, and add 
to the meta */
+                       BLI_remlink(strips, strip);
+                       BLI_addtail(&mstrip->strips, strip);
+                       
+                       /* expand the meta's dimensions to include the newly 
added strip- i.e. its last frame */
+                       mstrip->end= strip->end;
+               }
+               else {
+                       /* current strip wasn't selected, so the end of 
'island' of selected strips has been reached,
+                        * so stop adding strips to the current meta
+                        */
+                       mstrip= NULL;
+               }
+       }
+}
+
+/* Remove meta-strips (i.e. flatten the list of strips) from the top-level of 
the list of strips
+ *     sel: only consider selected meta-strips, otherwise all meta-strips are 
removed
+ *     onlyTemp: only remove the 'temporary' meta-strips used for transforms
+ */
+void BKE_nlastrips_clear_metas (ListBase *strips, short onlySel, short 
onlyTemp)
+{
+       NlaStrip *strip, *stripn;
+       
+       /* sanity checks */
+       if ELEM(NULL, strips, strips->first)
+               return;
+       
+       /* remove meta-strips fitting the criteria of the arguments */
+       for (strip= strips->first; strip; strip= stripn) {
+               stripn= strip->next;
+               
+               /* check if strip is a meta-strip */
+               if (strip->type == NLASTRIP_TYPE_META) {
+                       /* if check if selection and 'temporary-only' 
considerations are met */
+                       if ((onlySel==0) || (strip->flag & 
NLASTRIP_FLAG_SELECT)) {
+                               if ((!onlyTemp) || (strip->flag & 
NLASTRIP_FLAG_TEMP_META)) {
+                                       NlaStrip *cs, *csn;
+                                       
+                                       /* move each one of the meta-strip's 
children before the meta-strip
+                                        * in the list of strips after 
unlinking them from the meta-strip
+                                        */
+                                       for (cs= strip->strips.first; cs; cs= 
csn) {
+                                               csn= cs->next;
+                                               BLI_remlink(&strip->strips, cs);
+                                               BLI_insertlinkbefore(strips, 
strip, cs);
+                                       }
+                                       
+                                       /* free the meta-strip now */
+                                       BLI_freelinkN(strips, strip);
+                               }
+                       }
+               }
+       }
+}
+
+/* Add the given NLA-Strip to the given Meta-Strip, assuming that the
+ * strip isn't attached to anyy list of strips 
+ */
+short BKE_nlameta_add_strip (NlaStrip *mstrip, NlaStrip *strip)
+{
+       /* sanity checks */
+       if ELEM(NULL, mstrip, strip)
+               return 0;
+               
+       /* firstly, check if the meta-strip has space for this */
+       if (BKE_nlastrips_has_space(&mstrip->strips, strip->start, strip->end) 
== 0)
+               return 0;
+               
+       /* check if this would need to be added to the ends of the meta,
+        * and subsequently, if the neighbouring strips allow us enough room
+        */
+       if (strip->start < mstrip->start) {
+               /* check if strip to the left (if it exists) ends before the 
+                * start of the strip we're trying to add 
+                */
+               if ((mstrip->prev == NULL) || (mstrip->prev->end <= 
strip->start)) {
+                       /* add strip to start of meta's list, and expand 
dimensions */
+                       BLI_addhead(&mstrip->strips, strip);
+                       mstrip->start= strip->start;
+                       
+                       return 1;
+               }
+               else /* failed... no room before */
+                       return 0;
+       }
+       else if (strip->end > mstrip->end) {
+               /* check if strip to the right (if it exists) starts before the 
+                * end of the strip we're trying to add 
+                */
+               if ((mstrip->next == NULL) || (mstrip->next->start >= 
strip->end)) {
+                       /* add strip to end of meta's list, and expand 
dimensions */
+                       BLI_addtail(&mstrip->strips, strip);
+                       mstrip->end= strip->end;
+                       
+                       return 1;
+               }
+               else /* failed... no room after */
+                       return 0;
+       }
+       else {
+               /* just try to add to the meta-strip (no dimension changes 
needed) */
+               return BKE_nlastrips_add_strip(&mstrip->strips, strip);
+       }
+}
+
+/* Adjust the settings of NLA-Strips contained within a Meta-Strip 
(recursively), 
+ * until the Meta-Strips children all fit within the Meta-Strip's new 
dimensions
+ */
+void BKE_nlameta_flush_transforms (NlaStrip *mstrip) 
+{
+       NlaStrip *strip;
+       float oStart, oEnd, offset;
+       
+       /* sanity checks 
+        *      - strip must exist
+        *      - strip must be a meta-strip with some contents
+        */
+       if ELEM(NULL, mstrip, mstrip->strips.first)
+               return;
+       if (mstrip->type != NLASTRIP_TYPE_META)
+               return;
+               
+       /* get the original start/end points, and calculate the start-frame 
offset
+        *      - these are simply the start/end frames of the child strips, 
+        *        since we assume they weren't transformed yet
+        */
+       oStart= ((NlaStrip *)mstrip->strips.first)->start;
+       oEnd= ((NlaStrip *)mstrip->strips.last)->end;
+       offset= mstrip->start - oStart;
+       
+       /* optimisation:
+        * don't flush if nothing changed yet
+        *      TODO: maybe we need a flag to say always flush?
+        */
+       if (IS_EQ(oStart, mstrip->start) && IS_EQ(oEnd, mstrip->end))
+               return;
+       
+       /* 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..
+               
+               /* finally, make sure the strip's children (if it is a 
meta-itself), get updated */
+               BKE_nlameta_flush_transforms(strip);
+       }
+}
+
 /* NLA-Tracks ---------------------------------------- */
 
 /* Find the active NLA-track for the given stack */

Modified: 
branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_draw.c
===================================================================
--- branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_draw.c     
2009-07-06 10:45:14 UTC (rev 21380)
+++ branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_draw.c     
2009-07-06 11:06:34 UTC (rev 21381)
@@ -176,6 +176,23 @@
                        color[2]= 0.19f;
                }
        }       
+       else if (strip->type == NLASTRIP_TYPE_META) {
+               /* Meta Clip */
+               if (strip->flag & NLASTRIP_FLAG_SELECT) {
+                       /* selected - use a bold purple color */
+                       // FIXME: hardcoded temp-hack colors
+                       color[0]= 0.41f;
+                       color[1]= 0.13f;
+                       color[2]= 0.59f;
+               }
+               else {
+                       /* normal, unselected strip - use (hardly noticable) 
dark purple tinge */
+                       // FIXME: hardcoded temp-hack colors
+                       color[0]= 0.20f;
+                       color[1]= 0.15f;
+                       color[2]= 0.26f;
+               }
+       }       
        else {
                /* Action Clip (default/normal type of strip) */
                if ((strip->flag & NLASTRIP_FLAG_ACTIVE) && (adt && (adt->flag 
& ADT_NLA_EDIT_ON))) {
@@ -293,7 +310,7 @@
        /* draw outline */
        gl_round_box_shade(GL_LINE_LOOP, strip->start, yminc, strip->end, 
ymaxc, 0.0, 0.0, 0.1);
        
-       /* if action-clip strip, draw lines delimiting repeats too (in the same 
colour */
+       /* if action-clip strip, draw lines delimiting repeats too (in the same 
color as outline) */
        if ((strip->type == NLASTRIP_TYPE_CLIP) && IS_EQ(strip->repeat, 
1.0f)==0) {
                float repeatLen = (strip->actend - strip->actstart) * 
strip->scale;
                int i;
@@ -309,6 +326,26 @@
                                fdrawline(repeatPos, yminc, repeatPos, ymaxc);
                }
        }
+       /* or if meta-strip, draw lines delimiting extents of sub-strips (in 
same color as outline, if more than 1 exists) */
+       else if ((strip->type == NLASTRIP_TYPE_META) && (strip->strips.first != 
strip->strips.last)) {
+               NlaStrip *cs;
+               float y= (ymaxc-yminc)/2.0f + yminc;
+               
+               /* only draw first-level of child-strips, but don't draw any 
lines on the endpoints */
+               for (cs= strip->strips.first; cs; cs= cs->next) {
+                       /* draw start-line if not same as end of previous (and 
only if not the first strip) 
+                        *      - on upper half of strip
+                        */
+                       if ((cs->prev) && IS_EQ(cs->prev->end, cs->start)==0)
+                               fdrawline(cs->start, y, cs->start, ymaxc);
+                               
+                       /* draw end-line if not the last strip
+                        *      - on lower half of strip
+                        */
+                       if (cs->next) 
+                               fdrawline(cs->end, yminc, cs->end, y);
+               }
+       }
        
        /* reset linestyle */
        setlinestyle(0);

Modified: 
branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_edit.c
===================================================================
--- branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_edit.c     
2009-07-06 10:45:14 UTC (rev 21380)

@@ 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