Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_view3d/view3d_draw.c
| Show First 20 Lines • Show All 117 Lines • ▼ Show 20 Lines | |||||
| /** | /** | ||||
| * \note keep this synced with #ED_view3d_mats_rv3d_backup/#ED_view3d_mats_rv3d_restore | * \note keep this synced with #ED_view3d_mats_rv3d_backup/#ED_view3d_mats_rv3d_restore | ||||
| */ | */ | ||||
| void ED_view3d_update_viewmat( | void ED_view3d_update_viewmat( | ||||
| const EvaluationContext *eval_ctx, Scene *scene, View3D *v3d, ARegion *ar, | const EvaluationContext *eval_ctx, Scene *scene, View3D *v3d, ARegion *ar, | ||||
| float viewmat[4][4], float winmat[4][4], const rcti *rect) | float viewmat[4][4], float winmat[4][4], const rcti *rect) | ||||
| { | { | ||||
| const Depsgraph *depsgraph = eval_ctx->depsgraph; | |||||
| RegionView3D *rv3d = ar->regiondata; | RegionView3D *rv3d = ar->regiondata; | ||||
| /* setup window matrices */ | /* setup window matrices */ | ||||
| if (winmat) | if (winmat) | ||||
| copy_m4_m4(rv3d->winmat, winmat); | copy_m4_m4(rv3d->winmat, winmat); | ||||
| else | else | ||||
| view3d_winmatrix_set(ar, v3d, rect); | view3d_winmatrix_set(depsgraph, ar, v3d, rect); | ||||
| /* setup view matrix */ | /* setup view matrix */ | ||||
| if (viewmat) | if (viewmat) | ||||
| copy_m4_m4(rv3d->viewmat, viewmat); | copy_m4_m4(rv3d->viewmat, viewmat); | ||||
| else | else | ||||
| view3d_viewmatrix_set(eval_ctx, scene, v3d, rv3d); /* note: calls BKE_object_where_is_calc for camera... */ | view3d_viewmatrix_set(eval_ctx, scene, v3d, rv3d); /* note: calls BKE_object_where_is_calc for camera... */ | ||||
| /* update utility matrices */ | /* update utility matrices */ | ||||
| mul_m4_m4m4(rv3d->persmat, rv3d->winmat, rv3d->viewmat); | mul_m4_m4m4(rv3d->persmat, rv3d->winmat, rv3d->viewmat); | ||||
| invert_m4_m4(rv3d->persinv, rv3d->persmat); | invert_m4_m4(rv3d->persinv, rv3d->persmat); | ||||
| invert_m4_m4(rv3d->viewinv, rv3d->viewmat); | invert_m4_m4(rv3d->viewinv, rv3d->viewmat); | ||||
| /* calculate GLSL view dependent values */ | /* calculate GLSL view dependent values */ | ||||
| /* store window coordinates scaling/offset */ | /* store window coordinates scaling/offset */ | ||||
| if (rv3d->persp == RV3D_CAMOB && v3d->camera) { | if (rv3d->persp == RV3D_CAMOB && v3d->camera) { | ||||
| rctf cameraborder; | rctf cameraborder; | ||||
| ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &cameraborder, false); | ED_view3d_calc_camera_border(scene, eval_ctx->depsgraph, ar, v3d, rv3d, &cameraborder, false); | ||||
| rv3d->viewcamtexcofac[0] = (float)ar->winx / BLI_rctf_size_x(&cameraborder); | rv3d->viewcamtexcofac[0] = (float)ar->winx / BLI_rctf_size_x(&cameraborder); | ||||
| rv3d->viewcamtexcofac[1] = (float)ar->winy / BLI_rctf_size_y(&cameraborder); | rv3d->viewcamtexcofac[1] = (float)ar->winy / BLI_rctf_size_y(&cameraborder); | ||||
| rv3d->viewcamtexcofac[2] = -rv3d->viewcamtexcofac[0] * cameraborder.xmin / (float)ar->winx; | rv3d->viewcamtexcofac[2] = -rv3d->viewcamtexcofac[0] * cameraborder.xmin / (float)ar->winx; | ||||
| rv3d->viewcamtexcofac[3] = -rv3d->viewcamtexcofac[1] * cameraborder.ymin / (float)ar->winy; | rv3d->viewcamtexcofac[3] = -rv3d->viewcamtexcofac[1] * cameraborder.ymin / (float)ar->winy; | ||||
| } | } | ||||
| else { | else { | ||||
| rv3d->viewcamtexcofac[0] = rv3d->viewcamtexcofac[1] = 1.0f; | rv3d->viewcamtexcofac[0] = rv3d->viewcamtexcofac[1] = 1.0f; | ||||
| ▲ Show 20 Lines • Show All 142 Lines • ▼ Show 20 Lines | void ED_view3d_draw_setup_view( | ||||
| else { | else { | ||||
| view3d_main_region_setup_view(eval_ctx, scene, v3d, ar, viewmat, winmat, rect); | view3d_main_region_setup_view(eval_ctx, scene, v3d, ar, viewmat, winmat, rect); | ||||
| } | } | ||||
| } | } | ||||
| /* ******************** view border ***************** */ | /* ******************** view border ***************** */ | ||||
| static void view3d_camera_border( | static void view3d_camera_border( | ||||
| const Scene *scene, const ARegion *ar, const View3D *v3d, const RegionView3D *rv3d, | const Scene *scene, const struct Depsgraph *depsgraph, | ||||
| const ARegion *ar, const View3D *v3d, const RegionView3D *rv3d, | |||||
| rctf *r_viewborder, const bool no_shift, const bool no_zoom) | rctf *r_viewborder, const bool no_shift, const bool no_zoom) | ||||
| { | { | ||||
| CameraParams params; | CameraParams params; | ||||
| rctf rect_view, rect_camera; | rctf rect_view, rect_camera; | ||||
| /* get viewport viewplane */ | /* get viewport viewplane */ | ||||
| BKE_camera_params_init(¶ms); | BKE_camera_params_init(¶ms); | ||||
| BKE_camera_params_from_view3d(¶ms, v3d, rv3d); | BKE_camera_params_from_view3d(¶ms, depsgraph, v3d, rv3d); | ||||
| if (no_zoom) | if (no_zoom) | ||||
| params.zoom = 1.0f; | params.zoom = 1.0f; | ||||
| BKE_camera_params_compute_viewplane(¶ms, ar->winx, ar->winy, 1.0f, 1.0f); | BKE_camera_params_compute_viewplane(¶ms, ar->winx, ar->winy, 1.0f, 1.0f); | ||||
| rect_view = params.viewplane; | rect_view = params.viewplane; | ||||
| /* get camera viewplane */ | /* get camera viewplane */ | ||||
| BKE_camera_params_init(¶ms); | BKE_camera_params_init(¶ms); | ||||
| /* fallback for non camera objects */ | /* fallback for non camera objects */ | ||||
| Show All 10 Lines | static void view3d_camera_border( | ||||
| /* get camera border within viewport */ | /* get camera border within viewport */ | ||||
| r_viewborder->xmin = ((rect_camera.xmin - rect_view.xmin) / BLI_rctf_size_x(&rect_view)) * ar->winx; | 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->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->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; | r_viewborder->ymax = ((rect_camera.ymax - rect_view.ymin) / BLI_rctf_size_y(&rect_view)) * ar->winy; | ||||
| } | } | ||||
| void ED_view3d_calc_camera_border_size( | void ED_view3d_calc_camera_border_size( | ||||
| const Scene *scene, const ARegion *ar, const View3D *v3d, const RegionView3D *rv3d, | const Scene *scene, const Depsgraph *depsgraph, | ||||
| const ARegion *ar, const View3D *v3d, const RegionView3D *rv3d, | |||||
| float r_size[2]) | float r_size[2]) | ||||
| { | { | ||||
| rctf viewborder; | rctf viewborder; | ||||
| view3d_camera_border(scene, ar, v3d, rv3d, &viewborder, true, true); | view3d_camera_border(scene, depsgraph, ar, v3d, rv3d, &viewborder, true, true); | ||||
| r_size[0] = BLI_rctf_size_x(&viewborder); | r_size[0] = BLI_rctf_size_x(&viewborder); | ||||
| r_size[1] = BLI_rctf_size_y(&viewborder); | r_size[1] = BLI_rctf_size_y(&viewborder); | ||||
| } | } | ||||
| void ED_view3d_calc_camera_border( | void ED_view3d_calc_camera_border( | ||||
| const Scene *scene, const ARegion *ar, const View3D *v3d, const RegionView3D *rv3d, | const Scene *scene, const Depsgraph *depsgraph, | ||||
| const ARegion *ar, const View3D *v3d, const RegionView3D *rv3d, | |||||
| rctf *r_viewborder, const bool no_shift) | rctf *r_viewborder, const bool no_shift) | ||||
| { | { | ||||
| view3d_camera_border(scene, ar, v3d, rv3d, r_viewborder, no_shift, false); | view3d_camera_border(scene, depsgraph, ar, v3d, rv3d, r_viewborder, no_shift, false); | ||||
| } | } | ||||
| static void drawviewborder_grid3(uint shdr_pos, float x1, float x2, float y1, float y2, float fac) | static void drawviewborder_grid3(uint shdr_pos, float x1, float x2, float y1, float y2, float fac) | ||||
| { | { | ||||
| float x3, y3, x4, y4; | float x3, y3, x4, y4; | ||||
| x3 = x1 + fac * (x2 - x1); | x3 = x1 + fac * (x2 - x1); | ||||
| y3 = y1 + fac * (y2 - y1); | y3 = y1 + fac * (y2 - y1); | ||||
| ▲ Show 20 Lines • Show All 62 Lines • ▼ Show 20 Lines | else { | ||||
| immVertex2f(shdr_pos, x1, y2); | immVertex2f(shdr_pos, x1, y2); | ||||
| immVertex2f(shdr_pos, x2, y1 + (h - ofs)); | immVertex2f(shdr_pos, x2, y1 + (h - ofs)); | ||||
| } | } | ||||
| immEnd(); | immEnd(); | ||||
| } | } | ||||
| static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) | static void drawviewborder(Scene *scene, const Depsgraph *depsgraph, ARegion *ar, View3D *v3d) | ||||
| { | { | ||||
| float x1, x2, y1, y2; | float x1, x2, y1, y2; | ||||
| float x1i, x2i, y1i, y2i; | float x1i, x2i, y1i, y2i; | ||||
| rctf viewborder; | rctf viewborder; | ||||
| Camera *ca = NULL; | Camera *ca = NULL; | ||||
| RegionView3D *rv3d = ar->regiondata; | RegionView3D *rv3d = ar->regiondata; | ||||
| if (v3d->camera == NULL) | if (v3d->camera == NULL) | ||||
| return; | return; | ||||
| if (v3d->camera->type == OB_CAMERA) | if (v3d->camera->type == OB_CAMERA) | ||||
| ca = v3d->camera->data; | ca = v3d->camera->data; | ||||
| ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &viewborder, false); | ED_view3d_calc_camera_border(scene, depsgraph, ar, v3d, rv3d, &viewborder, false); | ||||
| /* the offsets */ | /* the offsets */ | ||||
| x1 = viewborder.xmin; | x1 = viewborder.xmin; | ||||
| y1 = viewborder.ymin; | y1 = viewborder.ymin; | ||||
| x2 = viewborder.xmax; | x2 = viewborder.xmax; | ||||
| y2 = viewborder.ymax; | y2 = viewborder.ymax; | ||||
| glLineWidth(1.0f); | glLineWidth(1.0f); | ||||
| ▲ Show 20 Lines • Show All 1,132 Lines • ▼ Show 20 Lines | |||||
| /* ******************** info ***************** */ | /* ******************** info ***************** */ | ||||
| /** | /** | ||||
| * Render and camera border | * Render and camera border | ||||
| */ | */ | ||||
| static void view3d_draw_border(const bContext *C, ARegion *ar) | static void view3d_draw_border(const bContext *C, ARegion *ar) | ||||
| { | { | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| Depsgraph *depsgraph = CTX_data_depsgraph(C); | |||||
| RegionView3D *rv3d = ar->regiondata; | RegionView3D *rv3d = ar->regiondata; | ||||
| View3D *v3d = CTX_wm_view3d(C); | View3D *v3d = CTX_wm_view3d(C); | ||||
| if (rv3d->persp == RV3D_CAMOB) { | if (rv3d->persp == RV3D_CAMOB) { | ||||
| drawviewborder(scene, ar, v3d); | drawviewborder(scene, depsgraph, ar, v3d); | ||||
| } | } | ||||
| else if (v3d->flag2 & V3D_RENDER_BORDER) { | else if (v3d->flag2 & V3D_RENDER_BORDER) { | ||||
| drawrenderborder(ar, v3d); | drawrenderborder(ar, v3d); | ||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * Grease Pencil | * Grease Pencil | ||||
| ▲ Show 20 Lines • Show All 400 Lines • ▼ Show 20 Lines | else { | ||||
| glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | ||||
| } | } | ||||
| if ((viewname != NULL && viewname[0] != '\0') && (viewmat == NULL) && rv3d->persp == RV3D_CAMOB && v3d->camera) | if ((viewname != NULL && viewname[0] != '\0') && (viewmat == NULL) && rv3d->persp == RV3D_CAMOB && v3d->camera) | ||||
| view3d_stereo3d_setup_offscreen(eval_ctx, scene, v3d, ar, winmat, viewname); | view3d_stereo3d_setup_offscreen(eval_ctx, scene, v3d, ar, winmat, viewname); | ||||
| else | else | ||||
| view3d_main_region_setup_view(eval_ctx, scene, v3d, ar, viewmat, winmat, NULL); | view3d_main_region_setup_view(eval_ctx, scene, v3d, ar, viewmat, winmat, NULL); | ||||
| /* XXX, should take depsgraph as arg */ | |||||
| Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, view_layer, false); | |||||
| BLI_assert(depsgraph != NULL); | |||||
| /* main drawing call */ | /* main drawing call */ | ||||
| RenderEngineType *engine_type = eval_ctx->engine_type; | RenderEngineType *engine_type = eval_ctx->engine_type; | ||||
| if (engine_type->flag & RE_USE_LEGACY_PIPELINE) { | if (engine_type->flag & RE_USE_LEGACY_PIPELINE) { | ||||
| /* framebuffer fx needed, we need to draw offscreen first */ | /* framebuffer fx needed, we need to draw offscreen first */ | ||||
| if (v3d->fx_settings.fx_flag && fx) { | if (v3d->fx_settings.fx_flag && fx) { | ||||
| GPUSSAOSettings *ssao = NULL; | GPUSSAOSettings *ssao = NULL; | ||||
| Show All 18 Lines | if (engine_type->flag & RE_USE_LEGACY_PIPELINE) { | ||||
| } | } | ||||
| if ((v3d->flag2 & V3D_RENDER_SHADOW) == 0) { | if ((v3d->flag2 & V3D_RENDER_SHADOW) == 0) { | ||||
| /* draw grease-pencil stuff */ | /* draw grease-pencil stuff */ | ||||
| ED_region_pixelspace(ar); | ED_region_pixelspace(ar); | ||||
| if (v3d->flag2 & V3D_SHOW_GPENCIL) { | if (v3d->flag2 & V3D_SHOW_GPENCIL) { | ||||
| /* draw grease-pencil stuff - needed to get paint-buffer shown too (since it's 2D) */ | /* draw grease-pencil stuff - needed to get paint-buffer shown too (since it's 2D) */ | ||||
| ED_gpencil_draw_view3d(NULL, scene, view_layer, v3d, ar, false); | ED_gpencil_draw_view3d(NULL, scene, view_layer, depsgraph, v3d, ar, false); | ||||
| } | } | ||||
| /* freeing the images again here could be done after the operator runs, leaving for now */ | /* freeing the images again here could be done after the operator runs, leaving for now */ | ||||
| GPU_free_images_anim(); | GPU_free_images_anim(); | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| /* XXX, should take depsgraph as arg */ | |||||
| Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, view_layer, false); | |||||
| BLI_assert(depsgraph != NULL); | |||||
| DRW_draw_render_loop_offscreen(depsgraph, eval_ctx->engine_type, ar, v3d, do_sky, ofs, viewport); | DRW_draw_render_loop_offscreen(depsgraph, eval_ctx->engine_type, ar, v3d, do_sky, ofs, viewport); | ||||
| } | } | ||||
| /* restore size */ | /* restore size */ | ||||
| ar->winx = bwinx; | ar->winx = bwinx; | ||||
| ar->winy = bwiny; | ar->winy = bwiny; | ||||
| ar->winrct = brect; | ar->winrct = brect; | ||||
| Show All 14 Lines | |||||
| ImBuf *ED_view3d_draw_offscreen_imbuf( | ImBuf *ED_view3d_draw_offscreen_imbuf( | ||||
| const EvaluationContext *eval_ctx, Scene *scene, ViewLayer *view_layer, | const EvaluationContext *eval_ctx, Scene *scene, ViewLayer *view_layer, | ||||
| View3D *v3d, ARegion *ar, int sizex, int sizey, | View3D *v3d, ARegion *ar, int sizex, int sizey, | ||||
| unsigned int flag, unsigned int draw_flags, | unsigned int flag, unsigned int draw_flags, | ||||
| int alpha_mode, int samples, const char *viewname, | int alpha_mode, int samples, const char *viewname, | ||||
| /* output vars */ | /* output vars */ | ||||
| GPUFX *fx, GPUOffScreen *ofs, char err_out[256]) | GPUFX *fx, GPUOffScreen *ofs, char err_out[256]) | ||||
| { | { | ||||
| const Depsgraph *depsgraph = eval_ctx->depsgraph; | |||||
| RegionView3D *rv3d = ar->regiondata; | RegionView3D *rv3d = ar->regiondata; | ||||
| const bool draw_sky = (alpha_mode == R_ADDSKY); | const bool draw_sky = (alpha_mode == R_ADDSKY); | ||||
| const bool draw_background = (draw_flags & V3D_OFSDRAW_USE_BACKGROUND); | const bool draw_background = (draw_flags & V3D_OFSDRAW_USE_BACKGROUND); | ||||
| const bool use_full_sample = (draw_flags & V3D_OFSDRAW_USE_FULL_SAMPLE); | const bool use_full_sample = (draw_flags & V3D_OFSDRAW_USE_FULL_SAMPLE); | ||||
| /* view state */ | /* view state */ | ||||
| GPUFXSettings fx_settings = v3d->fx_settings; | GPUFXSettings fx_settings = v3d->fx_settings; | ||||
| bool is_ortho = false; | bool is_ortho = false; | ||||
| Show All 39 Lines | if (rv3d->persp == RV3D_CAMOB && v3d->camera) { | ||||
| is_ortho = params.is_ortho; | is_ortho = params.is_ortho; | ||||
| copy_m4_m4(winmat, params.winmat); | copy_m4_m4(winmat, params.winmat); | ||||
| } | } | ||||
| else { | else { | ||||
| rctf viewplane; | rctf viewplane; | ||||
| float clipsta, clipend; | float clipsta, clipend; | ||||
| is_ortho = ED_view3d_viewplane_get(v3d, rv3d, sizex, sizey, &viewplane, &clipsta, &clipend, NULL); | is_ortho = ED_view3d_viewplane_get(depsgraph, v3d, rv3d, sizex, sizey, &viewplane, &clipsta, &clipend, NULL); | ||||
| if (is_ortho) { | if (is_ortho) { | ||||
| orthographic_m4(winmat, viewplane.xmin, viewplane.xmax, viewplane.ymin, viewplane.ymax, -clipend, clipend); | orthographic_m4(winmat, viewplane.xmin, viewplane.xmax, viewplane.ymin, viewplane.ymax, -clipend, clipend); | ||||
| } | } | ||||
| else { | else { | ||||
| perspective_m4(winmat, viewplane.xmin, viewplane.xmax, viewplane.ymin, viewplane.ymax, clipsta, clipend); | perspective_m4(winmat, viewplane.xmin, viewplane.xmax, viewplane.ymin, viewplane.ymax, clipsta, clipend); | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 227 Lines • ▼ Show 20 Lines | void VP_legacy_view3d_stereo3d_setup(const EvaluationContext *eval_ctx, Scene *scene, View3D *v3d, ARegion *ar) | ||||
| view3d_stereo3d_setup(eval_ctx, scene, v3d, ar, NULL); | view3d_stereo3d_setup(eval_ctx, scene, v3d, ar, NULL); | ||||
| } | } | ||||
| bool VP_legacy_use_depth(Scene *scene, View3D *v3d) | bool VP_legacy_use_depth(Scene *scene, View3D *v3d) | ||||
| { | { | ||||
| return use_depth_doit(scene, v3d); | return use_depth_doit(scene, v3d); | ||||
| } | } | ||||
| void VP_drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) | void VP_drawviewborder(Scene *scene, const struct Depsgraph *depsgraph, ARegion *ar, View3D *v3d) | ||||
| { | { | ||||
| drawviewborder(scene, ar, v3d); | drawviewborder(scene, depsgraph, ar, v3d); | ||||
| } | } | ||||
| void VP_drawrenderborder(ARegion *ar, View3D *v3d) | void VP_drawrenderborder(ARegion *ar, View3D *v3d) | ||||
| { | { | ||||
| drawrenderborder(ar, v3d); | drawrenderborder(ar, v3d); | ||||
| } | } | ||||
| void VP_view3d_draw_background_none(void) | void VP_view3d_draw_background_none(void) | ||||
| Show All 20 Lines | |||||