- background images now draw in opengl render

- fix bug where forground images could be invisible when clipping was enabled.
This commit is contained in:
Campbell Barton
2012-06-06 11:40:01 +00:00
parent 91beb27500
commit c6d0ebcdf9
3 changed files with 52 additions and 78 deletions

View 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]);

View 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;

View 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,67 +2473,22 @@ 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);
}
else {
UI_ThemeClearColor(TH_BACK);
}
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);
}
}
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);
}
/* 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