Revision: 20402
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20402
Author:   aligorith
Date:     2009-05-25 15:07:54 +0200 (Mon, 25 May 2009)

Log Message:
-----------
NLA SoC: Groundwork for NLA UI

Adapted the channel-filtering code for the other animation editors for eventual 
use by the NLA Editor. 

Modified Paths:
--------------
    branches/soc-2009-aligorith/source/blender/blenloader/intern/readfile.c
    branches/soc-2009-aligorith/source/blender/blenloader/intern/writefile.c
    branches/soc-2009-aligorith/source/blender/editors/animation/anim_filter.c
    branches/soc-2009-aligorith/source/blender/editors/include/ED_anim_api.h
    branches/soc-2009-aligorith/source/blender/editors/space_nla/space_nla.c
    branches/soc-2009-aligorith/source/blender/makesdna/DNA_action_types.h
    branches/soc-2009-aligorith/source/blender/makesdna/DNA_space_types.h

Modified: 
branches/soc-2009-aligorith/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/soc-2009-aligorith/source/blender/blenloader/intern/readfile.c     
2009-05-25 12:41:35 UTC (rev 20401)
+++ branches/soc-2009-aligorith/source/blender/blenloader/intern/readfile.c     
2009-05-25 13:07:54 UTC (rev 20402)
@@ -4679,6 +4679,11 @@
                                sipo->ads= newdataadr(fd, sipo->ads);
                                sipo->ghostCurves.first= 
sipo->ghostCurves.last= NULL;
                        }
+                       else if (sl->spacetype==SPACE_NLA) {
+                               SpaceNla *snla= (SpaceNla*)sl;
+                               
+                               snla->ads= newdataadr(fd, snla->ads);
+                       }
                        else if (sl->spacetype==SPACE_OUTLINER) {
                                SpaceOops *soops= (SpaceOops*) sl;
                                

Modified: 
branches/soc-2009-aligorith/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/soc-2009-aligorith/source/blender/blenloader/intern/writefile.c    
2009-05-25 12:41:35 UTC (rev 20401)
+++ branches/soc-2009-aligorith/source/blender/blenloader/intern/writefile.c    
2009-05-25 13:07:54 UTC (rev 20402)
@@ -1904,7 +1904,10 @@
                                        writestruct(wd, DATA, "SpaceSound", 1, 
sl);
                                }
                                else if(sl->spacetype==SPACE_NLA){
-                                       writestruct(wd, DATA, "SpaceNla", 1, 
sl);
+                                       SpaceNla *snla= (SpaceNla *)sl;
+                                       
+                                       writestruct(wd, DATA, "SpaceNla", 1, 
snla);
+                                       if(snla->ads) writestruct(wd, DATA, 
"bDopeSheet", 1, snla->ads);
                                }
                                else if(sl->spacetype==SPACE_TIME){
                                        writestruct(wd, DATA, "SpaceTime", 1, 
sl);

Modified: 
branches/soc-2009-aligorith/source/blender/editors/animation/anim_filter.c
===================================================================
--- branches/soc-2009-aligorith/source/blender/editors/animation/anim_filter.c  
2009-05-25 12:41:35 UTC (rev 20401)
+++ branches/soc-2009-aligorith/source/blender/editors/animation/anim_filter.c  
2009-05-25 13:07:54 UTC (rev 20402)
@@ -195,7 +195,7 @@
        }
 }
 
-/* ----------- Private Stuff - IPO Editor ------------- */
+/* ----------- Private Stuff - Graph Editor ------------- */
 
 /* Get data being edited in Graph Editor (depending on current 'mode') */
 static short graphedit_get_context (bAnimContext *ac, SpaceIpo *sipo)
@@ -237,6 +237,26 @@
        }
 }
 
+/* ----------- Private Stuff - NLA Editor ------------- */
+
+/* Get data being edited in Graph Editor (depending on current 'mode') */
+static short nlaedit_get_context (bAnimContext *ac, SpaceNla *snla)
+{
+       /* init dopesheet data if non-existant (i.e. for old files) */
+       if (snla->ads == NULL)
+               snla->ads= MEM_callocN(sizeof(bDopeSheet), "GraphEdit 
DopeSheet");
+       
+       /* sync settings with current view status, then return appropriate data 
*/
+       /* update scene-pointer (no need to check for pinning yet, as not 
implemented) */
+       snla->ads->source= (ID *)ac->scene;
+       snla->ads->filterflag |= ADS_FILTER_ONLYNLA;
+       
+       ac->datatype= ANIMCONT_NLA;
+       ac->data= snla->ads;
+       
+       return 1;
+}
+
 /* ----------- Public API --------------- */
 
 /* Obtain current anim-data context, given that context info from Blender 
context has already been set 
@@ -264,6 +284,13 @@
                                ok= graphedit_get_context(ac, sipo);
                        }
                                break;
+                               
+                       case SPACE_NLA:
+                       {
+                               SpaceNla *snla= (SpaceNla *)sa->spacedata.first;
+                               ok= nlaedit_get_context(ac, snla);
+                       }
+                               break;
                }
        }
        
@@ -313,6 +340,39 @@
 /* quick macro to test if AnimData is usable for drivers */
 #define ANIMDATA_HAS_DRIVERS(id) ((id)->adt && (id)->adt->drivers.first)
 
+/* quick macro to test if AnimData is usable for NLA */
+#define ANIMDATA_HAS_NLA(id) ((id)->adt && (id)->adt->nla_tracks.first)
+
+/* quick macro to test for all three avove usability tests, performing the 
appropriate provided 
+ * action for each when the AnimData context is appropriate. 
+ *
+ * Priority order for this goes (most important, to least): NLA, Drivers, 
Keyframes
+ *
+ *     - id: ID block which should have an AnimData pointer following it 
immediately, to use
+ *     - nlaOk: line or block of code to execute for NLA case
+ *     - driversOk: line or block of code to execute for Drivers case
+ *     - keysOk: line or block of code for Keyframes case
+ */
+#define ANIMDATA_FILTER_CASES(id, nlaOk, driversOk, keysOk) \
+       {\
+               if (ads->filterflag & ADS_FILTER_ONLYNLA) {\
+                       if (ANIMDATA_HAS_NLA(id)) {\
+                               nlaOk\
+                       }\
+               }\
+               else if (ads->filterflag & ADS_FILTER_ONLYDRIVERS) {\
+                       if (ANIMDATA_HAS_DRIVERS(id)) {\
+                               driversOk\
+                       }\
+               }\
+               else {\
+                       if (ANIMDATA_HAS_KEYS(id)) {\
+                               keysOk\
+                       }\
+               }\
+       }
+
+
 /* quick macro to test if a anim-channel (F-Curve, Group, etc.) is selected in 
an acceptable way */
 #define ANIMCHANNEL_SELOK(test_func) \
                ( !(filter_mode & (ANIMFILTER_SEL|ANIMFILTER_UNSEL)) || \
@@ -494,6 +554,18 @@
                                ale->datatype= ALE_GPFRAME;
                        }
                                break;
+                               
+                       case ANIMTYPE_NLATRACK:
+                       {
+                               NlaTrack *nlt= (NlaTrack *)data;
+                               
+                               ale->flag= nlt->flag;
+                               
+                                       // XXX or should this be done some 
other way?
+                               ale->key_data= &nlt->strips;
+                               ale->datatype= ALE_NLASTRIP;
+                       }
+                               break;
                }
        }
        
@@ -610,6 +682,12 @@
        return items;
 }
 
+static int animdata_filter_nla (ListBase *anim_data, NlaTrack *first, int 
filter_mode, void *owner, short ownertype, ID *owner_id)
+{
+       // FIXME
+       return 0;
+}
+
 static int animdata_filter_shapekey (ListBase *anim_data, Key *key, int 
filter_mode, void *owner, short ownertype, ID *owner_id)
 {
        bAnimListElem *ale;
@@ -752,19 +830,18 @@
        /* firstly check that we actuallly have some materials, by gathering 
all materials in a temp list */
        for (a=0; a < ob->totcol; a++) {
                Material *ma= give_current_material(ob, a);
+               short ok = 0;
                
                /* for now, if no material returned, skip (this shouldn't 
confuse the user I hope) */
                if (ELEM(NULL, ma, ma->adt)) 
                        continue;
                
-               if ((ads->filterflag & ADS_FILTER_ONLYDRIVERS)==0) {
-                       if (ANIMDATA_HAS_KEYS(ma) == 0)
-                               continue;
-               }
-               else {
-                       if (ANIMDATA_HAS_DRIVERS(ma) == 0)
-                               continue;
-               }
+               /* check if ok */
+               ANIMDATA_FILTER_CASES(ma, 
+                       ok=1;, 
+                       ok=1;, 
+                       ok=1;)
+               if (ok == 0) continue;
                
                /* make a temp list elem for this */
                ld= MEM_callocN(sizeof(LinkData), "DopeSheet-MaterialCache");
@@ -801,16 +878,12 @@
                                }
                        }
                        
-                       /* add material's F-Curve or Driver channels? */
+                       /* add material's animation data */
                        if (FILTER_MAT_OBJD(ma) || (filter_mode & 
ANIMFILTER_CURVESONLY)) {
-                               if ((ads->filterflag & 
ADS_FILTER_ONLYDRIVERS)==0) {
-                                       // XXX the 'owner' info here is still 
subject to improvement
-                                       items += 
animdata_filter_action(anim_data, ma->adt->action, filter_mode, ma, 
ANIMTYPE_DSMAT, (ID *)ma);
-                               }
-                               else {
-                                       // need to make the ownertype normal 
object here... (maybe type should be a separate one for clarity?)
-                                       items += 
animdata_filter_fcurves(anim_data, ma->adt->drivers.first, NULL, ma, 
ANIMTYPE_DSMAT, filter_mode, (ID *)ma);
-                               }       
+                               ANIMDATA_FILTER_CASES(ma, 
+                                       items += animdata_filter_nla(anim_data, 
ma->adt->nla_tracks.first, filter_mode, ma, ANIMTYPE_DSMAT, (ID *)ma);, 
+                                       items += 
animdata_filter_fcurves(anim_data, ma->adt->drivers.first, NULL, ma, 
ANIMTYPE_DSMAT, filter_mode, (ID *)ma);, 
+                                       items += 
animdata_filter_action(anim_data, ma->adt->action, filter_mode, ma, 
ANIMTYPE_DSMAT, (ID *)ma);)
                        }
                }
        }
@@ -871,15 +944,11 @@
        
        /* add object-data animation channels? */
        if ((expanded) || (filter_mode & ANIMFILTER_CURVESONLY)) {
-               /* Action or Drivers? */
-               if ((ads->filterflag & ADS_FILTER_ONLYDRIVERS) == 0) {
-                       // XXX the 'owner' info here is still subject to 
improvement
-                       items += animdata_filter_action(anim_data, 
iat->adt->action, filter_mode, iat, type, (ID *)iat);
-               }
-               else {
-                       // need to make the ownertype normal object here... 
(maybe type should be a separate one for clarity?)
-                       items += animdata_filter_fcurves(anim_data, 
adt->drivers.first, NULL, iat, type, filter_mode, (ID *)iat);
-               }
+               /* filtering for channels - nla, drivers, keyframes */
+               ANIMDATA_FILTER_CASES(iat, 
+                       items+= animdata_filter_nla(anim_data, 
iat->adt->nla_tracks.first, filter_mode, iat, type, (ID *)iat);,
+                       items+= animdata_filter_fcurves(anim_data, 
adt->drivers.first, NULL, iat, type, filter_mode, (ID *)iat);, 
+                       items += animdata_filter_action(anim_data, 
iat->adt->action, filter_mode, iat, type, (ID *)iat);)
        }
        
        /* return the number of items added to the list */
@@ -889,8 +958,10 @@
 static int animdata_filter_dopesheet_ob (ListBase *anim_data, bDopeSheet *ads, 
Base *base, int filter_mode)
 {
        bAnimListElem *ale=NULL;
+       AnimData *adt = NULL;
        Object *ob= base->object;
        Key *key= ob_get_key(ob);
+       short obdata_ok = 0;
        int items = 0;
        
        /* add this object as a channel first */
@@ -909,73 +980,83 @@
        if ( (EXPANDED_OBJC(ob) == 0) && !(filter_mode & ANIMFILTER_CURVESONLY) 
)
                return items;
        
-       /* Action or Drivers */
-       if ((ads->filterflag & ADS_FILTER_ONLYDRIVERS) == 0) {
-               /* Action? */
-               if (ANIMDATA_HAS_KEYS(ob) /*&& !(ads->filterflag & 
ADS_FILTER_NOACTS)*/) {
-                       AnimData *adt= ob->adt;
-                       
-                       /* include action-expand widget? */
-                       if ((filter_mode & ANIMFILTER_CHANNELS) && 
!(filter_mode & ANIMFILTER_CURVESONLY)) {
-                               ale= make_new_animlistelem(adt->action, 
ANIMTYPE_FILLACTD, base, ANIMTYPE_OBJECT, (ID *)ob);
-                               if (ale) {
-                                       BLI_addtail(anim_data, ale);
-                                       items++;
+       /* Action, Drivers, or NLA */
+       if (ob->adt) {
+               adt= ob->adt;
+               ANIMDATA_FILTER_CASES(ob,
+                       { /* nla */
+#if 0
+                               /* include nla-expand widget? */
+                               if ((filter_mode & ANIMFILTER_CHANNELS) && 
!(filter_mode & ANIMFILTER_CURVESONLY)) {
+                                       ale= make_new_animlistelem(adt->action, 
ANIMTYPE_FILLNLA, base, ANIMTYPE_OBJECT, (ID *)ob);
+                                       if (ale) {
+                                               BLI_addtail(anim_data, ale);
+                                               items++;
+                                       }
                                }
-                       }
-                       
-                       /* add F-Curve channels? */
-                       if (EXPANDED_ACTC(adt->action) || !(filter_mode & 
ANIMFILTER_CHANNELS)) {
-                               // need to make the ownertype normal object 
here... (maybe type should be a separate one for clarity?)
-                               items += animdata_filter_action(anim_data, 
adt->action, filter_mode, ob, ANIMTYPE_OBJECT, (ID *)ob); 
-                       }
-               }
-       }
-       else {
-               /* Drivers */
-               if (ANIMDATA_HAS_DRIVERS(ob)) {
-                       AnimData *adt= ob->adt;
-                       
-                       /* include drivers-expand widget? */
-                       if ((filter_mode & ANIMFILTER_CHANNELS) && 
!(filter_mode & ANIMFILTER_CURVESONLY)) {
-                               ale= make_new_animlistelem(adt->action, 
ANIMTYPE_FILLDRIVERS, base, ANIMTYPE_OBJECT, (ID *)ob);
-                               if (ale) {
-                                       BLI_addtail(anim_data, ale);
-                                       items++;
+#endif
+                               

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