126 BMLoop *l_select_vert =
nullptr;
127 BMLoop *l_select_edge =
nullptr;
128 BMLoop *l_select_edge_pair =
nullptr;
129 BMLoop *l_select_face =
nullptr;
140 if (select_edge_prev || select_edge_next) {
141 l_select_edge_pair =
l;
143 if (select_edge_prev && select_edge_next) {
144 l_select_edge_pair =
l;
152 return l_select_face;
154 if (l_select_edge_pair) {
155 return l_select_edge_pair;
158 return l_select_edge;
160 return l_select_vert;
165 if (ese && ese->
prev) {
196 BMLoop *l_select_vert =
nullptr;
197 BMLoop *l_select_face =
nullptr;
213 return l_select_face;
215 return l_select_vert;
220 if (ese && ese->
prev) {
277 bm->uv_select_sync_valid =
false;
284 bm->uv_select_sync_valid =
false;
289 if (
bm->uv_select_sync_valid) {
323 return uv_selectmode;
336 const bool strict =
false;
353 if (
bm->uv_select_sync_valid) {
432 const BMLoop *l_iter = l_first;
437 }
while ((l_iter = l_iter->
next) != l_first);
731 const int sticky_flag,
765 const int sticky_flag,
907 if (
bm->uv_select_sync_valid) {
1000 const int sticky_flag,
1007 BMEdge *e_first, *e_iter;
1008 e_first = e_iter =
l->e;
1010 BMLoop *l_radial_iter = e_iter->
l;
1011 if (!l_radial_iter) {
1015 if (l_radial_iter->
v ==
l->v) {
1017 bool do_select =
false;
1030 }
while ((l_radial_iter = l_radial_iter->
radial_next) != e_iter->
l);
1097 BMLoop *l_other =
nullptr;
1099 if (l_iter != l_src) {
1105 if (l_other ==
nullptr) {
1114 }
while ((l_iter = l_iter->
radial_next) != l_src);
1128 l_step = (l_step->
v == v_pivot) ? l_step->
prev : l_step->
next;
1129 BMLoop *l_step_last =
nullptr;
1132 l_step_last = l_step;
1135 l_step = (l_step->
v == v_pivot) ? l_step->
prev : l_step->
next;
1137 }
while (l_step !=
nullptr);
1139 if (l_step_last !=
nullptr) {
1231 hit.
scale[0] = 1.0f;
1232 hit.
scale[1] = 1.0f;
1244 float *luv, *luv_next;
1274 if (dist_test_sq < hit->dist_sq) {
1291 const float penalty,
1295 for (
Object *obedit : objects) {
1329 if (dist_test_sq < hit->dist_sq) {
1355 const bool only_in_face)
1358 for (
Object *obedit : objects) {
1420 dist_test_sq =
square_f(
sqrtf(dist_test_sq) + penalty_dist);
1423 if (dist_test_sq <= hit->dist_sq) {
1424 if (dist_test_sq == hit->
dist_sq) {
1446 const float penalty_dist,
1450 for (
Object *obedit : objects) {
1461 const float scale[2],
1462 const bool ignore_selected,
1469 const float *uv_best =
nullptr;
1470 float dist_best = *dist_sq;
1477 BMLoop *l_iter, *l_first;
1488 if (dist_best > dist_test) {
1489 dist_best = dist_test;
1492 }
while ((l_iter = l_iter->
next) != l_first);
1495 if (uv_best !=
nullptr) {
1497 *dist_sq = dist_best;
1506 const float mval_fl[2],
1507 const bool ignore_selected,
1513 float scale[2], offset[2];
1520 for (
Object *obedit : objects) {
1521 if (
uvedit_nearest_uv(scene, obedit, co, scale, ignore_selected, dist_sq, r_uv)) {
1545 BMLoop *l_found =
nullptr;
1555 if (dist_test_sq < dist_best_sq) {
1556 dist_best_sq = dist_test_sq;
1570 BMLoop *l_found =
nullptr;
1580 if (dist_test_sq < dist_best_sq) {
1581 dist_best_sq = dist_test_sq;
1642 BMLoop *l_radial_iter = e_iter->
l;
1643 if (!l_radial_iter) {
1652 BMLoop *l_other = (l_radial_iter->
v !=
l->v) ? l_radial_iter->
next : l_radial_iter;
1658 }
while ((l_radial_iter = l_radial_iter->
radial_next) != e_iter->
l);
1670 BMLoop *l_radial_iter =
l->radial_next;
1671 if (l_radial_iter ==
l) {
1683 }
while ((l_radial_iter = l_radial_iter->
radial_next) !=
l);
1831 if (
bm.uv_select_sync_valid ==
false) {
1835 if (cd_loop_uv_offset == -1) {
1838 return std::make_unique<UVSyncSelectFromMesh>(
bm, ts.
uv_sticky);
1853 &bm_,
false, uv_pick_params, bm_verts_deselect_, bm_edges_deselect_, bm_faces_deselect_);
1856 &bm_,
true, uv_pick_params, bm_verts_select_, bm_edges_select_, bm_faces_select_);
1863 bm_verts_select_.append(
v);
1867 bm_edges_select_.append(f);
1871 bm_faces_select_.append(f);
1878 bm_verts_deselect_.append(
v);
1882 bm_edges_deselect_.append(f);
1886 bm_faces_deselect_.append(f);
1894 bm_verts_select_.append(
v);
1897 bm_verts_deselect_.append(
v);
1903 bm_edges_select_.append(f);
1906 bm_edges_deselect_.append(f);
1912 bm_faces_select_.append(f);
1915 bm_faces_deselect_.append(f);
1945 bool select_all =
true;
1950 if (!edge_selected) {
1965 bool select_all =
true;
2000 bool select_all =
true;
2024 bool select_all =
true;
2033 if (select_all ==
false) {
2059 if (l_step->
f->
len == 4) {
2061 BMLoop *l_step_over = (v_from == l_step->
v) ? l_step->
next : l_step->
prev;
2063 scene, l_step_over, offsets);
2065 return (l_step_over->
v == v_from_next) ? l_step_over->
prev : l_step_over->
next;
2078 scene, l_step, v_from_next, offsets);
2105 for (
int side = 0; side < 2; side++) {
2106 BMLoop *l_step_pair[2] = {l_init_pair[0], l_init_pair[1]};
2107 BMVert *v_from = side ? l_step_pair[0]->
e->
v1 : l_step_pair[0]->
e->
v2;
2111 while ((l_step_pair[0] !=
nullptr) && (l_step_pair[1] !=
nullptr)) {
2130 scene, l_step_pair[
i], v_from, offsets);
2138 v_from = v_from_next;
2154 int r_count_by_select[2])
2156 if (r_count_by_select) {
2157 r_count_by_select[0] = r_count_by_select[1] = 0;
2162 for (
int side = 0; side < 2; side++) {
2167 while (l_step !=
nullptr) {
2177 if (r_count_by_select !=
nullptr) {
2180 if (r_count_by_select[0] && r_count_by_select[1]) {
2181 r_count_by_select[0] = r_count_by_select[1] = -1;
2189 BMFace *f_step_prev = l_step->
f;
2198 if (f_step_prev == l_step->
f) {
2202 v_from = v_from_next;
2225 BMLoop *l_init_pair[2] = {
2235 if (l_init_pair[1] ==
nullptr) {
2236 int count_by_select[2];
2239 scene,
bm, l_init_pair[0], offsets, boundary_mode, count_by_select);
2240 if (count_by_select[!
select] == 0) {
2245 scene,
bm, l_init_pair[0], offsets, boundary_mode, count_by_select);
2246 if (count_by_select[!
select] == 0) {
2252 if (l_init_pair[1] ==
nullptr) {
2335 for (
int side = 0; side < 2; side++) {
2336 BMLoop *l_step = l_pair[side];
2345 if (l_step->
f->
len == 4) {
2348 scene, l_step_opposite, offsets);
2363 return (
select) ? 1 : -1;
2410 for (
int side = 0; side < 2; side++) {
2411 BMLoop *l_step = l_pair[side];
2419 if (use_face_select) {
2425 else if (use_vertex_select) {
2435 if (l_step->
f->
len == 4) {
2438 scene, l_step_opposite, offsets);
2439 if (l_step ==
nullptr) {
2441 l_step = l_step_opposite;
2465 return (
select) ? 1 : -1;
2480 const bool select_faces,
2495 for (
const int ob_index : objects.
index_range()) {
2496 if (hit && ob_index != 0) {
2499 Object *obedit = hit ? hit->
ob : objects[ob_index];
2505 int i, stacksize = 0, *stack;
2510 if (uv_select_sync) {
2527 if (vmap ==
nullptr) {
2534 if (hit ==
nullptr) {
2540 stack[stacksize] = a;
2548 bool add_to_stack =
true;
2549 if (uv_select_sync) {
2571 add_to_stack =
false;
2579 stack[stacksize] = a;
2592 if (efa == hit->
efa) {
2593 stack[stacksize] = a;
2601 while (stacksize > 0) {
2604 a = stack[stacksize];
2615 for (iterv = vlist; iterv; iterv = iterv->
next) {
2624 for (iterv = startv; iterv; iterv = iterv->
next) {
2625 if ((startv != iterv) && (iterv->
separate)) {
2638 if ((toggle ==
true) && (extend ==
false) && (deselect ==
false)) {
2640 bool found_selected =
false;
2648 found_selected =
true;
2655 found_selected =
true;
2660 if (found_selected) {
2668#define SET_SELECTION(value) \
2669 if (select_faces) { \
2670 if (hflag == BM_ELEM_SELECT) { \
2671 BM_face_select_set(bm, efa, value); \
2674 BM_elem_flag_set(efa, hflag, value); \
2678 uvedit_face_select_set(scene, bm, efa, value); \
2687 const bool needs_multi_pass = uv_select_sync &&
2690 (deselect ==
false);
2691 const bool deselect_elem = !extend && !deselect && !toggle;
2693 if (needs_multi_pass ==
false) {
2696 if (deselect_elem) {
2714 if (deselect_elem) {
2736 if (uv_select_sync) {
2742 if (!select_faces) {
2749 if (
bm->uv_select_sync_valid) {
2770 const bool deselect,
2771 const bool select_faces,
2774 const bool extend =
true;
2775 const bool toggle =
false;
2822 scene, view_layer,
nullptr);
2828 for (
Object *obedit : objects) {
2831 bool changed =
false;
2855 if (is_uv_face_selectmode) {
2865#define NEIGHBORING_FACE_IS_SEL 1
2866#define CURR_FACE_IS_UNSEL 2
2891#undef NEIGHBORING_FACE_IS_SEL
2892#undef CURR_FACE_IS_UNSEL
2935 if (is_uv_face_selectmode) {
2978 ot->name =
"Select More";
2979 ot->description =
"Select more UV vertices connected to initial selection";
2980 ot->idname =
"UV_OT_select_more";
2996 ot->name =
"Select Less";
2997 ot->description =
"Deselect UV vertices at the boundary of each selection region";
2998 ot->idname =
"UV_OT_select_less";
3020 return (
bm->totvertsel ||
bm->totedgesel ||
bm->totfacesel);
3039 for (
Object *obedit : objects) {
3056 bm->uv_select_sync_valid =
false;
3098 bm->uv_select_sync_valid =
false;
3101 if (
bm->uv_select_sync_valid ==
false) {
3145 bool face_select =
true;
3160 face_select =
false;
3196 bool select_all =
true;
3268 const Object *ob_exclude)
3274 for (
Object *obedit : objects) {
3275 if (ob_exclude && (obedit == ob_exclude)) {
3297 scene, view_layer,
nullptr);
3301 for (
Object *obedit : objects) {
3311 ot->name =
"(De)select All";
3312 ot->description =
"Change selection of all UV vertices";
3313 ot->idname =
"UV_OT_select_all";
3340 int selectmode, sticky;
3341 bool found_item =
false;
3348 const float penalty_dist = 3.0f *
U.pixelsize;
3370 if (use_select_linked) {
3418 bool found = found_item;
3419 bool changed =
false;
3421 bool is_selected =
false;
3442 if (hit.
l !=
nullptr) {
3452 if ((found &&
params.select_passthrough) && is_selected) {
3455 else if (found ||
params.deselect_all) {
3458 for (
Object *obedit : objects) {
3476 BMElem *ele_active =
nullptr;
3478 if (use_select_linked) {
3485 scene, objects, &hit, extend, deselect, toggle,
false,
BM_ELEM_SELECT);
3491 bool select_value =
false;
3494 select_value =
true;
3498 select_value =
false;
3502 select_value = !is_selected;
3507 select_value =
true;
3557 flush = select_value ? 1 : -1;
3565 if (
bm->uv_select_sync_valid) {
3596 if (changed && found) {
3602 return changed || found;
3609 scene, view_layer,
nullptr);
3646 ot->name =
"Select";
3647 ot->description =
"Select UV vertices";
3648 ot->idname =
"UV_OT_select";
3670 "Mouse location in normalized coordinates, 0.0 to 1.0 is within the image bounds",
3699 bool found_item =
false;
3748 for (
Object *ob : objects) {
3762 scene, view_layer,
nullptr);
3799 ot->name =
"Loop Select";
3800 ot->description =
"Select a loop of connected UV vertices";
3801 ot->idname =
"UV_OT_select_loop";
3815 "Extend selection rather than clearing the existing selection");
3825 "Mouse location in normalized coordinates, 0.0 to 1.0 is within the image bounds",
3863 ot->name =
"Edge Ring Select";
3864 ot->description =
"Select an edge ring of connected UV vertices";
3865 ot->idname =
"UV_OT_select_edge_ring";
3879 "Extend selection rather than clearing the existing selection");
3889 "Mouse location in normalized coordinates, 0.0 to 1.0 is within the image bounds",
3911 bool deselect =
false;
3924 scene, view_layer,
nullptr);
3944 if (!extend && !deselect) {
3950 pick ? &hit :
nullptr,
3962 for (
Object *obedit : objects) {
3980 ot->name =
"Select Linked";
3981 ot->description =
"Select all UV vertices linked to the active UV map";
3982 ot->idname =
"UV_OT_select_linked";
4013 ot->name =
"Select Linked Pick";
4014 ot->description =
"Select all UV vertices linked under the mouse";
4015 ot->idname =
"UV_OT_select_linked_pick";
4031 "Extend selection rather than clearing the existing selection");
4037 "Deselect linked UV vertices rather than selecting them");
4047 "Mouse location in normalized coordinates, 0.0 to 1.0 is within the image bounds",
4082 "Cannot split selection with \"Sync Select\" and \"Shared Vertex\" selection enabled");
4087 bool changed_multi =
false;
4090 scene, view_layer,
nullptr);
4092 for (
Object *obedit : objects) {
4095 bool changed =
false;
4105 bool is_sel =
false;
4106 bool is_unsel =
false;
4117 if (select_vert || select_edge) {
4120 if (!select_vert || !select_edge) {
4125 if (is_sel && is_unsel) {
4130 if (is_sel && is_unsel) {
4143 changed_multi =
true;
4155 ot->name =
"Select Split";
4156 ot->description =
"Select only entirely selected faces";
4157 ot->idname =
"UV_OT_select_split";
4194 if (
bm->uv_select_sync_valid ==
false) {
4200 if (
bm->uv_select_sync_valid) {
4204 const short selectmode_orig =
bm->selectmode;
4207 bm->selectmode = selectmode_orig;
4241 const BMEdge *e_iter, *e_first;
4242 e_iter = e_first =
v->e;
4244 if (e_iter->
l ==
nullptr) {
4248 BMLoop *l_iter = l_first;
4250 if (!(l_iter->
v ==
v && l_iter !=
l)) {
4259 }
while ((l_iter = l_iter->
radial_next) != l_first);
4270 if (
l->radial_next !=
l) {
4271 BMLoop *l_iter =
l->radial_next;
4315 bool use_sticky =
true;
4404 (
bm->uv_select_sync_valid ==
false);
4423 bool tag_all =
true;
4424 bool tag_any =
false;
4458 bool tag_all =
true;
4459 bool tag_any =
false;
4527 bool use_sticky =
true;
4566 bool select_all =
true;
4635 bool changed_multi =
false;
4638 scene, view_layer,
nullptr);
4640 if (use_pre_deselect) {
4645 for (
Object *obedit : objects) {
4648 bool changed =
false;
4660 if (pinned && offsets.
pin == -1) {
4666 if (use_select_linked) {
4670 if (use_select_linked) {
4679 bool has_selected =
false;
4685 has_selected =
true;
4689 if (has_selected && use_select_linked) {
4701 bool do_second_pass =
true;
4710 bool has_selected =
false;
4715 do_second_pass =
false;
4716 has_selected =
true;
4722 if (has_selected && use_select_linked) {
4729 if (do_second_pass) {
4738 bool has_selected =
false;
4743 has_selected =
true;
4749 if (has_selected && use_select_linked) {
4767 bool has_selected =
false;
4775 has_selected =
true;
4780 if (has_selected && use_select_linked) {
4791 if (changed || use_pre_deselect) {
4792 changed_multi =
true;
4809 ot->name =
"Box Select";
4810 ot->description =
"Select UV vertices using box selection";
4811 ot->idname =
"UV_OT_select_box";
4824 RNA_def_boolean(
ot->srna,
"pinned",
false,
"Pinned",
"Border select pinned UVs only");
4837 const float offset[2],
4838 const float ellipse[2])
4841 const float co[2] = {
4842 (uv[0] - offset[0]) * ellipse[0],
4843 (uv[1] - offset[1]) * ellipse[1],
4849 const float uv_b[2],
4850 const float offset[2],
4851 const float ellipse[2])
4854 const float co_a[2] = {
4855 (uv_a[0] - offset[0]) * ellipse[0],
4856 (uv_a[1] - offset[1]) * ellipse[1],
4858 const float co_b[2] = {
4859 (uv_b[0] - offset[0]) * ellipse[0],
4860 (uv_b[1] - offset[1]) * ellipse[1],
4862 const float co_zero[2] = {0.0f, 0.0f};
4878 int x,
y, radius, width, height;
4880 float offset[2], ellipse[2];
4896 ellipse[0] = width * zoomx / radius;
4897 ellipse[1] = height * zoomy / radius;
4901 bool changed_multi =
false;
4904 scene, view_layer,
nullptr);
4912 if (use_pre_deselect) {
4916 for (
Object *obedit : objects) {
4919 bool changed =
false;
4932 if (use_select_linked) {
4936 if (use_select_linked) {
4948 bool has_selected =
false;
4953 has_selected =
true;
4957 if (has_selected && use_select_linked) {
4978 bool has_selected =
false;
4983 has_selected =
true;
4989 if (has_selected && use_select_linked) {
5005 bool has_selected =
false;
5013 has_selected =
true;
5017 if (has_selected && use_select_linked) {
5028 if (changed || use_pre_deselect) {
5029 changed_multi =
true;
5046 ot->name =
"Circle Select";
5047 ot->description =
"Select UV vertices using circle selection";
5048 ot->idname =
"UV_OT_select_circle";
5073 const rcti *clip_rect,
5075 const float co_test[2])
5079 ®ion->
v2d, co_test[0], co_test[1], &co_screen[0], &co_screen[1]) &&
5089 const rcti *clip_rect,
5091 const float co_test_a[2],
5092 const float co_test_b[2])
5094 int co_screen_a[2], co_screen_b[2];
5096 ®ion->
v2d, co_test_a, co_test_b, co_screen_a, co_screen_b) &&
5125 bool changed_multi =
false;
5131 scene, view_layer,
nullptr);
5133 if (use_pre_deselect) {
5137 for (
Object *obedit : objects) {
5139 bool changed =
false;
5153 if (use_select_linked) {
5157 if (use_select_linked) {
5169 bool has_selected =
false;
5174 has_selected =
true;
5178 if (has_selected && use_select_linked) {
5191 bool do_second_pass =
true;
5197 bool has_selected =
false;
5206 do_second_pass =
false;
5207 has_selected =
true;
5213 if (has_selected && use_select_linked) {
5220 if (do_second_pass) {
5229 bool has_selected =
false;
5234 has_selected =
true;
5240 if (has_selected && use_select_linked) {
5257 bool has_selected =
false;
5265 has_selected =
true;
5269 if (has_selected && use_select_linked) {
5280 if (changed || use_pre_deselect) {
5281 changed_multi =
true;
5292 return changed_multi;
5310 ot->name =
"Lasso Select UV";
5311 ot->description =
"Select UVs using lasso selection";
5312 ot->idname =
"UV_OT_select_lasso";
5352 scene, view_layer,
nullptr);
5354 for (
Object *obedit : objects) {
5362 bool changed =
false;
5402 ot->name =
"Selected Pinned";
5403 ot->description =
"Select all pinned UV vertices";
5404 ot->idname =
"UV_OT_select_pinned";
5453 const float t2[3][2],
5454 const float endpoint_bias)
5500 scene, view_layer,
nullptr);
5502 struct ChangedInfo {
5503 uint has_changed : 1;
5504 uint has_overlap : 1;
5510 uint uv_tri_len = 0;
5521 objects_tag[
i].has_changed =
true;
5530 uv_tri_len += efa->
len - 2;
5540 int face_len_alloc = 3;
5541 float (*uv_verts)[2] =
static_cast<float (*)[2]
>(
5542 MEM_mallocN(
sizeof(*uv_verts) * face_len_alloc,
"UvOverlapCoords"));
5549 for (
const int ob_index : objects.
index_range()) {
5550 Object *obedit = objects[ob_index];
5566 const uint face_len = efa->
len;
5567 const uint tri_len = face_len - 2;
5569 if (face_len_alloc < face_len) {
5572 uv_verts =
static_cast<float (*)[2]
>(
5573 MEM_mallocN(
sizeof(*uv_verts) * face_len,
"UvOverlapCoords"));
5576 face_len_alloc = face_len;
5587 const int coords_sign = 0;
5594 for (
int t = 0; t < tri_len; t++) {
5595 overlap_data[data_index].
ob_index = ob_index;
5596 overlap_data[data_index].
face_index = face_index;
5599 const float tri[3][3] = {
5605 copy_v2_v2(overlap_data[data_index].tri[0], tri[0]);
5606 copy_v2_v2(overlap_data[data_index].tri[1], tri[1]);
5607 copy_v2_v2(overlap_data[data_index].tri[2], tri[2]);
5626 uint tree_overlap_len;
5629 if (overlap !=
nullptr) {
5632 for (
int i = 0;
i < tree_overlap_len;
i++) {
5634 if (overlap[
i].indexA == overlap[
i].indexB) {
5660 const float endpoint_bias = -1e-4f;
5662 objects_tag[o_a->
ob_index].has_overlap =
true;
5663 objects_tag[o_b->
ob_index].has_overlap =
true;
5675 const ChangedInfo &tag_info = objects_tag[
i];
5676 const bool select =
true;
5678 if (tag_info.has_overlap) {
5681 if (uv_select_sync) {
5697 if (tag_info.has_changed || tag_info.has_overlap) {
5718 ot->name =
"Select Overlap";
5719 ot->description =
"Select all UV faces which overlap each other";
5720 ot->idname =
"UV_OT_select_overlap";
5732 "Extend selection rather than clearing the existing selection");
5741 const float ob_m3[3][3],
5786 const float ob_m3[3][3],
5846 const float ob_m3[3][3],
5884 const float ob_m3[3][3],
5922 scene, view_layer,
nullptr);
5924 int max_verts_selected_all = 0;
5925 for (
Object *ob : objects) {
5933 max_verts_selected_all += face->
len;
5939 KDTree_1d *tree_1d = BLI_kdtree_1d_new(max_verts_selected_all);
5941 for (
Object *ob : objects) {
5943 if (
bm->totvertsel == 0) {
5949 copy_m3_m4(ob_m3, ob->object_to_world().ptr());
5964 BLI_kdtree_1d_insert(tree_1d, tree_index++, &needle);
5969 if (tree_1d !=
nullptr) {
5970 BLI_kdtree_1d_deduplicate(tree_1d);
5971 BLI_kdtree_1d_balance(tree_1d);
5974 for (
Object *ob : objects) {
5976 if (
bm->totvertsel == 0) {
5987 bool changed =
false;
5991 copy_m3_m4(ob_m3, ob->object_to_world().ptr());
6015 if (
bm->uv_select_sync_valid) {
6030 BLI_kdtree_1d_free(tree_1d);
6046 scene, view_layer,
nullptr);
6048 int max_edges_selected_all = 0;
6049 for (
Object *ob : objects) {
6057 max_edges_selected_all += face->
len;
6063 KDTree_1d *tree_1d = BLI_kdtree_1d_new(max_edges_selected_all);
6065 for (
Object *ob : objects) {
6067 if (
bm->totvertsel == 0) {
6073 copy_m3_m4(ob_m3, ob->object_to_world().ptr());
6090 BLI_kdtree_1d_insert(tree_1d, tree_index++, &needle);
6096 if (tree_1d !=
nullptr) {
6097 BLI_kdtree_1d_deduplicate(tree_1d);
6098 BLI_kdtree_1d_balance(tree_1d);
6101 for (
Object *ob : objects) {
6103 if (
bm->totvertsel == 0) {
6114 bool changed =
false;
6117 copy_m3_m4(ob_m3, ob->object_to_world().ptr());
6142 if (
bm->uv_select_sync_valid) {
6157 BLI_kdtree_1d_free(tree_1d);
6173 scene, view_layer,
nullptr);
6175 int max_faces_selected_all = 0;
6176 for (
Object *ob : objects) {
6178 max_faces_selected_all +=
bm->totfacesel;
6183 KDTree_1d *tree_1d = BLI_kdtree_1d_new(max_faces_selected_all);
6185 for (
const int ob_index : objects.
index_range()) {
6186 Object *ob = objects[ob_index];
6188 if (
bm->totvertsel == 0) {
6193 copy_m3_m4(ob_m3, ob->object_to_world().ptr());
6209 BLI_kdtree_1d_insert(tree_1d, tree_index++, &needle);
6214 if (tree_1d !=
nullptr) {
6215 BLI_kdtree_1d_deduplicate(tree_1d);
6216 BLI_kdtree_1d_balance(tree_1d);
6219 for (
const int ob_index : objects.
index_range()) {
6220 Object *ob = objects[ob_index];
6222 if (
bm->totvertsel == 0) {
6233 bool changed =
false;
6237 copy_m3_m4(ob_m3, ob->object_to_world().ptr());
6259 if (
bm->uv_select_sync_valid) {
6274 BLI_kdtree_1d_free(tree_1d);
6296 scene, view_layer,
nullptr);
6299 int island_list_len = 0;
6303 for (
const int ob_index : objects.
index_range()) {
6304 Object *obedit = objects[ob_index];
6307 float aspect_y = 1.0f;
6309 scene,
bm, &island_list_ptr[ob_index], face_selected,
false,
false, aspect_y, offsets);
6313 MEM_callocN(
sizeof(*island_array) * island_list_len, __func__));
6316 KDTree_1d *tree_1d = BLI_kdtree_1d_new(island_list_len);
6318 for (
const int ob_index : objects.
index_range()) {
6319 Object *obedit = objects[ob_index];
6323 copy_m3_m4(ob_m3, obedit->object_to_world().ptr());
6327 island_array[index] = island;
6333 BLI_kdtree_1d_insert(tree_1d, tree_index++, &needle);
6338 if (tree_1d !=
nullptr) {
6339 BLI_kdtree_1d_deduplicate(tree_1d);
6340 BLI_kdtree_1d_balance(tree_1d);
6343 int tot_island_index = 0;
6344 for (
const int ob_index : objects.
index_range()) {
6345 Object *obedit = objects[ob_index];
6353 copy_m3_m4(ob_m3, obedit->object_to_world().ptr());
6355 bool changed =
false;
6358 island_array[tot_island_index++] = island;
6367 for (
int j = 0; j < island->faces_len; j++) {
6375 if (
bm->uv_select_sync_valid) {
6390 BLI_assert(tot_island_index == island_list_len);
6391 for (
int i = 0;
i < island_list_len;
i++) {
6398 BLI_kdtree_1d_free(tree_1d);
6418 if (use_select_linked) {
6436 {
UV_SSIM_AREA_3D,
"AREA_3D", 0,
"Area 3D",
"Area of face in 3D space"},
6444 "Face direction defined by (clockwise or anti-clockwise winding (facing up or facing down)"},
6445 {
UV_SSIM_FACE,
"FACE", 0,
"Amount of Faces in Island",
""},
6467 if (use_select_linked) {
6502 ot->name =
"Select Similar";
6503 ot->description =
"Select similar UVs by property types";
6504 ot->idname =
"UV_OT_select_similar";
6520 RNA_def_float(
ot->srna,
"threshold", 0.0f, 0.0f, 1.0f,
"Threshold",
"", 0.0f, 1.0f);
6543 faces[faces_len++] = f;
6544 if (faces_len == len_max) {
6552 *r_faces_len = faces_len;
6553 if (faces_len != len_max) {
6589 edges[edges_len++] = l_iter;
6590 if (edges_len == len_max) {
6601 }
while ((l_radial_iter = l_radial_iter->
radial_next) != l_iter);
6610 *r_edges_len = edges_len;
6611 if (edges_len != len_max) {
6648 verts[verts_len++] = l_iter;
6649 if (verts_len == len_max) {
6668 *r_verts_len = verts_len;
6669 if (verts_len != len_max) {
6753 scene, view_layer,
nullptr);
6754 for (
Object *obedit : objects) {
6776 scene, view_layer,
nullptr);
6777 for (
Object *obedit : objects) {
6795 scene, view_layer,
nullptr);
6796 for (
Object *obedit : objects) {
6847 ot->name =
"UV Select Mode";
6848 ot->description =
"Change UV selection mode";
6849 ot->idname =
"UV_OT_select_mode";
6882 ot->name =
"Set User Region";
6883 ot->description =
"Set the boundaries of the user region";
6884 ot->idname =
"UV_OT_custom_region_set";
SpaceImage * CTX_wm_space_image(const bContext *C)
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
ToolSettings * CTX_data_tool_settings(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
CustomData interface, see also DNA_customdata_types.h.
int CustomData_get_offset(const CustomData *data, eCustomDataType type)
int CustomData_get_active_layer(const CustomData *data, eCustomDataType type)
bool CustomData_has_layer(const CustomData *data, eCustomDataType type)
const char * CustomData_get_active_layer_name(const CustomData *data, eCustomDataType type)
BMEditMesh * BKE_editmesh_from_object(Object *ob)
Return the BMEditMesh for a given object.
blender::Vector< Object * > BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
General operations, lookup, etc. for materials.
void BKE_mesh_batch_cache_dirty_tag(Mesh *mesh, 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)
A min-heap / priority queue ADT.
void BLI_heap_free(Heap *heap, HeapFreeFP ptrfreefp) ATTR_NONNULL(1)
Heap * BLI_heap_new_ex(unsigned int reserve_num) ATTR_WARN_UNUSED_RESULT
void BLI_heap_clear(Heap *heap, HeapFreeFP ptrfreefp) ATTR_NONNULL(1)
BVHTree * BLI_bvhtree_new(int maxsize, float epsilon, char tree_type, char axis)
void BLI_bvhtree_balance(BVHTree *tree)
void BLI_bvhtree_free(BVHTree *tree)
void BLI_bvhtree_insert(BVHTree *tree, int index, const float co[3], int numpoints)
BVHTreeOverlap * BLI_bvhtree_overlap_self(const BVHTree *tree, unsigned int *r_overlap_num, BVHTree_OverlapCallback callback, void *userdata)
A KD-tree for nearest neighbor search.
bool BLI_lasso_is_point_inside(blender::Span< blender::int2 > mcoords, int sx, int sy, int error_value)
void BLI_lasso_boundbox(rcti *rect, blender::Span< blender::int2 > mcoords)
bool BLI_lasso_is_edge_inside(blender::Span< blender::int2 > mcoords, int x0, int y0, int x1, int y1, int error_value)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
MINLINE float square_f(float a)
MINLINE int signum_i(float a)
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 r_vi[2])
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])
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])
MINLINE float len_v2v2(const float v1[2], const float v2[2]) ATTR_WARN_UNUSED_RESULT
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
#define BLI_MEMARENA_STD_BUFSIZE
MemArena * BLI_memarena_new(size_t bufsize, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(2) ATTR_MALLOC
void BLI_memarena_free(MemArena *ma) ATTR_NONNULL(1)
void BLI_memarena_clear(MemArena *ma) ATTR_NONNULL(1)
void BLI_polyfill_calc_arena(const float(*coords)[2], unsigned int coords_num, int coords_sign, unsigned int(*r_tris)[3], struct MemArena *arena)
#define BLI_POLYFILL_ALLOC_NGON_RESERVE
void BLI_polyfill_beautify(const float(*coords)[2], unsigned int coords_num, unsigned int(*tris)[3], struct MemArena *arena, struct Heap *eheap)
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_FUNCTION(x)
#define UNUSED_VARS_NDEBUG(...)
#define BLT_I18NCONTEXT_ID_MESH
void DEG_id_tag_update(ID *id, unsigned int flags)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
Object is a sort of wrapper for general info.
void ED_space_image_get_size(SpaceImage *sima, int *r_width, int *r_height)
void ED_space_image_get_zoom(SpaceImage *sima, const ARegion *region, float *r_zoomx, float *r_zoomy)
void EDBM_flag_disable_all(BMEditMesh *em, char hflag)
bool EDBM_uvselect_clear(BMEditMesh *em)
void EDBM_select_more(BMEditMesh *em, bool use_face_step)
void EDBM_select_swap(BMEditMesh *em)
UvVertMap * BM_uv_vert_map_create(BMesh *bm, bool use_select, bool respect_hide)
void EDBM_selectmode_flush(BMEditMesh *em)
UvMapVert * BM_uv_vert_map_at_index(UvVertMap *vmap, unsigned int v)
void EDBM_flag_enable_all(BMEditMesh *em, char hflag)
void EDBM_select_less(BMEditMesh *em, bool use_face_step)
void BM_uv_vert_map_free(UvVertMap *vmap)
bool ED_operator_uvedit_space_image(bContext *C)
bool ED_operator_uvedit(bContext *C)
eSelectOp ED_select_op_modal(eSelectOp sel_op, bool is_first)
#define SEL_OP_USE_PRE_DESELECT(sel_op)
std::string ED_select_circle_get_name(wmOperatorType *ot, PointerRNA *ptr)
SelectPick_Params ED_select_pick_params_from_operator(PointerRNA *ptr) ATTR_NONNULL(1)
bool ED_select_similar_compare_float_tree(const KDTree_1d *tree, float length, float thresh, eSimilarCmp compare)
std::string ED_select_pick_get_name(wmOperatorType *ot, PointerRNA *ptr)
void uvedit_edge_select_set_noflush(const Scene *scene, BMesh *bm, BMLoop *l, const bool select, const int sticky_flag, const BMUVOffsets &offsets)
void ED_uvedit_selectmode_clean(const Scene *scene, Object *obedit)
UV Select Mode set.
bool uvedit_edge_select_test(const Scene *scene, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
void ED_uvedit_selectmode_clean_multi(bContext *C)
bool uvedit_loop_vert_select_get(const ToolSettings *ts, const BMesh *bm, const BMLoop *l)
void ED_uvedit_sticky_selectmode_update(bContext *C)
void ED_uvedit_active_edge_loop_set(BMesh *bm, BMLoop *l)
bool ED_uvedit_sync_uvselect_ignore(const ToolSettings *ts)
void uvedit_select_flush_from_verts(const Scene *scene, BMesh *bm, bool select)
void uvedit_face_select_set_with_sticky(const Scene *scene, BMesh *bm, BMFace *efa, bool select, const BMUVOffsets &offsets)
BMLoop ** ED_uvedit_selected_edges(const Scene *scene, BMesh *bm, int len_max, int *r_edges_len)
char ED_uvedit_select_mode_get(const Scene *scene)
void ED_uvedit_selectmode_flush(const Scene *scene, BMesh *bm)
UV Select Mode Flush.
bool uvedit_edge_select_test_ex(const ToolSettings *ts, 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)
void uvedit_edge_select_set_with_sticky(const Scene *scene, BMesh *bm, BMLoop *l, bool select, const BMUVOffsets &offsets)
void uvedit_loop_vert_select_set(const ToolSettings *ts, const BMesh *bm, BMLoop *l, const bool select)
void uvedit_uv_select_set_with_sticky(const Scene *scene, BMesh *bm, BMLoop *l, bool select, const BMUVOffsets &offsets)
bool uvedit_face_select_test_ex(const ToolSettings *ts, const BMesh *bm, const BMFace *efa)
void uvedit_uv_select_set(const Scene *scene, BMesh *bm, BMLoop *l, bool select)
Select UV Vertex.
bool ED_uvedit_select_island_check(const ToolSettings *ts)
bool uvedit_loop_edge_select_get(const ToolSettings *ts, const BMesh *bm, const BMLoop *l)
void uvedit_uv_select_enable(const Scene *scene, BMesh *bm, BMLoop *l)
bool ED_uvedit_sync_uvselect_is_valid_or_ignore(const ToolSettings *ts, const BMesh *bm)
void ED_uvedit_select_sync_multi(bContext *C)
void ED_uvedit_select_sync_flush(const ToolSettings *ts, BMesh *bm, bool select)
int bm_mesh_calc_uv_islands(const Scene *scene, BMesh *bm, ListBase *island_list, const bool only_selected_faces, const bool only_selected_uvs, const bool use_seams, const float aspect_y, const BMUVOffsets &offsets)
void uvedit_loop_edge_select_set(const ToolSettings *ts, const BMesh *bm, BMLoop *l, const bool select)
bool uvedit_face_visible_test(const Scene *scene, const BMFace *efa)
void uvedit_edge_select_set(const Scene *scene, BMesh *bm, BMLoop *l, bool select)
Select UV Edge.
void ED_uvedit_deselect_all(const Scene *scene, Object *obedit, int action)
void uvedit_face_select_set(const Scene *scene, BMesh *bm, BMFace *efa, bool select)
Select UV Face.
BMFace ** ED_uvedit_selected_faces(const Scene *scene, BMesh *bm, int len_max, int *r_faces_len)
bool uvedit_face_select_test(const Scene *scene, const BMesh *bm, const BMFace *efa)
bool uvedit_face_visible_test_ex(const ToolSettings *ts, const BMFace *efa)
BMLoop ** ED_uvedit_selected_verts(const Scene *scene, BMesh *bm, int len_max, int *r_verts_len)
void ED_uvedit_active_vert_loop_set(BMesh *bm, BMLoop *l)
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
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()
bool UI_view2d_view_to_region_clip(const View2D *v2d, float x, float y, int *r_region_x, int *r_region_y) ATTR_NONNULL()
void UI_view2d_view_to_region_fl(const View2D *v2d, float x, float y, float *r_region_x, float *r_region_y) ATTR_NONNULL()
float UI_view2d_scale_get_y(const View2D *v2d)
void UI_view2d_scale_get(const View2D *v2d, float *r_x, float *r_y)
void UI_view2d_region_to_view(const View2D *v2d, float x, float y, float *r_view_x, float *r_view_y) ATTR_NONNULL()
void UI_view2d_region_to_view_rctf(const View2D *v2d, const rctf *rect_src, rctf *rect_dst) ATTR_NONNULL()
float UI_view2d_scale_get_x(const View2D *v2d)
@ OPTYPE_DEPENDS_ON_CURSOR
#define BM_ELEM_CD_GET_BOOL(ele, offset)
#define BM_DISK_EDGE_NEXT(e, v)
#define BM_ELEM_SELECT_UV_EDGE
#define BM_FACE_FIRST_LOOP(p)
#define BM_ELEM_CD_GET_FLOAT_P(ele, offset)
#define BM_elem_index_get(ele)
#define BM_elem_flag_disable(ele, hflag)
#define BM_elem_flag_set(ele, hflag, val)
#define BM_elem_flag_test(ele, hflag)
#define BM_elem_flag_test_bool(ele, hflag)
#define BM_elem_flag_enable(ele, hflag)
bool BM_uv_map_attr_pin_exists(const BMesh *bm, const StringRef uv_map_name)
#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)
void BM_select_history_clear(BMesh *bm)
void BM_mesh_select_mode_flush(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)
void BM_mesh_select_flush_from_verts(BMesh *bm, const bool select)
#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)
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])
float BM_face_calc_area_uv_signed(const BMFace *f, int cd_loop_uv_offset)
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
BMUVOffsets BM_uv_map_offsets_get(const BMesh *bm)
bool BM_loop_uv_share_edge_check(const BMLoop *l_a, const BMLoop *l_b, const int cd_loop_uv_offset)
bool BM_loop_uv_share_vert_check(const BMLoop *l_a, const 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)
bool BM_loop_edge_uvselect_check_other_face(BMLoop *l, const char hflag, const int cd_loop_uv_offset)
void BM_mesh_uvselect_flush_from_faces_only_select(BMesh *bm)
void BM_mesh_uvselect_sync_from_mesh_sticky_vert(BMesh *bm)
void BM_mesh_uvselect_mode_flush(BMesh *bm)
void BM_face_uvselect_set_noflush(BMesh *bm, BMFace *f, bool select)
void BM_face_uvselect_set(BMesh *bm, BMFace *f, bool select)
void BM_mesh_uvselect_mode_flush_update(BMesh *bm, const short selectmode_old, const short selectmode_new, const int cd_loop_uv_offset)
void BM_mesh_uvselect_sync_from_mesh_sticky_disabled(BMesh *bm)
void BM_mesh_uvselect_sync_to_mesh(BMesh *bm)
void BM_mesh_uvselect_flush_shared_only_select(BMesh *bm, const int cd_loop_uv_offset)
bool BM_loop_edge_uvselect_test(const BMLoop *l)
void BM_loop_edge_uvselect_set_noflush(BMesh *bm, BMLoop *l, bool select)
void BM_mesh_uvselect_flush_from_faces_only_deselect(BMesh *bm)
void BM_mesh_uvselect_flush_from_loop_verts_only_select(BMesh *bm)
bool BM_mesh_uvselect_clear(BMesh *bm)
void BM_mesh_uvselect_flush_from_loop_verts_only_deselect(BMesh *bm)
void BM_loop_edge_uvselect_set(BMesh *bm, BMLoop *l, bool select)
void BM_mesh_uvselect_sync_from_mesh_sticky_location(BMesh *bm, const int cd_loop_uv_offset)
void BM_mesh_uvselect_flush_from_loop_edges(BMesh *bm, bool flush_down)
void BM_mesh_uvselect_set_elem_from_mesh(BMesh *bm, const bool select, const BMUVSelectPickParams ¶ms, const blender::VectorList< BMVert * > &verts, const blender::VectorList< BMEdge * > &edges, const blender::VectorList< BMFace * > &faces)
void BM_loop_vert_uvselect_set_noflush(BMesh *bm, BMLoop *l, bool select)
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)
bool BM_loop_vert_uvselect_check_other_face(BMLoop *l, const char hflag, const int cd_loop_uv_offset)
BPy_StructRNA * depsgraph
constexpr IndexRange index_range() const
IndexRange index_range() const
void vert_select_set(BMVert *v, bool value)
void face_select_disable(BMFace *f)
void vert_select_enable(BMVert *v)
void vert_select_disable(BMVert *v)
void face_select_set(BMFace *f, bool value)
void edge_select_enable(BMEdge *f)
void face_select_enable(BMFace *f)
void edge_select_set(BMEdge *f, bool value)
void edge_select_disable(BMEdge *f)
static std::unique_ptr< UVSyncSelectFromMesh > create_if_needed(const ToolSettings &ts, BMesh &bm)
static const EnumPropertyItem prop_similar_compare_types[]
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)
VecBase< int32_t, 2 > int2
float RNA_property_float_get(PointerRNA *ptr, PropertyRNA *prop)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
bool RNA_property_is_set(PointerRNA *ptr, PropertyRNA *prop)
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, const float default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_float_vector(StructOrFunctionRNA *cont_, const char *identifier, const int len, const float *default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
void RNA_enum_item_end(EnumPropertyItem **items, int *totitem)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_translation_context(PropertyRNA *prop, const char *context)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_enum_funcs(PropertyRNA *prop, EnumPropertyItemFunc itemfunc)
void RNA_enum_items_add_value(EnumPropertyItem **items, int *totitem, const EnumPropertyItem *item, int value)
const EnumPropertyItem rna_enum_mesh_select_mode_uv_items[]
struct BMEditSelection * prev
struct BMLoop * radial_next
bool uv_select_sync_valid
struct ToolSettings * toolsettings
struct ReportList * reports
bool uv_find_nearest_vert_multi(Scene *scene, blender::Span< Object * > objects, const float co[2], float penalty_dist, UvNearestHit *hit)
void UV_OT_select_all(wmOperatorType *ot)
void UV_OT_select_edge_ring(wmOperatorType *ot)
void uvedit_face_select_set_no_sync(const ToolSettings *ts, const BMesh *bm, BMFace *f, bool select)
bool uvedit_vert_select_get_no_sync(const ToolSettings *ts, const BMesh *bm, const BMLoop *l)
void UV_OT_select(wmOperatorType *ot)
void uvedit_select_prepare_sync_select(const Scene *scene, BMesh *bm)
bool uv_find_nearest_face_multi(Scene *scene, blender::Span< Object * > objects, const float co[2], UvNearestHit *hit)
void UV_OT_select_split(wmOperatorType *ot)
void UV_OT_select_linked(wmOperatorType *ot)
bool uvedit_select_is_any_selected_multi(const Scene *scene, blender::Span< Object * > objects)
const float * uvedit_first_selected_uv_from_vertex(Scene *scene, const BMesh *bm, BMVert *eve, const BMUVOffsets &offsets)
bool uvedit_vert_is_face_select_any_other(const ToolSettings *ts, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
void UV_OT_select_circle(wmOperatorType *ot)
UvNearestHit uv_nearest_hit_init_max_default()
void UV_OT_select_mode(wmOperatorType *ot)
UvNearestHit uv_nearest_hit_init_max(const View2D *v2d)
void UV_OT_select_similar(wmOperatorType *ot)
bool uvedit_edge_is_face_select_any_other(const ToolSettings *ts, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
void UV_OT_select_linked_pick(wmOperatorType *ot)
void UV_OT_custom_region_set(wmOperatorType *ot)
void UV_OT_select_more(wmOperatorType *ot)
void UV_OT_select_pinned(wmOperatorType *ot)
void UV_OT_select_loop(wmOperatorType *ot)
UvNearestHit uv_nearest_hit_init_dist_px(const View2D *v2d, float dist_px)
bool uvedit_vert_is_all_other_faces_selected(const ToolSettings *ts, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
void uvedit_edge_select_set_no_sync(const ToolSettings *ts, const BMesh *bm, BMLoop *l, bool select)
void UV_OT_select_overlap(wmOperatorType *ot)
bool uvedit_edge_select_get_no_sync(const ToolSettings *ts, const BMesh *bm, const BMLoop *l)
void UV_OT_select_lasso(wmOperatorType *ot)
bool uvedit_select_is_any_selected(const Scene *scene, BMesh *bm)
void uvedit_select_prepare_custom_data(const Scene *scene, BMesh *bm)
bool uv_find_nearest_edge_multi(Scene *scene, blender::Span< Object * > objects, const float co[2], float penalty, UvNearestHit *hit)
void uvedit_vert_select_set_no_sync(const ToolSettings *ts, const BMesh *bm, BMLoop *l, bool select)
void UV_OT_select_less(wmOperatorType *ot)
void UV_OT_select_box(wmOperatorType *ot)
bool uv_find_nearest_face_multi_ex(Scene *scene, blender::Span< Object * > objects, const float co[2], UvNearestHit *hit, bool only_in_face)
static float get_uv_island_needle(const eUVSelectSimilar type, const FaceIsland *island, const float ob_m3[3][3], const BMUVOffsets &offsets)
static bool uv_mouse_select(bContext *C, const float co[2], const SelectPick_Params ¶ms)
void uvedit_edge_select_set_noflush(const Scene *scene, BMesh *bm, BMLoop *l, const bool select, const int sticky_flag, const BMUVOffsets &offsets)
void uvedit_face_select_set(const Scene *scene, BMesh *bm, BMFace *efa, const bool select)
Select UV Face.
static bool uv_circle_select_is_point_inside(const float uv[2], const float offset[2], const float ellipse[2])
static float get_uv_edge_needle(const eUVSelectSimilar type, BMEdge *edge, const float ob_m3[3][3], BMLoop *loop_a, BMLoop *loop_b, const BMUVOffsets &offsets)
BMLoop * ED_uvedit_active_vert_loop_get(const ToolSettings *ts, BMesh *bm)
bool uvedit_vert_is_edge_select_any_other(const ToolSettings *ts, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
bool uvedit_edge_select_test(const Scene *scene, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
#define SET_SELECTION(value)
static wmOperatorStatus uv_select_overlap_exec(bContext *C, wmOperator *op)
void uvedit_uv_select_set_with_sticky(const Scene *scene, BMesh *bm, BMLoop *l, const bool select, const BMUVOffsets &offsets)
bool uvedit_loop_vert_select_get(const ToolSettings *ts, const BMesh *bm, const BMLoop *l)
static void uv_select_tag_update_for_object(Depsgraph *depsgraph, const ToolSettings *ts, Object *obedit)
void uvedit_face_select_set_no_sync(const ToolSettings *ts, const BMesh *bm, BMFace *f, bool select)
bool uvedit_vert_select_get_no_sync(const ToolSettings *ts, const BMesh *bm, const BMLoop *l)
static wmOperatorStatus uv_select_linked_internal(bContext *C, wmOperator *op, const wmEvent *event, bool pick)
void uvedit_edge_select_set(const Scene *scene, BMesh *bm, BMLoop *l, const bool select)
Select UV Edge.
void uvedit_face_select_set_with_sticky(const Scene *scene, BMesh *bm, BMFace *efa, const bool select, const BMUVOffsets &offsets)
void uvedit_uv_select_shared_vert(const Scene *scene, BMesh *bm, BMLoop *l, const bool select, const int sticky_flag, const BMUVOffsets &offsets)
static void bm_loop_tags_clear(BMesh *bm)
void ED_uvedit_active_edge_loop_set(BMesh *bm, BMLoop *l)
void uvedit_select_prepare_sync_select(const Scene *scene, BMesh *bm)
static wmOperatorStatus uv_select_more_less(bContext *C, const bool select)
static bool uv_nearest_between(const BMLoop *l, const float co[2], const int cd_loop_uv_offset)
bool ED_uvedit_sync_uvselect_ignore(const ToolSettings *ts)
static int uv_select_edgeloop(Scene *scene, Object *obedit, UvNearestHit *hit, const bool extend)
static BMLoop * bm_select_edgeloop_single_side_next(const Scene *scene, BMLoop *l_step, BMVert *v_from, const BMUVOffsets &offsets)
static EnumPropertyItem uv_select_similar_type_items[]
@ UV_EDGE_LOOP_BOUNDARY_ALL
@ UV_EDGE_LOOP_BOUNDARY_LOOP
bool uv_find_nearest_face_multi_ex(Scene *scene, const Span< Object * > objects, const float co[2], UvNearestHit *hit, const bool only_in_face)
bool uvedit_vert_is_face_select_any_other(const ToolSettings *ts, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
static bool bm_loop_select_edge_check_internal(const Scene *scene, BMesh *bm, BMLoop *l)
static void uvedit_edge_select_flush_from_tag_sticky_loc_internal(const Scene *scene, BMesh *bm, BMLoop *l, const bool select, const BMUVOffsets &offsets)
BLI_INLINE bool overlap_cmp(const void *a_v, const void *b_v)
void uvedit_select_prepare_UNUSED(const Scene *scene, BMesh *bm)
static wmOperatorStatus uv_custom_region_set_exec(bContext *C, wmOperator *op)
static wmOperatorStatus uv_select_more_exec(bContext *C, wmOperator *)
void uvedit_uv_select_disable(const Scene *scene, BMesh *bm, BMLoop *l)
char ED_uvedit_select_mode_get(const Scene *scene)
static bool uv_island_selected(const Scene *scene, const BMesh *bm, FaceIsland *island)
bool uv_find_nearest_edge(Scene *scene, Object *obedit, const float co[2], const float penalty, UvNearestHit *hit)
bool uvedit_edge_select_test_ex(const ToolSettings *ts, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
void ED_uvedit_sync_uvselect_ensure_if_needed(const ToolSettings *ts, BMesh *bm)
#define NEIGHBORING_FACE_IS_SEL
bool uvedit_uv_select_test(const Scene *scene, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
static wmOperatorStatus uv_mouse_select_loop_generic_multi(bContext *C, const Span< Object * > objects, const float co[2], const bool extend, enum eUVLoopGenericType loop_type)
static wmOperatorStatus uv_select_linked_pick_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static BMLoop * bm_select_edgeloop_double_side_next(const Scene *scene, BMLoop *l_step, BMVert *v_from, const BMUVOffsets &offsets)
UvNearestHit uv_nearest_hit_init_max_default()
void uvedit_edge_select_set_with_sticky(const Scene *scene, BMesh *bm, BMLoop *l, const bool select, const BMUVOffsets &offsets)
bool uv_find_nearest_vert(Scene *scene, Object *obedit, float const co[2], const float penalty_dist, UvNearestHit *hit)
void uvedit_loop_vert_select_set(const ToolSettings *ts, const BMesh *bm, BMLoop *l, const bool select)
UvNearestHit uv_nearest_hit_init_max(const View2D *v2d)
static wmOperatorStatus uv_circle_select_exec(bContext *C, wmOperator *op)
bool uvedit_face_select_get_no_sync(const ToolSettings *ts, const BMesh *bm, const BMFace *f)
static void uv_select_flush_from_tag_loop(const Scene *scene, Object *obedit, const bool select)
static wmOperatorStatus uv_select_pinned_exec(bContext *C, wmOperator *op)
bool uvedit_edge_is_face_select_any_other(const ToolSettings *ts, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
static wmOperatorStatus uv_select_similar_island_exec(bContext *C, wmOperator *op)
void ED_uvedit_select_sync_flush(const ToolSettings *ts, BMesh *bm, const bool select)
void uvedit_edge_select_enable(const Scene *scene, BMesh *bm, BMLoop *l)
static wmOperatorStatus uv_select_exec(bContext *C, wmOperator *op)
void uvedit_edge_select_disable(const Scene *scene, BMesh *bm, BMLoop *l)
BMLoop * uv_find_nearest_loop_from_edge(Scene *scene, Object *obedit, BMEdge *e, const float co[2])
static bool uvedit_select_pin_ok_or_report(const Scene *scene, ReportList *reports)
void uvedit_face_select_enable(const Scene *scene, BMesh *bm, BMFace *efa)
static wmOperatorStatus uv_select_loop_invoke(bContext *C, wmOperator *op, const wmEvent *event)
bool uvedit_face_select_test_ex(const ToolSettings *ts, const BMesh *bm, const BMFace *efa)
static wmOperatorStatus uv_select_mode_exec(bContext *C, wmOperator *op)
static void uv_select_flush_from_tag_face(const Scene *scene, Object *obedit, const bool select)
bool uv_find_nearest_face_multi(Scene *scene, const Span< Object * > objects, const float co[2], UvNearestHit *hit)
bool ED_uvedit_select_island_check(const ToolSettings *ts)
static int uv_select_edgering(Scene *scene, Object *obedit, UvNearestHit *hit, const bool extend)
static wmOperatorStatus uv_box_select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static const EnumPropertyItem * uv_select_similar_type_itemf(bContext *C, PointerRNA *, PropertyRNA *, bool *r_free)
static void uv_select_edgeloop_double_side_tag(const Scene *scene, BMesh *bm, BMLoop *l_init_pair[2], const BMUVOffsets &offsets)
static wmOperatorStatus uv_select_split_exec(bContext *C, wmOperator *op)
bool uvedit_loop_edge_select_get(const ToolSettings *ts, const BMesh *bm, const BMLoop *l)
static bool do_lasso_select_mesh_uv(bContext *C, const Span< int2 > mcoords, const eSelectOp sel_op)
static void uvedit_uv_select_flush_from_tag_sticky_loc_internal(const Scene *scene, BMesh *bm, BMLoop *l, const bool select, const BMUVOffsets &offsets)
static void uv_select_all_perform_multi_ex(const Scene *scene, Span< Object * > objects, int action, const Object *ob_exclude)
BLI_INLINE uint overlap_hash(const void *overlap_v)
void uvedit_uv_select_enable(const Scene *scene, BMesh *bm, BMLoop *l)
bool ED_uvedit_sync_uvselect_is_valid_or_ignore(const ToolSettings *ts, const BMesh *bm)
static wmOperatorStatus uv_select_similar_edge_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])
static wmOperatorStatus uv_mouse_select_loop_generic(bContext *C, const float co[2], const bool extend, enum eUVLoopGenericType loop_type)
bool uv_find_nearest_face(Scene *scene, Object *obedit, const float co[2], UvNearestHit *hit)
static float get_uv_vert_needle(const eUVSelectSimilar type, BMVert *vert, const float ob_m3[3][3], BMLoop *loop, const BMUVOffsets &offsets)
static wmOperatorStatus uv_select_similar_face_exec(bContext *C, wmOperator *op)
static void uv_select_linked_multi_for_select_island(const Scene *scene, const Span< Object * > objects, Object *obedit, BMFace *efa, const bool deselect, const bool select_faces, const char hflag)
static wmOperatorStatus uv_box_select_exec(bContext *C, wmOperator *op)
bool uv_find_nearest_vert_multi(Scene *scene, const Span< Object * > objects, float const co[2], const float penalty_dist, UvNearestHit *hit)
static wmOperatorStatus uv_select_edge_ring_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static bool overlap_tri_tri_uv_test(const float t1[3][2], const float t2[3][2], const float endpoint_bias)
void uvedit_uv_select_set(const Scene *scene, BMesh *bm, BMLoop *l, const bool select)
Select UV Vertex.
#define CURR_FACE_IS_UNSEL
static bool do_lasso_select_mesh_uv_is_edge_inside(const ARegion *region, const rcti *clip_rect, const Span< int2 > mcoords, const float co_test_a[2], const float co_test_b[2])
bool uv_find_nearest_edge_multi(Scene *scene, const Span< Object * > objects, const float co[2], const float penalty, UvNearestHit *hit)
bool uvedit_vert_is_all_other_faces_selected(const ToolSettings *ts, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
void uvedit_loop_edge_select_set(const ToolSettings *ts, const BMesh *bm, BMLoop *l, const bool select)
static wmOperatorStatus uv_lasso_select_exec(bContext *C, wmOperator *op)
void uvedit_edge_select_set_no_sync(const ToolSettings *ts, const BMesh *bm, BMLoop *l, bool select)
static wmOperatorStatus uv_select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void uv_select_all(const Scene *scene, BMEditMesh *em, bool select_all)
static wmOperatorStatus uv_select_linked_pick_exec(bContext *C, wmOperator *op)
static void bm_clear_uv_vert_selection(const Scene *scene, BMesh *bm)
bool uvedit_face_visible_test(const Scene *scene, const BMFace *efa)
BMLoop * uv_find_nearest_loop_from_vert(Scene *scene, Object *obedit, BMVert *v, const float co[2])
bool uvedit_uv_select_test_ex(const ToolSettings *ts, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
static bool uv_circle_select_is_edge_inside(const float uv_a[2], const float uv_b[2], const float offset[2], const float ellipse[2])
static wmOperatorStatus uv_select_mode_invoke(bContext *C, wmOperator *op, const wmEvent *)
void uvedit_edge_select_shared_vert(const Scene *scene, BMesh *bm, BMLoop *l, const bool select, const int sticky_flag, const BMUVOffsets &offsets)
bool uv_find_nearest_face_ex(Scene *scene, Object *obedit, const float co[2], UvNearestHit *hit, const bool only_in_face)
static BMLoop * uvedit_loop_find_other_radial_loop_with_visible_face(const Scene *scene, BMLoop *l_src, const BMUVOffsets &offsets)
bool uvedit_edge_select_get_no_sync(const ToolSettings *ts, const BMesh *bm, const BMLoop *l)
void uvedit_face_select_shared_vert(const Scene *scene, BMesh *bm, BMFace *efa, const bool select, const BMUVOffsets &offsets)
static void uv_select_sync_update(const Scene *scene, Object *obedit)
BMLoop * ED_uvedit_active_edge_loop_get(const ToolSettings *ts, BMesh *bm)
static bool uv_mouse_select_multi(bContext *C, const Span< Object * > objects, const float co[2], const SelectPick_Params ¶ms)
static bool do_lasso_select_mesh_uv_is_point_inside(const ARegion *region, const rcti *clip_rect, const Span< int2 > mcoords, const float co_test[2])
static BMLoop * uvedit_loop_find_other_boundary_loop_with_visible_face(const Scene *scene, BMLoop *l_edge, BMVert *v_pivot, const BMUVOffsets &offsets)
static void uv_select_edgeloop_single_side_tag(const Scene *scene, BMesh *bm, BMLoop *l_init, const BMUVOffsets &offsets, enum eUVEdgeLoopBoundaryMode boundary_mode, int r_count_by_select[2])
static int uv_select_faceloop(Scene *scene, Object *obedit, UvNearestHit *hit, const bool extend)
static void uvedit_vertex_select_tagged(BMesh *bm, const Scene *scene, bool select)
void uvedit_select_prepare_custom_data(const Scene *scene, BMesh *bm)
static void uv_select_linked_multi(const Scene *scene, const Span< Object * > objects, UvNearestHit *hit, const bool extend, bool deselect, const bool toggle, const bool select_faces, const char hflag)
static wmOperatorStatus uv_select_edge_ring_exec(bContext *C, wmOperator *op)
UvNearestHit uv_nearest_hit_init_dist_px(const View2D *v2d, const float dist_px)
static wmOperatorStatus uv_select_all_exec(bContext *C, wmOperator *op)
void uvedit_face_select_disable(const Scene *scene, BMesh *bm, BMFace *efa)
static wmOperatorStatus uv_select_less_exec(bContext *C, wmOperator *)
static void uv_select_flush_from_loop_edge_flag(const Scene *scene, BMesh *bm)
void uvedit_vert_select_set_no_sync(const ToolSettings *ts, const BMesh *bm, BMLoop *l, bool select)
static wmOperatorStatus uv_select_similar_vert_exec(bContext *C, wmOperator *op)
bool uvedit_face_select_test(const Scene *scene, const BMesh *bm, const BMFace *efa)
static void uvedit_sync_uvselect_flush_from_v3d(const ToolSettings *ts, BMesh *bm)
bool uvedit_face_visible_test_ex(const ToolSettings *ts, const BMFace *efa)
static bool UNUSED_FUNCTION bm_loop_select_vert_check_internal(const Scene *scene, BMesh *bm, BMLoop *l)
static void uv_select_invert(const Scene *scene, BMEditMesh *em)
bool ED_uvedit_nearest_uv_multi(const View2D *v2d, const Scene *scene, const Span< Object * > objects, const float mval_fl[2], const bool ignore_selected, float *dist_sq, float r_uv[2])
static wmOperatorStatus uv_select_similar_exec(bContext *C, wmOperator *op)
static wmOperatorStatus uv_select_linked_exec(bContext *C, wmOperator *op)
static float get_uv_face_needle(const eUVSelectSimilar type, BMFace *face, int ob_index, const float ob_m3[3][3], const BMUVOffsets &offsets)
static void uv_select_all_perform_multi(const Scene *scene, Span< Object * > objects, int action)
static wmOperatorStatus uv_select_loop_exec(bContext *C, wmOperator *op)
void ED_uvedit_active_vert_loop_set(BMesh *bm, BMLoop *l)
static void uv_select_toggle_all(const Scene *scene, BMEditMesh *em)
static wmOperatorStatus uv_select_overlap(bContext *C, const bool extend)
void WM_main_add_notifier(uint 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)
wmOperatorStatus WM_gesture_circle_invoke(bContext *C, wmOperator *op, const wmEvent *event)
Array< int2 > WM_gesture_lasso_path_to_array(bContext *, wmOperator *op)
wmOperatorStatus WM_gesture_lasso_modal(bContext *C, wmOperator *op, const wmEvent *event)
wmOperatorStatus WM_gesture_box_modal(bContext *C, wmOperator *op, const wmEvent *event)
wmOperatorStatus WM_gesture_box_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void WM_gesture_circle_cancel(bContext *C, wmOperator *op)
void WM_gesture_lasso_cancel(bContext *C, wmOperator *op)
wmOperatorStatus WM_gesture_circle_modal(bContext *C, wmOperator *op, const wmEvent *event)
wmOperatorStatus WM_gesture_lasso_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void WM_operator_properties_gesture_box(wmOperatorType *ot)
void WM_operator_properties_select_operation_simple(wmOperatorType *ot)
void WM_operator_properties_border_to_rctf(wmOperator *op, rctf *r_rect)
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_mouse_select(wmOperatorType *ot)
wmOperatorStatus WM_operator_flag_only_pass_through_on_press(wmOperatorStatus retval, const wmEvent *event)
wmOperatorStatus WM_menu_invoke(bContext *C, wmOperator *op, const wmEvent *)