diff options
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_operators.c | 3 | ||||
-rw-r--r-- | source/blender/bmesh/operators/bmo_create.c | 2 | ||||
-rw-r--r-- | source/blender/bmesh/operators/bmo_dupe.c | 21 | ||||
-rw-r--r-- | source/blender/bmesh/operators/bmo_extrude.c | 91 |
4 files changed, 29 insertions, 88 deletions
diff --git a/source/blender/bmesh/intern/bmesh_operators.c b/source/blender/bmesh/intern/bmesh_operators.c index 7f8b40d85dc..63c00d5b545 100644 --- a/source/blender/bmesh/intern/bmesh_operators.c +++ b/source/blender/bmesh/intern/bmesh_operators.c @@ -561,8 +561,6 @@ static int bmo_mesh_flag_count(BMesh *bm, const char htype, const short oflag, BMElemF *ele_f; int i; - BLI_assert((unsigned int)test_for_enabled <= 1); - for (i = 0; i < 3; i++) { if (htype & flag_types[i]) { BM_ITER_MESH (ele_f, &iter, bm, iter_types[i]) { @@ -937,7 +935,6 @@ static void bmo_slot_buffer_from_flag(BMesh *bm, BMOperator *op, int totelement, i = 0; BLI_assert(op->slots_in == slot_args || op->slots_out == slot_args); - BLI_assert((unsigned int)test_for_enabled <= 1); if (test_for_enabled) totelement = BMO_mesh_enabled_flag_count(bm, htype, oflag); diff --git a/source/blender/bmesh/operators/bmo_create.c b/source/blender/bmesh/operators/bmo_create.c index ad858c514d2..e43c04f7d08 100644 --- a/source/blender/bmesh/operators/bmo_create.c +++ b/source/blender/bmesh/operators/bmo_create.c @@ -217,7 +217,7 @@ void bmo_contextual_create_exec(BMesh *bm, BMOperator *op) /* Continue with ad-hoc fill methods since operators fail, * edge, vcloud... may add more */ - if (0) { /* nice feature but perhaps it should be a different tool? */ + if (0) { /* nice feature but perhaps it should be a different tool? */ /* tricky feature for making a line/edge from selection history... * diff --git a/source/blender/bmesh/operators/bmo_dupe.c b/source/blender/bmesh/operators/bmo_dupe.c index e41fbd69616..d65e2669a58 100644 --- a/source/blender/bmesh/operators/bmo_dupe.c +++ b/source/blender/bmesh/operators/bmo_dupe.c @@ -130,9 +130,11 @@ static BMFace *copy_face(BMOperator *op, BMOpSlot *slot_facemap_out, BMesh *source_mesh, BMFace *source_face, BMesh *target_mesh, - BMVert **vtar, BMEdge **edar, GHash *vhash, GHash *ehash) + GHash *vhash, GHash *ehash) { /* BMVert *target_vert1, *target_vert2; */ /* UNUSED */ + BMVert **vtar = BLI_array_alloca(vtar, source_face->len); + BMEdge **edar = BLI_array_alloca(edar, source_face->len); BMLoop *source_loop, *target_loop; BMFace *target_face = NULL; BMIter iter, iter2; @@ -190,11 +192,6 @@ static void bmo_mesh_copy(BMOperator *op, BMesh *bm_src, BMesh *bm_dst) BMVert *v = NULL, *v2; BMEdge *e = NULL; BMFace *f = NULL; - - BLI_array_declare(vtar); - BLI_array_declare(edar); - BMVert **vtar = NULL; - BMEdge **edar = NULL; BMIter viter, eiter, fiter; GHash *vhash, *ehash; @@ -280,14 +277,7 @@ static void bmo_mesh_copy(BMOperator *op, BMesh *bm_src, BMesh *bm_dst) } } - /* ensure arrays are the right size */ - BLI_array_empty(vtar); - BLI_array_empty(edar); - - BLI_array_grow_items(vtar, f->len); - BLI_array_grow_items(edar, f->len); - - copy_face(op, slot_face_map_out, bm_src, f, bm_dst, vtar, edar, vhash, ehash); + copy_face(op, slot_face_map_out, bm_src, f, bm_dst, vhash, ehash); BMO_elem_flag_enable(bm_src, f, DUPE_DONE); } } @@ -295,9 +285,6 @@ static void bmo_mesh_copy(BMOperator *op, BMesh *bm_src, BMesh *bm_dst) /* free pointer hashes */ BLI_ghash_free(vhash, NULL, NULL); BLI_ghash_free(ehash, NULL, NULL); - - BLI_array_free(vtar); /* free vert pointer array */ - BLI_array_free(edar); /* free edge pointer array */ } /** diff --git a/source/blender/bmesh/operators/bmo_extrude.c b/source/blender/bmesh/operators/bmo_extrude.c index 32c8ee50e05..070cc187045 100644 --- a/source/blender/bmesh/operators/bmo_extrude.c +++ b/source/blender/bmesh/operators/bmo_extrude.c @@ -31,7 +31,6 @@ #include "DNA_meshdata_types.h" #include "BLI_math.h" -#include "BLI_array.h" #include "BLI_buffer.h" #include "BKE_customdata.h" @@ -54,84 +53,42 @@ enum { void bmo_extrude_discrete_faces_exec(BMesh *bm, BMOperator *op) { - BMVert **verts = NULL; - BLI_array_declare(verts); - BMEdge **edges = NULL; - BLI_array_declare(edges); - BMOIter siter; - BMIter liter, liter2; - BMFace *f, *f2, *f3; - BMLoop *l, *l2, *l3, *l4, *l_tmp; - BMEdge *e, *laste; - BMVert *v, *lastv, *firstv; - int i; + BMFace *f_org; - BMO_ITER (f, &siter, op->slots_in, "faces", BM_FACE) { - BLI_array_empty(verts); - BLI_array_empty(edges); - BLI_array_grow_items(verts, f->len); - BLI_array_grow_items(edges, f->len); - - i = 0; - firstv = lastv = NULL; - BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) { - v = BM_vert_create(bm, l->v->co, l->v, 0); - /* skip on the first iteration */ - if (lastv) { - e = BM_edge_create(bm, lastv, v, l->e, 0); - edges[i] = e; - verts[i] = lastv; - i++; - } + BMO_ITER (f_org, &siter, op->slots_in, "faces", BM_FACE) { + BMFace *f_new; + BMLoop *l_org, *l_org_first; + BMLoop *l_new; - lastv = v; - laste = l->e; - if (!firstv) firstv = v; - } + BMO_elem_flag_enable(bm, f_org, EXT_DEL); - /* this fits in the array because we skip one in the loop above */ - e = BM_edge_create(bm, v, firstv, laste, 0); - edges[i] = e; - verts[i] = lastv; - i++; + f_new = BM_face_copy(bm, bm, f_org, true, true); + BMO_elem_flag_enable(bm, f_new, EXT_KEEP); - BMO_elem_flag_enable(bm, f, EXT_DEL); + l_org = l_org_first = BM_FACE_FIRST_LOOP(f_org); + l_new = BM_FACE_FIRST_LOOP(f_new); - f2 = BM_face_create(bm, verts, edges, f->len, 0); - if (UNLIKELY(f2 == NULL)) { - BMO_error_raise(bm, op, BMERR_MESH_ERROR, "Extrude failed: could not create face"); - BLI_array_free(edges); - return; - } - - BMO_elem_flag_enable(bm, f2, EXT_KEEP); - BM_elem_attrs_copy(bm, bm, f, f2); - - l2 = BM_iter_new(&liter2, bm, BM_LOOPS_OF_FACE, f2); - BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) { - BM_elem_attrs_copy(bm, bm, l, l2); - - l3 = l->next; - l4 = l2->next; + do { + BMFace *f_side; + BMLoop *l_side_iter; - f3 = BM_face_create_quad_tri(bm, l3->v, l4->v, l2->v, l->v, f, false); - /* XXX, no error check here, why? - Campbell */ + BM_elem_attrs_copy(bm, bm, l_org, l_new); - l_tmp = BM_FACE_FIRST_LOOP(f3); + f_side = BM_face_create_quad_tri(bm, + l_org->next->v, l_new->next->v, l_new->v, l_org->v, + f_org, false); - BM_elem_attrs_copy(bm, bm, l->next, l_tmp); l_tmp = l_tmp->next; - BM_elem_attrs_copy(bm, bm, l->next, l_tmp); l_tmp = l_tmp->next; - BM_elem_attrs_copy(bm, bm, l, l_tmp); l_tmp = l_tmp->next; - BM_elem_attrs_copy(bm, bm, l, l_tmp); + l_side_iter = BM_FACE_FIRST_LOOP(f_side); - l2 = BM_iter_step(&liter2); - } + BM_elem_attrs_copy(bm, bm, l_org->next, l_side_iter); l_side_iter = l_side_iter->next; + BM_elem_attrs_copy(bm, bm, l_org->next, l_side_iter); l_side_iter = l_side_iter->next; + BM_elem_attrs_copy(bm, bm, l_org, l_side_iter); l_side_iter = l_side_iter->next; + BM_elem_attrs_copy(bm, bm, l_org, l_side_iter); + } while (((l_new = l_new->next), + (l_org = l_org->next)) != l_org_first); } - BLI_array_free(verts); - BLI_array_free(edges); - BMO_op_callf(bm, op->flag, "delete geom=%ff context=%i", EXT_DEL, DEL_ONLYFACES); |