From 704c5f09b5b9eb79b591bb7996944c22085f0b15 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 7 Sep 2012 00:58:00 +0000 Subject: remove makeDerivedMesh from ED_mesh_pick_face(), this was added 44256 (bmesh merge), but is pretty bad (rebuilding entire derived mesh to pick a face), tested with subsurf modifier, sintel mesh - it works ok without it. Also - other select modes like border-select dont do this, so looks safe to disable. --- source/blender/editors/include/ED_mesh.h | 5 +++- source/blender/editors/mesh/editface.c | 4 +-- source/blender/editors/mesh/meshtools.c | 29 +++++++++------------- .../blender/editors/space_view3d/view3d_select.c | 4 +-- 4 files changed, 20 insertions(+), 22 deletions(-) (limited to 'source') diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index 25c727251cd..528eeab0473 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -279,8 +279,11 @@ int mesh_get_x_mirror_vert(struct Object *ob, int index); struct BMVert *editbmesh_get_x_mirror_vert(struct Object *ob, struct BMEditMesh *em, struct BMVert *eve, const float co[3], int index); int *mesh_get_x_mirror_faces(struct Object *ob, struct BMEditMesh *em); -int ED_mesh_pick_face(struct bContext *C, struct Mesh *me, struct Object *ob, const int mval[2], unsigned int *index, short rect); int ED_mesh_pick_vert(struct bContext *C, struct Mesh *me, const int mval[2], unsigned int *index, int size); +int ED_mesh_pick_face(struct bContext *C, struct Mesh *me, const int mval[2], unsigned int *index, int size); + +#define ED_MESH_PICK_DEFAULT_VERT_SIZE 50 +#define ED_MESH_PICK_DEFAULT_FACE_SIZE 3 #include "../mesh/editmesh_bvh.h" diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c index 36fbfeedcb6..4e30cff5fde 100644 --- a/source/blender/editors/mesh/editface.c +++ b/source/blender/editors/mesh/editface.c @@ -294,7 +294,7 @@ void paintface_select_linked(bContext *UNUSED(C), Object *ob, int UNUSED(mval[2] if (mode == 0 || mode == 1) { /* XXX - Causes glitches, not sure why */ #if 0 - if (!ED_mesh_pick_face(C, me, mval, &index, 1)) + if (!ED_mesh_pick_face(C, me, mval, &index, ED_MESH_PICK_DEFAULT_FACE_SIZE)) return; #endif } @@ -481,7 +481,7 @@ int paintface_mouse_select(struct bContext *C, Object *ob, const int mval[2], in /* Get the face under the cursor */ me = BKE_mesh_from_object(ob); - if (!ED_mesh_pick_face(C, me, ob, mval, &index, 1)) + if (!ED_mesh_pick_face(C, me, mval, &index, ED_MESH_PICK_DEFAULT_FACE_SIZE)) return 0; if (index >= me->totpoly) diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c index e11d79a6e99..3d6face167b 100644 --- a/source/blender/editors/mesh/meshtools.c +++ b/source/blender/editors/mesh/meshtools.c @@ -42,6 +42,7 @@ #include "MEM_guardedalloc.h" #include "DNA_mesh_types.h" +#include "DNA_view3d_types.h" #include "DNA_key_types.h" #include "DNA_material_types.h" #include "DNA_meshdata_types.h" @@ -1156,28 +1157,21 @@ int *mesh_get_x_mirror_faces(Object *ob, BMEditMesh *em) * * \return boolean TRUE == Found */ -int ED_mesh_pick_face(bContext *C, Mesh *me, Object *ob, const int mval[2], unsigned int *index, short rect) +int ED_mesh_pick_face(bContext *C, Mesh *me, const int mval[2], unsigned int *index, int size) { - Scene *scene = CTX_data_scene(C); ViewContext vc; - view3d_set_viewcontext(C, &vc); if (!me || me->totpoly == 0) return 0; - makeDerivedMesh(scene, ob, NULL, CD_MASK_BAREMESH, 0); - - // XXX if (v3d->flag & V3D_INVALID_BACKBUF) { -// XXX drawview.c! check_backbuf(); -// XXX persp(PERSP_VIEW); -// XXX } + view3d_set_viewcontext(C, &vc); - if (rect) { - /* sample rect to increase changes of selecting, so that when clicking + if (size) { + /* sample rect to increase chances of selecting, so that when clicking * on an edge in the backbuf, we can still select a face */ - int dist; - *index = view3d_sample_backbuf_rect(&vc, mval, 3, 1, me->totpoly + 1, &dist, 0, NULL, NULL); + int dummy_dist; + *index = view3d_sample_backbuf_rect(&vc, mval, size, 1, me->totpoly + 1, &dummy_dist, 0, NULL, NULL); } else { /* sample only on the exact position */ @@ -1201,17 +1195,18 @@ int ED_mesh_pick_face(bContext *C, Mesh *me, Object *ob, const int mval[2], unsi int ED_mesh_pick_vert(bContext *C, Mesh *me, const int mval[2], unsigned int *index, int size) { ViewContext vc; - view3d_set_viewcontext(C, &vc); if (!me || me->totvert == 0) return 0; + view3d_set_viewcontext(C, &vc); + if (size > 0) { - /* sample rect to increase changes of selecting, so that when clicking + /* sample rect to increase chances of selecting, so that when clicking * on an face in the backbuf, we can still select a vert */ - int dist; - *index = view3d_sample_backbuf_rect(&vc, mval, size, 1, me->totvert + 1, &dist, 0, NULL, NULL); + int dummy_dist; + *index = view3d_sample_backbuf_rect(&vc, mval, size, 1, me->totvert + 1, &dummy_dist, 0, NULL, NULL); } else { /* sample only on the exact position */ diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index ab54184d3b1..fa431e89d80 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -2035,8 +2035,8 @@ static int mouse_weight_paint_vertex_select(bContext *C, const int mval[2], shor unsigned int index = 0; MVert *mv; - if (ED_mesh_pick_vert(C, me, mval, &index, 50)) { - mv = me->mvert + index; + if (ED_mesh_pick_vert(C, me, mval, &index, ED_MESH_PICK_DEFAULT_VERT_SIZE)) { + mv = &me->mvert[index]; if (extend) { mv->flag |= SELECT; } -- cgit v1.2.3