69 if (recalc_looptris) {
80 if (recalc_looptris) {
123 int verts_len, edges_len, loops_len, faces_len;
125 StatePrev em_state_prev = {
135 bool changed =
false;
136 bool changed_was_set =
false;
143 changed_was_set =
true;
148 changed_was_set =
true;
154 changed_was_set =
true;
164 if (changed_was_set ==
false) {
169 if (changed ==
false) {
171 (em_state_prev.edges_len == em->
bm->
totedge) &&
172 (em_state_prev.loops_len == em->
bm->
totloop) &&
173 (em_state_prev.faces_len == em->
bm->
totface));
202 const char *select_slot_out,
203 const bool select_extend,
225 if (select_extend ==
false) {
290 const int select_mode,
291 const bool add_key_index)
301 if (mesh->
runtime->edit_mesh) {
304 mesh->
runtime->edit_mesh.reset();
309 mesh->
runtime->edit_mesh = std::make_shared<BMEditMesh>();
312 mesh->
runtime->edit_mesh->selectmode = mesh->
runtime->edit_mesh->bm->selectmode = select_mode;
331 params.calc_object_remap =
true;
399 "region_extend geom=%hvef use_contract=%b use_faces=%b use_face_step=%b",
422 "region_extend geom=%hvef use_contract=%b use_faces=%b use_face_step=%b",
484 const int totverts =
bm->totvert;
509 if (!vmap->
vert || !vmap->
buf) {
537 const float *uv, *uv2;
568 iterv->
next = newvlist;
581 vmap->
vert[a] = newvlist;
589 return vmap->
vert[
v];
631 BLI_assert(j < element_map->total_unique_uvs);
650 int index = child - element_map->
storage;
653 return unique_index[index];
656#define INVALID_ISLAND uint(-1)
669 islandbuf[islandbufsize].
l =
element->l;
690 int islandbufsize = 0;
691 int stack_upper_bound = total_uvs;
693 MEM_mallocN(
sizeof(*stack_uv) * stack_upper_bound, __func__));
694 int stacksize_uv = 0;
695 for (
int i = 0;
i < total_uvs;
i++) {
707 stack_uv[stacksize_uv++] =
element;
717 while (stacksize_uv) {
719 element = stack_uv[--stacksize_uv];
727 stack_uv[stacksize_uv++] = tail;
743 stack_uv[stacksize_uv++] = tail;
778 int islandbufsize = 0;
793 if (use_uv_edge_connectivity) {
795 element_map, scene,
bm, islandbuf, map, uv_selected, uv_offsets);
796 islandbufsize = totuv;
799 for (
int i = 0;
i < totuv;
i++) {
807 while (stacksize > 0) {
808 BMFace *efa = stack[--stacksize];
835 stack[stacksize++] =
element->l->f;
852 for (
int i = 0;
i <
bm->totvert;
i++) {
863 for (
int i = 0;
i < totuv;
i++) {
867 if (islandbuf[
i].island != j) {
873 if (islandbuf[
i].separate) {
879 element_map->
storage = islandbuf;
888 const float luv_a[2],
889 const float luv_b[2],
890 int cd_loop_uv_offset)
917 const float luv_anchor[2],
918 const float luv_fan[2],
921 const int cd_loop_uv_offset)
937 if (loop->
v == anchor) {
938 if (!
loop_uv_match(loop, luv_anchor, luv_fan, cd_loop_uv_offset)) {
942 if (loop == needle) {
948 loop->
prev->
e, luv_anchor, luv_far, needle, visited, cd_loop_uv_offset))
955 if (!
loop_uv_match(loop, luv_fan, luv_anchor, cd_loop_uv_offset)) {
959 if (loop->
next == needle) {
965 loop->
next->
e, luv_anchor, luv_far, needle, visited, cd_loop_uv_offset))
992 loop_a->
e, luv_anchor, luv_next_fan, loop_b, visited, cd_loop_uv_offset);
998 loop_a->
prev->
e, luv_anchor, luv_prev_fan, loop_b, visited, cd_loop_uv_offset);
1006 const bool uv_selected,
1007 const bool use_winding,
1008 const bool use_seams,
1009 const bool do_islands)
1019 if (offsets.
uv < 0) {
1108 vlist = vlist->
next;
1122 bool connected =
true;
1134 connected = (uv_vert_sel == uv2_vert_sel);
1137 if (connected && use_winding) {
1142 if (connected && use_seams) {
1153 iterv->
next = newvlist;
1168 element_map->
vertex[ev_index] = newvlist;
1171 if (seam_visited_gset) {
1173 seam_visited_gset =
nullptr;
1282 intptr_t eve_i = index_lookup[index];
1303#define BM_SEARCH_MAXDIST_MIRR 0.00002f
1304#define BM_CD_LAYER_ID "__mirror_index"
1308 const bool use_self,
1309 const bool use_select,
1310 const bool respecthide,
1312 const bool use_topology,
1319 int cd_vmirr_offset = 0;
1321 const float maxdist_sq =
square_f(maxdist);
1324 KDTree_3d *
tree =
nullptr;
1329 if (r_index ==
nullptr) {
1351 tree = BLI_kdtree_3d_new(
bm->totvert);
1357 BLI_kdtree_3d_insert(
tree,
i,
v->co);
1359 BLI_kdtree_3d_balance(
tree);
1362#define VERT_INTPTR(_v, _i) \
1363 (r_index ? &r_index[_i] : static_cast<int *>(BM_ELEM_CD_GET_VOID_P(_v, cd_vmirr_offset)))
1380 if (v_mirr !=
nullptr) {
1393 i_mirr = BLI_kdtree_3d_find_nearest(
tree, co,
nullptr);
1402 if (v_mirr && (use_self || (v_mirr !=
v))) {
1419 BLI_kdtree_3d_free(
tree);
1425 const bool use_self,
1426 const bool use_select,
1427 const bool respecthide,
1428 const bool use_topology)
1443 const int *mirr =
static_cast<const int *
>(
1448 if (mirr && *mirr >= 0 && *mirr < em->
bm->totvert) {
1451 "err: should only be called between "
1452 "EDBM_verts_mirror_cache_begin and EDBM_verts_mirror_cache_end");
1464 BMVert *v1_mirr, *v2_mirr;
1468 LIKELY(v1_mirr != v2_mirr))
1480 BMLoop *l_iter, *l_first;
1488 }
while ((l_iter = l_iter->
next) != l_first);
1495 int *mirr =
static_cast<int *
>(
1523 mirr->
co[0] *= -1.0f;
1542 bool changed =
false;
1611 const char iter_types[3] = {
1617 const bool sels[3] = {
1623 bool changed =
false;
1627 for (
i = 0;
i < 3;
i++) {
1650 for (
i = 0;
i < 3;
i++) {
1670 if (cd_loop_uv_offset == -1) {
1680 BMLoop *l_iter, *l_first;
1686 }
while ((l_iter = l_iter->
next) != l_first);
1691 BMLoop *l_iter, *l_first;
1697 }
while ((l_iter = l_iter->
next) != l_first);
1734 params.face_normals =
true;
1740 const char iter_types[3] = {
1757 for (
i = 0;
i < 3;
i++) {
1759 for (; ele; ele =
static_cast<BMElem *
>(BM_iter_step(&iter))) {
1779 if (
params->calc_normals) {
1783 if (
params->calc_looptris) {
1788 if (
params->is_destructive) {
1813 params.calc_looptris = do_tessellation;
1814 params.calc_normals =
false;
1815 params.is_destructive = is_destructive;
1864 index +=
bm->totvert;
1868 index +=
bm->totvert +
bm->totedge;
1881 if (index < bm->totvert) {
1884 index -=
bm->totvert;
1885 if (index < bm->totedge) {
1888 index -=
bm->totedge;
1889 if (index < bm->totface) {
1899 int elem_index = -1;
1900 *r_object_index = -1;
1902 for (
const int base_index : bases.
index_range()) {
1903 Base *base_iter = bases[base_index];
1905 *r_object_index = base_index;
1920 *r_obedit =
nullptr;
1921 Object *obedit = (object_index < bases.
size()) ? bases[object_index]->object :
nullptr;
1922 if (obedit !=
nullptr) {
1925 if (ele !=
nullptr) {
1940 const BMBVHTree *
tree,
const float co[3],
const float dir[3],
float *r_hitout,
const BMEdge *
e)
1966 float co1[3], co2[3], co3[3], dir1[3], dir2[3], dir3[3];
1967 float origin[3], invmat[4][4];
1968 float epsilon = 0.01f;
1970 const float mval_f[2] = {
1971 region->
winx / 2.0f,
1972 region->
winy / 2.0f,
2052 float mval[2], co_proj[3];
2057 params.snap_target_select = target_op;
2058 params.edit_mode_type = transform ::SNAP_GEOM_FINAL;
2059 params.occlusion_test = transform ::SNAP_OCCLUSION_AS_SEEM;
2073 mul_v3_m4v3(eve->
co, obedit->world_to_object().ptr(), co_proj);
Scene * CTX_data_scene(const bContext *C)
Object * CTX_data_edit_object(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
CustomData interface, see also DNA_customdata_types.h.
int CustomData_get_offset(const CustomData *data, eCustomDataType type)
int CustomData_get_n_offset(const CustomData *data, eCustomDataType type, int n)
int CustomData_get_named_layer_index(const CustomData *data, eCustomDataType type, blender::StringRef name)
int CustomData_get_layer_index(const CustomData *data, eCustomDataType type)
bool CustomData_has_layer(const CustomData *data, eCustomDataType type)
void * CustomData_bmesh_get_layer_n(const CustomData *data, void *block, int n)
void BKE_editmesh_free_data(BMEditMesh *em)
BMEditMesh * BKE_editmesh_from_object(Object *ob)
Return the BMEditMesh for a given object.
void BKE_editmesh_looptris_calc(BMEditMesh *em)
void BKE_editmesh_looptris_and_normals_calc(BMEditMesh *em)
struct BMFace * BKE_bmbvh_ray_cast(const BMBVHTree *tree, const float co[3], const float dir[3], float radius, float *r_dist, float r_hitout[3], float r_cagehit[3])
blender::Vector< Base * > BKE_view_layer_array_from_bases_in_edit_mode(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
BMesh * BKE_mesh_to_bmesh(Mesh *mesh, int active_shapekey, bool add_key_index, const BMeshCreateParams *params)
void BKE_mesh_uv_vert_map_free(UvVertMap *vmap)
#define STD_UV_CONNECT_LIMIT
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_report(ReportList *reports, eReportType type, const char *message)
GSet * BLI_gset_ptr_new(const char *info)
void BLI_gset_clear(GSet *gs, GSetKeyFreeFP keyfreefp)
void BLI_gset_free(GSet *gs, GSetKeyFreeFP keyfreefp)
bool BLI_gset_add(GSet *gs, void *key)
A KD-tree for nearest neighbor search.
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
MINLINE float square_f(float a)
void mul_m4_v3(const float M[4][4], float r[3])
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
MINLINE void sub_v3_v3(float r[3], const float a[3])
MINLINE float len_squared_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE bool compare_v2v2(const float v1[2], const float v2[2], float limit) ATTR_WARN_UNUSED_RESULT
void copy_vn_i(int *array_tar, int size, int val)
void mid_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
MINLINE float normalize_v3_length(float n[3], float unit_length)
MINLINE float normalize_v3(float n[3])
#define SET_FLAG_FROM_TEST(value, test, flag)
void DEG_id_tag_update(ID *id, unsigned int flags)
Object is a sort of wrapper for general info.
@ SCE_SNAP_TO_INCLUDE_EDITED
@ SCE_SNAP_TO_INCLUDE_NONEDITED
@ SCE_SNAP_TO_ONLY_SELECTABLE
@ SCE_SNAP_TARGET_NOT_ACTIVE
@ SCE_SNAP_TARGET_NOT_NONEDITED
@ SCE_SNAP_TARGET_ONLY_SELECTABLE
@ SCE_SNAP_TARGET_NOT_EDITED
BMVert * EDBM_verts_mirror_get(BMEditMesh *em, BMVert *v)
void ED_mesh_mirror_topo_table_end(Object *ob)
void ED_mesh_mirrtopo_free(MirrTopoStore_t *mesh_topo_store)
void ED_mesh_mirror_spatial_table_end(Object *ob)
void ED_mesh_mirrtopo_init(BMEditMesh *em, Mesh *mesh, MirrTopoStore_t *mesh_topo_store, bool skip_em_vert_array_init)
bool ED_operator_view3d_active(bContext *C)
bool ED_operator_editmesh(bContext *C)
bool uvedit_edge_select_test(const Scene *scene, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
bool uvedit_uv_select_test(const Scene *scene, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
eV3DProjStatus ED_view3d_project_float_object(const ARegion *region, const float co[3], float r_co[2], eV3DProjTest flag)
void ED_view3d_init_mats_rv3d(const Object *ob, RegionView3D *rv3d)
bool ED_view3d_win_to_segment_clipped(const Depsgraph *depsgraph, const ARegion *region, const View3D *v3d, const float mval[2], float r_ray_start[3], float r_ray_end[3], bool do_clip_planes)
Read Guarded memory(de)allocation.
static void free_data(ModifierData *md)
#define BM_FACE_FIRST_LOOP(p)
#define BM_ELEM_CD_GET_FLOAT_P(ele, offset)
#define BM_ELEM_CD_GET_VOID_P(ele, offset)
BMesh * BM_mesh_copy(BMesh *bm_old)
bool BMO_error_pop(BMesh *bm, const char **r_msg, BMOperator **r_op, eBMOpErrorLevel *r_level)
#define BM_elem_index_get(ele)
#define BM_elem_flag_disable(ele, hflag)
#define BM_elem_flag_test(ele, hflag)
#define BM_elem_flag_enable(ele, hflag)
void BM_data_layer_add_named(BMesh *bm, CustomData *data, int type, const StringRef name)
void * BM_iter_at_index(BMesh *bm, const char itype, void *data, int index)
#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)
#define BM_ITER_ELEM_INDEX(ele, iter, data, itype, indexvar)
#define BM_iter_new(iter, bm, itype, data)
void BM_mesh_elem_hflag_enable_all(BMesh *bm, const char htype, const char hflag, const bool respecthide)
void BM_elem_select_set(BMesh *bm, BMElem *ele, const bool select)
void BM_mesh_select_mode_flush_ex(BMesh *bm, const short selectmode, BMSelectFlushFlag flag)
Select Mode Flush.
BMFace * BM_mesh_active_face_get(BMesh *bm, const bool is_sloppy, const bool is_selected)
void BM_mesh_select_mode_clean(BMesh *bm)
void BM_mesh_elem_hflag_disable_all(BMesh *bm, const char htype, const char hflag, const bool respecthide)
void BM_mesh_select_flush_from_verts(BMesh *bm, const bool select)
#define BM_elem_hide_set(bm, ele, hide)
#define BMSelectFlushFlag_All
void BM_mesh_data_free(BMesh *bm)
BMesh Free Mesh Data.
BMVert * BM_vert_at_index_find_or_table(BMesh *bm, const int index)
void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
BMEdge * BM_edge_at_index_find_or_table(BMesh *bm, const int index)
bool BM_mesh_elem_table_check(BMesh *bm)
BMFace * BM_face_at_index_find_or_table(BMesh *bm, const int index)
BLI_INLINE BMVert * BM_vert_at_index(BMesh *bm, const int index)
BLI_INLINE BMFace * BM_face_at_index(BMesh *bm, const int index)
void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *mesh, const BMeshToMeshParams *params)
void BM_mesh_normals_update_ex(BMesh *bm, const BMeshNormalsUpdate_Params *params)
BMesh Compute Normals.
void BM_lnorspace_invalidate(BMesh *bm, const bool do_invalidate_all)
bool BMO_op_vinitf(BMesh *bm, BMOperator *op, int flag, const char *fmt, va_list vlist)
void BMO_slot_buffer_hflag_enable(BMesh *bm, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, char htype, char hflag, bool do_flush)
BMO_FLAG_BUFFER.
void BMO_slot_buffer_hflag_disable(BMesh *bm, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, char htype, char hflag, bool do_flush)
BMO_FLAG_BUFFER.
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.
bool BMO_op_initf(BMesh *bm, BMOperator *op, int flag, const char *fmt,...)
void BMO_op_finish(BMesh *bm, BMOperator *op)
BMESH OPSTACK FINISH OP.
#define BMO_FLAG_DEFAULTS
ATTR_WARN_UNUSED_RESULT const void * element
float BM_face_calc_area_uv_signed(const BMFace *f, int cd_loop_uv_offset)
bool BM_edge_in_face(const BMEdge *e, const BMFace *f)
BMFace * BM_face_exists(BMVert *const *varr, int len)
BMEdge * BM_edge_exists(BMVert *v_a, BMVert *v_b)
BLI_INLINE bool BM_edge_is_wire(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
BMUVOffsets BM_uv_map_offsets_get(const BMesh *bm)
void BM_mesh_uvselect_mode_flush(BMesh *bm)
void BM_face_uvselect_set_shared(BMesh *bm, BMFace *f, bool select, const int cd_loop_uv_offset)
bool BM_mesh_uvselect_clear(BMesh *bm)
void BM_loop_vert_uvselect_set_shared(BMesh *bm, BMLoop *l, bool select, const int cd_loop_uv_offset)
void BM_loop_edge_uvselect_set_shared(BMesh *bm, BMLoop *l, bool select, const int cd_loop_uv_offset)
BPy_StructRNA * depsgraph
IndexRange index_range() const
bool EDBM_vert_color_check(BMEditMesh *em)
UvElementMap * BM_uv_element_map_create(BMesh *bm, const Scene *scene, const bool uv_selected, const bool use_winding, const bool use_seams, const bool do_islands)
BMFace * EDBM_uv_active_face_get(BMEditMesh *em, const bool sloppy, const bool selected)
void EDBM_redo_state_restore_and_free(BMBackup *backup, BMEditMesh *em, bool recalc_looptris)
static BMVert * cache_mirr_intptr_as_bmvert(const intptr_t *index_lookup, int index)
UvMapVert * BM_uv_vert_map_at_index(UvVertMap *vmap, uint v)
void EDBM_update(Mesh *mesh, const EDBMUpdate_Params *params)
void EDBM_select_more(BMEditMesh *em, const bool use_face_step)
UvElement * BM_uv_element_get(const UvElementMap *element_map, const BMLoop *l)
bool EDBM_op_callf(BMEditMesh *em, wmOperator *op, const char *fmt,...)
static int bm_uv_edge_select_build_islands(UvElementMap *element_map, const Scene *scene, const BMesh *bm, UvElement *islandbuf, uint *map, bool uv_selected, const BMUVOffsets &offsets)
static void bm_uv_assign_island(UvElementMap *element_map, UvElement *element, int nisland, uint *map, UvElement *islandbuf, int islandbufsize)
void EDBM_flag_enable_all(BMEditMesh *em, const char hflag)
bool EDBM_uvselect_clear(BMEditMesh *em)
bool EDBM_op_init(BMEditMesh *em, BMOperator *bmop, wmOperator *op, const char *fmt,...)
BMVert * EDBM_verts_mirror_get(BMEditMesh *em, BMVert *v)
bool EDBM_op_call_and_selectf(BMEditMesh *em, wmOperator *op, const char *select_slot_out, const bool select_extend, const char *fmt,...)
int BM_uv_element_get_unique_index(UvElementMap *element_map, UvElement *child)
void EDBM_mesh_normals_update(BMEditMesh *em)
bool EDBM_mesh_reveal(BMEditMesh *em, bool select)
void EDBM_project_snap_verts(bContext *C, Depsgraph *depsgraph, ARegion *region, Object *obedit, BMEditMesh *em)
void EDBM_mesh_load_ex(Main *bmain, Object *ob, bool free_data)
bool EDBM_op_finish(BMEditMesh *em, BMOperator *bmop, wmOperator *op, const bool do_report)
bool EDBM_uv_check(BMEditMesh *em)
void BM_uv_element_map_free(UvElementMap *element_map)
void EDBM_stats_update(BMEditMesh *em)
bool EDBM_mesh_hide(BMEditMesh *em, bool swap)
void EDBM_verts_mirror_cache_begin_ex(BMEditMesh *em, const int axis, const bool use_self, const bool use_select, const bool respecthide, const bool use_topology, float maxdist, int *r_index)
static void scale_point(float c1[3], const float p[3], const float s)
static bool seam_connected_recursive(BMEdge *edge, const float luv_anchor[2], const float luv_fan[2], const BMLoop *needle, GSet *visited, const int cd_loop_uv_offset)
void EDBM_mesh_free_data(BMEditMesh *em)
void EDBM_selectmode_flush(BMEditMesh *em)
BMElem * EDBM_elem_from_selectmode(BMEditMesh *em, BMVert *eve, BMEdge *eed, BMFace *efa)
void EDBM_mesh_load(Main *bmain, Object *ob)
BMBackup EDBM_redo_state_store(BMEditMesh *em)
BMElem * EDBM_elem_from_index_any_multi(const Scene *scene, ViewLayer *view_layer, uint object_index, uint elem_index, Object **r_obedit)
#define VERT_INTPTR(_v, _i)
void EDBM_verts_mirror_cache_begin(BMEditMesh *em, const int axis, const bool use_self, const bool use_select, const bool respecthide, const bool use_topology)
BMElem * EDBM_elem_from_index_any(BMEditMesh *em, uint index)
bool EDBM_op_call_silentf(BMEditMesh *em, const char *fmt,...)
void EDBM_verts_mirror_cache_end(BMEditMesh *em)
void EDBM_verts_mirror_cache_clear(BMEditMesh *em, BMVert *v)
int EDBM_elem_to_index_any(BMEditMesh *em, BMElem *ele)
BMEdge * EDBM_verts_mirror_get_edge(BMEditMesh *em, BMEdge *e)
UvElement ** BM_uv_element_map_ensure_head_table(UvElementMap *element_map)
void EDBM_select_less(BMEditMesh *em, const bool use_face_step)
BMFace * EDBM_verts_mirror_get_face(BMEditMesh *em, BMFace *f)
void EDBM_select_flush_from_verts(BMEditMesh *em, const bool select)
void EDBM_mesh_make_from_mesh(Object *ob, Mesh *src_mesh, const int select_mode, const bool add_key_index)
UvElement * BM_uv_element_get_head(UvElementMap *element_map, UvElement *child)
bool EDBM_view3d_poll(bContext *C)
int * BM_uv_element_map_ensure_unique_index(UvElementMap *element_map)
void EDBM_flag_disable_all(BMEditMesh *em, const char hflag)
#define BM_SEARCH_MAXDIST_MIRR
int EDBM_elem_to_index_any_multi(const Scene *scene, ViewLayer *view_layer, BMEditMesh *em, BMElem *ele, int *r_object_index)
static bool seam_connected(BMLoop *loop_a, BMLoop *loop_b, GSet *visited, int cd_loop_uv_offset)
void EDBM_mesh_make(Object *ob, const int select_mode, const bool add_key_index)
void EDBM_redo_state_restore(BMBackup *backup, BMEditMesh *em, bool recalc_looptris)
void EDBM_selectmode_to_scene(bContext *C)
static int object_shapenr_basis_index_ensured(const Object *ob)
void EDBM_mesh_normals_update_ex(BMEditMesh *em, const BMeshNormalsUpdate_Params *params)
UvVertMap * BM_uv_vert_map_create(BMesh *bm, const bool use_select, const bool respect_hide)
void EDBM_verts_mirror_apply(BMEditMesh *em, const int sel_from, const int sel_to)
static BMFace * edge_ray_cast(const BMBVHTree *tree, const float co[3], const float dir[3], float *r_hitout, const BMEdge *e)
void BM_uv_vert_map_free(UvVertMap *vmap)
void EDBM_selectmode_flush_ex(BMEditMesh *em, const short selectmode)
static void bm_uv_build_islands(UvElementMap *element_map, BMesh *bm, const Scene *scene, bool uv_selected)
void EDBM_update_extern(Mesh *mesh, const bool do_tessellation, const bool is_destructive)
bool BMBVH_EdgeVisible(const BMBVHTree *tree, const BMEdge *e, const Depsgraph *depsgraph, const ARegion *region, const View3D *v3d, const Object *obedit)
void EDBM_redo_state_free(BMBackup *backup)
static bool loop_uv_match(BMLoop *loop, const float luv_a[2], const float luv_b[2], int cd_loop_uv_offset)
void * MEM_mallocN(size_t len, const char *str)
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_callocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
eBMOpSlotSubType_Union slot_subtype
struct BMOpSlot slots_out[BMO_OP_MAX_SLOTS]
bool uv_select_sync_valid
MeshRuntimeHandle * runtime
struct ToolSettings * toolsettings
int * island_total_unique_uvs
unsigned short loop_of_face_index
unsigned short loop_of_face_index
struct ReportList * reports
eBMOpSlotSubType_Elem elem
void WM_main_add_notifier(uint type, void *reference)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)