[Bf-committers] [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.

Martin Poirier theeth at yahoo.com
Sat Feb 27 20:22:51 CET 2010


No popup or anything, just have it as an operator property and it could work like this:

0: Fly invoke records its result in an operator property that can be used by exec on redo (assuming it doesn't do that already, it should).

1: The Move Parent property can be toggle on or off in the operator, it will then move the parent or not.

2: The property can also be set in the keymap if users want one behavior or another as default (I would suggest default Off).

Martin

--- On Fri, 2/26/10, Campbell Barton <ideasman42 at gmail.com> wrote:

> From: Campbell Barton <ideasman42 at gmail.com>
> Subject: Re: [Bf-committers] [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 developers" <bf-committers at blender.org>
> Received: Friday, February 26, 2010, 3:07 AM
> 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 <theeth at 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 <ideasman42 at gmail.com>
> wrote:
> >
> >> From: Campbell Barton <ideasman42 at 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-cvs at 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-cvs at 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 at blender.org
> > http://lists.blender.org/mailman/listinfo/bf-committers
> >
> 
> 
> 
> -- 
> - Campbell
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at blender.org
> http://lists.blender.org/mailman/listinfo/bf-committers
> 


      __________________________________________________________________
The new Internet Explorer® 8 - Faster, safer, easier.  Optimized for Yahoo!  Get it Now for Free! at http://downloads.yahoo.com/ca/internetexplorer/


More information about the Bf-committers mailing list