diff options
Diffstat (limited to 'source/blender/editors/mesh')
-rw-r--r-- | source/blender/editors/mesh/bmesh_tools.c | 55 | ||||
-rw-r--r-- | source/blender/editors/mesh/bmeshutils.c | 17 | ||||
-rw-r--r-- | source/blender/editors/mesh/editmesh_tools.c | 43 | ||||
-rw-r--r-- | source/blender/editors/mesh/mesh_intern.h | 7 |
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); |