From c9a10b99ff2f25b6807cf43c3bfa827ba185e625 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 14 Apr 2013 21:42:58 +0000 Subject: Cycles: optimization for 3D viewport border render with heavy scenes, the OpenGL render of objects could slow things down when redrawing the view each time a new sample is displayed. Now it does a partial redraw of the viewport with only the render border area, skipping OpenGL object drawing while the render is refining. --- source/blender/windowmanager/intern/wm_draw.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'source/blender/windowmanager/intern/wm_draw.c') diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c index e437d7c0958..396c827fe25 100644 --- a/source/blender/windowmanager/intern/wm_draw.c +++ b/source/blender/windowmanager/intern/wm_draw.c @@ -53,6 +53,7 @@ #include "GHOST_C-api.h" +#include "ED_view3d.h" #include "ED_screen.h" #include "GPU_draw.h" @@ -125,14 +126,24 @@ static int wm_area_test_invalid_backbuf(ScrArea *sa) return 1; } -static void wm_region_test_render_do_draw(ScrArea *sa, ARegion *ar) +static void wm_region_test_render_do_draw(bScreen *screen, ScrArea *sa, ARegion *ar) { + /* tag region for redraw from render engine preview running inside of it */ if (sa->spacetype == SPACE_VIEW3D) { RegionView3D *rv3d = ar->regiondata; RenderEngine *engine = (rv3d) ? rv3d->render_engine : NULL; if (engine && (engine->flag & RE_ENGINE_DO_DRAW)) { - ar->do_draw = TRUE; + Scene *scene = screen->scene; + View3D *v3d = sa->spacedata.first; + rcti border_rect; + + /* do partial redraw when possible */ + if (ED_view3d_calc_render_border(scene, v3d, ar, &border_rect)) + ED_region_tag_redraw_partial(ar, &border_rect); + else + ED_region_tag_redraw(ar); + engine->flag &= ~RE_ENGINE_DO_DRAW; } } @@ -710,7 +721,7 @@ static int wm_draw_update_test_window(wmWindow *win) for (sa = win->screen->areabase.first; sa; sa = sa->next) { for (ar = sa->regionbase.first; ar; ar = ar->next) { - wm_region_test_render_do_draw(sa, ar); + wm_region_test_render_do_draw(win->screen, sa, ar); if (ar->swinid && ar->do_draw) do_draw = TRUE; -- cgit v1.2.3