Revision: 30791
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30791
Author:   campbellbarton
Date:     2010-07-27 06:56:24 +0200 (Tue, 27 Jul 2010)

Log Message:
-----------
bugfix [#21754] Smooth view + repeeted view orbit results in slow orbiting.
- original quat was not assigned yet so never gave a good result.
- quat angle comparison as vector is wrong.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_math_vector.h
    trunk/blender/source/blender/blenlib/intern/math_vector_inline.c
    trunk/blender/source/blender/editors/space_view3d/view3d_view.c

Modified: trunk/blender/source/blender/blenlib/BLI_math_vector.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_math_vector.h      2010-07-27 
04:02:09 UTC (rev 30790)
+++ trunk/blender/source/blender/blenlib/BLI_math_vector.h      2010-07-27 
04:56:24 UTC (rev 30791)
@@ -126,6 +126,7 @@
 MINLINE int compare_len_v3v3(float a[3], float b[3], float limit);
 
 MINLINE int compare_v4v4(float a[4], float b[4], float limit);
+MINLINE int equals_v4v4(float a[4], float b[4]);
 
 /********************************** Angles ***********************************/
 /* - angle with 2 arguments is angle between vector                          */

Modified: trunk/blender/source/blender/blenlib/intern/math_vector_inline.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/math_vector_inline.c    
2010-07-27 04:02:09 UTC (rev 30790)
+++ trunk/blender/source/blender/blenlib/intern/math_vector_inline.c    
2010-07-27 04:56:24 UTC (rev 30791)
@@ -409,6 +409,11 @@
        return ((v1[0]==v2[0]) && (v1[1]==v2[1]) && (v1[2]==v2[2]));
 }
 
+MINLINE int equals_v4v4(float *v1, float *v2)
+{
+       return ((v1[0]==v2[0]) && (v1[1]==v2[1]) && (v1[2]==v2[2]) && 
(v1[3]==v2[3]));
+}
+
 MINLINE int compare_v3v3(float *v1, float *v2, float limit)
 {
        if(fabs(v1[0]-v2[0])<limit)

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_view.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_view.c     
2010-07-27 04:02:09 UTC (rev 30790)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_view.c     
2010-07-27 04:56:24 UTC (rev 30791)
@@ -219,38 +219,16 @@
                if (sms.new_lens != v3d->lens)
                        changed = 1;
                
-               if ((sms.new_ofs[0]!=rv3d->ofs[0]) ||
-                       (sms.new_ofs[1]!=rv3d->ofs[1]) ||
-                       (sms.new_ofs[2]!=rv3d->ofs[2]) )
+               if (!equals_v3v3(sms.new_ofs, rv3d->ofs))
                        changed = 1;
-               
-               if ((sms.new_quat[0]!=rv3d->viewquat[0]) ||
-                       (sms.new_quat[1]!=rv3d->viewquat[1]) ||
-                       (sms.new_quat[2]!=rv3d->viewquat[2]) ||
-                       (sms.new_quat[3]!=rv3d->viewquat[3]) )
+
+               if (!equals_v4v4(sms.new_quat, rv3d->viewquat))
                        changed = 1;
                
                /* The new view is different from the old one
                        * so animate the view */
                if (changed) {
-                       
-                       sms.time_allowed= (double)U.smooth_viewtx / 1000.0;
-                       
-                       /* if this is view rotation only
-                               * we can decrease the time allowed by
-                               * the angle between quats 
-                               * this means small rotations wont lag */
-                       if (quat && !ofs && !dist) {
-                                float vec1[3], vec2[3];
-                               
-                                copy_v3_v3(vec1, sms.new_quat);
-                                copy_v3_v3(vec2, sms.orig_quat);
-                                normalize_v3(vec1);
-                                normalize_v3(vec2);
-                                /* scale the time allowed by the rotation */
-                                sms.time_allowed *= 
angle_normalized_v3v3(vec1, vec2)/(M_PI/2); 
-                       }
-                       
+
                        /* original values */
                        if (oldcamera) {
                                sms.orig_dist= rv3d->dist; // below function 
does weird stuff with it...
@@ -269,6 +247,26 @@
                                rv3d->view= 0;
                        }
 
+                       sms.time_allowed= (double)U.smooth_viewtx / 1000.0;
+                       
+                       /* if this is view rotation only
+                               * we can decrease the time allowed by
+                               * the angle between quats 
+                               * this means small rotations wont lag */
+                       if (quat && !ofs && !dist) {
+                               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);
+
+                               mul_qt_v3(q1, vec1);
+                               mul_qt_v3(q2, vec2);
+
+                               /* scale the time allowed by the rotation */
+                               sms.time_allowed *= angle_v3v3(vec1, vec2) / 
M_PI; /* 180deg == 1.0 */
+                       }
+
                        /* ensure it shows correct */
                        if(sms.to_camera) rv3d->persp= RV3D_PERSP;
 


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to