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-06-16 09:13:12 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-06-16 09:13:12 +0400
commit72abfbfc9514ff18e5d96e17ef42cc6777b8cf5a (patch)
tree8cce5f0d2b8a30130ebf166fee9f3ca3e13ee461 /source/blender/editors
parent07a537eb1a8c5bf9a59c2c4ff551ef0890721d82 (diff)
fix automerge + mirror, previously only the selected verts would auto-merge.
Diffstat (limited to 'source/blender/editors')
-rw-r--r--source/blender/editors/include/ED_mesh.h2
-rw-r--r--source/blender/editors/mesh/editmesh_select.c25
-rw-r--r--source/blender/editors/transform/transform_conversions.c39
3 files changed, 47 insertions, 19 deletions
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h
index e3d762dccfb..097ea477501 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -143,7 +143,7 @@ bool BMBVH_EdgeVisible(struct BMBVHTree *tree, struct BMEdge *e,
/* editmesh_select.c */
void EDBM_select_mirrored(struct BMEditMesh *em, bool extend,
int *r_totmirr, int *r_totfail);
-void EDBM_automerge(struct Scene *scene, struct Object *ob, bool update);
+void EDBM_automerge(struct Scene *scene, struct Object *ob, bool update, const char hflag);
bool EDBM_backbuf_border_init(struct ViewContext *vc, short xmin, short ymin, short xmax, short ymax);
int EDBM_backbuf_check(unsigned int index);
diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c
index b0c76d23664..e14dd484ad3 100644
--- a/source/blender/editors/mesh/editmesh_select.c
+++ b/source/blender/editors/mesh/editmesh_select.c
@@ -119,26 +119,17 @@ void EDBM_select_mirrored(BMEditMesh *em, bool extend,
*r_totfail = totfail;
}
-void EDBM_automerge(Scene *scene, Object *obedit, bool update)
+void EDBM_automerge(Scene *scene, Object *obedit, bool update, const char hflag)
{
-
- if ((scene->toolsettings->automerge) &&
- (obedit && obedit->type == OB_MESH))
- {
- int ok;
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
-
- if (!em) {
- return;
- }
+ int ok;
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
- ok = BMO_op_callf(em->bm, BMO_FLAG_DEFAULTS,
- "automerge verts=%hv dist=%f",
- BM_ELEM_SELECT, scene->toolsettings->doublimit);
+ ok = BMO_op_callf(em->bm, BMO_FLAG_DEFAULTS,
+ "automerge verts=%hv dist=%f",
+ hflag, scene->toolsettings->doublimit);
- if (LIKELY(ok) && update) {
- EDBM_update_generic(em, true, true);
- }
+ if (LIKELY(ok) && update) {
+ EDBM_update_generic(em, true, true);
}
}
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 2b99405c749..d8f763c6a54 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -5161,6 +5161,40 @@ static void special_aftertrans_update__mask(bContext *C, TransInfo *t)
}
}
+static void special_aftertrans_update__mesh(bContext *UNUSED(C), TransInfo *t)
+{
+ /* so automerge supports mirror */
+ if ((t->scene->toolsettings->automerge) &&
+ (t->obedit && t->obedit->type == OB_MESH))
+ {
+ BMEditMesh *em = BKE_editmesh_from_object(t->obedit);
+ BMesh *bm = em->bm;
+ char hflag;
+
+ if (t->flag & T_MIRROR) {
+ TransData *td;
+ int i;
+
+ /* rather then adjusting the selection (which the user would notice)
+ * tag all mirrored verts, then automerge those */
+ BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_TAG, false);
+
+ for (i = 0, td = t->data; i < t->total; i++, td++) {
+ if (td->extra) {
+ BM_elem_flag_enable((BMVert *)td->extra, BM_ELEM_TAG);
+ }
+ }
+
+ hflag = BM_ELEM_SELECT | BM_ELEM_TAG;
+ }
+ else {
+ hflag = BM_ELEM_SELECT;
+ }
+
+ EDBM_automerge(t->scene, t->obedit, true, hflag);
+ }
+}
+
/* inserting keys, pointcache, redraw events... */
/*
* note: sequencer freeing has its own function now because of a conflict with transform's order of freeing (campbell)
@@ -5193,7 +5227,10 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
* during cleanup - psy-fi */
freeEdgeSlideTempFaces(sld);
}
- EDBM_automerge(t->scene, t->obedit, true);
+
+ if (t->obedit->type == OB_MESH) {
+ special_aftertrans_update__mesh(C, t);
+ }
}
else {
if (t->mode == TFM_EDGE_SLIDE) {