diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-03-24 02:12:24 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-04-17 17:11:34 +0400 |
commit | 02e5bdf864bdf001af5ef751f296e90c02edad5b (patch) | |
tree | 98aef831e7ef5e854c5542219e74d0be4bdf13d2 /source/blender/editors/space_view3d | |
parent | e0e05ae85eee83dfc5c07f3dba0664a3ade62d7a (diff) |
Initial implementation of overscan renderingoverscan
For now only affects blender internal renderer and viewport.
Currently it's possible to define overscan (in %%) manually
or make it so distortion matches the motrack displacement
model.
Still need to do loads of things in compositor, but it's
not such a bad starting point.
We can even start a branch for this.
Reviewers: dfelinto
Differential Revision: https://developer.blender.org/D462
Diffstat (limited to 'source/blender/editors/space_view3d')
-rw-r--r-- | source/blender/editors/space_view3d/drawobject.c | 9 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_draw.c | 161 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_edit.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_fly.c | 4 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_intern.h | 2 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_view.c | 14 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_walk.c | 2 |
7 files changed, 127 insertions, 67 deletions
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index d9bc40b6555..50db6282e4e 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -1723,6 +1723,7 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base float drawsize; const bool is_view = (rv3d->persp == RV3D_CAMOB && ob == v3d->camera); MovieClip *clip = BKE_object_movieclip_get(scene, base->object, false); + float overscan_factor = 1.0f + scene->r.overscan / 100.0f; /* draw data for movie clip set as active for scene */ if (clip) { @@ -1795,15 +1796,15 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base else if (i == 1 && (ob == v3d->camera)) glBegin(GL_TRIANGLES); else break; - tvec[0] = shift[0] + ((-0.7f * drawsize) * scale[0]); - tvec[1] = shift[1] + ((drawsize * (asp[1] + 0.1f)) * scale[1]); + tvec[0] = shift[0] + ((-0.7f * drawsize) * scale[0]) * overscan_factor; + tvec[1] = shift[1] + ((drawsize * (asp[1] + 0.1f)) * scale[1]) * overscan_factor; glVertex3fv(tvec); /* left */ - tvec[0] = shift[0] + ((0.7f * drawsize) * scale[0]); + tvec[0] = shift[0] + ((0.7f * drawsize) * scale[0]) * overscan_factor; glVertex3fv(tvec); /* right */ tvec[0] = shift[0]; - tvec[1] = shift[1] + ((1.1f * drawsize * (asp[1] + 0.7f)) * scale[1]); + tvec[1] = shift[1] + ((1.1f * drawsize * (asp[1] + 0.7f)) * scale[1]) * overscan_factor; glVertex3fv(tvec); /* top */ glEnd(); diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index d22dca4ad88..fbd5c3f4e1f 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -934,17 +934,27 @@ static void draw_selected_name(Scene *scene, Object *ob, rcti *rect) BLF_draw_default(offset, 0.5f * U.widget_unit, 0.0f, info, sizeof(info)); } +static void view3d_camera_border_within_viewport(ARegion *ar, rctf *rect_view, rctf *rect_camera, rctf *viewborder_r) +{ + viewborder_r->xmin = ((rect_camera->xmin - rect_view->xmin)/BLI_rctf_size_x(rect_view))*ar->winx; + viewborder_r->xmax = ((rect_camera->xmax - rect_view->xmin)/BLI_rctf_size_x(rect_view))*ar->winx; + viewborder_r->ymin = ((rect_camera->ymin - rect_view->ymin)/BLI_rctf_size_y(rect_view))*ar->winy; + viewborder_r->ymax = ((rect_camera->ymax - rect_view->ymin)/BLI_rctf_size_y(rect_view))*ar->winy; +} + static void view3d_camera_border(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D *rv3d, - rctf *r_viewborder, const bool no_shift, const bool no_zoom) + rctf *r_viewborder, rctf *r_underscan_viewborder, + const bool no_shift, const bool no_zoom) { CameraParams params; - rctf rect_view, rect_camera; + rctf rect_view, rect_camera, rect_camera_underscan; /* get viewport viewplane */ BKE_camera_params_init(¶ms); BKE_camera_params_from_view3d(¶ms, v3d, rv3d); if (no_zoom) params.zoom = 1.0f; + params.overscan = scene->r.overscan; BKE_camera_params_compute_viewplane(¶ms, ar->winx, ar->winy, 1.0f, 1.0f); rect_view = params.viewplane; @@ -958,29 +968,33 @@ static void view3d_camera_border(Scene *scene, ARegion *ar, View3D *v3d, RegionV params.shiftx = 0.0f; params.shifty = 0.0f; } + params.overscan = scene->r.overscan; BKE_camera_params_compute_viewplane(¶ms, scene->r.xsch, scene->r.ysch, scene->r.xasp, scene->r.yasp); rect_camera = params.viewplane; + rect_camera_underscan = params.underscan_viewplane; /* get camera border within viewport */ - r_viewborder->xmin = ((rect_camera.xmin - rect_view.xmin) / BLI_rctf_size_x(&rect_view)) * ar->winx; - r_viewborder->xmax = ((rect_camera.xmax - rect_view.xmin) / BLI_rctf_size_x(&rect_view)) * ar->winx; - r_viewborder->ymin = ((rect_camera.ymin - rect_view.ymin) / BLI_rctf_size_y(&rect_view)) * ar->winy; - r_viewborder->ymax = ((rect_camera.ymax - rect_view.ymin) / BLI_rctf_size_y(&rect_view)) * ar->winy; + if (r_viewborder) + view3d_camera_border_within_viewport(ar, &rect_view, &rect_camera, r_viewborder); + + if (r_underscan_viewborder) + view3d_camera_border_within_viewport(ar, &rect_view, &rect_camera_underscan, r_underscan_viewborder); } void ED_view3d_calc_camera_border_size(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D *rv3d, float r_size[2]) { rctf viewborder; - view3d_camera_border(scene, ar, v3d, rv3d, &viewborder, true, true); + view3d_camera_border(scene, ar, v3d, rv3d, &viewborder, NULL, true, true); r_size[0] = BLI_rctf_size_x(&viewborder); r_size[1] = BLI_rctf_size_y(&viewborder); } void ED_view3d_calc_camera_border(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D *rv3d, - rctf *r_viewborder, const bool no_shift) + rctf *r_viewborder, rctf *r_underscan_viewborder, + const bool no_shift) { - view3d_camera_border(scene, ar, v3d, rv3d, r_viewborder, no_shift, false); + view3d_camera_border(scene, ar, v3d, rv3d, r_viewborder, r_underscan_viewborder, no_shift, false); } static void drawviewborder_grid3(float x1, float x2, float y1, float y2, float fac) @@ -1058,24 +1072,31 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) { float hmargin, vmargin; float x1, x2, y1, y2; - float x1i, x2i, y1i, y2i; + float x1i, x2i, y1i, y2i, x5i, x6i, y5i, y6i; + float x5, y5, x6, y6; - rctf viewborder; + rctf viewborder, underscan_viewborder; Camera *ca = NULL; RegionView3D *rv3d = ar->regiondata; + int draw_passepart; if (v3d->camera == NULL) return; if (v3d->camera->type == OB_CAMERA) ca = v3d->camera->data; - ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &viewborder, false); + ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &viewborder, &underscan_viewborder, false); /* the offsets */ x1 = viewborder.xmin; y1 = viewborder.ymin; x2 = viewborder.xmax; y2 = viewborder.ymax; - + + x5 = underscan_viewborder.xmin; + y5 = underscan_viewborder.ymin; + x6 = underscan_viewborder.xmax; + y6 = underscan_viewborder.ymax; + /* apply offsets so the real 3D camera shows through */ /* note: quite un-scientific but without this bit extra @@ -1085,11 +1106,18 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) * but keep it here in case we need to remove the workaround */ x1i = (int)(x1 - 1.0001f); y1i = (int)(y1 - 1.0001f); - x2i = (int)(x2 + (1.0f - 0.0001f)); - y2i = (int)(y2 + (1.0f - 0.0001f)); + x2i = (int)(x2 + (1.0f-0.0001f)); + y2i = (int)(y2 + (1.0f-0.0001f)); + + /* same goes to underscan border */ + x5i = (int)(x5 - 1.0001f); + y5i = (int)(y5 - 1.0001f); + x6i = (int)(x6 + (1.0f-0.0001f)); + y6i = (int)(y6 + (1.0f-0.0001f)); /* passepartout, specified in camera edit buttons */ - if (ca && (ca->flag & CAM_SHOWPASSEPARTOUT) && ca->passepartalpha > 0.000001f) { + draw_passepart= (ca->flag & CAM_SHOWPASSEPARTOUT) && ca->passepartalpha > 0.000001f; + if (draw_passepart) { if (ca->passepartalpha == 1.0f) { glColor3f(0, 0, 0); } @@ -1138,6 +1166,32 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) UI_ThemeColor(TH_VIEW_OVERLAY); glRectf(x1i, y1i, x2i, y2i); + if (scene->r.overscan > 0.0f) { + UI_ThemeColorShade(TH_WIRE, 100); + uiDrawBox(GL_LINE_LOOP, x5i, y5i, x6i, y6i, 2.0); + + if (draw_passepart) { + setlinestyle(0); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glColor4f(0, 0, 0, ca->passepartalpha*0.5f); + + if (x5i > x1i) + glRectf(x1i, y1i, x5i, y2i); + if (x6i < x2i) + glRectf(x6i, y1i, x2i, y2i); + if (y6i < y2i) + glRectf(x5i, y6i, x6i, y2i); + if (y5i > y1i) + glRectf(x5i, y5i, x6i, y1i); + setlinestyle(3); + } + + glDisable(GL_BLEND); + } + /* border */ if (scene->r.mode & R_BORDER) { float x3, y3, x4, y4; @@ -1148,7 +1202,7 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) y4 = y1 + scene->r.border.ymax * (y2 - y1); cpack(0x4040FF); - glRecti(x3, y3, x4, y4); + glRectf(x3, y3, x4, y4); } /* safety border */ @@ -1158,15 +1212,15 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) UI_ThemeColorBlendShade(TH_VIEW_OVERLAY, TH_BACK, 0.25, 0); - x3 = x1 + 0.5f * (x2 - x1); - y3 = y1 + 0.5f * (y2 - y1); + x3 = x5+ 0.5f*(x6-x5); + y3 = y5+ 0.5f*(y6-y5); glBegin(GL_LINES); - glVertex2f(x1, y3); - glVertex2f(x2, y3); + glVertex2f(x5, y3); + glVertex2f(x6, y3); - glVertex2f(x3, y1); - glVertex2f(x3, y2); + glVertex2f(x3, y5); + glVertex2f(x3, y6); glEnd(); } @@ -1174,54 +1228,54 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) UI_ThemeColorBlendShade(TH_VIEW_OVERLAY, TH_BACK, 0.25, 0); glBegin(GL_LINES); - glVertex2f(x1, y1); - glVertex2f(x2, y2); + glVertex2f(x5, y5); + glVertex2f(x6, y6); - glVertex2f(x1, y2); - glVertex2f(x2, y1); + glVertex2f(x5, y6); + glVertex2f(x6, y5); glEnd(); } if (ca->dtx & CAM_DTX_THIRDS) { UI_ThemeColorBlendShade(TH_VIEW_OVERLAY, TH_BACK, 0.25, 0); - drawviewborder_grid3(x1, x2, y1, y2, 1.0f / 3.0f); + drawviewborder_grid3(x5, x6, y5, y6, 1.0f / 3.0f); } if (ca->dtx & CAM_DTX_GOLDEN) { UI_ThemeColorBlendShade(TH_VIEW_OVERLAY, TH_BACK, 0.25, 0); - drawviewborder_grid3(x1, x2, y1, y2, 1.0f - (1.0f / 1.61803399f)); + drawviewborder_grid3(x5, x6, y5, y6, 1.0f - (1.0f / 1.61803399f)); } if (ca->dtx & CAM_DTX_GOLDEN_TRI_A) { UI_ThemeColorBlendShade(TH_VIEW_OVERLAY, TH_BACK, 0.25, 0); - drawviewborder_triangle(x1, x2, y1, y2, 0, 'A'); + drawviewborder_triangle(x5, x6, y5, y6, 0, 'A'); } if (ca->dtx & CAM_DTX_GOLDEN_TRI_B) { UI_ThemeColorBlendShade(TH_VIEW_OVERLAY, TH_BACK, 0.25, 0); - drawviewborder_triangle(x1, x2, y1, y2, 0, 'B'); + drawviewborder_triangle(x5, x6, y5, y6, 0, 'B'); } if (ca->dtx & CAM_DTX_HARMONY_TRI_A) { UI_ThemeColorBlendShade(TH_VIEW_OVERLAY, TH_BACK, 0.25, 0); - drawviewborder_triangle(x1, x2, y1, y2, 1, 'A'); + drawviewborder_triangle(x5, x6, y5, y6, 1, 'A'); } if (ca->dtx & CAM_DTX_HARMONY_TRI_B) { UI_ThemeColorBlendShade(TH_VIEW_OVERLAY, TH_BACK, 0.25, 0); - drawviewborder_triangle(x1, x2, y1, y2, 1, 'B'); + drawviewborder_triangle(x5, x6, y5, y6, 1, 'B'); } if (ca->flag & CAM_SHOWTITLESAFE) { UI_ThemeColorBlendShade(TH_VIEW_OVERLAY, TH_BACK, 0.25, 0); - hmargin = 0.1f * (x2 - x1); - vmargin = 0.05f * (y2 - y1); - uiDrawBox(GL_LINE_LOOP, x1 + hmargin, y1 + vmargin, x2 - hmargin, y2 - vmargin, 2.0f); + hmargin = 0.1f * (x6 - x5); + vmargin = 0.05f * (y6 - y5); + uiDrawBox(GL_LINE_LOOP, x5 + hmargin, y5 + vmargin, x6 - hmargin, y6 - vmargin, 2.0f); - hmargin = 0.035f * (x2 - x1); - vmargin = 0.035f * (y2 - y1); - uiDrawBox(GL_LINE_LOOP, x1 + hmargin, y1 + vmargin, x2 - hmargin, y2 - vmargin, 2.0f); + hmargin = 0.035f * (x6 - x5); + vmargin = 0.035f * (y6 - y5); + uiDrawBox(GL_LINE_LOOP, x5 + hmargin, y5 + vmargin, x6 - hmargin, y6 - vmargin, 2.0f); } if (ca->flag & CAM_SHOWSENSOR) { /* determine sensor fit, and get sensor x/y, for auto fit we @@ -1236,22 +1290,22 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) rctf rect; if (sensor_fit == CAMERA_SENSOR_FIT_HOR) { - float sensor_scale = (x2i - x1i) / sensor_x; + float sensor_scale = (x6i-x5i) / sensor_x; float sensor_height = sensor_scale * sensor_y; - rect.xmin = x1i; - rect.xmax = x2i; - rect.ymin = (y1i + y2i) * 0.5f - sensor_height * 0.5f; + rect.xmin = x5i; + rect.xmax = x6i; + rect.ymin = (y5i + y6i) * 0.5f - sensor_height * 0.5f; rect.ymax = rect.ymin + sensor_height; } else { - float sensor_scale = (y2i - y1i) / sensor_y; + float sensor_scale = (y6i-y5i) / sensor_y; float sensor_width = sensor_scale * sensor_x; - rect.xmin = (x1i + x2i) * 0.5f - sensor_width * 0.5f; + rect.xmin = (x5i + x6i) * 0.5f - sensor_width * 0.5f; rect.xmax = rect.xmin + sensor_width; - rect.ymin = y1i; - rect.ymax = y2i; + rect.ymin = y5i; + rect.ymax = y6i; } /* draw */ @@ -1669,7 +1723,7 @@ static void view3d_draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d, if (do_camera_frame) { rctf vb; - ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &vb, false); + ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, NULL, &vb, false); x1 = vb.xmin; y1 = vb.ymin; x2 = vb.xmax; @@ -2221,9 +2275,10 @@ float view3d_depth_near(ViewDepths *d) void draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d) { short zbuf = v3d->zbuf; + float overscan = scene->r.overscan; RegionView3D *rv3d = ar->regiondata; - setwinmatrixview3d(ar, v3d, NULL); + setwinmatrixview3d(ar, v3d, NULL, overscan); setviewmatrixview3d(scene, v3d, rv3d); /* note: calls BKE_object_where_is_calc for camera... */ mul_m4_m4m4(rv3d->persmat, rv3d->winmat, rv3d->viewmat); @@ -2253,6 +2308,7 @@ void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (*func)(void *), boo short flag = v3d->flag; float glalphaclip = U.glalphaclip; int obcenter_dia = U.obcenter_dia; + float overscan = scene->r.overscan; /* temp set drawtype to solid */ /* Setting these temporarily is not nice */ @@ -2260,7 +2316,7 @@ void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (*func)(void *), boo U.glalphaclip = alphaoverride ? 0.5f : glalphaclip; /* not that nice but means we wont zoom into billboards */ U.obcenter_dia = 0; - setwinmatrixview3d(ar, v3d, NULL); + setwinmatrixview3d(ar, v3d, NULL, overscan); setviewmatrixview3d(scene, v3d, rv3d); /* note: calls BKE_object_where_is_calc for camera... */ mul_m4_m4m4(rv3d->persmat, rv3d->winmat, rv3d->viewmat); @@ -2514,12 +2570,13 @@ CustomDataMask ED_view3d_screen_datamask(bScreen *screen) void ED_view3d_update_viewmat(Scene *scene, View3D *v3d, ARegion *ar, float viewmat[4][4], float winmat[4][4]) { RegionView3D *rv3d = ar->regiondata; + float overscan= scene->r.overscan; /* setup window matrices */ if (winmat) copy_m4_m4(rv3d->winmat, winmat); else - setwinmatrixview3d(ar, v3d, NULL); + setwinmatrixview3d(ar, v3d, NULL, overscan); /* setup view matrix */ if (viewmat) @@ -3027,7 +3084,7 @@ bool ED_view3d_calc_render_border(Scene *scene, View3D *v3d, ARegion *ar, rcti * /* compute border */ if (rv3d->persp == RV3D_CAMOB) { - ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &viewborder, false); + ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &viewborder, NULL, false); rect->xmin = viewborder.xmin + scene->r.border.xmin * BLI_rctf_size_x(&viewborder); rect->ymin = viewborder.ymin + scene->r.border.ymin * BLI_rctf_size_y(&viewborder); diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 6b08ae98677..d91aa92bbc7 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -3082,7 +3082,7 @@ static int render_border_exec(bContext *C, wmOperator *op) /* calculate range */ if (rv3d->persp == RV3D_CAMOB) { - ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &vb, false); + ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &vb, NULL, false); } else { vb.xmin = 0; diff --git a/source/blender/editors/space_view3d/view3d_fly.c b/source/blender/editors/space_view3d/view3d_fly.c index 6afe0ef896f..ae61931e4d5 100644 --- a/source/blender/editors/space_view3d/view3d_fly.c +++ b/source/blender/editors/space_view3d/view3d_fly.c @@ -234,7 +234,7 @@ static void drawFlyPixel(const struct bContext *UNUSED(C), ARegion *UNUSED(ar), float x1, x2, y1, y2; if (fly->scene->camera) { - ED_view3d_calc_camera_border(fly->scene, fly->ar, fly->v3d, fly->rv3d, &viewborder, false); + ED_view3d_calc_camera_border(fly->scene, fly->ar, fly->v3d, fly->rv3d, &viewborder, NULL, false); xoff = viewborder.xmin; yoff = viewborder.ymin; } @@ -391,7 +391,7 @@ static bool initFlyInfo(bContext *C, FlyInfo *fly, wmOperator *op, const wmEvent /* calculate center */ if (fly->scene->camera) { - ED_view3d_calc_camera_border(fly->scene, fly->ar, fly->v3d, fly->rv3d, &viewborder, false); + ED_view3d_calc_camera_border(fly->scene, fly->ar, fly->v3d, fly->rv3d, &viewborder, NULL, false); fly->width = BLI_rctf_size_x(&viewborder); fly->height = BLI_rctf_size_y(&viewborder); diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h index 3e7c97abaa9..0a9e0ab85aa 100644 --- a/source/blender/editors/space_view3d/view3d_intern.h +++ b/source/blender/editors/space_view3d/view3d_intern.h @@ -208,7 +208,7 @@ void ED_view3d_smooth_view(struct bContext *C, struct View3D *v3d, struct ARegio float *ofs, float *quat, float *dist, float *lens, const int smooth_viewtx); -void setwinmatrixview3d(ARegion *ar, View3D *v3d, rctf *rect); +void setwinmatrixview3d(ARegion *ar, View3D *v3d, rctf *rect, float overscan); void setviewmatrixview3d(Scene *scene, View3D *v3d, RegionView3D *rv3d); void fly_modal_keymap(struct wmKeyConfig *keyconf); diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index fdfce062adc..169bd584c94 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -728,12 +728,13 @@ bool ED_view3d_clip_range_get(View3D *v3d, RegionView3D *rv3d, float *r_clipsta, } /* also exposed in previewrender.c */ -bool ED_view3d_viewplane_get(View3D *v3d, RegionView3D *rv3d, int winx, int winy, +bool ED_view3d_viewplane_get(View3D *v3d, RegionView3D *rv3d, int winx, int winy, float overscan, rctf *r_viewplane, float *r_clipsta, float *r_clipend, float *r_pixsize) { CameraParams params; BKE_camera_params_init(¶ms); + params.overscan = overscan; BKE_camera_params_from_view3d(¶ms, v3d, rv3d); BKE_camera_params_compute_viewplane(¶ms, winx, winy, 1.0f, 1.0f); @@ -767,14 +768,14 @@ void ED_view3d_polygon_offset(const RegionView3D *rv3d, const float dist) /*! * \param rect for picking, NULL not to use. */ -void setwinmatrixview3d(ARegion *ar, View3D *v3d, rctf *rect) +void setwinmatrixview3d(ARegion *ar, View3D *v3d, rctf *rect, float overscan) { RegionView3D *rv3d = ar->regiondata; rctf viewplane; float clipsta, clipend, x1, y1, x2, y2; bool is_ortho; - is_ortho = ED_view3d_viewplane_get(v3d, rv3d, ar->winx, ar->winy, &viewplane, &clipsta, &clipend, NULL); + is_ortho = ED_view3d_viewplane_get(v3d, rv3d, ar->winx, ar->winy, overscan, &viewplane, &clipsta, &clipend, NULL); rv3d->is_persp = !is_ortho; #if 0 @@ -963,6 +964,7 @@ short view3d_opengl_select(ViewContext *vc, unsigned int *buffer, unsigned int b char dt; short dtx; const bool use_obedit_skip = (scene->obedit != NULL) && (vc->obedit == NULL); + float overscan = scene->r.overscan; G.f |= G_PICKSEL; @@ -977,7 +979,7 @@ short view3d_opengl_select(ViewContext *vc, unsigned int *buffer, unsigned int b BLI_rctf_rcti_copy(&rect, input); } - setwinmatrixview3d(ar, v3d, &rect); + setwinmatrixview3d(ar, v3d, &rect, overscan); mul_m4_m4m4(vc->rv3d->persmat, vc->rv3d->winmat, vc->rv3d->viewmat); if (v3d->drawtype > OB_WIRE) { @@ -1061,7 +1063,7 @@ short view3d_opengl_select(ViewContext *vc, unsigned int *buffer, unsigned int b hits = glRenderMode(GL_RENDER); G.f &= ~G_PICKSEL; - setwinmatrixview3d(ar, v3d, NULL); + setwinmatrixview3d(ar, v3d, NULL, overscan); mul_m4_m4m4(vc->rv3d->persmat, vc->rv3d->winmat, vc->rv3d->viewmat); if (v3d->drawtype > OB_WIRE) { @@ -1550,7 +1552,7 @@ static int game_engine_exec(bContext *C, wmOperator *op) { /* Letterbox */ rctf cam_framef; - ED_view3d_calc_camera_border(startscene, ar, CTX_wm_view3d(C), rv3d, &cam_framef, false); + ED_view3d_calc_camera_border(startscene, ar, CTX_wm_view3d(C), rv3d, &cam_framef, NULL, false); cam_frame.xmin = cam_framef.xmin + ar->winrct.xmin; cam_frame.xmax = cam_framef.xmax + ar->winrct.xmin; cam_frame.ymin = cam_framef.ymin + ar->winrct.ymin; diff --git a/source/blender/editors/space_view3d/view3d_walk.c b/source/blender/editors/space_view3d/view3d_walk.c index fa395c9af31..96d3286eb1c 100644 --- a/source/blender/editors/space_view3d/view3d_walk.c +++ b/source/blender/editors/space_view3d/view3d_walk.c @@ -308,7 +308,7 @@ static void drawWalkPixel(const struct bContext *UNUSED(C), ARegion *ar, void *a rctf viewborder; if (walk->scene->camera) { - ED_view3d_calc_camera_border(walk->scene, ar, walk->v3d, walk->rv3d, &viewborder, false); + ED_view3d_calc_camera_border(walk->scene, ar, walk->v3d, walk->rv3d, &viewborder, NULL, false); xoff = viewborder.xmin + BLI_rctf_size_x(&viewborder) * 0.5f; yoff = viewborder.ymin + BLI_rctf_size_y(&viewborder) * 0.5f; } |