diff options
author | Andrew Wiggin <ender79bl@gmail.com> | 2011-10-10 18:56:09 +0400 |
---|---|---|
committer | Andrew Wiggin <ender79bl@gmail.com> | 2011-10-10 18:56:09 +0400 |
commit | 69732dbe2145aecab77b14508aaa65525237a121 (patch) | |
tree | 808cf10c8c01205b45ca34d0e57f4235655277a6 | |
parent | 5ae7a91eb38546f0e0255a8e86807b42afeefc34 (diff) |
Miscellaneous cleanup, comment changes, and asserts. Should be no functional changes.
-rw-r--r-- | source/blender/blenkernel/intern/bvhutils.c | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/editderivedbmesh.c | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh_validate.c | 2 | ||||
-rw-r--r-- | source/blender/bmesh/bmesh_marking.h | 2 | ||||
-rw-r--r-- | source/blender/bmesh/editmesh_tools.c | 38 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_construct.c | 3 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_marking.c | 4 | ||||
-rw-r--r-- | source/blender/editors/mesh/bmesh_tools.c | 495 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_edgesplit.c | 2 |
10 files changed, 88 insertions, 475 deletions
diff --git a/source/blender/blenkernel/intern/bvhutils.c b/source/blender/blenkernel/intern/bvhutils.c index e32a398a926..e41fe45e121 100644 --- a/source/blender/blenkernel/intern/bvhutils.c +++ b/source/blender/blenkernel/intern/bvhutils.c @@ -583,9 +583,15 @@ BVHTree* bvhtree_from_mesh_faces(BVHTreeFromMesh *data, DerivedMesh *mesh, float tree = BLI_bvhtree_new(numFaces, epsilon, tree_type, axis); if(tree != NULL) { - /* XXX, for snap only, em & dm are assumed to be aligned, since dm is the em's cage */ BMEditMesh *em= data->em_evil; if(em) { + /*data->em_evil is only set for snapping, and only for the mesh of the object + which is currently open in edit mode. When set, the bvhtree should not contain + faces that will interfere with snapping (e.g. faces that are hidden/selected + or faces that have selected verts).*/ + + /* XXX, for snap only, em & dm are assumed to be aligned, since dm is the em's cage */ + /*Insert BMesh-tesselation triangles into the bvh tree, unless they are hidden and/or selected. Even if the faces themselves are not selected for the snapped transform, having a vertex selected means the face (and thus it's tesselated diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 98acf24e506..f8dfbd4b7b6 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1963,7 +1963,6 @@ DerivedMesh *CDDM_from_BMEditMesh(BMEditMesh *em, Mesh *UNUSED(me), int use_mdis med->v1 = BM_GetIndex(eed->v1); med->v2 = BM_GetIndex(eed->v2); - med->flag = ME_EDGEDRAW|ME_EDGERENDER; if (has_crease) med->crease = (unsigned char)(BM_GetCDf(&bm->edata, eed, CD_CREASE)*255.0f); diff --git a/source/blender/blenkernel/intern/editderivedbmesh.c b/source/blender/blenkernel/intern/editderivedbmesh.c index 40c2485196a..1b9116a7533 100644 --- a/source/blender/blenkernel/intern/editderivedbmesh.c +++ b/source/blender/blenkernel/intern/editderivedbmesh.c @@ -1228,9 +1228,7 @@ static void bmDM_getEdge(DerivedMesh *dm, int index, MEdge *edge_r) edge_r->crease = (unsigned char) (BM_GetCDf(&bm->edata, e, CD_CREASE)*255.0f); } - /* Should this be set in BMFlags_To_MEFlags? */ - edge_r->flag = ME_EDGERENDER; - edge_r->flag |= BMFlags_To_MEFlags(e); + edge_r->flag = BMFlags_To_MEFlags(e); edge_r->v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(bmdm->vhash, e->v1)); edge_r->v2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(bmdm->vhash, e->v2)); @@ -1308,9 +1306,7 @@ static void bmDM_copyEdgeArray(DerivedMesh *dm, MEdge *edge_r) edge_r->crease = (unsigned char) (BM_GetCDf(&bm->edata, ee, CD_CREASE)*255.0f); } - /* Should this be set in BMFlags_To_MEFlags? */ - edge_r->flag = ME_EDGERENDER; - edge_r->flag |= BMFlags_To_MEFlags(ee); + edge_r->flag = BMFlags_To_MEFlags(ee); edge_r->v1 = (int)BM_GetIndex(ee->v1); edge_r->v2 = (int)BM_GetIndex(ee->v2); diff --git a/source/blender/blenkernel/intern/mesh_validate.c b/source/blender/blenkernel/intern/mesh_validate.c index 76e74034ec7..1484a91f1f2 100644 --- a/source/blender/blenkernel/intern/mesh_validate.c +++ b/source/blender/blenkernel/intern/mesh_validate.c @@ -406,7 +406,7 @@ void BKE_mesh_calc_edges(Mesh *mesh, int update) int j; for (j=0; j < mp->totloop; j++, l++) { /* lookup hashed edge index */ - med_index = BLI_edgehash_lookup(eh, l_prev->v, l->v); + med_index = GET_INT_FROM_POINTER(BLI_edgehash_lookup(eh, l_prev->v, l->v)); l_prev->e = med_index; l_prev= l; } diff --git a/source/blender/bmesh/bmesh_marking.h b/source/blender/bmesh/bmesh_marking.h index 5deb14fa34d..c8e161a37fd 100644 --- a/source/blender/bmesh/bmesh_marking.h +++ b/source/blender/bmesh/bmesh_marking.h @@ -38,7 +38,7 @@ void BM_Select_Face(struct BMesh *bm, struct BMFace *f, int select); void BM_Selectmode_Set(struct BMesh *bm, int selectmode); /*counts number of elements with flag set*/ -int BM_CountFlag(struct BMesh *bm, int type, int flag, int respectflag); +int BM_CountFlag(struct BMesh *bm, int type, int flag, int respecthide); /*edit selection stuff*/ void BM_set_actFace(BMesh *em, BMFace *f); diff --git a/source/blender/bmesh/editmesh_tools.c b/source/blender/bmesh/editmesh_tools.c index b611a729f76..c62e7aef40d 100644 --- a/source/blender/bmesh/editmesh_tools.c +++ b/source/blender/bmesh/editmesh_tools.c @@ -2418,43 +2418,6 @@ static EditVert *subdivideedgenum(EditEdge *edge, int curpoint, int totpoint, fl return ev; } -#if 1 -#include "bmesh.h" - -void esubdivideflag(int flag, float rad, int beauty, int numcuts, int seltype) -{ - BMesh *bm; - BMOperator subdop, conv; - EditMesh *em = G.editMesh; - BMEdge **list, *bed; - BMIter iter; - int tot; - - /*convert from editmesh*/ - bm = editmesh_to_bmesh(G.editMesh); - - BMO_Init_Op(&subdop, BMOP_ESUBDIVIDE); - for (tot=0, bed=BMIter_New(&iter, bm, BM_EDGES, NULL); bed; bed=BMIter_Step(&iter)) { - if (BM_Selected(bm, bed)) tot++; - } - - list = MEM_callocN(sizeof(void*)*tot, "vert ptr list"); - - for (tot=0, bed=BMIter_New(&iter, bm, BM_EDGES, NULL); bed; bed=BMIter_Step(&iter)) { - if (BM_Selected(bm, bed)) list[tot++] = bed; - } - - BMO_Set_PntBuf(&subdop, BMOP_ESUBDIVIDE_EDGES, list, tot); - BMO_Exec_Op(bm, &subdop); - BMO_Finish_Op(bm, &subdop); - - free_editMesh(G.editMesh); - bmesh_to_editmesh(bm); - BM_Free_Mesh(bm); - - if (list) MEM_freeN(list); -} -#else void esubdivideflag(int flag, float rad, int beauty, int numcuts, int seltype) { EditMesh *em = G.editMesh; @@ -2828,7 +2791,6 @@ void esubdivideflag(int flag, float rad, int beauty, int numcuts, int seltype) allqueue(REDRAWVIEW3D, 0); DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA); } -#endif static int count_selected_edges(EditEdge *ed) { diff --git a/source/blender/bmesh/intern/bmesh_construct.c b/source/blender/bmesh/intern/bmesh_construct.c index 0507da5e3aa..bd50f341784 100644 --- a/source/blender/bmesh/intern/bmesh_construct.c +++ b/source/blender/bmesh/intern/bmesh_construct.c @@ -52,7 +52,6 @@ #include <string.h> #define SELECT 1 - #define BM_EDGEVERT (1<<14) /*prototypes*/ static void bm_copy_loop_attributes(BMesh *source_mesh, BMesh *target_mesh, @@ -645,7 +644,7 @@ int BMFlags_To_MEFlags(void *element) { if (src_flag & BM_SEAM) dst_flag |= ME_SEAM; if (src_flag & BM_SHARP) dst_flag |= ME_SHARP; if (BM_Wire_Edge(NULL, element)) dst_flag |= ME_LOOSEEDGE; - dst_flag |= ME_EDGEDRAW; + dst_flag |= ME_EDGEDRAW | ME_EDGERENDER; } else if (src_type == BM_VERT) { if (src_flag & BM_SELECT) dst_flag |= SELECT; } diff --git a/source/blender/bmesh/intern/bmesh_marking.c b/source/blender/bmesh/intern/bmesh_marking.c index b49097fd253..8e3aca30a97 100644 --- a/source/blender/bmesh/intern/bmesh_marking.c +++ b/source/blender/bmesh/intern/bmesh_marking.c @@ -362,7 +362,9 @@ void BM_Select(struct BMesh *bm, void *element, int select) int BM_Selected(BMesh *UNUSED(bm), const void *element) { const BMHeader *head = element; - return BM_TestHFlag(head, BM_SELECT); + int selected = BM_TestHFlag(head, BM_SELECT); + BLI_assert(!selected || !BM_TestHFlag(head, BM_HIDDEN)); + return selected; } /* this replaces the active flag used in uv/face mode */ diff --git a/source/blender/editors/mesh/bmesh_tools.c b/source/blender/editors/mesh/bmesh_tools.c index d88ba72145d..7cb7147e5fe 100644 --- a/source/blender/editors/mesh/bmesh_tools.c +++ b/source/blender/editors/mesh/bmesh_tools.c @@ -223,94 +223,6 @@ static short EDBM_Extrude_face_indiv(BMEditMesh *em, wmOperator *op, short flag, return 's'; // s is shrink/fatten } -#if 0 -short EDBM_Extrude_face_indiv(BMEditMesh *em, wmOperator *op, short flag, float *nor) - EditVert *eve, *v1, *v2, *v3, *v4; - EditEdge *eed; - EditFace *efa, *nextfa; - - if(em==NULL) return 0; - - /* selected edges with 1 or more selected face become faces */ - /* selected faces each makes new faces */ - /* always remove old faces, keeps volumes manifold */ - /* select the new extrusion, deselect old */ - - /* step 1; init, count faces in edges */ - recalc_editnormals(em); - - for(eve= em->verts.first; eve; eve= eve->next) eve->f1= 0; // new select flag - - for(eed= em->edges.first; eed; eed= eed->next) { - eed->f2= 0; // amount of unselected faces - } - for(efa= em->faces.first; efa; efa= efa->next) { - if(efa->f & SELECT); - else { - efa->e1->f2++; - efa->e2->f2++; - efa->e3->f2++; - if(efa->e4) efa->e4->f2++; - } - } - - /* step 2: make new faces from faces */ - for(efa= em->faces.last; efa; efa= efa->prev) { - if(efa->f & SELECT) { - v1= addvertlist(em, efa->v1->co, efa->v1); - v2= addvertlist(em, efa->v2->co, efa->v2); - v3= addvertlist(em, efa->v3->co, efa->v3); - - v1->f1= v2->f1= v3->f1= 1; - copy_v3_v3(v1->no, efa->n); - copy_v3_v3(v2->no, efa->n); - copy_v3_v3(v3->no, efa->n); - if(efa->v4) { - v4= addvertlist(em, efa->v4->co, efa->v4); - v4->f1= 1; - copy_v3_v3(v4->no, efa->n); - } - else v4= NULL; - - /* side faces, clockwise */ - addfacelist(em, efa->v2, v2, v1, efa->v1, efa, NULL); - addfacelist(em, efa->v3, v3, v2, efa->v2, efa, NULL); - if(efa->v4) { - addfacelist(em, efa->v4, v4, v3, efa->v3, efa, NULL); - addfacelist(em, efa->v1, v1, v4, efa->v4, efa, NULL); - } - else { - addfacelist(em, efa->v1, v1, v3, efa->v3, efa, NULL); - } - /* top face */ - addfacelist(em, v1, v2, v3, v4, efa, NULL); - } - } - - /* step 3: remove old faces */ - efa= em->faces.first; - while(efa) { - nextfa= efa->next; - if(efa->f & SELECT) { - BLI_remlink(&em->faces, efa); - free_editface(em, efa); - } - efa= nextfa; - } - - /* step 4: redo selection */ - EM_clear_flag_all(em, SELECT); - - for(eve= em->verts.first; eve; eve= eve->next) { - if(eve->f1) eve->f |= SELECT; - } - - EM_select_flush(em); - - return 'n'; -} -#endif - /* extrudes individual edges */ static short EDBM_Extrude_edges_indiv(BMEditMesh *em, wmOperator *op, short flag, float *UNUSED(nor)) { @@ -329,72 +241,6 @@ static short EDBM_Extrude_edges_indiv(BMEditMesh *em, wmOperator *op, short flag return 'n'; // n is normal grab } -#if 0 -/* nor is filled with constraint vector */ -short EDBM_Extrude_edges_indiv(BMEditMesh *em, short flag, float *nor) -{ - EditVert *eve; - EditEdge *eed; - EditFace *efa; - - for(eve= em->verts.first; eve; eve= eve->next) eve->tmp.v = NULL; - for(eed= em->edges.first; eed; eed= eed->next) { - eed->tmp.f = NULL; - eed->f2= ((eed->f & flag)!=0); - } - - set_edge_directions_f2(em, 2); - - /* sample for next loop */ - for(efa= em->faces.first; efa; efa= efa->next) { - efa->e1->tmp.f = efa; - efa->e2->tmp.f = efa; - efa->e3->tmp.f = efa; - if(efa->e4) efa->e4->tmp.f = efa; - } - /* make the faces */ - for(eed= em->edges.first; eed; eed= eed->next) { - if(eed->f & flag) { - if(eed->v1->tmp.v == NULL) - eed->v1->tmp.v = addvertlist(em, eed->v1->co, eed->v1); - if(eed->v2->tmp.v == NULL) - eed->v2->tmp.v = addvertlist(em, eed->v2->co, eed->v2); - - if(eed->dir==1) - addfacelist(em, eed->v1, eed->v2, - eed->v2->tmp.v, eed->v1->tmp.v, - eed->tmp.f, NULL); - else - addfacelist(em, eed->v2, eed->v1, - eed->v1->tmp.v, eed->v2->tmp.v, - eed->tmp.f, NULL); - - /* for transform */ - if(eed->tmp.f) { - efa = eed->tmp.f; - if (efa->f & SELECT) add_normal_aligned(nor, efa->n); - } - } - } - normalize_v3(nor); - - /* set correct selection */ - EM_clear_flag_all(em, SELECT); - for(eve= em->verts.last; eve; eve= eve->prev) { - if(eve->tmp.v) { - eve->tmp.v->f |= flag; - } - } - - for(eed= em->edges.first; eed; eed= eed->next) { - if(eed->v1->f & eed->v2->f & flag) eed->f |= flag; - } - - if(nor[0]==0.0 && nor[1]==0.0 && nor[2]==0.0) return 'g'; // g is grab - return 'n'; // n is for normal constraint -} -#endif - /* extrudes individual vertices */ static short EDBM_Extrude_verts_indiv(BMEditMesh *em, wmOperator *op, short flag, float *UNUSED(nor)) { @@ -419,7 +265,6 @@ static short EDBM_Extrude_edge(Object *obedit, BMEditMesh *em, int flag, float * BMIter iter; BMOIter siter; BMOperator extop; - BMVert *vert; BMEdge *edge; BMFace *f; ModifierData *md; @@ -479,17 +324,7 @@ static short EDBM_Extrude_edge(Object *obedit, BMEditMesh *em, int flag, float * } } - BM_ITER(vert, &iter, bm, BM_VERTS_OF_MESH, NULL) { - BM_Select(bm, vert, 0); - } - - BM_ITER(edge, &iter, bm, BM_EDGES_OF_MESH, NULL) { - BM_Select(bm, edge, 0); - } - - BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) { - BM_Select(bm, f, 0); - } + EDBM_clear_flag_all(em, BM_SELECT); BMO_Exec_Op(bm, &extop); @@ -514,33 +349,32 @@ static short EDBM_Extrude_edge(Object *obedit, BMEditMesh *em, int flag, float * } static short EDBM_Extrude_vert(Object *obedit, BMEditMesh *em, short flag, float *nor) { - BMIter iter; - BMEdge *eed; + BMIter iter; + BMEdge *eed; - /*ensure vert flags are consistent for edge selections*/ - eed = BMIter_New(&iter, em->bm, BM_EDGES_OF_MESH, NULL); - for ( ; eed; eed=BMIter_Step(&iter)) { - if (BM_TestHFlag(eed, flag)) { + /*ensure vert flags are consistent for edge selections*/ + eed = BMIter_New(&iter, em->bm, BM_EDGES_OF_MESH, NULL); + for ( ; eed; eed=BMIter_Step(&iter)) { + if (BM_TestHFlag(eed, flag)) { + if (flag & BM_SELECT) { + BM_Select(em->bm, eed->v1, 1); + BM_Select(em->bm, eed->v2, 1); + } + + BM_SetHFlag(eed->v1, flag & ~BM_SELECT); + BM_SetHFlag(eed->v2, flag & ~BM_SELECT); + } else { + if (BM_TestHFlag(eed->v1, flag) && BM_TestHFlag(eed->v2, flag)) { if (flag & BM_SELECT) { - BM_Select(em->bm, eed->v1, 1); - BM_Select(em->bm, eed->v2, 1); + BM_Select(em->bm, eed, 1); } - BM_SetHFlag(eed->v1, flag & ~BM_SELECT); - BM_SetHFlag(eed->v2, flag & ~BM_SELECT); - } else { - if (BM_TestHFlag(eed->v1, flag) && BM_TestHFlag(eed->v2, flag)) { - if (flag & BM_SELECT) { - BM_Select(em->bm, eed, 1); - } - - BM_SetHFlag(eed, flag & ~BM_SELECT); - } + BM_SetHFlag(eed, flag & ~BM_SELECT); } } + } - return EDBM_Extrude_edge(obedit, em, flag, nor); - + return EDBM_Extrude_edge(obedit, em, flag, nor); } static int extrude_repeat_mesh(bContext *C, wmOperator *op) @@ -646,11 +480,11 @@ static int EDBM_Extrude_Mesh(Scene *scene, Object *obedit, BMEditMesh *em, wmOpe if(nr<1) return 'g'; if(nr==1 && em->selectmode & SCE_SELECT_VERTEX) - transmode= EDBM_Extrude_vert(obedit, em, SELECT, nor); - else if (nr == 1) transmode= EDBM_Extrude_edge(obedit, 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, op, SELECT, nor); - else transmode= EDBM_Extrude_face_indiv(em, op, SELECT, nor); + transmode= EDBM_Extrude_vert(obedit, em, BM_SELECT, nor); + else if (nr == 1) transmode= EDBM_Extrude_edge(obedit, em, BM_SELECT, nor); + else if(nr==4) transmode= EDBM_Extrude_verts_indiv(em, op, BM_SELECT, nor); + else if(nr==3) transmode= EDBM_Extrude_edges_indiv(em, op, BM_SELECT, nor); + else transmode= EDBM_Extrude_face_indiv(em, op, BM_SELECT, nor); if(transmode==0) { BKE_report(op->reports, RPT_ERROR, "Not a valid selection for extrude"); @@ -817,9 +651,9 @@ void MESH_OT_extrude_faces_indiv(wmOperatorType *ot) void EDBM_toggle_select_all(BMEditMesh *em) /* exported for UV */ { if(em->bm->totvertsel || em->bm->totedgesel || em->bm->totfacesel) - EDBM_clear_flag_all(em, SELECT); + EDBM_clear_flag_all(em, BM_SELECT); else - EDBM_set_flag_all(em, SELECT); + EDBM_set_flag_all(em, BM_SELECT); } static int toggle_select_all_exec(bContext *C, wmOperator *UNUSED(op)) @@ -975,7 +809,7 @@ static int dupli_extrude_cursor(bContext *C, wmOperator *op, wmEvent *event) EMBM_project_snap_verts(C, vc.ar, vc.obedit, vc.em); } - EDBM_Extrude_edge(vc.obedit, vc.em, SELECT, nor); + EDBM_Extrude_edge(vc.obedit, vc.em, BM_SELECT, nor); EDBM_CallOpf(vc.em, op, "rotate verts=%hv cent=%v mat=%m3", BM_SELECT, cent, mat); EDBM_CallOpf(vc.em, op, "translate verts=%hv vec=%v", @@ -1347,7 +1181,7 @@ void MESH_OT_mark_sharp(wmOperatorType *ot) } -static int editbmesh_vert_connect(bContext *C, wmOperator *UNUSED(op)) +static int editbmesh_vert_connect(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh; @@ -1355,10 +1189,14 @@ static int editbmesh_vert_connect(bContext *C, wmOperator *UNUSED(op)) BMOperator bmop; int len = 0; - BMO_InitOpf(bm, &bmop, "connectverts verts=%hv", BM_SELECT); + if (!EDBM_InitOpf(em, &bmop, op, "connectverts verts=%hv", BM_SELECT)) { + return OPERATOR_CANCELLED; + } BMO_Exec_Op(bm, &bmop); len = BMO_GetSlot(&bmop, "edgeout")->len; - BMO_Finish_Op(bm, &bmop); + if (!EDBM_FinishOp(em, &bmop, op, 1)) { + return OPERATOR_CANCELLED; + } DAG_id_tag_update(obedit->data, OB_RECALC_DATA); WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); @@ -1388,10 +1226,15 @@ static int editbmesh_edge_split(bContext *C, wmOperator *op) BMOperator bmop; int len = 0; - BMO_InitOpf(bm, &bmop, "edgesplit edges=%he numcuts=%d", BM_SELECT, RNA_int_get(op->ptr,"number_cuts")); + if (!EDBM_InitOpf(em, &bmop, op, "edgesplit edges=%he numcuts=%d", + BM_SELECT, RNA_int_get(op->ptr,"number_cuts"))) { + return OPERATOR_CANCELLED; + } BMO_Exec_Op(bm, &bmop); len = BMO_GetSlot(&bmop, "outsplit")->len; - BMO_Finish_Op(bm, &bmop); + if (!EDBM_FinishOp(em, &bmop, op, 1)) { + return OPERATOR_CANCELLED; + } DAG_id_tag_update(obedit->data, OB_RECALC_DATA); WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); @@ -2090,60 +1933,6 @@ static int mesh_reverse_colors(bContext *C, wmOperator *op) /* we succeeded */ return OPERATOR_FINISHED; -#if 0 - Scene *scene= CTX_data_scene(C); - Object *obedit= CTX_data_edit_object(C); - EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); - - EditFace *efa; - short change = 0; - MCol tmpcol, *mcol; - int axis= RNA_enum_get(op->ptr, "axis"); - - if (!EM_vertColorCheck(em)) { - BKE_report(op->reports, RPT_ERROR, "Mesh has no color layers"); - BKE_mesh_end_editmesh(obedit->data, em); - return OPERATOR_CANCELLED; - } - - for(efa=em->faces.first; efa; efa=efa->next) { - if (efa->f & SELECT) { - mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL); - if (axis == AXIS_Y) { - tmpcol= mcol[1]; - mcol[1]= mcol[2]; - mcol[2]= tmpcol; - - if(efa->v4) { - tmpcol= mcol[0]; - mcol[0]= mcol[3]; - mcol[3]= tmpcol; - } - } else { - tmpcol= mcol[0]; - mcol[0]= mcol[1]; - mcol[1]= tmpcol; - - if(efa->v4) { - tmpcol= mcol[2]; - mcol[2]= mcol[3]; - mcol[3]= tmpcol; - } - } - change = 1; - } - } - - BKE_mesh_end_editmesh(obedit->data, em); - - if(!change) - return OPERATOR_CANCELLED; - - DAG_id_tag_update(obedit->data, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); - -#endif - return OPERATOR_FINISHED; } void MESH_OT_uvs_rotate(wmOperatorType *ot) @@ -2512,162 +2301,6 @@ static int select_vertex_path_exec(bContext *C, wmOperator *op) /* we succeeded */ return OPERATOR_FINISHED; -#if 0 - Object *obedit= CTX_data_edit_object(C); - EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); - EditVert *eve, *s, *t; - EditEdge *eed; - EditSelection *ese; - PathEdge *newpe, *currpe; - PathNode *currpn; - PathNode *Q; - int v, *previous, pathvert, pnindex; /*pnindex redundant?*/ - int unbalanced, totnodes; - short physical; - float *cost; - Heap *heap; /*binary heap for sorting pointers to PathNodes based upon a 'cost'*/ - - s = t = NULL; - - ese = ((BMEditSelection*)em->selected.last); - if(ese && ese->type == BM_VERT && ese->prev && ese->prev->type == BM_VERT) { - physical= pupmenu("Distance Method? %t|Edge Length%x1|Topological%x0"); - - t = (EditVert*)ese->data; - s = (EditVert*)ese->prev->data; - - /*need to find out if t is actually reachable by s....*/ - for(eve=em->verts.first; eve; eve=eve->next){ - eve->f1 = 0; - } - - s->f1 = 1; - - unbalanced = 1; - totnodes = 1; - while(unbalanced){ - unbalanced = 0; - for(eed=em->edges.first; eed; eed=eed->next){ - if(!eed->h){ - if(eed->v1->f1 && !eed->v2->f1){ - eed->v2->f1 = 1; - totnodes++; - unbalanced = 1; - } - else if(eed->v2->f1 && !eed->v1->f1){ - eed->v1->f1 = 1; - totnodes++; - unbalanced = 1; - } - } - } - } - - if(s->f1 && t->f1){ /* t can be reached by s */ - Q = MEM_callocN(sizeof(PathNode)*totnodes, "Path Select Nodes"); - totnodes = 0; - for(eve=em->verts.first; eve; eve=eve->next){ - if(eve->f1){ - Q[totnodes].u = totnodes; - Q[totnodes].edges.first = 0; - Q[totnodes].edges.last = 0; - Q[totnodes].visited = 0; - eve->tmp.p = &(Q[totnodes]); - totnodes++; - } - else eve->tmp.p = NULL; - } - - for(eed=em->edges.first; eed; eed=eed->next){ - if(!eed->h){ - if(eed->v1->f1){ - currpn = ((PathNode*)eed->v1->tmp.p); - - newpe = MEM_mallocN(sizeof(PathEdge), "Path Edge"); - newpe->v = ((PathNode*)eed->v2->tmp.p)->u; - if(physical){ - newpe->w = len_v3v3(eed->v1->co, eed->v2->co); - } - else newpe->w = 1; - newpe->next = 0; - newpe->prev = 0; - BLI_addtail(&(currpn->edges), newpe); - } - if(eed->v2->f1){ - currpn = ((PathNode*)eed->v2->tmp.p); - newpe = MEM_mallocN(sizeof(PathEdge), "Path Edge"); - newpe->v = ((PathNode*)eed->v1->tmp.p)->u; - if(physical){ - newpe->w = len_v3v3(eed->v1->co, eed->v2->co); - } - else newpe->w = 1; - newpe->next = 0; - newpe->prev = 0; - BLI_addtail(&(currpn->edges), newpe); - } - } - } - - heap = BLI_heap_new(); - cost = MEM_callocN(sizeof(float)*totnodes, "Path Select Costs"); - previous = MEM_callocN(sizeof(int)*totnodes, "PathNode indices"); - - for(v=0; v < totnodes; v++){ - cost[v] = 1000000; - previous[v] = -1; /*array of indices*/ - } - - pnindex = ((PathNode*)s->tmp.p)->u; - cost[pnindex] = 0; - BLI_heap_insert(heap, 0.0f, SET_INT_IN_POINTER(pnindex)); - - while( !BLI_heap_empty(heap) ){ - - pnindex = GET_INT_FROM_POINTER(BLI_heap_popmin(heap)); - currpn = &(Q[pnindex]); - - if(currpn == (PathNode*)t->tmp.p) /*target has been reached....*/ - break; - - for(currpe=currpn->edges.first; currpe; currpe=currpe->next){ - if(!Q[currpe->v].visited){ - if( cost[currpe->v] > (cost[currpn->u ] + currpe->w) ){ - cost[currpe->v] = cost[currpn->u] + currpe->w; - previous[currpe->v] = currpn->u; - Q[currpe->v].visited = 1; - BLI_heap_insert(heap, cost[currpe->v], SET_INT_IN_POINTER(currpe->v)); - } - } - } - } - - pathvert = ((PathNode*)t->tmp.p)->u; - while(pathvert != -1){ - for(eve=em->verts.first; eve; eve=eve->next){ - if(eve->f1){ - if( ((PathNode*)eve->tmp.p)->u == pathvert) eve->f |= SELECT; - } - } - pathvert = previous[pathvert]; - } - - for(v=0; v < totnodes; v++) BLI_freelistN(&(Q[v].edges)); - MEM_freeN(Q); - MEM_freeN(cost); - MEM_freeN(previous); - BLI_heap_free(heap, NULL); - EM_select_flush(em); - } - } - else { - BKE_mesh_end_editmesh(obedit->data, em); - BKE_report(op->reports, RPT_ERROR, "Path Selection requires that exactly two vertices be selected"); - return OPERATOR_CANCELLED; - } - - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - BKE_mesh_end_editmesh(obedit->data, em); -#endif } void MESH_OT_select_vertex_path(wmOperatorType *ot) @@ -3168,7 +2801,9 @@ static int solidify_exec(bContext *C, wmOperator *op) float thickness= RNA_float_get(op->ptr, "thickness"); - BMO_InitOpf(bm, &bmop, "solidify geom=%hf thickness=%f", BM_SELECT, thickness); + if (!EDBM_InitOpf(em, &bmop, op, "solidify geom=%hf thickness=%f", BM_SELECT, thickness)) { + return OPERATOR_CANCELLED; + } /* deselect only the faces in the region to be solidified (leave wire edges and loose verts selected, as there will be no corresponding @@ -3181,7 +2816,9 @@ static int solidify_exec(bContext *C, wmOperator *op) /* select the newly generated faces */ BMO_HeaderFlag_Buffer(bm, &bmop, "geomout", BM_SELECT, BM_FACE); - BMO_Finish_Op(bm, &bmop); + if (!EDBM_FinishOp(em, &bmop, op, 1)) { + return OPERATOR_CANCELLED; + } DAG_id_tag_update(obedit->data, OB_RECALC_DATA); WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); @@ -3460,8 +3097,10 @@ static int knife_cut_exec(bContext *C, wmOperator *op) project_float(ar, co, scr); BLI_ghash_insert(gh, bv, scr); } - - BMO_Init_Op(&bmop, "esubd"); + + if (!EDBM_InitOpf(em, &bmop, op, "esubd")) { + return OPERATOR_CANCELLED; + } i = 0; /*store percentage of edge cut for KNIFE_EXACT here.*/ @@ -3494,7 +3133,9 @@ static int knife_cut_exec(bContext *C, wmOperator *op) BMO_Set_Float(&bmop, "radius", 0); BMO_Exec_Op(bm, &bmop); - BMO_Finish_Op(bm, &bmop); + if (!EDBM_FinishOp(em, &bmop, op, 1)) { + return OPERATOR_CANCELLED; + } BLI_ghash_free(gh, NULL, (GHashValFreeFP)MEM_freeN); @@ -3961,13 +3602,17 @@ static int spin_mesh_exec(bContext *C, wmOperator *op) mul_m3_v3(imat, cent); mul_m3_v3(imat, axis); - BMO_InitOpf(bm, &spinop, - "spin geom=%hvef cent=%v axis=%v dvec=%v steps=%d ang=%f dupli=%d", - BM_SELECT, cent, axis, d, steps, degr, dupli); + if (!EDBM_InitOpf(em, &spinop, op, + "spin geom=%hvef cent=%v axis=%v dvec=%v steps=%d ang=%f dupli=%d", + BM_SELECT, cent, axis, d, steps, degr, dupli)) { + return OPERATOR_CANCELLED; + } BMO_Exec_Op(bm, &spinop); EDBM_clear_flag_all(em, BM_SELECT); BMO_HeaderFlag_Buffer(bm, &spinop, "lastout", BM_SELECT, BM_ALL); - BMO_Finish_Op(bm, &spinop); + if (!EDBM_FinishOp(em, &spinop, op, 1)) { + return OPERATOR_CANCELLED; + } DAG_id_tag_update(obedit->data, OB_RECALC_DATA); WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); @@ -4078,13 +3723,17 @@ static int screw_mesh_exec(bContext *C, wmOperator *op) if(dot_v3v3(nor, dvec)>0.000) negate_v3(dvec); - BMO_InitOpf(bm, &spinop, - "spin geom=%hvef cent=%v axis=%v dvec=%v steps=%d ang=%f dupli=0", - BM_SELECT, cent, axis, dvec, turns*steps, 360.0f*turns); + if (!EDBM_InitOpf(em, &spinop, op, + "spin geom=%hvef cent=%v axis=%v dvec=%v steps=%d ang=%f dupli=0", + BM_SELECT, cent, axis, dvec, turns*steps, 360.0f*turns)) { + return OPERATOR_CANCELLED; + } BMO_Exec_Op(bm, &spinop); EDBM_clear_flag_all(em, BM_SELECT); BMO_HeaderFlag_Buffer(bm, &spinop, "lastout", BM_SELECT, BM_ALL); - BMO_Finish_Op(bm, &spinop); + if (!EDBM_FinishOp(em, &spinop, op, 1)) { + return OPERATOR_CANCELLED; + } DAG_id_tag_update(obedit->data, OB_RECALC_DATA); WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); @@ -4287,6 +3936,7 @@ void MESH_OT_select_mirror(wmOperatorType *ot) RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend the existing selection"); } +#if 0 /* UNUSED */ /********* qsort routines. not sure how to make these work, since we aren't using linked lists for geometry anymore. might need a sortof "swap" @@ -4312,7 +3962,6 @@ struct facesort { struct EditFace *efa; }; -#if 0 /* UNUSED */ static int vergface(const void *v1, const void *v2) { const struct facesort *x1=v1, *x2=v2; diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c index e793f12de23..519117842f8 100644 --- a/source/blender/modifiers/intern/MOD_edgesplit.c +++ b/source/blender/modifiers/intern/MOD_edgesplit.c @@ -54,7 +54,7 @@ #define EDGE_MARK 1 -DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd, Object *ob) +static DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd, Object *ob) { BMesh *bm; BMEditMesh *em; |