Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/space_view3d/view3d_fly.c')
-rw-r--r--source/blender/editors/space_view3d/view3d_fly.c67
1 files changed, 47 insertions, 20 deletions
diff --git a/source/blender/editors/space_view3d/view3d_fly.c b/source/blender/editors/space_view3d/view3d_fly.c
index a1ba6d280cc..5f8962a4e90 100644
--- a/source/blender/editors/space_view3d/view3d_fly.c
+++ b/source/blender/editors/space_view3d/view3d_fly.c
@@ -34,6 +34,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
+#include "BLI_blenlib.h"
#include "BKE_context.h"
#include "BKE_report.h"
@@ -187,6 +188,8 @@ typedef struct FlyInfo {
bool use_freelook;
int mval[2]; /* latest 2D mouse values */
+ int center_mval[2]; /* center mouse values */
+ float width, height; /* camera viewport dimensions */
wmNDOFMotionData *ndof; /* latest 3D mouse values */
/* fly state state */
@@ -214,15 +217,27 @@ typedef struct 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;
+
+ if (fly->scene->camera) {
+ ED_view3d_calc_camera_border(fly->scene, 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 */
- float x1, x2, y1, y2;
- x1 = 0.45f * (float)fly->ar->winx;
- y1 = 0.45f * (float)fly->ar->winy;
- x2 = 0.55f * (float)fly->ar->winx;
- y2 = 0.55f * (float)fly->ar->winy;
+ x1 = xoff + 0.45f * fly->width;
+ y1 = yoff + 0.45f * fly->height;
+ x2 = xoff + 0.55f * fly->width;
+ y2 = yoff + 0.55f * fly->height;
cpack(0);
glBegin(GL_LINES);
@@ -266,6 +281,8 @@ enum {
static bool initFlyInfo(bContext *C, FlyInfo *fly, wmOperator *op, const wmEvent *event)
{
wmWindow *win = CTX_wm_window(C);
+ rctf viewborder;
+
float upvec[3]; /* tmp */
float mat[3][3];
@@ -338,8 +355,26 @@ static bool initFlyInfo(bContext *C, FlyInfo *fly, wmOperator *op, const wmEvent
fly->scene, fly->v3d, fly->rv3d,
(U.uiflag & USER_CAM_LOCK_NO_PARENT) == 0);
+ /* calculate center */
+ if (fly->scene->camera) {
+ ED_view3d_calc_camera_border(fly->scene, 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->ar->winx / 2, fly->ar->winrct.ymin + fly->ar->winy / 2);
+ WM_cursor_warp(win, fly->ar->winrct.xmin + fly->center_mval[0], fly->ar->winrct.ymin + fly->center_mval[1]);
return 1;
}
@@ -509,7 +544,6 @@ static void flyEvent(FlyInfo *fly, const wmEvent *event)
fly->pan_view = true;
break;
case FLY_MODAL_PAN_DISABLE:
-//XXX2.5 WM_cursor_warp(CTX_wm_window(C), cent_orig[0], cent_orig[1]);
fly->pan_view = false;
break;
@@ -632,7 +666,6 @@ static int flyApply(bContext *C, FlyInfo *fly)
* a fly loop where the user can move move the view as if they are flying
*/
RegionView3D *rv3d = fly->rv3d;
- ARegion *ar = fly->ar;
float mat[3][3]; /* 3x3 copy of the view matrix so we can move along the view axis */
float dvec[3] = {0, 0, 0}; /* this is the direction thast added to the view offset per redraw */
@@ -643,8 +676,6 @@ static int flyApply(bContext *C, FlyInfo *fly)
float moffset[2]; /* mouse offset from the views center */
float tmp_quat[4]; /* used for rotating the view */
-// int cent_orig[2], /* view center */
-//XXX- can avoid using // cent[2], /* view center modified */
int xmargin, ymargin; /* x and y margin are define the safe area where the mouses movement wont rotate the view */
#ifdef NDOF_FLY_DEBUG
@@ -654,18 +685,14 @@ static int flyApply(bContext *C, FlyInfo *fly)
}
#endif
- xmargin = ar->winx / 20.0f;
- ymargin = ar->winy / 20.0f;
-
- // UNUSED
- // cent_orig[0] = ar->winrct.xmin + ar->winx / 2;
- // cent_orig[1] = ar->winrct.ymin + ar->winy / 2;
+ xmargin = fly->width / 20.0f;
+ ymargin = fly->height / 20.0f;
{
/* mouse offset from the center */
- moffset[0] = fly->mval[0] - ar->winx / 2;
- moffset[1] = fly->mval[1] - ar->winy / 2;
+ 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;
@@ -683,12 +710,12 @@ static int flyApply(bContext *C, FlyInfo *fly)
* the mouse moves isn't linear */
if (moffset[0]) {
- moffset[0] /= ar->winx - (xmargin * 2);
+ moffset[0] /= fly->width - (xmargin * 2);
moffset[0] *= fabsf(moffset[0]);
}
if (moffset[1]) {
- moffset[1] /= ar->winy - (ymargin * 2);
+ moffset[1] /= fly->height - (ymargin * 2);
moffset[1] *= fabsf(moffset[1]);
}