- background images now draw in opengl render
authorCampbell Barton <ideasman42@gmail.com>
Wed, 6 Jun 2012 11:40:01 +0000 (11:40 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 6 Jun 2012 11:40:01 +0000 (11:40 +0000)
- fix bug where forground images could be invisible when clipping was enabled.

source/blender/editors/include/ED_view3d.h
source/blender/editors/space_view3d/space_view3d.c
source/blender/editors/space_view3d/view3d_draw.c

index 55210080e018c89d6fa460a4f103cae7bdcc9f2a..34892fb3c27575e68099509240e23d56b6d6dc36 100644 (file)
@@ -282,7 +282,7 @@ int ED_view3d_scene_layer_set(int lay, const int *values, int *active);
 
 int ED_view3d_context_activate(struct bContext *C);
 void ED_view3d_draw_offscreen(struct Scene *scene, struct View3D *v3d, struct ARegion *ar,
-                              int winx, int winy, float viewmat[][4], float winmat[][4], int draw_background);
+                              int winx, int winy, float viewmat[][4], float winmat[][4], int do_bgpic);
 
 struct ImBuf *ED_view3d_draw_offscreen_imbuf(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, int sizex, int sizey, unsigned int flag, int draw_background, char err_out[256]);
 struct ImBuf *ED_view3d_draw_offscreen_imbuf_simple(struct Scene *scene, struct Object *camera, int width, int height, unsigned int flag, int drawtype, int draw_background, char err_out[256]);
index 28fd2c8bc74138145f8a8a43dae1ce8d3ec54b38..a6948222d9390ade31125d0b09506863b38b5bf1 100644 (file)
@@ -1016,7 +1016,7 @@ static void space_view3d_listener(struct ScrArea *sa, struct wmNotifier *wmn)
                        break;
        }
 
-       // removed since BKE_image_user_frame_calc is now called in draw_bgpic because screen_ops doesnt call the notifier.
+       // removed since BKE_image_user_frame_calc is now called in view3d_draw_bgpic because screen_ops doesnt call the notifier.
 #if 0
        if (wmn->category == NC_SCENE && wmn->data == ND_FRAME) {
                View3D *v3d = area->spacedata.first;
index 14afcaa855f7be86510752c358e0e0eb9de2d3eb..4b484b60ad3a2ae6074a0eccb40333837aecb283 100644 (file)
@@ -1528,7 +1528,8 @@ exit:
 
 /* ************************************************************* */
 
-static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d, int foreground)
+static void view3d_draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d,
+                              const short do_forground, const short do_camera_frame)
 {
        RegionView3D *rv3d = ar->regiondata;
        BGpic *bgpic;
@@ -1537,7 +1538,7 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d, int foreground)
        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;
+       int fg_flag = do_forground ? V3D_BGPIC_FOREGROUND : 0;
 
        for (bgpic = v3d->bgpicbase.first; bgpic; bgpic = bgpic->next) {
 
@@ -1560,7 +1561,7 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d, int foreground)
                                BKE_image_user_frame_calc(&bgpic->iuser, CFRA, 0);
                                ibuf = BKE_image_get_ibuf(ima, &bgpic->iuser);
                        }
-                       else {
+                       else if (bgpic->source == V3D_BGPIC_MOVIE) {
                                clip = NULL;
 
                                if (bgpic->flag & V3D_BGPIC_CAMERACLIP) {
@@ -1595,14 +1596,21 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d, int foreground)
                                IMB_rect_from_float(ibuf);
 
                        if (rv3d->persp == RV3D_CAMOB) {
-                               rctf vb;
-
-                               ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &vb, FALSE);
 
-                               x1 = vb.xmin;
-                               y1 = vb.ymin;
-                               x2 = vb.xmax;
-                               y2 = vb.ymax;
+                               if (do_camera_frame) {
+                                       rctf vb;
+                                       ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &vb, FALSE);
+                                       x1 = vb.xmin;
+                                       y1 = vb.ymin;
+                                       x2 = vb.xmax;
+                                       y2 = vb.ymax;
+                               }
+                               else {
+                                        x1 = ar->winrct.xmin;
+                                        y1 = ar->winrct.ymin;
+                                        x2 = ar->winrct.xmax;
+                                        y2 = ar->winrct.ymax;
+                               }
                        }
                        else {
                                float sco[2];
@@ -1696,7 +1704,8 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d, int foreground)
        }
 }
 
-static void draw_bgpics(Scene *scene, ARegion *ar, View3D *v3d, int foreground)
+static void view3d_draw_bgpic_test(Scene *scene, ARegion *ar, View3D *v3d,
+                                   const short do_forground, const short do_camera_frame)
 {
        RegionView3D *rv3d = ar->regiondata;
 
@@ -1708,11 +1717,11 @@ static void draw_bgpics(Scene *scene, ARegion *ar, View3D *v3d, int foreground)
 
        if ((rv3d->view == RV3D_VIEW_USER) || (rv3d->persp != RV3D_ORTHO)) {
                if (rv3d->persp == RV3D_CAMOB) {
-                       draw_bgpic(scene, ar, v3d, foreground);
+                       view3d_draw_bgpic(scene, ar, v3d, do_forground, do_camera_frame);
                }
        }
        else {
-               draw_bgpic(scene, ar, v3d, foreground);
+               view3d_draw_bgpic(scene, ar, v3d, do_forground, do_camera_frame);
        }
 }
 
@@ -2428,14 +2437,13 @@ static void view3d_main_area_setup_view(Scene *scene, View3D *v3d, ARegion *ar,
 
 void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar,
                               int winx, int winy, float viewmat[][4], float winmat[][4],
-                              int draw_background)
+                              int do_bgpic)
 {
        RegionView3D *rv3d = ar->regiondata;
        Base *base;
        float backcol[3];
        int bwinx, bwiny;
        rcti brect;
-       ImBuf *bg_ibuf = NULL;
 
        glPushMatrix();
 
@@ -2465,66 +2473,21 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar,
        if (draw_glsl_material(scene, NULL, v3d, v3d->drawtype))
                gpu_update_lamps_shadows(scene, v3d);
 
-       /* if scene has got active clip, use it for render backdrop */
-       if (draw_background && scene->clip && rv3d->persp == RV3D_CAMOB && v3d->camera) {
-               MovieClipUser user = {0};
-
-               BKE_movieclip_user_set_frame(&user, CFRA);
-               bg_ibuf = BKE_movieclip_get_ibuf(scene->clip, &user);
+       /* set background color, fallback on the view background color
+        * (if active clip is set but frame is failed to load fallback to horizon color as background) */
+       if (scene->world) {
+               if (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT)
+                       linearrgb_to_srgb_v3_v3(backcol, &scene->world->horr);
+               else
+                       copy_v3_v3(backcol, &scene->world->horr);
+               glClearColor(backcol[0], backcol[1], backcol[2], 0.0);
        }
-
-       if (!bg_ibuf) {
-               /* set background color, fallback on the view background color
-                * (if active clip is set but frame is failed to load fallback to horizon color as background) */
-               if (scene->world) {
-                       if (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT)
-                               linearrgb_to_srgb_v3_v3(backcol, &scene->world->horr);
-                       else
-                               copy_v3_v3(backcol, &scene->world->horr);
-                       glClearColor(backcol[0], backcol[1], backcol[2], 0.0);
-               }
-               else {
-                       UI_ThemeClearColor(TH_BACK);
-               }
+       else {
+               UI_ThemeClearColor(TH_BACK);
        }
 
-       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-       if (bg_ibuf) {
-               unsigned char *pixels, *cp, *dst_cp;
-               int i;
-
-               if (bg_ibuf->rect_float && !bg_ibuf->rect)
-                       IMB_rect_from_float(bg_ibuf);
-
-               dst_cp = pixels = MEM_callocN(4 * sizeof(unsigned char) * bg_ibuf->x * bg_ibuf->y, "draw offscreen clip pixels");
-               cp = (unsigned char *)bg_ibuf->rect;
-               for (i = 0; i < bg_ibuf->x * bg_ibuf->y; i++, cp += 4, dst_cp += 4) {
-                       dst_cp[0] = cp[0];
-                       dst_cp[1] = cp[1];
-                       dst_cp[2] = cp[2];
-                       dst_cp[3] = 255;
-               }
-
-               glMatrixMode(GL_PROJECTION);
-               glPushMatrix();
-               glMatrixMode(GL_MODELVIEW);
-               glPushMatrix();
-               ED_region_pixelspace(ar);
-
-               glPixelZoom((float)winx / bg_ibuf->x, (float)winy / bg_ibuf->y);
-               glaDrawPixelsTex(0, 0, bg_ibuf->x, bg_ibuf->y, GL_UNSIGNED_BYTE, pixels);
-
-               glPixelZoom(1.0, 1.0);
 
-               glMatrixMode(GL_PROJECTION);
-               glPopMatrix();
-               glMatrixMode(GL_MODELVIEW);
-               glPopMatrix();
-
-               IMB_freeImBuf(bg_ibuf);
-               MEM_freeN(pixels);
-       }
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
        /* setup view matrices */
        view3d_main_area_setup_view(scene, v3d, ar, viewmat, winmat);
@@ -2540,6 +2503,11 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar,
        else
                v3d->zbuf = FALSE;
 
+       /* important to do before clipping */
+       if (do_bgpic) {
+               view3d_draw_bgpic_test(scene, ar, v3d, FALSE, FALSE);
+       }
+
        if (rv3d->rflag & RV3D_CLIPPING)
                ED_view3d_clipping_set(rv3d);
 
@@ -2581,6 +2549,11 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar,
        if (rv3d->rflag & RV3D_CLIPPING)
                ED_view3d_clipping_disable();
 
+       /* important to do after clipping */
+       if (do_bgpic) {
+               view3d_draw_bgpic_test(scene, ar, v3d, TRUE, FALSE);
+       }
+
        /* cleanup */
        if (v3d->zbuf) {
                v3d->zbuf = FALSE;
@@ -2792,7 +2765,7 @@ 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, FALSE);
+               view3d_draw_bgpic(scene, ar, v3d, FALSE, TRUE);
        else
                fdrawcheckerboard(0, 0, ar->winx, ar->winy);
 
@@ -2800,7 +2773,7 @@ static int view3d_main_area_draw_engine(const bContext *C, ARegion *ar)
        type->view_draw(rv3d->render_engine, C);
 
        if (v3d->flag & V3D_DISPBGPICS)
-               draw_bgpic(scene, ar, v3d, TRUE);
+               view3d_draw_bgpic(scene, ar, v3d, TRUE, TRUE);
 
        return 1;
 }
@@ -2896,7 +2869,7 @@ static void view3d_main_area_draw_objects(const bContext *C, ARegion *ar, const
                }
        }
 
-       draw_bgpics(scene, ar, v3d, FALSE);
+       view3d_draw_bgpic_test(scene, ar, v3d, FALSE, TRUE);
 
        if (rv3d->rflag & RV3D_CLIPPING)
                ED_view3d_clipping_set(rv3d);
@@ -2955,8 +2928,6 @@ 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) {
@@ -2976,6 +2947,9 @@ static void view3d_main_area_draw_objects(const bContext *C, ARegion *ar, const
        if (rv3d->rflag & RV3D_CLIPPING)
                ED_view3d_clipping_disable();
        
+       /* important to do after clipping */
+       view3d_draw_bgpic_test(scene, ar, v3d, TRUE, TRUE);
+
        BIF_draw_manipulator(C);
 
 #if 0