diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-04-10 18:59:06 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-04-10 18:59:06 +0400 |
commit | 4795f4b9ac984fa47525d04cf2444eeb9267c501 (patch) | |
tree | d40660f4e395502e95d7b09ab73d6f03e09596be /source/blender/editors/space_view3d/view3d_draw.c | |
parent | 0906ac9914b2ca470d37085b54c52720704bd913 (diff) |
mango request: option to draw background in front of all objects in the viewport.
Should be really handy for painting clean plates.
Diffstat (limited to 'source/blender/editors/space_view3d/view3d_draw.c')
-rw-r--r-- | source/blender/editors/space_view3d/view3d_draw.c | 45 |
1 files changed, 34 insertions, 11 deletions
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 59a19782f1d..9e5bd1c860c 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -1515,7 +1515,7 @@ exit: /* ************************************************************* */ -static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d) +static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d, int foreground) { RegionView3D *rv3d = ar->regiondata; BGpic *bgpic; @@ -1524,10 +1524,13 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d) ImBuf *ibuf = NULL, *freeibuf; float vec[4], fac, asp, zoomx, zoomy; float x1, y1, x2, y2, cx, cy; - + int fg_flag = foreground ? V3D_BGPIC_FOREGROUND : 0; for (bgpic = v3d->bgpicbase.first; bgpic; bgpic = bgpic->next) { + if ((bgpic->flag & V3D_BGPIC_FOREGROUND) != fg_flag) + continue; + if ((bgpic->view == 0) || /* zero for any */ (bgpic->view & (1 << rv3d->view)) || /* check agaist flags */ (rv3d->persp == RV3D_CAMOB && bgpic->view == (1 << RV3D_VIEW_CAMERA))) @@ -1680,6 +1683,26 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d) } } +static void draw_bgpics(Scene *scene, ARegion *ar, View3D *v3d, int foreground) +{ + RegionView3D *rv3d = ar->regiondata; + + if ((v3d->flag & V3D_DISPBGPICS) == 0) + return; + + if (v3d->flag2 & V3D_RENDER_OVERRIDE) + return; + + if ((rv3d->view == RV3D_VIEW_USER) || (rv3d->persp != RV3D_ORTHO)) { + if (rv3d->persp == RV3D_CAMOB) { + draw_bgpic(scene, ar, v3d, foreground); + } + } + else { + draw_bgpic(scene, ar, v3d, foreground); + } +} + /* ****************** View3d afterdraw *************** */ typedef struct View3DAfter { @@ -2750,13 +2773,16 @@ static int view3d_main_area_draw_engine(const bContext *C, ARegion *ar) /* render result draw */ if (v3d->flag & V3D_DISPBGPICS) - draw_bgpic(scene, ar, v3d); + draw_bgpic(scene, ar, v3d, FALSE); else fdrawcheckerboard(0, 0, ar->winx, ar->winy); type = rv3d->render_engine->type; type->view_draw(rv3d->render_engine, C); + if (v3d->flag & V3D_DISPBGPICS) + draw_bgpic(scene, ar, v3d, TRUE); + return 1; } @@ -2837,9 +2863,6 @@ static void view3d_main_area_draw_objects(const bContext *C, ARegion *ar, const star_stuff_term_func); } } - if ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) { - if (v3d->flag & V3D_DISPBGPICS) draw_bgpic(scene, ar, v3d); - } } } else { @@ -2851,13 +2874,11 @@ static void view3d_main_area_draw_objects(const bContext *C, ARegion *ar, const glLoadMatrixf(rv3d->winmat); glMatrixMode(GL_MODELVIEW); glLoadMatrixf(rv3d->viewmat); - - if (v3d->flag & V3D_DISPBGPICS) { - draw_bgpic(scene, ar, v3d); - } } } - + + draw_bgpics(scene, ar, v3d, FALSE); + if (rv3d->rflag & RV3D_CLIPPING) ED_view3d_clipping_set(rv3d); @@ -2915,6 +2936,8 @@ static void view3d_main_area_draw_objects(const bContext *C, ARegion *ar, const } } + draw_bgpics(scene, ar, v3d, TRUE); + // REEB_draw(); if ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) { |