diff options
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_opdefines.c | 11 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_operators_private.h | 1 | ||||
-rw-r--r-- | source/blender/bmesh/operators/extrudeops.c | 22 |
3 files changed, 34 insertions, 0 deletions
diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c index 6ea2f5fc218..315eb0410a8 100644 --- a/source/blender/bmesh/intern/bmesh_opdefines.c +++ b/source/blender/bmesh/intern/bmesh_opdefines.c @@ -3,6 +3,16 @@ #include <stdio.h> +BMOpDefine def_extrudeverts_indiv = { + "extrude_vert_indiv", + {{BMOP_OPSLOT_ELEMENT_BUF, "verts"}, + {BMOP_OPSLOT_ELEMENT_BUF, "edgeout"}, + {BMOP_OPSLOT_ELEMENT_BUF, "vertout"}, + {0} /*null-terminating sentinel*/}, + extrude_vert_indiv_exec, + 0 +}; + #if 0 BMOpDefine def_makeprim = { "makeprim", @@ -156,6 +166,7 @@ BMOpDefine *opdefines[] = { &def_extrudefaceregion, &def_connectverts, //&def_makeprim, + &def_extrudeverts_indiv, }; int bmesh_total_ops = (sizeof(opdefines) / sizeof(void*)); diff --git a/source/blender/bmesh/intern/bmesh_operators_private.h b/source/blender/bmesh/intern/bmesh_operators_private.h index 41319d0ee4d..7cc81522d6d 100644 --- a/source/blender/bmesh/intern/bmesh_operators_private.h +++ b/source/blender/bmesh/intern/bmesh_operators_private.h @@ -20,5 +20,6 @@ void bmesh_make_fgons_exec(BMesh *bmesh, BMOperator *op); void extrude_edge_context_exec(BMesh *bm, BMOperator *op); void connectverts_exec(BMesh *bm, BMOperator *op); void makeprim_exec(BMesh *bm, BMOperator *op); +void extrude_vert_indiv_exec(BMesh *bm, BMOperator *op); #endif diff --git a/source/blender/bmesh/operators/extrudeops.c b/source/blender/bmesh/operators/extrudeops.c index a98793826d8..8858447bc82 100644 --- a/source/blender/bmesh/operators/extrudeops.c +++ b/source/blender/bmesh/operators/extrudeops.c @@ -14,6 +14,28 @@ #define EXT_KEEP 2 #define EXT_DEL 4 +void extrude_vert_indiv_exec(BMesh *bm, BMOperator *op) +{ + BMOIter siter; + BMVert *v, *dupev; + BMEdge *e; + + v = BMO_IterNew(&siter, bm, op, "verts"); + for (; v; v=BMO_IterStep(&siter)) { + dupev = BM_Make_Vert(bm, v->co, NULL); + VECCOPY(dupev->no, v->no); + BM_Copy_Attributes(bm, bm, v, dupev); + + e = BM_Make_Edge(bm, v, dupev, NULL, 0); + + BMO_SetFlag(bm, e, EXT_KEEP); + BMO_SetFlag(bm, dupev, EXT_KEEP); + } + + BMO_Flag_To_Slot(bm, op, "vertout", EXT_KEEP, BM_VERT); + BMO_Flag_To_Slot(bm, op, "edgeout", EXT_KEEP, BM_EDGE); +} + void extrude_edge_context_exec(BMesh *bm, BMOperator *op) { BMOperator dupeop, delop; |