Dont fly in linked library data.
Changed Ctrl for upright into 2 toggles, X and Zkeys enable uprighting of the camera for each axis. Uprighting is also simplified.
This commit is contained in:
@@ -2014,9 +2014,8 @@ void fly(void)
|
||||
dvec[3]={0,0,0}, /* this is the direction thast added to the view offset per redraw */
|
||||
|
||||
/* Camera Uprighting variables */
|
||||
angle, /* the angle between the camera's up and the Z-up */
|
||||
roll, /* similar to the angle between the camera's up and the Z-up, but its very rough so just roll*/
|
||||
upvec[3]={0,0,0}, /* stores the view's up vector */
|
||||
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 */
|
||||
rot_backup[4], /* backup the views quat incase the user cancels flying in non camera mode */
|
||||
@@ -2024,7 +2023,7 @@ void fly(void)
|
||||
moffset[2], /* mouse offset from the views center */
|
||||
tmp_quat[4], /* used for rotating the view */
|
||||
winxf, winyf, /* scale the mouse movement by this value - scales mouse movement to the view size */
|
||||
time_redraw; /*time how fast it takes for us to redraw, this is so simple scenes dont fly too fast */
|
||||
time_redraw, time_redraw_clamped; /*time how fast it takes for us to redraw, this is so simple scenes dont fly too fast */
|
||||
|
||||
|
||||
double time_current, time_lastdraw;
|
||||
@@ -2038,11 +2037,12 @@ void fly(void)
|
||||
toets; /* for reading the event */
|
||||
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 */
|
||||
axis= 2, /* Axis index to move allong by default Z to move allong the view */
|
||||
persp_backup; /* remember if were ortho or not, only used for restoring the view if it was a ortho view */
|
||||
short xlock=0, zlock=0;
|
||||
|
||||
if(curarea->spacetype!=SPACE_VIEW3D) return;
|
||||
if(G.vd->persp==2 && G.vd->camera->id.lib) return;
|
||||
|
||||
persp_backup= G.vd->persp;
|
||||
dist_backup= G.vd->dist;
|
||||
@@ -2146,13 +2146,18 @@ void fly(void)
|
||||
if (speed>0) speed=-speed;
|
||||
else speed-= G.vd->grid;
|
||||
axis= 1;
|
||||
|
||||
/* axis locking */
|
||||
} else if(toets==XKEY) {
|
||||
xlock= !xlock;
|
||||
} else if(toets==ZKEY) {
|
||||
zlock= !zlock;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
if(action != 0) break;
|
||||
|
||||
|
||||
moffset[0]= mval[0]-cent[0];
|
||||
moffset[1]= mval[1]-cent[1];
|
||||
|
||||
@@ -2176,13 +2181,8 @@ void fly(void)
|
||||
moffset[1]= moffset[1]*fabs(moffset[1]);
|
||||
}
|
||||
|
||||
|
||||
/* correct the view rolling */
|
||||
if (G.qual & LR_CTRLKEY) correct_vroll=1;
|
||||
else correct_vroll=0;
|
||||
|
||||
/* Should we redraw? */
|
||||
if(speed!=0.0 || moffset[0] || moffset[1] || correct_vroll) {
|
||||
if(speed!=0.0 || moffset[0] || moffset[1] || zlock || xlock ) {
|
||||
|
||||
/* Set the view direction usine the current axis */
|
||||
if ((G.qual & LR_ALTKEY) && speed!=0.0 && (moffset[0]||moffset[1]))
|
||||
@@ -2203,6 +2203,7 @@ void fly(void)
|
||||
|
||||
time_current= PIL_check_seconds_timer();
|
||||
time_redraw= (float)(time_current-time_lastdraw);
|
||||
time_redraw_clamped= MIN2(0.05, time_redraw); /* clamt the redraw time to avoid jitter in roll correction */
|
||||
time_lastdraw= time_current;
|
||||
/*fprintf(stderr, "%f\n", time_redraw);*/ /* 0.002 is a small redraw 0.02 is larger */
|
||||
|
||||
@@ -2236,46 +2237,62 @@ void fly(void)
|
||||
QuatMul(G.vd->viewquat, G.vd->viewquat, tmp_quat);
|
||||
}
|
||||
|
||||
if (correct_vroll) {
|
||||
if (zlock) {
|
||||
upvec[0]=1;
|
||||
upvec[1]=0;
|
||||
upvec[2]=0;
|
||||
Mat3MulVecfl(mat, upvec);
|
||||
|
||||
|
||||
/*make sure we have some z rolling*/
|
||||
if (fabs(upvec[2]) > 0.00001) {
|
||||
tmpvec[0]= upvec[0];
|
||||
upvec[1]= tmpvec[1]= 0;
|
||||
tmpvec[2]= 0;
|
||||
|
||||
/* angle between zroll vector and vec with zroll removed*/
|
||||
angle= VecAngle2(tmpvec, upvec);
|
||||
|
||||
/* we need to know which direction to rotate the camera */
|
||||
if (upvec[2]<0) angle=-angle;
|
||||
|
||||
/* now correct the angle a slight ammount, holding Ctrl will fix over time */
|
||||
upvec[0]=0;
|
||||
roll= upvec[2]*180;
|
||||
upvec[0]=0; /*rotate the view about this axis*/
|
||||
upvec[1]=0;
|
||||
upvec[2]=1;
|
||||
|
||||
/*clamp teh max roll speed - hides the fact that the roll calculation
|
||||
only realy detects if we're rolling, but not by how much */
|
||||
if (angle>4) angle= 4;
|
||||
else if (angle<-4) angle= -4;
|
||||
if (roll>4) roll= 4;
|
||||
else if (roll<-4) roll= -4;
|
||||
|
||||
Mat3MulVecfl(mat, upvec);
|
||||
VecRotToQuat( upvec, angle*0.001, tmp_quat); /* Rotate about the relative up vec */
|
||||
VecRotToQuat( upvec, roll*time_redraw_clamped*0.1, tmp_quat); /* Rotate about the relative up vec */
|
||||
QuatMul(G.vd->viewquat, G.vd->viewquat, tmp_quat);
|
||||
}
|
||||
}
|
||||
|
||||
if (xlock && moffset[1]==0) { /*only apply xcorrect when mouse isnt applying x rot*/
|
||||
upvec[0]=0;
|
||||
upvec[1]=0;
|
||||
upvec[2]=1;
|
||||
Mat3MulVecfl(mat, upvec);
|
||||
/*make sure we have some z rolling*/
|
||||
if (fabs(upvec[2]) > 0.00001) {
|
||||
roll= upvec[2]*-360;
|
||||
|
||||
upvec[0]=1; /*rotate the view about this axis*/
|
||||
upvec[1]=0;
|
||||
upvec[2]=0;
|
||||
|
||||
/*clamp teh max roll speed - hides the fact that the roll calculation
|
||||
only realy detects if we're rolling, but not by how much */
|
||||
if (roll>4) roll= 4;
|
||||
else if (roll<-4) roll= -4;
|
||||
|
||||
Mat3MulVecfl(mat, upvec);
|
||||
|
||||
VecRotToQuat( upvec, roll*time_redraw_clamped*0.1, tmp_quat); /* Rotate about the relative up vec */
|
||||
QuatMul(G.vd->viewquat, G.vd->viewquat, tmp_quat);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (apply_rotation)
|
||||
VecMulf(dvec, speed*time_redraw);
|
||||
|
||||
|
||||
VecAddf(G.vd->ofs, G.vd->ofs, dvec);
|
||||
headerprint("FlyKeys Speed:(+/- | Wheel), MouseLook:Alt, Upright:Ctrl, Slow:Shift, Direction:WASDRF, Ok:LMB, Cancel:RMB");
|
||||
|
||||
headerprint("FlyKeys Speed:(+/- | Wheel), MouseLook:Alt, Upright Axis:X/Z, Slow:Shift, Direction:WASDRF, Ok:LMB, Cancel:RMB");
|
||||
|
||||
/* we are in camera view so apply the view ofs and quat to the view matrix and set the camera to teh view */
|
||||
if (G.vd->persp==2) {
|
||||
G.vd->persp= 1; /*set this so setviewmatrixview3d uses the ofs and quat instead of the camera */
|
||||
@@ -2284,7 +2301,7 @@ void fly(void)
|
||||
G.vd->persp= 2;
|
||||
DAG_object_flush_update(G.scene, G.vd->camera, OB_RECALC_OB);
|
||||
}
|
||||
|
||||
|
||||
scrarea_do_windraw(curarea);
|
||||
screen_swapbuffers();
|
||||
} else
|
||||
|
||||
Reference in New Issue
Block a user