Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_view3d/view3d_edit.c
| Show First 20 Lines • Show All 519 Lines • ▼ Show 20 Lines | void ED_view3d_quadview_update(ScrArea *sa, ARegion *ar, bool do_clip) | ||||
| ED_area_tag_redraw(sa); | ED_area_tag_redraw(sa); | ||||
| } | } | ||||
| /* ************************** init for view ops **********************************/ | /* ************************** init for view ops **********************************/ | ||||
| typedef struct ViewOpsData { | typedef struct ViewOpsData { | ||||
| /* context pointers (assigned by viewops_data_alloc) */ | /* context pointers (assigned by viewops_data_alloc) */ | ||||
| const Depsgraph *depsgraph; | |||||
| Scene *scene; | Scene *scene; | ||||
| ScrArea *sa; | ScrArea *sa; | ||||
| ARegion *ar; | ARegion *ar; | ||||
| View3D *v3d; | View3D *v3d; | ||||
| RegionView3D *rv3d; | RegionView3D *rv3d; | ||||
| /* needed for continuous zoom */ | /* needed for continuous zoom */ | ||||
| wmTimer *timer; | wmTimer *timer; | ||||
| ▲ Show 20 Lines • Show All 55 Lines • ▼ Show 20 Lines | |||||
| * Allocate and fill in context pointers for #ViewOpsData | * Allocate and fill in context pointers for #ViewOpsData | ||||
| */ | */ | ||||
| static void viewops_data_alloc(bContext *C, wmOperator *op) | static void viewops_data_alloc(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| ViewOpsData *vod = MEM_callocN(sizeof(ViewOpsData), "viewops data"); | ViewOpsData *vod = MEM_callocN(sizeof(ViewOpsData), "viewops data"); | ||||
| /* store data */ | /* store data */ | ||||
| op->customdata = vod; | op->customdata = vod; | ||||
| vod->depsgraph = CTX_data_depsgraph(C); | |||||
| vod->scene = CTX_data_scene(C); | vod->scene = CTX_data_scene(C); | ||||
| vod->sa = CTX_wm_area(C); | vod->sa = CTX_wm_area(C); | ||||
| vod->ar = CTX_wm_region(C); | vod->ar = CTX_wm_region(C); | ||||
| vod->v3d = vod->sa->spacedata.first; | vod->v3d = vod->sa->spacedata.first; | ||||
| vod->rv3d = vod->ar->regiondata; | vod->rv3d = vod->ar->regiondata; | ||||
| } | } | ||||
| void view3d_orbit_apply_dyn_ofs( | void view3d_orbit_apply_dyn_ofs( | ||||
| ▲ Show 20 Lines • Show All 1,541 Lines • ▼ Show 20 Lines | #if 0 | ||||
| WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_PRESS, KM_ANY, 0, VIEWROT_MODAL_SWITCH_MOVE); | WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_PRESS, KM_ANY, 0, VIEWROT_MODAL_SWITCH_MOVE); | ||||
| #endif | #endif | ||||
| /* assign map to operators */ | /* assign map to operators */ | ||||
| WM_modalkeymap_assign(keymap, "VIEW3D_OT_zoom"); | WM_modalkeymap_assign(keymap, "VIEW3D_OT_zoom"); | ||||
| } | } | ||||
| static void view_zoom_mouseloc_camera( | static void view_zoom_mouseloc_camera( | ||||
| Scene *scene, View3D *v3d, | Scene *scene, const Depsgraph *depsgraph, View3D *v3d, | ||||
| ARegion *ar, float dfac, int mx, int my) | ARegion *ar, float dfac, int mx, int my) | ||||
| { | { | ||||
| RegionView3D *rv3d = ar->regiondata; | RegionView3D *rv3d = ar->regiondata; | ||||
| const float zoomfac = BKE_screen_view3d_zoom_to_fac(rv3d->camzoom); | const float zoomfac = BKE_screen_view3d_zoom_to_fac(rv3d->camzoom); | ||||
| const float zoomfac_new = CLAMPIS(zoomfac * (1.0f / dfac), RV3D_CAMZOOM_MIN_FACTOR, RV3D_CAMZOOM_MAX_FACTOR); | const float zoomfac_new = CLAMPIS(zoomfac * (1.0f / dfac), RV3D_CAMZOOM_MIN_FACTOR, RV3D_CAMZOOM_MAX_FACTOR); | ||||
| const float camzoom_new = BKE_screen_view3d_zoom_from_fac(zoomfac_new); | const float camzoom_new = BKE_screen_view3d_zoom_from_fac(zoomfac_new); | ||||
| if (U.uiflag & USER_ZOOM_TO_MOUSEPOS) { | if (U.uiflag & USER_ZOOM_TO_MOUSEPOS) { | ||||
| float zoomfac_px; | float zoomfac_px; | ||||
| rctf camera_frame_old; | rctf camera_frame_old; | ||||
| rctf camera_frame_new; | rctf camera_frame_new; | ||||
| const float pt_src[2] = {mx, my}; | const float pt_src[2] = {mx, my}; | ||||
| float pt_dst[2]; | float pt_dst[2]; | ||||
| float delta_px[2]; | float delta_px[2]; | ||||
| ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &camera_frame_old, false); | ED_view3d_calc_camera_border(scene, depsgraph, ar, v3d, rv3d, &camera_frame_old, false); | ||||
| BLI_rctf_translate(&camera_frame_old, ar->winrct.xmin, ar->winrct.ymin); | BLI_rctf_translate(&camera_frame_old, ar->winrct.xmin, ar->winrct.ymin); | ||||
| rv3d->camzoom = camzoom_new; | rv3d->camzoom = camzoom_new; | ||||
| CLAMP(rv3d->camzoom, RV3D_CAMZOOM_MIN, RV3D_CAMZOOM_MAX); | CLAMP(rv3d->camzoom, RV3D_CAMZOOM_MIN, RV3D_CAMZOOM_MAX); | ||||
| ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &camera_frame_new, false); | ED_view3d_calc_camera_border(scene, depsgraph, ar, v3d, rv3d, &camera_frame_new, false); | ||||
| BLI_rctf_translate(&camera_frame_new, ar->winrct.xmin, ar->winrct.ymin); | BLI_rctf_translate(&camera_frame_new, ar->winrct.xmin, ar->winrct.ymin); | ||||
| BLI_rctf_transform_pt_v(&camera_frame_new, &camera_frame_old, pt_dst, pt_src); | BLI_rctf_transform_pt_v(&camera_frame_new, &camera_frame_old, pt_dst, pt_src); | ||||
| sub_v2_v2v2(delta_px, pt_dst, pt_src); | sub_v2_v2v2(delta_px, pt_dst, pt_src); | ||||
| /* translate the camera offset using pixel space delta | /* translate the camera offset using pixel space delta | ||||
| * mapped back to the camera (same logic as panning in camera view) */ | * mapped back to the camera (same logic as panning in camera view) */ | ||||
| zoomfac_px = BKE_screen_view3d_zoom_to_fac(rv3d->camzoom) * 2.0f; | zoomfac_px = BKE_screen_view3d_zoom_to_fac(rv3d->camzoom) * 2.0f; | ||||
| ▲ Show 20 Lines • Show All 130 Lines • ▼ Show 20 Lines | zfac = viewzoom_scale_value( | ||||
| &vod->ar->winrct, viewzoom, zoom_invert, true, xy, &vod->origx, | &vod->ar->winrct, viewzoom, zoom_invert, true, xy, &vod->origx, | ||||
| zoomfac, zoomfac_prev, | zoomfac, zoomfac_prev, | ||||
| &vod->timer_lastdraw); | &vod->timer_lastdraw); | ||||
| if (zfac != 1.0f && zfac != 0.0f) { | if (zfac != 1.0f && zfac != 0.0f) { | ||||
| /* calculate inverted, then invert again (needed because of camera zoom scaling) */ | /* calculate inverted, then invert again (needed because of camera zoom scaling) */ | ||||
| zfac = 1.0f / zfac; | zfac = 1.0f / zfac; | ||||
| view_zoom_mouseloc_camera( | view_zoom_mouseloc_camera( | ||||
| vod->scene, vod->v3d, | vod->scene, vod->depsgraph, vod->v3d, | ||||
| vod->ar, zfac, vod->oldx, vod->oldy); | vod->ar, zfac, vod->oldx, vod->oldy); | ||||
| } | } | ||||
| ED_region_tag_redraw(vod->ar); | ED_region_tag_redraw(vod->ar); | ||||
| } | } | ||||
| static void viewzoom_apply_3d( | static void viewzoom_apply_3d( | ||||
| ViewOpsData *vod, const int xy[2], | ViewOpsData *vod, const int xy[2], | ||||
| ▲ Show 20 Lines • Show All 97 Lines • ▼ Show 20 Lines | if (ret & OPERATOR_FINISHED) { | ||||
| viewops_data_free(C, op); | viewops_data_free(C, op); | ||||
| } | } | ||||
| return ret; | return ret; | ||||
| } | } | ||||
| static int viewzoom_exec(bContext *C, wmOperator *op) | static int viewzoom_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| const Depsgraph *depsgraph = CTX_data_depsgraph(C); | |||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| View3D *v3d; | View3D *v3d; | ||||
| RegionView3D *rv3d; | RegionView3D *rv3d; | ||||
| ScrArea *sa; | ScrArea *sa; | ||||
| ARegion *ar; | ARegion *ar; | ||||
| bool use_cam_zoom; | bool use_cam_zoom; | ||||
| float dist_range[2]; | float dist_range[2]; | ||||
| Show All 20 Lines | static int viewzoom_exec(bContext *C, wmOperator *op) | ||||
| use_cam_zoom = (rv3d->persp == RV3D_CAMOB) && !(rv3d->is_persp && ED_view3d_camera_lock_check(v3d, rv3d)); | use_cam_zoom = (rv3d->persp == RV3D_CAMOB) && !(rv3d->is_persp && ED_view3d_camera_lock_check(v3d, rv3d)); | ||||
| ED_view3d_dist_range_get(v3d, dist_range); | ED_view3d_dist_range_get(v3d, dist_range); | ||||
| if (delta < 0) { | if (delta < 0) { | ||||
| const float step = 1.2f; | const float step = 1.2f; | ||||
| /* this min and max is also in viewmove() */ | /* this min and max is also in viewmove() */ | ||||
| if (use_cam_zoom) { | if (use_cam_zoom) { | ||||
| view_zoom_mouseloc_camera(scene, v3d, ar, step, mx, my); | view_zoom_mouseloc_camera(scene, depsgraph, v3d, ar, step, mx, my); | ||||
| } | } | ||||
| else { | else { | ||||
| if (rv3d->dist < dist_range[1]) { | if (rv3d->dist < dist_range[1]) { | ||||
| view_zoom_mouseloc_3d(ar, step, mx, my); | view_zoom_mouseloc_3d(ar, step, mx, my); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| const float step = 1.0f / 1.2f; | const float step = 1.0f / 1.2f; | ||||
| if (use_cam_zoom) { | if (use_cam_zoom) { | ||||
| view_zoom_mouseloc_camera(scene, v3d, ar, step, mx, my); | view_zoom_mouseloc_camera(scene, depsgraph, v3d, ar, step, mx, my); | ||||
| } | } | ||||
| else { | else { | ||||
| if (rv3d->dist > dist_range[0]) { | if (rv3d->dist > dist_range[0]) { | ||||
| view_zoom_mouseloc_3d(ar, step, mx, my); | view_zoom_mouseloc_3d(ar, step, mx, my); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 872 Lines • ▼ Show 20 Lines | void VIEW3D_OT_view_center_pick(wmOperatorType *ot) | ||||
| ot->poll = ED_operator_view3d_active; | ot->poll = ED_operator_view3d_active; | ||||
| /* flags */ | /* flags */ | ||||
| ot->flag = 0; | ot->flag = 0; | ||||
| } | } | ||||
| static int view3d_center_camera_exec(bContext *C, wmOperator *UNUSED(op)) /* was view3d_home() in 2.4x */ | static int view3d_center_camera_exec(bContext *C, wmOperator *UNUSED(op)) /* was view3d_home() in 2.4x */ | ||||
| { | { | ||||
| const Depsgraph *depsgraph = CTX_data_depsgraph(C); | |||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| float xfac, yfac; | float xfac, yfac; | ||||
| float size[2]; | float size[2]; | ||||
| View3D *v3d; | View3D *v3d; | ||||
| ARegion *ar; | ARegion *ar; | ||||
| RegionView3D *rv3d; | RegionView3D *rv3d; | ||||
| /* no NULL check is needed, poll checks */ | /* no NULL check is needed, poll checks */ | ||||
| ED_view3d_context_user_region(C, &v3d, &ar); | ED_view3d_context_user_region(C, &v3d, &ar); | ||||
| rv3d = ar->regiondata; | rv3d = ar->regiondata; | ||||
| rv3d->camdx = rv3d->camdy = 0.0f; | rv3d->camdx = rv3d->camdy = 0.0f; | ||||
| ED_view3d_calc_camera_border_size(scene, ar, v3d, rv3d, size); | ED_view3d_calc_camera_border_size(scene, depsgraph, ar, v3d, rv3d, size); | ||||
| /* 4px is just a little room from the edge of the area */ | /* 4px is just a little room from the edge of the area */ | ||||
| xfac = (float)ar->winx / (float)(size[0] + 4); | xfac = (float)ar->winx / (float)(size[0] + 4); | ||||
| yfac = (float)ar->winy / (float)(size[1] + 4); | yfac = (float)ar->winy / (float)(size[1] + 4); | ||||
| rv3d->camzoom = BKE_screen_view3d_zoom_from_fac(min_ff(xfac, yfac)); | rv3d->camzoom = BKE_screen_view3d_zoom_from_fac(min_ff(xfac, yfac)); | ||||
| CLAMP(rv3d->camzoom, RV3D_CAMZOOM_MIN, RV3D_CAMZOOM_MAX); | CLAMP(rv3d->camzoom, RV3D_CAMZOOM_MIN, RV3D_CAMZOOM_MAX); | ||||
| ▲ Show 20 Lines • Show All 42 Lines • ▼ Show 20 Lines | void VIEW3D_OT_view_center_lock(wmOperatorType *ot) | ||||
| /* flags */ | /* flags */ | ||||
| ot->flag = 0; | ot->flag = 0; | ||||
| } | } | ||||
| /* ********************* Set render border operator ****************** */ | /* ********************* Set render border operator ****************** */ | ||||
| static int render_border_exec(bContext *C, wmOperator *op) | static int render_border_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| const Depsgraph *depsgraph = CTX_data_depsgraph(C); | |||||
| View3D *v3d = CTX_wm_view3d(C); | View3D *v3d = CTX_wm_view3d(C); | ||||
| ARegion *ar = CTX_wm_region(C); | ARegion *ar = CTX_wm_region(C); | ||||
| RegionView3D *rv3d = ED_view3d_context_rv3d(C); | RegionView3D *rv3d = ED_view3d_context_rv3d(C); | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| rcti rect; | rcti rect; | ||||
| rctf vb, border; | rctf vb, border; | ||||
| const bool camera_only = RNA_boolean_get(op->ptr, "camera_only"); | const bool camera_only = RNA_boolean_get(op->ptr, "camera_only"); | ||||
| if (camera_only && rv3d->persp != RV3D_CAMOB) | if (camera_only && rv3d->persp != RV3D_CAMOB) | ||||
| return OPERATOR_PASS_THROUGH; | return OPERATOR_PASS_THROUGH; | ||||
| /* get border select values using rna */ | /* get border select values using rna */ | ||||
| WM_operator_properties_border_to_rcti(op, &rect); | WM_operator_properties_border_to_rcti(op, &rect); | ||||
| /* calculate range */ | /* calculate range */ | ||||
| if (rv3d->persp == RV3D_CAMOB) { | if (rv3d->persp == RV3D_CAMOB) { | ||||
| ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &vb, false); | ED_view3d_calc_camera_border(scene, depsgraph, ar, v3d, rv3d, &vb, false); | ||||
| } | } | ||||
| else { | else { | ||||
| vb.xmin = 0; | vb.xmin = 0; | ||||
| vb.ymin = 0; | vb.ymin = 0; | ||||
| vb.xmax = ar->winx; | vb.xmax = ar->winx; | ||||
| vb.ymax = ar->winy; | vb.ymax = ar->winy; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 276 Lines • ▼ Show 20 Lines | void VIEW3D_OT_zoom_border(wmOperatorType *ot) | ||||
| /* flags */ | /* flags */ | ||||
| ot->flag = 0; | ot->flag = 0; | ||||
| /* rna */ | /* rna */ | ||||
| WM_operator_properties_gesture_border_zoom(ot); | WM_operator_properties_gesture_border_zoom(ot); | ||||
| } | } | ||||
| /* sets the view to 1:1 camera/render-pixel */ | /* sets the view to 1:1 camera/render-pixel */ | ||||
| static void view3d_set_1_to_1_viewborder(Scene *scene, ARegion *ar, View3D *v3d) | static void view3d_set_1_to_1_viewborder(Scene *scene, const Depsgraph *depsgraph, ARegion *ar, View3D *v3d) | ||||
| { | { | ||||
| RegionView3D *rv3d = ar->regiondata; | RegionView3D *rv3d = ar->regiondata; | ||||
| float size[2]; | float size[2]; | ||||
| int im_width = (scene->r.size * scene->r.xsch) / 100; | int im_width = (scene->r.size * scene->r.xsch) / 100; | ||||
| ED_view3d_calc_camera_border_size(scene, ar, v3d, rv3d, size); | ED_view3d_calc_camera_border_size(scene, depsgraph, ar, v3d, rv3d, size); | ||||
| rv3d->camzoom = BKE_screen_view3d_zoom_from_fac((float)im_width / size[0]); | rv3d->camzoom = BKE_screen_view3d_zoom_from_fac((float)im_width / size[0]); | ||||
| CLAMP(rv3d->camzoom, RV3D_CAMZOOM_MIN, RV3D_CAMZOOM_MAX); | CLAMP(rv3d->camzoom, RV3D_CAMZOOM_MIN, RV3D_CAMZOOM_MAX); | ||||
| } | } | ||||
| static int view3d_zoom_1_to_1_camera_exec(bContext *C, wmOperator *UNUSED(op)) | static int view3d_zoom_1_to_1_camera_exec(bContext *C, wmOperator *UNUSED(op)) | ||||
| { | { | ||||
| const Depsgraph *depsgraph = CTX_data_depsgraph(C); | |||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| View3D *v3d; | View3D *v3d; | ||||
| ARegion *ar; | ARegion *ar; | ||||
| /* no NULL check is needed, poll checks */ | /* no NULL check is needed, poll checks */ | ||||
| ED_view3d_context_user_region(C, &v3d, &ar); | ED_view3d_context_user_region(C, &v3d, &ar); | ||||
| view3d_set_1_to_1_viewborder(scene, ar, v3d); | view3d_set_1_to_1_viewborder(scene, depsgraph, ar, v3d); | ||||
| WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, v3d); | WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, v3d); | ||||
| return OPERATOR_FINISHED; | return OPERATOR_FINISHED; | ||||
| } | } | ||||
| void VIEW3D_OT_zoom_camera_1_to_1(wmOperatorType *ot) | void VIEW3D_OT_zoom_camera_1_to_1(wmOperatorType *ot) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 1,405 Lines • Show Last 20 Lines | |||||