diff options
author | Campbell Barton <ideasman42@gmail.com> | 2014-02-22 09:19:02 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2014-02-22 09:30:48 +0400 |
commit | 739ae1d80956759767e137fe17286dc360788a1b (patch) | |
tree | 64736e18dccebcc24cc4f96b530eeca1f1f3f775 | |
parent | 3a44e975a9c96521b722d631207b87d0210e1202 (diff) |
NDOF: fix for view3d ignoring lens values when panning
image, mce, view2d and view3d now have matching pan speed.
-rw-r--r-- | source/blender/editors/interface/interface_handlers.c | 8 | ||||
-rw-r--r-- | source/blender/editors/interface/view2d_ops.c | 11 | ||||
-rw-r--r-- | source/blender/editors/space_clip/clip_ops.c | 19 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_ops.c | 19 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_edit.c | 27 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_fly.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_walk.c | 2 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_userdef_types.h | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 2 |
9 files changed, 39 insertions, 53 deletions
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index ce15188132d..05b31c016f8 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -4386,7 +4386,7 @@ static bool ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, } static void ui_ndofedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, - wmNDOFMotionData *ndof, + const wmNDOFMotionData *ndof, const enum eSnapType snap, const bool shift) { float *hsv = ui_block_hsv_get(but->block); @@ -4480,7 +4480,7 @@ static int ui_do_but_HSVCUBE(bContext *C, uiBlock *block, uiBut *but, uiHandleBu return WM_UI_HANDLER_BREAK; } else if (event->type == NDOF_MOTION) { - wmNDOFMotionData *ndof = (wmNDOFMotionData *) event->customdata; + const wmNDOFMotionData *ndof = event->customdata; const enum eSnapType snap = ui_event_to_snap(event); ui_ndofedit_but_HSVCUBE(but, data, ndof, snap, event->shift != 0); @@ -4630,7 +4630,7 @@ static bool ui_numedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, } static void ui_ndofedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, - wmNDOFMotionData *ndof, + const wmNDOFMotionData *ndof, const enum eSnapType snap, const bool shift) { float *hsv = ui_block_hsv_get(but->block); @@ -4712,7 +4712,7 @@ static int ui_do_but_HSVCIRCLE(bContext *C, uiBlock *block, uiBut *but, uiHandle } else if (event->type == NDOF_MOTION) { const enum eSnapType snap = ui_event_to_snap(event); - wmNDOFMotionData *ndof = (wmNDOFMotionData *) event->customdata; + const wmNDOFMotionData *ndof = event->customdata; ui_ndofedit_but_HSVCIRCLE(but, data, ndof, snap, event->shift != 0); diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c index a8f01b7aa5a..1f63ad87b37 100644 --- a/source/blender/editors/interface/view2d_ops.c +++ b/source/blender/editors/interface/view2d_ops.c @@ -1262,12 +1262,11 @@ static int view2d_ndof_invoke(bContext *C, wmOperator *op, const wmEvent *event) return OPERATOR_CANCELLED; } else { - wmNDOFMotionData *ndof = (wmNDOFMotionData *) event->customdata; + const wmNDOFMotionData *ndof = event->customdata; - float dt = ndof->dt; /* tune these until it feels right */ const float zoom_sensitivity = 0.5f; - const float pan_sensitivity = 10.0f; /* match view3d ortho */ + const float speed = 10.0f; /* match view3d ortho */ const bool has_translate = (ndof->tvec[0] && ndof->tvec[1]) && view_pan_poll(C); const bool has_zoom = (ndof->tvec[2] != 0.0f) && view_zoom_poll(C); @@ -1278,8 +1277,8 @@ static int view2d_ndof_invoke(bContext *C, wmOperator *op, const wmEvent *event) WM_event_ndof_pan_get(ndof, pan_vec, false); - pan_vec[0] *= pan_sensitivity; - pan_vec[1] *= pan_sensitivity; + pan_vec[0] *= speed; + pan_vec[1] *= speed; vpd = op->customdata; @@ -1292,7 +1291,7 @@ static int view2d_ndof_invoke(bContext *C, wmOperator *op, const wmEvent *event) if (has_zoom) { if (view_zoomdrag_init(C, op)) { v2dViewZoomData *vzd; - float zoom_factor = zoom_sensitivity * dt * -ndof->tvec[2]; + float zoom_factor = zoom_sensitivity * ndof->dt * -ndof->tvec[2]; bool do_zoom_xy[2]; diff --git a/source/blender/editors/space_clip/clip_ops.c b/source/blender/editors/space_clip/clip_ops.c index 6767f92d338..7ee94fe92fc 100644 --- a/source/blender/editors/space_clip/clip_ops.c +++ b/source/blender/editors/space_clip/clip_ops.c @@ -1335,24 +1335,13 @@ static int clip_view_ndof_invoke(bContext *C, wmOperator *UNUSED(op), const wmEv ARegion *ar = CTX_wm_region(C); float pan_vec[3]; - wmNDOFMotionData *ndof = (wmNDOFMotionData *) event->customdata; - - float dt = ndof->dt; - - /* tune these until it feels right */ - const float pan_sensitivity = 300.0f; /* screen pixels per second */ - - /* "mouse zoom" factor = 1 + (dx + dy) / 300 - * what about "ndof zoom" factor? should behave like this: - * at rest -> factor = 1 - * move forward -> factor > 1 - * move backward -> factor < 1 - */ + const wmNDOFMotionData *ndof = event->customdata; + const float speed = NDOF_PIXELS_PER_SECOND; WM_event_ndof_pan_get(ndof, pan_vec, true); - mul_v2_fl(pan_vec, (pan_sensitivity * dt) / sc->zoom); - pan_vec[2] *= -dt; + mul_v2_fl(pan_vec, (speed * ndof->dt) / sc->zoom); + pan_vec[2] *= -ndof->dt; sclip_zoom_set_factor(C, 1.0f + pan_vec[2], NULL); sc->xof += pan_vec[0]; diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index 29448a2c5cd..bb7a9b9a4ba 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -601,24 +601,13 @@ static int image_view_ndof_invoke(bContext *C, wmOperator *UNUSED(op), const wmE ARegion *ar = CTX_wm_region(C); float pan_vec[3]; - wmNDOFMotionData *ndof = (wmNDOFMotionData *) event->customdata; - - float dt = ndof->dt; - - /* tune these until it feels right */ - const float pan_sensitivity = 300.0f; /* screen pixels per second */ - - /* "mouse zoom" factor = 1 + (dx + dy) / 300 - * what about "ndof zoom" factor? should behave like this: - * at rest -> factor = 1 - * move forward -> factor > 1 - * move backward -> factor < 1 - */ + const wmNDOFMotionData *ndof = event->customdata; + const float speed = NDOF_PIXELS_PER_SECOND; WM_event_ndof_pan_get(ndof, pan_vec, true); - mul_v2_fl(pan_vec, (pan_sensitivity * dt) / sima->zoom); - pan_vec[2] *= -dt; + mul_v2_fl(pan_vec, (speed * ndof->dt) / sima->zoom); + pan_vec[2] *= -ndof->dt; sima_zoom_set_factor(sima, ar, 1.0f + pan_vec[2], NULL); sima->xof += pan_vec[0]; diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index faee6514616..77b0e945c9c 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -1151,6 +1151,17 @@ void VIEW3D_OT_rotate(wmOperatorType *ot) #define NDOF_HAS_TRANSLATE ((!ED_view3d_offset_lock_check(v3d, rv3d)) && !is_zero_v3(ndof->tvec)) #define NDOF_HAS_ROTATE (((rv3d->viewlock & RV3D_LOCKED) == 0) && !is_zero_v3(ndof->rvec)) +static float view3d_ndof_pan_speed_calc(RegionView3D *rv3d) +{ + float speed = rv3d->pixsize * NDOF_PIXELS_PER_SECOND; + + if (rv3d->is_persp) { + speed *= ED_view3d_calc_zfac(rv3d, rv3d->ofs, NULL); + } + + return speed; +} + /** * Zoom and pan in the same function since sometimes zoom is interpreted as dolly (pan forward). * @@ -1160,7 +1171,6 @@ static void view3d_ndof_pan_zoom(const struct wmNDOFMotionData *ndof, ScrArea *s const bool has_translate, const bool has_zoom) { RegionView3D *rv3d = ar->regiondata; - const float dt = ndof->dt; float view_inv[4]; float pan_vec[3]; @@ -1183,7 +1193,7 @@ static void view3d_ndof_pan_zoom(const struct wmNDOFMotionData *ndof, ScrArea *s /* "zoom in" or "translate"? depends on zoom mode in user settings? */ if (ndof->tvec[2]) { - float zoom_distance = rv3d->dist * dt * ndof->tvec[2]; + float zoom_distance = rv3d->dist * ndof->dt * ndof->tvec[2]; if (U.ndof_flag & NDOF_ZOOM_INVERT) zoom_distance = -zoom_distance; @@ -1201,9 +1211,9 @@ static void view3d_ndof_pan_zoom(const struct wmNDOFMotionData *ndof, ScrArea *s } if (has_translate) { - const float speed = rv3d->dist; /* uses distance from pivot to define dolly */ + const float speed = view3d_ndof_pan_speed_calc(rv3d); - mul_v3_fl(pan_vec, speed * dt); + mul_v3_fl(pan_vec, speed * ndof->dt); /* transform motion from view to world coordinates */ invert_qt_qt(view_inv, rv3d->viewquat); @@ -1314,9 +1324,6 @@ void view3d_ndof_fly( const bool use_precision, const short protectflag, bool *r_has_translate, bool *r_has_rotate) { - /* shorthand for oft-used variables */ - const float dt = ndof->dt; - bool has_translate = NDOF_HAS_TRANSLATE; bool has_rotate = NDOF_HAS_ROTATE; @@ -1326,14 +1333,14 @@ void view3d_ndof_fly( rv3d->rot_angle = 0.0f; /* disable onscreen rotation doo-dad */ if (has_translate) { - float speed = 10.0f; /* blender units per second */ + float speed = view3d_ndof_pan_speed_calc(rv3d); float trans[3], trans_orig_y; - /* ^^ this is ok for default cube scene, but should scale with.. something */ + if (use_precision) speed *= 0.2f; WM_event_ndof_pan_get(ndof, trans, false); - mul_v3_fl(trans, speed * dt); + mul_v3_fl(trans, speed * ndof->dt); trans_orig_y = trans[1]; if (U.ndof_flag & NDOF_FLY_HELICOPTER) { diff --git a/source/blender/editors/space_view3d/view3d_fly.c b/source/blender/editors/space_view3d/view3d_fly.c index 42e74be0460..c8c0111d5d4 100644 --- a/source/blender/editors/space_view3d/view3d_fly.c +++ b/source/blender/editors/space_view3d/view3d_fly.c @@ -460,7 +460,7 @@ static void flyEvent(bContext *C, FlyInfo *fly, const wmEvent *event) // puts("ndof motion detected in fly mode!"); // static const char *tag_name = "3D mouse position"; - wmNDOFMotionData *incoming_ndof = (wmNDOFMotionData *)event->customdata; + const wmNDOFMotionData *incoming_ndof = event->customdata; switch (incoming_ndof->progress) { case P_STARTING: /* start keeping track of 3D mouse position */ diff --git a/source/blender/editors/space_view3d/view3d_walk.c b/source/blender/editors/space_view3d/view3d_walk.c index c6d0999d077..7d387332174 100644 --- a/source/blender/editors/space_view3d/view3d_walk.c +++ b/source/blender/editors/space_view3d/view3d_walk.c @@ -645,7 +645,7 @@ static void walkEvent(bContext *C, wmOperator *UNUSED(op), WalkInfo *walk, const // puts("ndof motion detected in walk mode!"); // static const char *tag_name = "3D mouse position"; - wmNDOFMotionData *incoming_ndof = (wmNDOFMotionData *)event->customdata; + const wmNDOFMotionData *incoming_ndof = event->customdata; switch (incoming_ndof->progress) { case P_STARTING: /* start keeping track of 3D mouse position */ diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 4248efd0919..6faba7ccd2f 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -801,6 +801,8 @@ typedef enum eNdof_Flag { NDOF_TURNTABLE = (1 << 15), } eNdof_Flag; +#define NDOF_PIXELS_PER_SECOND 600.0f + /* compute_device_type */ typedef enum eCompute_Device_Type { USER_COMPUTE_DEVICE_NONE = 0, diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 5254bff99cd..3298a786abc 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -540,7 +540,7 @@ void WM_event_print(const wmEvent *event) event->keymap_idname, (void *)event); if (ISNDOF(event->type)) { - const wmNDOFMotionData *ndof = (wmNDOFMotionData *) event->customdata; + const wmNDOFMotionData *ndof = event->customdata; if (event->type == NDOF_MOTION) { printf(" ndof: rot: (%.4f %.4f %.4f),\n" " tx: (%.4f %.4f %.4f),\n" |