still need to fix restoring on non-euler rotations for fly mode (probably do generic function for it), while what you suggest makes sense Id also consider fly mode with a parent to the camera fairly corner case which doesn't need an immediate fix. Would this just display a popup requesting to fly the camera or its root parent?
On Fri, Feb 26, 2010 at 12:28 AM, Martin Poirier <the...@yahoo.com> wrote: > This should be optional with an operator property. > > I can't believe it wasn't done that way in the first place. > > Martin > > --- On Thu, 2/25/10, Campbell Barton <ideasma...@gmail.com> wrote: > >> From: Campbell Barton <ideasma...@gmail.com> >> Subject: [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27143] >> trunk/blender/source/blender/ editors/space_view3d/view3d_view.c: support >> for flymode with camera rigs, so the parent most object is actually flying. >> To: bf-blender-...@blender.org >> Received: Thursday, February 25, 2010, 3:40 PM >> Revision: 27143 >> >> http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27143 >> Author: campbellbarton >> Date: 2010-02-25 21:40:09 +0100 >> (Thu, 25 Feb 2010) >> >> Log Message: >> ----------- >> support for flymode with camera rigs, so the parent most >> object is actually flying. >> >> Modified Paths: >> -------------- >> >> trunk/blender/source/blender/editors/space_view3d/view3d_view.c >> >> Modified: >> trunk/blender/source/blender/editors/space_view3d/view3d_view.c >> =================================================================== >> --- >> trunk/blender/source/blender/editors/space_view3d/view3d_view.c >> 2010-02-25 20:26:38 UTC (rev 27142) >> +++ >> trunk/blender/source/blender/editors/space_view3d/view3d_view.c >> 2010-02-25 20:40:09 UTC (rev 27143) >> @@ -1148,6 +1148,25 @@ >> } >> } >> >> +/* give a 4x4 matrix from a perspective view, only needs >> viewquat, ofs and dist >> + * basically the same as... >> + * rv3d->persp= RV3D_PERSP >> + * setviewmatrixview3d(scene, v3d, >> rv3d); >> + * setcameratoview3d(v3d, rv3d, >> v3d->camera); >> + * ...but less of a hassle >> + * */ >> +static void view3d_persp_mat4(RegionView3D *rv3d, float >> mat[][4]) >> +{ >> + float qt[4], dvec[3]; >> + copy_qt_qt(qt, rv3d->viewquat); >> + qt[0]= -qt[0]; >> + quat_to_mat4(mat, qt); >> + mat[3][2] -= rv3d->dist; >> + translate_m4(mat, rv3d->ofs[0], >> rv3d->ofs[1], rv3d->ofs[2]); >> + mul_v3_v3fl(dvec, mat[2], >> -rv3d->dist); >> + sub_v3_v3v3(mat[3], dvec, >> rv3d->ofs); >> +} >> + >> /* dont set windows active in in here, is used by >> renderwin too */ >> void setviewmatrixview3d(Scene *scene, View3D *v3d, >> RegionView3D *rv3d) >> { >> @@ -1934,6 +1953,9 @@ >> float xlock_momentum, zlock_momentum; >> /* nicer dynamics */ >> float grid; /* world scale 1.0 default >> */ >> >> + /* root most parent */ >> + Object *root_parent; >> + >> /* backup values */ >> float dist_backup; /* backup the views >> distance since we use a zero dist for fly mode */ >> float ofs_backup[3]; /* backup the >> views offset incase the user cancels flying in non camera >> mode */ >> @@ -2013,10 +2035,21 @@ >> fly->persp_backup= >> fly->rv3d->persp; >> fly->dist_backup= >> fly->rv3d->dist; >> if (fly->rv3d->persp==RV3D_CAMOB) >> { >> - /* store the >> origoinal camera loc and rot */ >> - >> VECCOPY(fly->ofs_backup, >> fly->v3d->camera->loc); >> - >> VECCOPY(fly->rot_backup, >> fly->v3d->camera->rot); >> + Object *ob_back; >> + >> if((fly->root_parent=fly->v3d->camera->parent)) >> { >> + >> while(fly->root_parent->parent) >> + >> fly->root_parent= >> fly->root_parent->parent; >> + >> ob_back= fly->root_parent; >> + } >> + else { >> + >> ob_back= fly->v3d->camera; >> + } >> >> + /* store the >> original camera loc and rot */ >> + /* TODO. axis angle >> etc */ >> + >> VECCOPY(fly->ofs_backup, ob_back->loc); >> + >> VECCOPY(fly->rot_backup, ob_back->rot); >> + >> >> where_is_object(fly->scene, fly->v3d->camera); >> >> VECCOPY(fly->rv3d->ofs, >> fly->v3d->camera->obmat[3]); >> >> mul_v3_fl(fly->rv3d->ofs, -1.0f); /*flip the vector*/ >> @@ -2060,10 +2093,16 @@ >> if (fly->state == FLY_CANCEL) { >> /* Revert to original view? */ >> if >> (fly->persp_backup==RV3D_CAMOB) { /* a camera view */ >> + >> Object *ob_back; >> + >> if(fly->root_parent)ob_back= fly->root_parent; >> + >> else >> ob_back= fly->v3d->camera; >> >> - >> VECCOPY(v3d->camera->loc, fly->ofs_backup); >> - >> VECCOPY(v3d->camera->rot, fly->rot_backup); >> - >> DAG_id_flush_update(&v3d->camera->id, >> OB_RECALC_OB); >> + >> /* store the original camera loc and rot */ >> + >> /* TODO. axis angle etc */ >> + >> VECCOPY(ob_back->loc, fly->ofs_backup); >> + >> VECCOPY(ob_back->rot, fly->rot_backup); >> + >> + >> DAG_id_flush_update(&ob_back->id, OB_RECALC_OB); >> } else { >> >> /* Non Camera we need to reset the view back to the original >> location bacause the user canceled*/ >> >> QUATCOPY(rv3d->viewquat, fly->rot_backup); >> @@ -2073,10 +2112,15 @@ >> } >> else if >> (fly->persp_backup==RV3D_CAMOB) { /* >> camera */ >> float mat3[3][3]; >> - copy_m3_m4(mat3, >> v3d->camera->obmat); >> - >> object_mat3_to_rot(v3d->camera, mat3, TRUE); >> + >> if(fly->root_parent) { >> + >> DAG_id_flush_update(&fly->root_parent->id, >> OB_RECALC_OB); >> + } >> + else { >> + >> copy_m3_m4(mat3, v3d->camera->obmat); >> + >> object_mat3_to_rot(v3d->camera, mat3, TRUE); >> + >> DAG_id_flush_update(&v3d->camera->id, >> OB_RECALC_OB); >> + } >> >> - >> DAG_id_flush_update(&v3d->camera->id, >> OB_RECALC_OB); >> #if 0 //XXX2.5 >> if >> (IS_AUTOKEY_MODE(NORMAL)) { >> >> allqueue(REDRAWIPO, 0); >> @@ -2244,6 +2288,8 @@ >> ARegion *ar = fly->ar; >> Scene *scene= fly->scene; >> >> + float prev_view_mat[4][4]; >> + >> float mat[3][3], /* 3x3 copy of the >> view matrix so we can move allong the view axis */ >> dvec[3]={0,0,0}, /* this is the >> direction thast added to the view offset per redraw */ >> >> @@ -2259,7 +2305,9 @@ >> unsigned char >> apply_rotation= 1; /* if the user >> presses shift they can look about without movinf the >> direction there looking*/ >> >> - >> + if(fly->root_parent) >> + >> view3d_persp_mat4(rv3d, prev_view_mat); >> + >> /* the dist defines a vector that is >> infront of the offset >> to rotate the view about. >> this is no good for fly mode because >> we >> @@ -2474,20 +2522,42 @@ >> >> >> /* we are in camera view so apply the view ofs and quat to >> the view matrix and set the camera to the view */ >> >> if (rv3d->persp==RV3D_CAMOB) { >> - >> rv3d->persp= RV3D_PERSP; /*set this so >> setviewmatrixview3d uses the ofs and quat instead of the >> camera */ >> - >> setviewmatrixview3d(scene, v3d, rv3d); >> - >> setcameratoview3d(v3d, rv3d, >> v3d->camera); >> - >> rv3d->persp= RV3D_CAMOB; >> - >> >> + >> ID *id_key; >> + >> /* transform the parent or the camera? >> */ >> + >> if(fly->root_parent) { >> + >> float view_mat[4][4]; >> + >> float >> prev_view_imat[4][4]; >> + >> float diff_mat[4][4]; >> + >> float >> parent_mat[4][4]; >> + >> + >> >> invert_m4_m4(prev_view_imat, prev_view_mat); >> + >> >> view3d_persp_mat4(rv3d, view_mat); >> + >> mul_m4_m4m4(diff_mat, >> prev_view_imat, view_mat); >> + >> >> mul_m4_m4m4(parent_mat, fly->root_parent->obmat, >> diff_mat); >> + >> >> object_apply_mat4(fly->root_parent, parent_mat); >> + >> + >> where_is_object(scene, >> fly->root_parent); >> + >> + >> >> copy_m4_m4(prev_view_mat, view_mat); >> + >> + >> id_key= >> &fly->root_parent->id; >> + >> } >> + >> else { >> + >> float view_mat[4][4]; >> + >> >> view3d_persp_mat4(rv3d, view_mat); >> + >> >> object_apply_mat4(v3d->camera, view_mat); >> + >> id_key= >> &v3d->camera->id; >> + >> } >> + >> >> /* record the motion */ >> - >> if (autokeyframe_cfra_can_key(scene, >> &v3d->camera->id)) { >> + >> if (autokeyframe_cfra_can_key(scene, >> id_key)) { >> >> bCommonKeySrc cks; >> >> ListBase dsources = >> {&cks, &cks}; >> >> int cfra = CFRA; >> >> >> >> /* init >> common-key-source for use by KeyingSets */ >> >> memset(&cks, 0, >> sizeof(bCommonKeySrc)); >> - >> cks.id= >> &v3d->camera->id; >> + >> cks.id= id_key; >> >> >> >> /* insert keyframes >> >> >> * 1) on the >> first frame >> >> >> _______________________________________________ >> Bf-blender-cvs mailing list >> bf-blender-...@blender.org >> http://lists.blender.org/mailman/listinfo/bf-blender-cvs >> > > > __________________________________________________________________ > The new Internet Explorer® 8 - Faster, safer, easier. Optimized for Yahoo! > Get it Now for Free! at http://downloads.yahoo.com/ca/internetexplorer/ > _______________________________________________ > Bf-committers mailing list > Bf-committers@blender.org > http://lists.blender.org/mailman/listinfo/bf-committers > -- - Campbell _______________________________________________ Bf-committers mailing list Bf-committers@blender.org http://lists.blender.org/mailman/listinfo/bf-committers