diff options
author | Joseph Eagar <joeedh@gmail.com> | 2009-02-28 15:49:18 +0300 |
---|---|---|
committer | Joseph Eagar <joeedh@gmail.com> | 2009-02-28 15:49:18 +0300 |
commit | 99919b1714ed79bbf10dbe057630ad0f0903c905 (patch) | |
tree | 1fb219c23a8799d327d2472b4d58aba96dd3212b /source/blender/editors/mesh/editmesh_tools.c | |
parent | d71d78e40d9e367a48a2f4fe15913088781686ee (diff) | |
parent | badbba7266cf27deaaf7e704b2b751d9023054a8 (diff) |
merge with trunk. also tried to fix tesselator code; new code should've worked, but there's still some problems, possibly not in the tesselator code entirely. also still have reverted tools/Blender.py since scons still isn't fixed, heh.
Diffstat (limited to 'source/blender/editors/mesh/editmesh_tools.c')
-rw-r--r-- | source/blender/editors/mesh/editmesh_tools.c | 867 |
1 files changed, 498 insertions, 369 deletions
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 591854c2811..3bc59fe9094 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -74,6 +74,7 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise #include "BKE_object.h" #include "BKE_utildefines.h" #include "BKE_bmesh.h" +#include "BKE_report.h" #include "BIF_gl.h" #include "BIF_glutil.h" @@ -87,6 +88,7 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise #include "ED_view3d.h" #include "ED_util.h" #include "ED_screen.h" +#include "BIF_transform.h" #include "UI_interface.h" @@ -96,11 +98,9 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise /* XXX */ static int extern_qread() {return 0;} static void waitcursor() {} -static void error() {} static int pupmenu() {return 0;} static int qtest() {return 0;} #define add_numbut(a, b, c, d, e, f, g) {} -static int do_clever_numbuts() {return 0;} static int snap_sel_to_curs() {return 0;} static int snap_to_center() {return 0;} @@ -108,7 +108,7 @@ static int snap_to_center() {return 0;} /* local prototypes ---------------*/ static void free_tagged_edges_faces(EditMesh *em, EditEdge *eed, EditFace *efa); -int EdgeLoopDelete(EditMesh *em); +int EdgeLoopDelete(EditMesh *em, wmOperator *op); /********* qsort routines *********/ @@ -489,8 +489,15 @@ static int removedoublesflag_exec(bContext *C, wmOperator *op) Object *obedit= CTX_data_edit_object(C); Scene *scene = CTX_data_scene(C); EditMesh *em= ((Mesh *)obedit->data)->edit_mesh; + char msg[100]; - removedoublesflag(em,1,0,scene->toolsettings->doublimit); + int cnt = removedoublesflag(em,1,0,scene->toolsettings->doublimit); + + if(cnt) + { + sprintf(msg, "Removed %d vertices", cnt); + BKE_report(op->reports, RPT_INFO, msg); + } WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); @@ -616,7 +623,7 @@ void hashvert_flag(EditMesh *em, int flag) } /* generic extern called extruder */ -void extrude_mesh(Object *obedit, EditMesh *em) +void extrude_mesh(Object *obedit, EditMesh *em, wmOperator *op) { Scene *scene= NULL; // XXX CTX! float nor[3]= {0.0, 0.0, 0.0}; @@ -627,11 +634,11 @@ void extrude_mesh(Object *obedit, EditMesh *em) else if(em->totvertsel==1) nr= 4; else if(em->totedgesel==0) nr= 4; else if(em->totfacesel==0) - nr= pupmenu("Extrude %t|Only Edges%x3|Only Vertices%x4"); + nr= 3; // pupmenu("Extrude %t|Only Edges%x3|Only Vertices%x4"); else if(em->totfacesel==1) - nr= pupmenu("Extrude %t|Region %x1|Only Edges%x3|Only Vertices%x4"); + nr= 1; // pupmenu("Extrude %t|Region %x1|Only Edges%x3|Only Vertices%x4"); else - nr= pupmenu("Extrude %t|Region %x1||Individual Faces %x2|Only Edges%x3|Only Vertices%x4"); + nr= 1; // pupmenu("Extrude %t|Region %x1||Individual Faces %x2|Only Edges%x3|Only Vertices%x4"); } else if(em->selectmode & SCE_SELECT_EDGE) { if (em->totedgesel==0) nr = 0; @@ -640,16 +647,16 @@ void extrude_mesh(Object *obedit, EditMesh *em) /*else if (em->totedgesel==1) nr = 3; else if(em->totfacesel==0) nr = 3; else if(em->totfacesel==1) - nr= pupmenu("Extrude %t|Region %x1|Only Edges%x3"); + nr= 1; // pupmenu("Extrude %t|Region %x1|Only Edges%x3"); else - nr= pupmenu("Extrude %t|Region %x1||Individual Faces %x2|Only Edges%x3"); + nr= 1; // pupmenu("Extrude %t|Region %x1||Individual Faces %x2|Only Edges%x3"); */ } else { if (em->totfacesel == 0) nr = 0; - else nr = 1; //if (em->totfacesel == 1) nr = 1; - //else - // nr= pupmenu("Extrude %t|Region %x1||Individual Faces %x2"); + else if (em->totfacesel == 1) nr = 1; + else + nr= 1; // pupmenu("Extrude %t|Region %x1||Individual Faces %x2"); } if(nr<1) return; @@ -660,7 +667,7 @@ void extrude_mesh(Object *obedit, EditMesh *em) else transmode= extrudeflag_face_indiv(em, SELECT, nor); if(transmode==0) { - error("No valid selection"); + BKE_report(op->reports, RPT_ERROR, "Not a valid selection for extrude"); } else { EM_fgon_flags(em); @@ -694,18 +701,35 @@ void extrude_mesh(Object *obedit, EditMesh *em) } // XXX should be a menu item -static int mesh_extrude_exec(bContext *C, wmOperator *op) +static int mesh_extrude_invoke(bContext *C, wmOperator *op, wmEvent *event) { Object *obedit= CTX_data_edit_object(C); EditMesh *em= ((Mesh *)obedit->data)->edit_mesh; - extrude_mesh(obedit,em); - + extrude_mesh(obedit,em, op); + + RNA_int_set(op->ptr, "mode", TFM_TRANSLATION); + WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr); + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; +} + +/* extrude without transform */ +static int mesh_extrude_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + EditMesh *em= ((Mesh *)obedit->data)->edit_mesh; + + extrude_mesh(obedit,em, op); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); return OPERATOR_FINISHED; } + void MESH_OT_extrude(wmOperatorType *ot) { /* identifiers */ @@ -713,11 +737,15 @@ void MESH_OT_extrude(wmOperatorType *ot) ot->idname= "MESH_OT_extrude"; /* api callbacks */ + ot->invoke= mesh_extrude_invoke; ot->exec= mesh_extrude_exec; ot->poll= ED_operator_editmesh; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* to give to transform */ + RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX); } static int split_mesh(bContext *C, wmOperator *op) @@ -816,23 +844,28 @@ void MESH_OT_extrude_repeat(wmOperatorType *ot) RNA_def_float(ot->srna, "offset", 2.0f, 0.0f, 100.0f, "Offset", "", 0.0f, FLT_MAX); RNA_def_int(ot->srna, "steps", 10, 0, 180, "Steps", "", 0, INT_MAX); } + +/* ************************** spin operator ******************** */ -void spin_mesh(View3D *v3d, Object *obedit, EditMesh *em, int steps, float degr, float *dvec, int mode) +static int spin_mesh(bContext *C, float *dvec, int steps, float degr, int dupli ) { - Scene *scene= NULL; // XXX from context! - RegionView3D *rv3d= NULL; // XXX from context + Object *obedit= CTX_data_edit_object(C); + View3D *v3d = CTX_wm_view3d(C); + Scene *scene = CTX_data_scene(C); + EditMesh *em= ((Mesh *)obedit->data)->edit_mesh; + RegionView3D *rv3d= CTX_wm_region_view3d(C); EditVert *eve,*nextve; - float nor[3]= {0.0, 0.0, 0.0}; - float *curs, si,n[3],q[4],cmat[3][3],imat[3][3], tmat[3][3]; - float cent[3],bmat[3][3]; + float nor[3]= {0.0f, 0.0f, 0.0f}; + float *curs, si, n[3], q[4], cmat[3][3], imat[3][3], tmat[3][3]; + float cent[3], bmat[3][3]; float phi; - short a,ok; + short a, ok= 1; /* imat and center and size */ Mat3CpyMat4(bmat, obedit->obmat); Mat3Inv(imat,bmat); - curs= give_cursor(NULL, v3d); // XXX + curs= give_cursor(scene, v3d); VECCOPY(cent, curs); cent[0]-= obedit->obmat[3][0]; cent[1]-= obedit->obmat[3][1]; @@ -864,16 +897,17 @@ void spin_mesh(View3D *v3d, Object *obedit, EditMesh *em, int steps, float degr, Mat3MulMat3(tmat,cmat,bmat); Mat3MulMat3(bmat,imat,tmat); - if(mode==0) if(scene->toolsettings->editbutflag & B_KEEPORIG) adduplicateflag(em, 1); - ok= 1; + if(dupli==0) + if(scene->toolsettings->editbutflag & B_KEEPORIG) + adduplicateflag(em, 1); - for(a=0;a<steps;a++) { - if(mode==0) ok= extrudeflag(obedit, em, SELECT, nor); + for(a=0; a<steps; a++) { + if(dupli==0) ok= extrudeflag(obedit, em, SELECT, nor); else adduplicateflag(em, SELECT); - if(ok==0) { - error("No valid vertices are selected"); + + if(ok==0) break; - } + rotateflag(em, SELECT, cent, bmat); if(dvec) { Mat3MulVecfl(bmat,dvec); @@ -893,30 +927,69 @@ void spin_mesh(View3D *v3d, Object *obedit, EditMesh *em, int steps, float degr, eve= nextve; } } - recalc_editnormals(em); + else { + recalc_editnormals(em); - EM_fgon_flags(em); + EM_fgon_flags(em); - // DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + } + + return ok; +} +static int spin_mesh_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + int ok; + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + ok= spin_mesh(C, NULL, RNA_int_get(op->ptr,"steps"), RNA_float_get(op->ptr,"degrees"), RNA_boolean_get(op->ptr,"dupli")); + if(ok==0) { + BKE_report(op->reports, RPT_ERROR, "No valid vertices are selected"); + return OPERATOR_CANCELLED; + } + return OPERATOR_FINISHED; } -void screw_mesh(Object *obedit, EditMesh *em, int steps, int turns) +void MESH_OT_spin(wmOperatorType *ot) { - View3D *v3d= NULL; // XXX + /* identifiers */ + ot->name= "Spin"; + ot->idname= "MESH_OT_spin"; + + /* api callbacks */ + ot->exec= spin_mesh_exec; + ot->poll= ED_operator_editmesh; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /*props */ + RNA_def_int(ot->srna, "steps", 9, 0, INT_MAX, "Steps", "Steps", 0, INT_MAX); + RNA_def_boolean(ot->srna, "dupli", 0, "Dupli", "Make Duplicates"); + RNA_def_float(ot->srna, "degrees", 90.0f, -FLT_MAX, FLT_MAX, "Degrees", "Degrees", -360.0f, 360.0f); +} + +static int screw_mesh_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + EditMesh *em= ((Mesh *)obedit->data)->edit_mesh; EditVert *eve,*v1=0,*v2=0; EditEdge *eed; float dvec[3], nor[3]; + int steps, turns; + turns= RNA_int_get(op->ptr, "turns"); + steps= RNA_int_get(op->ptr, "steps"); + /* clear flags */ - eve= em->verts.first; - while(eve) { + for(eve= em->verts.first; eve; eve= eve->next) eve->f1= 0; - eve= eve->next; - } + /* edges set flags in verts */ - eed= em->edges.first; - while(eed) { + for(eed= em->edges.first; eed; eed= eed->next) { if(eed->v1->f & SELECT) { if(eed->v2->f & SELECT) { /* watch: f1 is a byte */ @@ -924,30 +997,27 @@ void screw_mesh(Object *obedit, EditMesh *em, int steps, int turns) if(eed->v2->f1<2) eed->v2->f1++; } } - eed= eed->next; } /* find two vertices with eve->f1==1, more or less is wrong */ - eve= em->verts.first; - while(eve) { + for(eve= em->verts.first; eve; eve= eve->next) { if(eve->f1==1) { - if(v1==0) v1= eve; - else if(v2==0) v2= eve; + if(v1==NULL) v1= eve; + else if(v2==NULL) v2= eve; else { - v1=0; + v1= NULL; break; } } - eve= eve->next; } - if(v1==0 || v2==0) { - error("You have to select a string of connected vertices too"); - return; + if(v1==NULL || v2==NULL) { + BKE_report(op->reports, RPT_ERROR, "You have to select a string of connected vertices too"); + return OPERATOR_CANCELLED; } /* calculate dvec */ - dvec[0]= ( (v1->co[0]- v2->co[0]) )/(steps); - dvec[1]= ( (v1->co[1]- v2->co[1]) )/(steps); - dvec[2]= ( (v1->co[2]- v2->co[2]) )/(steps); + dvec[0]= ( v1->co[0]- v2->co[0] )/steps; + dvec[1]= ( v1->co[1]- v2->co[1] )/steps; + dvec[2]= ( v1->co[2]- v2->co[2] )/steps; VECCOPY(nor, obedit->obmat[2]); @@ -956,11 +1026,35 @@ void screw_mesh(Object *obedit, EditMesh *em, int steps, int turns) dvec[1]= -dvec[1]; dvec[2]= -dvec[2]; } - - spin_mesh(v3d, obedit, em, turns*steps, turns*360, dvec, 0); - + + if(spin_mesh(C, dvec, turns*steps, 360.0f*turns, 0)) { + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; + } + else { + BKE_report(op->reports, RPT_ERROR, "No valid vertices are selected"); + return OPERATOR_CANCELLED; + } } +void MESH_OT_screw(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Screw"; + ot->idname= "MESH_OT_screw"; + + /* api callbacks */ + ot->exec= screw_mesh_exec; + ot->poll= ED_operator_editmesh; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /*props */ + RNA_def_int(ot->srna, "steps", 9, 0, INT_MAX, "Steps", "Steps", 0, 256); + RNA_def_int(ot->srna, "turns", 1, 0, INT_MAX, "Turns", "Turns", 0, 256); +} static void erase_edges(EditMesh *em, ListBase *l) { @@ -1008,7 +1102,7 @@ static void erase_vertices(EditMesh *em, ListBase *l) } } -void delete_mesh(Object *obedit, EditMesh *em, int event) +void delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event) { EditFace *efa, *nextvl; EditVert *eve,*nextve; @@ -1042,7 +1136,7 @@ void delete_mesh(Object *obedit, EditMesh *em, int event) MEM_freeN(em2); } else if(event==6) { - if(!EdgeLoopDelete(em)) + if(!EdgeLoopDelete(em, op)) return; str= "Erase Edge Loop"; @@ -1181,7 +1275,7 @@ static int delete_mesh_exec(bContext *C, wmOperator *op) Object *obedit= CTX_data_edit_object(C); EditMesh *em= ((Mesh *)obedit->data)->edit_mesh; - delete_mesh(obedit,em,RNA_enum_get(op->ptr, "type")); + delete_mesh(obedit,em, op,RNA_enum_get(op->ptr, "type")); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); @@ -1207,87 +1301,6 @@ void MESH_OT_delete(wmOperatorType *ot) RNA_def_enum(ot->srna, "type", prop_mesh_delete_types, 10, "Type", "Method used for deleting mesh data"); } -/* Got this from scanfill.c. You will need to juggle around the - * callbacks for the scanfill.c code a bit for this to work. */ -void fill_mesh(EditMesh *em) -{ - EditVert *eve,*v1; - EditEdge *eed,*e1,*nexted; - EditFace *efa,*nextvl, *efan; - short ok; - - if(em==NULL) return; - waitcursor(1); - - /* copy all selected vertices */ - eve= em->verts.first; - while(eve) { - if(eve->f & SELECT) { - v1= BLI_addfillvert(eve->co); - eve->tmp.v= v1; - v1->tmp.v= eve; - v1->xs= 0; // used for counting edges - } - eve= eve->next; - } - /* copy all selected edges */ - eed= em->edges.first; - while(eed) { - if( (eed->v1->f & SELECT) && (eed->v2->f & SELECT) ) { - e1= BLI_addfilledge(eed->v1->tmp.v, eed->v2->tmp.v); - e1->v1->xs++; - e1->v2->xs++; - } - eed= eed->next; - } - /* from all selected faces: remove vertices and edges to prevent doubles */ - /* all edges add values, faces subtract, - then remove edges with vertices ->xs<2 */ - efa= em->faces.first; - ok= 0; - while(efa) { - nextvl= efa->next; - if( faceselectedAND(efa, 1) ) { - efa->v1->tmp.v->xs--; - efa->v2->tmp.v->xs--; - efa->v3->tmp.v->xs--; - if(efa->v4) efa->v4->tmp.v->xs--; - ok= 1; - - } - efa= nextvl; - } - if(ok) { /* there are faces selected */ - eed= filledgebase.first; - while(eed) { - nexted= eed->next; - if(eed->v1->xs<2 || eed->v2->xs<2) { - BLI_remlink(&filledgebase,eed); - } - eed= nexted; - } - } - - if(BLI_edgefill(0, em->mat_nr)) { - efa= fillfacebase.first; - while(efa) { - /* normals default pointing up */ - efan= addfacelist(em, efa->v3->tmp.v, efa->v2->tmp.v, - efa->v1->tmp.v, 0, NULL, NULL); - if(efan) EM_select_face(efan, 1); - efa= efa->next; - } - } - - BLI_end_edgefill(); - - // XXX option beautyfill */ - - WM_cursor_wait(0); - EM_select_flush(em); -// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - -} /*GB*/ /*-------------------------------------------------------------------------------*/ @@ -3053,172 +3066,6 @@ static void free_tagged_edges_faces(EditMesh *em, EditEdge *eed, EditFace *efa) } } -/* note; the EM_selectmode_set() calls here illustrate how badly constructed it all is... from before the - edge/face flags, with very mixed results.... */ -void beauty_fill(EditMesh *em) -{ - EditVert *v1, *v2, *v3, *v4; - EditEdge *eed, *nexted; - EditEdge dia1, dia2; - EditFace *efa, *w; - // void **efaar, **efaa; - EVPTuple *efaar; - EVPtr *efaa; - float len1, len2, len3, len4, len5, len6, opp1, opp2, fac1, fac2; - int totedge, ok, notbeauty=8, onedone, vindex[4]; - - /* - all selected edges with two faces - * - find the faces: store them in edges (using datablock) - * - per edge: - test convex - * - test edge: flip? - * - if true: remedge, addedge, all edges at the edge get new face pointers - */ - - EM_selectmode_set(em); // makes sure in selectmode 'face' the edges of selected faces are selected too - - totedge = count_selected_edges(em->edges.first); - if(totedge==0) return; - - /* temp block with face pointers */ - efaar= (EVPTuple *) MEM_callocN(totedge * sizeof(EVPTuple), "beautyfill"); - - while (notbeauty) { - notbeauty--; - - ok = collect_quadedges(efaar, em->edges.first, em->faces.first); - - /* there we go */ - onedone= 0; - - eed= em->edges.first; - while(eed) { - nexted= eed->next; - - /* f2 is set in collect_quadedges() */ - if(eed->f2==2 && eed->h==0) { - - efaa = (EVPtr *) eed->tmp.p; - - /* none of the faces should be treated before, nor be part of fgon */ - ok= 1; - efa= efaa[0]; - if(efa->e1->f1 || efa->e2->f1 || efa->e3->f1) ok= 0; - if(efa->fgonf) ok= 0; - efa= efaa[1]; - if(efa->e1->f1 || efa->e2->f1 || efa->e3->f1) ok= 0; - if(efa->fgonf) ok= 0; - - if(ok) { - /* test convex */ - givequadverts(efaa[0], efaa[1], &v1, &v2, &v3, &v4, vindex); - if(v1 && v2 && v3 && v4) { - if( convex(v1->co, v2->co, v3->co, v4->co) ) { - - /* test edges */ - if( (v1) > (v3) ) { - dia1.v1= v3; - dia1.v2= v1; - } - else { - dia1.v1= v1; - dia1.v2= v3; - } - - if( (v2) > (v4) ) { - dia2.v1= v4; - dia2.v2= v2; - } - else { - dia2.v1= v2; - dia2.v2= v4; - } - - /* testing rule: - * the area divided by the total edge lengths - */ - - len1= VecLenf(v1->co, v2->co); - len2= VecLenf(v2->co, v3->co); - len3= VecLenf(v3->co, v4->co); - len4= VecLenf(v4->co, v1->co); - len5= VecLenf(v1->co, v3->co); - len6= VecLenf(v2->co, v4->co); - - opp1= AreaT3Dfl(v1->co, v2->co, v3->co); - opp2= AreaT3Dfl(v1->co, v3->co, v4->co); - - fac1= opp1/(len1+len2+len5) + opp2/(len3+len4+len5); - - opp1= AreaT3Dfl(v2->co, v3->co, v4->co); - opp2= AreaT3Dfl(v2->co, v4->co, v1->co); - - fac2= opp1/(len2+len3+len6) + opp2/(len4+len1+len6); - - ok= 0; - if(fac1 > fac2) { - if(dia2.v1==eed->v1 && dia2.v2==eed->v2) { - eed->f1= 1; - efa= efaa[0]; - efa->f1= 1; - efa= efaa[1]; - efa->f1= 1; - - w= EM_face_from_faces(em, efaa[0], efaa[1], - vindex[0], vindex[1], 4+vindex[2], -1); - w->f |= SELECT; - - - w= EM_face_from_faces(em, efaa[0], efaa[1], - vindex[0], 4+vindex[2], 4+vindex[3], -1); - w->f |= SELECT; - - onedone= 1; - } - } - else if(fac1 < fac2) { - if(dia1.v1==eed->v1 && dia1.v2==eed->v2) { - eed->f1= 1; - efa= efaa[0]; - efa->f1= 1; - efa= efaa[1]; - efa->f1= 1; - - - w= EM_face_from_faces(em, efaa[0], efaa[1], - vindex[1], 4+vindex[2], 4+vindex[3], -1); - w->f |= SELECT; - - - w= EM_face_from_faces(em, efaa[0], efaa[1], - vindex[0], 4+vindex[1], 4+vindex[3], -1); - w->f |= SELECT; - - onedone= 1; - } - } - } - } - } - - } - eed= nexted; - } - - free_tagged_edges_faces(em, em->edges.first, em->faces.first); - - if(onedone==0) break; - - EM_selectmode_set(em); // new edges/faces were added - } - - MEM_freeN(efaar); - - EM_select_flush(em); - -// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - -} - /* ******************** BEGIN TRIANGLE TO QUAD ************************************* */ static float measure_facepair(EditVert *v1, EditVert *v2, EditVert *v3, EditVert *v4, float limit) @@ -3617,7 +3464,7 @@ void edge_flip(EditMesh *em) } -static void edge_rotate(EditMesh *em, EditEdge *eed,int dir) +static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed,int dir) { EditVert **verts[2]; EditFace *face[2], *efa, *newFace[2]; @@ -3702,7 +3549,7 @@ static void edge_rotate(EditMesh *em, EditEdge *eed,int dir) hiddenedges = MEM_mallocN(sizeof(EditVert*)*numhidden+1, "RotateEdgeHiddenVerts"); if(!hiddenedges) { - error("Malloc Was not happy!"); + BKE_report(op->reports, RPT_ERROR, "Memory allocation failed"); return; } @@ -3831,14 +3678,14 @@ static int edge_rotate_selected(bContext *C, wmOperator *op) if(edgeCount==1) { for(eed= em->edges.first; eed; eed= eed->next) { if(eed->f1==2) { - edge_rotate(em, eed,dir); + edge_rotate(em, op, eed,dir); break; } } } else { - error("Select one edge or two adjacent faces"); + BKE_report(op->reports, RPT_ERROR, "Select one edge or two adjacent faces"); return OPERATOR_CANCELLED; } } @@ -3846,14 +3693,14 @@ static int edge_rotate_selected(bContext *C, wmOperator *op) for(eed= em->edges.first; eed; eed= eed->next) { if(eed->f & SELECT) { EM_select_edge(eed, 0); - edge_rotate(em, eed,dir); + edge_rotate(em, op, eed,dir); break; } } } else { - error("Select one edge or two adjacent faces"); + BKE_report(op->reports, RPT_ERROR, "Select one edge or two adjacent faces"); return OPERATOR_CANCELLED; } @@ -3977,8 +3824,14 @@ typedef struct SlideVert { EditVert origvert; } SlideVert; -int EdgeSlide(EditMesh *em, short immediate, float imperc) +int EdgeSlide(EditMesh *em, wmOperator *op, short immediate, float imperc) { + return 0; +/* XXX REFACTOR - #if 0'd for now, otherwise can't make 64bit windows builds on 64bit machine */ +#if 0 +useless: + goto useless // because it doesn't do anything right now + // NumInput num; XXX Mesh *me= NULL; // XXX EditFace *efa; @@ -4032,7 +3885,7 @@ int EdgeSlide(EditMesh *em, short immediate, float imperc) ct++; efa->e1->f1++; if(efa->e1->f1 > 2) { - error("3+ face edge"); + BKE_report(op->reports, RPT_ERROR, "3+ face edge"); return 0; } } @@ -4040,7 +3893,7 @@ int EdgeSlide(EditMesh *em, short immediate, float imperc) ct++; efa->e2->f1++; if(efa->e2->f1 > 2) { - error("3+ face edge"); + BKE_report(op->reports, RPT_ERROR, "3+ face edge"); return 0; } } @@ -4048,7 +3901,7 @@ int EdgeSlide(EditMesh *em, short immediate, float imperc) ct++; efa->e3->f1++; if(efa->e3->f1 > 2) { - error("3+ face edge"); + BKE_report(op->reports, RPT_ERROR, "3+ face edge"); return 0; } } @@ -4056,13 +3909,13 @@ int EdgeSlide(EditMesh *em, short immediate, float imperc) ct++; efa->e4->f1++; if(efa->e4->f1 > 2) { - error("3+ face edge"); + BKE_report(op->reports, RPT_ERROR, "3+ face edge"); return 0; } } // Make sure loop is not 2 edges of same face if(ct > 1) { - error("loop crosses itself"); + BKE_report(op->reports, RPT_ERROR, "Loop crosses itself"); return 0; } } @@ -4073,7 +3926,7 @@ int EdgeSlide(EditMesh *em, short immediate, float imperc) // Test for multiple segments if(vertsel > numsel+1) { - error("Was not a single edge loop"); + BKE_report(op->reports, RPT_ERROR, "Please choose a single edge loop"); return 0; } @@ -4109,7 +3962,7 @@ int EdgeSlide(EditMesh *em, short immediate, float imperc) // It looks like there was an unexpected case - Hopefully should not happen if(timesthrough >= numsel*2) { BLI_linklist_free(edgelist,NULL); - error("could not order loop"); + BKE_report(op->reports, RPT_ERROR, "Could not order loop"); return 0; } } @@ -4252,7 +4105,7 @@ int EdgeSlide(EditMesh *em, short immediate, float imperc) tempsv = BLI_ghash_lookup(vertgh,(EditVert*)look->link); if(!tempsv->up || !tempsv->down) { - error("Missing rails"); + BKE_report(op->reports, RPT_ERROR, "Missing rails"); BLI_ghash_free(vertgh, NULL, (GHashValFreeFP)MEM_freeN); BLI_linklist_free(vertlist,NULL); BLI_linklist_free(edgelist,NULL); @@ -4757,9 +4610,10 @@ int EdgeSlide(EditMesh *em, short immediate, float imperc) } return 1; +#endif // END OF XXX } -int EdgeLoopDelete(EditMesh *em) +int EdgeLoopDelete(EditMesh *em, wmOperator *op) { /* temporal flag setting so we keep UVs when deleting edge loops, @@ -4767,7 +4621,7 @@ int EdgeLoopDelete(EditMesh *em) // short uvcalc_flag_orig = 0; // XXX scene->toolsettings->uvcalc_flag; // scene->toolsettings->uvcalc_flag |= UVCALC_TRANSFORM_CORRECT; - if(!EdgeSlide(em, 1, 1)) { + if(!EdgeSlide(em, op, 1, 1)) { return 0; } @@ -4783,7 +4637,7 @@ int EdgeLoopDelete(EditMesh *em) /* -------------------- More tools ------------------ */ - +#if 0 void mesh_set_face_flags(EditMesh *em, short mode) { EditFace *efa; @@ -4851,6 +4705,7 @@ void mesh_set_face_flags(EditMesh *em, short mode) } } +#endif void mesh_set_smooth_faces(EditMesh *em, short event) { @@ -4871,13 +4726,15 @@ void mesh_set_smooth_faces(EditMesh *em, short event) } +/* ********************** mesh rip ********************** */ + /* helper to find edge for edge_rip */ -static float mesh_rip_edgedist(float mat[][4], float *co1, float *co2, short *mval) +static float mesh_rip_edgedist(ARegion *ar, float mat[][4], float *co1, float *co2, short *mval) { float vec1[3], vec2[3], mvalf[2]; -// XXX view3d_project_float(curarea, co1, vec1, mat); -// view3d_project_float(curarea, co2, vec2, mat); + view3d_project_float(ar, co1, vec1, mat); + view3d_project_float(ar, co2, vec2, mat); mvalf[0]= (float)mval[0]; mvalf[1]= (float)mval[1]; @@ -4905,14 +4762,18 @@ static void mesh_rip_setface(EditMesh *em, EditFace *sefa) } /* based on mouse cursor position, it defines how is being ripped */ -void mesh_rip(EditMesh *em) +static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event) { - extern void faceloop_select(EditEdge *startedge, int select); + ARegion *ar= CTX_wm_region(C); + RegionView3D *rv3d= ar->regiondata; + Object *obedit= CTX_data_edit_object(C); + EditMesh *em= ((Mesh *)obedit->data)->edit_mesh; EditVert *eve, *nextve; EditEdge *eed, *seed= NULL; EditFace *efa, *sefa= NULL; - float projectMat[4][4], vec[3], dist, mindist; // viewMat[4][4], XXX - short doit= 1, mval[2]; // XXX ,propmode,prop; + float projectMat[4][4], vec[3], dist, mindist, viewMat[4][4]; + short doit= 1, *mval= event->mval; // XXX ,propmode,prop; + // XXX propmode = scene->prop_mode; // scene->prop_mode = 0; @@ -4922,8 +4783,7 @@ void mesh_rip(EditMesh *em) /* select flush... vertices are important */ EM_selectmode_set(em); -// XXX getmouseco_areawin(mval); -// view3d_get_object_project_mat(curarea, obedit, projectMat, viewMat); + view3d_get_object_project_mat(rv3d, obedit, projectMat, viewMat); /* find best face, exclude triangles and break on face select or faces with 2 edges select */ mindist= 1000000.0f; @@ -4940,7 +4800,7 @@ void mesh_rip(EditMesh *em) if(totsel>1) break; -// view3d_project_float(curarea, efa->cent, vec, projectMat); + view3d_project_float(ar, efa->cent, vec, projectMat); dist= sqrt( (vec[0]-mval[0])*(vec[0]-mval[0]) + (vec[1]-mval[1])*(vec[1]-mval[1]) ); if(dist<mindist) { mindist= dist; @@ -4950,12 +4810,12 @@ void mesh_rip(EditMesh *em) } if(efa) { - error("Can't perform ripping with faces selected this way"); - return; + BKE_report(op->reports, RPT_ERROR, "Can't perform ripping with faces selected this way"); + return OPERATOR_CANCELLED; } if(sefa==NULL) { - error("No proper selection or faces included"); - return; + BKE_report(op->reports, RPT_ERROR, "No proper selection or faces included"); + return OPERATOR_CANCELLED; } @@ -4980,7 +4840,7 @@ void mesh_rip(EditMesh *em) if(seed==NULL) { mindist= 1000000.0f; if(sefa->e1->v1->tmp.v || sefa->e1->v2->tmp.v) { - dist = mesh_rip_edgedist(projectMat, + dist = mesh_rip_edgedist(ar, projectMat, sefa->e1->v1->co, sefa->e1->v2->co, mval); if(dist<mindist) { @@ -4989,7 +4849,7 @@ void mesh_rip(EditMesh *em) } } if(sefa->e2->v1->tmp.v || sefa->e2->v2->tmp.v) { - dist = mesh_rip_edgedist(projectMat, + dist = mesh_rip_edgedist(ar, projectMat, sefa->e2->v1->co, sefa->e2->v2->co, mval); if(dist<mindist) { @@ -4998,7 +4858,7 @@ void mesh_rip(EditMesh *em) } } if(sefa->e3->v1->tmp.v || sefa->e3->v2->tmp.v) { - dist= mesh_rip_edgedist(projectMat, + dist= mesh_rip_edgedist(ar, projectMat, sefa->e3->v1->co, sefa->e3->v2->co, mval); if(dist<mindist) { @@ -5007,7 +4867,7 @@ void mesh_rip(EditMesh *em) } } if(sefa->e4 && (sefa->e4->v1->tmp.v || sefa->e4->v2->tmp.v)) { - dist= mesh_rip_edgedist(projectMat, + dist= mesh_rip_edgedist(ar, projectMat, sefa->e4->v1->co, sefa->e4->v2->co, mval); if(dist<mindist) { @@ -5018,11 +4878,11 @@ void mesh_rip(EditMesh *em) } if(seed==NULL) { // never happens? - error("No proper edge found to start"); - return; + BKE_report(op->reports, RPT_ERROR, "No proper edge found to start"); + return OPERATOR_CANCELLED; } - faceloop_select(seed, 2); // tmp abuse for finding all edges that need duplicated, returns OK faces with f1 + faceloop_select(em, seed, 2); // tmp abuse for finding all edges that need duplicated, returns OK faces with f1 /* duplicate edges in the loop, with at least 1 vertex selected, needed for selection flip */ for(eed = em->edges.last; eed; eed= eed->prev) { @@ -5033,8 +4893,9 @@ void mesh_rip(EditMesh *em) newed= addedgelist(em, eed->v1->tmp.v?eed->v1->tmp.v:eed->v1, eed->v2->tmp.v?eed->v2->tmp.v:eed->v2, eed); if(eed->f & SELECT) { - eed->f &= ~SELECT; - newed->f |= SELECT; + EM_select_edge(eed, 0); + EM_remove_selection(em, eed, EDITEDGE); + EM_select_edge(newed, 1); } eed->tmp.v = (EditVert *)newed; } @@ -5101,15 +4962,36 @@ void mesh_rip(EditMesh *em) } } -// BIF_TransformSetUndo("Rip"); -// initTransform(TFM_TRANSLATION, 0); -// Transform(); - + RNA_int_set(op->ptr, "mode", TFM_TRANSLATION); + WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr); + // scene->prop_mode = propmode; // XXX scene->proportional = prop; + + return OPERATOR_FINISHED; } -void shape_propagate(Scene *scene, Object *obedit, EditMesh *em) +void MESH_OT_rip(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Rip"; + ot->idname= "MESH_OT_rip"; + + /* api callbacks */ + ot->invoke= mesh_rip_invoke; + ot->poll= ED_operator_editmesh; // XXX + v3d! + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* to give to transform */ + RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX); +} + + +/* ************************************** */ + +void shape_propagate(Scene *scene, Object *obedit, EditMesh *em, wmOperator *op) { EditVert *ev = NULL; Mesh* me = (Mesh*)obedit->data; @@ -5121,7 +5003,7 @@ void shape_propagate(Scene *scene, Object *obedit, EditMesh *em) if(me->key){ ky = me->key; } else { - error("Object Has No Key"); + BKE_report(op->reports, RPT_ERROR, "Object Has No Key"); return; } @@ -5136,7 +5018,7 @@ void shape_propagate(Scene *scene, Object *obedit, EditMesh *em) } } } else { - error("Object Has No Blendshapes"); + BKE_report(op->reports, RPT_ERROR, "Object Has No Blendshapes"); return; } @@ -5233,7 +5115,7 @@ void shape_copy_from_lerp(EditMesh *em, KeyBlock* thisBlock, KeyBlock* fromBlock -void shape_copy_select_from(Object *obedit, EditMesh *em) +void shape_copy_select_from(Object *obedit, EditMesh *em, wmOperator *op) { Mesh* me = (Mesh*)obedit->data; EditVert *ev = NULL; @@ -5247,7 +5129,7 @@ void shape_copy_select_from(Object *obedit, EditMesh *em) if(me->key){ ky = me->key; } else { - error("Object Has No Key"); + BKE_report(op->reports, RPT_ERROR, "Object Has No Key"); return; } @@ -5272,7 +5154,7 @@ void shape_copy_select_from(Object *obedit, EditMesh *em) // XXX nr = pupmenu_col(menu, 20); MEM_freeN(menu); } else { - error("Object Has No Blendshapes"); + BKE_report(op->reports, RPT_ERROR, "Object Has No Blendshapes"); return; } @@ -5286,7 +5168,7 @@ void shape_copy_select_from(Object *obedit, EditMesh *em) } if(me->totvert != totverts){ - error("Shape Has had Verts Added/Removed, please cycle editmode before copying"); + BKE_report(op->reports, RPT_ERROR, "Shape Has had Verts Added/Removed, please cycle editmode before copying"); return; } shape_copy_from_lerp(em, thisBlock,kb); @@ -5864,7 +5746,7 @@ typedef struct PathEdge{ float w; } PathEdge; -void pathselect(EditMesh *em) +void pathselect(EditMesh *em, wmOperator *op) { EditVert *eve, *s, *t; EditEdge *eed; @@ -6016,7 +5898,7 @@ void pathselect(EditMesh *em) } } else{ - error("Path Selection requires that exactly two vertices be selected"); + BKE_report(op->reports, RPT_ERROR, "Path Selection requires that exactly two vertices be selected"); return; } } @@ -6025,7 +5907,6 @@ static int region_to_loop(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); EditMesh *em= ((Mesh *)obedit->data)->edit_mesh; - EditEdge *eed; EditFace *efa; @@ -6268,7 +6149,7 @@ static int mesh_rotate_uvs(bContext *C, wmOperator *op) int shift = 0; // XXX if (!EM_texFaceCheck(em)) { - error("mesh has no uv/image layers"); + BKE_report(op->reports, RPT_ERROR, "mesh has no uv/image layers"); return OPERATOR_CANCELLED; } @@ -6340,7 +6221,7 @@ static int mesh_mirror_uvs(bContext *C, wmOperator *op) int shift= 0; // XXX if (!EM_texFaceCheck(em)) { - error("mesh has no uv/image layers"); + BKE_report(op->reports, RPT_ERROR, "mesh has no uv/image layers"); return OPERATOR_CANCELLED; } @@ -6425,7 +6306,7 @@ static int mesh_rotate_colors(bContext *C, wmOperator *op) int shift= 0; // XXX if (!EM_vertColorCheck(em)) { - error("mesh has no color layers"); + BKE_report(op->reports, RPT_ERROR, "mesh has no color layers"); return OPERATOR_CANCELLED; } @@ -6480,7 +6361,7 @@ static int mesh_mirror_colors(bContext *C, wmOperator *op) int shift= 0; // XXX if (!EM_vertColorCheck(em)) { - error("mesh has no color layers"); + BKE_report(op->reports, RPT_ERROR, "Mesh has no color layers"); return OPERATOR_CANCELLED; } @@ -6760,12 +6641,260 @@ void MESH_OT_subdivs(wmOperatorType *ot) } +/* ************************************* */ + +/* note; the EM_selectmode_set() calls here illustrate how badly constructed it all is... from before the +edge/face flags, with very mixed results.... */ +static void beauty_fill(EditMesh *em) +{ + EditVert *v1, *v2, *v3, *v4; + EditEdge *eed, *nexted; + EditEdge dia1, dia2; + EditFace *efa, *w; + // void **efaar, **efaa; + EVPTuple *efaar; + EVPtr *efaa; + float len1, len2, len3, len4, len5, len6, opp1, opp2, fac1, fac2; + int totedge, ok, notbeauty=8, onedone, vindex[4]; + + /* - all selected edges with two faces + * - find the faces: store them in edges (using datablock) + * - per edge: - test convex + * - test edge: flip? + * - if true: remedge, addedge, all edges at the edge get new face pointers + */ + + EM_selectmode_set(em); // makes sure in selectmode 'face' the edges of selected faces are selected too + + totedge = count_selected_edges(em->edges.first); + if(totedge==0) return; + + /* temp block with face pointers */ + efaar= (EVPTuple *) MEM_callocN(totedge * sizeof(EVPTuple), "beautyfill"); + + while (notbeauty) { + notbeauty--; + + ok = collect_quadedges(efaar, em->edges.first, em->faces.first); + + /* there we go */ + onedone= 0; + + eed= em->edges.first; + while(eed) { + nexted= eed->next; + + /* f2 is set in collect_quadedges() */ + if(eed->f2==2 && eed->h==0) { + + efaa = (EVPtr *) eed->tmp.p; + + /* none of the faces should be treated before, nor be part of fgon */ + ok= 1; + efa= efaa[0]; + if(efa->e1->f1 || efa->e2->f1 || efa->e3->f1) ok= 0; + if(efa->fgonf) ok= 0; + efa= efaa[1]; + if(efa->e1->f1 || efa->e2->f1 || efa->e3->f1) ok= 0; + if(efa->fgonf) ok= 0; + + if(ok) { + /* test convex */ + givequadverts(efaa[0], efaa[1], &v1, &v2, &v3, &v4, vindex); + if(v1 && v2 && v3 && v4) { + if( convex(v1->co, v2->co, v3->co, v4->co) ) { + + /* test edges */ + if( (v1) > (v3) ) { + dia1.v1= v3; + dia1.v2= v1; + } + else { + dia1.v1= v1; + dia1.v2= v3; + } + + if( (v2) > (v4) ) { + dia2.v1= v4; + dia2.v2= v2; + } + else { + dia2.v1= v2; + dia2.v2= v4; + } + + /* testing rule: + * the area divided by the total edge lengths + */ + + len1= VecLenf(v1->co, v2->co); + len2= VecLenf(v2->co, v3->co); + len3= VecLenf(v3->co, v4->co); + len4= VecLenf(v4->co, v1->co); + len5= VecLenf(v1->co, v3->co); + len6= VecLenf(v2->co, v4->co); + + opp1= AreaT3Dfl(v1->co, v2->co, v3->co); + opp2= AreaT3Dfl(v1->co, v3->co, v4->co); + + fac1= opp1/(len1+len2+len5) + opp2/(len3+len4+len5); + + opp1= AreaT3Dfl(v2->co, v3->co, v4->co); + opp2= AreaT3Dfl(v2->co, v4->co, v1->co); + + fac2= opp1/(len2+len3+len6) + opp2/(len4+len1+len6); + + ok= 0; + if(fac1 > fac2) { + if(dia2.v1==eed->v1 && dia2.v2==eed->v2) { + eed->f1= 1; + efa= efaa[0]; + efa->f1= 1; + efa= efaa[1]; + efa->f1= 1; + + w= EM_face_from_faces(em, efaa[0], efaa[1], + vindex[0], vindex[1], 4+vindex[2], -1); + w->f |= SELECT; + + + w= EM_face_from_faces(em, efaa[0], efaa[1], + vindex[0], 4+vindex[2], 4+vindex[3], -1); + w->f |= SELECT; + + onedone= 1; + } + } + else if(fac1 < fac2) { + if(dia1.v1==eed->v1 && dia1.v2==eed->v2) { + eed->f1= 1; + efa= efaa[0]; + efa->f1= 1; + efa= efaa[1]; + efa->f1= 1; + + + w= EM_face_from_faces(em, efaa[0], efaa[1], + vindex[1], 4+vindex[2], 4+vindex[3], -1); + w->f |= SELECT; + + + w= EM_face_from_faces(em, efaa[0], efaa[1], + vindex[0], 4+vindex[1], 4+vindex[3], -1); + w->f |= SELECT; + + onedone= 1; + } + } + } + } + } + + } + eed= nexted; + } + + free_tagged_edges_faces(em, em->edges.first, em->faces.first); + + if(onedone==0) break; + + EM_selectmode_set(em); // new edges/faces were added + } + + MEM_freeN(efaar); + + EM_select_flush(em); + +} + +/* Got this from scanfill.c. You will need to juggle around the +* callbacks for the scanfill.c code a bit for this to work. */ +static void fill_mesh(EditMesh *em) +{ + EditVert *eve,*v1; + EditEdge *eed,*e1,*nexted; + EditFace *efa,*nextvl, *efan; + short ok; + + if(em==NULL) return; + waitcursor(1); + + /* copy all selected vertices */ + eve= em->verts.first; + while(eve) { + if(eve->f & SELECT) { + v1= BLI_addfillvert(eve->co); + eve->tmp.v= v1; + v1->tmp.v= eve; + v1->xs= 0; // used for counting edges + } + eve= eve->next; + } + /* copy all selected edges */ + eed= em->edges.first; + while(eed) { + if( (eed->v1->f & SELECT) && (eed->v2->f & SELECT) ) { + e1= BLI_addfilledge(eed->v1->tmp.v, eed->v2->tmp.v); + e1->v1->xs++; + e1->v2->xs++; + } + eed= eed->next; + } + /* from all selected faces: remove vertices and edges to prevent doubles */ + /* all edges add values, faces subtract, + then remove edges with vertices ->xs<2 */ + efa= em->faces.first; + ok= 0; + while(efa) { + nextvl= efa->next; + if( faceselectedAND(efa, 1) ) { + efa->v1->tmp.v->xs--; + efa->v2->tmp.v->xs--; + efa->v3->tmp.v->xs--; + if(efa->v4) efa->v4->tmp.v->xs--; + ok= 1; + + } + efa= nextvl; + } + if(ok) { /* there are faces selected */ + eed= filledgebase.first; + while(eed) { + nexted= eed->next; + if(eed->v1->xs<2 || eed->v2->xs<2) { + BLI_remlink(&filledgebase,eed); + } + eed= nexted; + } + } + + if(BLI_edgefill(0, em->mat_nr)) { + efa= fillfacebase.first; + while(efa) { + /* normals default pointing up */ + efan= addfacelist(em, efa->v3->tmp.v, efa->v2->tmp.v, + efa->v1->tmp.v, 0, NULL, NULL); + if(efan) EM_select_face(efan, 1); + efa= efa->next; + } + } + + BLI_end_edgefill(); + beauty_fill(em); + + WM_cursor_wait(0); + EM_select_flush(em); + +} + + static int fill_mesh_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); EditMesh *em= ((Mesh *)obedit->data)->edit_mesh; fill_mesh(em); + DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); @@ -6792,7 +6921,7 @@ static int beauty_fill_exec(bContext *C, wmOperator *op) Object *obedit= CTX_data_edit_object(C); EditMesh *em= ((Mesh *)obedit->data)->edit_mesh; - beauty_fill(em); + beauty_fill(em); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); |