Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/editors/include/ED_mesh.h2
-rw-r--r--source/blender/editors/mesh/editmesh_utils.c6
-rw-r--r--source/blender/editors/mesh/mesh_data.c2
-rw-r--r--source/blender/editors/mesh/meshtools.c2
-rw-r--r--source/blender/editors/object/object_edit.c2
-rw-r--r--source/blender/editors/object/object_hook.c2
-rw-r--r--source/blender/editors/object/object_relations.c2
-rw-r--r--source/blender/editors/transform/transform_conversions.c87
-rw-r--r--source/blender/makesrna/intern/rna_object.c2
-rw-r--r--source/blenderplayer/bad_level_call_stubs/stubs.c2
10 files changed, 36 insertions, 73 deletions
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 {
- 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);
- }
- }
+ else if (selectmode & SCE_SELECT_FACE) {
+ if (bm->totvertsel == 0 || bm->totfacesel == 0) {
+ goto cleanup;
}
}
-
- /* 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++;
- }
+ else {
+ BLI_assert(0);
}
- /* 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;