36 const std::optional<BMCustomDataCopyMap> &cd_vert_map,
51 if (cd_vert_map.has_value()) {
74 const std::optional<BMCustomDataCopyMap> &cd_edge_map,
78 const bool use_edge_flip_from_face)
81 BMVert *e_dst_v1, *e_dst_v2;
90 BMLoop *l_iter_src, *l_first_src;
91 l_iter_src = l_first_src = e_src->
l;
96 }
while ((l_iter_src = l_iter_src->
radial_next) != l_first_src);
119 if (cd_edge_map.has_value()) {
129 if (use_edge_flip_from_face) {
148 const std::optional<BMCustomDataCopyMap> &cd_face_map,
149 const std::optional<BMCustomDataCopyMap> &cd_loop_map,
157 BMLoop *l_iter_src, *l_iter_dst, *l_first_src;
163 l_iter_src = l_first_src;
169 }
while ((l_iter_src = l_iter_src->
next) != l_first_src);
177 if (cd_face_map.has_value()) {
185 l_iter_src = l_first_src;
188 if (cd_loop_map.has_value()) {
194 }
while ((
void)(l_iter_dst = l_iter_dst->
next), (l_iter_src = l_iter_src->
next) != l_first_src);
216 BMIter viter, eiter, fiter;
217 GHash *vhash, *ehash;
230 const std::optional<BMCustomDataCopyMap> cd_vert_map =
231 (bm_src == bm_dst) ? std::nullopt :
232 std::optional<BMCustomDataCopyMap>{
234 const std::optional<BMCustomDataCopyMap> cd_edge_map =
235 (bm_src == bm_dst) ? std::nullopt :
236 std::optional<BMCustomDataCopyMap>{
238 const std::optional<BMCustomDataCopyMap> cd_face_map =
239 (bm_src == bm_dst) ? std::nullopt :
240 std::optional<BMCustomDataCopyMap>{
242 const std::optional<BMCustomDataCopyMap> cd_loop_map =
243 (bm_src == bm_dst) ? std::nullopt :
244 std::optional<BMCustomDataCopyMap>{
253 bool isolated =
true;
288 bmo_vert_copy(op, slot_vert_map_out, bm_dst, cd_vert_map,
e->v1, vhash);
292 bmo_vert_copy(op, slot_vert_map_out, bm_dst, cd_vert_map,
e->v2, vhash);
298 slot_boundary_map_out,
305 use_edge_flip_from_face);
316 bmo_vert_copy(op, slot_vert_map_out, bm_dst, cd_vert_map,
v, vhash);
326 slot_boundary_map_out,
333 use_edge_flip_from_face);
337 bmo_face_copy(op, slot_face_map_out, bm_dst, cd_face_map, cd_loop_map, f, vhash, ehash);
346 if (use_select_history) {
349 bm_dst, slot_vert_map_out, slot_edge_map_out, slot_face_map_out,
false);
390 BMO_slot_copy(dupeop, slots_in,
"geom", dupeop, slots_out,
"geom_orig.out");
404void BMO_dupe_from_flag(
BMesh *
bm,
int htype,
const char hflag)
447 BMO_slot_copy(splitop, slots_in,
"geom", &dupeop, slots_in,
"geom");
452 if (use_only_faces) {
467 if (found ==
false) {
480 if (found ==
false) {
490 BMO_slot_copy(&dupeop, slots_out,
"geom.out", splitop, slots_out,
"geom.out");
521 float cent[3], dvec[3];
525 int steps, do_dupli, a;
542 BMVert **vtable =
nullptr;
555 *((
int *)&
v->
no[0]) = i;
559 BMO_slot_copy(op, slots_in,
"geom", op, slots_out,
"geom_last.out");
560 for (a = 0; a <
steps; a++) {
566 "rotate cent=%v matrix=%m3 space=%s verts=%S",
573 BMO_slot_copy(&dupop, slots_out,
"geom.out", op, slots_out,
"geom_last.out");
580 "extrude_face_region "
583 "use_normal_flip=%b "
584 "use_normal_from_adjacent=%b",
588 use_normal_flip && (a == 0),
591 if ((use_merge && (a ==
steps - 1)) ==
false) {
594 "rotate cent=%v matrix=%m3 space=%s verts=%S",
601 BMO_slot_copy(&extop, slots_out,
"geom.out", op, slots_out,
"geom_last.out");
607 int elem_array_len = slot_geom_out->
len;
608 for (
int i = 0; i < elem_array_len;) {
609 if (elem_array[i]->head.htype ==
BM_VERT) {
611 BMVert *v_dst = vtable[*((
const int *)&v_src->
no[0])];
614 elem_array[i] = elem_array[elem_array_len];
620 for (
int i = 0; i < elem_array_len;) {
621 if (elem_array[i]->head.htype ==
BM_EDGE) {
624 if (e_dst !=
nullptr) {
627 elem_array[i] = elem_array[elem_array_len];
634 for (
int i = 0; i < elem_array_len;) {
635 if (elem_array[i]->head.htype ==
BM_FACE) {
638 if (f_dst !=
nullptr) {
641 elem_array[i] = elem_array[elem_array_len];
647 slot_geom_out->
len = elem_array_len;
656 "translate vec=%v space=%s verts=%S",
BMCustomDataCopyMap CustomData_bmesh_copy_map_calc(const CustomData &src, const CustomData &dst, eCustomDataMask mask_exclude=0)
#define BLI_array_alloca(arr, realsize)
GHash * BLI_ghash_ptr_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
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)
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 bool is_zero_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float normalize_v3(float n[3])
Read Guarded memory(de)allocation.
#define BM_FACE_FIRST_LOOP(p)
void BM_elem_attrs_copy(BMesh *bm, const BMCustomDataCopyMap &map, const BMVert *src, BMVert *dst)
bool BM_edge_splice(BMesh *bm, BMEdge *e_dst, BMEdge *e_src)
Splice Edge.
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 *const *verts, BMEdge *const *edges, const int len, const BMFace *f_example, const eBMCreateFlag create_flag)
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.
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.
void * BMO_slot_ptr_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name)
#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)
BMOpSlot * BMO_slot_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *identifier)
BMESH OPSTACK GET SLOT.
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,...)
#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
static BMFace * bmo_face_copy(BMOperator *op, BMOpSlot *slot_facemap_out, BMesh *bm_dst, const std::optional< BMCustomDataCopyMap > &cd_face_map, const std::optional< BMCustomDataCopyMap > &cd_loop_map, BMFace *f_src, GHash *vhash, GHash *ehash)
void bmo_split_exec(BMesh *bm, BMOperator *op)
static void bmo_mesh_copy(BMOperator *op, BMesh *bm_dst, BMesh *bm_src)
static BMVert * bmo_vert_copy(BMOperator *op, BMOpSlot *slot_vertmap_out, BMesh *bm_dst, const std::optional< BMCustomDataCopyMap > &cd_vert_map, BMVert *v_src, GHash *vhash)
void bmo_duplicate_exec(BMesh *bm, BMOperator *op)
void bmo_spin_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, const std::optional< BMCustomDataCopyMap > &cd_edge_map, BMEdge *e_src, GHash *vhash, GHash *ehash, const bool use_edge_flip_from_face)
void bmo_delete_exec(BMesh *bm, BMOperator *op)
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
struct BMLoop * radial_next
union BMOpSlot::@139 data
struct BMOpSlot slots_out[BMO_OP_MAX_SLOTS]
struct BMOpSlot slots_in[BMO_OP_MAX_SLOTS]