65 const uint objects_len,
70 const uint objects_len,
110 if (ese && ese->
prev) {
132 if (ese && ese->
prev) {
175 return uv_selectmode;
200 int cd_loop_uv_offset)
262 const int cd_loop_uv_offset)
292 const int cd_loop_uv_offset)
319 const int cd_loop_uv_offset)
333 const int cd_loop_uv_offset)
358 const int cd_loop_uv_offset)
409 const uint cd_loop_uv_offset)
450 const int sticky_flag,
452 const int cd_loop_uv_offset)
486 const int sticky_flag,
487 const int cd_loop_uv_offset)
507 const int cd_loop_uv_offset)
522 const int cd_loop_uv_offset)
556 const int cd_loop_uv_offset)
631 const uint cd_loop_uv_offset)
672 const int sticky_flag,
674 const int cd_loop_uv_offset)
679 e_first = e_iter =
l->
e;
681 BMLoop *l_radial_iter = e_iter->
l;
682 if (!l_radial_iter) {
686 if (l_radial_iter->
v ==
l->
v) {
688 bool do_select =
false;
701 }
while ((l_radial_iter = l_radial_iter->
radial_next) != e_iter->
l);
710 const int cd_loop_uv_offset)
724 const int cd_loop_uv_offset)
753 const int cd_loop_uv_offset)
773 const int cd_loop_uv_offset)
777 if (l_iter != l_src) {
782 if (l_other ==
NULL) {
799 const int cd_loop_uv_offset)
802 scene, l_edge, cd_loop_uv_offset) ==
NULL);
805 l_step = (l_step->
v == v_pivot) ? l_step->
prev : l_step->
next;
809 l_step_last = l_step;
811 scene, l_step, cd_loop_uv_offset);
813 l_step = (l_step->
v == v_pivot) ? l_step->
prev : l_step->
next;
815 }
while (l_step !=
NULL);
817 if (l_step_last !=
NULL) {
819 scene, l_step_last, cd_loop_uv_offset) ==
NULL);
868 if (dist_test_sq < hit->dist_sq) {
884 const uint objects_len,
890 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
891 Object *obedit = objects[ob_index];
925 if (dist_test_sq < hit->dist_sq) {
949 const uint objects_len,
952 const bool only_in_face)
955 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
956 Object *obedit = objects[ob_index];
1015 dist_test_sq =
square_f(
sqrtf(dist_test_sq) + penalty_dist);
1018 if (dist_test_sq <= hit->dist_sq) {
1019 if (dist_test_sq == hit->
dist_sq) {
1040 const uint objects_len,
1042 const float penalty_dist,
1046 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
1047 Object *obedit = objects[ob_index];
1058 const float scale[2],
1059 const bool ignore_selected,
1066 const float *uv_best =
NULL;
1067 float dist_best = *dist_sq;
1073 BMLoop *l_iter, *l_first;
1084 if (dist_best > dist_test) {
1085 dist_best = dist_test;
1088 }
while ((l_iter = l_iter->
next) != l_first);
1091 if (uv_best !=
NULL) {
1093 *dist_sq = dist_best;
1102 const uint objects_len,
1104 const bool ignore_selected,
1110 float scale[2],
offset[2];
1117 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
1118 Object *obedit = objects[ob_index];
1147 float dist_best_sq = FLT_MAX;
1156 if (dist_test_sq < dist_best_sq) {
1157 dist_best_sq = dist_test_sq;
1175 float dist_best_sq = FLT_MAX;
1184 if (dist_test_sq < dist_best_sq) {
1185 dist_best_sq = dist_test_sq;
1200 const int cd_loop_uv_offset)
1204 BMLoop *l_radial_iter = e_iter->
l, *l_other;
1209 l_other = (l_radial_iter->
v !=
l->
v) ? l_radial_iter->
next : l_radial_iter;
1215 }
while ((l_radial_iter = l_radial_iter->
radial_next) != e_iter->
l);
1223 const int cd_loop_uv_offset)
1241 const int cd_loop_uv_offset)
1263 const int cd_loop_uv_offset)
1400 const int cd_loop_uv_offset)
1402 if (l_step->
f->
len == 4) {
1404 BMLoop *l_step_over = (v_from == l_step->
v) ? l_step->
next : l_step->
prev;
1406 scene, l_step_over, cd_loop_uv_offset);
1408 return (l_step_over->
v == v_from_next) ? l_step_over->
prev : l_step_over->
next;
1417 const int cd_loop_uv_offset)
1421 scene, l_step, v_from_next, cd_loop_uv_offset);
1444 const int cd_loop_uv_offset)
1448 for (
int side = 0; side < 2; side++) {
1449 BMLoop *l_step_pair[2] = {l_init_pair[0], l_init_pair[1]};
1450 BMVert *v_from = side ? l_step_pair[0]->
e->
v1 : l_step_pair[0]->
e->
v2;
1454 while ((l_step_pair[0] !=
NULL) && (l_step_pair[1] !=
NULL)) {
1459 scene, l_step_pair[0], cd_loop_uv_offset) != l_step_pair[1])) {
1470 for (
int i = 0; i <
ARRAY_SIZE(l_step_pair); i++) {
1472 scene, l_step_pair[i], v_from, cd_loop_uv_offset);
1479 v_from = v_from_next;
1493 const int cd_loop_uv_offset,
1495 int r_count_by_select[2])
1497 if (r_count_by_select) {
1498 r_count_by_select[0] = r_count_by_select[1] = 0;
1503 for (
int side = 0; side < 2; side++) {
1508 while (l_step !=
NULL) {
1513 scene, l_step, cd_loop_uv_offset) !=
NULL)) {
1517 if (r_count_by_select !=
NULL) {
1520 if (r_count_by_select[0] && r_count_by_select[1]) {
1521 r_count_by_select[0] = r_count_by_select[1] = -1;
1529 BMFace *f_step_prev = l_step->
f;
1538 if (f_step_prev == l_step->
f) {
1542 v_from = v_from_next;
1562 BMLoop *l_init_pair[2] = {
1572 if (l_init_pair[1] ==
NULL) {
1573 int count_by_select[2];
1576 scene, em, l_init_pair[0], cd_loop_uv_offset, boundary_mode, count_by_select);
1577 if (count_by_select[!
select] == 0) {
1582 scene, em, l_init_pair[0], cd_loop_uv_offset, boundary_mode, count_by_select);
1583 if (count_by_select[!
select] == 0) {
1589 if (l_init_pair[1] ==
NULL) {
1591 scene, em, l_init_pair[0], cd_loop_uv_offset, boundary_mode,
NULL);
1618 scene, em, l_iter,
select,
false, cd_loop_uv_offset);
1625 return (
select) ? 1 : -1;
1659 for (
int side = 0; side < 2; side++) {
1660 BMLoop *l_step = l_pair[side];
1669 if (l_step->
f->
len == 4) {
1672 scene, l_step_opposite, cd_loop_uv_offset);
1687 return (
select) ? 1 : -1;
1728 for (
int side = 0; side < 2; side++) {
1729 BMLoop *l_step = l_pair[side];
1737 if (use_face_select) {
1743 else if (use_vertex_select) {
1754 if (l_step->
f->
len == 4) {
1757 scene, l_step_opposite, cd_loop_uv_offset);
1758 if (l_step ==
NULL) {
1760 l_step = l_step_opposite;
1784 return (
select) ? 1 : -1;
1795 const uint objects_len,
1800 const bool select_faces)
1805 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
1806 if (hit && ob_index != 0) {
1809 Object *obedit = hit ? hit->
ob : objects[ob_index];
1816 int i, stacksize = 0, *stack;
1846 stack[stacksize] =
a;
1854 bool add_to_stack =
true;
1855 if (uv_sync_select) {
1874 if ((
l != l_other) &&
1877 add_to_stack =
false;
1885 stack[stacksize] =
a;
1898 if (efa == hit->
efa) {
1899 stack[stacksize] =
a;
1907 while (stacksize > 0) {
1910 a = stack[stacksize];
1921 for (iterv = vlist; iterv; iterv = iterv->
next) {
1930 for (iterv = startv; iterv; iterv = iterv->
next) {
1931 if ((startv != iterv) && (iterv->
separate)) {
1944 if ((toggle ==
true) && (extend ==
false) && (deselect ==
false)) {
1946 bool found_selected =
false;
1953 found_selected =
true;
1959 found_selected =
true;
1964 if (found_selected) {
1972 #define SET_SELECTION(value) \
1973 if (select_faces) { \
1974 BM_face_select_set(em->bm, efa, value); \
1977 uvedit_face_select_set(scene, em, efa, value, false, cd_loop_uv_offset); \
1983 if (!extend && !deselect && !toggle) {
1997 #undef SET_SELECTION
2003 if (uv_sync_select) {
2008 if (!select_faces) {
2018 const int cd_loop_uv_offset)
2053 uint objects_len = 0;
2059 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
2060 Object *obedit = objects[ob_index];
2063 bool changed =
false;
2080 if (is_uv_face_selectmode) {
2090 #define NEIGHBORING_FACE_IS_SEL 1
2091 #define CURR_FACE_IS_UNSEL 2
2117 #undef NEIGHBORING_FACE_IS_SEL
2118 #undef CURR_FACE_IS_UNSEL
2163 if (is_uv_face_selectmode) {
2195 ot->
name =
"Select More";
2196 ot->
description =
"Select more UV vertices connected to initial selection";
2213 ot->
name =
"Select Less";
2214 ot->
description =
"Deselect UV vertices at the boundary of each selection region";
2259 const uint objects_len)
2262 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
2263 Object *obedit = objects[ob_index];
2373 const uint objects_len,
2375 const Object *ob_exclude)
2382 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
2383 Object *obedit = objects[ob_index];
2384 if (ob_exclude && (obedit == ob_exclude)) {
2393 const uint objects_len,
2408 uint objects_len = 0;
2414 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
2415 Object *obedit = objects[ob_index];
2427 ot->
name =
"(De)select All";
2456 int selectmode, sticky;
2457 bool found_item =
false;
2463 const float penalty_dist = 3.0f *
U.pixelsize;
2533 bool found = found_item;
2534 bool changed =
false;
2536 bool is_selected =
false;
2550 if (hit.
l !=
NULL) {
2560 if ((found &&
params->select_passthrough) && is_selected) {
2563 else if (found ||
params->deselect_all) {
2566 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
2567 Object *obedit = objects[ob_index];
2591 bool select_value =
false;
2592 switch (
params->sel_op) {
2594 select_value =
true;
2598 select_value =
false;
2602 select_value = !is_selected;
2607 select_value =
true;
2618 scene, em, hit.
efa, select_value,
true, cd_loop_uv_offset);
2623 scene, em, hit.
l, select_value,
true, cd_loop_uv_offset);
2636 if (select_value ==
false) {
2643 flush = select_value ? 1 : -1;
2662 if (changed && found) {
2668 return changed || found;
2673 uint objects_len = 0;
2738 "Mouse location in normalized coordinates, 0.0 to 1.0 is within the image bounds",
2767 bool found_item =
false;
2804 else if (flush == -1) {
2812 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
2813 Object *obiter = objects[ob_index];
2825 uint objects_len = 0;
2865 ot->
name =
"Loop Select";
2881 "Extend selection rather than clearing the existing selection");
2891 "Mouse location in normalized coordinates, 0.0 to 1.0 is within the image bounds",
2927 ot->
name =
"Edge Ring Select";
2928 ot->
description =
"Select an edge ring of connected UV vertices";
2929 ot->
idname =
"UV_OT_select_edge_ring";
2943 "Extend selection rather than clearing the existing selection");
2953 "Mouse location in normalized coordinates, 0.0 to 1.0 is within the image bounds",
2972 bool deselect =
false;
2982 uint objects_len = 0;
3005 if (!extend && !deselect) {
3010 scene, objects, objects_len, pick ? &hit :
NULL, extend, deselect,
false, select_faces);
3013 Object **objects_free = objects;
3019 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
3020 Object *obedit = objects[ob_index];
3038 ot->
name =
"Select Linked";
3039 ot->
description =
"Select all UV vertices linked to the active UV map";
3040 ot->
idname =
"UV_OT_select_linked";
3069 ot->
name =
"Select Linked Pick";
3070 ot->
description =
"Select all UV vertices linked under the mouse";
3071 ot->
idname =
"UV_OT_select_linked_pick";
3087 "Extend selection rather than clearing the existing selection");
3093 "Deselect linked UV vertices rather than selecting them");
3103 "Mouse location in normalized coordinates, 0.0 to 1.0 is within the image bounds",
3138 bool changed_multi =
false;
3140 uint objects_len = 0;
3144 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
3145 Object *obedit = objects[ob_index];
3148 bool changed =
false;
3153 bool is_sel =
false;
3154 bool is_unsel =
false;
3172 if (is_sel && is_unsel) {
3177 if (is_sel && is_unsel) {
3188 changed_multi =
true;
3201 ot->
name =
"Select Split";
3241 const uint efa_index,
3244 const int cd_loop_uv_offset)
3253 while (vlist_iter) {
3254 if (vlist_iter->separate) {
3255 start_vlist = vlist_iter;
3258 if (efa_index == vlist_iter->poly_index) {
3262 vlist_iter = vlist_iter->
next;
3265 vlist_iter = start_vlist;
3266 while (vlist_iter) {
3268 if (vlist_iter != start_vlist && vlist_iter->
separate) {
3272 if (efa_index != vlist_iter->poly_index) {
3282 vlist_iter = vlist_iter->next;
3330 scene, em, vmap, efa_index,
l,
select, cd_loop_uv_offset);
3336 scene, em, vmap, efa_index,
l,
select, cd_loop_uv_offset);
3415 scene, em, vmap, efa_index,
l,
select, cd_loop_uv_offset);
3476 scene, em, vmap, efa_index,
l,
true, cd_loop_uv_offset);
3478 scene, em, vmap, efa_index,
l->
next,
true, cd_loop_uv_offset);
3487 MLoopUV *luv, *luv_next, *luv_prev;
3542 bool changed_multi =
false;
3544 uint objects_len = 0;
3548 if (use_pre_deselect) {
3553 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
3554 Object *obedit = objects[ob_index];
3557 bool changed =
false;
3562 if (use_face_center && !pinned) {
3584 else if (use_edge && !pinned) {
3585 bool do_second_pass =
true;
3598 scene, em, l_prev,
select,
false, cd_loop_uv_offset);
3600 do_second_pass =
false;
3608 if (do_second_pass) {
3621 scene, em, l_prev,
select,
false, cd_loop_uv_offset);
3639 bool has_selected =
false;
3648 has_selected =
true;
3659 if (has_selected && use_select_linked) {
3673 if (changed || use_pre_deselect) {
3674 changed_multi =
true;
3722 const float ellipse[2])
3725 const float co[2] = {
3726 (uv[0] -
offset[0]) * ellipse[0],
3727 (uv[1] -
offset[1]) * ellipse[1],
3733 const float uv_b[2],
3735 const float ellipse[2])
3738 const float co_a[2] = {
3739 (uv_a[0] -
offset[0]) * ellipse[0],
3740 (uv_a[1] -
offset[1]) * ellipse[1],
3742 const float co_b[2] = {
3743 (uv_b[0] -
offset[0]) * ellipse[0],
3744 (uv_b[1] -
offset[1]) * ellipse[1],
3763 float offset[2], ellipse[2];
3784 ellipse[0] =
width * zoomx / radius;
3785 ellipse[1] =
height * zoomy / radius;
3789 bool changed_multi =
false;
3791 uint objects_len = 0;
3800 if (use_pre_deselect) {
3804 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
3805 Object *obedit = objects[ob_index];
3808 bool changed =
false;
3813 if (use_face_center) {
3832 else if (use_edge) {
3845 scene, em, l_prev,
select,
false, cd_loop_uv_offset);
3860 bool has_selected =
false;
3868 has_selected =
true;
3872 if (has_selected && use_select_linked) {
3886 if (changed || use_pre_deselect) {
3887 changed_multi =
true;
3905 ot->
name =
"Circle Select";
3906 ot->
description =
"Select UV vertices using circle selection";
3907 ot->
idname =
"UV_OT_select_circle";
3932 const rcti *clip_rect,
3933 const int mcoords[][2],
3934 const int mcoords_len,
3935 const float co_test[2])
3939 ®ion->
v2d, co_test[0], co_test[1], &co_screen[0], &co_screen[1]) &&
3942 mcoords, mcoords_len, co_screen[0], co_screen[1],
V2D_IS_CLIPPED)) {
3949 const rcti *clip_rect,
3950 const int mcoords[][2],
3951 const int mcoords_len,
3952 const float co_test_a[2],
3953 const float co_test_b[2])
3955 int co_screen_a[2], co_screen_b[2];
3957 ®ion->
v2d, co_test_a, co_test_b, co_screen_a, co_screen_b) &&
3967 const int mcoords[][2],
3968 const int mcoords_len,
3992 bool changed_multi =
false;
3997 uint objects_len = 0;
4001 if (use_pre_deselect) {
4005 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
4006 Object *obedit = objects[ob_index];
4008 bool changed =
false;
4014 if (use_face_center) {
4033 else if (use_edge) {
4034 bool do_second_pass =
true;
4046 region, &rect, mcoords, mcoords_len, luv->
uv) &&
4048 region, &rect, mcoords, mcoords_len, luv_prev->
uv)) {
4050 scene, em, l_prev,
select,
false, cd_loop_uv_offset);
4051 do_second_pass =
false;
4060 if (do_second_pass) {
4072 region, &rect, mcoords, mcoords_len, luv->
uv, luv_prev->
uv)) {
4074 scene, em, l_prev,
select,
false, cd_loop_uv_offset);
4090 bool has_selected =
false;
4095 region, &rect, mcoords, mcoords_len, luv->
uv)) {
4099 has_selected =
true;
4103 if (has_selected && use_select_linked) {
4117 if (changed || use_pre_deselect) {
4118 changed_multi =
true;
4130 return changed_multi;
4151 ot->
name =
"Lasso Select UV";
4196 uint objects_len = 0;
4200 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
4201 Object *obedit = objects[ob_index];
4205 bool changed =
false;
4237 ot->
name =
"Selected Pinned";
4239 ot->
idname =
"UV_OT_select_pinned";
4270 return !((
a->indexA ==
b->indexA &&
a->indexB ==
b->indexB) ||
4271 (
a->indexA ==
b->indexB &&
a->indexB ==
b->indexA));
4288 const float t2[3][2],
4289 const float endpoint_bias)
4331 uint objects_len = 0;
4336 uint uv_tri_len = 0;
4337 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
4338 Object *obedit = objects[ob_index];
4354 uv_tri_len += efa->
len - 2;
4365 int face_len_alloc = 3;
4366 float(*uv_verts)[2] =
MEM_mallocN(
sizeof(*uv_verts) * face_len_alloc,
"UvOverlapCoords");
4386 const uint face_len = efa->
len;
4387 const uint tri_len = face_len - 2;
4389 if (face_len_alloc < face_len) {
4392 uv_verts =
MEM_mallocN(
sizeof(*uv_verts) * face_len,
"UvOverlapCoords");
4394 face_len_alloc = face_len;
4405 for (
int t = 0;
t < tri_len;
t++) {
4410 const float tri[3][3] = {
4432 uint tree_overlap_len;
4435 if (overlap !=
NULL) {
4438 for (
int i = 0; i < tree_overlap_len; i++) {
4440 if (overlap[i].indexA == overlap[i].indexB) {
4450 const struct UVOverlapData *o_b = &overlap_data[overlap[i].indexB];
4467 const float endpoint_bias = -1e-4f;
4499 ot->
name =
"Select Overlap";
4500 ot->
description =
"Select all UV faces which overlap each other";
4501 ot->
idname =
"UV_OT_select_overlap";
4513 "Extend selection rather than clearing the existing selection");
4522 const float ob_m3[3][3],
4524 const int cd_loop_uv_offset)
4561 const float ob_m3[3][3],
4564 const int cd_loop_uv_offset)
4585 return len_v3v3(edge->v1->co, edge->v2->co);
4611 const float ob_m3[3][3],
4612 const int cd_loop_uv_offset)
4652 uint objects_len = 0;
4656 int max_verts_selected_all = 0;
4666 max_verts_selected_all += face->
len;
4672 KDTree_1d *tree_1d = BLI_kdtree_1d_new(max_verts_selected_all);
4700 BLI_kdtree_1d_insert(tree_1d, tree_index++, &needle);
4705 if (tree_1d !=
NULL) {
4706 BLI_kdtree_1d_deduplicate(tree_1d);
4707 BLI_kdtree_1d_balance(tree_1d);
4718 bool changed =
false;
4750 BLI_kdtree_1d_free(tree_1d);
4765 uint objects_len = 0;
4769 int max_edges_selected_all = 0;
4779 max_edges_selected_all += face->
len;
4785 KDTree_1d *tree_1d = BLI_kdtree_1d_new(max_edges_selected_all);
4816 BLI_kdtree_1d_insert(tree_1d, tree_index++, &needle);
4822 if (tree_1d !=
NULL) {
4823 BLI_kdtree_1d_deduplicate(tree_1d);
4824 BLI_kdtree_1d_balance(tree_1d);
4835 bool changed =
false;
4869 BLI_kdtree_1d_free(tree_1d);
4884 uint objects_len = 0;
4888 int max_faces_selected_all = 0;
4897 KDTree_1d *tree_1d = BLI_kdtree_1d_new(max_faces_selected_all);
4922 BLI_kdtree_1d_insert(tree_1d, tree_index++, &needle);
4927 if (tree_1d !=
NULL) {
4928 BLI_kdtree_1d_deduplicate(tree_1d);
4929 BLI_kdtree_1d_balance(tree_1d);
4937 bool changed =
false;
4968 BLI_kdtree_1d_free(tree_1d);
5040 ot->
name =
"Select Similar";
5042 ot->
idname =
"UV_OT_select_similar";
5081 faces[faces_len++] = f;
5082 if (faces_len == len_max) {
5090 *r_faces_len = faces_len;
5091 if (faces_len != len_max) {
5125 edges[edges_len++] = l_iter;
5126 if (edges_len == len_max) {
5137 }
while ((l_radial_iter = l_radial_iter->
radial_next) != l_iter);
5146 *r_edges_len = edges_len;
5147 if (edges_len != len_max) {
5148 edges =
MEM_reallocN(edges,
sizeof(*edges) * edges_len);
5182 verts[verts_len++] = l_iter;
5183 if (verts_len == len_max) {
5202 *r_verts_len = verts_len;
5203 if (verts_len != len_max) {
5221 const int cd_loop_uv_offset)
5227 if (elementmap ==
NULL) {
5233 bool *is_island_not_selected =
MEM_callocN(
sizeof(
bool) * (num_islands), __func__);
5245 is_island_not_selected[
element->island] =
true;
5258 if (is_island_not_selected[
element->island] ==
true) {
5343 uint objects_len = 0;
5400 ot->
name =
"UV Select Mode";
typedef float(TangentPoint)[2]
struct Scene * CTX_data_scene(const bContext *C)
struct ViewLayer * CTX_data_view_layer(const bContext *C)
struct Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
struct ARegion * CTX_wm_region(const bContext *C)
struct SpaceImage * CTX_wm_space_image(const bContext *C)
struct ToolSettings * CTX_data_tool_settings(const bContext *C)
CustomData interface, see also DNA_customdata_types.h.
int CustomData_get_offset(const struct CustomData *data, int type)
BMEditMesh * BKE_editmesh_from_object(struct Object *ob)
Return the BMEditMesh for a given object.
#define BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(view_layer, v3d, r_len)
General operations, lookup, etc. for materials.
void BKE_mesh_batch_cache_dirty_tag(struct Mesh *me, eMeshBatchDirtyMode mode)
@ BKE_MESH_BATCH_DIRTY_UVEDIT_SELECT
void BKE_report(ReportList *reports, eReportType type, const char *message)
#define BLI_assert_unreachable()
GSet * BLI_gset_new_ex(GSetHashFP hashfp, GSetCmpFP cmpfp, const char *info, unsigned int nentries_reserve) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void BLI_gset_free(GSet *gs, GSetKeyFreeFP keyfreefp)
bool BLI_gset_add(GSet *gs, void *key)
BLI_INLINE unsigned int BLI_hash_int_2d(unsigned int kx, unsigned int ky)
BVHTreeOverlap * BLI_bvhtree_overlap(const BVHTree *tree1, const BVHTree *tree2, unsigned int *r_overlap_num, BVHTree_OverlapCallback callback, void *userdata)
void BLI_bvhtree_balance(BVHTree *tree)
BVHTree * BLI_bvhtree_new(int maxsize, float epsilon, char tree_type, char axis)
void BLI_bvhtree_free(BVHTree *tree)
void BLI_bvhtree_insert(BVHTree *tree, int index, const float co[3], int numpoints)
A KD-tree for nearest neighbor search.
bool BLI_lasso_is_point_inside(const int mcoords[][2], unsigned int mcoords_len, int sx, int sy, int error_value)
void BLI_lasso_boundbox(struct rcti *rect, const int mcoords[][2], unsigned int mcoords_len)
bool BLI_lasso_is_edge_inside(const int mcoords[][2], unsigned int mcoords_len, int x0, int y0, int x1, int y1, int error_value)
MINLINE float square_f(float a)
float closest_to_line_segment_v2(float r_close[2], const float p[2], const float l1[2], const float l2[2])
int isect_point_tri_v2(const float pt[2], const float v1[2], const float v2[2], const float v3[2])
int isect_seg_seg_v2_point_ex(const float v0[2], const float v1[2], const float v2[2], const float v3[2], float endpoint_bias, float vi[2])
float dist_squared_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2])
void copy_m3_m4(float m1[3][3], const float m2[4][4])
MINLINE float len_squared_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float len_squared_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void mul_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE void sub_v2_v2(float r[2], const float a[2])
MINLINE void mul_v2_v2(float r[2], const float a[2])
void mid_v2_v2v2v2(float v[2], const float v1[2], const float v2[2], const float v3[2])
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE float line_point_side_v2(const float l1[2], const float l2[2], const float pt[2]) ATTR_WARN_UNUSED_RESULT
MINLINE float len_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
void BLI_polyfill_calc(const float(*coords)[2], unsigned int coords_num, int coords_sign, unsigned int(*r_tris)[3])
bool BLI_rcti_isect_pt_v(const struct rcti *rect, const int xy[2])
bool BLI_rctf_isect_pt_v(const struct rctf *rect, const float xy[2])
bool BLI_rcti_isect_segment(const struct rcti *rect, const int s1[2], const int s2[2])
bool BLI_rctf_isect_segment(const struct rctf *rect, const float s1[2], const float s2[2])
#define UNUSED_VARS_NDEBUG(...)
#define SET_FLAG_FROM_TEST(value, test, flag)
struct Depsgraph Depsgraph
void DEG_id_tag_update(struct ID *id, int flag)
struct Object * DEG_get_evaluated_object(const struct Depsgraph *depsgraph, struct Object *object)
@ ID_RECALC_COPY_ON_WRITE
Object is a sort of wrapper for general info.
#define UV_SYNC_SELECTION
#define SCE_SELECT_VERTEX
void ED_space_image_get_zoom(struct SpaceImage *sima, const struct ARegion *region, float *r_zoomx, float *r_zoomy)
void ED_space_image_get_size(struct SpaceImage *sima, int *r_width, int *r_height)
struct UvVertMap * BM_uv_vert_map_create(struct BMesh *bm, bool use_select, bool use_winding)
struct UvElementMap * BM_uv_element_map_create(struct BMesh *bm, const struct Scene *scene, bool uv_selected, bool use_winding, bool do_islands)
struct UvElement * BM_uv_element_get(struct UvElementMap *map, struct BMFace *efa, struct BMLoop *l)
struct UvMapVert * BM_uv_vert_map_at_index(struct UvVertMap *vmap, unsigned int v)
void EDBM_flag_enable_all(struct BMEditMesh *em, char hflag)
void EDBM_select_flush(struct BMEditMesh *em)
void EDBM_select_more(struct BMEditMesh *em, bool use_face_step)
void EDBM_flag_disable_all(struct BMEditMesh *em, char hflag)
void EDBM_select_toggle_all(struct BMEditMesh *em)
void EDBM_deselect_flush(struct BMEditMesh *em)
void EDBM_select_less(struct BMEditMesh *em, bool use_face_step)
void EDBM_select_swap(struct BMEditMesh *em)
void BM_uv_element_map_free(struct UvElementMap *element_map)
void EDBM_selectmode_flush(struct BMEditMesh *em)
void BM_uv_vert_map_free(struct UvVertMap *vmap)
bool ED_operator_uvedit_space_image(struct bContext *C)
bool ED_operator_uvedit(struct bContext *C)
eSelectOp ED_select_op_modal(eSelectOp sel_op, bool is_first)
void ED_select_pick_params_from_operator(struct PointerRNA *ptr, struct SelectPick_Params *params) ATTR_NONNULL(1
#define SEL_OP_USE_PRE_DESELECT(sel_op)
const char * ED_select_circle_get_name(struct wmOperatorType *ot, PointerRNA *ptr)
void const char * ED_select_pick_get_name(struct wmOperatorType *ot, PointerRNA *ptr)
bool ED_select_similar_compare_float_tree(const struct KDTree_1d *tree, float length, float thresh, eSimilarCmp compare)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei height
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei width
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble t
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
void UI_view2d_scale_get(const struct View2D *v2d, float *r_x, float *r_y)
bool UI_view2d_view_to_region_segment_clip(const View2D *v2d, const float xy_a[2], const float xy_b[2], int r_region_a[2], int r_region_b[2]) ATTR_NONNULL()
void UI_view2d_view_to_region_fl(const struct View2D *v2d, float x, float y, float *r_region_x, float *r_region_y) ATTR_NONNULL()
void UI_view2d_region_to_view_rctf(const struct View2D *v2d, const struct rctf *rect_src, struct rctf *rect_dst) ATTR_NONNULL()
bool UI_view2d_view_to_region_clip(const struct View2D *v2d, float x, float y, int *r_region_x, int *r_region_y) ATTR_NONNULL()
void UI_view2d_region_to_view(const struct View2D *v2d, float x, float y, float *r_view_x, float *r_view_y) ATTR_NONNULL()
@ OPTYPE_DEPENDS_ON_CURSOR
__forceinline const avxb select(const avxb &m, const avxb &t, const avxb &f)
#define BM_DISK_EDGE_NEXT(e, v)
#define BM_FACE_FIRST_LOOP(p)
#define BM_ELEM_CD_GET_VOID_P(ele, offset)
#define BM_elem_index_get(ele)
#define BM_elem_flag_disable(ele, hflag)
#define BM_elem_flag_test(ele, hflag)
#define BM_elem_flag_test_bool(ele, hflag)
#define BM_elem_flag_enable(ele, hflag)
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)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_select_history_clear(BMesh *bm)
void BM_face_select_set(BMesh *bm, BMFace *f, const bool select)
Select Face.
void BM_vert_select_set(BMesh *bm, BMVert *v, const bool select)
Select Vert.
void BM_edge_select_set(BMesh *bm, BMEdge *e, const bool select)
Select Edge.
void BM_select_history_validate(BMesh *bm)
void BM_mesh_elem_hflag_disable_all(BMesh *bm, const char htype, const char hflag, const bool respecthide)
void BM_mesh_active_face_set(BMesh *bm, BMFace *f)
#define BM_select_history_store_notest(bm, ele)
#define BM_select_history_store(bm, ele)
#define BM_select_history_remove(bm, ele)
void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
BLI_INLINE BMFace * BM_face_at_index(BMesh *bm, const int index)
ATTR_WARN_UNUSED_RESULT const void * element
float BM_face_calc_area_uv(const BMFace *f, int cd_loop_uv_offset)
float BM_face_calc_area_with_mat3(const BMFace *f, const float mat3[3][3])
BMLoop * BM_face_edge_share_loop(BMFace *f, BMEdge *e)
Return the Loop Shared by Face and Edge.
BMLoop * BM_face_vert_share_loop(BMFace *f, BMVert *v)
Return the Loop Shared by Face and Vertex.
BLI_INLINE BMVert * BM_edge_other_vert(BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
BLI_INLINE bool BM_vert_in_edge(const BMEdge *e, const BMVert *v) 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
bool BM_loop_uv_share_vert_check(BMLoop *l_a, BMLoop *l_b, const int cd_loop_uv_offset)
bool BM_loop_uv_share_edge_check(BMLoop *l_a, BMLoop *l_b, const int cd_loop_uv_offset)
void BM_face_uv_calc_center_median(const BMFace *f, const int cd_loop_uv_offset, float r_cent[2])
bool BM_face_uv_point_inside_test(const BMFace *f, const float co[2], const int cd_loop_uv_offset)
const Depsgraph * depsgraph
ccl_gpu_kernel_postfix ccl_global float int int int int float threshold
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
ccl_gpu_kernel_postfix int ccl_global int * indices
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
float RNA_property_float_get(PointerRNA *ptr, PropertyRNA *prop)
bool RNA_property_is_set(PointerRNA *ptr, PropertyRNA *prop)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
int RNA_int_get(PointerRNA *ptr, const char *name)
float RNA_float_get(PointerRNA *ptr, const char *name)
void RNA_property_float_set(PointerRNA *ptr, PropertyRNA *prop, float value)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_float(StructOrFunctionRNA *cont_, const char *identifier, float default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, bool default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_float_vector(StructOrFunctionRNA *cont_, const char *identifier, int len, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_enum_funcs(PropertyRNA *prop, EnumPropertyItemFunc itemfunc)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description)
const EnumPropertyItem rna_enum_mesh_select_mode_uv_items[]
struct BMEditSelection * prev
struct BMLoop * radial_next
struct ToolSettings * toolsettings
int(* invoke)(struct bContext *, struct wmOperator *, const struct wmEvent *) ATTR_WARN_UNUSED_RESULT
int(* modal)(struct bContext *, struct wmOperator *, const struct wmEvent *) ATTR_WARN_UNUSED_RESULT
bool(* poll)(struct bContext *) ATTR_WARN_UNUSED_RESULT
void(* cancel)(struct bContext *, struct wmOperator *)
int(* exec)(struct bContext *, struct wmOperator *) ATTR_WARN_UNUSED_RESULT
const char *(* get_name)(struct wmOperatorType *, struct PointerRNA *)
struct ReportList * reports
#define UV_NEAREST_HIT_INIT_MAX(v2d)
#define UV_NEAREST_HIT_INIT_DIST_PX(v2d, dist_px)
void UV_OT_select_all(wmOperatorType *ot)
bool uv_find_nearest_vert_multi(Scene *scene, Object **objects, const uint objects_len, float const co[2], const float penalty_dist, UvNearestHit *hit)
void UV_OT_select_edge_ring(wmOperatorType *ot)
static EnumPropertyItem prop_edge_similar_types[]
bool uvedit_face_select_test_ex(const ToolSettings *ts, BMFace *efa, const int cd_loop_uv_offset)
static int uv_circle_select_is_edge_inside(const float uv_a[2], const float uv_b[2], const float offset[2], const float ellipse[2])
void ED_uvedit_selectmode_clean(const Scene *scene, Object *obedit)
void uvedit_edge_select_set_with_sticky(const Scene *scene, BMEditMesh *em, BMLoop *l, const bool select, const bool do_history, const uint cd_loop_uv_offset)
static BMLoop * uvedit_loop_find_other_radial_loop_with_visible_face(const Scene *scene, BMLoop *l_src, const int cd_loop_uv_offset)
void uvedit_face_select_enable(const Scene *scene, BMEditMesh *em, BMFace *efa, const bool do_history, const int cd_loop_uv_offset)
void uvedit_uv_select_shared_vert(const Scene *scene, BMEditMesh *em, BMLoop *l, const bool select, const int sticky_flag, const bool do_history, const int cd_loop_uv_offset)
#define SET_SELECTION(value)
void ED_uvedit_selectmode_clean_multi(bContext *C)
bool uv_find_nearest_face_multi(Scene *scene, Object **objects, const uint objects_len, const float co[2], UvNearestHit *hit)
static void uv_select_flush_from_tag_sticky_loc_internal(const Scene *scene, BMEditMesh *em, UvVertMap *vmap, const uint efa_index, BMLoop *l, const bool select, const int cd_loop_uv_offset)
static int uv_select_edge_ring_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void uv_select_tag_update_for_object(Depsgraph *depsgraph, const ToolSettings *ts, Object *obedit)
static float get_uv_vert_needle(const eUVSelectSimilar type, BMVert *vert, const float ob_m3[3][3], MLoopUV *luv, const int cd_loop_uv_offset)
static EnumPropertyItem prop_vert_similar_types[]
static int uv_select_linked_internal(bContext *C, wmOperator *op, const wmEvent *event, bool pick)
void uvedit_edge_select_disable(const Scene *scene, BMEditMesh *em, BMLoop *l, const int cd_loop_uv_offset)
static int uv_circle_select_exec(bContext *C, wmOperator *op)
bool uv_find_nearest_face_multi_ex(Scene *scene, Object **objects, const uint objects_len, const float co[2], UvNearestHit *hit, const bool only_in_face)
static int uv_select_less_exec(bContext *C, wmOperator *UNUSED(op))
static int uv_select_loop_exec(bContext *C, wmOperator *op)
BMLoop * uv_find_nearest_loop_from_vert(struct Scene *scene, struct Object *obedit, struct BMVert *v, const float co[2])
static void bm_loop_tags_clear(BMesh *bm)
void UV_OT_select(wmOperatorType *ot)
void ED_uvedit_active_edge_loop_set(BMesh *bm, BMLoop *l)
void UV_OT_select_split(wmOperatorType *ot)
static float get_uv_face_needle(const eUVSelectSimilar type, BMFace *face, const float ob_m3[3][3], const int cd_loop_uv_offset)
static int uv_select_overlap(bContext *C, const bool extend)
static bool uv_nearest_between(const BMLoop *l, const float co[2], const int cd_loop_uv_offset)
static void uv_select_all_perform_multi(const Scene *scene, Object **objects, const uint objects_len, int action)
void UV_OT_select_linked(wmOperatorType *ot)
static int uv_select_linked_pick_exec(bContext *C, wmOperator *op)
static int uv_select_edgeloop(Scene *scene, Object *obedit, UvNearestHit *hit, const bool extend)
bool uvedit_uv_select_test(const Scene *scene, BMLoop *l, const int cd_loop_uv_offset)
void uvedit_deselect_flush(const Scene *scene, BMEditMesh *em)
static bool uv_mouse_select(bContext *C, const float co[2], const struct SelectPick_Params *params)
static bool uv_mouse_select_multi(bContext *C, Object **objects, uint objects_len, const float co[2], const struct SelectPick_Params *params)
BMLoop * uv_find_nearest_loop_from_edge(struct Scene *scene, struct Object *obedit, struct BMEdge *e, const float co[2])
@ UV_EDGE_LOOP_BOUNDARY_ALL
@ UV_EDGE_LOOP_BOUNDARY_LOOP
void uvedit_uv_select_disable(const Scene *scene, BMEditMesh *em, BMLoop *l, const int cd_loop_uv_offset)
static int uv_select_mode_exec(bContext *C, wmOperator *op)
BMLoop ** ED_uvedit_selected_verts(const Scene *scene, BMesh *bm, int len_max, int *r_verts_len)
static int uv_circle_select_is_point_inside(const float uv[2], const float offset[2], const float ellipse[2])
static void uv_select_all_perform(const Scene *scene, Object *obedit, int action)
BLI_INLINE bool overlap_cmp(const void *a_v, const void *b_v)
static int uv_box_select_exec(bContext *C, wmOperator *op)
static int uv_select_similar_exec(bContext *C, wmOperator *op)
char ED_uvedit_select_mode_get(const Scene *scene)
static int uv_select_loop_invoke(bContext *C, wmOperator *op, const wmEvent *event)
bool uv_find_nearest_edge(Scene *scene, Object *obedit, const float co[2], const float penalty, UvNearestHit *hit)
#define NEIGHBORING_FACE_IS_SEL
static void uv_select_all_perform_multi_ex(const Scene *scene, Object **objects, const uint objects_len, int action, const Object *ob_exclude)
static int uv_select_similar_vert_exec(bContext *C, wmOperator *op)
void uvedit_uv_select_enable(const Scene *scene, BMEditMesh *em, BMLoop *l, const bool do_history, const int cd_loop_uv_offset)
static int uv_select_overlap_exec(bContext *C, wmOperator *op)
static void uv_select_edgeloop_double_side_tag(const Scene *scene, BMEditMesh *em, BMLoop *l_init_pair[2], const int cd_loop_uv_offset)
static void uv_select_edgeloop_single_side_tag(const Scene *scene, BMEditMesh *em, BMLoop *l_init, const int cd_loop_uv_offset, enum eUVEdgeLoopBoundaryMode boundary_mode, int r_count_by_select[2])
void UV_OT_select_circle(wmOperatorType *ot)
void uvedit_select_flush(const Scene *scene, BMEditMesh *em)
static int uv_select_linked_exec(bContext *C, wmOperator *op)
bool uv_find_nearest_vert(Scene *scene, Object *obedit, float const co[2], const float penalty_dist, UvNearestHit *hit)
static int uv_select_all_exec(bContext *C, wmOperator *op)
void UV_OT_select_mode(wmOperatorType *ot)
bool uvedit_face_visible_test_ex(const ToolSettings *ts, BMFace *efa)
void UV_OT_select_similar(wmOperatorType *ot)
static int uv_select_mode_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
static bool do_lasso_select_mesh_uv_is_edge_inside(const ARegion *region, const rcti *clip_rect, const int mcoords[][2], const int mcoords_len, const float co_test_a[2], const float co_test_b[2])
static void uv_select_flush_from_tag_loop(const Scene *scene, Object *obedit, const bool select)
void UV_OT_select_linked_pick(wmOperatorType *ot)
void UV_OT_select_more(wmOperatorType *ot)
void uvedit_edge_select_set_noflush(const Scene *scene, BMLoop *l, const bool select, const int sticky_flag, const int cd_loop_uv_offset)
void UV_OT_select_pinned(wmOperatorType *ot)
bool uvedit_vert_is_face_select_any_other(const Scene *scene, BMLoop *l, const int cd_loop_uv_offset)
static void uv_select_flush_from_tag_face(const Scene *scene, Object *obedit, const bool select)
void ED_uvedit_selectmode_flush(const Scene *scene, BMEditMesh *em)
static int uv_select_linked_pick_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static int uv_select_edgering(Scene *scene, Object *obedit, UvNearestHit *hit, const bool extend)
void uvedit_uv_select_set_with_sticky(const Scene *scene, BMEditMesh *em, BMLoop *l, const bool select, const bool do_history, const uint cd_loop_uv_offset)
static void bm_uv_flag_clear(const Scene *scene, BMesh *bm, const int flag, const int cd_loop_uv_offset)
BMFace ** ED_uvedit_selected_faces(const Scene *scene, BMesh *bm, int len_max, int *r_faces_len)
void UV_OT_select_loop(wmOperatorType *ot)
static EnumPropertyItem prop_face_similar_types[]
bool uvedit_select_is_any_selected_multi(const Scene *scene, Object **objects, const uint objects_len)
BLI_INLINE uint overlap_hash(const void *overlap_v)
BMLoop ** ED_uvedit_selected_edges(const Scene *scene, BMesh *bm, int len_max, int *r_edges_len)
static int uv_select_pinned_exec(bContext *C, wmOperator *op)
static bool uvedit_nearest_uv(const Scene *scene, Object *obedit, const float co[2], const float scale[2], const bool ignore_selected, float *dist_sq, float r_uv[2])
bool uvedit_face_visible_test(const Scene *scene, BMFace *efa)
static BMLoop * bm_select_edgeloop_double_side_next(const Scene *scene, BMLoop *l_step, BMVert *v_from, const int cd_loop_uv_offset)
static bool do_lasso_select_mesh_uv(bContext *C, const int mcoords[][2], const int mcoords_len, const eSelectOp sel_op)
bool uv_find_nearest_face(Scene *scene, Object *obedit, const float co[2], UvNearestHit *hit)
bool uvedit_uv_select_test_ex(const ToolSettings *ts, BMLoop *l, const int cd_loop_uv_offset)
bool uvedit_face_select_test(const Scene *scene, BMFace *efa, const int cd_loop_uv_offset)
static void uv_select_flush_from_loop_edge_flag(const Scene *scene, BMEditMesh *em)
static int uv_select_similar_edge_exec(bContext *C, wmOperator *op)
bool uv_find_nearest_edge_multi(Scene *scene, Object **objects, const uint objects_len, const float co[2], const float penalty, UvNearestHit *hit)
BMLoop * ED_uvedit_active_edge_loop_get(BMesh *bm)
static int uv_select_similar_face_exec(bContext *C, wmOperator *op)
static void uv_isolate_selected_islands(const Scene *scene, BMEditMesh *em, const int cd_loop_uv_offset)
static bool overlap_tri_tri_uv_test(const float t1[3][2], const float t2[3][2], const float endpoint_bias)
static BMLoop * bm_select_edgeloop_single_side_next(const Scene *scene, BMLoop *l_step, BMVert *v_from, const int cd_loop_uv_offset)
static bool do_lasso_select_mesh_uv_is_point_inside(const ARegion *region, const rcti *clip_rect, const int mcoords[][2], const int mcoords_len, const float co_test[2])
#define CURR_FACE_IS_UNSEL
static int uv_select_edge_ring_exec(bContext *C, wmOperator *op)
static void uvedit_vertex_select_tagged(BMEditMesh *em, Scene *scene, bool select, int cd_loop_uv_offset)
static int uv_select_split_exec(bContext *C, wmOperator *op)
bool uvedit_edge_select_test_ex(const ToolSettings *ts, BMLoop *l, const int cd_loop_uv_offset)
void uvedit_edge_select_shared_vert(const Scene *scene, BMEditMesh *em, BMLoop *l, const bool select, const int sticky_flag, const bool do_history, const int cd_loop_uv_offset)
static int uv_select_more_less(bContext *C, const bool select)
static int uv_select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void uv_select_all(const Scene *scene, BMEditMesh *em, bool select_all)
bool uvedit_edge_select_test(const Scene *scene, BMLoop *l, const int cd_loop_uv_offset)
const float * uvedit_first_selected_uv_from_vertex(Scene *scene, BMVert *eve, const int cd_loop_uv_offset)
static int uv_mouse_select_loop_generic(bContext *C, const float co[2], const bool extend, enum eUVLoopGenericType loop_type)
void uvedit_face_select_set(const Scene *scene, BMEditMesh *em, BMFace *efa, const bool select, const bool do_history, const int cd_loop_uv_offset)
bool uv_find_nearest_face_ex(Scene *scene, Object *obedit, const float co[2], UvNearestHit *hit, const bool only_in_face)
static int uv_select_exec(bContext *C, wmOperator *op)
void UV_OT_select_overlap(wmOperatorType *ot)
bool ED_uvedit_nearest_uv_multi(const View2D *v2d, const Scene *scene, Object **objects, const uint objects_len, const int mval[2], const bool ignore_selected, float *dist_sq, float r_uv[2])
void UV_OT_select_lasso(wmOperatorType *ot)
void uvedit_face_select_set_with_sticky(const Scene *scene, BMEditMesh *em, BMFace *efa, const bool select, const bool do_history, const int cd_loop_uv_offset)
static BMLoop * uvedit_loop_find_other_boundary_loop_with_visible_face(const Scene *scene, BMLoop *l_edge, BMVert *v_pivot, const int cd_loop_uv_offset)
static EnumPropertyItem prop_similar_compare_types[]
static int uv_select_faceloop(Scene *scene, Object *obedit, UvNearestHit *hit, const bool extend)
void uvedit_edge_select_set(const Scene *scene, BMEditMesh *em, BMLoop *l, const bool select, const bool do_history, const int cd_loop_uv_offset)
static void uv_select_linked_multi(Scene *scene, Object **objects, const uint objects_len, UvNearestHit *hit, const bool extend, bool deselect, const bool toggle, const bool select_faces)
bool uvedit_vert_is_edge_select_any_other(const Scene *scene, BMLoop *l, const int cd_loop_uv_offset)
BMLoop * ED_uvedit_active_vert_loop_get(BMesh *bm)
void uvedit_edge_select_enable(const Scene *scene, BMEditMesh *em, BMLoop *l, const bool do_history, const int cd_loop_uv_offset)
bool uvedit_vert_is_all_other_faces_selected(const Scene *scene, BMLoop *l, const int cd_loop_uv_offset)
void uvedit_face_select_shared_vert(const Scene *scene, BMEditMesh *em, BMFace *efa, const bool select, const bool do_history, const int cd_loop_uv_offset)
void uvedit_face_select_disable(const Scene *scene, BMEditMesh *em, BMFace *efa, const int cd_loop_uv_offset)
static int uv_lasso_select_exec(bContext *C, wmOperator *op)
static void uv_select_invert(const Scene *scene, BMEditMesh *em)
static float get_uv_edge_needle(const eUVSelectSimilar type, BMEdge *edge, const float ob_m3[3][3], MLoopUV *luv_a, MLoopUV *luv_b, const int cd_loop_uv_offset)
bool uvedit_select_is_any_selected(const Scene *scene, Object *obedit)
void ED_uvedit_select_sync_flush(const ToolSettings *ts, BMEditMesh *em, const bool select)
static int uv_select_more_exec(bContext *C, wmOperator *UNUSED(op))
void uvedit_uv_select_set(const Scene *scene, BMEditMesh *em, BMLoop *l, const bool select, const bool do_history, const int cd_loop_uv_offset)
static const EnumPropertyItem * uv_select_similar_type_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *UNUSED(r_free))
void UV_OT_select_less(wmOperatorType *ot)
void ED_uvedit_active_vert_loop_set(BMesh *bm, BMLoop *l)
static int uv_mouse_select_loop_generic_multi(bContext *C, Object **objects, uint objects_len, const float co[2], const bool extend, enum eUVLoopGenericType loop_type)
void UV_OT_select_box(wmOperatorType *ot)
void WM_main_add_notifier(unsigned int type, void *reference)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
bool WM_gesture_is_modal_first(const wmGesture *gesture)
void WM_gesture_box_cancel(bContext *C, wmOperator *op)
int WM_gesture_box_invoke(bContext *C, wmOperator *op, const wmEvent *event)
int WM_gesture_circle_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void WM_gesture_circle_cancel(bContext *C, wmOperator *op)
int WM_gesture_box_modal(bContext *C, wmOperator *op, const wmEvent *event)
int WM_gesture_circle_modal(bContext *C, wmOperator *op, const wmEvent *event)
int WM_gesture_lasso_modal(bContext *C, wmOperator *op, const wmEvent *event)
void WM_gesture_lasso_cancel(bContext *C, wmOperator *op)
int WM_gesture_lasso_invoke(bContext *C, wmOperator *op, const wmEvent *event)
const int(* WM_gesture_lasso_path_to_array(bContext *UNUSED(C), wmOperator *op, int *r_mcoords_len))[2]
void WM_operator_properties_gesture_box(wmOperatorType *ot)
void WM_operator_properties_select_operation_simple(wmOperatorType *ot)
void WM_operator_properties_gesture_lasso(wmOperatorType *ot)
void WM_operator_properties_gesture_circle(wmOperatorType *ot)
void WM_operator_properties_select_all(wmOperatorType *ot)
void WM_operator_properties_border_to_rctf(struct wmOperator *op, rctf *rect)
void WM_operator_properties_mouse_select(wmOperatorType *ot)
int WM_operator_flag_only_pass_through_on_press(int retval, const struct wmEvent *event)
int WM_menu_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
static bool do_history(const char *name, ReportList *reports)