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:
authorCampbell Barton <ideasman42@gmail.com>2013-07-22 14:44:24 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-07-22 14:44:24 +0400
commit9634f8f1151740609230c24761ac20fdfe1a9168 (patch)
tree201b9b684a779a00a5ae58a7b89cdfc042c254b8 /source/blender
parente8b02626f2a52a7e6d032e0e63a5321100bc2bf6 (diff)
transform was flushing the selection (inline), now skip this and use the selection as-is.
flush the selection on entering editmode instead (since the selection mode can be changed with another mesh). is other tools leave the selection incorrectly flushed, those will need to be fixed so transform works as expected.
Diffstat (limited to 'source/blender')
-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
9 files changed, 35 insertions, 72 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;