diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-11-02 22:20:53 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-11-02 22:20:53 +0400 |
commit | 97a0ae3e1b7eea3c069da8c6d3c7a3535734059d (patch) | |
tree | 139a1b118140779120ed16c45ed319588596477e /source/blender/windowmanager/intern/wm_draw.c | |
parent | a59f7e02f8c8b2527e6a23e440ca61a9b9992373 (diff) |
RenderEngine api: support for viewport rendering, details here:
http://wiki.blender.org/index.php/Dev:2.6/Source/Render/RenderEngineAPI
* This adds a Rendered draw type in the 3D view, only available when
the render engine implements the view_draw callback.
* 3D view now stores a pointer to a RenderEngine.
* view_draw() callback will do OpenGL drawing instead of the viewport.
* view_update() callback is called after depsgraph updates.
Diffstat (limited to 'source/blender/windowmanager/intern/wm_draw.c')
-rw-r--r-- | source/blender/windowmanager/intern/wm_draw.c | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c index 8261198ef78..389049d9e59 100644 --- a/source/blender/windowmanager/intern/wm_draw.c +++ b/source/blender/windowmanager/intern/wm_draw.c @@ -55,6 +55,8 @@ #include "GPU_draw.h" #include "GPU_extensions.h" +#include "RE_engine.h" + #include "WM_api.h" #include "WM_types.h" #include "wm.h" @@ -113,6 +115,19 @@ static int wm_area_test_invalid_backbuf(ScrArea *sa) return 1; } +static void wm_region_test_render_do_draw(ScrArea *sa, ARegion *ar) +{ + 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 = 1; + engine->flag &= ~RE_ENGINE_DO_DRAW; + } + } +} + /********************** draw all **************************/ /* - reference method, draw all each time */ @@ -205,7 +220,7 @@ static void wm_method_draw_overlap_all(bContext *C, wmWindow *win, int exchange) for(sa= screen->areabase.first; sa; sa= sa->next) for(ar= sa->regionbase.first; ar; ar= ar->next) if(ar->swinid && !wm_area_test_invalid_backbuf(sa)) - ED_region_tag_redraw(ar); + ED_region_tag_redraw(ar); /* flush overlapping regions */ if(screen->regionbase.first) { @@ -662,13 +677,28 @@ static int wm_draw_update_test_window(wmWindow *win) { ScrArea *sa; ARegion *ar; + int do_draw= 0; for(ar= win->screen->regionbase.first; ar; ar= ar->next) { if(ar->do_draw_overlay) { wm_tag_redraw_overlay(win, ar); ar->do_draw_overlay= 0; } + if(ar->swinid && ar->do_draw) + do_draw= 1; + } + + 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); + + if(ar->swinid && ar->do_draw) + do_draw = 1; + } } + + if(do_draw) + return 1; if(win->screen->do_refresh) return 1; @@ -681,15 +711,6 @@ static int wm_draw_update_test_window(wmWindow *win) if(win->screen->do_draw_drag) return 1; - for(ar= win->screen->regionbase.first; ar; ar= ar->next) - if(ar->swinid && ar->do_draw) - return 1; - - for(sa= win->screen->areabase.first; sa; sa= sa->next) - for(ar=sa->regionbase.first; ar; ar= ar->next) - if(ar->swinid && ar->do_draw) - return 1; - return 0; } |