diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-04-17 07:17:24 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-04-17 07:21:24 +0300 |
commit | e12c08e8d170b7ca40f204a5b0423c23a9fbc2c1 (patch) | |
tree | 8cf3453d12edb177a218ef8009357518ec6cab6a /source/blender/editors/space_view3d/view3d_fly.c | |
parent | b3dabc200a4b0399ec6b81f2ff2730d07b44fcaa (diff) |
ClangFormat: apply to source, most of intern
Apply clang format as proposed in T53211.
For details on usage and instructions for migrating branches
without conflicts, see:
https://wiki.blender.org/wiki/Tools/ClangFormat
Diffstat (limited to 'source/blender/editors/space_view3d/view3d_fly.c')
-rw-r--r-- | source/blender/editors/space_view3d/view3d_fly.c | 1782 |
1 files changed, 899 insertions, 883 deletions
diff --git a/source/blender/editors/space_view3d/view3d_fly.c b/source/blender/editors/space_view3d/view3d_fly.c index b80ce2c49b0..8dc3abe6af5 100644 --- a/source/blender/editors/space_view3d/view3d_fly.c +++ b/source/blender/editors/space_view3d/view3d_fly.c @@ -38,7 +38,6 @@ #include "BLT_translation.h" - #include "WM_api.h" #include "WM_types.h" @@ -54,1068 +53,1085 @@ #include "DEG_depsgraph.h" -#include "view3d_intern.h" /* own include */ +#include "view3d_intern.h" /* own include */ /* NOTE: these defines are saved in keymap files, * do not change values but just add new ones */ enum { - FLY_MODAL_CANCEL = 1, - FLY_MODAL_CONFIRM, - FLY_MODAL_ACCELERATE, - FLY_MODAL_DECELERATE, - FLY_MODAL_PAN_ENABLE, - FLY_MODAL_PAN_DISABLE, - FLY_MODAL_DIR_FORWARD, - FLY_MODAL_DIR_BACKWARD, - FLY_MODAL_DIR_LEFT, - FLY_MODAL_DIR_RIGHT, - FLY_MODAL_DIR_UP, - FLY_MODAL_DIR_DOWN, - FLY_MODAL_AXIS_LOCK_X, - FLY_MODAL_AXIS_LOCK_Z, - FLY_MODAL_PRECISION_ENABLE, - FLY_MODAL_PRECISION_DISABLE, - FLY_MODAL_FREELOOK_ENABLE, - FLY_MODAL_FREELOOK_DISABLE, - FLY_MODAL_SPEED, /* mousepan typically */ + FLY_MODAL_CANCEL = 1, + FLY_MODAL_CONFIRM, + FLY_MODAL_ACCELERATE, + FLY_MODAL_DECELERATE, + FLY_MODAL_PAN_ENABLE, + FLY_MODAL_PAN_DISABLE, + FLY_MODAL_DIR_FORWARD, + FLY_MODAL_DIR_BACKWARD, + FLY_MODAL_DIR_LEFT, + FLY_MODAL_DIR_RIGHT, + FLY_MODAL_DIR_UP, + FLY_MODAL_DIR_DOWN, + FLY_MODAL_AXIS_LOCK_X, + FLY_MODAL_AXIS_LOCK_Z, + FLY_MODAL_PRECISION_ENABLE, + FLY_MODAL_PRECISION_DISABLE, + FLY_MODAL_FREELOOK_ENABLE, + FLY_MODAL_FREELOOK_DISABLE, + FLY_MODAL_SPEED, /* mousepan typically */ }; /* relative view axis locking - xlock, zlock */ typedef enum eFlyPanState { - /* disabled */ - FLY_AXISLOCK_STATE_OFF = 0, + /* disabled */ + FLY_AXISLOCK_STATE_OFF = 0, - /* enabled but not checking because mouse hasn't moved outside the margin since locking was - * checked an not needed when the mouse moves, locking is set to 2 so checks are done. */ - FLY_AXISLOCK_STATE_IDLE = 1, + /* enabled but not checking because mouse hasn't moved outside the margin since locking was + * checked an not needed when the mouse moves, locking is set to 2 so checks are done. */ + FLY_AXISLOCK_STATE_IDLE = 1, - /* mouse moved and checking needed, - * if no view altering is done its changed back to #FLY_AXISLOCK_STATE_IDLE */ - FLY_AXISLOCK_STATE_ACTIVE = 2, + /* mouse moved and checking needed, + * if no view altering is done its changed back to #FLY_AXISLOCK_STATE_IDLE */ + FLY_AXISLOCK_STATE_ACTIVE = 2, } eFlyPanState; /* called in transform_ops.c, on each regeneration of keymaps */ void fly_modal_keymap(wmKeyConfig *keyconf) { - static const EnumPropertyItem modal_items[] = { - {FLY_MODAL_CONFIRM, "CONFIRM", 0, "Confirm", ""}, - {FLY_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""}, + static const EnumPropertyItem modal_items[] = { + {FLY_MODAL_CONFIRM, "CONFIRM", 0, "Confirm", ""}, + {FLY_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""}, - {FLY_MODAL_DIR_FORWARD, "FORWARD", 0, "Forward", ""}, - {FLY_MODAL_DIR_BACKWARD, "BACKWARD", 0, "Backward", ""}, - {FLY_MODAL_DIR_LEFT, "LEFT", 0, "Left", ""}, - {FLY_MODAL_DIR_RIGHT, "RIGHT", 0, "Right", ""}, - {FLY_MODAL_DIR_UP, "UP", 0, "Up", ""}, - {FLY_MODAL_DIR_DOWN, "DOWN", 0, "Down", ""}, + {FLY_MODAL_DIR_FORWARD, "FORWARD", 0, "Forward", ""}, + {FLY_MODAL_DIR_BACKWARD, "BACKWARD", 0, "Backward", ""}, + {FLY_MODAL_DIR_LEFT, "LEFT", 0, "Left", ""}, + {FLY_MODAL_DIR_RIGHT, "RIGHT", 0, "Right", ""}, + {FLY_MODAL_DIR_UP, "UP", 0, "Up", ""}, + {FLY_MODAL_DIR_DOWN, "DOWN", 0, "Down", ""}, - {FLY_MODAL_PAN_ENABLE, "PAN_ENABLE", 0, "Pan", ""}, - {FLY_MODAL_PAN_DISABLE, "PAN_DISABLE", 0, "Pan (Off)", ""}, + {FLY_MODAL_PAN_ENABLE, "PAN_ENABLE", 0, "Pan", ""}, + {FLY_MODAL_PAN_DISABLE, "PAN_DISABLE", 0, "Pan (Off)", ""}, - {FLY_MODAL_ACCELERATE, "ACCELERATE", 0, "Accelerate", ""}, - {FLY_MODAL_DECELERATE, "DECELERATE", 0, "Decelerate", ""}, + {FLY_MODAL_ACCELERATE, "ACCELERATE", 0, "Accelerate", ""}, + {FLY_MODAL_DECELERATE, "DECELERATE", 0, "Decelerate", ""}, - {FLY_MODAL_AXIS_LOCK_X, "AXIS_LOCK_X", 0, "X Axis Correction", "X axis correction (toggle)"}, - {FLY_MODAL_AXIS_LOCK_Z, "AXIS_LOCK_Z", 0, "X Axis Correction", "Z axis correction (toggle)"}, + {FLY_MODAL_AXIS_LOCK_X, "AXIS_LOCK_X", 0, "X Axis Correction", "X axis correction (toggle)"}, + {FLY_MODAL_AXIS_LOCK_Z, "AXIS_LOCK_Z", 0, "X Axis Correction", "Z axis correction (toggle)"}, - {FLY_MODAL_PRECISION_ENABLE, "PRECISION_ENABLE", 0, "Precision", ""}, - {FLY_MODAL_PRECISION_DISABLE, "PRECISION_DISABLE", 0, "Precision (Off)", ""}, + {FLY_MODAL_PRECISION_ENABLE, "PRECISION_ENABLE", 0, "Precision", ""}, + {FLY_MODAL_PRECISION_DISABLE, "PRECISION_DISABLE", 0, "Precision (Off)", ""}, - {FLY_MODAL_FREELOOK_ENABLE, "FREELOOK_ENABLE", 0, "Rotation", ""}, - {FLY_MODAL_FREELOOK_DISABLE, "FREELOOK_DISABLE", 0, "Rotation (Off)", ""}, + {FLY_MODAL_FREELOOK_ENABLE, "FREELOOK_ENABLE", 0, "Rotation", ""}, + {FLY_MODAL_FREELOOK_DISABLE, "FREELOOK_DISABLE", 0, "Rotation (Off)", ""}, - {0, NULL, 0, NULL, NULL}, - }; + {0, NULL, 0, NULL, NULL}, + }; - wmKeyMap *keymap = WM_modalkeymap_get(keyconf, "View3D Fly Modal"); + wmKeyMap *keymap = WM_modalkeymap_get(keyconf, "View3D Fly Modal"); - /* this function is called for each spacetype, only needs to add map once */ - if (keymap && keymap->modal_items) { - return; - } + /* this function is called for each spacetype, only needs to add map once */ + if (keymap && keymap->modal_items) { + return; + } - keymap = WM_modalkeymap_add(keyconf, "View3D Fly Modal", modal_items); + keymap = WM_modalkeymap_add(keyconf, "View3D Fly Modal", modal_items); - /* assign map to operators */ - WM_modalkeymap_assign(keymap, "VIEW3D_OT_fly"); + /* assign map to operators */ + WM_modalkeymap_assign(keymap, "VIEW3D_OT_fly"); } typedef struct FlyInfo { - /* context stuff */ - RegionView3D *rv3d; - View3D *v3d; - ARegion *ar; - struct Depsgraph *depsgraph; - Scene *scene; - - wmTimer *timer; /* needed for redraws */ - - short state; - bool redraw; - bool use_precision; - /* if the user presses shift they can look about - * without moving the direction there looking */ - bool use_freelook; - - int mval[2]; /* latest 2D mouse values */ - int center_mval[2]; /* center mouse values */ - float width, height; /* camera viewport dimensions */ + /* context stuff */ + RegionView3D *rv3d; + View3D *v3d; + ARegion *ar; + struct Depsgraph *depsgraph; + Scene *scene; + + wmTimer *timer; /* needed for redraws */ + + short state; + bool redraw; + bool use_precision; + /* if the user presses shift they can look about + * without moving the direction there looking */ + bool use_freelook; + + int mval[2]; /* latest 2D mouse values */ + int center_mval[2]; /* center mouse values */ + float width, height; /* camera viewport dimensions */ #ifdef WITH_INPUT_NDOF - wmNDOFMotionData *ndof; /* latest 3D mouse values */ + wmNDOFMotionData *ndof; /* latest 3D mouse values */ #endif - /* fly state state */ - float speed; /* the speed the view is moving per redraw */ - short axis; /* Axis index to move along by default Z to move along the view */ - bool pan_view; /* when true, pan the view instead of rotating */ + /* fly state state */ + float speed; /* the speed the view is moving per redraw */ + short axis; /* Axis index to move along by default Z to move along the view */ + bool pan_view; /* when true, pan the view instead of rotating */ - eFlyPanState xlock, zlock; - float xlock_momentum, zlock_momentum; /* nicer dynamics */ - float grid; /* world scale 1.0 default */ + eFlyPanState xlock, zlock; + float xlock_momentum, zlock_momentum; /* nicer dynamics */ + float grid; /* world scale 1.0 default */ - /* compare between last state */ - double time_lastwheel; /* used to accelerate when using the mousewheel a lot */ - double time_lastdraw; /* time between draws */ + /* compare between last state */ + double time_lastwheel; /* used to accelerate when using the mousewheel a lot */ + double time_lastdraw; /* time between draws */ - void *draw_handle_pixel; + void *draw_handle_pixel; - /* use for some lag */ - float dvec_prev[3]; /* old for some lag */ + /* use for some lag */ + float dvec_prev[3]; /* old for some lag */ - struct View3DCameraControl *v3d_camera_control; + struct View3DCameraControl *v3d_camera_control; } FlyInfo; static void drawFlyPixel(const struct bContext *UNUSED(C), ARegion *UNUSED(ar), void *arg) { - FlyInfo *fly = arg; - rctf viewborder; - int xoff, yoff; - float x1, x2, y1, y2; + FlyInfo *fly = arg; + rctf viewborder; + int xoff, yoff; + float x1, x2, y1, y2; - if (ED_view3d_cameracontrol_object_get(fly->v3d_camera_control)) { - ED_view3d_calc_camera_border(fly->scene, fly->depsgraph, fly->ar, fly->v3d, fly->rv3d, &viewborder, false); - xoff = viewborder.xmin; - yoff = viewborder.ymin; - } - else { - xoff = 0; - yoff = 0; - } + if (ED_view3d_cameracontrol_object_get(fly->v3d_camera_control)) { + ED_view3d_calc_camera_border( + fly->scene, fly->depsgraph, fly->ar, fly->v3d, fly->rv3d, &viewborder, false); + xoff = viewborder.xmin; + yoff = viewborder.ymin; + } + else { + xoff = 0; + yoff = 0; + } - /* draws 4 edge brackets that frame the safe area where the - * mouse can move during fly mode without spinning the view */ + /* draws 4 edge brackets that frame the safe area where the + * mouse can move during fly mode without spinning the view */ - x1 = xoff + 0.45f * fly->width; - y1 = yoff + 0.45f * fly->height; - x2 = xoff + 0.55f * fly->width; - y2 = yoff + 0.55f * fly->height; + x1 = xoff + 0.45f * fly->width; + y1 = yoff + 0.45f * fly->height; + x2 = xoff + 0.55f * fly->width; + y2 = yoff + 0.55f * fly->height; - GPUVertFormat *format = immVertexFormat(); - uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); + GPUVertFormat *format = immVertexFormat(); + uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); - immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); - immUniformThemeColor(TH_VIEW_OVERLAY); + immUniformThemeColor(TH_VIEW_OVERLAY); - immBegin(GPU_PRIM_LINES, 16); + immBegin(GPU_PRIM_LINES, 16); - /* bottom left */ - immVertex2f(pos, x1, y1); - immVertex2f(pos, x1, y1 + 5); + /* bottom left */ + immVertex2f(pos, x1, y1); + immVertex2f(pos, x1, y1 + 5); - immVertex2f(pos, x1, y1); - immVertex2f(pos, x1 + 5, y1); + immVertex2f(pos, x1, y1); + immVertex2f(pos, x1 + 5, y1); - /* top right */ - immVertex2f(pos, x2, y2); - immVertex2f(pos, x2, y2 - 5); + /* top right */ + immVertex2f(pos, x2, y2); + immVertex2f(pos, x2, y2 - 5); - immVertex2f(pos, x2, y2); - immVertex2f(pos, x2 - 5, y2); + immVertex2f(pos, x2, y2); + immVertex2f(pos, x2 - 5, y2); - /* top left */ - immVertex2f(pos, x1, y2); - immVertex2f(pos, x1, y2 - 5); + /* top left */ + immVertex2f(pos, x1, y2); + immVertex2f(pos, x1, y2 - 5); - immVertex2f(pos, x1, y2); - immVertex2f(pos, x1 + 5, y2); + immVertex2f(pos, x1, y2); + immVertex2f(pos, x1 + 5, y2); - /* bottom right */ - immVertex2f(pos, x2, y1); - immVertex2f(pos, x2, y1 + 5); + /* bottom right */ + immVertex2f(pos, x2, y1); + immVertex2f(pos, x2, y1 + 5); - immVertex2f(pos, x2, y1); - immVertex2f(pos, x2 - 5, y1); + immVertex2f(pos, x2, y1); + immVertex2f(pos, x2 - 5, y1); - immEnd(); - immUnbindProgram(); + immEnd(); + immUnbindProgram(); } static void fly_update_header(bContext *C, wmOperator *op, FlyInfo *fly) { - char header[UI_MAX_DRAW_STR]; - char buf[UI_MAX_DRAW_STR]; + char header[UI_MAX_DRAW_STR]; + char buf[UI_MAX_DRAW_STR]; - char *p = buf; - int available_len = sizeof(buf); + char *p = buf; + int available_len = sizeof(buf); #define WM_MODALKEY(_id) \ - WM_modalkeymap_operator_items_to_string_buf(op->type, (_id), true, UI_MAX_SHORTCUT_STR, &available_len, &p) - - BLI_snprintf(header, sizeof(header), IFACE_("%s: confirm, %s: cancel, " - "%s: pan enable, " - "%s|%s|%s|%s|%s|%s: direction, " - "%s: slow, %s: free look, " - "%s: Upright x axis (%s), " - "%s: Upright z axis (%s), " - "%s: increase speed, %s: decrease speed"), - WM_MODALKEY(FLY_MODAL_CONFIRM), WM_MODALKEY(FLY_MODAL_CANCEL), - WM_MODALKEY(FLY_MODAL_PAN_ENABLE), - WM_MODALKEY(FLY_MODAL_DIR_FORWARD), WM_MODALKEY(FLY_MODAL_DIR_LEFT), - WM_MODALKEY(FLY_MODAL_DIR_BACKWARD), WM_MODALKEY(FLY_MODAL_DIR_RIGHT), - WM_MODALKEY(FLY_MODAL_DIR_UP), WM_MODALKEY(FLY_MODAL_DIR_DOWN), - WM_MODALKEY(FLY_MODAL_PRECISION_ENABLE), WM_MODALKEY(FLY_MODAL_FREELOOK_ENABLE), - WM_MODALKEY(FLY_MODAL_AXIS_LOCK_X), WM_bool_as_string(fly->xlock != FLY_AXISLOCK_STATE_OFF), - WM_MODALKEY(FLY_MODAL_AXIS_LOCK_Z), WM_bool_as_string(fly->zlock != FLY_AXISLOCK_STATE_OFF), - WM_MODALKEY(FLY_MODAL_ACCELERATE), WM_MODALKEY(FLY_MODAL_DECELERATE)); + WM_modalkeymap_operator_items_to_string_buf( \ + op->type, (_id), true, UI_MAX_SHORTCUT_STR, &available_len, &p) + + BLI_snprintf(header, + sizeof(header), + IFACE_("%s: confirm, %s: cancel, " + "%s: pan enable, " + "%s|%s|%s|%s|%s|%s: direction, " + "%s: slow, %s: free look, " + "%s: Upright x axis (%s), " + "%s: Upright z axis (%s), " + "%s: increase speed, %s: decrease speed"), + WM_MODALKEY(FLY_MODAL_CONFIRM), + WM_MODALKEY(FLY_MODAL_CANCEL), + WM_MODALKEY(FLY_MODAL_PAN_ENABLE), + WM_MODALKEY(FLY_MODAL_DIR_FORWARD), + WM_MODALKEY(FLY_MODAL_DIR_LEFT), + WM_MODALKEY(FLY_MODAL_DIR_BACKWARD), + WM_MODALKEY(FLY_MODAL_DIR_RIGHT), + WM_MODALKEY(FLY_MODAL_DIR_UP), + WM_MODALKEY(FLY_MODAL_DIR_DOWN), + WM_MODALKEY(FLY_MODAL_PRECISION_ENABLE), + WM_MODALKEY(FLY_MODAL_FREELOOK_ENABLE), + WM_MODALKEY(FLY_MODAL_AXIS_LOCK_X), + WM_bool_as_string(fly->xlock != FLY_AXISLOCK_STATE_OFF), + WM_MODALKEY(FLY_MODAL_AXIS_LOCK_Z), + WM_bool_as_string(fly->zlock != FLY_AXISLOCK_STATE_OFF), + WM_MODALKEY(FLY_MODAL_ACCELERATE), + WM_MODALKEY(FLY_MODAL_DECELERATE)); #undef WM_MODALKEY - ED_workspace_status_text(C, header); + ED_workspace_status_text(C, header); } /* FlyInfo->state */ enum { - FLY_RUNNING = 0, - FLY_CANCEL = 1, - FLY_CONFIRM = 2, + FLY_RUNNING = 0, + FLY_CANCEL = 1, + FLY_CONFIRM = 2, }; static bool initFlyInfo(bContext *C, FlyInfo *fly, wmOperator *op, const wmEvent *event) { - wmWindow *win = CTX_wm_window(C); - rctf viewborder; + wmWindow *win = CTX_wm_window(C); + rctf viewborder; - float upvec[3]; /* tmp */ - float mat[3][3]; + float upvec[3]; /* tmp */ + float mat[3][3]; - fly->rv3d = CTX_wm_region_view3d(C); - fly->v3d = CTX_wm_view3d(C); - fly->ar = CTX_wm_region(C); - fly->depsgraph = CTX_data_depsgraph(C); - fly->scene = CTX_data_scene(C); + fly->rv3d = CTX_wm_region_view3d(C); + fly->v3d = CTX_wm_view3d(C); + fly->ar = CTX_wm_region(C); + fly->depsgraph = CTX_data_depsgraph(C); + fly->scene = CTX_data_scene(C); #ifdef NDOF_FLY_DEBUG - puts("\n-- fly begin --"); + puts("\n-- fly begin --"); #endif - /* sanity check: for rare but possible case (if lib-linking the camera fails) */ - if ((fly->rv3d->persp == RV3D_CAMOB) && (fly->v3d->camera == NULL)) { - fly->rv3d->persp = RV3D_PERSP; - } - - if (fly->rv3d->persp == RV3D_CAMOB && ID_IS_LINKED(fly->v3d->camera)) { - BKE_report(op->reports, RPT_ERROR, "Cannot fly a camera from an external library"); - return false; - } - - if (ED_view3d_offset_lock_check(fly->v3d, fly->rv3d)) { - BKE_report(op->reports, RPT_ERROR, "Cannot fly when the view offset is locked"); - return false; - } - - if (fly->rv3d->persp == RV3D_CAMOB && fly->v3d->camera->constraints.first) { - BKE_report(op->reports, RPT_ERROR, "Cannot fly an object with constraints"); - return false; - } - - fly->state = FLY_RUNNING; - fly->speed = 0.0f; - fly->axis = 2; - fly->pan_view = false; - fly->xlock = FLY_AXISLOCK_STATE_OFF; - fly->zlock = FLY_AXISLOCK_STATE_OFF; - fly->xlock_momentum = 0.0f; - fly->zlock_momentum = 0.0f; - fly->grid = 1.0f; - fly->use_precision = false; - fly->use_freelook = false; + /* sanity check: for rare but possible case (if lib-linking the camera fails) */ + if ((fly->rv3d->persp == RV3D_CAMOB) && (fly->v3d->camera == NULL)) { + fly->rv3d->persp = RV3D_PERSP; + } + + if (fly->rv3d->persp == RV3D_CAMOB && ID_IS_LINKED(fly->v3d->camera)) { + BKE_report(op->reports, RPT_ERROR, "Cannot fly a camera from an external library"); + return false; + } + + if (ED_view3d_offset_lock_check(fly->v3d, fly->rv3d)) { + BKE_report(op->reports, RPT_ERROR, "Cannot fly when the view offset is locked"); + return false; + } + + if (fly->rv3d->persp == RV3D_CAMOB && fly->v3d->camera->constraints.first) { + BKE_report(op->reports, RPT_ERROR, "Cannot fly an object with constraints"); + return false; + } + + fly->state = FLY_RUNNING; + fly->speed = 0.0f; + fly->axis = 2; + fly->pan_view = false; + fly->xlock = FLY_AXISLOCK_STATE_OFF; + fly->zlock = FLY_AXISLOCK_STATE_OFF; + fly->xlock_momentum = 0.0f; + fly->zlock_momentum = 0.0f; + fly->grid = 1.0f; + fly->use_precision = false; + fly->use_freelook = false; #ifdef NDOF_FLY_DRAW_TOOMUCH - fly->redraw = 1; + fly->redraw = 1; #endif - zero_v3(fly->dvec_prev); + zero_v3(fly->dvec_prev); - fly->timer = WM_event_add_timer(CTX_wm_manager(C), win, TIMER, 0.01f); + fly->timer = WM_event_add_timer(CTX_wm_manager(C), win, TIMER, 0.01f); - copy_v2_v2_int(fly->mval, event->mval); + copy_v2_v2_int(fly->mval, event->mval); #ifdef WITH_INPUT_NDOF - fly->ndof = NULL; + fly->ndof = NULL; #endif - fly->time_lastdraw = fly->time_lastwheel = PIL_check_seconds_timer(); - - fly->draw_handle_pixel = ED_region_draw_cb_activate(fly->ar->type, drawFlyPixel, fly, REGION_DRAW_POST_PIXEL); - - fly->rv3d->rflag |= RV3D_NAVIGATING; - - /* detect whether to start with Z locking */ - copy_v3_fl3(upvec, 1.0f, 0.0f, 0.0f); - copy_m3_m4(mat, fly->rv3d->viewinv); - mul_m3_v3(mat, upvec); - if (fabsf(upvec[2]) < 0.1f) { - fly->zlock = FLY_AXISLOCK_STATE_IDLE; - } - - fly->v3d_camera_control = ED_view3d_cameracontrol_acquire( - CTX_data_depsgraph(C), fly->scene, fly->v3d, fly->rv3d, - (U.uiflag & USER_CAM_LOCK_NO_PARENT) == 0); - - /* calculate center */ - if (ED_view3d_cameracontrol_object_get(fly->v3d_camera_control)) { - ED_view3d_calc_camera_border(fly->scene, fly->depsgraph, fly->ar, fly->v3d, fly->rv3d, &viewborder, false); - - fly->width = BLI_rctf_size_x(&viewborder); - fly->height = BLI_rctf_size_y(&viewborder); - - fly->center_mval[0] = viewborder.xmin + fly->width / 2; - fly->center_mval[1] = viewborder.ymin + fly->height / 2; - } - else { - fly->width = fly->ar->winx; - fly->height = fly->ar->winy; - - fly->center_mval[0] = fly->width / 2; - fly->center_mval[1] = fly->height / 2; - } - - /* center the mouse, probably the UI mafia are against this but without its quite annoying */ - WM_cursor_warp(win, fly->ar->winrct.xmin + fly->center_mval[0], fly->ar->winrct.ymin + fly->center_mval[1]); - - fly_update_header(C, op, fly); - return 1; + fly->time_lastdraw = fly->time_lastwheel = PIL_check_seconds_timer(); + + fly->draw_handle_pixel = ED_region_draw_cb_activate( + fly->ar->type, drawFlyPixel, fly, REGION_DRAW_POST_PIXEL); + + fly->rv3d->rflag |= RV3D_NAVIGATING; + + /* detect whether to start with Z locking */ + copy_v3_fl3(upvec, 1.0f, 0.0f, 0.0f); + copy_m3_m4(mat, fly->rv3d->viewinv); + mul_m3_v3(mat, upvec); + if (fabsf(upvec[2]) < 0.1f) { + fly->zlock = FLY_AXISLOCK_STATE_IDLE; + } + + fly->v3d_camera_control = ED_view3d_cameracontrol_acquire(CTX_data_depsgraph(C), + fly->scene, + fly->v3d, + fly->rv3d, + (U.uiflag & USER_CAM_LOCK_NO_PARENT) == + 0); + + /* calculate center */ + if (ED_view3d_cameracontrol_object_get(fly->v3d_camera_control)) { + ED_view3d_calc_camera_border( + fly->scene, fly->depsgraph, fly->ar, fly->v3d, fly->rv3d, &viewborder, false); + + fly->width = BLI_rctf_size_x(&viewborder); + fly->height = BLI_rctf_size_y(&viewborder); + + fly->center_mval[0] = viewborder.xmin + fly->width / 2; + fly->center_mval[1] = viewborder.ymin + fly->height / 2; + } + else { + fly->width = fly->ar->winx; + fly->height = fly->ar->winy; + + fly->center_mval[0] = fly->width / 2; + fly->center_mval[1] = fly->height / 2; + } + + /* center the mouse, probably the UI mafia are against this but without its quite annoying */ + WM_cursor_warp( + win, fly->ar->winrct.xmin + fly->center_mval[0], fly->ar->winrct.ymin + fly->center_mval[1]); + + fly_update_header(C, op, fly); + return 1; } static int flyEnd(bContext *C, FlyInfo *fly) { - wmWindow *win; - RegionView3D *rv3d; + wmWindow *win; + RegionView3D *rv3d; - if (fly->state == FLY_RUNNING) { - return OPERATOR_RUNNING_MODAL; - } + if (fly->state == FLY_RUNNING) { + return OPERATOR_RUNNING_MODAL; + } #ifdef NDOF_FLY_DEBUG - puts("\n-- fly end --"); + puts("\n-- fly end --"); #endif - win = CTX_wm_window(C); - rv3d = fly->rv3d; + win = CTX_wm_window(C); + rv3d = fly->rv3d; - WM_event_remove_timer(CTX_wm_manager(C), win, fly->timer); + WM_event_remove_timer(CTX_wm_manager(C), win, fly->timer); - ED_region_draw_cb_exit(fly->ar->type, fly->draw_handle_pixel); + ED_region_draw_cb_exit(fly->ar->type, fly->draw_handle_pixel); - ED_view3d_cameracontrol_release(fly->v3d_camera_control, fly->state == FLY_CANCEL); + ED_view3d_cameracontrol_release(fly->v3d_camera_control, fly->state == FLY_CANCEL); - rv3d->rflag &= ~RV3D_NAVIGATING; + rv3d->rflag &= ~RV3D_NAVIGATING; #ifdef WITH_INPUT_NDOF - if (fly->ndof) { - MEM_freeN(fly->ndof); - } + if (fly->ndof) { + MEM_freeN(fly->ndof); + } #endif - if (fly->state == FLY_CONFIRM) { - MEM_freeN(fly); - return OPERATOR_FINISHED; - } + if (fly->state == FLY_CONFIRM) { + MEM_freeN(fly); + return OPERATOR_FINISHED; + } - MEM_freeN(fly); - return OPERATOR_CANCELLED; + MEM_freeN(fly); + return OPERATOR_CANCELLED; } static void flyEvent(bContext *C, wmOperator *op, FlyInfo *fly, const wmEvent *event) { - if (event->type == TIMER && event->customdata == fly->timer) { - fly->redraw = 1; - } - else if (event->type == MOUSEMOVE) { - copy_v2_v2_int(fly->mval, event->mval); - } + if (event->type == TIMER && event->customdata == fly->timer) { + fly->redraw = 1; + } + else if (event->type == MOUSEMOVE) { + copy_v2_v2_int(fly->mval, event->mval); + } #ifdef WITH_INPUT_NDOF - else if (event->type == NDOF_MOTION) { - /* do these automagically get delivered? yes. */ - // puts("ndof motion detected in fly mode!"); - // static const char *tag_name = "3D mouse position"; - - const wmNDOFMotionData *incoming_ndof = event->customdata; - switch (incoming_ndof->progress) { - case P_STARTING: - /* start keeping track of 3D mouse position */ + else if (event->type == NDOF_MOTION) { + /* do these automagically get delivered? yes. */ + // puts("ndof motion detected in fly mode!"); + // static const char *tag_name = "3D mouse position"; + + const wmNDOFMotionData *incoming_ndof = event->customdata; + switch (incoming_ndof->progress) { + case P_STARTING: + /* start keeping track of 3D mouse position */ # ifdef NDOF_FLY_DEBUG - puts("start keeping track of 3D mouse position"); + puts("start keeping track of 3D mouse position"); # endif - /* fall-through */ - case P_IN_PROGRESS: - /* update 3D mouse position */ + /* fall-through */ + case P_IN_PROGRESS: + /* update 3D mouse position */ # ifdef NDOF_FLY_DEBUG - putchar('.'); fflush(stdout); + putchar('.'); + fflush(stdout); # endif - if (fly->ndof == NULL) { - // fly->ndof = MEM_mallocN(sizeof(wmNDOFMotionData), tag_name); - fly->ndof = MEM_dupallocN(incoming_ndof); - // fly->ndof = malloc(sizeof(wmNDOFMotionData)); - } - else { - memcpy(fly->ndof, incoming_ndof, sizeof(wmNDOFMotionData)); - } - break; - case P_FINISHING: - /* stop keeping track of 3D mouse position */ + if (fly->ndof == NULL) { + // fly->ndof = MEM_mallocN(sizeof(wmNDOFMotionData), tag_name); + fly->ndof = MEM_dupallocN(incoming_ndof); + // fly->ndof = malloc(sizeof(wmNDOFMotionData)); + } + else { + memcpy(fly->ndof, incoming_ndof, sizeof(wmNDOFMotionData)); + } + break; + case P_FINISHING: + /* stop keeping track of 3D mouse position */ # ifdef NDOF_FLY_DEBUG - puts("stop keeping track of 3D mouse position"); + puts("stop keeping track of 3D mouse position"); # endif - if (fly->ndof) { - MEM_freeN(fly->ndof); - // free(fly->ndof); - fly->ndof = NULL; - } - /* update the time else the view will jump when 2D mouse/timer resume */ - fly->time_lastdraw = PIL_check_seconds_timer(); - break; - default: - break; /* should always be one of the above 3 */ - } - } + if (fly->ndof) { + MEM_freeN(fly->ndof); + // free(fly->ndof); + fly->ndof = NULL; + } + /* update the time else the view will jump when 2D mouse/timer resume */ + fly->time_lastdraw = PIL_check_seconds_timer(); + break; + default: + break; /* should always be one of the above 3 */ + } + } #endif /* WITH_INPUT_NDOF */ - /* handle modal keymap first */ - else if (event->type == EVT_MODAL_MAP) { - switch (event->val) { - case FLY_MODAL_CANCEL: - fly->state = FLY_CANCEL; - break; - case FLY_MODAL_CONFIRM: - fly->state = FLY_CONFIRM; - break; - - /* speed adjusting with mousepan (trackpad) */ - case FLY_MODAL_SPEED: - { - float fac = 0.02f * (event->prevy - event->y); - - /* allowing to brake immediate */ - if (fac > 0.0f && fly->speed < 0.0f) { - fly->speed = 0.0f; - } - else if (fac < 0.0f && fly->speed > 0.0f) { - fly->speed = 0.0f; - } - else { - fly->speed += fly->grid * fac; - } - - break; - } - case FLY_MODAL_ACCELERATE: - { - double time_currwheel; - float time_wheel; - - /* not quite correct but avoids confusion WASD/arrow keys 'locking up' */ - if (fly->axis == -1) { - fly->axis = 2; - fly->speed = fabsf(fly->speed); - } - - time_currwheel = PIL_check_seconds_timer(); - time_wheel = (float)(time_currwheel - fly->time_lastwheel); - fly->time_lastwheel = time_currwheel; - /* Mouse wheel delays range from (0.5 == slow) to (0.01 == fast) */ - /* 0-0.5 -> 0-5.0 */ - time_wheel = 1.0f + (10.0f - (20.0f * min_ff(time_wheel, 0.5f))); - - if (fly->speed < 0.0f) { - fly->speed = 0.0f; - } - else { - fly->speed += fly->grid * time_wheel * (fly->use_precision ? 0.1f : 1.0f); - } - break; - } - case FLY_MODAL_DECELERATE: - { - double time_currwheel; - float time_wheel; - - /* not quite correct but avoids confusion WASD/arrow keys 'locking up' */ - if (fly->axis == -1) { - fly->axis = 2; - fly->speed = -fabsf(fly->speed); - } - - time_currwheel = PIL_check_seconds_timer(); - time_wheel = (float)(time_currwheel - fly->time_lastwheel); - fly->time_lastwheel = time_currwheel; - /* 0-0.5 -> 0-5.0 */ - time_wheel = 1.0f + (10.0f - (20.0f * min_ff(time_wheel, 0.5f))); - - if (fly->speed > 0.0f) { - fly->speed = 0; - } - else { - fly->speed -= fly->grid * time_wheel * (fly->use_precision ? 0.1f : 1.0f); - } - break; - } - case FLY_MODAL_PAN_ENABLE: - fly->pan_view = true; - break; - case FLY_MODAL_PAN_DISABLE: - fly->pan_view = false; - break; - - /* implement WASD keys, - * comments only for 'forward '*/ - case FLY_MODAL_DIR_FORWARD: - if (fly->axis == 2 && fly->speed < 0.0f) { - /* reverse direction stops, tap again to continue */ - fly->axis = -1; - } - else { - /* flip speed rather than stopping, game like motion, - * else increase like mousewheel if were already moving in that direction */ - if (fly->speed < 0.0f) { - fly->speed = -fly->speed; - } - else if (fly->axis == 2) { - fly->speed += fly->grid; - } - fly->axis = 2; - } - break; - case FLY_MODAL_DIR_BACKWARD: - if (fly->axis == 2 && fly->speed > 0.0f) { - fly->axis = -1; - } - else { - if (fly->speed > 0.0f) { - fly->speed = -fly->speed; - } - else if (fly->axis == 2) { - fly->speed -= fly->grid; - } - - fly->axis = 2; - } - break; - case FLY_MODAL_DIR_LEFT: - if (fly->axis == 0 && fly->speed < 0.0f) { - fly->axis = -1; - } - else { - if (fly->speed < 0.0f) { - fly->speed = -fly->speed; - } - else if (fly->axis == 0) { - fly->speed += fly->grid; - } - - fly->axis = 0; - } - break; - case FLY_MODAL_DIR_RIGHT: - if (fly->axis == 0 && fly->speed > 0.0f) { - fly->axis = -1; - } - else { - if (fly->speed > 0.0f) { - fly->speed = -fly->speed; - } - else if (fly->axis == 0) { - fly->speed -= fly->grid; - } - - fly->axis = 0; - } - break; - case FLY_MODAL_DIR_DOWN: - if (fly->axis == 1 && fly->speed < 0.0f) { - fly->axis = -1; - } - else { - if (fly->speed < 0.0f) { - fly->speed = -fly->speed; - } - else if (fly->axis == 1) { - fly->speed += fly->grid; - } - fly->axis = 1; - } - break; - case FLY_MODAL_DIR_UP: - if (fly->axis == 1 && fly->speed > 0.0f) { - fly->axis = -1; - } - else { - if (fly->speed > 0.0f) { - fly->speed = -fly->speed; - } - else if (fly->axis == 1) { - fly->speed -= fly->grid; - } - fly->axis = 1; - } - break; - - case FLY_MODAL_AXIS_LOCK_X: - if (fly->xlock != FLY_AXISLOCK_STATE_OFF) { - fly->xlock = FLY_AXISLOCK_STATE_OFF; - } - else { - fly->xlock = FLY_AXISLOCK_STATE_ACTIVE; - fly->xlock_momentum = 0.0; - } - fly_update_header(C, op, fly); - break; - case FLY_MODAL_AXIS_LOCK_Z: - if (fly->zlock != FLY_AXISLOCK_STATE_OFF) { - fly->zlock = FLY_AXISLOCK_STATE_OFF; - } - else { - fly->zlock = FLY_AXISLOCK_STATE_ACTIVE; - fly->zlock_momentum = 0.0; - } - fly_update_header(C, op, fly); - break; - - case FLY_MODAL_PRECISION_ENABLE: - fly->use_precision = true; - break; - case FLY_MODAL_PRECISION_DISABLE: - fly->use_precision = false; - break; - - case FLY_MODAL_FREELOOK_ENABLE: - fly->use_freelook = true; - break; - case FLY_MODAL_FREELOOK_DISABLE: - fly->use_freelook = false; - break; - } - } + /* handle modal keymap first */ + else if (event->type == EVT_MODAL_MAP) { + switch (event->val) { + case FLY_MODAL_CANCEL: + fly->state = FLY_CANCEL; + break; + case FLY_MODAL_CONFIRM: + fly->state = FLY_CONFIRM; + break; + + /* speed adjusting with mousepan (trackpad) */ + case FLY_MODAL_SPEED: { + float fac = 0.02f * (event->prevy - event->y); + + /* allowing to brake immediate */ + if (fac > 0.0f && fly->speed < 0.0f) { + fly->speed = 0.0f; + } + else if (fac < 0.0f && fly->speed > 0.0f) { + fly->speed = 0.0f; + } + else { + fly->speed += fly->grid * fac; + } + + break; + } + case FLY_MODAL_ACCELERATE: { + double time_currwheel; + float time_wheel; + + /* not quite correct but avoids confusion WASD/arrow keys 'locking up' */ + if (fly->axis == -1) { + fly->axis = 2; + fly->speed = fabsf(fly->speed); + } + + time_currwheel = PIL_check_seconds_timer(); + time_wheel = (float)(time_currwheel - fly->time_lastwheel); + fly->time_lastwheel = time_currwheel; + /* Mouse wheel delays range from (0.5 == slow) to (0.01 == fast) */ + /* 0-0.5 -> 0-5.0 */ + time_wheel = 1.0f + (10.0f - (20.0f * min_ff(time_wheel, 0.5f))); + + if (fly->speed < 0.0f) { + fly->speed = 0.0f; + } + else { + fly->speed += fly->grid * time_wheel * (fly->use_precision ? 0.1f : 1.0f); + } + break; + } + case FLY_MODAL_DECELERATE: { + double time_currwheel; + float time_wheel; + + /* not quite correct but avoids confusion WASD/arrow keys 'locking up' */ + if (fly->axis == -1) { + fly->axis = 2; + fly->speed = -fabsf(fly->speed); + } + + time_currwheel = PIL_check_seconds_timer(); + time_wheel = (float)(time_currwheel - fly->time_lastwheel); + fly->time_lastwheel = time_currwheel; + /* 0-0.5 -> 0-5.0 */ + time_wheel = 1.0f + (10.0f - (20.0f * min_ff(time_wheel, 0.5f))); + + if (fly->speed > 0.0f) { + fly->speed = 0; + } + else { + fly->speed -= fly->grid * time_wheel * (fly->use_precision ? 0.1f : 1.0f); + } + break; + } + case FLY_MODAL_PAN_ENABLE: + fly->pan_view = true; + break; + case FLY_MODAL_PAN_DISABLE: + fly->pan_view = false; + break; + + /* implement WASD keys, + * comments only for 'forward '*/ + case FLY_MODAL_DIR_FORWARD: + if (fly->axis == 2 && fly->speed < 0.0f) { + /* reverse direction stops, tap again to continue */ + fly->axis = -1; + } + else { + /* flip speed rather than stopping, game like motion, + * else increase like mousewheel if were already moving in that direction */ + if (fly->speed < 0.0f) { + fly->speed = -fly->speed; + } + else if (fly->axis == 2) { + fly->speed += fly->grid; + } + fly->axis = 2; + } + break; + case FLY_MODAL_DIR_BACKWARD: + if (fly->axis == 2 && fly->speed > 0.0f) { + fly->axis = -1; + } + else { + if (fly->speed > 0.0f) { + fly->speed = -fly->speed; + } + else if (fly->axis == 2) { + fly->speed -= fly->grid; + } + + fly->axis = 2; + } + break; + case FLY_MODAL_DIR_LEFT: + if (fly->axis == 0 && fly->speed < 0.0f) { + fly->axis = -1; + } + else { + if (fly->speed < 0.0f) { + fly->speed = -fly->speed; + } + else if (fly->axis == 0) { + fly->speed += fly->grid; + } + + fly->axis = 0; + } + break; + case FLY_MODAL_DIR_RIGHT: + if (fly->axis == 0 && fly->speed > 0.0f) { + fly->axis = -1; + } + else { + if (fly->speed > 0.0f) { + fly->speed = -fly->speed; + } + else if (fly->axis == 0) { + fly->speed -= fly->grid; + } + + fly->axis = 0; + } + break; + case FLY_MODAL_DIR_DOWN: + if (fly->axis == 1 && fly->speed < 0.0f) { + fly->axis = -1; + } + else { + if (fly->speed < 0.0f) { + fly->speed = -fly->speed; + } + else if (fly->axis == 1) { + fly->speed += fly->grid; + } + fly->axis = 1; + } + break; + case FLY_MODAL_DIR_UP: + if (fly->axis == 1 && fly->speed > 0.0f) { + fly->axis = -1; + } + else { + if (fly->speed > 0.0f) { + fly->speed = -fly->speed; + } + else if (fly->axis == 1) { + fly->speed -= fly->grid; + } + fly->axis = 1; + } + break; + + case FLY_MODAL_AXIS_LOCK_X: + if (fly->xlock != FLY_AXISLOCK_STATE_OFF) { + fly->xlock = FLY_AXISLOCK_STATE_OFF; + } + else { + fly->xlock = FLY_AXISLOCK_STATE_ACTIVE; + fly->xlock_momentum = 0.0; + } + fly_update_header(C, op, fly); + break; + case FLY_MODAL_AXIS_LOCK_Z: + if (fly->zlock != FLY_AXISLOCK_STATE_OFF) { + fly->zlock = FLY_AXISLOCK_STATE_OFF; + } + else { + fly->zlock = FLY_AXISLOCK_STATE_ACTIVE; + fly->zlock_momentum = 0.0; + } + fly_update_header(C, op, fly); + break; + + case FLY_MODAL_PRECISION_ENABLE: + fly->use_precision = true; + break; + case FLY_MODAL_PRECISION_DISABLE: + fly->use_precision = false; + break; + + case FLY_MODAL_FREELOOK_ENABLE: + fly->use_freelook = true; + break; + case FLY_MODAL_FREELOOK_DISABLE: + fly->use_freelook = false; + break; + } + } } -static void flyMoveCamera(bContext *C, FlyInfo *fly, - const bool do_rotate, const bool do_translate) +static void flyMoveCamera(bContext *C, FlyInfo *fly, const bool do_rotate, const bool do_translate) { - ED_view3d_cameracontrol_update(fly->v3d_camera_control, true, C, do_rotate, do_translate); + ED_view3d_cameracontrol_update(fly->v3d_camera_control, true, C, do_rotate, do_translate); } static int flyApply(bContext *C, FlyInfo *fly) { -#define FLY_ROTATE_FAC 10.0f /* more is faster */ -#define FLY_ZUP_CORRECT_FAC 0.1f /* amount to correct per step */ +#define FLY_ROTATE_FAC 10.0f /* more is faster */ +#define FLY_ZUP_CORRECT_FAC 0.1f /* amount to correct per step */ #define FLY_ZUP_CORRECT_ACCEL 0.05f /* increase upright momentum each step */ -#define FLY_SMOOTH_FAC 20.0f /* higher value less lag */ +#define FLY_SMOOTH_FAC 20.0f /* higher value less lag */ - /* fly mode - Shift+F - * a fly loop where the user can move move the view as if they are flying - */ - RegionView3D *rv3d = fly->rv3d; + /* fly mode - Shift+F + * a fly loop where the user can move move the view as if they are flying + */ + RegionView3D *rv3d = fly->rv3d; - /* 3x3 copy of the view matrix so we can move along the view axis */ - float mat[3][3]; - /* this is the direction that's added to the view offset per redraw */ - float dvec[3] = {0, 0, 0}; + /* 3x3 copy of the view matrix so we can move along the view axis */ + float mat[3][3]; + /* this is the direction that's added to the view offset per redraw */ + float dvec[3] = {0, 0, 0}; - /* Camera Uprighting variables */ - float moffset[2]; /* mouse offset from the views center */ - float tmp_quat[4]; /* used for rotating the view */ + /* Camera Uprighting variables */ + float moffset[2]; /* mouse offset from the views center */ + float tmp_quat[4]; /* used for rotating the view */ - /* x and y margin are define the safe area where the mouses movement wont rotate the view */ - int xmargin, ymargin; + /* x and y margin are define the safe area where the mouses movement wont rotate the view */ + int xmargin, ymargin; #ifdef NDOF_FLY_DEBUG - { - static uint iteration = 1; - printf("fly timer %d\n", iteration++); - } + { + static uint iteration = 1; + printf("fly timer %d\n", iteration++); + } #endif - xmargin = fly->width / 20.0f; - ymargin = fly->height / 20.0f; - - { - - /* mouse offset from the center */ - moffset[0] = fly->mval[0] - fly->center_mval[0]; - moffset[1] = fly->mval[1] - fly->center_mval[1]; - - /* enforce a view margin */ - if (moffset[0] > xmargin) { - moffset[0] -= xmargin; - } - else if (moffset[0] < -xmargin) { - moffset[0] += xmargin; - } - else { - moffset[0] = 0; - } - - if (moffset[1] > ymargin) { - moffset[1] -= ymargin; - } - else if (moffset[1] < -ymargin) { - moffset[1] += ymargin; - } - else { - moffset[1] = 0; - } - - - /* scale the mouse movement by this value - scales mouse movement to the view size - * moffset[0] / (ar->winx-xmargin * 2) - window size minus margin (same for y) - * - * the mouse moves isn't linear */ - - if (moffset[0]) { - moffset[0] /= fly->width - (xmargin * 2); - moffset[0] *= fabsf(moffset[0]); - } - - if (moffset[1]) { - moffset[1] /= fly->height - (ymargin * 2); - moffset[1] *= fabsf(moffset[1]); - } - - /* Should we redraw? */ - if ((fly->speed != 0.0f) || - moffset[0] || moffset[1] || - (fly->zlock != FLY_AXISLOCK_STATE_OFF) || - (fly->xlock != FLY_AXISLOCK_STATE_OFF) || - dvec[0] || dvec[1] || dvec[2]) - { - float dvec_tmp[3]; - - /* time how fast it takes for us to redraw, - * this is so simple scenes don't fly too fast */ - double time_current; - float time_redraw; - float time_redraw_clamped; + xmargin = fly->width / 20.0f; + ymargin = fly->height / 20.0f; + + { + + /* mouse offset from the center */ + moffset[0] = fly->mval[0] - fly->center_mval[0]; + moffset[1] = fly->mval[1] - fly->center_mval[1]; + + /* enforce a view margin */ + if (moffset[0] > xmargin) { + moffset[0] -= xmargin; + } + else if (moffset[0] < -xmargin) { + moffset[0] += xmargin; + } + else { + moffset[0] = 0; + } + + if (moffset[1] > ymargin) { + moffset[1] -= ymargin; + } + else if (moffset[1] < -ymargin) { + moffset[1] += ymargin; + } + else { + moffset[1] = 0; + } + + /* scale the mouse movement by this value - scales mouse movement to the view size + * moffset[0] / (ar->winx-xmargin * 2) - window size minus margin (same for y) + * + * the mouse moves isn't linear */ + + if (moffset[0]) { + moffset[0] /= fly->width - (xmargin * 2); + moffset[0] *= fabsf(moffset[0]); + } + + if (moffset[1]) { + moffset[1] /= fly->height - (ymargin * 2); + moffset[1] *= fabsf(moffset[1]); + } + + /* Should we redraw? */ + if ((fly->speed != 0.0f) || moffset[0] || moffset[1] || + (fly->zlock != FLY_AXISLOCK_STATE_OFF) || (fly->xlock != FLY_AXISLOCK_STATE_OFF) || + dvec[0] || dvec[1] || dvec[2]) { + float dvec_tmp[3]; + + /* time how fast it takes for us to redraw, + * this is so simple scenes don't fly too fast */ + double time_current; + float time_redraw; + float time_redraw_clamped; #ifdef NDOF_FLY_DRAW_TOOMUCH - fly->redraw = 1; + fly->redraw = 1; #endif - time_current = PIL_check_seconds_timer(); - time_redraw = (float)(time_current - fly->time_lastdraw); - - /* clamp redraw time to avoid jitter in roll correction */ - time_redraw_clamped = min_ff(0.05f, time_redraw); - - fly->time_lastdraw = time_current; - - /* Scale the time to use shift to scale the speed down- just like - * shift slows many other areas of blender down */ - if (fly->use_precision) { - fly->speed = fly->speed * (1.0f - time_redraw_clamped); - } - - copy_m3_m4(mat, rv3d->viewinv); - - if (fly->pan_view == true) { - /* pan only */ - copy_v3_fl3(dvec_tmp, -moffset[0], -moffset[1], 0.0f); - - if (fly->use_precision) { - dvec_tmp[0] *= 0.1f; - dvec_tmp[1] *= 0.1f; - } - - mul_m3_v3(mat, dvec_tmp); - mul_v3_fl(dvec_tmp, time_redraw * 200.0f * fly->grid); - } - else { - float roll; /* similar to the angle between the camera's up and the Z-up, - * but its very rough so just roll */ - - /* rotate about the X axis- look up/down */ - if (moffset[1]) { - float upvec[3]; - copy_v3_fl3(upvec, 1.0f, 0.0f, 0.0f); - mul_m3_v3(mat, upvec); - /* Rotate about the relative up vec */ - axis_angle_to_quat(tmp_quat, upvec, moffset[1] * time_redraw * -FLY_ROTATE_FAC); - mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat); - - if (fly->xlock != FLY_AXISLOCK_STATE_OFF) { - fly->xlock = FLY_AXISLOCK_STATE_ACTIVE; /* check for rotation */ - } - if (fly->zlock != FLY_AXISLOCK_STATE_OFF) { - fly->zlock = FLY_AXISLOCK_STATE_ACTIVE; - } - fly->xlock_momentum = 0.0f; - } - - /* rotate about the Y axis- look left/right */ - if (moffset[0]) { - float upvec[3]; - /* if we're upside down invert the moffset */ - copy_v3_fl3(upvec, 0.0f, 1.0f, 0.0f); - mul_m3_v3(mat, upvec); - - if (upvec[2] < 0.0f) { - moffset[0] = -moffset[0]; - } - - /* make the lock vectors */ - if (fly->zlock) { - copy_v3_fl3(upvec, 0.0f, 0.0f, 1.0f); - } - else { - copy_v3_fl3(upvec, 0.0f, 1.0f, 0.0f); - mul_m3_v3(mat, upvec); - } - - /* Rotate about the relative up vec */ - axis_angle_to_quat(tmp_quat, upvec, moffset[0] * time_redraw * FLY_ROTATE_FAC); - mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat); - - if (fly->xlock != FLY_AXISLOCK_STATE_OFF) { - fly->xlock = FLY_AXISLOCK_STATE_ACTIVE; /* check for rotation */ - } - if (fly->zlock != FLY_AXISLOCK_STATE_OFF) { - fly->zlock = FLY_AXISLOCK_STATE_ACTIVE; - } - } - - if (fly->zlock == FLY_AXISLOCK_STATE_ACTIVE) { - float upvec[3]; - copy_v3_fl3(upvec, 1.0f, 0.0f, 0.0f); - mul_m3_v3(mat, upvec); - - /* make sure we have some z rolling */ - if (fabsf(upvec[2]) > 0.00001f) { - roll = upvec[2] * 5.0f; - /* rotate the view about this axis */ - copy_v3_fl3(upvec, 0.0f, 0.0f, 1.0f); - mul_m3_v3(mat, upvec); - /* Rotate about the relative up vec */ - axis_angle_to_quat(tmp_quat, upvec, - roll * time_redraw_clamped * fly->zlock_momentum * FLY_ZUP_CORRECT_FAC); - mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat); - - fly->zlock_momentum += FLY_ZUP_CORRECT_ACCEL; - } - else { - /* don't check until the view rotates again */ - fly->zlock = FLY_AXISLOCK_STATE_IDLE; - fly->zlock_momentum = 0.0f; - } - } - - /* only apply xcorrect when mouse isn't applying x rot */ - if (fly->xlock == FLY_AXISLOCK_STATE_ACTIVE && moffset[1] == 0) { - float upvec[3]; - copy_v3_fl3(upvec, 0.0f, 0.0f, 1.0f); - mul_m3_v3(mat, upvec); - /* make sure we have some z rolling */ - if (fabsf(upvec[2]) > 0.00001f) { - roll = upvec[2] * -5.0f; - /* rotate the view about this axis */ - copy_v3_fl3(upvec, 1.0f, 0.0f, 0.0f); - mul_m3_v3(mat, upvec); - - /* Rotate about the relative up vec */ - axis_angle_to_quat(tmp_quat, upvec, roll * time_redraw_clamped * fly->xlock_momentum * 0.1f); - mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat); - - fly->xlock_momentum += 0.05f; - } - else { - fly->xlock = FLY_AXISLOCK_STATE_IDLE; /* see above */ - fly->xlock_momentum = 0.0f; - } - } - - if (fly->axis == -1) { - /* pause */ - zero_v3(dvec_tmp); - } - else if (!fly->use_freelook) { - /* Normal operation */ - /* define dvec, view direction vector */ - zero_v3(dvec_tmp); - /* move along the current axis */ - dvec_tmp[fly->axis] = 1.0f; - - mul_m3_v3(mat, dvec_tmp); - } - else { - normalize_v3_v3(dvec_tmp, fly->dvec_prev); - if (fly->speed < 0.0f) { - negate_v3(dvec_tmp); - } - } - - mul_v3_fl(dvec_tmp, fly->speed * time_redraw * 0.25f); - } - - /* impose a directional lag */ - interp_v3_v3v3(dvec, dvec_tmp, fly->dvec_prev, (1.0f / (1.0f + (time_redraw * FLY_SMOOTH_FAC)))); - - if (rv3d->persp == RV3D_CAMOB) { - Object *lock_ob = ED_view3d_cameracontrol_object_get(fly->v3d_camera_control); - if (lock_ob->protectflag & OB_LOCK_LOCX) { - dvec[0] = 0.0; - } - if (lock_ob->protectflag & OB_LOCK_LOCY) { - dvec[1] = 0.0; - } - if (lock_ob->protectflag & OB_LOCK_LOCZ) { - dvec[2] = 0.0; - } - } - - add_v3_v3(rv3d->ofs, dvec); - - if (rv3d->persp == RV3D_CAMOB) { - const bool do_rotate = ((fly->xlock != FLY_AXISLOCK_STATE_OFF) || - (fly->zlock != FLY_AXISLOCK_STATE_OFF) || - ((moffset[0] || moffset[1]) && !fly->pan_view)); - const bool do_translate = (fly->speed != 0.0f || fly->pan_view); - flyMoveCamera(C, fly, do_rotate, do_translate); - } - - } - else { - /* we're not redrawing but we need to update the time else the view will jump */ - fly->time_lastdraw = PIL_check_seconds_timer(); - } - /* end drawing */ - copy_v3_v3(fly->dvec_prev, dvec); - } - - return OPERATOR_FINISHED; + time_current = PIL_check_seconds_timer(); + time_redraw = (float)(time_current - fly->time_lastdraw); + + /* clamp redraw time to avoid jitter in roll correction */ + time_redraw_clamped = min_ff(0.05f, time_redraw); + + fly->time_lastdraw = time_current; + + /* Scale the time to use shift to scale the speed down- just like + * shift slows many other areas of blender down */ + if (fly->use_precision) { + fly->speed = fly->speed * (1.0f - time_redraw_clamped); + } + + copy_m3_m4(mat, rv3d->viewinv); + + if (fly->pan_view == true) { + /* pan only */ + copy_v3_fl3(dvec_tmp, -moffset[0], -moffset[1], 0.0f); + + if (fly->use_precision) { + dvec_tmp[0] *= 0.1f; + dvec_tmp[1] *= 0.1f; + } + + mul_m3_v3(mat, dvec_tmp); + mul_v3_fl(dvec_tmp, time_redraw * 200.0f * fly->grid); + } + else { + float roll; /* similar to the angle between the camera's up and the Z-up, + * but its very rough so just roll */ + + /* rotate about the X axis- look up/down */ + if (moffset[1]) { + float upvec[3]; + copy_v3_fl3(upvec, 1.0f, 0.0f, 0.0f); + mul_m3_v3(mat, upvec); + /* Rotate about the relative up vec */ + axis_angle_to_quat(tmp_quat, upvec, moffset[1] * time_redraw * -FLY_ROTATE_FAC); + mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat); + + if (fly->xlock != FLY_AXISLOCK_STATE_OFF) { + fly->xlock = FLY_AXISLOCK_STATE_ACTIVE; /* check for rotation */ + } + if (fly->zlock != FLY_AXISLOCK_STATE_OFF) { + fly->zlock = FLY_AXISLOCK_STATE_ACTIVE; + } + fly->xlock_momentum = 0.0f; + } + + /* rotate about the Y axis- look left/right */ + if (moffset[0]) { + float upvec[3]; + /* if we're upside down invert the moffset */ + copy_v3_fl3(upvec, 0.0f, 1.0f, 0.0f); + mul_m3_v3(mat, upvec); + + if (upvec[2] < 0.0f) { + moffset[0] = -moffset[0]; + } + + /* make the lock vectors */ + if (fly->zlock) { + copy_v3_fl3(upvec, 0.0f, 0.0f, 1.0f); + } + else { + copy_v3_fl3(upvec, 0.0f, 1.0f, 0.0f); + mul_m3_v3(mat, upvec); + } + + /* Rotate about the relative up vec */ + axis_angle_to_quat(tmp_quat, upvec, moffset[0] * time_redraw * FLY_ROTATE_FAC); + mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat); + + if (fly->xlock != FLY_AXISLOCK_STATE_OFF) { + fly->xlock = FLY_AXISLOCK_STATE_ACTIVE; /* check for rotation */ + } + if (fly->zlock != FLY_AXISLOCK_STATE_OFF) { + fly->zlock = FLY_AXISLOCK_STATE_ACTIVE; + } + } + + if (fly->zlock == FLY_AXISLOCK_STATE_ACTIVE) { + float upvec[3]; + copy_v3_fl3(upvec, 1.0f, 0.0f, 0.0f); + mul_m3_v3(mat, upvec); + + /* make sure we have some z rolling */ + if (fabsf(upvec[2]) > 0.00001f) { + roll = upvec[2] * 5.0f; + /* rotate the view about this axis */ + copy_v3_fl3(upvec, 0.0f, 0.0f, 1.0f); + mul_m3_v3(mat, upvec); + /* Rotate about the relative up vec */ + axis_angle_to_quat(tmp_quat, + upvec, + roll * time_redraw_clamped * fly->zlock_momentum * + FLY_ZUP_CORRECT_FAC); + mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat); + + fly->zlock_momentum += FLY_ZUP_CORRECT_ACCEL; + } + else { + /* don't check until the view rotates again */ + fly->zlock = FLY_AXISLOCK_STATE_IDLE; + fly->zlock_momentum = 0.0f; + } + } + + /* only apply xcorrect when mouse isn't applying x rot */ + if (fly->xlock == FLY_AXISLOCK_STATE_ACTIVE && moffset[1] == 0) { + float upvec[3]; + copy_v3_fl3(upvec, 0.0f, 0.0f, 1.0f); + mul_m3_v3(mat, upvec); + /* make sure we have some z rolling */ + if (fabsf(upvec[2]) > 0.00001f) { + roll = upvec[2] * -5.0f; + /* rotate the view about this axis */ + copy_v3_fl3(upvec, 1.0f, 0.0f, 0.0f); + mul_m3_v3(mat, upvec); + + /* Rotate about the relative up vec */ + axis_angle_to_quat( + tmp_quat, upvec, roll * time_redraw_clamped * fly->xlock_momentum * 0.1f); + mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat); + + fly->xlock_momentum += 0.05f; + } + else { + fly->xlock = FLY_AXISLOCK_STATE_IDLE; /* see above */ + fly->xlock_momentum = 0.0f; + } + } + + if (fly->axis == -1) { + /* pause */ + zero_v3(dvec_tmp); + } + else if (!fly->use_freelook) { + /* Normal operation */ + /* define dvec, view direction vector */ + zero_v3(dvec_tmp); + /* move along the current axis */ + dvec_tmp[fly->axis] = 1.0f; + + mul_m3_v3(mat, dvec_tmp); + } + else { + normalize_v3_v3(dvec_tmp, fly->dvec_prev); + if (fly->speed < 0.0f) { + negate_v3(dvec_tmp); + } + } + + mul_v3_fl(dvec_tmp, fly->speed * time_redraw * 0.25f); + } + + /* impose a directional lag */ + interp_v3_v3v3( + dvec, dvec_tmp, fly->dvec_prev, (1.0f / (1.0f + (time_redraw * FLY_SMOOTH_FAC)))); + + if (rv3d->persp == RV3D_CAMOB) { + Object *lock_ob = ED_view3d_cameracontrol_object_get(fly->v3d_camera_control); + if (lock_ob->protectflag & OB_LOCK_LOCX) { + dvec[0] = 0.0; + } + if (lock_ob->protectflag & OB_LOCK_LOCY) { + dvec[1] = 0.0; + } + if (lock_ob->protectflag & OB_LOCK_LOCZ) { + dvec[2] = 0.0; + } + } + + add_v3_v3(rv3d->ofs, dvec); + + if (rv3d->persp == RV3D_CAMOB) { + const bool do_rotate = ((fly->xlock != FLY_AXISLOCK_STATE_OFF) || + (fly->zlock != FLY_AXISLOCK_STATE_OFF) || + ((moffset[0] || moffset[1]) && !fly->pan_view)); + const bool do_translate = (fly->speed != 0.0f || fly->pan_view); + flyMoveCamera(C, fly, do_rotate, do_translate); + } + } + else { + /* we're not redrawing but we need to update the time else the view will jump */ + fly->time_lastdraw = PIL_check_seconds_timer(); + } + /* end drawing */ + copy_v3_v3(fly->dvec_prev, dvec); + } + + return OPERATOR_FINISHED; } #ifdef WITH_INPUT_NDOF static void flyApply_ndof(bContext *C, FlyInfo *fly) { - Object *lock_ob = ED_view3d_cameracontrol_object_get(fly->v3d_camera_control); - bool has_translate, has_rotate; - - view3d_ndof_fly(fly->ndof, - fly->v3d, fly->rv3d, - fly->use_precision, lock_ob ? lock_ob->protectflag : 0, - &has_translate, &has_rotate); - - if (has_translate || has_rotate) { - fly->redraw = true; - - if (fly->rv3d->persp == RV3D_CAMOB) { - flyMoveCamera(C, fly, has_rotate, has_translate); - } - } + Object *lock_ob = ED_view3d_cameracontrol_object_get(fly->v3d_camera_control); + bool has_translate, has_rotate; + + view3d_ndof_fly(fly->ndof, + fly->v3d, + fly->rv3d, + fly->use_precision, + lock_ob ? lock_ob->protectflag : 0, + &has_translate, + &has_rotate); + + if (has_translate || has_rotate) { + fly->redraw = true; + + if (fly->rv3d->persp == RV3D_CAMOB) { + flyMoveCamera(C, fly, has_rotate, has_translate); + } + } } #endif /* WITH_INPUT_NDOF */ static int fly_invoke(bContext *C, wmOperator *op, const wmEvent *event) { - RegionView3D *rv3d = CTX_wm_region_view3d(C); - FlyInfo *fly; + RegionView3D *rv3d = CTX_wm_region_view3d(C); + FlyInfo *fly; - if (rv3d->viewlock & RV3D_LOCKED) { - return OPERATOR_CANCELLED; - } + if (rv3d->viewlock & RV3D_LOCKED) { + return OPERATOR_CANCELLED; + } - fly = MEM_callocN(sizeof(FlyInfo), "FlyOperation"); + fly = MEM_callocN(sizeof(FlyInfo), "FlyOperation"); - op->customdata = fly; + op->customdata = fly; - if (initFlyInfo(C, fly, op, event) == false) { - MEM_freeN(op->customdata); - return OPERATOR_CANCELLED; - } + if (initFlyInfo(C, fly, op, event) == false) { + MEM_freeN(op->customdata); + return OPERATOR_CANCELLED; + } - flyEvent(C, op, fly, event); + flyEvent(C, op, fly, event); - WM_event_add_modal_handler(C, op); + WM_event_add_modal_handler(C, op); - return OPERATOR_RUNNING_MODAL; + return OPERATOR_RUNNING_MODAL; } static void fly_cancel(bContext *C, wmOperator *op) { - FlyInfo *fly = op->customdata; + FlyInfo *fly = op->customdata; - fly->state = FLY_CANCEL; - flyEnd(C, fly); - op->customdata = NULL; + fly->state = FLY_CANCEL; + flyEnd(C, fly); + op->customdata = NULL; } static int fly_modal(bContext *C, wmOperator *op, const wmEvent *event) { - int exit_code; - bool do_draw = false; - FlyInfo *fly = op->customdata; - RegionView3D *rv3d = fly->rv3d; - Object *fly_object = ED_view3d_cameracontrol_object_get(fly->v3d_camera_control); + int exit_code; + bool do_draw = false; + FlyInfo *fly = op->customdata; + RegionView3D *rv3d = fly->rv3d; + Object *fly_object = ED_view3d_cameracontrol_object_get(fly->v3d_camera_control); - fly->redraw = 0; + fly->redraw = 0; - flyEvent(C, op, fly, event); + flyEvent(C, op, fly, event); #ifdef WITH_INPUT_NDOF - if (fly->ndof) { /* 3D mouse overrules [2D mouse + timer] */ - if (event->type == NDOF_MOTION) { - flyApply_ndof(C, fly); - } - } - else + if (fly->ndof) { /* 3D mouse overrules [2D mouse + timer] */ + if (event->type == NDOF_MOTION) { + flyApply_ndof(C, fly); + } + } + else #endif /* WITH_INPUT_NDOF */ - if (event->type == TIMER && event->customdata == fly->timer) { - flyApply(C, fly); - } + if (event->type == TIMER && event->customdata == fly->timer) { + flyApply(C, fly); + } - do_draw |= fly->redraw; + do_draw |= fly->redraw; - exit_code = flyEnd(C, fly); + exit_code = flyEnd(C, fly); - if (exit_code != OPERATOR_RUNNING_MODAL) { - do_draw = true; - } + if (exit_code != OPERATOR_RUNNING_MODAL) { + do_draw = true; + } - if (do_draw) { - if (rv3d->persp == RV3D_CAMOB) { - WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, fly_object); - } + if (do_draw) { + if (rv3d->persp == RV3D_CAMOB) { + WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, fly_object); + } - // puts("redraw!"); // too frequent, commented with NDOF_FLY_DRAW_TOOMUCH for now - ED_region_tag_redraw(CTX_wm_region(C)); - } + // puts("redraw!"); // too frequent, commented with NDOF_FLY_DRAW_TOOMUCH for now + ED_region_tag_redraw(CTX_wm_region(C)); + } - if (ELEM(exit_code, OPERATOR_FINISHED, OPERATOR_CANCELLED)) { - ED_workspace_status_text(C, NULL); - } + if (ELEM(exit_code, OPERATOR_FINISHED, OPERATOR_CANCELLED)) { + ED_workspace_status_text(C, NULL); + } - return exit_code; + return exit_code; } void VIEW3D_OT_fly(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Fly Navigation"; - ot->description = "Interactively fly around the scene"; - ot->idname = "VIEW3D_OT_fly"; - - /* api callbacks */ - ot->invoke = fly_invoke; - ot->cancel = fly_cancel; - ot->modal = fly_modal; - ot->poll = ED_operator_region_view3d_active; - - /* flags */ - ot->flag = OPTYPE_BLOCKING; + /* identifiers */ + ot->name = "Fly Navigation"; + ot->description = "Interactively fly around the scene"; + ot->idname = "VIEW3D_OT_fly"; + + /* api callbacks */ + ot->invoke = fly_invoke; + ot->cancel = fly_cancel; + ot->modal = fly_modal; + ot->poll = ED_operator_region_view3d_active; + + /* flags */ + ot->flag = OPTYPE_BLOCKING; } |