refactor foreachScreen functions for clipping, now the projection clipping flag is...
authorCampbell Barton <ideasman42@gmail.com>
Wed, 10 Oct 2012 04:03:22 +0000 (04:03 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 10 Oct 2012 04:03:22 +0000 (04:03 +0000)
source/blender/editors/curve/editcurve.c
source/blender/editors/include/ED_object.h
source/blender/editors/include/ED_view3d.h
source/blender/editors/mesh/editmesh_select.c
source/blender/editors/object/object_iterators.c
source/blender/editors/object/object_lattice.c
source/blender/editors/space_view3d/view3d_select.c
source/blender/editors/space_view3d/view3d_view.c

index 14c233abdafe4ef3afd75d5ee7a49c49bfc15051..42b42a594ce6e30ad121500ff21f6f9151969c63 100644 (file)
@@ -3276,7 +3276,7 @@ static short findnearestNurbvert(ViewContext *vc, short sel, const int mval[2],
        data.mval_fl[1] = mval[1];
 
        ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d);
-       nurbs_foreachScreenVert(vc, findnearestNurbvert__doClosest, &data);
+       nurbs_foreachScreenVert(vc, findnearestNurbvert__doClosest, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
 
        *nurb = data.nurb;
        *bezt = data.bezt;
index aa145dfd9063796b23a7d5fc8b30e24430af3a56..f792d8b1a87696a941cb933d8d1f4035d54ac00e 100644 (file)
@@ -200,51 +200,46 @@ void ED_object_select_linked_by_id(struct bContext *C, struct ID *id);
 
 /* object_iterators.c */
 
-/* enum for passing to foreach functions to test RV3D_CLIPPING */
-typedef enum eV3DClipTest {
-       V3D_CLIP_TEST_OFF =            0, /* clipping is off */
-       V3D_CLIP_TEST_RV3D_CLIPPING =  1, /* clip single points */
-       V3D_CLIP_TEST_REGION =         2  /* use for edges to check if both verts are in the view, but not RV3D_CLIPPING */
-} eV3DClipTest;
+#include "ED_view3d.h"  /* XXX, needed for eV3DProjTest */
 
 /* foreach iterators */
 void mesh_foreachScreenVert(
         struct ViewContext *vc,
         void (*func)(void *userData, struct BMVert *eve, const float screen_co[2], int index),
-        void *userData, eV3DClipTest clipVerts);
+        void *userData, const eV3DProjTest clip_flag);
 void mesh_foreachScreenEdge(
         struct ViewContext *vc,
         void (*func)(void *userData, struct BMEdge *eed, const float screen_co_a[2], const float screen_co_b[2],
                      int index),
-        void *userData, eV3DClipTest clipVerts);
+        void *userData, const eV3DProjTest clip_flag);
 void mesh_foreachScreenFace(
         struct ViewContext *vc,
         void (*func)(void *userData, struct BMFace *efa, const float screen_co[2], int index),
-        void *userData);
+        void *userData, const eV3DProjTest clip_flag);
 void nurbs_foreachScreenVert(
         struct ViewContext *vc,
         void (*func)(void *userData, struct Nurb *nu, struct BPoint *bp, struct BezTriple *bezt,
                      int beztindex, const float screen_co[2]),
-        void *userData);
+        void *userData, const eV3DProjTest clip_flag);
 void mball_foreachScreenElem(
         struct ViewContext *vc,
         void (*func)(void *userData, struct MetaElem *ml, const float screen_co[2]),
-        void *userData);
+        void *userData, const eV3DProjTest clip_flag);
 void lattice_foreachScreenVert(
         struct ViewContext *vc,
         void (*func)(void *userData, struct BPoint *bp,
                      const float screen_co[2]),
-        void *userData);
+        void *userData, const eV3DProjTest clip_flag);
 void armature_foreachScreenBone(
         struct ViewContext *vc,
         void (*func)(void *userData, struct EditBone *ebone,
                      const float screen_co_a[2], const float screen_co_b[2]),
-        void *userData);
+        void *userData, const eV3DProjTest clip_flag);
 void pose_foreachScreenBone(
         struct ViewContext *vc,
         void (*func)(void *userData, struct bPoseChannel *pchan,
                      const float screen_co_a[2], const float screen_co_b[2]),
-        void *userData);
+        void *userData, const eV3DProjTest clip_flag);
 
 #ifdef __cplusplus
 }
index ce8b874ae27db2b723e0a78a716de9a916d36e12..d0243527b8323647041c10a7c84d7aa5bd2939e5 100644 (file)
@@ -50,6 +50,8 @@ struct Nurb;
 struct Object;
 struct RegionView3D;
 struct Scene;
+struct bScreen;
+struct ScrArea;
 struct View3D;
 struct ViewContext;
 struct bContext;
@@ -126,24 +128,27 @@ typedef enum {
        V3D_PROJ_TEST_CLIP_WIN   = (1 << 1),
 } 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)
+
 
 /* *** short *** */
 eV3DProjStatus ED_view3d_project_short_ex(struct ARegion *ar, float perspmat[4][4], const int is_local,
-                                          const float co[3], short r_co[2], eV3DProjTest flag);
-eV3DProjStatus ED_view3d_project_short_global(struct ARegion *ar, const float co[3], short r_co[2], eV3DProjTest flag);
-eV3DProjStatus ED_view3d_project_short_object(struct ARegion *ar, const float co[3], short r_co[2], eV3DProjTest flag);
+                                          const float co[3], short r_co[2], const eV3DProjTest flag);
+eV3DProjStatus ED_view3d_project_short_global(struct ARegion *ar, const float co[3], short r_co[2], const eV3DProjTest flag);
+eV3DProjStatus ED_view3d_project_short_object(struct ARegion *ar, const float co[3], short r_co[2], const eV3DProjTest flag);
 
 /* *** int *** */
 eV3DProjStatus ED_view3d_project_int_ex(struct ARegion *ar, float perspmat[4][4], const int is_local,
-                                        const float co[3], int r_co[2], eV3DProjTest flag);
-eV3DProjStatus ED_view3d_project_int_global(struct ARegion *ar, const float co[3], int r_co[2], eV3DProjTest flag);
-eV3DProjStatus ED_view3d_project_int_object(struct ARegion *ar, const float co[3], int r_co[2], eV3DProjTest flag);
+                                        const float co[3], int r_co[2], const eV3DProjTest flag);
+eV3DProjStatus ED_view3d_project_int_global(struct ARegion *ar, const float co[3], int r_co[2], const eV3DProjTest flag);
+eV3DProjStatus ED_view3d_project_int_object(struct ARegion *ar, const float co[3], int r_co[2], const eV3DProjTest flag);
 
 /* *** float *** */
 eV3DProjStatus ED_view3d_project_float_ex(struct ARegion *ar, float perspmat[4][4], const int is_local,
-                                        const float co[3], float r_co[2], eV3DProjTest flag);
-eV3DProjStatus ED_view3d_project_float_global(struct ARegion *ar, const float co[3], float r_co[2], eV3DProjTest flag);
-eV3DProjStatus ED_view3d_project_float_object(struct ARegion *ar, const float co[3], float r_co[2], eV3DProjTest flag);
+                                        const float co[3], float r_co[2], const eV3DProjTest flag);
+eV3DProjStatus ED_view3d_project_float_global(struct ARegion *ar, const float co[3], float r_co[2], const eV3DProjTest flag);
+eV3DProjStatus ED_view3d_project_float_object(struct ARegion *ar, const float co[3], float r_co[2], const eV3DProjTest flag);
 
 void ED_view3d_project_float_v2_m4(const struct ARegion *a, const float co[3], float r_co[2], float mat[4][4]);
 void ED_view3d_project_float_v3_m4(struct ARegion *a, const float co[3], float r_co[3], float mat[4][4]);
index e6a2c065bbf6f995ba1432b27badc85c43c7ae56..32643cb20cd549e387e016cd521d76611e33522c 100644 (file)
@@ -433,11 +433,11 @@ BMVert *EDBM_vert_find_nearest(ViewContext *vc, float *r_dist, const short sel,
 
                ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d);
 
-               mesh_foreachScreenVert(vc, findnearestvert__doClosest, &data, V3D_CLIP_TEST_RV3D_CLIPPING);
+               mesh_foreachScreenVert(vc, findnearestvert__doClosest, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
 
                if (data.dist > 3) {
                        data.pass = 1;
-                       mesh_foreachScreenVert(vc, findnearestvert__doClosest, &data, V3D_CLIP_TEST_RV3D_CLIPPING);
+                       mesh_foreachScreenVert(vc, findnearestvert__doClosest, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
                }
 
                *r_dist = data.dist;
@@ -525,7 +525,7 @@ BMEdge *EDBM_edge_find_nearest(ViewContext *vc, float *r_dist)
                data.closest = NULL;
                ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d);
 
-               mesh_foreachScreenEdge(vc, findnearestedge__doClosest, &data, V3D_CLIP_TEST_REGION);
+               mesh_foreachScreenEdge(vc, findnearestedge__doClosest, &data, V3D_PROJ_TEST_CLIP_WIN);
 
                *r_dist = data.dist;
                return data.closest;
@@ -588,7 +588,7 @@ BMFace *EDBM_face_find_nearest(ViewContext *vc, float *r_dist)
                        data.dist = 0x7FFF;     /* largest short */
                        data.toFace = efa;
 
-                       mesh_foreachScreenFace(vc, findnearestface__getDistance, &data);
+                       mesh_foreachScreenFace(vc, findnearestface__getDistance, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
 
                        if ((vc->em->selectmode == SCE_SELECT_FACE) || (data.dist < *r_dist)) {  /* only faces, no dist check */
                                *r_dist = data.dist;
@@ -617,12 +617,12 @@ BMFace *EDBM_face_find_nearest(ViewContext *vc, float *r_dist)
                ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d);
 
                data.pass = 0;
-               mesh_foreachScreenFace(vc, findnearestface__doClosest, &data);
+               mesh_foreachScreenFace(vc, findnearestface__doClosest, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
 
                if (data.dist > 3.0f) {
                        data.pass = 1;
                        ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d);
-                       mesh_foreachScreenFace(vc, findnearestface__doClosest, &data);
+                       mesh_foreachScreenFace(vc, findnearestface__doClosest, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
                }
 
                *r_dist = data.dist;
index 7e0d00ee5ac4749ccc889ef8ee91c8fc5babf4d5..1d38db9d59b7d7735a2775fa2727d9670b607659 100644 (file)
@@ -31,7 +31,8 @@
 #include "DNA_object_types.h"
 
 #include "BLI_utildefines.h"
-#include "BLI_blenlib.h"
+#include "BLI_listbase.h"
+#include "BLI_rect.h"
 
 #include "BKE_armature.h"
 #include "BKE_curve.h"
@@ -51,7 +52,7 @@ typedef struct foreachScreenVert_userData {
        void (*func)(void *userData, BMVert *eve, const float screen_co_b[2], int index);
        void *userData;
        ViewContext vc;
-       eV3DClipTest clipVerts;
+       eV3DProjTest clip_flag;
 } foreachScreenVert_userData;
 
 /* user data structures for derived mesh callbacks */
@@ -60,13 +61,14 @@ typedef struct foreachScreenEdge_userData {
        void *userData;
        ViewContext vc;
        rctf win_rect; /* copy of: vc.ar->winx/winy, use for faster tests, minx/y will always be 0 */
-       eV3DClipTest clipVerts;
+       eV3DProjTest clip_flag;
 } foreachScreenEdge_userData;
 
 typedef struct foreachScreenFace_userData {
        void (*func)(void *userData, BMFace *efa, const float screen_co_b[2], int index);
        void *userData;
        ViewContext vc;
+       eV3DProjTest clip_flag;
 } foreachScreenFace_userData;
 
 
@@ -84,12 +86,9 @@ static void mesh_foreachScreenVert__mapFunc(void *userData, int index, const flo
        BMVert *eve = EDBM_vert_at_index(data->vc.em, index);
 
        if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
-               const eV3DProjTest flag = (data->clipVerts == V3D_CLIP_TEST_OFF) ?
-                           V3D_PROJ_TEST_NOP :
-                           V3D_PROJ_RET_CLIP_BB | V3D_PROJ_RET_CLIP_WIN;
                float screen_co[2];
 
-               if (ED_view3d_project_float_object(data->vc.ar, co, screen_co, flag) != V3D_PROJ_RET_OK) {
+               if (ED_view3d_project_float_object(data->vc.ar, co, screen_co, data->clip_flag) != V3D_PROJ_RET_OK) {
                        return;
                }
 
@@ -100,7 +99,7 @@ static void mesh_foreachScreenVert__mapFunc(void *userData, int index, const flo
 void mesh_foreachScreenVert(
         ViewContext *vc,
         void (*func)(void *userData, BMVert *eve, const float screen_co[2], int index),
-        void *userData, eV3DClipTest clipVerts)
+        void *userData, eV3DProjTest clip_flag)
 {
        foreachScreenVert_userData data;
        DerivedMesh *dm = editbmesh_get_derived_cage(vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
@@ -108,10 +107,11 @@ void mesh_foreachScreenVert(
        data.vc = *vc;
        data.func = func;
        data.userData = userData;
-       data.clipVerts = clipVerts;
+       data.clip_flag = clip_flag;
 
-       if (clipVerts != V3D_CLIP_TEST_OFF)
+       if (clip_flag & V3D_PROJ_TEST_CLIP_BB) {
                ED_view3d_clipping_local(vc->rv3d, vc->obedit->obmat);  /* for local clipping lookups */
+       }
 
        EDBM_index_arrays_init(vc->em, 1, 0, 0);
        dm->foreachMappedVert(dm, mesh_foreachScreenVert__mapFunc, &data);
@@ -131,25 +131,16 @@ static void mesh_foreachScreenEdge__mapFunc(void *userData, int index, const flo
                float screen_co_a[2];
                float screen_co_b[2];
 
-               const eV3DProjTest flag = (data->clipVerts == V3D_CLIP_TEST_RV3D_CLIPPING) ?
-                           V3D_PROJ_TEST_CLIP_BB | V3D_PROJ_TEST_CLIP_WIN :
-                           V3D_PROJ_TEST_NOP;
-
-               if (ED_view3d_project_float_object(data->vc.ar, v0co, screen_co_a, flag) != V3D_PROJ_RET_OK) {
+               if (ED_view3d_project_float_object(data->vc.ar, v0co, screen_co_a, data->clip_flag) != V3D_PROJ_RET_OK) {
                        return;
                }
-               if (ED_view3d_project_float_object(data->vc.ar, v1co, screen_co_b, flag) != V3D_PROJ_RET_OK) {
+               if (ED_view3d_project_float_object(data->vc.ar, v1co, screen_co_b, data->clip_flag) != V3D_PROJ_RET_OK) {
                        return;
                }
 
-               if (data->clipVerts == V3D_CLIP_TEST_RV3D_CLIPPING) {
-                       /* pass */
-               }
-               else {
-                       if (data->clipVerts == V3D_CLIP_TEST_REGION) {
-                               if (!BLI_rctf_isect_segment(&data->win_rect, screen_co_a, screen_co_b)) {
-                                       return;
-                               }
+               if (data->clip_flag & V3D_PROJ_TEST_CLIP_WIN) {
+                       if (!BLI_rctf_isect_segment(&data->win_rect, screen_co_a, screen_co_b)) {
+                               return;
                        }
                }
 
@@ -160,7 +151,7 @@ static void mesh_foreachScreenEdge__mapFunc(void *userData, int index, const flo
 void mesh_foreachScreenEdge(
         ViewContext *vc,
         void (*func)(void *userData, BMEdge *eed, const float screen_co_a[2], const float screen_co_b[2], int index),
-        void *userData, eV3DClipTest clipVerts)
+        void *userData, eV3DProjTest clip_flag)
 {
        foreachScreenEdge_userData data;
        DerivedMesh *dm = editbmesh_get_derived_cage(vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
@@ -174,10 +165,11 @@ void mesh_foreachScreenEdge(
 
        data.func = func;
        data.userData = userData;
-       data.clipVerts = clipVerts;
+       data.clip_flag = clip_flag;
 
-       if (clipVerts != V3D_CLIP_TEST_OFF)
+       if (clip_flag & V3D_PROJ_TEST_CLIP_BB) {
                ED_view3d_clipping_local(vc->rv3d, vc->obedit->obmat);  /* for local clipping lookups */
+       }
 
        EDBM_index_arrays_init(vc->em, 0, 1, 0);
        dm->foreachMappedEdge(dm, mesh_foreachScreenEdge__mapFunc, &data);
@@ -195,8 +187,7 @@ static void mesh_foreachScreenFace__mapFunc(void *userData, int index, const flo
 
        if (efa && !BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
                float screen_co[2];
-               if (ED_view3d_project_float_object(data->vc.ar, cent, screen_co,
-                                                  V3D_PROJ_TEST_CLIP_BB | V3D_PROJ_TEST_CLIP_WIN) == V3D_PROJ_RET_OK)
+               if (ED_view3d_project_float_object(data->vc.ar, cent, screen_co, data->clip_flag) == V3D_PROJ_RET_OK)
                {
                        data->func(data->userData, efa, screen_co, index);
                }
@@ -206,7 +197,7 @@ static void mesh_foreachScreenFace__mapFunc(void *userData, int index, const flo
 void mesh_foreachScreenFace(
         ViewContext *vc,
         void (*func)(void *userData, BMFace *efa, const float screen_co_b[2], int index),
-        void *userData)
+        void *userData, const eV3DProjTest clip_flag)
 {
        foreachScreenFace_userData data;
        DerivedMesh *dm = editbmesh_get_derived_cage(vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
@@ -214,6 +205,7 @@ void mesh_foreachScreenFace(
        data.vc = *vc;
        data.func = func;
        data.userData = userData;
+       data.clip_flag = clip_flag;
 
        ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d);
 
@@ -229,14 +221,16 @@ void mesh_foreachScreenFace(
 void nurbs_foreachScreenVert(
         ViewContext *vc,
         void (*func)(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, const float screen_co_b[2]),
-        void *userData)
+        void *userData, const eV3DProjTest clip_flag)
 {
        Curve *cu = vc->obedit->data;
        Nurb *nu;
        int i;
        ListBase *nurbs = BKE_curve_editNurbs_get(cu);
 
-       ED_view3d_clipping_local(vc->rv3d, vc->obedit->obmat); /* for local clipping lookups */
+       if (clip_flag & V3D_PROJ_TEST_CLIP_BB) {
+               ED_view3d_clipping_local(vc->rv3d, vc->obedit->obmat); /* for local clipping lookups */
+       }
 
        for (nu = nurbs->first; nu; nu = nu->next) {
                if (nu->type == CU_BEZIER) {
@@ -296,15 +290,14 @@ void nurbs_foreachScreenVert(
 void mball_foreachScreenElem(
         struct ViewContext *vc,
         void (*func)(void *userData, struct MetaElem *ml, const float screen_co_b[2]),
-        void *userData)
+        void *userData, const eV3DProjTest clip_flag)
 {
        MetaBall *mb = (MetaBall *)vc->obedit->data;
        MetaElem *ml;
 
        for (ml = mb->editelems->first; ml; ml = ml->next) {
                float screen_co[2];
-               if (ED_view3d_project_float_object(vc->ar, &ml->x, screen_co,
-                                                  V3D_PROJ_TEST_CLIP_BB | V3D_PROJ_TEST_CLIP_WIN) == V3D_PROJ_RET_OK)
+               if (ED_view3d_project_float_object(vc->ar, &ml->x, screen_co, clip_flag) == V3D_PROJ_RET_OK)
                {
                        func(userData, ml, screen_co);
                }
@@ -313,7 +306,10 @@ void mball_foreachScreenElem(
 
 /* ------------------------------------------------------------------------ */
 
-void lattice_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, BPoint *bp, const float screen_co[2]), void *userData)
+void lattice_foreachScreenVert(
+        ViewContext *vc,
+        void (*func)(void *userData, BPoint *bp, const float screen_co[2]),
+        void *userData, const eV3DProjTest clip_flag)
 {
        Object *obedit = vc->obedit;
        Lattice *lt = obedit->data;
@@ -322,14 +318,14 @@ void lattice_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, BPo
        float *co = dl ? dl->verts : NULL;
        int i, N = lt->editlatt->latt->pntsu * lt->editlatt->latt->pntsv * lt->editlatt->latt->pntsw;
 
-       ED_view3d_clipping_local(vc->rv3d, obedit->obmat); /* for local clipping lookups */
+       if (clip_flag & V3D_PROJ_TEST_CLIP_BB) {
+               ED_view3d_clipping_local(vc->rv3d, obedit->obmat); /* for local clipping lookups */
+       }
 
        for (i = 0; i < N; i++, bp++, co += 3) {
                if (bp->hide == 0) {
                        float screen_co[2];
-                       if (ED_view3d_project_float_object(vc->ar, dl ? co : bp->vec, screen_co,
-                                                          V3D_PROJ_RET_CLIP_BB | V3D_PROJ_RET_CLIP_WIN) == V3D_PROJ_RET_OK)
-                       {
+                       if (ED_view3d_project_float_object(vc->ar, dl ? co : bp->vec, screen_co, clip_flag) == V3D_PROJ_RET_OK) {
                                func(userData, bp, screen_co);
                        }
                }
@@ -342,7 +338,7 @@ void lattice_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, BPo
 void armature_foreachScreenBone(
         struct ViewContext *vc,
         void (*func)(void *userData, struct EditBone *ebone, const float screen_co_a[2], const float screen_co_b[2]),
-        void *userData)
+        void *userData, const eV3DProjTest clip_flag)
 {
        bArmature *arm = vc->obedit->data;
        EditBone *ebone;
@@ -353,9 +349,7 @@ void armature_foreachScreenBone(
                        int points_proj_tot = 0;
 
                        /* project head location to screenspace */
-                       if (ED_view3d_project_float_object(vc->ar, ebone->head, screen_co_a,
-                                                          V3D_PROJ_TEST_CLIP_BB | V3D_PROJ_TEST_CLIP_WIN) == V3D_PROJ_RET_OK)
-                       {
+                       if (ED_view3d_project_float_object(vc->ar, ebone->head, screen_co_a, clip_flag) == V3D_PROJ_RET_OK) {
                                points_proj_tot++;
                        }
                        else {
@@ -364,9 +358,7 @@ void armature_foreachScreenBone(
                        }
 
                        /* project tail location to screenspace */
-                       if (ED_view3d_project_float_object(vc->ar, ebone->tail, screen_co_b,
-                                                          V3D_PROJ_TEST_CLIP_BB | V3D_PROJ_TEST_CLIP_WIN) == V3D_PROJ_RET_OK)
-                       {
+                       if (ED_view3d_project_float_object(vc->ar, ebone->tail, screen_co_b, clip_flag) == V3D_PROJ_RET_OK) {
                                points_proj_tot++;
                        }
                        else {
@@ -388,7 +380,7 @@ void armature_foreachScreenBone(
 void pose_foreachScreenBone(
         struct ViewContext *vc,
         void (*func)(void *userData, struct bPoseChannel *pchan, const float screen_co_a[2], const float screen_co_b[2]),
-        void *userData)
+        void *userData, const eV3DProjTest clip_flag)
 {
        bArmature *arm = vc->obact->data;
        bPose *pose = vc->obact->pose;
@@ -400,9 +392,7 @@ void pose_foreachScreenBone(
                        int points_proj_tot = 0;
 
                        /* project head location to screenspace */
-                       if (ED_view3d_project_float_object(vc->ar, pchan->pose_head, screen_co_a,
-                                                          V3D_PROJ_TEST_CLIP_BB | V3D_PROJ_TEST_CLIP_WIN) == V3D_PROJ_RET_OK)
-                       {
+                       if (ED_view3d_project_float_object(vc->ar, pchan->pose_head, screen_co_a, clip_flag) == V3D_PROJ_RET_OK) {
                                points_proj_tot++;
                        }
                        else {
@@ -411,9 +401,7 @@ void pose_foreachScreenBone(
                        }
 
                        /* project tail location to screenspace */
-                       if (ED_view3d_project_float_object(vc->ar, pchan->pose_tail, screen_co_b,
-                                                          V3D_PROJ_TEST_CLIP_BB | V3D_PROJ_TEST_CLIP_WIN) == V3D_PROJ_RET_OK)
-                       {
+                       if (ED_view3d_project_float_object(vc->ar, pchan->pose_tail, screen_co_b, clip_flag) == V3D_PROJ_RET_OK) {
                                points_proj_tot++;
                        }
                        else {
index aa9e4d8377463dd2e4acf80f64f95d67c53dddfe..d8974ea677c921b0474fa6ca6ca52544cbae2cee 100644 (file)
@@ -330,7 +330,7 @@ static BPoint *findnearestLattvert(ViewContext *vc, const int mval[2], int sel)
        data.mval_fl[1] = mval[1];
 
        ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d);
-       lattice_foreachScreenVert(vc, findnearestLattvert__doClosest, &data);
+       lattice_foreachScreenVert(vc, findnearestLattvert__doClosest, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
 
        return data.bp;
 }
index afd69d56d21372ccfbfda5d1d148845e627ab3f0..dc3cfa41e370c8905de64664fb31ba55f38121b9 100644 (file)
@@ -398,6 +398,7 @@ static void do_lasso_select_pose__doSelectBone(void *userData, struct bPoseChann
 }
 static void do_lasso_select_pose(ViewContext *vc, Object *ob, const int mcords[][2], short moves, short select)
 {
+       ViewContext vc_tmp;
        LassoSelectUserData data;
        rcti rect;
        
@@ -405,13 +406,16 @@ static void do_lasso_select_pose(ViewContext *vc, Object *ob, const int mcords[]
                return;
        }
 
+       vc_tmp = *vc;
+       vc_tmp.obact = ob;
+
        BLI_lasso_boundbox(&rect, mcords, moves);
 
        view3d_userdata_lassoselect_init(&data, vc, &rect, mcords, moves, select);
 
        ED_view3d_init_mats_rv3d(vc->obact, vc->rv3d);
 
-       pose_foreachScreenBone(vc, do_lasso_select_pose__doSelectBone, &data);
+       pose_foreachScreenBone(&vc_tmp, do_lasso_select_pose__doSelectBone, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
 
        if (data.is_change) {
                bArmature *arm = ob->data;
@@ -531,17 +535,17 @@ static void do_lasso_select_mesh(ViewContext *vc, const int mcords[][2], short m
                        edbm_backbuf_check_and_select_verts(vc->em, select);
                }
                else {
-                       mesh_foreachScreenVert(vc, do_lasso_select_mesh__doSelectVert, &data, V3D_CLIP_TEST_RV3D_CLIPPING);
+                       mesh_foreachScreenVert(vc, do_lasso_select_mesh__doSelectVert, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
                }
        }
        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_CLIP_TEST_OFF);
+               mesh_foreachScreenEdge(vc, do_lasso_select_mesh__doSelectEdge, &data, V3D_PROJ_TEST_NOP);
 
                if (data.is_done == 0) {
                        data.pass = 1;
-                       mesh_foreachScreenEdge(vc, do_lasso_select_mesh__doSelectEdge, &data, V3D_CLIP_TEST_OFF);
+                       mesh_foreachScreenEdge(vc, do_lasso_select_mesh__doSelectEdge, &data, V3D_PROJ_TEST_NOP);
                }
        }
        
@@ -550,7 +554,7 @@ static void do_lasso_select_mesh(ViewContext *vc, const int mcords[][2], short m
                        edbm_backbuf_check_and_select_faces(vc->em, select);
                }
                else {
-                       mesh_foreachScreenFace(vc, do_lasso_select_mesh__doSelectFace, &data);
+                       mesh_foreachScreenFace(vc, do_lasso_select_mesh__doSelectFace, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
                }
        }
        
@@ -604,7 +608,7 @@ static void do_lasso_select_curve(ViewContext *vc, const int mcords[][2], short
                CU_deselect_all(vc->obedit);
 
        ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
-       nurbs_foreachScreenVert(vc, do_lasso_select_curve__doSelect, &data);
+       nurbs_foreachScreenVert(vc, do_lasso_select_curve__doSelect, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
 }
 
 static void do_lasso_select_lattice__doSelect(void *userData, BPoint *bp, const float screen_co[2])
@@ -629,7 +633,7 @@ static void do_lasso_select_lattice(ViewContext *vc, const int mcords[][2], shor
                ED_setflagsLatt(vc->obedit, 0);
 
        ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
-       lattice_foreachScreenVert(vc, do_lasso_select_lattice__doSelect, &data);
+       lattice_foreachScreenVert(vc, do_lasso_select_lattice__doSelect, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
 }
 
 static void do_lasso_select_armature__doSelectBone(void *userData, struct EditBone *ebone, const float screen_co_a[2], const float screen_co_b[2])
@@ -697,7 +701,7 @@ static void do_lasso_select_armature(ViewContext *vc, const int mcords[][2], sho
        if (extend == 0 && select)
                ED_armature_deselect_all_visible(vc->obedit);
 
-       armature_foreachScreenBone(vc, do_lasso_select_armature__doSelectBone, &data);
+       armature_foreachScreenBone(vc, do_lasso_select_armature__doSelectBone, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
 
        if (data.is_change) {
                bArmature *arm = vc->obedit->data;
@@ -734,7 +738,7 @@ static void do_lasso_select_meta(ViewContext *vc, const int mcords[][2], short m
 
        ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d);
 
-       mball_foreachScreenElem(vc, do_lasso_select_mball__doSelectElem, &data);
+       mball_foreachScreenElem(vc, do_lasso_select_mball__doSelectElem, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
 }
 
 static int do_paintvert_box_select(ViewContext *vc, rcti *rect, int select, int extend)
@@ -1707,7 +1711,7 @@ static int do_nurbs_box_select(ViewContext *vc, rcti *rect, int select, int exte
                CU_deselect_all(vc->obedit);
 
        ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
-       nurbs_foreachScreenVert(vc, do_nurbs_box_select__doSelect, &data);
+       nurbs_foreachScreenVert(vc, do_nurbs_box_select__doSelect, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
 
        return OPERATOR_FINISHED;
 }
@@ -1730,7 +1734,7 @@ static int do_lattice_box_select(ViewContext *vc, rcti *rect, int select, int ex
                ED_setflagsLatt(vc->obedit, 0);
 
        ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
-       lattice_foreachScreenVert(vc, do_lattice_box_select__doSelect, &data);
+       lattice_foreachScreenVert(vc, do_lattice_box_select__doSelect, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
        
        return OPERATOR_FINISHED;
 }
@@ -1791,18 +1795,18 @@ static int do_mesh_box_select(ViewContext *vc, rcti *rect, int select, int exten
                        edbm_backbuf_check_and_select_verts(vc->em, select);
                }
                else {
-                       mesh_foreachScreenVert(vc, do_mesh_box_select__doSelectVert, &data, V3D_CLIP_TEST_RV3D_CLIPPING);
+                       mesh_foreachScreenVert(vc, do_mesh_box_select__doSelectVert, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
                }
        }
        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_mesh_box_select__doSelectEdge, &data, V3D_CLIP_TEST_OFF);
+               mesh_foreachScreenEdge(vc, do_mesh_box_select__doSelectEdge, &data, V3D_PROJ_TEST_NOP);
 
                if (data.is_done == 0) {
                        data.pass = 1;
-                       mesh_foreachScreenEdge(vc, do_mesh_box_select__doSelectEdge, &data, V3D_CLIP_TEST_OFF);
+                       mesh_foreachScreenEdge(vc, do_mesh_box_select__doSelectEdge, &data, V3D_PROJ_TEST_NOP);
                }
        }
        
@@ -1811,7 +1815,7 @@ static int do_mesh_box_select(ViewContext *vc, rcti *rect, int select, int exten
                        edbm_backbuf_check_and_select_faces(vc->em, select);
                }
                else {
-                       mesh_foreachScreenFace(vc, do_mesh_box_select__doSelectFace, &data);
+                       mesh_foreachScreenFace(vc, do_mesh_box_select__doSelectFace, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
                }
        }
        
@@ -2321,7 +2325,7 @@ static void mesh_circle_select(ViewContext *vc, int select, const int mval[2], f
                        edbm_backbuf_check_and_select_verts(vc->em, select == LEFTMOUSE);
                }
                else {
-                       mesh_foreachScreenVert(vc, mesh_circle_doSelectVert, &data, V3D_CLIP_TEST_RV3D_CLIPPING);
+                       mesh_foreachScreenVert(vc, mesh_circle_doSelectVert, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
                }
        }
 
@@ -2330,7 +2334,7 @@ static void mesh_circle_select(ViewContext *vc, int select, const int mval[2], f
                        edbm_backbuf_check_and_select_edges(vc->em, select == LEFTMOUSE);
                }
                else {
-                       mesh_foreachScreenEdge(vc, mesh_circle_doSelectEdge, &data, V3D_CLIP_TEST_OFF);
+                       mesh_foreachScreenEdge(vc, mesh_circle_doSelectEdge, &data, V3D_PROJ_TEST_NOP);
                }
        }
        
@@ -2339,7 +2343,7 @@ static void mesh_circle_select(ViewContext *vc, int select, const int mval[2], f
                        edbm_backbuf_check_and_select_faces(vc->em, select == LEFTMOUSE);
                }
                else {
-                       mesh_foreachScreenFace(vc, mesh_circle_doSelectFace, &data);
+                       mesh_foreachScreenFace(vc, mesh_circle_doSelectFace, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
                }
        }
 
@@ -2422,7 +2426,7 @@ static void nurbscurve_circle_select(ViewContext *vc, int select, const int mval
        view3d_userdata_circleselect_init(&data, vc, select, mval, rad);
 
        ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
-       nurbs_foreachScreenVert(vc, nurbscurve_circle_doSelect, &data);
+       nurbs_foreachScreenVert(vc, nurbscurve_circle_doSelect, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
 }
 
 
@@ -2441,7 +2445,7 @@ static void lattice_circle_select(ViewContext *vc, int select, const int mval[2]
        view3d_userdata_circleselect_init(&data, vc, select, mval, rad);
 
        ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
-       lattice_foreachScreenVert(vc, latticecurve_circle_doSelect, &data);
+       lattice_foreachScreenVert(vc, latticecurve_circle_doSelect, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
 }
 
 
@@ -2510,7 +2514,7 @@ static void pose_circle_select(ViewContext *vc, int select, const int mval[2], f
 
        ED_view3d_init_mats_rv3d(vc->obact, vc->rv3d); /* for foreach's screen/vert projection */
        
-       pose_foreachScreenBone(vc, do_circle_select_pose__doSelectBone, &data);
+       pose_foreachScreenBone(vc, do_circle_select_pose__doSelectBone, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
 
        if (data.is_change) {
                bArmature *arm = vc->obact->data;
@@ -2597,7 +2601,7 @@ static void armature_circle_select(ViewContext *vc, int select, const int mval[2
 
        ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d);
 
-       armature_foreachScreenBone(vc, do_circle_select_armature__doSelectBone, &data);
+       armature_foreachScreenBone(vc, do_circle_select_armature__doSelectBone, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
 
        if (data.is_change) {
                ED_armature_sync_selection(arm->edbo);
@@ -2624,7 +2628,7 @@ static void mball_circle_select(ViewContext *vc, int select, const int mval[2],
 
        ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d);
 
-       mball_foreachScreenElem(vc, do_circle_select_mball__doSelectElem, &data);
+       mball_foreachScreenElem(vc, do_circle_select_mball__doSelectElem, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
 }
 
 /** Callbacks for circle selection in Editmode */
index e4a6d7e1b17915e0bef197e17224360fffb37f7e..aee9d9d332a2eda803496d50ee51dea0846f9559 100644 (file)
@@ -860,8 +860,7 @@ void ED_view3d_project_float_v3_m4(ARegion *ar, const float vec[3], float r_co[3
 
 eV3DProjStatus ED_view3d_project_base(struct ARegion *ar, struct Base *base)
 {
-       eV3DProjStatus ret = ED_view3d_project_short_global(ar, base->object->obmat[3], &base->sx,
-                                                           V3D_PROJ_TEST_CLIP_BB | V3D_PROJ_TEST_CLIP_WIN);
+       eV3DProjStatus ret = ED_view3d_project_short_global(ar, base->object->obmat[3], &base->sx, V3D_PROJ_TEST_CLIP_DEFAULT);
 
        if (ret != V3D_PROJ_RET_OK) {
                base->sx = IS_CLIPPED;
@@ -912,10 +911,13 @@ int ED_view3d_boundbox_clip(RegionView3D *rv3d, float obmat[][4], BoundBox *bb)
  */
 static eV3DProjStatus ed_view3d_project__internal(ARegion *ar,
                                                   float perspmat[4][4], const int is_local,  /* normally hidden */
-                                                  const float co[3], float r_co[2], eV3DProjTest flag)
+                                                  const float co[3], float r_co[2], const eV3DProjTest flag)
 {
        float fx, fy, vec4[4];
 
+       /* check for bad flags */
+       BLI_assert((flag & V3D_PROJ_TEST_ALL) == flag);
+
        if (flag & V3D_PROJ_TEST_CLIP_BB) {
                RegionView3D *rv3d = ar->regiondata;
                if (rv3d->rflag & RV3D_CLIPPING) {
@@ -953,7 +955,7 @@ static eV3DProjStatus ed_view3d_project__internal(ARegion *ar,
 }
 
 eV3DProjStatus ED_view3d_project_short_ex(ARegion *ar, float perspmat[4][4], const int is_local,
-                                          const float co[3], short r_co[2], eV3DProjTest flag)
+                                          const float co[3], short r_co[2], const eV3DProjTest flag)
 {
        float tvec[2];
        eV3DProjStatus ret = ed_view3d_project__internal(ar, perspmat, is_local, co, tvec, flag);
@@ -972,7 +974,7 @@ eV3DProjStatus ED_view3d_project_short_ex(ARegion *ar, float perspmat[4][4], con
 }
 
 eV3DProjStatus ED_view3d_project_int_ex(ARegion *ar, float perspmat[4][4], const int is_local,
-                                        const float co[3], int r_co[2], eV3DProjTest flag)
+                                        const float co[3], int r_co[2], const eV3DProjTest flag)
 {
        float tvec[2];
        eV3DProjStatus ret = ed_view3d_project__internal(ar, perspmat, is_local, co, tvec, flag);
@@ -991,7 +993,7 @@ eV3DProjStatus ED_view3d_project_int_ex(ARegion *ar, float perspmat[4][4], const
 }
 
 eV3DProjStatus ED_view3d_project_float_ex(ARegion *ar, float perspmat[4][4], const int is_local,
-                                        const float co[3], float r_co[2], eV3DProjTest flag)
+                                        const float co[3], float r_co[2], const eV3DProjTest flag)
 {
        float tvec[2];
        eV3DProjStatus ret = ed_view3d_project__internal(ar, perspmat, is_local, co, tvec, flag);
@@ -1009,39 +1011,39 @@ eV3DProjStatus ED_view3d_project_float_ex(ARegion *ar, float perspmat[4][4], con
 }
 
 /* --- short --- */
-eV3DProjStatus ED_view3d_project_short_global(ARegion *ar, const float co[3], short r_co[2], eV3DProjTest flag)
+eV3DProjStatus ED_view3d_project_short_global(ARegion *ar, const float co[3], short r_co[2], const eV3DProjTest flag)
 {
        RegionView3D *rv3d = ar->regiondata;
        return ED_view3d_project_short_ex(ar, rv3d->persmat, FALSE, co, r_co, flag);
 }
 /* object space, use ED_view3d_init_mats_rv3d before calling */
-eV3DProjStatus ED_view3d_project_short_object(ARegion *ar, const float co[3], short r_co[2], eV3DProjTest flag)
+eV3DProjStatus ED_view3d_project_short_object(ARegion *ar, const float co[3], short r_co[2], const eV3DProjTest flag)
 {
        RegionView3D *rv3d = ar->regiondata;
        return ED_view3d_project_short_ex(ar, rv3d->persmatob, TRUE, co, r_co, flag);
 }
 
 /* --- int --- */
-eV3DProjStatus ED_view3d_project_int_global(ARegion *ar, const float co[3], int r_co[2], eV3DProjTest flag)
+eV3DProjStatus ED_view3d_project_int_global(ARegion *ar, const float co[3], int r_co[2], const eV3DProjTest flag)
 {
        RegionView3D *rv3d = ar->regiondata;
        return ED_view3d_project_int_ex(ar, rv3d->persmat, FALSE, co, r_co, flag);
 }
 /* object space, use ED_view3d_init_mats_rv3d before calling */
-eV3DProjStatus ED_view3d_project_int_object(ARegion *ar, const float co[3], int r_co[2], eV3DProjTest flag)
+eV3DProjStatus ED_view3d_project_int_object(ARegion *ar, const float co[3], int r_co[2], const eV3DProjTest flag)
 {
        RegionView3D *rv3d = ar->regiondata;
        return ED_view3d_project_int_ex(ar, rv3d->persmatob, TRUE, co, r_co, flag);
 }
 
 /* --- float --- */
-eV3DProjStatus ED_view3d_project_float_global(ARegion *ar, const float co[3], float r_co[2], eV3DProjTest flag)
+eV3DProjStatus ED_view3d_project_float_global(ARegion *ar, const float co[3], float r_co[2], const eV3DProjTest flag)
 {
        RegionView3D *rv3d = ar->regiondata;
        return ED_view3d_project_float_ex(ar, rv3d->persmat, FALSE, co, r_co, flag);
 }
 /* object space, use ED_view3d_init_mats_rv3d before calling */
-eV3DProjStatus ED_view3d_project_float_object(ARegion *ar, const float co[3], float r_co[2], eV3DProjTest flag)
+eV3DProjStatus ED_view3d_project_float_object(ARegion *ar, const float co[3], float r_co[2], const eV3DProjTest flag)
 {
        RegionView3D *rv3d = ar->regiondata;
        return ED_view3d_project_float_ex(ar, rv3d->persmatob, TRUE, co, r_co, flag);