Fix T48340: Smooth view cancels previous view action
Previously users needed to wait for view orbit to finished, so quickly pressing keys would gave different result.
This commit is contained in:
parent
9d3d9ac0b9
commit
568514c875
Notes:
blender-bot
2023-02-14 07:56:04 +01:00
Referenced by issue #48340, Orbit view degrees don't add up correctly because of "Smooth View"
|
@ -2838,6 +2838,8 @@ static void view3d_from_minmax(bContext *C, View3D *v3d, ARegion *ar,
|
|||
float afm[3];
|
||||
float size;
|
||||
|
||||
ED_view3d_smooth_view_finish(C, v3d, ar);
|
||||
|
||||
/* SMOOTHVIEW */
|
||||
float new_ofs[3];
|
||||
float new_dist;
|
||||
|
@ -3196,6 +3198,8 @@ static int viewcenter_cursor_exec(bContext *C, wmOperator *op)
|
|||
ARegion *ar = CTX_wm_region(C);
|
||||
const int smooth_viewtx = WM_operator_smooth_viewtx_get(op);
|
||||
|
||||
ED_view3d_smooth_view_finish(C, v3d, ar);
|
||||
|
||||
/* non camera center */
|
||||
float new_ofs[3];
|
||||
negate_v3_v3(new_ofs, ED_view3d_cursor3d_get(scene, v3d));
|
||||
|
@ -3235,6 +3239,8 @@ static int viewcenter_pick_invoke(bContext *C, wmOperator *op, const wmEvent *ev
|
|||
float new_ofs[3];
|
||||
const int smooth_viewtx = WM_operator_smooth_viewtx_get(op);
|
||||
|
||||
ED_view3d_smooth_view_finish(C, v3d, ar);
|
||||
|
||||
view3d_operator_needs_opengl(C);
|
||||
|
||||
if (ED_view3d_autodist(scene, ar, v3d, event->mval, new_ofs, false, NULL)) {
|
||||
|
@ -3840,6 +3846,8 @@ static int viewnumpad_exec(bContext *C, wmOperator *op)
|
|||
ED_view3d_context_user_region(C, &v3d, &ar);
|
||||
rv3d = ar->regiondata;
|
||||
|
||||
ED_view3d_smooth_view_finish(C, v3d, ar);
|
||||
|
||||
viewnum = RNA_enum_get(op->ptr, "type");
|
||||
align_active = RNA_boolean_get(op->ptr, "align_active");
|
||||
|
||||
|
@ -3990,6 +3998,8 @@ static int vieworbit_exec(bContext *C, wmOperator *op)
|
|||
rv3d = ar->regiondata;
|
||||
}
|
||||
|
||||
ED_view3d_smooth_view_finish(C, v3d, ar);
|
||||
|
||||
if ((rv3d->viewlock & RV3D_LOCKED) == 0 || (view_opposite != RV3D_VIEW_USER)) {
|
||||
if ((rv3d->persp != RV3D_CAMOB) || ED_view3d_camera_lock_check(v3d, rv3d)) {
|
||||
int smooth_viewtx = WM_operator_smooth_viewtx_get(op);
|
||||
|
@ -4195,6 +4205,9 @@ static int viewroll_exec(bContext *C, wmOperator *op)
|
|||
|
||||
rv3d = ar->regiondata;
|
||||
if ((rv3d->persp != RV3D_CAMOB) || ED_view3d_camera_lock_check(v3d, rv3d)) {
|
||||
|
||||
ED_view3d_smooth_view_finish(C, v3d, ar);
|
||||
|
||||
int type = RNA_enum_get(op->ptr, "type");
|
||||
float angle = (type == 0) ? RNA_float_get(op->ptr, "angle") : DEG2RADF(U.pad_rot_angle);
|
||||
float mousevec[3];
|
||||
|
|
|
@ -229,6 +229,10 @@ void ED_view3d_smooth_view(
|
|||
struct View3D *v3d, struct ARegion *ar, const int smooth_viewtx,
|
||||
const V3D_SmoothParams *sview);
|
||||
|
||||
void ED_view3d_smooth_view_finish(
|
||||
struct bContext *C,
|
||||
struct View3D *v3d, struct ARegion *ar);
|
||||
|
||||
void view3d_winmatrix_set(ARegion *ar, const View3D *v3d, const rctf *rect);
|
||||
void view3d_viewmatrix_set(Scene *scene, const View3D *v3d, RegionView3D *rv3d);
|
||||
|
||||
|
|
|
@ -337,17 +337,12 @@ void ED_view3d_smooth_view(
|
|||
}
|
||||
|
||||
/* only meant for timer usage */
|
||||
static int view3d_smoothview_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
|
||||
static void view3d_smoothview_apply(bContext *C, View3D *v3d, ARegion *ar, bool sync_boxview)
|
||||
{
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
RegionView3D *rv3d = CTX_wm_region_view3d(C);
|
||||
RegionView3D *rv3d = ar->regiondata;
|
||||
struct SmoothView3DStore *sms = rv3d->sms;
|
||||
float step, step_inv;
|
||||
|
||||
/* escape if not our timer */
|
||||
if (rv3d->smooth_timer == NULL || rv3d->smooth_timer != event->customdata)
|
||||
return OPERATOR_PASS_THROUGH;
|
||||
|
||||
if (sms->time_allowed != 0.0)
|
||||
step = (float)((rv3d->smooth_timer->duration) / sms->time_allowed);
|
||||
else
|
||||
|
@ -404,8 +399,9 @@ static int view3d_smoothview_invoke(bContext *C, wmOperator *UNUSED(op), const w
|
|||
|
||||
}
|
||||
|
||||
if (rv3d->viewlock & RV3D_BOXVIEW)
|
||||
view3d_boxview_copy(CTX_wm_area(C), CTX_wm_region(C));
|
||||
if (sync_boxview && (rv3d->viewlock & RV3D_BOXVIEW)) {
|
||||
view3d_boxview_copy(CTX_wm_area(C), ar);
|
||||
}
|
||||
|
||||
/* 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.
|
||||
|
@ -416,12 +412,43 @@ static int view3d_smoothview_invoke(bContext *C, wmOperator *UNUSED(op), const w
|
|||
WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, v3d);
|
||||
}
|
||||
else {
|
||||
ED_region_tag_redraw(CTX_wm_region(C));
|
||||
ED_region_tag_redraw(ar);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static int view3d_smoothview_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
|
||||
{
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
ARegion *ar = CTX_wm_region(C);
|
||||
RegionView3D *rv3d = ar->regiondata;
|
||||
|
||||
/* escape if not our timer */
|
||||
if (rv3d->smooth_timer == NULL || rv3d->smooth_timer != event->customdata) {
|
||||
return OPERATOR_PASS_THROUGH;
|
||||
}
|
||||
|
||||
view3d_smoothview_apply(C, v3d, ar, true);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
void ED_view3d_smooth_view_finish(
|
||||
bContext *C,
|
||||
View3D *v3d, ARegion *ar)
|
||||
{
|
||||
RegionView3D *rv3d = ar->regiondata;
|
||||
|
||||
if (rv3d && rv3d->sms) {
|
||||
rv3d->sms->time_allowed = 0.0; /* force finishing */
|
||||
view3d_smoothview_apply(C, v3d, ar, false);
|
||||
|
||||
/* force update of view matrix so tools that run immediately after
|
||||
* can use them without redrawing first */
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ED_view3d_update_viewmat(scene, v3d, ar, NULL, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void VIEW3D_OT_smoothview(wmOperatorType *ot)
|
||||
{
|
||||
|
||||
|
|
Loading…
Reference in New Issue