[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22139] branches/blender2.5/blender/source /blender: 2.5 - Animation Playback Tweaks

Joshua Leung aligorith at gmail.com
Sun Aug 2 13:05:13 CEST 2009


Revision: 22139
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22139
Author:   aligorith
Date:     2009-08-02 13:05:13 +0200 (Sun, 02 Aug 2009)

Log Message:
-----------
2.5 - Animation Playback Tweaks 

* Added some optimisations to avoid having to try evaluating some data that won't have any effect.

* Converted playback buttons in timeline header to use operators too

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/intern/anim_sys.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
    branches/blender2.5/blender/source/blender/editors/space_time/time_header.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-08-02 10:32:52 UTC (rev 22138)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/anim_sys.c	2009-08-02 11:05:13 UTC (rev 22139)
@@ -1391,21 +1391,38 @@
  * 'local' (i.e. belonging in the nearest ID-block that setting is related to, not a
  * standard 'root') block are overridden by a larger 'user'
  */
-// TODO: we currently go over entire 'main' database...
+// FIXME?: we currently go over entire 'main' database...
 void BKE_animsys_evaluate_all_animation (Main *main, float ctime)
 {
 	ID *id;
 	
 	if (G.f & G_DEBUG)
 		printf("Evaluate all animation - %f \n", ctime);
-
-	/* macro for less typing */
-#define EVAL_ANIM_IDS(first, flag) \
+	
+	/* macro for less typing 
+	 *	- only evaluate animation data for id if it has users (and not just fake ones)
+	 *	- whether animdata exists is checked for by the evaluation function, though taking 
+	 *	  this outside of the function may make things slightly faster?
+	 */
+#define EVAL_ANIM_IDS(first, aflag) \
 	for (id= first; id; id= id->next) { \
 		AnimData *adt= BKE_animdata_from_id(id); \
-		BKE_animsys_evaluate_animdata(id, adt, ctime, flag); \
+		if ( (id->us > 1) || (id->us && !(id->flag & LIB_FAKEUSER)) ) \
+			BKE_animsys_evaluate_animdata(id, adt, ctime, aflag); \
 	}
 	
+	/* optimisation: 
+	 * when there are no actions, don't go over database and loop over heaps of datablocks, 
+	 * which should ultimately be empty, since it is not possible for now to have any animation 
+	 * without some actions, and drivers wouldn't get affected by any state changes
+	 */
+	if (main->action.first == NULL) {
+		if (G.f & G_DEBUG)
+			printf("\tNo Actions, so no animation needs to be evaluated...\n");
+			
+		return;
+	}
+	
 	/* nodes */
 	// TODO...
 	

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2009-08-02 10:32:52 UTC (rev 22138)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2009-08-02 11:05:13 UTC (rev 22139)
@@ -2311,6 +2311,10 @@
 
 /* ****************** anim player, starts or ends timer ***************** */
 
+/* helper for screen_animation_play() - only to be used for TimeLine */
+// NOTE: defined in time_header.c for now...
+extern ARegion *time_top_left_3dwindow(bScreen *screen);
+
 /* toggle operator */
 static int screen_animation_play(bContext *C, wmOperator *op, wmEvent *event)
 {
@@ -2320,16 +2324,33 @@
 		ED_screen_animation_timer(C, 0, 0);
 	}
 	else {
+		ScrArea *sa= CTX_wm_area(C);
 		int mode= (RNA_boolean_get(op->ptr, "reverse")) ? -1 : 1;
 		
-		ED_screen_animation_timer(C, TIME_REGION|TIME_ALL_3D_WIN, mode);
-		
-		if(screen->animtimer) {
-			wmTimer *wt= screen->animtimer;
-			ScreenAnimData *sad= wt->customdata;
+		/* timeline gets special treatment since it has it's own menu for determining redraws */
+		if ((sa) && (sa->spacetype == SPACE_TIME)) {
+			SpaceTime *stime= (SpaceTime *)sa->spacedata.first;
 			
-			sad->ar= CTX_wm_region(C);
+			ED_screen_animation_timer(C, stime->redraws, mode);
+			
+			/* update region if TIME_REGION was set, to leftmost 3d window */
+			if(screen->animtimer && (stime->redraws & TIME_REGION)) {
+				wmTimer *wt= screen->animtimer;
+				ScreenAnimData *sad= wt->customdata;
+				
+				sad->ar= time_top_left_3dwindow(screen);
+			}
 		}
+		else {
+			ED_screen_animation_timer(C, TIME_REGION|TIME_ALL_3D_WIN, mode);
+			
+			if(screen->animtimer) {
+				wmTimer *wt= screen->animtimer;
+				ScreenAnimData *sad= wt->customdata;
+				
+				sad->ar= CTX_wm_region(C);
+			}
+		}
 	}
 	
 	return OPERATOR_FINISHED;

Modified: branches/blender2.5/blender/source/blender/editors/space_time/time_header.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_time/time_header.c	2009-08-02 10:32:52 UTC (rev 22138)
+++ branches/blender2.5/blender/source/blender/editors/space_time/time_header.c	2009-08-02 11:05:13 UTC (rev 22139)
@@ -69,7 +69,8 @@
 
 /* ************************ header time area region *********************** */
 
-static ARegion *time_top_left_3dwindow(bScreen *screen)
+/* exported for use in screen_ops.c */
+ARegion *time_top_left_3dwindow(bScreen *screen)
 {
 	ARegion *aret= NULL;
 	ScrArea *sa;
@@ -204,12 +205,6 @@
 		case 7:
 			//nextprev_marker(-1);
 			break;
-		case 8:
-			//nextprev_timeline_key(1);
-			break;
-		case 9:
-			//nextprev_timeline_key(-1);
-			break;
 		case 10:
 			//timeline_frame_to_center();
 			break;
@@ -372,8 +367,6 @@
 
 void do_time_buttons(bContext *C, void *arg, int event)
 {
-	bScreen *screen= CTX_wm_screen(C);
-	SpaceTime *stime= CTX_wm_space_time(C);
 	Scene *scene= CTX_data_scene(C);
 	
 	switch(event) {
@@ -383,34 +376,6 @@
 		case B_NEWFRAME:
 			WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
 			break;
-		case B_TL_PLAY:
-			ED_screen_animation_timer(C, stime->redraws, 1);
-			
-			/* update region if TIME_REGION was set, to leftmost 3d window */
-			if(screen->animtimer && (stime->redraws & TIME_REGION)) {
-				wmTimer *wt= screen->animtimer;
-				ScreenAnimData *sad= wt->customdata;
-				
-				sad->ar= time_top_left_3dwindow(screen);
-			}
-			
-			break;
-		case B_TL_RPLAY:
-			ED_screen_animation_timer(C, stime->redraws, -1);
-			
-			/* update region if TIME_REGION was set, to leftmost 3d window */
-			if(screen->animtimer && (stime->redraws & TIME_REGION)) {
-				wmTimer *wt= screen->animtimer;
-				ScreenAnimData *sad= wt->customdata;
-				
-				sad->ar= time_top_left_3dwindow(screen);
-			}
-			
-			break;
-		case B_TL_STOP:
-			ED_screen_animation_timer(C, 0, 0);
-			break;
-			
 		case B_TL_PREVIEWON:
 			if (scene->r.psfra) {
 				/* turn on preview range */
@@ -526,19 +491,17 @@
 	
 	if (animtimer) {
 		/* pause button 2*size to keep buttons in place */
-		uiDefIconBut(block, BUT, B_TL_STOP, ICON_PAUSE,
-					 xco, yco, XIC*2, YIC, 0, 0, 0, 0, 0, "Stop Playing Timeline");
-					 
+		but=uiDefIconButO(block, BUT, "SCREEN_OT_animation_play", WM_OP_INVOKE_REGION_WIN, ICON_PAUSE, xco,yco,XIC*2,YIC, "Stop Playing Timeline");
+		
 		xco+= XIC;
 	}
 	else {	   
-		uiDefIconBut(block, BUT, B_TL_RPLAY, ICON_PLAY_REVERSE,
-					 xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Play Timeline in Reverse");
-					 
+		but=uiDefIconButO(block, BUT, "SCREEN_OT_animation_play", WM_OP_INVOKE_REGION_WIN, ICON_PLAY_REVERSE, xco,yco,XIC,YIC, "Play Timeline in Reverse");
+			RNA_boolean_set(uiButGetOperatorPtrRNA(but), "reverse", 1);	
 		xco+= XIC;
 					 
-		uiDefIconBut(block, BUT, B_TL_PLAY, ICON_PLAY,
-					 xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Play Timeline ");
+		but=uiDefIconButO(block, BUT, "SCREEN_OT_animation_play", WM_OP_INVOKE_REGION_WIN, ICON_PLAY, xco,yco,XIC,YIC, "Play Timeline");
+			RNA_boolean_set(uiButGetOperatorPtrRNA(but), "reverse", 0);	
 	}
 	xco+= XIC;
 	
@@ -551,7 +514,7 @@
 	xco+= XIC;
 	uiBlockEndAlign(block);
 
-	xco+= 2*XIC;
+	xco+= 1.5*XIC;
 	
 	uiBlockBeginAlign(block);
 	uiDefIconButBitS(block, TOG, AUTOKEY_ON, B_REDRAWALL, ICON_REC,





More information about the Bf-blender-cvs mailing list