Revision: 53227
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53227
Author:   campbellbarton
Date:     2012-12-21 03:49:47 +0000 (Fri, 21 Dec 2012)
Log Message:
-----------
fix own regression in 2.65 [#33643] Rotation does not work at certain zoom level

caused by not projecting points behind the perspective view,
even though this worked in 2.64 the values were flipped (rotating direction was 
reversed and the center point was flipped).

added V3D_PROJ_TEST_CLIP_NEAR, when omitted ED_view3d_project_*** will project 
points from behind a perspective view plane.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_view3d.h
    trunk/blender/source/blender/editors/mesh/editmesh_select.c
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/editors/physics/particle_edit.c
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/editors/space_view3d/view3d_project.c
    trunk/blender/source/blender/editors/space_view3d/view3d_select.c
    trunk/blender/source/blender/editors/transform/transform.c

Modified: trunk/blender/source/blender/editors/include/ED_view3d.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_view3d.h    2012-12-21 
03:02:36 UTC (rev 53226)
+++ trunk/blender/source/blender/editors/include/ED_view3d.h    2012-12-21 
03:49:47 UTC (rev 53227)
@@ -114,10 +114,11 @@
        V3D_PROJ_TEST_NOP        = 0,
        V3D_PROJ_TEST_CLIP_BB    = (1 << 0),
        V3D_PROJ_TEST_CLIP_WIN   = (1 << 1),
+       V3D_PROJ_TEST_CLIP_NEAR  = (1 << 2),
 } eV3DProjTest;
 
-#define V3D_PROJ_TEST_CLIP_DEFAULT (V3D_PROJ_TEST_CLIP_BB | 
V3D_PROJ_TEST_CLIP_WIN)
-#define V3D_PROJ_TEST_ALL          (V3D_PROJ_TEST_CLIP_BB | 
V3D_PROJ_TEST_CLIP_WIN)
+#define V3D_PROJ_TEST_CLIP_DEFAULT (V3D_PROJ_TEST_CLIP_BB | 
V3D_PROJ_TEST_CLIP_WIN | V3D_PROJ_TEST_CLIP_NEAR)
+#define V3D_PROJ_TEST_ALL          (V3D_PROJ_TEST_CLIP_BB | 
V3D_PROJ_TEST_CLIP_WIN | V3D_PROJ_TEST_CLIP_NEAR)
 
 
 /* view3d_iterators.c */

Modified: trunk/blender/source/blender/editors/mesh/editmesh_select.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_select.c 2012-12-21 
03:02:36 UTC (rev 53226)
+++ trunk/blender/source/blender/editors/mesh/editmesh_select.c 2012-12-21 
03:49:47 UTC (rev 53227)
@@ -1135,11 +1135,11 @@
                                /* We can't be sure this has already been 
set... */
                                ED_view3d_init_mats_rv3d(vc.obedit, vc.rv3d);
 
-                               if (ED_view3d_project_float_object(vc.ar, 
eed->v1->co, v1_co, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_OK) {
+                               if (ED_view3d_project_float_object(vc.ar, 
eed->v1->co, v1_co, V3D_PROJ_TEST_CLIP_NEAR) == V3D_PROJ_RET_OK) {
                                        length_1 = len_squared_v2v2(mvalf, 
v1_co);
                                }
 
-                               if (ED_view3d_project_float_object(vc.ar, 
eed->v2->co, v2_co, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_OK) {
+                               if (ED_view3d_project_float_object(vc.ar, 
eed->v2->co, v2_co, V3D_PROJ_TEST_CLIP_NEAR) == V3D_PROJ_RET_OK) {
                                        length_2 = len_squared_v2v2(mvalf, 
v2_co);
                                }
 #if 0
@@ -1166,7 +1166,7 @@
                                                float co[2], tdist;
 
                                                BM_face_calc_center_mean(f, 
cent);
-                                               if 
(ED_view3d_project_float_object(vc.ar, cent, co, V3D_PROJ_TEST_NOP) == 
V3D_PROJ_RET_OK) {
+                                               if 
(ED_view3d_project_float_object(vc.ar, cent, co, V3D_PROJ_TEST_CLIP_NEAR) == 
V3D_PROJ_RET_OK) {
                                                        tdist = 
len_squared_v2v2(mvalf, co);
                                                        if (tdist < best_dist) {
 /*                                                             printf("Best 
face: %p (%f)\n", f, tdist);*/

Modified: trunk/blender/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_tools.c  2012-12-21 
03:02:36 UTC (rev 53226)
+++ trunk/blender/source/blender/editors/mesh/editmesh_tools.c  2012-12-21 
03:49:47 UTC (rev 53227)
@@ -908,7 +908,7 @@
                BMOIter oiter;
                
                copy_v3_v3(min, curs);
-               view3d_get_view_aligned_coordinate(&vc, min, event->mval, 0);
+               view3d_get_view_aligned_coordinate(&vc, min, event->mval, 
FALSE);
 
                invert_m4_m4(vc.obedit->imat, vc.obedit->obmat);
                mul_m4_v3(vc.obedit->imat, min); // back in object space
@@ -2928,7 +2928,7 @@
        screen_vert_coords = sco = MEM_mallocN(bm->totvert * sizeof(float) * 2, 
__func__);
 
        BM_ITER_MESH_INDEX (bv, &iter, bm, BM_VERTS_OF_MESH, i) {
-               if (ED_view3d_project_float_object(ar, bv->co, *sco, 
V3D_PROJ_TEST_NOP) != V3D_PROJ_RET_OK) {
+               if (ED_view3d_project_float_object(ar, bv->co, *sco, 
V3D_PROJ_TEST_CLIP_NEAR) != V3D_PROJ_RET_OK) {
                        copy_v2_fl(*sco, FLT_MAX);  /* set error value */
                }
                BM_elem_index_set(bv, i); /* set_ok */

Modified: trunk/blender/source/blender/editors/physics/particle_edit.c
===================================================================
--- trunk/blender/source/blender/editors/physics/particle_edit.c        
2012-12-21 03:02:36 UTC (rev 53226)
+++ trunk/blender/source/blender/editors/physics/particle_edit.c        
2012-12-21 03:49:47 UTC (rev 53227)
@@ -421,7 +421,7 @@
        /* used to calculate here but all callers have  the screen_co already, 
so pass as arg */
 #if 0
        if (ED_view3d_project_int_global(data->vc.ar, co, screen_co,
-                                        V3D_PROJ_TEST_CLIP_BB | 
V3D_PROJ_TEST_CLIP_WIN) != V3D_PROJ_RET_OK)
+                                        V3D_PROJ_TEST_CLIP_BB | 
V3D_PROJ_TEST_CLIP_WIN | V3D_PROJ_TEST_CLIP_NEAR) != V3D_PROJ_RET_OK)
        {
                return 0;
        }
@@ -2812,7 +2812,7 @@
        if (edit->points[pa_index].flag & PEP_HIDE)
                return;
 
-       if (ED_view3d_project_int_global(ar, key->co, screen_co, 
V3D_PROJ_TEST_NOP) != V3D_PROJ_RET_OK)
+       if (ED_view3d_project_int_global(ar, key->co, screen_co, 
V3D_PROJ_TEST_CLIP_NEAR) != V3D_PROJ_RET_OK)
                return;
 
        rad2= data->rad * data->rad;
@@ -2837,7 +2837,7 @@
                /* calculate path time closest to root that was inside the 
circle */
                for (k=1, key++; k<=keys; k++, key++) {
 
-                       if ((ED_view3d_project_int_global(ar, key->co, 
screen_co, V3D_PROJ_TEST_NOP) != V3D_PROJ_RET_OK) ||
+                       if ((ED_view3d_project_int_global(ar, key->co, 
screen_co, V3D_PROJ_TEST_CLIP_NEAR) != V3D_PROJ_RET_OK) ||
                            key_test_depth(data, key->co, screen_co) == 0)
                        {
                                x0 = (float)screen_co[0];

Modified: trunk/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawobject.c      
2012-12-21 03:02:36 UTC (rev 53226)
+++ trunk/blender/source/blender/editors/space_view3d/drawobject.c      
2012-12-21 03:49:47 UTC (rev 53227)
@@ -755,7 +755,7 @@
                                               (vos->flag & 
V3D_CACHE_TEXT_GLOBALSPACE) ? rv3d->persmat : rv3d->persmatob,
                                               (vos->flag & 
V3D_CACHE_TEXT_LOCALCLIP) != 0,
                                               vos->vec, vos->sco,
-                                              V3D_PROJ_TEST_CLIP_BB | 
V3D_PROJ_TEST_CLIP_WIN) == V3D_PROJ_RET_OK)
+                                              V3D_PROJ_TEST_CLIP_BB | 
V3D_PROJ_TEST_CLIP_WIN | V3D_PROJ_TEST_CLIP_NEAR) == V3D_PROJ_RET_OK)
                {
                        tot++;
                }

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_project.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_project.c  
2012-12-21 03:02:36 UTC (rev 53226)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_project.c  
2012-12-21 03:49:47 UTC (rev 53227)
@@ -134,13 +134,19 @@
        vec4[3] = 1.0;
        mul_m4_v4(perspmat, vec4);
 
-       if (vec4[3] > (float)BL_NEAR_CLIP) {
-               const float fx = ((float)ar->winx / 2.0f) * (1.0f + vec4[0] / 
vec4[3]);
-               if (((flag & V3D_PROJ_TEST_CLIP_WIN) == 0) || (fx > 0 && fx < 
ar->winx)) {
-                       const float fy = ((float)ar->winy / 2.0f) * (1.0f + 
vec4[1] / vec4[3]);
+       if (((flag & V3D_PROJ_TEST_CLIP_NEAR) == 0)  || (vec4[3] > 
(float)BL_NEAR_CLIP)) {
+               const float scalar = (vec4[3] != 0.0f) ? (1.0f / vec4[3]): 0.0f;
+               const float fx = ((float)ar->winx / 2.0f) * (1.0f + (vec4[0] * 
scalar));
+               if (((flag & V3D_PROJ_TEST_CLIP_WIN) == 0) || (fx > 0.0f && fx 
< (float)ar->winx)) {
+                       const float fy = ((float)ar->winy / 2.0f) * (1.0f + 
(vec4[1] * scalar));
                        if (((flag & V3D_PROJ_TEST_CLIP_WIN) == 0) || (fy > 
0.0f && fy < (float)ar->winy)) {
                                r_co[0] = floorf(fx);
                                r_co[1] = floorf(fy);
+
+                               /* check if the point is behind the view, we 
need to flip in this case */
+                               if (UNLIKELY((flag & V3D_PROJ_TEST_CLIP_NEAR) 
== 0) && (vec4[3] < 0.0f)) {
+                                       negate_v2(r_co);
+                               }
                        }
                        else {
                                return V3D_PROJ_RET_CLIP_WIN;

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_select.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_select.c   
2012-12-21 03:02:36 UTC (rev 53226)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_select.c   
2012-12-21 03:49:47 UTC (rev 53227)
@@ -541,11 +541,11 @@
        if (ts->selectmode & SCE_SELECT_EDGE) {
                /* Does both bbsel and non-bbsel versions (need screen cos for 
both) */
                data.pass = 0;
-               mesh_foreachScreenEdge(vc, do_lasso_select_mesh__doSelectEdge, 
&data, V3D_PROJ_TEST_NOP);
+               mesh_foreachScreenEdge(vc, do_lasso_select_mesh__doSelectEdge, 
&data, V3D_PROJ_TEST_CLIP_NEAR);
 
                if (data.is_done == 0) {
                        data.pass = 1;
-                       mesh_foreachScreenEdge(vc, 
do_lasso_select_mesh__doSelectEdge, &data, V3D_PROJ_TEST_NOP);
+                       mesh_foreachScreenEdge(vc, 
do_lasso_select_mesh__doSelectEdge, &data, V3D_PROJ_TEST_CLIP_NEAR);
                }
        }
        
@@ -1448,7 +1448,7 @@
                                if (BASE_SELECTABLE(v3d, base)) {
                                        float screen_co[2];
                                        if (ED_view3d_project_float_global(ar, 
base->object->obmat[3], screen_co,
-                                                                          
V3D_PROJ_TEST_CLIP_BB | V3D_PROJ_TEST_CLIP_WIN) == V3D_PROJ_RET_OK)
+                                                                          
V3D_PROJ_TEST_CLIP_BB | V3D_PROJ_TEST_CLIP_WIN | V3D_PROJ_TEST_CLIP_NEAR) == 
V3D_PROJ_RET_OK)
                                        {
                                                float dist_temp = 
len_manhattan_v2v2(mval_fl, screen_co);
                                                if (base == BASACT) dist_temp 
+= 10.0f;
@@ -1803,11 +1803,11 @@
                /* Does both bbsel and non-bbsel versions (need screen cos for 
both) */
 
                data.pass = 0;
-               mesh_foreachScreenEdge(vc, do_mesh_box_select__doSelectEdge, 
&data, V3D_PROJ_TEST_NOP);
+               mesh_foreachScreenEdge(vc, do_mesh_box_select__doSelectEdge, 
&data, V3D_PROJ_TEST_CLIP_NEAR);
 
                if (data.is_done == 0) {
                        data.pass = 1;
-                       mesh_foreachScreenEdge(vc, 
do_mesh_box_select__doSelectEdge, &data, V3D_PROJ_TEST_NOP);
+                       mesh_foreachScreenEdge(vc, 
do_mesh_box_select__doSelectEdge, &data, V3D_PROJ_TEST_CLIP_NEAR);
                }
        }
        
@@ -2333,7 +2333,7 @@
                        edbm_backbuf_check_and_select_edges(vc->em, select == 
LEFTMOUSE);
                }
                else {
-                       mesh_foreachScreenEdge(vc, mesh_circle_doSelectEdge, 
&data, V3D_PROJ_TEST_NOP);
+                       mesh_foreachScreenEdge(vc, mesh_circle_doSelectEdge, 
&data, V3D_PROJ_TEST_CLIP_NEAR);
                }
        }
        
@@ -2670,7 +2670,7 @@
                if (BASE_SELECTABLE(vc->v3d, base) && ((base->flag & SELECT) != 
select_flag)) {
                        float screen_co[2];
                        if (ED_view3d_project_float_global(vc->ar, 
base->object->obmat[3], screen_co,
-                                                          
V3D_PROJ_TEST_CLIP_BB | V3D_PROJ_TEST_CLIP_WIN) == V3D_PROJ_RET_OK)
+                                                          
V3D_PROJ_TEST_CLIP_BB | V3D_PROJ_TEST_CLIP_WIN | V3D_PROJ_TEST_CLIP_NEAR) == 
V3D_PROJ_RET_OK)
                        {
                                if (len_squared_v2v2(mval_fl, screen_co) <= 
radius_squared) {
                                        ED_base_object_select(base, select);

Modified: trunk/blender/source/blender/editors/transform/transform.c

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to