diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-01-17 12:05:48 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-01-17 12:05:48 +0400 |
commit | 5f35d91ab5bac0a6cadf74995aa1cd14de7534f8 (patch) | |
tree | 175fc195fad7554a4992c680e8786de63c68bdfc | |
parent | c1f6261aee7e1f41469637718be44ee68a8639b5 (diff) |
fix [#33894] Viewport heavily distorted
The SmoothView operator was mixing up source-view and original-view parameters cleanup this operator and add 'original' view settings store.
-rw-r--r-- | source/blender/editors/space_view3d/view3d_edit.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_view.c | 160 | ||||
-rw-r--r-- | source/blender/editors/transform/transform.c | 1 |
3 files changed, 93 insertions, 70 deletions
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index a1e132c6601..3c5da6f77d3 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -4274,6 +4274,8 @@ void ED_view3d_from_object(Object *ob, float ofs[3], float quat[4], float *dist, CameraParams params; BKE_camera_params_init(¶ms); + /* incase we can't get the lens */ + params.lens = *lens; BKE_camera_params_from_object(¶ms, ob); *lens = params.lens; } diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index 41d092ce2b1..35fc2269634 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -111,17 +111,43 @@ float *give_cursor(Scene *scene, View3D *v3d) /* ****************** smooth view operator ****************** */ /* This operator is one of the 'timer refresh' ones like animation playback */ +struct SmoothView3DState { + float dist; + float lens; + float quat[4]; + float ofs[3]; +}; + struct SmoothView3DStore { - float orig_dist, new_dist; - float orig_lens, new_lens; - float orig_quat[4], new_quat[4]; - float orig_ofs[3], new_ofs[3]; - - int to_camera, orig_view; - + /* source*/ + struct SmoothView3DState src; /* source */ + struct SmoothView3DState dst; /* destination */ + struct SmoothView3DState org; /* original */ + + bool to_camera; + char org_view; + double time_allowed; }; +static void view3d_smooth_view_state_backup(struct SmoothView3DState *sms_state, + const View3D *v3d, const RegionView3D *rv3d) +{ + copy_v3_v3(sms_state->ofs, rv3d->ofs); + copy_qt_qt(sms_state->quat, rv3d->viewquat); + sms_state->dist = rv3d->dist; + sms_state->lens = v3d->lens; +} + +static void view3d_smooth_view_state_restore(const struct SmoothView3DState *sms_state, + View3D *v3d, RegionView3D *rv3d) +{ + copy_v3_v3(rv3d->ofs, sms_state->ofs); + copy_qt_qt(rv3d->viewquat, sms_state->quat); + rv3d->dist = sms_state->dist; + v3d->lens = sms_state->lens; +} + /* will start timer if appropriate */ /* the arguments are the desired situation */ void view3d_smooth_view(bContext *C, View3D *v3d, ARegion *ar, Object *oldcamera, Object *camera, @@ -132,15 +158,14 @@ void view3d_smooth_view(bContext *C, View3D *v3d, ARegion *ar, Object *oldcamera ScrArea *sa = CTX_wm_area(C); RegionView3D *rv3d = ar->regiondata; - struct SmoothView3DStore sms = {0}; - short ok = FALSE; + struct SmoothView3DStore sms = {{0}}; + bool ok = false; /* initialize sms */ - copy_v3_v3(sms.new_ofs, rv3d->ofs); - copy_qt_qt(sms.new_quat, rv3d->viewquat); - sms.new_dist = rv3d->dist; - sms.new_lens = v3d->lens; - sms.to_camera = FALSE; + view3d_smooth_view_state_backup(&sms.dst, v3d, rv3d); + view3d_smooth_view_state_backup(&sms.org, v3d, rv3d); + view3d_smooth_view_state_backup(&sms.src, v3d, rv3d); + sms.to_camera = false; /* note on camera locking, this is a little confusing but works ok. * we may be changing the view 'as if' there is no active camera, but in fact @@ -155,50 +180,44 @@ void view3d_smooth_view(bContext *C, View3D *v3d, ARegion *ar, Object *oldcamera } /* store the options we want to end with */ - if (ofs) copy_v3_v3(sms.new_ofs, ofs); - if (quat) copy_qt_qt(sms.new_quat, quat); - if (dist) sms.new_dist = *dist; - if (lens) sms.new_lens = *lens; + if (ofs) copy_v3_v3(sms.dst.ofs, ofs); + if (quat) copy_qt_qt(sms.dst.quat, quat); + if (dist) sms.dst.dist = *dist; + if (lens) sms.dst.lens = *lens; if (camera) { - sms.new_dist = ED_view3d_offset_distance(camera->obmat, ofs, VIEW3D_DIST_FALLBACK); - ED_view3d_from_object(camera, sms.new_ofs, sms.new_quat, &sms.new_dist, &sms.new_lens); - sms.to_camera = TRUE; /* restore view3d values in end */ + sms.dst.dist = ED_view3d_offset_distance(camera->obmat, ofs, VIEW3D_DIST_FALLBACK); + ED_view3d_from_object(camera, sms.dst.ofs, sms.dst.quat, &sms.dst.dist, &sms.dst.lens); + sms.to_camera = true; /* restore view3d values in end */ } if (C && U.smooth_viewtx) { - int changed = FALSE; /* zero means no difference */ + bool changed = false; /* zero means no difference */ if (oldcamera != camera) - changed = TRUE; - else if (sms.new_dist != rv3d->dist) - changed = TRUE; - else if (sms.new_lens != v3d->lens) - changed = TRUE; - else if (!equals_v3v3(sms.new_ofs, rv3d->ofs)) - changed = TRUE; - else if (!equals_v4v4(sms.new_quat, rv3d->viewquat)) - changed = TRUE; + changed = true; + else if (sms.dst.dist != rv3d->dist) + changed = true; + else if (sms.dst.lens != v3d->lens) + changed = true; + else if (!equals_v3v3(sms.dst.ofs, rv3d->ofs)) + changed = true; + else if (!equals_v4v4(sms.dst.quat, rv3d->viewquat)) + changed = true; /* The new view is different from the old one * so animate the view */ if (changed) { - /* original values */ if (oldcamera) { - sms.orig_dist = ED_view3d_offset_distance(oldcamera->obmat, rv3d->ofs, 0.0f); - ED_view3d_from_object(oldcamera, sms.orig_ofs, sms.orig_quat, &sms.orig_dist, &sms.orig_lens); - } - else { - copy_v3_v3(sms.orig_ofs, rv3d->ofs); - copy_qt_qt(sms.orig_quat, rv3d->viewquat); - sms.orig_dist = rv3d->dist; - sms.orig_lens = v3d->lens; + sms.src.dist = ED_view3d_offset_distance(oldcamera->obmat, rv3d->ofs, 0.0f); + /* this */ + ED_view3d_from_object(oldcamera, sms.src.ofs, sms.src.quat, &sms.src.dist, &sms.src.lens); } /* grid draw as floor */ if ((rv3d->viewlock & RV3D_LOCKED) == 0) { /* use existing if exists, means multiple calls to smooth view wont loose the original 'view' setting */ - sms.orig_view = rv3d->sms ? rv3d->sms->orig_view : rv3d->view; + sms.org_view = rv3d->sms ? rv3d->sms->org_view : rv3d->view; rv3d->view = RV3D_VIEW_USER; } @@ -212,8 +231,8 @@ void view3d_smooth_view(bContext *C, View3D *v3d, ARegion *ar, Object *oldcamera float vec1[3] = {0, 0, 1}, vec2[3] = {0, 0, 1}; float q1[4], q2[4]; - invert_qt_qt(q1, sms.new_quat); - invert_qt_qt(q2, sms.orig_quat); + invert_qt_qt(q1, sms.dst.quat); + invert_qt_qt(q2, sms.src.quat); mul_qt_v3(q1, vec1); mul_qt_v3(q2, vec2); @@ -223,36 +242,45 @@ void view3d_smooth_view(bContext *C, View3D *v3d, ARegion *ar, Object *oldcamera } /* ensure it shows correct */ - if (sms.to_camera) rv3d->persp = RV3D_PERSP; + if (sms.to_camera) { + rv3d->persp = RV3D_PERSP; + } rv3d->rflag |= RV3D_NAVIGATING; + /* not essential but in some cases the caller will tag the area for redraw, + * and in that case we can get a ficker of the 'org' user view but we want to see 'src' */ + view3d_smooth_view_state_restore(&sms.src, v3d, rv3d); + /* keep track of running timer! */ - if (rv3d->sms == NULL) + if (rv3d->sms == NULL) { rv3d->sms = MEM_mallocN(sizeof(struct SmoothView3DStore), "smoothview v3d"); + } *rv3d->sms = sms; - if (rv3d->smooth_timer) + if (rv3d->smooth_timer) { WM_event_remove_timer(wm, win, rv3d->smooth_timer); + } /* TIMER1 is hardcoded in keymap */ rv3d->smooth_timer = WM_event_add_timer(wm, win, TIMER1, 1.0 / 100.0); /* max 30 frs/sec */ - - ok = TRUE; + + ok = true; } } /* if we get here nothing happens */ - if (ok == FALSE) { - if (sms.to_camera == FALSE) { - copy_v3_v3(rv3d->ofs, sms.new_ofs); - copy_qt_qt(rv3d->viewquat, sms.new_quat); - rv3d->dist = sms.new_dist; - v3d->lens = sms.new_lens; + if (ok == false) { + if (sms.to_camera == false) { + copy_v3_v3(rv3d->ofs, sms.dst.ofs); + copy_qt_qt(rv3d->viewquat, sms.dst.quat); + rv3d->dist = sms.dst.dist; + v3d->lens = sms.dst.lens; ED_view3d_camera_lock_sync(v3d, rv3d); } - if (rv3d->viewlock & RV3D_BOXVIEW) + if (rv3d->viewlock & RV3D_BOXVIEW) { view3d_boxview_copy(sa, ar); + } ED_region_tag_redraw(ar); } @@ -281,22 +309,16 @@ static int view3d_smoothview_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent /* if we went to camera, store the original */ if (sms->to_camera) { rv3d->persp = RV3D_CAMOB; - copy_v3_v3(rv3d->ofs, sms->orig_ofs); - copy_qt_qt(rv3d->viewquat, sms->orig_quat); - rv3d->dist = sms->orig_dist; - v3d->lens = sms->orig_lens; + view3d_smooth_view_state_restore(&sms->org, v3d, rv3d); } else { - copy_v3_v3(rv3d->ofs, sms->new_ofs); - copy_qt_qt(rv3d->viewquat, sms->new_quat); - rv3d->dist = sms->new_dist; - v3d->lens = sms->new_lens; + view3d_smooth_view_state_restore(&sms->dst, v3d, rv3d); ED_view3d_camera_lock_sync(v3d, rv3d); } if ((rv3d->viewlock & RV3D_LOCKED) == 0) { - rv3d->view = sms->orig_view; + rv3d->view = sms->org_view; } MEM_freeN(rv3d->sms); @@ -312,11 +334,11 @@ static int view3d_smoothview_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent step_inv = 1.0f - step; - interp_v3_v3v3(rv3d->ofs, sms->orig_ofs, sms->new_ofs, step); - interp_qt_qtqt(rv3d->viewquat, sms->orig_quat, sms->new_quat, step); + interp_v3_v3v3(rv3d->ofs, sms->src.ofs, sms->dst.ofs, step); + interp_qt_qtqt(rv3d->viewquat, sms->src.quat, sms->dst.quat, step); - rv3d->dist = sms->new_dist * step + sms->orig_dist * step_inv; - v3d->lens = sms->new_lens * step + sms->orig_lens * step_inv; + rv3d->dist = sms->dst.dist * step + sms->src.dist * step_inv; + v3d->lens = sms->dst.lens * step + sms->src.lens * step_inv; ED_view3d_camera_lock_sync(v3d, rv3d); } @@ -326,7 +348,7 @@ static int view3d_smoothview_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent /* note: this doesn't work right because the v3d->lens is now used in ortho mode r51636, * when switching camera in quad-view the other ortho views would zoom & reset. */ -#if 0 +#if 1 WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, v3d); #else ED_region_tag_redraw(CTX_wm_region(C)); diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 6462941fcfd..4e405eefc56 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -5873,7 +5873,6 @@ static void calcVertSlideMouseActiveVert(struct TransInfo *t, const int mval[2]) int i; for (i = 0, sv = sld->sv; i < sld->totsv; i++, sv++) { - /* allow points behind the view [#33643] */ dist = len_squared_v2v2(mval_fl, sv->co_orig_2d); if (dist < min_dist) { min_dist = dist; |