diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index fd08039c24b..f24f9098fcd 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -92,7 +92,7 @@ void EDBM_mesh_normals_update(struct BMEditMesh *em); void EDBM_mesh_clear(struct BMEditMesh *em); void EDBM_selectmode_to_scene(struct bContext *C); -void EDBM_mesh_make(struct ToolSettings *ts, struct Scene *scene, struct Object *ob); +void EDBM_mesh_make(struct ToolSettings *ts, struct Object *ob); void EDBM_mesh_free(struct BMEditMesh *em); void EDBM_mesh_load(struct Object *ob); struct DerivedMesh *EDBM_mesh_deform_dm_get(struct BMEditMesh *em); diff --git a/source/blender/editors/mesh/editmesh_utils.c b/source/blender/editors/mesh/editmesh_utils.c index 63b44fb30d4..f64ea569100 100644 --- a/source/blender/editors/mesh/editmesh_utils.c +++ b/source/blender/editors/mesh/editmesh_utils.c @@ -341,7 +341,7 @@ void EDBM_selectmode_to_scene(bContext *C) WM_event_add_notifier(C, NC_SCENE | ND_TOOLSETTINGS, scene); } -void EDBM_mesh_make(ToolSettings *ts, Scene *UNUSED(scene), Object *ob) +void EDBM_mesh_make(ToolSettings *ts, Object *ob) { Mesh *me = ob->data; BMesh *bm; @@ -368,8 +368,10 @@ void EDBM_mesh_make(ToolSettings *ts, Scene *UNUSED(scene), Object *ob) me->edit_btmesh->selectmode = me->edit_btmesh->bm->selectmode = ts->selectmode; me->edit_btmesh->mat_nr = (ob->actcol > 0) ? ob->actcol - 1 : 0; - me->edit_btmesh->ob = ob; + + /* we need to flush selection because the mode may have changed from when last in editmode */ + EDBM_selectmode_flush(me->edit_btmesh); } void EDBM_mesh_load(Object *ob) diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c index 69049bd5a26..52a8ccc4aab 100644 --- a/source/blender/editors/mesh/mesh_data.c +++ b/source/blender/editors/mesh/mesh_data.c @@ -567,7 +567,7 @@ static int drop_named_image_invoke(bContext *C, wmOperator *op, const wmEvent *e obedit = base->object; me = obedit->data; if (me->edit_btmesh == NULL) { - EDBM_mesh_make(scene->toolsettings, scene, obedit); + EDBM_mesh_make(scene->toolsettings, obedit); exitmode = 1; } if (me->edit_btmesh == NULL) diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c index d0adfc20f79..ed05d2a01a5 100644 --- a/source/blender/editors/mesh/meshtools.c +++ b/source/blender/editors/mesh/meshtools.c @@ -570,7 +570,7 @@ int join_mesh_exec(bContext *C, wmOperator *op) ED_object_editmode_exit(C, EM_FREEDATA | EM_WAITCURSOR | EM_DO_UNDO); #else /* toggle editmode using lower level functions so this can be called from python */ - EDBM_mesh_make(scene->toolsettings, scene, ob); + EDBM_mesh_make(scene->toolsettings, ob); EDBM_mesh_load(ob); EDBM_mesh_free(me->edit_btmesh); MEM_freeN(me->edit_btmesh); diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 784dddbfbf3..9eaaf8fe1db 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -478,7 +478,7 @@ void ED_object_editmode_enter(bContext *C, int flag) ok = 1; scene->obedit = ob; /* context sees this */ - EDBM_mesh_make(CTX_data_tool_settings(C), scene, ob); + EDBM_mesh_make(scene->toolsettings, ob); em = BKE_editmesh_from_object(ob); if (LIKELY(em)) { diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c index d739d8d330f..c8baa0d84dc 100644 --- a/source/blender/editors/object/object_hook.c +++ b/source/blender/editors/object/object_hook.c @@ -310,7 +310,7 @@ static bool object_hook_index_array(Scene *scene, Object *obedit, int *tot, int BMEditMesh *em; EDBM_mesh_load(obedit); - EDBM_mesh_make(scene->toolsettings, scene, obedit); + EDBM_mesh_make(scene->toolsettings, obedit); em = me->edit_btmesh; diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index f6fc21f94f5..13fb46e35de 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -136,7 +136,7 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op) BMEditMesh *em; EDBM_mesh_load(obedit); - EDBM_mesh_make(scene->toolsettings, scene, obedit); + EDBM_mesh_make(scene->toolsettings, obedit); em = me->edit_btmesh; diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index a089f0d4159..93e01d84eaf 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -1943,6 +1943,8 @@ static BMElem *bm_vert_single_select_edge(BMVert *eve) static void VertsToTransData(TransInfo *t, TransData *td, TransDataExtension *tx, BMEditMesh *em, BMVert *eve, float *bweight) { + BLI_assert(BM_elem_flag_test(eve, BM_ELEM_HIDDEN) == 0); + td->flag = 0; //if (key) // td->loc = key->co; @@ -2034,81 +2036,42 @@ static void createTransEditVerts(TransInfo *t) int count = 0, countsel = 0, a, totleft; int propmode = (t->flag & T_PROP_EDIT) ? (t->flag & T_PROP_EDIT_ALL) : 0; int mirror = 0; - char *selstate = NULL; short selectmode = ts->selectmode; int cd_vert_bweight_offset = -1; bool use_topology = (me->editflag & ME_EDIT_MIRROR_TOPO) != 0; + /* BMESH_TODO, writing into the index values is BAD!, means we cant + * use the values for vertex mirror - campbell */ + if (t->flag & T_MIRROR) { EDBM_verts_mirror_cache_begin(em, 0, false, (t->flag & T_PROP_EDIT) == 0, use_topology); mirror = 1; } - /* edge slide forces edge select */ - if (t->mode == TFM_EDGE_SLIDE) { - selectmode = SCE_SELECT_EDGE; - } - - /* BMESH_TODO, writing into the index values is BAD!, means we cant - * use the values for vertex mirror - campbell */ - - // transform now requires awareness for select mode, so we tag the f1 flags in verts + /* quick check if we can transform */ + /* note: in prop mode we need at least 1 selected */ if (selectmode & SCE_SELECT_VERTEX) { - BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) { - BM_elem_flag_set(eve, BM_ELEM_TAG, BM_elem_flag_test(eve, BM_ELEM_SELECT)); + if (bm->totvertsel == 0) { + goto cleanup; } } else if (selectmode & SCE_SELECT_EDGE) { - BMEdge *eed; - - eve = BM_iter_new(&iter, bm, BM_VERTS_OF_MESH, NULL); - for (; eve; eve = BM_iter_step(&iter)) BM_elem_flag_disable(eve, BM_ELEM_TAG); - - eed = BM_iter_new(&iter, bm, BM_EDGES_OF_MESH, NULL); - for (; eed; eed = BM_iter_step(&iter)) { - if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) { - BM_elem_flag_enable(eed->v1, BM_ELEM_TAG); - BM_elem_flag_enable(eed->v2, BM_ELEM_TAG); - } + if (bm->totvertsel == 0 || bm->totedgesel == 0) { + goto cleanup; + } + } + else if (selectmode & SCE_SELECT_FACE) { + if (bm->totvertsel == 0 || bm->totfacesel == 0) { + goto cleanup; } } else { - BMFace *efa; - eve = BM_iter_new(&iter, bm, BM_VERTS_OF_MESH, NULL); - for (; eve; eve = BM_iter_step(&iter)) BM_elem_flag_disable(eve, BM_ELEM_TAG); - - efa = BM_iter_new(&iter, bm, BM_FACES_OF_MESH, NULL); - for (; efa; efa = BM_iter_step(&iter)) { - if (BM_elem_flag_test(efa, BM_ELEM_SELECT)) { - BMIter liter; - BMLoop *l; - - l = BM_iter_new(&liter, bm, BM_LOOPS_OF_FACE, efa); - for (; l; l = BM_iter_step(&liter)) { - BM_elem_flag_enable(l->v, BM_ELEM_TAG); - } - } - } + BLI_assert(0); } - /* now we can count. we store selection state in selstate, since - * get_crazy_mapped_editverts messes up the index state of the - * verts*/ - selstate = MEM_callocN(sizeof(*selstate) * bm->totvert, __func__); - eve = BM_iter_new(&iter, bm, BM_VERTS_OF_MESH, NULL); - for (a = 0; eve; eve = BM_iter_step(&iter), a++) { - if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) { - if (BM_elem_flag_test(eve, BM_ELEM_TAG)) { - selstate[a] = 1; - countsel++; - } - if (propmode) count++; - } - } - - /* note: in prop mode we need at least 1 selected */ - if (countsel == 0) { - goto cleanup; + countsel = bm->totvertsel; + if (propmode) { + count = bm->totvert; } /* check active */ @@ -2174,9 +2137,8 @@ static void createTransEditVerts(TransInfo *t) /* find out which half we do */ if (mirror) { - eve = BM_iter_new(&iter, bm, BM_VERTS_OF_MESH, NULL); - for (a = 0; eve; eve = BM_iter_step(&iter), a++) { - if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN) && selstate[a] && eve->co[0] != 0.0f) { + BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) { + if (BM_elem_flag_test(eve, BM_ELEM_SELECT) && eve->co[0] != 0.0f) { if (eve->co[0] < 0.0f) { t->mirror = -1; mirror = -1; @@ -2188,7 +2150,7 @@ static void createTransEditVerts(TransInfo *t) BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, a) { if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) { - if (propmode || selstate[a]) { + if (propmode || BM_elem_flag_test(eve, BM_ELEM_SELECT)) { float *bweight = (cd_vert_bweight_offset != -1) ? BM_ELEM_CD_GET_VOID_P(eve, cd_vert_bweight_offset) : NULL; VertsToTransData(t, tob, tx, em, eve, bweight); @@ -2196,7 +2158,8 @@ static void createTransEditVerts(TransInfo *t) tx++; /* selected */ - if (selstate[a]) tob->flag |= TD_SELECTED; + if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) + tob->flag |= TD_SELECTED; /* active */ if (eve == eve_act) tob->flag |= TD_ACTIVE; @@ -2267,8 +2230,6 @@ cleanup: MEM_freeN(defmats); if (dists) MEM_freeN(dists); - - MEM_freeN(selstate); if (t->flag & T_MIRROR) { EDBM_verts_mirror_cache_end(em); diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index 834fb6d7d72..e71d1d22c4b 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -266,7 +266,7 @@ static void rna_Object_active_shape_update(Main *bmain, Scene *scene, PointerRNA switch (ob->type) { case OB_MESH: EDBM_mesh_load(ob); - EDBM_mesh_make(scene->toolsettings, scene, ob); + EDBM_mesh_make(scene->toolsettings, ob); EDBM_mesh_normals_update(((Mesh *)ob->data)->edit_btmesh); BKE_editmesh_tessface_calc(((Mesh *)ob->data)->edit_btmesh); break; diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index 547ced6098f..ca57299fe1e 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -140,7 +140,7 @@ struct wmWindowManager; /*new render funcs */ void EDBM_selectmode_set(struct BMEditMesh *em) {STUB_ASSERT(0);} void EDBM_mesh_load(struct Object *ob) {STUB_ASSERT(0);} -void EDBM_mesh_make(struct ToolSettings *ts, struct Scene *scene, struct Object *ob) {STUB_ASSERT(0);} +void EDBM_mesh_make(struct ToolSettings *ts, struct Object *ob) {STUB_ASSERT(0);} void EDBM_mesh_normals_update(struct BMEditMesh *em) {STUB_ASSERT(0);} void *g_system;