diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-04-15 01:42:58 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-04-15 01:42:58 +0400 |
commit | c9a10b99ff2f25b6807cf43c3bfa827ba185e625 (patch) | |
tree | cfac9bc40c5b1f2a039933882d18dfd7c4f6513a /source/blender/windowmanager/intern/wm_draw.c | |
parent | 77a78658eaf8903d359b23867ae00cf492d39f75 (diff) |
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.
Diffstat (limited to 'source/blender/windowmanager/intern/wm_draw.c')
-rw-r--r-- | source/blender/windowmanager/intern/wm_draw.c | 17 |
1 files changed, 14 insertions, 3 deletions
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; |