diff options
author | Campbell Barton <ideasman42@gmail.com> | 2006-06-25 06:26:01 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2006-06-25 06:26:01 +0400 |
commit | 15920b37a26c6cdb7d204f021e6e4ed7094cb4f7 (patch) | |
tree | 53f928ca2c3a88bf95e22aede552dbc1f614a264 /source/blender/src/editview.c | |
parent | 362b3674fe2ba78b0c45456080b3390d580b2ef2 (diff) |
Made Shift key slow down the flying by a to a 10th to work more like blender. alt is now mouselook
Simplified traveling on x/y/z axis and use WASDRF with RF for up and down.
Added cancel to the header tip
Made Esc/RMB go back to the initial view for normal perspective views (previously only worked for Camera view)
Diffstat (limited to 'source/blender/src/editview.c')
-rw-r--r-- | source/blender/src/editview.c | 92 |
1 files changed, 59 insertions, 33 deletions
diff --git a/source/blender/src/editview.c b/source/blender/src/editview.c index ed80e74b8f5..1cdf8c02329 100644 --- a/source/blender/src/editview.c +++ b/source/blender/src/editview.c @@ -2016,6 +2016,8 @@ void fly(void) tmpvec[3], /* global up vector - compare with upvec for angle */ dist_backup, /* backup the views distance since we use a zero dist for fly mode */ + quat_backup[4], /* backup the views quat incase the user cancels flying in non camera mode */ + ofs_backup[3], /* backup the views offset incase the user cancels flying in non camera mode */ lens_backup=1.0, /* backup the views lense, adopt tha cameras lense during fly mode */ clip_backup[2], /* if using the camera- adopt its clip near/far */ moffset[2], /* mouse offset from the views center */ @@ -2029,19 +2031,22 @@ void fly(void) short val, /* used for toets to see if a buttons pressed */ cent[2], /* view center */ mval[2], /* mouse location */ - loop=1, /* while true, stay in fly mode */ + action=0, /* while zero stay in fly mode and wait for action, also used to see if we accepted or canceled 1:ok 2:Cancel */ xmargin, ymargin; /* x and y margin are define the safe area where the mouses movement wont rotate the view */ unsigned short - toets, /* for reading teh event */ + toets, /* for reading the event */ qual_backup; /*backup the Ctrl/Alt/Shift key values for setting the camera back */ unsigned char apply_rotation= 1, /* if the user presses shift they can look about without movinf the direction there looking*/ correct_vroll= 0, /* pressuing CTRL uprights the camera off by default */ - strafe= 0, /* if true move side to side rather then backwards and forward */ - use_camera /* remember weather to go back to a camera or not */; + axis= 2, /* Axis index to move allong by default Z to move allong the view */ + use_camera, /* remember weather to go back to a camera or not */ + persp_backup; /* remember if were ortho or not, only used for restoring the view if it was a ortho view */ if(curarea->spacetype!=SPACE_VIEW3D) return; + persp_backup= G.vd->persp; + if (G.vd->persp==2) { /* Camera */ use_camera= 1; lens_backup= G.vd->lens; /* so when we fly in normal view our lense matches the cameras */ @@ -2078,6 +2083,8 @@ void fly(void) G.vd->persp= 1; /*if ortho projection, make perspective */ use_camera= 0; dist_backup= G.vd->dist; + QUATCOPY(quat_backup, G.vd->viewquat); + VECCOPY(ofs_backup, G.vd->ofs); G.vd->dist= 0.0; upvec[2]=dist_backup; /*x and y are 0*/ @@ -2116,18 +2123,17 @@ void fly(void) scrarea_do_windraw(curarea); screen_swapbuffers(); - while(loop) { + while(action==0) { /* keep flying, no acton taken */ while(qtest()) { toets= extern_qread(&val); if(val) { if(toets==MOUSEY) getmouseco_areawin(mval); else if(toets==ESCKEY || toets==RIGHTMOUSE) { - if (use_camera) use_camera=2; /* dont apply view to camera */ - loop= 0; + action= 2; /* Canceled */ break; } else if(toets==SPACEKEY || toets==LEFTMOUSE) { - loop= 0; + action= 1; /* Accepted */ break; } else if(toets==PADPLUSKEY || toets==EQUALKEY || toets==WHEELUPMOUSE) { if (speed<0) speed=0; @@ -2140,25 +2146,33 @@ void fly(void) } else if(toets==WKEY) { if (speed<0) speed=-speed; /* flip speed rather then stopping, game like motion */ else speed+= G.vd->grid; /* increse like mousewheel if were alredy moving in that difection*/ - strafe= 0; + axis= 2; } else if(toets==SKEY) { /*SAME as above but flipped */ if (speed>0) speed=-speed; else speed-= G.vd->grid; - strafe= 0; + axis= 2; } else if(toets==AKEY) { if (speed<0) speed=-speed; else speed+= G.vd->grid; - strafe= 1; + axis= 0; } else if(toets==DKEY) { if (speed>0) speed=-speed; else speed-= G.vd->grid; - strafe= 1; + axis= 0; + } else if(toets==FKEY) { + if (speed<0) speed=-speed; + else speed+= G.vd->grid; + axis= 1; + } else if(toets==RKEY) { + if (speed>0) speed=-speed; + else speed-= G.vd->grid; + axis= 1; } } } - if(loop==0) break; + if(action!=0) break; moffset[0]= mval[0]-cent[0]; @@ -2184,24 +2198,6 @@ void fly(void) moffset[1]= moffset[1]*fabs(moffset[1]); } - /* make it so the camera direction dosent follow the view - good for flying backwards! */ - if ((G.qual & LR_SHIFTKEY) && speed!=0.0 && (moffset[0]||moffset[1])) - /*(Above IF) We need to make sure we have some mouse offset - and are moving before we ignore the rotation code, otherwise the view spins out */ - apply_rotation=0; - else { - apply_rotation=1; - if (strafe==0) { - /* define dvec, view direction vector */ - dvec[0]= dvec[1]= 0; - dvec[2]= 1.0; - } else { /*strafe - sidestep */ - /* define dvec, view sidewase vector */ - dvec[2]= dvec[1]= 0; - dvec[0]= 1.0; - } - } /* correct the view rolling */ if (G.qual & LR_CTRLKEY) correct_vroll=1; @@ -2209,11 +2205,34 @@ void fly(void) /* Should we redraw? */ if(speed!=0.0 || moffset[0] || moffset[1] || correct_vroll) { + + /* Set the view direction usine the current axis */ + if ((G.qual & LR_ALTKEY) && speed!=0.0 && (moffset[0]||moffset[1])) + /* make it so the camera direction dosent follow the view + good for flying backwards! - Only when Alt is held */ + + /*(Above IF) We need to make sure we have some mouse offset + and are moving before we ignore the rotation code, otherwise the view spins out */ + apply_rotation=0; + else { + /* Normal operation */ + apply_rotation=1; + /* define dvec, view direction vector */ + dvec[0]= dvec[1]= dvec[2]= 0; + /* move along the current axis */ + dvec[axis]= 1.0f; + } + time_current= PIL_check_seconds_timer(); time_redraw= (float)(time_current-time_lastdraw); time_lastdraw= time_current; /*fprintf(stderr, "%f\n", time_redraw);*/ /* 0.002 is a small redraw 0.02 is larger */ + /* Scale the time to use shift to scale the speed down- just like + shift slows many other areas of blender down */ + if (G.qual & LR_SHIFTKEY) + time_redraw= time_redraw*0.1; + Mat3CpyMat4(mat, G.vd->viewinv); if (apply_rotation) { Normalise(dvec); @@ -2272,7 +2291,7 @@ void fly(void) VecMulf(dvec, speed*time_redraw); VecAddf(G.vd->ofs, G.vd->ofs, dvec); - headerprint("FlyKeys Speed:(+/- | Wheel), MouseLook:Shift, Upright:Ctrl, Direction:WASD, Exit:LMB"); + headerprint("FlyKeys Speed:(+/- | Wheel), MouseLook:Alt, Upright:Ctrl, Slow:Shift, Direction:WASDRF, Ok:LMB, Cancel:RMB"); scrarea_do_windraw(curarea); screen_swapbuffers(); } else @@ -2293,6 +2312,7 @@ void fly(void) /*Done with correcting for the dist */ if (use_camera) { + /* Camera, we need to set the camera to the current view */ G.vd->lens= lens_backup; /* restore the views perspectiove lense angle */ G.vd->near= clip_backup[0]; G.vd->far= clip_backup[1]; @@ -2301,13 +2321,19 @@ void fly(void) G.vd->persp=2; G.vd->viewbut=1; - if (use_camera!=2) { /* use_camera==2 means the user pressed Esc of RMB, and not to apply view to camera */ + if (action != 2) { /* use_camera==2 means the user pressed Esc of RMB, and not to apply view to camera */ G.vd->camzoom=0; /* so we dont get a zooming jump when the camera switches back. Warning this could be annoying. */ qual_backup= G.qual; G.qual |= LR_CTRLKEY|LR_ALTKEY; /* move camera to view */ persptoetsen(PAD0); G.qual= qual_backup; } + } else if (action == 2) { /* user canceled from non camera mode, restoring the view from backup */ + /* Non Camera we need to reset the view back to the original location bacause the user canceled*/ + QUATCOPY(G.vd->viewquat, quat_backup); + VECCOPY(G.vd->ofs, ofs_backup); + G.vd->persp= persp_backup; /* if we canceled from ortho mode then go back into it*/ + } G.vd->flag2 &= ~V3D_FLYMODE; |