[Bf-blender-cvs] [8d48f8e] master: Add ability for redraw timer to run for fixed time

Campbell Barton noreply at git.blender.org
Sun Jul 12 15:03:31 CEST 2015


Commit: 8d48f8e0b0ffa6ad82f5cf03177479032a8f4301
Author: Campbell Barton
Date:   Sun Jul 12 22:57:35 2015 +1000
Branches: master
https://developer.blender.org/rB8d48f8e0b0ffa6ad82f5cf03177479032a8f4301

Add ability for redraw timer to run for fixed time

Also avoid accessing context vars in timer loop.

===================================================================

M	source/blender/windowmanager/intern/wm_operators.c

===================================================================

diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 66dd851..2a35a04 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -4621,7 +4621,7 @@ static void redraw_timer_window_swap(bContext *C)
 	CTX_wm_window_set(C, win);  /* XXX context manipulation warning! */
 }
 
-enum eRedrawTimerItems {
+enum {
 	eRTDrawRegion = 0,
 	eRTDrawRegionSwap = 1,
 	eRTDrawWindow = 2,
@@ -4642,102 +4642,117 @@ static EnumPropertyItem redraw_timer_type_items[] = {
 	{0, NULL, 0, NULL, NULL}
 };
 
-static int redraw_timer_exec(bContext *C, wmOperator *op)
-{
-	ARegion *ar = CTX_wm_region(C);
-	double stime = PIL_check_seconds_timer();
-	int type = RNA_enum_get(op->ptr, "type");
-	int iter = RNA_int_get(op->ptr, "iterations");
-	int a;
-	float time;
-	const char *infostr = "";
-	
-	WM_cursor_wait(1);
 
-	for (a = 0; a < iter; a++) {
-		if (type == eRTDrawRegion) {
-			if (ar) {
-				ED_region_do_draw(C, ar);
-				ar->do_draw = false;
-			}
-		}
-		else if (type == eRTDrawRegionSwap) {
-			wmWindow *win = CTX_wm_window(C);
-			CTX_wm_menu_set(C, NULL);
-		
-			ED_region_tag_redraw(ar);
-			wm_draw_update(C);
-			
-			CTX_wm_window_set(C, win);  /* XXX context manipulation warning! */
+static void redraw_timer_step(
+        bContext *C, Main *bmain, Scene *scene, wmWindow *win, ARegion *ar,
+        const int type, const int cfra)
+{
+	if (type == eRTDrawRegion) {
+		if (ar) {
+			ED_region_do_draw(C, ar);
+			ar->do_draw = false;
 		}
-		else if (type == eRTDrawWindow) {
-			wmWindow *win = CTX_wm_window(C);
-			ScrArea *sa;
-			
-			ScrArea *sa_back = CTX_wm_area(C);
-			ARegion *ar_back = CTX_wm_region(C);
+	}
+	else if (type == eRTDrawRegionSwap) {
+		CTX_wm_menu_set(C, NULL);
 
-			CTX_wm_menu_set(C, NULL);
-			
-			for (sa = CTX_wm_screen(C)->areabase.first; sa; sa = sa->next) {
-				ARegion *ar_iter;
-				CTX_wm_area_set(C, sa);
-
-				for (ar_iter = sa->regionbase.first; ar_iter; ar_iter = ar_iter->next) {
-					if (ar_iter->swinid) {
-						CTX_wm_region_set(C, ar_iter);
-						ED_region_do_draw(C, ar_iter);
-						ar->do_draw = false;
-					}
+		ED_region_tag_redraw(ar);
+		wm_draw_update(C);
+
+		CTX_wm_window_set(C, win);  /* XXX context manipulation warning! */
+	}
+	else if (type == eRTDrawWindow) {
+		ScrArea *sa;
+
+		ScrArea *sa_back = CTX_wm_area(C);
+		ARegion *ar_back = CTX_wm_region(C);
+
+		CTX_wm_menu_set(C, NULL);
+
+		for (sa = CTX_wm_screen(C)->areabase.first; sa; sa = sa->next) {
+			ARegion *ar_iter;
+			CTX_wm_area_set(C, sa);
+
+			for (ar_iter = sa->regionbase.first; ar_iter; ar_iter = ar_iter->next) {
+				if (ar_iter->swinid) {
+					CTX_wm_region_set(C, ar_iter);
+					ED_region_do_draw(C, ar_iter);
+					ar->do_draw = false;
 				}
 			}
+		}
 
-			CTX_wm_window_set(C, win);  /* XXX context manipulation warning! */
+		CTX_wm_window_set(C, win);  /* XXX context manipulation warning! */
+
+		CTX_wm_area_set(C, sa_back);
+		CTX_wm_region_set(C, ar_back);
+	}
+	else if (type == eRTDrawWindowSwap) {
+		redraw_timer_window_swap(C);
+	}
+	else if (type == eRTAnimationStep) {
+		scene->r.cfra += (cfra == scene->r.cfra) ? 1 : -1;
+		BKE_scene_update_for_newframe(bmain->eval_ctx, bmain, scene, scene->lay);
+	}
+	else if (type == eRTAnimationPlay) {
+		/* play anim, return on same frame as started with */
+		int tot = (scene->r.efra - scene->r.sfra) + 1;
+
+		while (tot--) {
+			/* todo, ability to escape! */
+			scene->r.cfra++;
+			if (scene->r.cfra > scene->r.efra)
+				scene->r.cfra = scene->r.sfra;
 
-			CTX_wm_area_set(C, sa_back);
-			CTX_wm_region_set(C, ar_back);
-		}
-		else if (type == eRTDrawWindowSwap) {
-			redraw_timer_window_swap(C);
-		}
-		else if (type == eRTAnimationStep) {
-			Main *bmain = CTX_data_main(C);
-			Scene *scene = CTX_data_scene(C);
-			
-			if (a & 1) scene->r.cfra--;
-			else scene->r.cfra++;
 			BKE_scene_update_for_newframe(bmain->eval_ctx, bmain, scene, scene->lay);
+			redraw_timer_window_swap(C);
 		}
-		else if (type == eRTAnimationPlay) {
+	}
+	else { /* eRTUndo */
+		ED_undo_pop(C);
+		ED_undo_redo(C);
+	}
+}
+
+static int redraw_timer_exec(bContext *C, wmOperator *op)
+{
+	Main *bmain = CTX_data_main(C);
+	Scene *scene = CTX_data_scene(C);
+	wmWindow *win = CTX_wm_window(C);
+	ARegion *ar = CTX_wm_region(C);
+	double time_start, time_delta;
+	const int type = RNA_enum_get(op->ptr, "type");
+	const int iter = RNA_int_get(op->ptr, "iterations");
+	const double time_limit = (double)RNA_float_get(op->ptr, "time_limit");
+	const int cfra = scene->r.cfra;
+	int a, iter_steps = 0;
+	const char *infostr = "";
+
+	WM_cursor_wait(1);
 
-			/* play anim, return on same frame as started with */
-			Main *bmain = CTX_data_main(C);
-			Scene *scene = CTX_data_scene(C);
-			int tot = (scene->r.efra - scene->r.sfra) + 1;
+	time_start = PIL_check_seconds_timer();
 
-			while (tot--) {
-				/* todo, ability to escape! */
-				scene->r.cfra++;
-				if (scene->r.cfra > scene->r.efra)
-					scene->r.cfra = scene->r.sfra;
+	for (a = 0; a < iter; a++) {
+		redraw_timer_step(C, bmain, scene, win, ar, type, cfra);
+		iter_steps += 1;
 
-				BKE_scene_update_for_newframe(bmain->eval_ctx, bmain, scene, scene->lay);
-				redraw_timer_window_swap(C);
+		if (time_limit != 0.0f) {
+			if ((PIL_check_seconds_timer() - time_start) > time_limit) {
+				break;
 			}
-		}
-		else { /* eRTUndo */
-			ED_undo_pop(C);
-			ED_undo_redo(C);
+			a = 0;
 		}
 	}
 	
-	time = (float)((PIL_check_seconds_timer() - stime) * 1000);
+	time_delta = (float)((PIL_check_seconds_timer() - time_start) * 1000);
 
 	RNA_enum_description(redraw_timer_type_items, type, &infostr);
 
 	WM_cursor_wait(0);
 
-	BKE_reportf(op->reports, RPT_WARNING, "%d x %s: %.2f ms,  average: %.4f", iter, infostr, time, time / iter);
+	BKE_reportf(op->reports, RPT_WARNING,
+	            "%d x %s: %.4f ms, average: %.8f",
+	            iter_steps, infostr, time_delta, time_delta / iter_steps);
 	
 	return OPERATOR_FINISHED;
 }
@@ -4754,6 +4769,8 @@ static void WM_OT_redraw_timer(wmOperatorType *ot)
 
 	ot->prop = RNA_def_enum(ot->srna, "type", redraw_timer_type_items, eRTDrawRegion, "Type", "");
 	RNA_def_int(ot->srna, "iterations", 10, 1, INT_MAX, "Iterations", "Number of times to redraw", 1, 1000);
+	RNA_def_float(ot->srna, "time_limit", 0.0, 0.0, FLT_MAX,
+	              "Time Limit", "Seconds to run the test for (override iterations)", 0.0, 60.0);
 
 }




More information about the Bf-blender-cvs mailing list