Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2015-07-12 15:57:35 +0300
committerCampbell Barton <ideasman42@gmail.com>2015-07-12 15:57:35 +0300
commit8d48f8e0b0ffa6ad82f5cf03177479032a8f4301 (patch)
treef5c6c581280f3c38d8a7bfcd5ceafc4bf53cdfdb /source/blender/windowmanager
parent2fd3b9ad846621c8d3002fa561bd3fd6a972b8af (diff)
Add ability for redraw timer to run for fixed time
Also avoid accessing context vars in timer loop.
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c169
1 files changed, 93 insertions, 76 deletions
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 66dd851fc91..2a35a040bc5 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);
}