[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20402] branches/soc-2009-aligorith/source /blender: NLA SoC: Groundwork for NLA UI

Joshua Leung aligorith at gmail.com
Mon May 25 15:07:54 CEST 2009


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




More information about the Bf-blender-cvs mailing list