82 const bool use_edge_flip_from_face)
85 BMVert *e_dst_v1, *e_dst_v2;
94 BMLoop *l_iter_src, *l_first_src;
95 l_iter_src = l_first_src = e_src->
l;
100 }
while ((l_iter_src = l_iter_src->
radial_next) != l_first_src);
128 if (use_edge_flip_from_face) {
155 BMLoop *l_iter_src, *l_iter_dst, *l_first_src;
161 l_iter_src = l_first_src;
167 }
while ((l_iter_src = l_iter_src->
next) != l_first_src);
178 l_iter_src = l_first_src;
182 }
while ((
void)(l_iter_dst = l_iter_dst->
next), (l_iter_src = l_iter_src->
next) != l_first_src);
204 BMIter viter, eiter, fiter;
205 GHash *vhash, *ehash;
223 bool isolated =
true;
257 bmo_vert_copy(op, slot_vert_map_out, bm_dst, bm_src,
e->v1, vhash);
261 bmo_vert_copy(op, slot_vert_map_out, bm_dst, bm_src,
e->v2, vhash);
267 slot_boundary_map_out,
273 use_edge_flip_from_face);
294 slot_boundary_map_out,
300 use_edge_flip_from_face);
305 bmo_face_copy(op, slot_face_map_out, bm_dst, bm_src, f, vhash, ehash);
314 if (use_select_history) {
317 bm_dst, slot_vert_map_out, slot_edge_map_out, slot_face_map_out,
false);
358 BMO_slot_copy(dupeop, slots_in,
"geom", dupeop, slots_out,
"geom_orig.out");
370 void BMO_dupe_from_flag(
BMesh *
bm,
int htype,
const char hflag)
404 #define SPLIT_INPUT 1
413 BMO_slot_copy(splitop, slots_in,
"geom", &dupeop, slots_in,
"geom");
418 if (use_only_faces) {
433 if (found ==
false) {
446 if (found ==
false) {
456 BMO_slot_copy(&dupeop, slots_out,
"geom.out", splitop, slots_out,
"geom.out");
487 float cent[3], dvec[3];
521 *((
int *)&
v->
no[0]) = i;
525 BMO_slot_copy(op, slots_in,
"geom", op, slots_out,
"geom_last.out");
532 "rotate cent=%v matrix=%m3 space=%s verts=%S",
539 BMO_slot_copy(&dupop, slots_out,
"geom.out", op, slots_out,
"geom_last.out");
546 "extrude_face_region "
549 "use_normal_flip=%b "
550 "use_normal_from_adjacent=%b",
554 use_normal_flip && (
a == 0),
557 if ((use_merge && (
a ==
steps - 1)) ==
false) {
560 "rotate cent=%v matrix=%m3 space=%s verts=%S",
567 BMO_slot_copy(&extop, slots_out,
"geom.out", op, slots_out,
"geom_last.out");
573 int elem_array_len = slot_geom_out->
len;
574 for (
int i = 0; i < elem_array_len;) {
575 if (elem_array[i]->head.htype ==
BM_VERT) {
577 BMVert *v_dst = vtable[*((
const int *)&v_src->
no[0])];
580 elem_array[i] = elem_array[elem_array_len];
586 for (
int i = 0; i < elem_array_len;) {
587 if (elem_array[i]->head.htype ==
BM_EDGE) {
593 elem_array[i] = elem_array[elem_array_len];
600 for (
int i = 0; i < elem_array_len;) {
601 if (elem_array[i]->head.htype ==
BM_FACE) {
607 elem_array[i] = elem_array[elem_array_len];
613 slot_geom_out->
len = elem_array_len;
622 "translate vec=%v space=%s verts=%S",
#define BLI_array_alloca(arr, realsize)
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 * BLI_ghash_lookup(GHash *gh, const void *key) 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], const 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, const char htype, const short oflag)
BMO_FLAG_BUFFER.
void BMO_slot_buffer_from_enabled_hflag(BMesh *bm, BMOperator *op, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, const char htype, const char hflag)
#define BMO_edge_flag_test(bm, e, oflag)
void BMO_mesh_selected_remap(BMesh *bm, BMOpSlot *slot_vert_map, BMOpSlot *slot_edge_map, BMOpSlot *slot_face_map, const bool check_select)
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)
float BMO_slot_float_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name)
#define BMO_vert_flag_enable(bm, e, oflag)
void BMO_op_exec(BMesh *bm, BMOperator *op)
BMESH OPSTACK EXEC OP.
bool BMO_op_initf(BMesh *bm, BMOperator *op, const int flag, const char *fmt,...)
#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)
#define BMO_vert_flag_test(bm, e, oflag)
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.
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)
void BMO_slot_buffer_from_enabled_flag(BMesh *bm, BMOperator *op, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, const char htype, const short oflag)
bool BMO_slot_bool_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name)
void BMO_op_init(BMesh *bm, BMOperator *op, const int flag, const char *opname)
BMESH OPSTACK INIT OP.
bool BMO_op_callf(BMesh *bm, const int flag, const char *fmt,...)
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::@139 data
struct BMOpSlot slots_out[BMO_OP_MAX_SLOTS]
struct BMOpSlot slots_in[BMO_OP_MAX_SLOTS]