diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-12-23 07:04:19 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-12-23 07:04:19 +0400 |
commit | 4612bbf7dbe739795678688cb3814c1f5bbc38b1 (patch) | |
tree | b5797865a8dc4ef7c0ea26c64c30e9699efeeb58 /source | |
parent | 45681464e7d0ce2b040b4f835a3a40c78d55b7ae (diff) |
add zbuf/depth option to weight paint lasso select.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/include/ED_view3d.h | 4 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/drawobject.c | 8 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_iterators.c | 47 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_select.c | 37 |
4 files changed, 88 insertions, 8 deletions
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h index f7f58a4ee7a..4df49920bf7 100644 --- a/source/blender/editors/include/ED_view3d.h +++ b/source/blender/editors/include/ED_view3d.h @@ -124,6 +124,10 @@ typedef enum { /* view3d_iterators.c */ /* foreach iterators */ +void meshobject_foreachScreenVert( + struct ViewContext *vc, + void (*func)(void *userData, struct MVert *eve, const float screen_co[2], int index), + void *userData, const eV3DProjTest clip_flag); void mesh_foreachScreenVert( struct ViewContext *vc, void (*func)(void *userData, struct BMVert *eve, const float screen_co[2], int index), diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 91f25c960e9..12dca8685c8 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -101,7 +101,7 @@ typedef enum eWireDrawMode { } eWireDrawMode; typedef struct drawDMVerts_userData { - BMEditMesh *em; /* BMESH BRANCH ONLY */ + BMEditMesh *em; int sel; BMVert *eve_act; @@ -119,7 +119,7 @@ typedef struct drawDMVerts_userData { } drawDMVerts_userData; typedef struct drawDMEdgesSel_userData { - BMEditMesh *em; /* BMESH BRANCH ONLY */ + BMEditMesh *em; unsigned char *baseCol, *selCol, *actCol; BMEdge *eed_act; @@ -128,8 +128,8 @@ typedef struct drawDMEdgesSel_userData { typedef struct drawDMFacesSel_userData { unsigned char *cols[3]; - DerivedMesh *dm; /* BMESH BRANCH ONLY */ - BMEditMesh *em; /* BMESH BRANCH ONLY */ + DerivedMesh *dm; + BMEditMesh *em; BMFace *efa_act; int *orig_index_mf_to_mpoly; diff --git a/source/blender/editors/space_view3d/view3d_iterators.c b/source/blender/editors/space_view3d/view3d_iterators.c index a0b36e57d69..81e890c37ee 100644 --- a/source/blender/editors/space_view3d/view3d_iterators.c +++ b/source/blender/editors/space_view3d/view3d_iterators.c @@ -27,6 +27,7 @@ #include "DNA_curve_types.h" #include "DNA_lattice_types.h" #include "DNA_meta_types.h" +#include "DNA_mesh_types.h" #include "DNA_armature_types.h" #include "DNA_object_types.h" @@ -47,6 +48,12 @@ #include "ED_object.h" #include "ED_view3d.h" +typedef struct foreachScreenObjectVert_userData { + void (*func)(void *userData, MVert *mv, const float screen_co_b[2], int index); + void *userData; + ViewContext vc; + eV3DProjTest clip_flag; +} foreachScreenObjectVert_userData; typedef struct foreachScreenVert_userData { void (*func)(void *userData, BMVert *eve, const float screen_co_b[2], int index); @@ -79,6 +86,46 @@ typedef struct foreachScreenFace_userData { /* ------------------------------------------------------------------------ */ + +static void meshobject_foreachScreenVert__mapFunc(void *userData, int index, const float co[3], + const float UNUSED(no_f[3]), const short UNUSED(no_s[3])) +{ + foreachScreenObjectVert_userData *data = userData; + struct MVert *mv = &((Mesh *)(data->vc.obact->data))->mvert[index]; + + if (!(mv->flag & ME_HIDE)) { + float screen_co[2]; + + if (ED_view3d_project_float_object(data->vc.ar, co, screen_co, data->clip_flag) != V3D_PROJ_RET_OK) { + return; + } + + data->func(data->userData, mv, screen_co, index); + } +} + +void meshobject_foreachScreenVert( + ViewContext *vc, + void (*func)(void *userData, MVert *eve, const float screen_co[2], int index), + void *userData, eV3DProjTest clip_flag) +{ + foreachScreenObjectVert_userData data; + DerivedMesh *dm = mesh_get_derived_deform(vc->scene, vc->obact, CD_MASK_BAREMESH); + + data.vc = *vc; + data.func = func; + data.userData = userData; + data.clip_flag = clip_flag; + + if (clip_flag & V3D_PROJ_TEST_CLIP_BB) { + ED_view3d_clipping_local(vc->rv3d, vc->obedit->obmat); /* for local clipping lookups */ + } + + dm->foreachMappedVert(dm, meshobject_foreachScreenVert__mapFunc, &data); + + dm->release(dm); +} + static void mesh_foreachScreenVert__mapFunc(void *userData, int index, const float co[3], const float UNUSED(no_f[3]), const short UNUSED(no_s[3])) { diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index c08df884d4f..f09518d956d 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -70,6 +70,7 @@ #include "BKE_paint.h" #include "BKE_tessmesh.h" #include "BKE_tracking.h" +#include "BKE_utildefines.h" #include "BIF_gl.h" @@ -800,8 +801,19 @@ static int do_paintvert_box_select(ViewContext *vc, rcti *rect, int select, int return OPERATOR_FINISHED; } +static void do_lasso_select_meshobject__doSelectVert(void *userData, MVert *mv, const float screen_co[2], int UNUSED(index)) +{ + LassoSelectUserData *data = userData; + + if (BLI_rctf_isect_pt_v(data->rect_fl, screen_co) && + BLI_lasso_is_point_inside(data->mcords, data->moves, screen_co[0], screen_co[1], IS_CLIPPED)) + { + BKE_BIT_TEST_SET(mv->flag, data->select, SELECT); + } +} static void do_lasso_select_paintvert(ViewContext *vc, const int mcords[][2], short moves, short extend, short select) { + const int use_zbuf = (vc->v3d->flag & V3D_ZBUF_SELECT); Object *ob = vc->obact; Mesh *me = ob ? ob->data : NULL; rcti rect; @@ -811,14 +823,31 @@ static void do_lasso_select_paintvert(ViewContext *vc, const int mcords[][2], sh if (extend == 0 && select) paintvert_deselect_all_visible(ob, SEL_DESELECT, FALSE); /* flush selection at the end */ - bm_vertoffs = me->totvert + 1; /* max index array */ BLI_lasso_boundbox(&rect, mcords, moves); - EDBM_backbuf_border_mask_init(vc, mcords, moves, rect.xmin, rect.ymin, rect.xmax, rect.ymax); - edbm_backbuf_check_and_select_verts_obmode(me, select); + if (use_zbuf) { + bm_vertoffs = me->totvert + 1; /* max index array */ - EDBM_backbuf_free(); + EDBM_backbuf_border_mask_init(vc, mcords, moves, rect.xmin, rect.ymin, rect.xmax, rect.ymax); + + edbm_backbuf_check_and_select_verts_obmode(me, select); + + EDBM_backbuf_free(); + } + else { + LassoSelectUserData data; + rcti rect; + + 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); + + meshobject_foreachScreenVert(vc, do_lasso_select_meshobject__doSelectVert, &data, V3D_PROJ_TEST_CLIP_DEFAULT); + + } paintvert_flush_flags(ob); } |