68 const bool use_edge_flip_from_face)
71 BMVert *e_dst_v1, *e_dst_v2;
80 BMLoop *l_iter_src, *l_first_src;
81 l_iter_src = l_first_src = e_src->
l;
86 }
while ((l_iter_src = l_iter_src->
radial_next) != l_first_src);
114 if (use_edge_flip_from_face) {
141 BMLoop *l_iter_src, *l_iter_dst, *l_first_src;
147 l_iter_src = l_first_src;
153 }
while ((l_iter_src = l_iter_src->
next) != l_first_src);
164 l_iter_src = l_first_src;
168 }
while ((
void)(l_iter_dst = l_iter_dst->
next), (l_iter_src = l_iter_src->
next) != l_first_src);
190 BMIter viter, eiter, fiter;
191 GHash *vhash, *ehash;
209 bool isolated =
true;
243 bmo_vert_copy(op, slot_vert_map_out, bm_dst, bm_src,
e->v1, vhash);
247 bmo_vert_copy(op, slot_vert_map_out, bm_dst, bm_src,
e->v2, vhash);
253 slot_boundary_map_out,
259 use_edge_flip_from_face);
280 slot_boundary_map_out,
286 use_edge_flip_from_face);
291 bmo_face_copy(op, slot_face_map_out, bm_dst, bm_src, f, vhash, ehash);
300 if (use_select_history) {
303 bm_dst, slot_vert_map_out, slot_edge_map_out, slot_face_map_out,
false);
344 BMO_slot_copy(dupeop, slots_in,
"geom", dupeop, slots_out,
"geom_orig.out");
358 void BMO_dupe_from_flag(
BMesh *
bm,
int htype,
const char hflag)
392 #define SPLIT_INPUT 1
401 BMO_slot_copy(splitop, slots_in,
"geom", &dupeop, slots_in,
"geom");
406 if (use_only_faces) {
421 if (found ==
false) {
434 if (found ==
false) {
444 BMO_slot_copy(&dupeop, slots_out,
"geom.out", splitop, slots_out,
"geom.out");
475 float cent[3], dvec[3];
509 *((
int *)&
v->
no[0]) = i;
513 BMO_slot_copy(op, slots_in,
"geom", op, slots_out,
"geom_last.out");
520 "rotate cent=%v matrix=%m3 space=%s verts=%S",
527 BMO_slot_copy(&dupop, slots_out,
"geom.out", op, slots_out,
"geom_last.out");
534 "extrude_face_region "
537 "use_normal_flip=%b "
538 "use_normal_from_adjacent=%b",
542 use_normal_flip && (
a == 0),
545 if ((use_merge && (
a ==
steps - 1)) ==
false) {
548 "rotate cent=%v matrix=%m3 space=%s verts=%S",
555 BMO_slot_copy(&extop, slots_out,
"geom.out", op, slots_out,
"geom_last.out");
561 int elem_array_len = slot_geom_out->
len;
562 for (
int i = 0; i < elem_array_len;) {
563 if (elem_array[i]->head.htype ==
BM_VERT) {
565 BMVert *v_dst = vtable[*((
const int *)&v_src->
no[0])];
568 elem_array[i] = elem_array[elem_array_len];
574 for (
int i = 0; i < elem_array_len;) {
575 if (elem_array[i]->head.htype ==
BM_EDGE) {
581 elem_array[i] = elem_array[elem_array_len];
588 for (
int i = 0; i < elem_array_len;) {
589 if (elem_array[i]->head.htype ==
BM_FACE) {
595 elem_array[i] = elem_array[elem_array_len];
601 slot_geom_out->
len = elem_array_len;
610 "translate vec=%v space=%s verts=%S",
#define BLI_array_alloca(arr, realsize)
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_insert(GHash *gh, void *key, void *val)
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
GHash * BLI_ghash_ptr_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void mul_m3_v3(const float M[3][3], float r[3])
void axis_angle_normalized_to_mat3(float R[3][3], const float axis[3], float angle)
MINLINE float normalize_v3(float r[3])
MINLINE bool is_zero_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
Read Guarded memory(de)allocation.
#define BM_FACE_FIRST_LOOP(p)
void BM_elem_attrs_copy(BMesh *bm_src, BMesh *bm_dst, const void *ele_src, void *ele_dst)
bool BM_edge_splice(BMesh *bm, BMEdge *e_dst, BMEdge *e_src)
Splice Edge.
BMVert * BM_vert_create(BMesh *bm, const float co[3], const BMVert *v_example, const eBMCreateFlag create_flag)
Main function for creating a new vertex.
bool BM_vert_splice(BMesh *bm, BMVert *v_dst, BMVert *v_src)
Splice Vert.
void BM_face_kill(BMesh *bm, BMFace *f)
BMFace * BM_face_create(BMesh *bm, BMVert **verts, BMEdge **edges, const int len, const BMFace *f_example, const eBMCreateFlag create_flag)
BMEdge * BM_edge_create(BMesh *bm, BMVert *v1, BMVert *v2, const BMEdge *e_example, const eBMCreateFlag create_flag)
Main function for creating a new edge.
void BMO_mesh_delete_oflag_context(BMesh *bm, const short oflag, const int type)
#define BM_ITER_ELEM(ele, iter, data, itype)
#define BM_ITER_MESH(ele, iter, bm, itype)
#define BM_ITER_MESH_INDEX(ele, iter, bm, itype, indexvar)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_edge_verts_swap(BMEdge *e)
void BMO_slot_buffer_flag_enable(BMesh *bm, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, char htype, short oflag)
BMO_FLAG_BUFFER.
#define BMO_edge_flag_test(bm, e, oflag)
void BMO_slot_vec_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, float r_vec[3])
#define BMO_edge_flag_enable(bm, e, oflag)
void BMO_mesh_selected_remap(BMesh *bm, BMOpSlot *slot_vert_map, BMOpSlot *slot_edge_map, BMOpSlot *slot_face_map, bool check_select)
float BMO_slot_float_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name)
void BMO_slot_buffer_from_enabled_hflag(BMesh *bm, BMOperator *op, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, char htype, char hflag)
#define BMO_vert_flag_enable(bm, e, oflag)
void BMO_op_exec(BMesh *bm, BMOperator *op)
BMESH OPSTACK EXEC OP.
void BMO_slot_buffer_from_enabled_flag(BMesh *bm, BMOperator *op, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, char htype, short oflag)
#define BMO_face_flag_enable(bm, e, oflag)
#define BMO_slot_copy(op_src, slots_src, slot_name_src, op_dst, slots_dst, slot_name_dst)
void BMO_op_init(BMesh *bm, BMOperator *op, int flag, const char *opname)
BMESH OPSTACK INIT OP.
#define BMO_vert_flag_test(bm, e, oflag)
bool BMO_op_initf(BMesh *bm, BMOperator *op, int flag, const char *fmt,...)
int BMO_slot_int_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name)
void BMO_op_finish(BMesh *bm, BMOperator *op)
BMESH OPSTACK FINISH OP.
bool BMO_op_callf(BMesh *bm, int flag, const char *fmt,...)
BMOpSlot * BMO_slot_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *identifier)
BMESH OPSTACK GET SLOT.
void * BMO_slot_ptr_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name)
#define BMO_face_flag_test(bm, e, oflag)
bool BMO_slot_bool_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name)
BLI_INLINE void BMO_slot_map_elem_insert(BMOperator *op, BMOpSlot *slot, const void *element, void *val)
BMEdge * BM_edge_find_double(BMEdge *e)
BMFace * BM_face_find_double(BMFace *f)
BLI_INLINE bool BM_edge_is_boundary(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
void bmo_split_exec(BMesh *bm, BMOperator *op)
static BMEdge * bmo_edge_copy(BMOperator *op, BMOpSlot *slot_edgemap_out, BMOpSlot *slot_boundarymap_out, BMesh *bm_dst, BMesh *bm_src, BMEdge *e_src, GHash *vhash, GHash *ehash, const bool use_edge_flip_from_face)
static void bmo_mesh_copy(BMOperator *op, BMesh *bm_dst, BMesh *bm_src)
static BMFace * bmo_face_copy(BMOperator *op, BMOpSlot *slot_facemap_out, BMesh *bm_dst, BMesh *bm_src, BMFace *f_src, GHash *vhash, GHash *ehash)
void bmo_duplicate_exec(BMesh *bm, BMOperator *op)
void bmo_spin_exec(BMesh *bm, BMOperator *op)
static BMVert * bmo_vert_copy(BMOperator *op, BMOpSlot *slot_vertmap_out, BMesh *bm_dst, BMesh *bm_src, BMVert *v_src, GHash *vhash)
void bmo_delete_exec(BMesh *bm, BMOperator *op)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_mallocN)(size_t len, const char *str)
struct BMLoop * radial_next
union BMOpSlot::@145 data
struct BMOpSlot slots_out[BMO_OP_MAX_SLOTS]
struct BMOpSlot slots_in[BMO_OP_MAX_SLOTS]