[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22080] branches/blender2.5/blender/source /blender: Animato - NLA + Realtime Animating Goodies

Joshua Leung aligorith at gmail.com
Fri Jul 31 09:43:48 CEST 2009


Revision: 22080
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22080
Author:   aligorith
Date:     2009-07-31 09:43:47 +0200 (Fri, 31 Jul 2009)

Log Message:
-----------
Animato - NLA + Realtime Animating Goodies 

* When doing realtime recording of animation (i.e. transforming objects + bones while animation playback is running, and auto-keying is enabled), animation will be added to a new NLA Track+Strip combo everytime a single 'loop' of the frame range has finished. This will allow 'passes' over the animation to be less destructive.

* Made the evaluation of the active action (when NLA data is present), be handled as part of the normal NLA system evaluation code (as if it were just another strip in a track at the end). The immediate benefit is that there are now some settings (available in the "Animation Data" panel in the NLA Editor with a strip selected) which allow for the way the active action is combined with the NLA stack results. For instance, the way that the action extrapolates is used in the recording tweaks above.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/intern/anim_sys.c
    branches/blender2.5/blender/source/blender/editors/animation/keyframing.c
    branches/blender2.5/blender/source/blender/editors/include/ED_screen_types.h
    branches/blender2.5/blender/source/blender/editors/interface/interface_anim.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
    branches/blender2.5/blender/source/blender/editors/space_nla/nla_buttons.c
    branches/blender2.5/blender/source/blender/editors/transform/transform_generics.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_anim_types.h
    branches/blender2.5/blender/source/blender/makesrna/RNA_enum_types.h
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_animation.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_nla.c

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/anim_sys.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/anim_sys.c	2009-07-31 02:35:56 UTC (rev 22079)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/anim_sys.c	2009-07-31 07:43:47 UTC (rev 22080)
@@ -120,8 +120,15 @@
 		IdAdtTemplate *iat= (IdAdtTemplate *)id;
 		
 		/* check if there's already AnimData, in which case, don't add */
-		if (iat->adt == NULL)
-			iat->adt= MEM_callocN(sizeof(AnimData), "AnimData");
+		if (iat->adt == NULL) {
+			AnimData *adt;
+			
+			/* add animdata */
+			adt= iat->adt= MEM_callocN(sizeof(AnimData), "AnimData");
+			
+			/* set default settings */
+			adt->act_influence= 1.0f;
+		}
 		
 		return iat->adt;
 	}
@@ -1190,6 +1197,9 @@
  */
 static void animsys_evaluate_nla (PointerRNA *ptr, AnimData *adt, float ctime)
 {
+	ListBase dummy_trackslist = {NULL, NULL};
+	NlaStrip dummy_strip;
+	
 	NlaTrack *nlt;
 	short track_index=0;
 	
@@ -1218,6 +1228,29 @@
 		if (nes) nes->track= nlt;
 	}
 	
+	/* add 'active' Action (may be tweaking track) as last strip to evaluate in NLA stack
+	 *	- only do this if we're not exclusively evaluating the 'solo' NLA-track
+	 */
+	if ((adt->action) && !(adt->flag & ADT_NLA_SOLO_TRACK)) {
+		/* make dummy NLA strip, and add that to the stack */
+		memset(&dummy_strip, 0, sizeof(NlaStrip));
+		dummy_trackslist.first= dummy_trackslist.last= &dummy_strip;
+		
+		dummy_strip.act= adt->action;
+		dummy_strip.remap= adt->remap;
+		
+		calc_action_range(dummy_strip.act, &dummy_strip.actstart, &dummy_strip.actend, 1);
+		dummy_strip.start = dummy_strip.actstart;
+		dummy_strip.end = (IS_EQ(dummy_strip.actstart, dummy_strip.actend)) ?  (dummy_strip.actstart + 1.0f): (dummy_strip.actend);
+		
+		dummy_strip.blendmode= adt->act_blendmode;
+		dummy_strip.extendmode= adt->act_extendmode;
+		dummy_strip.influence= adt->act_influence;
+		
+		/* add this to our list of evaluation strips */
+		nlastrips_ctime_get_strip(&estrips, &dummy_trackslist, -1, ctime);
+	}
+	
 	/* only continue if there are strips to evaluate */
 	if (estrips.first == NULL)
 		return;
@@ -1316,14 +1349,10 @@
 		/* evaluate NLA data */
 		if ((adt->nla_tracks.first) && !(adt->flag & ADT_NLA_EVAL_OFF))
 		{
-			/* evaluate NLA-stack */
+			/* evaluate NLA-stack 
+			 *	- active action is evaluated as part of the NLA stack as the last item
+			 */
 			animsys_evaluate_nla(&id_ptr, adt, ctime);
-			
-			/* evaluate 'active' Action (may be tweaking track) on top of results of NLA-evaluation 
-			 *	- only do this if we're not exclusively evaluating the 'solo' NLA-track
-			 */
-			if ((adt->action) && !(adt->flag & ADT_NLA_SOLO_TRACK))
-				animsys_evaluate_action(&id_ptr, adt->action, adt->remap, ctime);
 		}
 		/* evaluate Active Action only */
 		else if (adt->action)

Modified: branches/blender2.5/blender/source/blender/editors/animation/keyframing.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/keyframing.c	2009-07-31 02:35:56 UTC (rev 22079)
+++ branches/blender2.5/blender/source/blender/editors/animation/keyframing.c	2009-07-31 07:43:47 UTC (rev 22080)
@@ -1438,10 +1438,17 @@
 	/* only filter if auto-key mode requires this */
 	if (IS_AUTOKEY_ON(scene) == 0)
 		return 0;
-	else if (IS_AUTOKEY_MODE(scene, NORMAL)) 
+		
+	if (IS_AUTOKEY_MODE(scene, NORMAL)) {
+		/* can insert anytime we like... */
 		return 1;
-	else 
+	}
+	else /* REPLACE */ {
+		/* for whole block - only key if there's a keyframe on that frame already
+		 *	this is a valid assumption when we're blocking + tweaking
+		 */
 		return id_frame_has_keyframe(id, cfra, ANIMFILTER_KEYS_LOCAL);
+	}
 }
 
 /* ******************************************* */

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_screen_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_screen_types.h	2009-07-31 02:35:56 UTC (rev 22079)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_screen_types.h	2009-07-31 07:43:47 UTC (rev 22080)
@@ -33,10 +33,19 @@
 typedef struct ScreenAnimData {
 	ARegion *ar;	/* do not read from this, only for comparing if region exists */
 	int redraws;
-	int reverse;
+	int flag;		/* flags for playback */
 } ScreenAnimData;
 
+/* for animplayer */
+enum {
+		/* user-setting - frame range is played backwards */
+	ANIMPLAY_FLAG_REVERSE		= (1<<0),
+		/* temporary - playback just jumped to the start/end */
+	ANIMPLAY_FLAG_JUMPED		= (1<<1),
+};
 
+
+
 typedef struct AZone {
 	struct AZone *next, *prev;
 	ARegion *ar;

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_anim.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_anim.c	2009-07-31 02:35:56 UTC (rev 22079)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_anim.c	2009-07-31 07:43:47 UTC (rev 22080)
@@ -144,7 +144,7 @@
 
 	if(fcu && !driven) {
 		id= but->rnapoin.id.data;
-
+		
 		if(autokeyframe_cfra_can_key(scene, id)) {
 			short flag = 0;
 			

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2009-07-31 02:35:56 UTC (rev 22079)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2009-07-31 07:43:47 UTC (rev 22080)
@@ -1477,7 +1477,7 @@
 		screen->animtimer= WM_event_add_window_timer(win, TIMER0, (1.0/FPS));
 		sad->ar= CTX_wm_region(C);
 		sad->redraws= redraws;
-		sad->reverse= (enable < 0);
+		sad->flag= (enable < 0) ? ANIMPLAY_FLAG_REVERSE : 0;
 		screen->animtimer->customdata= sad;
 		
 	}

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2009-07-31 02:35:56 UTC (rev 22079)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2009-07-31 07:43:47 UTC (rev 22080)
@@ -2197,39 +2197,50 @@
 		
 		if(scene->audio.flag & AUDIO_SYNC) {
 			int step = floor(wt->duration * FPS);
-			if (sad->reverse) // XXX does this option work with audio?
+			if (sad->flag & ANIMPLAY_FLAG_REVERSE) // XXX does this option work with audio?
 				scene->r.cfra -= step;
 			else
 				scene->r.cfra += step;
 			wt->duration -= ((float)step)/FPS;
 		}
 		else {
-			if (sad->reverse)
+			if (sad->flag & ANIMPLAY_FLAG_REVERSE)
 				scene->r.cfra--;
 			else
 				scene->r.cfra++;
 		}
 		
-		if (sad->reverse) {
-			/* jump back to end */
+		/* reset 'jumped' flag before checking if we need to jump... */
+		sad->flag &= ~ANIMPLAY_FLAG_JUMPED;
+		
+		if (sad->flag & ANIMPLAY_FLAG_REVERSE) {
+			/* jump back to end? */
 			if (scene->r.psfra) {
-				if(scene->r.cfra < scene->r.psfra)
+				if (scene->r.cfra < scene->r.psfra) {
 					scene->r.cfra= scene->r.pefra;
+					sad->flag |= ANIMPLAY_FLAG_JUMPED;
+				}
 			}
 			else {
-				if(scene->r.cfra < scene->r.sfra)
+				if (scene->r.cfra < scene->r.sfra) {
 					scene->r.cfra= scene->r.efra;
+					sad->flag |= ANIMPLAY_FLAG_JUMPED;
+				}
 			}
 		}
 		else {
-			/* jump back to start */
+			/* jump back to start? */
 			if (scene->r.psfra) {
-				if(scene->r.cfra > scene->r.pefra)
+				if (scene->r.cfra > scene->r.pefra) {
 					scene->r.cfra= scene->r.psfra;
+					sad->flag |= ANIMPLAY_FLAG_JUMPED;
+				}
 			}
 			else {
-				if(scene->r.cfra > scene->r.efra)
+				if (scene->r.cfra > scene->r.efra) {
 					scene->r.cfra= scene->r.sfra;
+					sad->flag |= ANIMPLAY_FLAG_JUMPED;
+				}
 			}
 		}
 

Modified: branches/blender2.5/blender/source/blender/editors/space_nla/nla_buttons.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_nla/nla_buttons.c	2009-07-31 02:35:56 UTC (rev 22079)
+++ branches/blender2.5/blender/source/blender/editors/space_nla/nla_buttons.c	2009-07-31 07:43:47 UTC (rev 22080)
@@ -100,7 +100,7 @@
 	WM_event_add_notifier(C, NC_SCENE|NC_OBJECT|ND_TRANSFORM, NULL);
 }
 
-static int nla_panel_context(const bContext *C, PointerRNA *nlt_ptr, PointerRNA *strip_ptr)
+static int nla_panel_context(const bContext *C, PointerRNA *adt_ptr, PointerRNA *nlt_ptr, PointerRNA *strip_ptr)
 {
 	bAnimContext ac;
 	bAnimListElem *ale= NULL;
@@ -121,8 +121,13 @@
 	for (ale= anim_data.first; ale; ale= ale->next) {
 		if (ale->type == ANIMTYPE_NLATRACK) {
 			NlaTrack *nlt= (NlaTrack *)ale->data;
+			AnimData *adt= ale->adt;
 			
 			/* found it, now set the pointers */
+			if (adt_ptr) {
+				/* AnimData pointer */
+				RNA_pointer_create(ale->id, &RNA_AnimData, adt, adt_ptr);
+			}
 			if (nlt_ptr) {
 				/* NLA-Track pointer */
 				RNA_pointer_create(ale->id, &RNA_NlaTrack, nlt, nlt_ptr);
@@ -151,16 +156,22 @@
 }
 #endif
 
+static int nla_animdata_panel_poll(const bContext *C, PanelType *pt)
+{
+	PointerRNA ptr;
+	return (nla_panel_context(C, &ptr, NULL, NULL) && (ptr.data != NULL));
+}
+
 static int nla_track_panel_poll(const bContext *C, PanelType *pt)
 {
 	PointerRNA ptr;
-	return (nla_panel_context(C, &ptr, NULL) && (ptr.data != NULL));
+	return (nla_panel_context(C, NULL, &ptr, NULL) && (ptr.data != NULL));
 }
 
 static int nla_strip_panel_poll(const bContext *C, PanelType *pt)
 {
 	PointerRNA ptr;
-	return (nla_panel_context(C, NULL, &ptr) && (ptr.data != NULL));
+	return (nla_panel_context(C, NULL, NULL, &ptr) && (ptr.data != NULL));
 }
 
 static int nla_strip_actclip_panel_poll(const bContext *C, PanelType *pt)
@@ -168,7 +179,7 @@
 	PointerRNA ptr;
 	NlaStrip *strip;
 	
-	if (!nla_panel_context(C, NULL, &ptr))
+	if (!nla_panel_context(C, NULL, NULL, &ptr))
 		return 0;
 	if (ptr.data == NULL)
 		return 0;
@@ -179,6 +190,42 @@
 
 /* -------------- */
 
+/* active AnimData */
+static void nla_panel_animdata (const bContext *C, Panel *pa)
+{
+	PointerRNA adt_ptr;
+	AnimData *adt;
+	uiLayout *layout= pa->layout;
+	uiLayout *row;
+	uiBlock *block;
+	
+	/* check context and also validity of pointer */
+	if (!nla_panel_context(C, &adt_ptr, NULL, NULL))
+		return;
+	adt= adt_ptr.data;
+	
+	block= uiLayoutGetBlock(layout);
+	uiBlockSetHandleFunc(block, do_nla_region_buttons, NULL);
+	

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list