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:
Diffstat (limited to 'source/blender/editors/mesh')
-rw-r--r--source/blender/editors/mesh/bmesh_tools.c55
-rw-r--r--source/blender/editors/mesh/bmeshutils.c17
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c43
-rw-r--r--source/blender/editors/mesh/mesh_intern.h7
4 files changed, 75 insertions, 47 deletions
diff --git a/source/blender/editors/mesh/bmesh_tools.c b/source/blender/editors/mesh/bmesh_tools.c
index 0e2a8dadb3b..ec655862c28 100644
--- a/source/blender/editors/mesh/bmesh_tools.c
+++ b/source/blender/editors/mesh/bmesh_tools.c
@@ -441,28 +441,33 @@ short EDBM_Extrude_edges_indiv(BMEditMesh *em, short flag, float *nor)
}
/* extrudes individual vertices */
-short EDBM_Extrude_verts_indiv(BMEditMesh *em, short flag, float *nor)
+short EDBM_Extrude_verts_indiv(BMEditMesh *em, wmOperator *op, short flag, float *nor)
{
-#if 0
- EditVert *eve;
-
- /* make the edges */
- for(eve= em->verts.first; eve; eve= eve->next) {
- if(eve->f & flag) {
- eve->tmp.v = addvertlist(em, eve->co, eve);
- addedgelist(em, eve, eve->tmp.v, NULL);
+ BMIter iter;
+ BMVert *v, **verts = NULL;
+ V_DECLARE(verts);
+ int i=0;
+
+ /*kindof hackish way of deselecting the original vertices, but
+ oh well.*/
+ v = BMIter_New(&iter, em->bm, BM_VERTS_OF_MESH, NULL);
+ for ( ; v; v=BMIter_Step(&iter)) {
+ if (BM_TestHFlag(v, BM_SELECT)) {
+ V_GROW(verts);
+ verts[i++] = v;
}
- else eve->tmp.v = NULL;
}
+
+ EDBM_CallOpf(em, op, "extrude_vert_indiv verts=%hv", flag);
- /* set correct selection */
- EM_clear_flag_all(em, SELECT);
+ i--;
+ while (i >= 0) {
+ BM_Select(em->bm, verts[i], 0);
+ i--;
+ }
- for(eve= em->verts.last; eve; eve= eve->prev)
- if (eve->tmp.v)
- eve->tmp.v->f |= flag;
+ V_FREE(verts);
-#endif
return 'g'; // g is grab
}
@@ -600,11 +605,19 @@ short EDBM_Extrude(Object *obedit, BMEditMesh *em, short flag, float *nor)
eed = BMIter_New(&iter, em->bm, BM_EDGES_OF_MESH, NULL);
for ( ; eed; eed=BMIter_Step(&iter)) {
if (BM_TestHFlag(eed, flag)) {
- BM_SetHFlag(eed->v1, flag);
- BM_SetHFlag(eed->v2, flag);
+ if (flag != BM_SELECT) {
+ BM_SetHFlag(eed->v1, flag);
+ BM_SetHFlag(eed->v2, flag);
+ } else {
+ BM_Select(em->bm, eed->v1, 1);
+ BM_Select(em->bm, eed->v2, 1);
+ }
} else {
- if (BM_TestHFlag(eed->v1, flag) && BM_TestHFlag(eed->v2, flag))
- BM_SetHFlag(eed, flag);
+ if (BM_TestHFlag(eed->v1, flag) && BM_TestHFlag(eed->v2, flag)) {
+ if (flag != BM_SELECT)
+ BM_SetHFlag(eed, flag);
+ else BM_Select(em->bm, eed, 1);
+ }
}
}
@@ -719,7 +732,7 @@ void EDBM_Extrude_Mesh(Object *obedit, BMEditMesh *em, wmOperator *op)
if(nr<1) return;
if(nr==1) transmode= EDBM_Extrude(obedit, em, SELECT, nor);
- else if(nr==4) transmode= EDBM_Extrude_verts_indiv(em, SELECT, nor);
+ else if(nr==4) transmode= EDBM_Extrude_verts_indiv(em, op, SELECT, nor);
else if(nr==3) transmode= EDBM_Extrude_edges_indiv(em, SELECT, nor);
else transmode= EDBM_Extrude_face_indiv(em, SELECT, nor);
diff --git a/source/blender/editors/mesh/bmeshutils.c b/source/blender/editors/mesh/bmeshutils.c
index 6171967879e..2d15644cbde 100644
--- a/source/blender/editors/mesh/bmeshutils.c
+++ b/source/blender/editors/mesh/bmeshutils.c
@@ -146,9 +146,9 @@ void EDBM_Tesselate(EditMesh *em)
}
}
-int EDBM_CallOpf(EditMesh *em, wmOperator *op, char *fmt, ...)
+int EDBM_CallOpf(BMEditMesh *em, wmOperator *op, char *fmt, ...)
{
- BMesh *bm = editmesh_to_bmesh(em);
+ BMesh *bm = em->bm;
BMOperator bmop;
va_list list;
@@ -169,9 +169,9 @@ int EDBM_CallOpf(EditMesh *em, wmOperator *op, char *fmt, ...)
return EDBM_Finish(bm, em, op, 1);
}
-int EDBM_CallOpfSilent(EditMesh *em, char *fmt, ...)
+int EDBM_CallOpfSilent(BMEditMesh *em, char *fmt, ...)
{
- BMesh *bm = editmesh_to_bmesh(em);
+ BMesh *bm = em->bm;
BMOperator bmop;
va_list list;
@@ -192,20 +192,15 @@ int EDBM_CallOpfSilent(EditMesh *em, char *fmt, ...)
/*returns 0 on error, 1 on success*/
int EDBM_Finish(BMesh *bm, EditMesh *em, wmOperator *op, int report) {
- EditMesh *em2;
char *errmsg;
if (BMO_GetError(bm, &errmsg, NULL)) {
if (report) BKE_report(op->reports, RPT_ERROR, errmsg);
- BM_Free_Mesh(bm);
+ /*BMESH_TODOwe should really undo here or something, back
+ out of the failed op :/*/
return 0;
}
- em2 = bmesh_to_editmesh(bm);
- set_editMesh(em, em2);
- MEM_freeN(em2);
- BM_Free_Mesh(bm);
-
return 1;
}
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 267145a6a78..139fa29ddf9 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -1002,31 +1002,44 @@ static void erase_vertices(EditMesh *em, ListBase *l)
}
}
-static int delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event)
+static int delete_mesh(Object *obedit, wmOperator *op, int event)
{
+ BMEditMesh *bem = ((Mesh*)obedit->data)->edit_btmesh;
+ EditMesh *em = NULL;
EditFace *efa, *nextvl;
EditVert *eve,*nextve;
EditEdge *eed,*nexted;
int count;
char *str="Erase";
-
+
if(event<1) return;
+ if (event != 7 && event != 5)
+ em= EM_GetEditMesh((Mesh *)obedit->data);
+
if(event==10 ) {
str= "Erase Vertices";
erase_edges(em, &em->edges);
erase_faces(em, &em->faces);
erase_vertices(em, &em->verts);
+
+ EM_fgon_flags(em); // redo flags and indices for fgons
+ EM_EndEditMesh(obedit->data, em);
}
else if(event==7) {
- if (!EDBM_CallOpf(em, op, "dissolveverts verts=%hv",BM_SELECT))
+ if (!EDBM_CallOpf(bem, op, "dissolveverts verts=%hv",BM_SELECT))
return OPERATOR_CANCELLED;
}
else if(event==6) {
- if(!EdgeLoopDelete(em, op))
+ if(!EdgeLoopDelete(em, op)) {
+ EM_EndEditMesh(obedit->data, em);
return;
+ }
str= "Erase Edge Loop";
+
+ EM_fgon_flags(em); // redo flags and indices for fgons
+ EM_EndEditMesh(obedit->data, em);
}
else if(event==4) {
str= "Erase Edges & Faces";
@@ -1068,7 +1081,10 @@ static int delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event)
free_editface(em, efa);
}
efa= nextvl;
+
}
+ EM_fgon_flags(em); // redo flags and indices for fgons
+ EM_EndEditMesh(obedit->data, em);
}
else if(event==1) {
str= "Erase Edges";
@@ -1114,10 +1130,15 @@ static int delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event)
eve= nextve;
}
+ EM_fgon_flags(em); // redo flags and indices for fgons
+ EM_EndEditMesh(obedit->data, em);
}
else if(event==2) {
str="Erase Faces";
delfaceflag(em, SELECT);
+
+ EM_fgon_flags(em); // redo flags and indices for fgons
+ EM_EndEditMesh(obedit->data, em);
}
else if(event==3) {
str= "Erase All";
@@ -1125,16 +1146,17 @@ static int delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event)
if(em->edges.first) free_edgelist(em, &em->edges);
if(em->faces.first) free_facelist(em, &em->faces);
if(em->selected.first) BLI_freelistN(&(em->selected));
+
+ EM_fgon_flags(em); // redo flags and indices for fgons
+ EM_EndEditMesh(obedit->data, em);
}
else if(event==5) {
- if (!EDBM_CallOpf(em, op, "del geom=%hf context=%d",
+ if (!EDBM_CallOpf(bem, op, "del geom=%hf context=%d",
BM_SELECT, DEL_ONLYFACES))
return OPERATOR_CANCELLED;
str= "Erase Only Faces";
}
- EM_fgon_flags(em); // redo flags and indices for fgons
-
// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
}
@@ -1154,13 +1176,11 @@ static EnumPropertyItem prop_mesh_delete_types[] = {
static int delete_mesh_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
- EditMesh *em= EM_GetEditMesh((Mesh *)obedit->data);
- delete_mesh(obedit, em, op, RNA_enum_get(op->ptr, "type"));
+ delete_mesh(obedit, op, RNA_enum_get(op->ptr, "type"));
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
- EM_EndEditMesh(obedit->data, em);
return OPERATOR_FINISHED;
}
@@ -6666,7 +6686,7 @@ void MESH_OT_beauty_fill(wmOperatorType *ot)
static int convert_quads_to_tris_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
- EditMesh *em= EM_GetEditMesh((Mesh *)obedit->data);
+ BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh;
//convert_to_triface(em,0);
if (!EDBM_CallOpf(em, op, "triangulate faces=%hf", BM_SELECT))
@@ -6674,7 +6694,6 @@ static int convert_quads_to_tris_exec(bContext *C, wmOperator *op)
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
- EM_EndEditMesh(obedit->data, em);
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/mesh/mesh_intern.h b/source/blender/editors/mesh/mesh_intern.h
index 8b034458229..4f58ee5fea0 100644
--- a/source/blender/editors/mesh/mesh_intern.h
+++ b/source/blender/editors/mesh/mesh_intern.h
@@ -50,15 +50,16 @@ struct BMFace;
/* ******************** bmeshutils.c */
/*calls a bmesh op, reporting errors to the user, doing conversions,
etc.*/
-int EDBM_CallOpf(EditMesh *em, struct wmOperator *op, char *fmt, ...);
+int EDBM_CallOpf(struct BMEditMesh *em, struct wmOperator *op, char *fmt, ...);
+
/*same as above, but doesn't report errors.*/
-int EDBM_CallOpfSilent(EditMesh *em, char *fmt, ...);
+int EDBM_CallOpfSilent(struct BMEditMesh *em, char *fmt, ...);
/*called after bmesh tool exec. checks for errors and does conversions.
if any errors are raised by bmesh, it displays the error to the user and
returns 0 (and does not convert). otherwise, it converts the bmesh back
into the editmesh, and returns 1.*/
-int EDBM_Finish(struct BMesh *bm, struct EditMesh *em,
+int EDBM_Finish(struct BMesh *bm, struct BMEditMesh *em,
struct wmOperator *op, int report);
void EDBM_clear_flag_all(struct BMEditMesh *em, int flag);