Revision: 53874
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53874
Author:   campbellbarton
Date:     2013-01-17 08:05:48 +0000 (Thu, 17 Jan 2013)
Log Message:
-----------
fix [#33894] Viewport heavily distorted

The SmoothView operator was mixing up source-view and original-view parameters 
cleanup this operator and add 'original' view settings store.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_view3d/view3d_edit.c
    trunk/blender/source/blender/editors/space_view3d/view3d_view.c
    trunk/blender/source/blender/editors/transform/transform.c

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_edit.c     
2013-01-17 06:21:20 UTC (rev 53873)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_edit.c     
2013-01-17 08:05:48 UTC (rev 53874)
@@ -4274,6 +4274,8 @@
                CameraParams params;
 
                BKE_camera_params_init(&params);
+               /* incase we can't get the lens */
+               params.lens = *lens;
                BKE_camera_params_from_object(&params, ob);
                *lens = params.lens;
        }

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_view.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_view.c     
2013-01-17 06:21:20 UTC (rev 53873)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_view.c     
2013-01-17 08:05:48 UTC (rev 53874)
@@ -111,17 +111,43 @@
 /* ****************** smooth view operator ****************** */
 /* This operator is one of the 'timer refresh' ones like animation playback */
 
+struct SmoothView3DState {
+       float dist;
+       float lens;
+       float quat[4];
+       float ofs[3];
+};
+
 struct SmoothView3DStore {
-       float orig_dist, new_dist;
-       float orig_lens, new_lens;
-       float orig_quat[4], new_quat[4];
-       float orig_ofs[3], new_ofs[3];
-       
-       int to_camera, orig_view;
-       
+       /* source*/
+       struct SmoothView3DState src;  /* source */
+       struct SmoothView3DState dst;  /* destination */
+       struct SmoothView3DState org;  /* original */
+
+       bool to_camera;
+       char org_view;
+
        double time_allowed;
 };
 
+static void view3d_smooth_view_state_backup(struct SmoothView3DState 
*sms_state,
+                                            const View3D *v3d, const 
RegionView3D *rv3d)
+{
+       copy_v3_v3(sms_state->ofs,   rv3d->ofs);
+       copy_qt_qt(sms_state->quat,  rv3d->viewquat);
+       sms_state->dist            = rv3d->dist;
+       sms_state->lens            = v3d->lens;
+}
+
+static void view3d_smooth_view_state_restore(const struct SmoothView3DState 
*sms_state,
+                                             View3D *v3d, RegionView3D *rv3d)
+{
+       copy_v3_v3(rv3d->ofs,      sms_state->ofs);
+       copy_qt_qt(rv3d->viewquat, sms_state->quat);
+       rv3d->dist               = sms_state->dist;
+       v3d->lens                = sms_state->lens;
+}
+
 /* will start timer if appropriate */
 /* the arguments are the desired situation */
 void view3d_smooth_view(bContext *C, View3D *v3d, ARegion *ar, Object 
*oldcamera, Object *camera,
@@ -132,15 +158,14 @@
        ScrArea *sa = CTX_wm_area(C);
 
        RegionView3D *rv3d = ar->regiondata;
-       struct SmoothView3DStore sms = {0};
-       short ok = FALSE;
+       struct SmoothView3DStore sms = {{0}};
+       bool ok = false;
        
        /* initialize sms */
-       copy_v3_v3(sms.new_ofs, rv3d->ofs);
-       copy_qt_qt(sms.new_quat, rv3d->viewquat);
-       sms.new_dist = rv3d->dist;
-       sms.new_lens = v3d->lens;
-       sms.to_camera = FALSE;
+       view3d_smooth_view_state_backup(&sms.dst, v3d, rv3d);
+       view3d_smooth_view_state_backup(&sms.org, v3d, rv3d);
+       view3d_smooth_view_state_backup(&sms.src, v3d, rv3d);
+       sms.to_camera = false;
 
        /* note on camera locking, this is a little confusing but works ok.
         * we may be changing the view 'as if' there is no active camera, but 
in fact
@@ -155,50 +180,44 @@
        }
 
        /* store the options we want to end with */
-       if (ofs) copy_v3_v3(sms.new_ofs, ofs);
-       if (quat) copy_qt_qt(sms.new_quat, quat);
-       if (dist) sms.new_dist = *dist;
-       if (lens) sms.new_lens = *lens;
+       if (ofs)  copy_v3_v3(sms.dst.ofs, ofs);
+       if (quat) copy_qt_qt(sms.dst.quat, quat);
+       if (dist) sms.dst.dist = *dist;
+       if (lens) sms.dst.lens = *lens;
 
        if (camera) {
-               sms.new_dist = ED_view3d_offset_distance(camera->obmat, ofs, 
VIEW3D_DIST_FALLBACK);
-               ED_view3d_from_object(camera, sms.new_ofs, sms.new_quat, 
&sms.new_dist, &sms.new_lens);
-               sms.to_camera = TRUE; /* restore view3d values in end */
+               sms.dst.dist = ED_view3d_offset_distance(camera->obmat, ofs, 
VIEW3D_DIST_FALLBACK);
+               ED_view3d_from_object(camera, sms.dst.ofs, sms.dst.quat, 
&sms.dst.dist, &sms.dst.lens);
+               sms.to_camera = true; /* restore view3d values in end */
        }
        
        if (C && U.smooth_viewtx) {
-               int changed = FALSE; /* zero means no difference */
+               bool changed = false; /* zero means no difference */
                
                if (oldcamera != camera)
-                       changed = TRUE;
-               else if (sms.new_dist != rv3d->dist)
-                       changed = TRUE;
-               else if (sms.new_lens != v3d->lens)
-                       changed = TRUE;
-               else if (!equals_v3v3(sms.new_ofs, rv3d->ofs))
-                       changed = TRUE;
-               else if (!equals_v4v4(sms.new_quat, rv3d->viewquat))
-                       changed = TRUE;
+                       changed = true;
+               else if (sms.dst.dist != rv3d->dist)
+                       changed = true;
+               else if (sms.dst.lens != v3d->lens)
+                       changed = true;
+               else if (!equals_v3v3(sms.dst.ofs, rv3d->ofs))
+                       changed = true;
+               else if (!equals_v4v4(sms.dst.quat, rv3d->viewquat))
+                       changed = true;
                
                /* The new view is different from the old one
                 * so animate the view */
                if (changed) {
-
                        /* original values */
                        if (oldcamera) {
-                               sms.orig_dist = 
ED_view3d_offset_distance(oldcamera->obmat, rv3d->ofs, 0.0f);
-                               ED_view3d_from_object(oldcamera, sms.orig_ofs, 
sms.orig_quat, &sms.orig_dist, &sms.orig_lens);
+                               sms.src.dist = 
ED_view3d_offset_distance(oldcamera->obmat, rv3d->ofs, 0.0f);
+                               /* this */
+                               ED_view3d_from_object(oldcamera, sms.src.ofs, 
sms.src.quat, &sms.src.dist, &sms.src.lens);
                        }
-                       else {
-                               copy_v3_v3(sms.orig_ofs, rv3d->ofs);
-                               copy_qt_qt(sms.orig_quat, rv3d->viewquat);
-                               sms.orig_dist = rv3d->dist;
-                               sms.orig_lens = v3d->lens;
-                       }
                        /* grid draw as floor */
                        if ((rv3d->viewlock & RV3D_LOCKED) == 0) {
                                /* use existing if exists, means multiple calls 
to smooth view wont loose the original 'view' setting */
-                               sms.orig_view = rv3d->sms ? 
rv3d->sms->orig_view : rv3d->view;
+                               sms.org_view = rv3d->sms ? rv3d->sms->org_view 
: rv3d->view;
                                rv3d->view = RV3D_VIEW_USER;
                        }
 
@@ -212,8 +231,8 @@
                                float vec1[3] = {0, 0, 1}, vec2[3] = {0, 0, 1};
                                float q1[4], q2[4];
 
-                               invert_qt_qt(q1, sms.new_quat);
-                               invert_qt_qt(q2, sms.orig_quat);
+                               invert_qt_qt(q1, sms.dst.quat);
+                               invert_qt_qt(q2, sms.src.quat);
 
                                mul_qt_v3(q1, vec1);
                                mul_qt_v3(q2, vec2);
@@ -223,36 +242,45 @@
                        }
 
                        /* ensure it shows correct */
-                       if (sms.to_camera) rv3d->persp = RV3D_PERSP;
+                       if (sms.to_camera) {
+                               rv3d->persp = RV3D_PERSP;
+                       }
 
                        rv3d->rflag |= RV3D_NAVIGATING;
                        
+                       /* not essential but in some cases the caller will tag 
the area for redraw,
+                        * and in that case we can get a ficker of the 'org' 
user view but we want to see 'src' */
+                       view3d_smooth_view_state_restore(&sms.src, v3d, rv3d);
+
                        /* keep track of running timer! */
-                       if (rv3d->sms == NULL)
+                       if (rv3d->sms == NULL) {
                                rv3d->sms = MEM_mallocN(sizeof(struct 
SmoothView3DStore), "smoothview v3d");
+                       }
                        *rv3d->sms = sms;
-                       if (rv3d->smooth_timer)
+                       if (rv3d->smooth_timer) {
                                WM_event_remove_timer(wm, win, 
rv3d->smooth_timer);
+                       }
                        /* TIMER1 is hardcoded in keymap */
                        rv3d->smooth_timer = WM_event_add_timer(wm, win, 
TIMER1, 1.0 / 100.0); /* max 30 frs/sec */
-                       
-                       ok = TRUE;
+
+                       ok = true;
                }
        }
        
        /* if we get here nothing happens */
-       if (ok == FALSE) {
-               if (sms.to_camera == FALSE) {
-                       copy_v3_v3(rv3d->ofs, sms.new_ofs);
-                       copy_qt_qt(rv3d->viewquat, sms.new_quat);
-                       rv3d->dist = sms.new_dist;
-                       v3d->lens = sms.new_lens;
+       if (ok == false) {
+               if (sms.to_camera == false) {
+                       copy_v3_v3(rv3d->ofs, sms.dst.ofs);
+                       copy_qt_qt(rv3d->viewquat, sms.dst.quat);
+                       rv3d->dist = sms.dst.dist;
+                       v3d->lens = sms.dst.lens;
 
                        ED_view3d_camera_lock_sync(v3d, rv3d);
                }
 
-               if (rv3d->viewlock & RV3D_BOXVIEW)
+               if (rv3d->viewlock & RV3D_BOXVIEW) {
                        view3d_boxview_copy(sa, ar);
+               }
 
                ED_region_tag_redraw(ar);
        }
@@ -281,22 +309,16 @@
                /* if we went to camera, store the original */
                if (sms->to_camera) {
                        rv3d->persp = RV3D_CAMOB;
-                       copy_v3_v3(rv3d->ofs, sms->orig_ofs);
-                       copy_qt_qt(rv3d->viewquat, sms->orig_quat);
-                       rv3d->dist = sms->orig_dist;
-                       v3d->lens = sms->orig_lens;
+                       view3d_smooth_view_state_restore(&sms->org, v3d, rv3d);
                }
                else {
-                       copy_v3_v3(rv3d->ofs, sms->new_ofs);
-                       copy_qt_qt(rv3d->viewquat, sms->new_quat);
-                       rv3d->dist = sms->new_dist;
-                       v3d->lens = sms->new_lens;
+                       view3d_smooth_view_state_restore(&sms->dst, v3d, rv3d);
 
                        ED_view3d_camera_lock_sync(v3d, rv3d);
                }
                
                if ((rv3d->viewlock & RV3D_LOCKED) == 0) {
-                       rv3d->view = sms->orig_view;
+                       rv3d->view = sms->org_view;
                }
 
                MEM_freeN(rv3d->sms);
@@ -312,11 +334,11 @@
 
                step_inv = 1.0f - step;
 
-               interp_v3_v3v3(rv3d->ofs,      sms->orig_ofs,  sms->new_ofs,  
step);
-               interp_qt_qtqt(rv3d->viewquat, sms->orig_quat, sms->new_quat, 
step);
+               interp_v3_v3v3(rv3d->ofs,      sms->src.ofs,  sms->dst.ofs,  
step);
+               interp_qt_qtqt(rv3d->viewquat, sms->src.quat, sms->dst.quat, 
step);
                
-               rv3d->dist = sms->new_dist * step + sms->orig_dist * step_inv;
-               v3d->lens  = sms->new_lens * step + sms->orig_lens * step_inv;
+               rv3d->dist = sms->dst.dist * step + sms->src.dist * step_inv;
+               v3d->lens  = sms->dst.lens * step + sms->src.lens * step_inv;
 
                ED_view3d_camera_lock_sync(v3d, rv3d);
        }
@@ -326,7 +348,7 @@
 
        /* note: this doesn't work right because the v3d->lens is now used in 
ortho mode r51636,
         * when switching camera in quad-view the other ortho views would zoom 
& reset. */
-#if 0
+#if 1
        WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, v3d);
 #else
        ED_region_tag_redraw(CTX_wm_region(C));

Modified: trunk/blender/source/blender/editors/transform/transform.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.c  2013-01-17 
06:21:20 UTC (rev 53873)
+++ trunk/blender/source/blender/editors/transform/transform.c  2013-01-17 
08:05:48 UTC (rev 53874)
@@ -5873,7 +5873,6 @@
        int i;
 
        for (i = 0, sv = sld->sv; i < sld->totsv; i++, sv++) {
-               /* allow points behind the view [#33643] */
                dist = len_squared_v2v2(mval_fl, sv->co_orig_2d);
                if (dist < min_dist) {
                        min_dist = dist;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to