112 {0,
nullptr, 0,
nullptr,
nullptr},
116 const int value_test,
117 const int value_reference)
121 return (value_test < value_reference);
123 return (value_test == value_reference);
125 return (value_test > value_reference);
127 return (value_test != value_reference);
153 *r_totmirr = *r_totfail = 0;
241 *r_totmirr = totmirr;
242 *r_totfail = totfail;
248 int selectmode = em->selectmode;
249 bool changed =
false;
251 if (
bm->totfacesel == 0) {
254 if (
bm->totedgesel == 0) {
257 if (
bm->totvertsel == 0) {
261 if (selectmode == 0) {
265 char symmetry_htype = 0;
275 if (std::optional<EditMeshSymmetryHelper> symmetry_helper =
290 const int totfacesel_prev =
bm->totfacesel;
291 for (
BMFace *f_orig : source_faces) {
292 symmetry_helper->set_hflag_on_mirror_faces(f_orig, hflag,
true);
294 if (
bm->totfacesel != totfacesel_prev) {
307 const int totedgesel_prev =
bm->totedgesel;
308 for (
BMEdge *e_orig : source_edges) {
309 symmetry_helper->set_hflag_on_mirror_edges(e_orig, hflag,
true);
311 if (
bm->totedgesel != totedgesel_prev) {
324 const int totvertsel_prev =
bm->totvertsel;
325 for (
BMVert *v_orig : source_verts) {
326 symmetry_helper->set_hflag_on_mirror_verts(v_orig, hflag,
true);
328 if (
bm->totvertsel != totvertsel_prev) {
355 Object *obedit = bases[r_base_index]->object;
387#define FIND_NEAR_SELECT_BIAS 5
388#define FIND_NEAR_CYCLE_THRESHOLD_MIN 3
409 const float screen_co[2],
413 float dist_test, dist_test_bias;
421 if (dist_test_bias < data->hit.dist_bias) {
422 data->hit.dist_bias = dist_test_bias;
423 data->hit.dist = dist_test;
424 data->hit.index = index;
425 data->hit.vert = eve;
428 if (
data->use_cycle) {
429 if ((
data->hit_cycle.vert ==
nullptr) && (index >
data->cycle_index_prev) &&
432 data->hit_cycle.dist_bias = dist_test_bias;
433 data->hit_cycle.dist = dist_test;
434 data->hit_cycle.index = index;
435 data->hit_cycle.vert = eve;
441 float *dist_px_manhattan_p,
442 const bool use_select_bias,
471 if (dist_px_manhattan_test < *dist_px_manhattan_p) {
473 *r_base_index = base_index;
475 *dist_px_manhattan_p = dist_px_manhattan_test;
487 BMesh *prev_select_bm =
nullptr;
497 data.use_select_bias = use_select_bias;
498 data.use_cycle = use_cycle;
500 for (; base_index < bases.
size(); base_index++) {
501 Base *base_iter = bases[base_index];
503 if (use_cycle && prev_select.bm == vc->
em->
bm &&
506 data.cycle_index_prev = prev_select.index;
511 data.cycle_index_prev = 0;
514 data.hit.dist =
data.hit_cycle.dist =
data.hit.dist_bias =
data.hit_cycle.dist_bias =
515 *dist_px_manhattan_p;
520 hit = (
data.use_cycle &&
data.hit_cycle.vert) ? &
data.hit_cycle : &
data.hit;
522 if (hit->
dist < *dist_px_manhattan_p) {
524 *r_base_index = base_index;
526 *dist_px_manhattan_p = hit->
dist;
527 prev_select_bm = vc->
em->
bm;
531 if (hit ==
nullptr) {
535 prev_select.index = hit->
index;
536 prev_select.elem = hit->
vert;
537 prev_select.bm = prev_select_bm;
558 const float screen_co_a[2],
559 const float screen_co_b[2],
564 if (eed ==
data->edge_test) {
566 float screen_co_mid[2];
568 mid_v2_v2v2(screen_co_mid, screen_co_a, screen_co_b);
571 data->dist = std::min(dist_test,
data->dist);
602 const float screen_co_a[2],
603 const float screen_co_b[2],
607 float dist_test, dist_test_bias;
616 else if (fac >= 1.0f) {
639 if (dist_test_bias < data->hit.dist_bias) {
640 float screen_co_mid[2];
642 data->hit.dist_bias = dist_test_bias;
643 data->hit.dist = dist_test;
644 data->hit.index = index;
645 data->hit.edge = eed;
647 mid_v2_v2v2(screen_co_mid, screen_co_a, screen_co_b);
651 if (
data->use_cycle) {
652 if ((
data->hit_cycle.edge ==
nullptr) && (index >
data->cycle_index_prev) &&
655 float screen_co_mid[2];
657 data->hit_cycle.dist_bias = dist_test_bias;
658 data->hit_cycle.dist = dist_test;
659 data->hit_cycle.index = index;
660 data->hit_cycle.edge = eed;
662 mid_v2_v2v2(screen_co_mid, screen_co_a, screen_co_b);
669 float *dist_px_manhattan_p,
670 float *r_dist_center_px_manhattan,
671 const bool use_select_bias,
705 if (r_dist_center_px_manhattan && eed) {
711 data.edge_test = eed;
720 *r_dist_center_px_manhattan =
data.dist;
725 if (dist_px_manhattan_test < *dist_px_manhattan_p) {
727 *r_base_index = base_index;
729 *dist_px_manhattan_p = dist_px_manhattan_test;
740 BMesh *prev_select_bm =
nullptr;
751 data.use_select_bias = use_select_bias;
752 data.use_cycle = use_cycle;
754 for (; base_index < bases.
size(); base_index++) {
755 Base *base_iter = bases[base_index];
757 if (use_cycle && prev_select.bm == vc->
em->
bm &&
760 data.cycle_index_prev = prev_select.index;
765 data.cycle_index_prev = 0;
768 data.hit.dist =
data.hit_cycle.dist =
data.hit.dist_bias =
data.hit_cycle.dist_bias =
769 *dist_px_manhattan_p;
775 hit = (
data.use_cycle &&
data.hit_cycle.edge) ? &
data.hit_cycle : &
data.hit;
777 if (hit->
dist < *dist_px_manhattan_p) {
779 *r_base_index = base_index;
781 *dist_px_manhattan_p = hit->
dist;
782 prev_select_bm = vc->
em->
bm;
786 if (hit ==
nullptr) {
790 if (r_dist_center_px_manhattan) {
794 prev_select.index = hit->
index;
795 prev_select.elem = hit->
edge;
796 prev_select.bm = prev_select_bm;
806 vc, dist_px_manhattan_p,
nullptr,
false,
false,
nullptr, {base},
nullptr);
818 const float screen_co[2],
823 if (efa ==
data->face_test) {
826 data->dist_px_manhattan = std::min(dist_test,
data->dist_px_manhattan);
849 const float screen_co[2],
853 float dist_test, dist_test_bias;
861 if (dist_test_bias < data->hit.dist_bias) {
862 data->hit.dist_bias = dist_test_bias;
863 data->hit.dist = dist_test;
864 data->hit.index = index;
865 data->hit.face = efa;
868 if (
data->use_cycle) {
869 if ((
data->hit_cycle.face ==
nullptr) && (index >
data->cycle_index_prev) &&
872 data->hit_cycle.dist_bias = dist_test_bias;
873 data->hit_cycle.dist = dist_test;
874 data->hit_cycle.index = index;
875 data->hit_cycle.face = efa;
881 float *dist_px_manhattan_p,
882 float *r_dist_center,
883 const bool use_zbuf_single_px,
884 const bool use_select_bias,
898 uint dist_px_manhattan_test = 0;
899 if (*dist_px_manhattan_p != 0.0f && (use_zbuf_single_px ==
false)) {
900 dist_px_manhattan_test =
uint(
906 if (dist_px_manhattan_test == 0) {
913 dist_test = dist_px_manhattan_test;
929 if (r_dist_center && efa) {
935 data.face_test = efa;
942 *r_dist_center =
data.dist_px_manhattan;
947 if (dist_test < *dist_px_manhattan_p) {
949 *r_base_index = base_index;
951 *dist_px_manhattan_p = dist_test;
961 BMesh *prev_select_bm =
nullptr;
971 data.use_select_bias = use_select_bias;
972 data.use_cycle = use_cycle;
974 for (; base_index < bases.
size(); base_index++) {
975 Base *base_iter = bases[base_index];
977 if (use_cycle && prev_select.bm == vc->
em->
bm &&
980 data.cycle_index_prev = prev_select.index;
985 data.cycle_index_prev = 0;
988 data.hit.dist =
data.hit_cycle.dist =
data.hit.dist_bias =
data.hit_cycle.dist_bias =
989 *dist_px_manhattan_p;
994 hit = (
data.use_cycle &&
data.hit_cycle.face) ? &
data.hit_cycle : &
data.hit;
996 if (hit->
dist < *dist_px_manhattan_p) {
998 *r_base_index = base_index;
1000 *dist_px_manhattan_p = hit->
dist;
1001 prev_select_bm = vc->
em->
bm;
1005 if (hit ==
nullptr) {
1009 if (r_dist_center) {
1010 *r_dist_center = hit->
dist;
1013 prev_select.index = hit->
index;
1014 prev_select.elem = hit->
face;
1015 prev_select.bm = prev_select_bm;
1025 vc, dist_px_manhattan_p,
nullptr,
false,
false,
false,
nullptr, {base},
nullptr);
1028#undef FIND_NEAR_SELECT_BIAS
1029#undef FIND_NEAR_CYCLE_THRESHOLD_MIN
1049 const float dist_margin = (dist_init / 2);
1050 float dist = dist_init;
1065 } hit = {{
nullptr}};
1070 float dist_center = 0.0f;
1075 uint base_index = 0;
1076 BMFace *efa_zbuf =
nullptr;
1078 vc, &dist, dist_center_p,
true,
true, use_cycle, &efa_zbuf, bases, &base_index);
1080 if (efa_test && dist_center_p) {
1081 dist =
min_ff(dist_margin, dist_center);
1084 hit.f.base_index = base_index;
1085 hit.f.ele = efa_test;
1088 hit.f_zbuf.base_index = base_index;
1089 hit.f_zbuf.ele = efa_zbuf;
1094 float dist_center = 0.0f;
1097 uint base_index = 0;
1098 BMEdge *eed_zbuf =
nullptr;
1100 vc, &dist, dist_center_p,
true, use_cycle, &eed_zbuf, bases, &base_index);
1102 if (eed_test && dist_center_p) {
1103 dist =
min_ff(dist_margin, dist_center);
1106 hit.e.base_index = base_index;
1107 hit.e.ele = eed_test;
1110 hit.e_zbuf.base_index = base_index;
1111 hit.e_zbuf.ele = eed_zbuf;
1116 uint base_index = 0;
1120 hit.v.base_index = base_index;
1121 hit.v.ele = eve_test;
1127 hit.f.ele =
nullptr;
1128 hit.e.ele =
nullptr;
1130 else if (hit.e.ele) {
1131 hit.f.ele =
nullptr;
1136 if ((hit.v.ele || hit.e.ele || hit.f.ele) == 0) {
1137 if (hit.e_zbuf.ele) {
1138 hit.e.base_index = hit.e_zbuf.base_index;
1139 hit.e.ele = hit.e_zbuf.ele;
1141 else if (hit.f_zbuf.ele) {
1142 hit.f.base_index = hit.f_zbuf.base_index;
1143 hit.f.ele = hit.f_zbuf.ele;
1148 BLI_assert(((hit.v.ele !=
nullptr) + (hit.e.ele !=
nullptr) + (hit.f.ele !=
nullptr)) <= 1);
1151 *r_base_index = hit.v.base_index;
1154 *r_base_index = hit.e.base_index;
1157 *r_base_index = hit.f.base_index;
1164 return (hit.v.ele || hit.e.ele || hit.f.ele);
1167#undef FAKE_SELECT_MODE_BEGIN
1168#undef FAKE_SELECT_MODE_END
1191 bool use_boundary_vertices,
1192 bool use_boundary_edges,
1193 int *r_base_index_vert,
1194 int *r_base_index_edge,
1195 int *r_base_index_face,
1201 float ray_origin[3], ray_direction[3];
1206 } best = {0,
nullptr};
1213 } best_vert = {0,
nullptr};
1218 } best_edge = {0,
nullptr};
1223 } best_face = {0,
nullptr};
1229 float dist_sq_best_vert =
FLT_MAX;
1230 float dist_sq_best_edge =
FLT_MAX;
1231 float dist_sq_best_face =
FLT_MAX;
1233 const bool use_vert = (r_eve !=
nullptr);
1234 const bool use_edge = (r_eed !=
nullptr);
1235 const bool use_face = (r_efa !=
nullptr);
1237 for (
const int base_index : bases.
index_range()) {
1238 Base *base_iter = bases[base_index];
1246 copy_m3_m4(imat3, obedit->object_to_world().ptr());
1262 if ((use_boundary_vertices || use_boundary_edges) && (use_vert || use_edge)) {
1271 if (use_vert && use_boundary_vertices) {
1272 for (
uint j = 0; j < 2; j++) {
1276 obedit->object_to_world().ptr(),
1280 ray_origin, ray_direction, point);
1281 if (dist_sq_test < dist_sq_best_vert) {
1282 dist_sq_best_vert = dist_sq_test;
1283 best_vert.base_index = base_index;
1286 if (dist_sq_test < dist_sq_best) {
1287 dist_sq_best = dist_sq_test;
1288 best.base_index = base_index;
1294 if (use_edge && use_boundary_edges) {
1298 ray_origin, ray_direction,
e->v1->co,
e->v2->co, point, &depth);
1308 mul_m4_v3(obedit->object_to_world().ptr(), point);
1310 ray_origin, ray_direction, point);
1311 if (dist_sq_test < dist_sq_best_edge) {
1312 dist_sq_best_edge = dist_sq_test;
1313 best_edge.base_index = base_index;
1316 if (dist_sq_test < dist_sq_best) {
1317 dist_sq_best = dist_sq_test;
1318 best.base_index = base_index;
1327 if (use_vert && !use_boundary_vertices) {
1337 obedit->object_to_world().ptr(),
1340 ray_origin, ray_direction, point);
1341 if (dist_sq_test < dist_sq_best_vert) {
1342 dist_sq_best_vert = dist_sq_test;
1343 best_vert.base_index = base_index;
1346 if (dist_sq_test < dist_sq_best) {
1347 dist_sq_best = dist_sq_test;
1348 best.base_index = base_index;
1354 if (use_edge && !use_boundary_edges) {
1371 mul_m4_v3(obedit->object_to_world().ptr(), point);
1373 ray_origin, ray_direction, point);
1374 if (dist_sq_test < dist_sq_best_edge) {
1375 dist_sq_best_edge = dist_sq_test;
1376 best_edge.base_index = base_index;
1379 if (dist_sq_test < dist_sq_best) {
1380 dist_sq_best = dist_sq_test;
1381 best.base_index = base_index;
1402 mul_m4_v3(obedit->object_to_world().ptr(), point);
1404 ray_origin, ray_direction, point);
1405 if (dist_sq_test < dist_sq_best_face) {
1406 dist_sq_best_face = dist_sq_test;
1407 best_face.base_index = base_index;
1408 best_face.ele = (
BMElem *)f;
1410 if (dist_sq_test < dist_sq_best) {
1411 dist_sq_best = dist_sq_test;
1412 best.base_index = base_index;
1420 *r_base_index_vert = best_vert.base_index;
1421 *r_base_index_edge = best_edge.base_index;
1422 *r_base_index_face = best_face.base_index;
1434 if (best_vert.ele) {
1435 *r_eve = (
BMVert *)best_vert.ele;
1437 if (best_edge.ele) {
1438 *r_eed = (
BMEdge *)best_edge.ele;
1440 if (best_face.ele) {
1441 *r_efa = (
BMFace *)best_face.ele;
1444 return (best_vert.ele !=
nullptr || best_edge.ele !=
nullptr || best_face.ele !=
nullptr);
1458 bool changed =
false;
1461 int (*group_index)[2];
1465 if (
bm->totfacesel < 2) {
1476 for (
i = 0;
i < group_tot;
i++) {
1480 const int fg_sta = group_index[
i][0];
1481 const int fg_len = group_index[
i][1];
1485 for (j = 0; j < fg_len; j++) {
1524 ot->name =
"Select Similar Regions";
1525 ot->idname =
"MESH_OT_select_similar_region";
1526 ot->description =
"Select similar face regions to the current selection";
1597 "Vertex select - Shift-Click for multiple modes, Ctrl-Click contracts selection");
1600 "Edge select - Shift-Click for multiple modes, "
1601 "Ctrl-Click expands/contracts selection depending on the current mode");
1603 return TIP_(
"Face select - Shift-Click for multiple modes, Ctrl-Click expands selection");
1615 {0,
"DISABLE",
false,
"Disable",
"Disable selected markers"},
1616 {1,
"ENABLE",
false,
"Enable",
"Enable selected markers"},
1617 {2,
"TOGGLE",
false,
"Toggle",
"Toggle disabled flag for selected markers"},
1618 {0,
nullptr, 0,
nullptr,
nullptr},
1622 ot->name =
"Select Mode";
1623 ot->idname =
"MESH_OT_select_mode";
1624 ot->description =
"Change selection mode";
1645 ot->srna,
"action", actions_items, 2,
"Action",
"Selection action to execute");
1658 int r_count_by_select[2])
1664 r_count_by_select[0] = r_count_by_select[1] = 0;
1681 if (r_count_by_select[0] && r_count_by_select[1]) {
1682 r_count_by_select[0] = r_count_by_select[1] = -1;
1695 bool changed =
false;
1726 for (
Object *obedit : objects) {
1749 edarray[edindex] = eed;
1754 bool changed =
false;
1756 for (edindex = 0; edindex < totedgesel; edindex += 1) {
1757 eed = edarray[edindex];
1766 for (edindex = 0; edindex < totedgesel; edindex += 1) {
1767 eed = edarray[edindex];
1795 ot->name =
"Multi Select Loops";
1796 ot->idname =
"MESH_OT_loop_multi_select";
1797 ot->description =
"Select a loop of connected edges by connection type";
1837 bool edge_boundary =
false;
1842 int count_by_select[2];
1846 if (count_by_select[!
select] == 0) {
1847 edge_boundary =
true;
1851 if (count_by_select[!
select] == 0) {
1852 edge_boundary =
false;
1861 if (edge_boundary) {
1864 else if (non_manifold) {
1873 bContext *
C,
const int mval[2],
bool extend,
bool deselect,
bool toggle,
bool ring)
1875 Base *basact =
nullptr;
1882 bool select_clear =
false;
1883 bool select_cycle =
true;
1891 const short selectmode = em_original->
selectmode;
1898 int base_index = -1;
1900 basact = bases[base_index];
1911 if (em ==
nullptr || eed ==
nullptr) {
1915 if (extend ==
false && deselect ==
false && toggle ==
false) {
1916 select_clear =
true;
1922 else if (deselect) {
1930 select_cycle =
false;
1934 for (
Base *base_iter : bases) {
1935 Object *ob_iter = base_iter->object;
1942 if (em_iter == em) {
1971 float v1_co[2], v2_co[2];
1990 printf(
"mouse to v1: %f\nmouse to v2: %f\n",
2019 if (tdist < best_dist) {
2060 ot->name =
"Loop Select";
2061 ot->idname =
"MESH_OT_loop_select";
2062 ot->description =
"Select a loop of connected edges";
2074 prop =
RNA_def_boolean(
ot->srna,
"extend",
false,
"Extend Select",
"Extend the selection");
2076 prop =
RNA_def_boolean(
ot->srna,
"deselect",
false,
"Deselect",
"Remove from the selection");
2078 prop =
RNA_def_boolean(
ot->srna,
"toggle",
false,
"Toggle Select",
"Toggle the selection");
2087 ot->name =
"Edge Ring Select";
2088 ot->idname =
"MESH_OT_edgering_select";
2089 ot->description =
"Select an edge ring";
2100 prop =
RNA_def_boolean(
ot->srna,
"extend",
false,
"Extend",
"Extend the selection");
2102 prop =
RNA_def_boolean(
ot->srna,
"deselect",
false,
"Deselect",
"Remove from the selection");
2104 prop =
RNA_def_boolean(
ot->srna,
"toggle",
false,
"Toggle Select",
"Toggle the selection");
2127 for (
Object *obedit : objects) {
2136 for (
Object *obedit : objects) {
2166 ot->name =
"(De)select All";
2167 ot->idname =
"MESH_OT_select_all";
2168 ot->description =
"(De)select all vertices, edges or faces";
2193 for (
Object *obedit : objects) {
2210 ot->name =
"Select Interior Faces";
2211 ot->idname =
"MESH_OT_select_interior_faces";
2212 ot->description =
"Select faces where all edges have more than 2 face users";
2233 int base_index_active = -1;
2240 vc.
mval[0] = mval[0];
2241 vc.
mval[1] = mval[1];
2246 bool changed =
false;
2254 else if (found ||
params.deselect_all) {
2256 for (
Base *base_iter : bases) {
2257 Object *ob_iter = base_iter->object;
2267 Base *basact = bases[base_index_active];
2290 if (
bm->uv_select_sync_valid) {
2305 if (
bm->uv_select_sync_valid) {
2312 if (
bm->uv_select_sync_valid) {
2343 if (
bm->uv_select_sync_valid) {
2351 if (
bm->uv_select_sync_valid) {
2360 if (
bm->uv_select_sync_valid) {
2367 if (
bm->uv_select_sync_valid) {
2395 if (
bm->uv_select_sync_valid) {
2403 if (
bm->uv_select_sync_valid) {
2412 if (
bm->uv_select_sync_valid) {
2419 if (
bm->uv_select_sync_valid) {
2475 nextese = ese->
next;
2485 nextese = ese->
next;
2495 nextese = ese->
next;
2511 const short selectmode_prev = em->
selectmode;
2568 const short selectmode_old,
2569 const short selectmode_new)
2587 if (
bm->totvertsel == 0) {
2620 if (
bm->totedgesel == 0) {
2650 if (
bm->totfacesel == 0) {
2679 const short selectmode_toggle,
2681 const bool use_extend,
2682 const bool use_expand)
2690 short selectmode_new;
2700 if (em ==
nullptr) {
2707 const short selectmode_old = selectmode_new;
2709 bool only_update =
false;
2716 if ((selectmode_old & selectmode_toggle) == 0) {
2720 selectmode_new &= ~selectmode_toggle;
2724 if ((selectmode_old & selectmode_toggle) != 0) {
2728 selectmode_new |= selectmode_toggle;
2732 if (selectmode_old == selectmode_toggle) {
2736 selectmode_new ^= selectmode_toggle;
2747 for (
Object *ob_iter : objects) {
2766 bool use_uv_select_ensure =
false;
2773 use_uv_select_ensure =
true;
2777 if (use_extend ==
false || selectmode_new == 0) {
2780 for (
Object *ob_iter : objects) {
2787 use_uv_select_ensure =
false;
2791 switch (selectmode_toggle) {
2793 if (use_extend ==
false || selectmode_new == 0) {
2799 if (use_extend ==
false || selectmode_new == 0) {
2805 if (use_extend ==
false || selectmode_new == 0) {
2817 for (
Object *ob_iter : objects) {
2820 if (use_uv_select_ensure) {
2846 bool changed =
false;
2847 bool changed_toolsettings =
false;
2851 changed_toolsettings =
true;
2854 for (
Object *ob_iter : objects) {
2865 if (changed_toolsettings) {
2870 return changed || changed_toolsettings;
2906 if (objects.
size() <= 1) {
2910 bool changed =
false;
2912 for (
Object *obedit : objects) {
2929 const short selectmode_disable,
2930 const short selectmode_fallback)
2935 const short selectmode = (em->
selectmode == selectmode_disable) ?
2936 selectmode_fallback :
2958 bool changed =
false;
2964 if (efa->
mat_nr == index) {
3017 bool changed_multi =
false;
3018 for (
Base *base_iter : bases) {
3019 Object *ob_iter = base_iter->object;
3028 changed_multi =
true;
3030 return changed_multi;
3044 const short selectmode_disable,
3045 const short selectmode_fallback)
3047 bool changed_multi =
false;
3048 for (
Base *base_iter : bases) {
3049 Object *ob_iter = base_iter->object;
3053 changed_multi =
true;
3056 return changed_multi;
3060 const short selectmode_disable,
3061 const short selectmode_fallback)
3108 if (!
ELEM(
i, -1, face_index)) {
3109 if (loop_index == 2) {
3112 r_l_pair[loop_index++] = l_iter;
3115 return (loop_index == 2);
3130 BMFace *f = f_link->face;
3131 area += f_link->area;
3134 BMLoop *l_iter, *l_first;
3138 float cost_test = 0.0f;
3141 BMLoop *l_radial_iter = l_iter;
3144 if (!
ELEM(i_other, -1,
i)) {
3160 }
while ((l_radial_iter = l_radial_iter->
radial_next) != l_iter);
3162 if (cost_count >= 2) {
3167 }
while ((l_iter = l_iter->
next) != l_first);
3169 return found ? cost / area :
FLT_MAX;
3176 bool changed =
false;
3181 bool has_nonmanifold =
false;
3188 has_nonmanifold =
true;
3193 edge_lengths[
i] = -1.0;
3200 if (has_nonmanifold ==
false) {
3207 int (*fgroup_index)[2];
3231 for (
int i = 0;
i < fgroup_len;
i++) {
3232 const int fg_sta = fgroup_index[
i][0];
3233 const int fg_len = fgroup_index[
i][1];
3234 for (
int j = 0; j < fg_len; j++) {
3235 const int face_index = fgroup_array[fg_sta + j];
3239 BMFaceLink *f_link = &f_link_array[face_index];
3253 for (
int i = 0;
i < fgroup_len;
i++) {
3259 fgroup_table[
i] =
nullptr;
3271#define USE_DELAY_FACE_GROUP_COST_CALC
3275#if defined(USE_DELAY_FACE_GROUP_COST_CALC)
3279 if (fgroup_dirty[
i]) {
3289 fgroup_table[
i] =
nullptr;
3291 fgroup_dirty[
i] =
false;
3306 fgroup_table[i_min] =
nullptr;
3310 BMFace *f = f_link->face;
3314 BMLoop *l_iter, *l_first;
3330 std::swap(i_a, i_b);
3343 fgroup_table[i_b] =
nullptr;
3348 if (fgroup_dirty[i_a] ==
false) {
3351 fgroup_dirty[i_a] =
true;
3358 if (l_radial_iter != l_iter) {
3361 if (!
ELEM(i_other, -1, i_min)) {
3362 if ((fgroup_table[i_other] !=
nullptr) && (fgroup_dirty[i_other] ==
false)) {
3363#if !defined(USE_DELAY_FACE_GROUP_COST_CALC)
3366 fgroup_dirty[i_other] =
true;
3369 }
while ((l_radial_iter = l_radial_iter->
radial_next) != l_iter);
3372 }
while ((l_iter = l_iter->
next) != l_first);
3375 for (
int index = 0; index <
STACK_SIZE(fgroup_recalc_stack); index++) {
3376 const int i = fgroup_recalc_stack[index];
3377 if (fgroup_table[
i] !=
nullptr && fgroup_dirty[
i] ==
true) {
3385 fgroup_table[
i] =
nullptr;
3388 fgroup_dirty[
i] =
false;
3414#define USE_LINKED_SELECT_DEFAULT_HACK
3444 if (
e->l &&
e->l->radial_next !=
e->l) {
3445 const short mat_nr =
e->l->f->mat_nr;
3446 BMLoop *l_iter =
e->l->radial_next;
3448 if (l_iter->
f->
mat_nr != mat_nr) {
3457 e, delimit_data->cd_loop_type, delimit_data->cd_loop_offset) == 0)
3466#ifdef USE_LINKED_SELECT_DEFAULT_HACK
3475 char *delimit_last = &delimit_last_store[delimit_last_index];
3481 *delimit_last = delimit;
3484 delimit = *delimit_last;
3502 DelimitData delimit_data{};
3507 if (delimit_data.cd_loop_offset == -1) {
3539#ifdef USE_LINKED_SELECT_DEFAULT_HACK
3549 for (
Object *obedit : objects) {
3556 int delimit = delimit_init;
3745 ot->name =
"Select Linked All";
3746 ot->idname =
"MESH_OT_select_linked";
3747 ot->description =
"Select all vertices connected to the current selection";
3761 "Delimit selected region");
3762#ifdef USE_LINKED_SELECT_DEFAULT_HACK
3804 BMW_ITER (ele_walk, &walker, eve) {
3841 BMW_ITER (ele_walk, &walker, eed) {
3898 Base *basact =
nullptr;
3919 bool has_edges =
false;
3920 for (
Base *base : bases) {
3921 Object *ob_iter = base->object;
3927 if (has_edges ==
false) {
3932 vc.
mval[0] =
event->mval[0];
3933 vc.
mval[1] =
event->mval[1];
3937 int base_index = -1;
3942 basact = bases[base_index];
3949#ifdef USE_LINKED_SELECT_DEFAULT_HACK
3979 Object *obedit =
nullptr;
3991 if (ele ==
nullptr) {
3998#ifdef USE_LINKED_SELECT_DEFAULT_HACK
4017 ot->name =
"Select Linked";
4018 ot->idname =
"MESH_OT_select_linked_pick";
4019 ot->description =
"(De)select all vertices linked to the edge under the mouse cursor";
4035 "Delimit selected region");
4036#ifdef USE_LINKED_SELECT_DEFAULT_HACK
4041 prop =
RNA_def_int(
ot->srna,
"object_index", -1, -1, INT_MAX,
"",
"", 0, INT_MAX);
4043 prop =
RNA_def_int(
ot->srna,
"index", -1, -1, INT_MAX,
"",
"", 0, INT_MAX);
4064 for (
Object *obedit : objects) {
4066 bool changed =
false;
4086 if (exclude_nonmanifold) {
4095 bool all_edges_manifold =
true;
4098 all_edges_manifold =
false;
4103 if (all_edges_manifold ==
false) {
4151 ot->name =
"Select By Pole Count";
4153 "Select vertices at poles by the number of connected edges. "
4154 "In edge and face mode the geometry connected to the vertices is selected";
4155 ot->idname =
"MESH_OT_select_by_pole_count";
4165 RNA_def_int(
ot->srna,
"pole_count", 4, 0, INT_MAX,
"Pole Count",
"", 0, INT_MAX);
4171 "Type of comparison to make");
4174 ot->srna,
"exclude_nonmanifold",
true,
"Exclude Non Manifold",
"Exclude non-manifold poles");
4193 for (
Object *obedit : objects) {
4195 bool changed =
false;
4232 ot->name =
"Select Faces by Sides";
4233 ot->description =
"Select vertices or faces by the number of face sides";
4234 ot->idname =
"MESH_OT_select_face_by_sides";
4244 RNA_def_int(
ot->srna,
"number", 4, 3, INT_MAX,
"Number of Vertices",
"", 3, INT_MAX);
4250 "Type of comparison to make");
4269 for (
Object *obedit : objects) {
4274 bool changed =
false;
4315 bool is_loose =
true;
4344 ot->name =
"Select Loose Geometry";
4345 ot->description =
"Select loose geometry based on the selection mode";
4346 ot->idname =
"MESH_OT_select_loose";
4374 int tot_mirr = 0, tot_fail = 0;
4379 for (
Object *obedit : objects) {
4386 int tot_mirr_iter = 0, tot_fail_iter = 0;
4388 for (
int axis = 0; axis < 3; axis++) {
4389 if ((1 << axis) & axis_flag) {
4391 static_cast<const Mesh *
>(obedit->data),
4399 if (tot_mirr_iter) {
4407 tot_fail += tot_fail_iter;
4408 tot_mirr += tot_mirr_iter;
4411 if (tot_mirr || tot_fail) {
4420 ot->name =
"Select Mirror";
4421 ot->description =
"Select mesh items at mirrored locations";
4422 ot->idname =
"MESH_OT_select_mirror";
4434 RNA_def_boolean(
ot->srna,
"extend",
false,
"Extend",
"Extend the existing selection");
4451 for (
Object *obedit : objects) {
4455 if ((
bm->totvertsel == 0) && (
bm->totedgesel == 0) && (
bm->totfacesel == 0)) {
4470 ot->name =
"Select More";
4471 ot->idname =
"MESH_OT_select_more";
4472 ot->description =
"Select more vertices, edges or faces connected to initial selection";
4482 ot->srna,
"use_face_step",
true,
"Face Step",
"Connected faces (instead of edges)");
4499 for (
Object *obedit : objects) {
4503 if ((
bm->totvertsel == 0) && (
bm->totedgesel == 0) && (
bm->totfacesel == 0)) {
4518 ot->name =
"Select Less";
4519 ot->idname =
"MESH_OT_select_less";
4520 ot->description =
"Deselect vertices, edges or faces at the boundary of each selection region";
4530 ot->srna,
"use_face_step",
true,
"Face Step",
"Connected faces (instead of edges)");
4563 BMEdge *e_other, *e_next =
nullptr;
4565 const int count_expected = 1;
4571 if (++
count > count_expected) {
4576 return (
count == count_expected) ? e_next :
nullptr;
4583 BMVert *v_next =
nullptr;
4585 const int count_expected = v_prev ? 1 : 2;
4592 if (++
count > count_expected) {
4597 return (
count == count_expected) ? v_next :
nullptr;
4605 BMFace *f_next =
nullptr;
4607 const int count_expected = f_prev ? 1 : 2;
4616 if (++
count > count_expected) {
4622 return (
count == count_expected) ? f_next :
nullptr;
4630 BMVert *v_prev =
nullptr, *v_curr = v_start;
4633 int selected_neighbor_count = 0;
4639 if (++selected_neighbor_count > 2) {
4644 if (selected_neighbor_count != 2) {
4649 if (v_next ==
nullptr) {
4654 }
while (v_curr != v_start);
4664 BMEdge *e_curr = e_start;
4669 if (e_next ==
nullptr) {
4675 }
while (e_curr != e_start);
4685 BMFace *f_prev =
nullptr;
4686 BMFace *f_curr = f_start;
4689 int selected_neighbor_count = 0;
4698 selected_neighbor_count++;
4702 if (selected_neighbor_count != 2) {
4707 if (f_next ==
nullptr) {
4713 }
while (f_curr != f_start);
4723 BMVert *v_prev =
nullptr;
4724 BMVert *v_curr = v_start;
4741 if (
ELEM(v_next,
nullptr, v_start)) {
4756 BMEdge *e_curr = e_start;
4774 if (
ELEM(e_next,
nullptr, e_start)) {
4789 BMFace *f_prev =
nullptr;
4790 BMFace *f_curr = f_start;
4806 if (
ELEM(f_next,
nullptr, f_start)) {
4827 int walktype = 0, itertype = 0, flushtype = 0;
4828 short mask_vert = 0, mask_edge = 0, mask_face = 0;
4831 if (h_act ==
nullptr) {
4871 switch (h_act->
htype) {
4922 for (ele =
static_cast<BMElem *
>(
BMW_begin(&walker, h_act)); ele !=
nullptr;
5025 bool found_active_elt =
false;
5030 for (
Object *obedit : objects) {
5040 found_active_elt =
true;
5042 params.calc_looptris =
false;
5043 params.calc_normals =
false;
5044 params.is_destructive =
false;
5049 if (!found_active_elt) {
5060 ot->name =
"Checker Deselect";
5061 ot->idname =
"MESH_OT_select_nth";
5062 ot->description =
"Deselect every Nth element starting from the active vertex, edge or face";
5103 for (
Object *obedit : objects) {
5118 if (angle_cos < angle_limit_cos) {
5145 ot->name =
"Select Sharp Edges";
5146 ot->description =
"Select all sharp enough edges";
5147 ot->idname =
"MESH_OT_edges_select_sharp";
5184 for (
Object *obedit : objects) {
5188 if (
bm->totfacesel == 0) {
5194 BMIter iter, liter, liter2;
5225 if (angle_cos > angle_limit_cos) {
5245 ot->name =
"Select Linked Flat Faces";
5246 ot->description =
"Select linked faces by angle";
5247 ot->idname =
"MESH_OT_faces_select_linked_flat";
5292 for (
Object *obedit : objects) {
5298 bool changed =
false;
5319 if (use_wire || use_boundary || use_multi_face || use_non_contiguous) {
5352 ot->name =
"Select Non-Manifold";
5353 ot->description =
"Select all non-manifold vertices or edges";
5354 ot->idname =
"MESH_OT_select_non_manifold";
5367 RNA_def_boolean(
ot->srna,
"use_boundary",
true,
"Boundaries",
"Boundary edges");
5369 ot->srna,
"use_multi_face",
true,
"Multiple Faces",
"Edges shared by more than two faces");
5371 "use_non_contiguous",
5374 "Edges between faces pointing in alternate directions");
5377 ot->srna,
"use_verts",
true,
"Vertices",
"Vertices connecting multiple face regions");
5397 for (
const int ob_index : objects.
index_range()) {
5398 Object *obedit = objects[ob_index];
5401 int seed_iter =
seed;
5409 int elem_map_len = 0;
5415 elem_map[elem_map_len++] = eve;
5420 const int count_select = elem_map_len * randfac;
5421 for (
int i = 0;
i < count_select;
i++) {
5427 int elem_map_len = 0;
5433 elem_map[elem_map_len++] = eed;
5437 const int count_select = elem_map_len * randfac;
5438 for (
int i = 0;
i < count_select;
i++) {
5444 int elem_map_len = 0;
5450 elem_map[elem_map_len++] = efa;
5454 const int count_select = elem_map_len * randfac;
5455 for (
int i = 0;
i < count_select;
i++) {
5480 ot->name =
"Select Random";
5481 ot->description =
"Randomly select vertices";
5482 ot->idname =
"MESH_OT_select_random";
5531 for (
Object *obedit : objects) {
5536 if (cd_dvert_offset == -1) {
5543 bool changed =
false;
5556 if (
ELEM(
nullptr, dv, dv->
dw)) {
5577 ot->name =
"Select Ungrouped";
5578 ot->idname =
"MESH_OT_select_ungrouped";
5579 ot->description =
"Select vertices without a group";
5614 if (v_act ==
nullptr) {
5616 op->
reports,
RPT_WARNING,
"This operator requires an active vertex (last selected)");
5623 float axis_mat[3][3];
5636 const float *axis_vector = axis_mat[axis];
5639 float vertex_world[3];
5640 mul_v3_m4v3(vertex_world, obedit->object_to_world().ptr(), v_act->
co);
5641 value =
dot_v3v3(axis_vector, vertex_world);
5653 for (
Object *obedit_iter : objects) {
5657 if (
bm->totvert ==
bm->totvertsel) {
5663 bool changed =
false;
5667 float v_iter_world[3];
5668 mul_v3_m4v3(v_iter_world, obedit_iter->object_to_world().ptr(),
v->co);
5669 const float value_iter =
dot_v3v3(axis_vector, v_iter_world);
5672 if (
fabsf(value_iter - value) < limit) {
5678 if (value_iter < value) {
5684 if (value_iter > value) {
5709 {0,
nullptr, 0,
nullptr,
nullptr},
5713 ot->name =
"Select Axis";
5714 ot->description =
"Select all data in the mesh on a single axis";
5715 ot->idname =
"MESH_OT_select_axis";
5730 "Axis orientation");
5737 "Select the axis to compare each vertex on");
5739 ot->srna,
"threshold", 0.0001f, 0.000001f, 50.0f,
"Threshold",
"", 0.00001f, 10.0f);
5754 bool changed =
false;
5755 for (
Object *obedit : objects) {
5772 int tot = 0, totsel = 0;
5779 if ((tot != totsel && totsel > 0) || (totsel == 1 && tot == 1)) {
5811 ot->name =
"Select Boundary Loop";
5812 ot->idname =
"MESH_OT_region_to_loop";
5813 ot->description =
"Select boundary edges around the selected faces";
5864 memcpy(region_alloc, region.
data(), region.
as_span().size_in_bytes());
5865 *region_out = region_alloc;
5866 return region.
size();
5894 GSet *visit_face_set;
5915 qsort(edges, edges_len,
sizeof(*edges),
verg_radial);
5917 for (
i = 0;
i < edges_len;
i++) {
5920 BMFace **region =
nullptr, **region_out;
5936 if (!region || (selbigger ? c >= tot : c < tot)) {
5944 region = region_out;
5955 for (j = 0; j < tot; j++) {
5982 for (
Object *obedit : objects) {
6001 bool changed =
true;
6028 ot->name =
"Select Loop Inner-Region";
6029 ot->idname =
"MESH_OT_loop_to_region";
6030 ot->description =
"Select region of faces inside of a selected loop of edges";
6043 "Select bigger regions instead of smaller ones");
6053 const Mesh *mesh =
static_cast<const Mesh *
>(obedit->
data);
6068 C,
"The active attribute must be on the vertex, edge, or face domain");
6085 return std::nullopt;
6096 for (
Object *obedit : objects) {
6097 Mesh *mesh =
static_cast<Mesh *
>(obedit->data);
6122 bool changed =
false;
6149 ot->name =
"Select by Attribute";
6150 ot->idname =
"MESH_OT_select_by_attribute";
6151 ot->description =
"Select elements based on the active boolean attribute";
std::optional< blender::StringRefNull > BKE_attributes_active_name_get(AttributeOwner &owner)
blender::bke::AttrDomain BKE_attribute_domain(const AttributeOwner &owner, const struct CustomDataLayer *layer)
const struct CustomDataLayer * BKE_attribute_search(const AttributeOwner &owner, blender::StringRef name, eCustomDataMask type, AttrDomainMask domain_mask)
SpaceImage * CTX_wm_space_image(const bContext *C)
void CTX_wm_operator_poll_msg_set(bContext *C, const char *msg)
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Object * CTX_data_edit_object(const bContext *C)
ToolSettings * CTX_data_tool_settings(const bContext *C)
RegionView3D * CTX_wm_region_view3d(const bContext *C)
View3D * CTX_wm_view3d(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)
bool CustomData_has_layer(const CustomData *data, eCustomDataType type)
BMEditMesh * BKE_editmesh_from_object(Object *ob)
Return the BMEditMesh for a given object.
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
blender::Vector< Base * > BKE_view_layer_array_from_bases_in_edit_mode(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
Base * BKE_view_layer_active_base_get(ViewLayer *view_layer)
blender::Vector< Object * > BKE_view_layer_array_from_objects_in_edit_mode(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
Object * BKE_view_layer_active_object_get(const ViewLayer *view_layer)
Base * BKE_view_layer_base_find(ViewLayer *view_layer, Object *ob)
blender::Vector< Base * > BKE_view_layer_array_from_bases_in_edit_mode_unique_data(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
blender::Vector< Object * > BKE_view_layer_array_from_objects_in_edit_mode_unique_data(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
blender::Span< blender::float3 > BKE_mesh_wrapper_vert_coords(const Mesh *mesh)
int BKE_mesh_wrapper_vert_len(const Mesh *mesh)
General operations, lookup, etc. for blender objects.
const Mesh * BKE_object_get_editmesh_eval_cage(const Object *object)
void BKE_report(ReportList *reports, eReportType type, const char *message)
#define BLI_assert_unreachable()
bool BLI_gset_haskey(const GSet *gs, const void *key) ATTR_WARN_UNUSED_RESULT
unsigned int BLI_ghashutil_strhash_p(const void *ptr)
void BLI_gset_insert(GSet *gs, void *key)
void BLI_gset_free(GSet *gs, GSetKeyFreeFP keyfreefp)
GSet * BLI_gset_ptr_new_ex(const char *info, unsigned int nentries_reserve) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
bool BLI_gset_add(GSet *gs, void *key)
A min-heap / priority queue ADT.
HeapNode * BLI_heap_top(const Heap *heap) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_heap_free(Heap *heap, HeapFreeFP ptrfreefp) ATTR_NONNULL(1)
void void float BLI_heap_node_value(const HeapNode *heap) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Heap * BLI_heap_new_ex(unsigned int reserve_num) ATTR_WARN_UNUSED_RESULT
void void bool BLI_heap_is_empty(const Heap *heap) ATTR_NONNULL(1)
void BLI_heap_node_value_update(Heap *heap, HeapNode *node, float value) ATTR_NONNULL(1
void * BLI_heap_pop_min(Heap *heap) ATTR_NONNULL(1)
void * BLI_heap_node_ptr(const HeapNode *heap) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
HeapNode * BLI_heap_insert(Heap *heap, float value, void *ptr) ATTR_NONNULL(1)
void void BLI_heap_remove(Heap *heap, HeapNode *node) ATTR_NONNULL(1
void void void BLI_movelisttolist(ListBase *dst, ListBase *src) ATTR_NONNULL(1
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void BLI_freelinkN(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void * BLI_pophead(ListBase *listbase) ATTR_NONNULL(1)
MINLINE float min_ff(float a, float b)
MINLINE unsigned short highest_order_bit_s(unsigned short n)
MINLINE int bitscan_forward_i(int a)
float line_point_factor_v2(const float p[2], const float l1[2], const float l2[2])
float dist_squared_ray_to_seg_v3(const float ray_origin[3], const float ray_direction[3], const float v0[3], const float v1[3], float r_point[3], float *r_depth)
float dist_squared_to_ray_v3_normalized(const float ray_origin[3], const float ray_direction[3], const float co[3])
void copy_m3_m4(float m1[3][3], const float m2[4][4])
void mul_m4_v3(const float M[4][4], float r[3])
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
bool invert_m3(float mat[3][3])
MINLINE float len_squared_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
void interp_v2_v2v2(float r[2], const float a[2], const float b[2], float t)
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE float dot_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
void interp_v3_v3v3(float r[3], const float a[3], const float b[3], float t)
void mid_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE float len_manhattan_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
void mid_v3_v3v3(float r[3], const float a[3], const float b[3])
float angle_normalized_v3v3(const float v1[3], const float v2[3]) ATTR_WARN_UNUSED_RESULT
void BLI_array_randomize(void *data, unsigned int elem_size, unsigned int elem_num, unsigned int seed)
#define UNUSED_FUNCTION(x)
#define POINTER_FROM_INT(i)
#define POINTER_AS_INT(i)
#define STACK_CLEAR(stack)
#define STACK_PUSH(stack, val)
#define STACK_DECLARE(stack)
#define STACK_SIZE(stack)
#define STACK_INIT(stack, stack_num)
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.
#define RV3D_CLIPPING_ENABLED(v3d, rv3d)
void DRW_select_buffer_context_create(Depsgraph *depsgraph, blender::Span< Base * > bases, short select_mode)
uint DRW_select_buffer_sample_point(Depsgraph *depsgraph, ARegion *region, View3D *v3d, const int center[2])
bool DRW_select_buffer_elem_get(uint sel_id, uint &r_elem, uint &r_base_index, char &r_elem_type)
uint DRW_select_buffer_find_nearest_to_point(Depsgraph *depsgraph, ARegion *region, View3D *v3d, const int center[2], uint id_min, uint id_max, uint *dist)
void EDBM_flag_disable_all(BMEditMesh *em, char hflag)
void EDBM_select_flush_from_verts(BMEditMesh *em, bool select)
void EDBM_update(Mesh *mesh, const EDBMUpdate_Params *params)
bool EDBM_uvselect_clear(BMEditMesh *em)
BMVert * EDBM_verts_mirror_get(BMEditMesh *em, BMVert *v)
void EDBM_select_more(BMEditMesh *em, bool use_face_step)
void EDBM_verts_mirror_cache_begin(BMEditMesh *em, int axis, bool use_self, bool use_select, bool respecthide, bool use_topology)
void EDBM_selectmode_flush(BMEditMesh *em)
void EDBM_selectmode_flush_ex(BMEditMesh *em, short selectmode)
void ED_mesh_report_mirror_ex(ReportList &reports, int totmirr, int totfail, char selectmode)
void EDBM_verts_mirror_cache_end(BMEditMesh *em)
BMEdge * EDBM_verts_mirror_get_edge(BMEditMesh *em, BMEdge *e)
BMFace * EDBM_verts_mirror_get_face(BMEditMesh *em, BMFace *f)
void EDBM_flag_enable_all(BMEditMesh *em, char hflag)
void EDBM_select_less(BMEditMesh *em, bool use_face_step)
bool ED_operator_editmesh_region_view3d(bContext *C)
bool ED_operator_editmesh(bContext *C)
void ED_uvedit_sync_uvselect_ensure_if_needed(const ToolSettings *ts, BMesh *bm)
void ED_uvedit_deselect_all(const Scene *scene, Object *obedit, int action)
bool ED_view3d_win_to_ray_clipped(Depsgraph *depsgraph, const ARegion *region, const View3D *v3d, const float mval[2], float r_ray_start[3], float r_ray_normal[3], bool do_clip_planes)
float ED_view3d_select_dist_px()
#define V3D_PROJ_TEST_CLIP_CONTENT_DEFAULT
void mesh_foreachScreenVert(const ViewContext *vc, void(*func)(void *user_data, BMVert *eve, const float screen_co[2], int index), void *user_data, eV3DProjTest clip_flag)
@ V3D_PROJ_TEST_CLIP_NEAR
eV3DProjStatus ED_view3d_project_float_object(const ARegion *region, const float co[3], float r_co[2], eV3DProjTest flag)
void ED_view3d_init_mats_rv3d(const Object *ob, RegionView3D *rv3d)
void mesh_foreachScreenEdge(const ViewContext *vc, void(*func)(void *user_data, BMEdge *eed, const float screen_co_a[2], const float screen_co_b[2], int index), void *user_data, eV3DProjTest clip_flag)
ViewContext ED_view3d_viewcontext_init(bContext *C, Depsgraph *depsgraph)
int ED_view3d_backbuf_sample_size_clamp(ARegion *region, float dist)
void mesh_foreachScreenFace(const ViewContext *vc, void(*func)(void *user_data, BMFace *efa, const float screen_co[2], int index), void *user_data, eV3DProjTest clip_flag)
#define V3D_PROJ_TEST_CLIP_DEFAULT
#define XRAY_FLAG_ENABLED(v3d)
void view3d_operator_needs_gpu(const bContext *C)
bool ED_view3d_clipping_test(const RegionView3D *rv3d, const float co[3], bool is_local)
void ED_view3d_viewcontext_init_object(ViewContext *vc, Object *obact)
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
Read Guarded memory(de)allocation.
#define BM_ELEM_CD_GET_BOOL(ele, offset)
#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_set(ele, hflag, val)
#define BM_elem_index_set(ele, index)
#define BM_elem_flag_test(ele, hflag)
#define BM_elem_flag_enable(ele, hflag)
#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)
BMesh const char void * data
BMVert * BM_mesh_active_vert_get(BMesh *bm)
void BM_face_select_set(BMesh *bm, BMFace *f, const bool select)
Select Face.
void BM_elem_select_set(BMesh *bm, BMElem *ele, const bool select)
BMFace * BM_mesh_active_face_get(BMesh *bm, const bool is_sloppy, const bool is_selected)
BMElem * BM_mesh_active_elem_get(BMesh *bm)
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_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)
bool BM_mesh_select_is_mixed(const BMesh *bm)
void BM_mesh_select_flush_from_verts(BMesh *bm, const bool select)
#define BM_select_history_store(bm, ele)
#define BM_select_history_remove(bm, ele)
void BM_mesh_elem_toolflags_clear(BMesh *bm)
void BM_mesh_elem_toolflags_ensure(BMesh *bm)
BMVert * BM_vert_at_index_find_or_table(BMesh *bm, const int index)
void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
BMEdge * BM_edge_at_index_find_or_table(BMesh *bm, const int index)
BMFace * BM_face_at_index_find_or_table(BMesh *bm, const int index)
BLI_INLINE BMFace * BM_face_at_index(BMesh *bm, const int index)
#define BMO_edge_flag_test(bm, e, oflag)
void BMO_pop(BMesh *bm)
BMESH OPSTACK POP.
#define BMO_edge_flag_set(bm, e, oflag, val)
void BMO_push(BMesh *bm, BMOperator *op)
BMESH OPSTACK PUSH.
#define BMO_elem_flag_enable(bm, ele, oflag)
void BM_face_calc_center_median_vcos(const BMesh *bm, const BMFace *f, float r_cent[3], const blender::Span< blender::float3 > vert_positions)
float BM_face_calc_area(const BMFace *f)
void BM_face_calc_center_median(const BMFace *f, float r_cent[3])
bool BM_edge_is_contiguous_loop_cd(const BMEdge *e, const int cd_loop_type, const int cd_loop_offset)
bool BM_edge_is_all_face_flag_test(const BMEdge *e, const char hflag, const bool respect_hide)
int BM_vert_edge_count_at_most(const BMVert *v, const int count_max)
int BM_mesh_calc_face_groups(BMesh *bm, int *r_groups_array, int(**r_group_index)[2], BMLoopFilterFunc filter_fn, BMLoopPairFilterFunc filter_pair_fn, void *user_data, const char hflag_test, const char htype_step)
bool BM_face_is_any_edge_flag_test(const BMFace *f, const char hflag)
bool BM_face_is_any_vert_flag_test(const BMFace *f, const char hflag)
bool BM_edge_loop_pair(BMEdge *e, BMLoop **r_la, BMLoop **r_lb)
bool BM_vert_is_all_edge_flag_test(const BMVert *v, const char hflag, const bool respect_hide)
bool BM_vert_is_manifold(const BMVert *v)
int BM_edge_face_count(const BMEdge *e)
bool BM_edge_is_any_vert_flag_test(const BMEdge *e, const char hflag)
float BM_edge_calc_length(const BMEdge *e)
bool BM_vert_is_all_face_flag_test(const BMVert *v, const char hflag, const bool respect_hide)
bool BM_edge_is_any_face_flag_test(const BMEdge *e, const char hflag)
BLI_INLINE bool BM_edge_is_contiguous(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
BLI_INLINE bool BM_edge_is_manifold(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
BLI_INLINE bool BM_edge_is_boundary(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
#define BM_edge_face_count_is_over(e, n)
BLI_INLINE BMVert * BM_edge_other_vert(BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
BLI_INLINE bool BM_edge_is_wire(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMLoop * l_b
ATTR_WARN_UNUSED_RESULT const BMVert * v
int BM_mesh_region_match(BMesh *bm, BMFace **faces_region, uint faces_region_len, ListBase *r_face_regions)
void BM_face_uvselect_set_pick(BMesh *bm, BMFace *f, bool select, const BMUVSelectPickParams ¶ms)
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_edge_uvselect_set_pick(BMesh *bm, BMEdge *e, bool select, const BMUVSelectPickParams ¶ms)
void BM_vert_uvselect_set_pick(BMesh *bm, BMVert *v, bool select, const BMUVSelectPickParams ¶ms)
void * BMW_begin(BMWalker *walker, void *start)
void BMW_init(BMWalker *walker, BMesh *bm, int type, short mask_vert, short mask_edge, short mask_face, BMWFlag flag, int layer)
Initialize Walker.
void BMW_end(BMWalker *walker)
End Walker.
void * BMW_step(BMWalker *walker)
Step Walker.
int BMW_current_depth(BMWalker *walker)
Walker Current Depth.
@ BMW_EDGELOOP_NONMANIFOLD
#define BMW_ITER(ele, walker, data)
BPy_StructRNA * depsgraph
static unsigned long seed
static AttributeOwner from_id(ID *id)
static std::optional< EditMeshSymmetryHelper > create_if_needed(Object *ob, uchar htype)
constexpr int64_t size() const
constexpr IndexRange index_range() const
constexpr bool is_empty() const
void append(const T &value)
IndexRange index_range() const
void reserve(const int64_t min_capacity)
Span< T > as_span() const
static wmOperatorStatus edbm_select_loose_exec(bContext *C, wmOperator *op)
static wmOperatorStatus edbm_select_similar_region_exec(bContext *C, wmOperator *op)
static void walker_select_count(BMEditMesh *em, int walkercode, void *start, int r_count_by_select[2])
BMVert * EDBM_vert_find_nearest_ex(ViewContext *vc, float *dist_px_manhattan_p, const bool use_select_bias, bool use_cycle, const Span< Base * > bases, uint *r_base_index)
void MESH_OT_select_less(wmOperatorType *ot)
bool EDBM_selectmode_toggle_multi(bContext *C, const short selectmode_toggle, const int action, const bool use_extend, const bool use_expand)
bool EDBM_unified_findnearest_from_raycast(ViewContext *vc, const Span< Base * > bases, bool use_boundary_vertices, bool use_boundary_edges, int *r_base_index_vert, int *r_base_index_edge, int *r_base_index_face, BMVert **r_eve, BMEdge **r_eed, BMFace **r_efa)
static BMFace * bm_step_over_shared_edge_to_next_selected_face_in_chain(BMFace *f_curr, BMFace *f_prev)
static void findnearestface__doClosest(void *user_data, BMFace *efa, const float screen_co[2], int index)
static void walker_deselect_nth(BMEditMesh *em, const CheckerIntervalParams *op_params, BMHeader *h_act)
static wmOperatorStatus edbm_select_by_attribute_exec(bContext *C, wmOperator *)
static void find_nearest_edge__doClosest(void *user_data, BMEdge *eed, const float screen_co_a[2], const float screen_co_b[2], int index)
static float bm_interior_face_group_calc_cost(ListBase *ls, const float *edge_lengths)
static wmOperatorStatus edbm_select_linked_pick_exec(bContext *C, wmOperator *op)
BMEdge * EDBM_edge_find_nearest(ViewContext *vc, float *dist_px_manhattan_p)
BMVert * EDBM_vert_find_nearest(ViewContext *vc, float *dist_px_manhattan_p)
static bool walker_select(BMEditMesh *em, int walkercode, void *start, const bool select)
static wmOperatorStatus edbm_select_mode_exec(bContext *C, wmOperator *op)
void MESH_OT_loop_to_region(wmOperatorType *ot)
static void walker_deselect_nth_edge_chain(BMEditMesh *em, const CheckerIntervalParams *op_params, BMEdge *e_start)
void MESH_OT_select_mode(wmOperatorType *ot)
void EDBM_select_toggle_all(BMEditMesh *em)
static bool edbm_deselect_nth(BMEditMesh *em, const CheckerIntervalParams *op_params)
static void select_linked_delimit_end(BMEditMesh *em)
void MESH_OT_select_similar_region(wmOperatorType *ot)
static void find_nearest_face_center__doZBuf(void *user_data, BMFace *efa, const float screen_co[2], int)
#define FIND_NEAR_SELECT_BIAS
static wmOperatorStatus edbm_select_by_pole_count_exec(bContext *C, wmOperator *op)
static bool unified_findnearest(ViewContext *vc, const Span< Base * > bases, int *r_base_index, BMVert **r_eve, BMEdge **r_eed, BMFace **r_efa)
BMEdge * EDBM_edge_find_nearest_ex(ViewContext *vc, float *dist_px_manhattan_p, float *r_dist_center_px_manhattan, const bool use_select_bias, bool use_cycle, BMEdge **r_eed_zbuf, const Span< Base * > bases, uint *r_base_index)
static wmOperatorStatus edbm_select_less_exec(bContext *C, wmOperator *op)
BMFace * EDBM_face_find_nearest_ex(ViewContext *vc, float *dist_px_manhattan_p, float *r_dist_center, const bool use_zbuf_single_px, const bool use_select_bias, bool use_cycle, BMFace **r_efa_zbuf, const Span< Base * > bases, uint *r_base_index)
void MESH_OT_select_linked_pick(wmOperatorType *ot)
static bool edbm_select_by_attribute_poll(bContext *C)
static bool is_count_a_match(const eElemCountType type, const int value_test, const int value_reference)
static int loop_find_region(BMLoop *l, int flag, GSet *visit_face_set, BMFace ***region_out)
void EDBM_select_swap(BMEditMesh *em)
static void mouse_mesh_loop_edge_ring(BMEditMesh *em, BMEdge *eed, bool select, bool select_clear)
static void walker_deselect_nth_face_chain(BMEditMesh *em, const CheckerIntervalParams *op_params, BMFace *f_start)
static wmOperatorStatus edbm_region_to_loop_exec(bContext *C, wmOperator *)
static void mouse_mesh_loop_face(BMEditMesh *em, BMEdge *eed, bool select, bool select_clear)
BMFace * EDBM_face_find_nearest(ViewContext *vc, float *dist_px_manhattan_p)
static bool mouse_mesh_loop(bContext *C, const int mval[2], bool extend, bool deselect, bool toggle, bool ring)
static wmOperatorStatus edbm_select_linked_flat_faces_exec(bContext *C, wmOperator *op)
static wmOperatorStatus edbm_select_linked_pick_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void MESH_OT_select_random(wmOperatorType *ot)
static int verg_radial(const void *va, const void *vb)
static void find_nearest_edge_center__doZBuf(void *user_data, BMEdge *eed, const float screen_co_a[2], const float screen_co_b[2], int)
static int loop_find_regions(BMEditMesh *em, const bool selbigger)
static wmOperatorStatus edbm_select_more_exec(bContext *C, wmOperator *op)
static wmOperatorStatus edbm_select_all_exec(bContext *C, wmOperator *op)
static BMVert * bm_step_to_next_selected_vert_in_chain(BMVert *v_curr, BMVert *v_prev)
void EDBM_select_mirrored(BMEditMesh *em, const Mesh *mesh, const int axis, const bool extend, int *r_totmirr, int *r_totfail)
void MESH_OT_select_nth(wmOperatorType *ot)
static wmOperatorStatus edbm_select_non_manifold_exec(bContext *C, wmOperator *op)
void MESH_OT_loop_multi_select(wmOperatorType *ot)
ViewContext em_setup_viewcontext(bContext *C)
void EDBM_selectmode_convert(BMEditMesh *em, const short selectmode_old, const short selectmode_new)
static bool bm_interior_loop_filter_fn(const BMLoop *l, void *)
static wmOperatorStatus edbm_select_axis_exec(bContext *C, wmOperator *op)
static void select_linked_delimit_validate(BMesh *bm, int *delimit)
static wmOperatorStatus edbm_faces_select_interior_exec(bContext *C, wmOperator *)
bool EDBM_unified_findnearest(ViewContext *vc, const Span< Base * > bases, int *r_base_index, BMVert **r_eve, BMEdge **r_eed, BMFace **r_efa)
static bool UNUSED_FUNCTION EDBM_select_mirrored_extend_all(Object *obedit, BMEditMesh *em)
static bool edbm_selectmode_sync_multi_ex(Span< Object * > objects)
void MESH_OT_select_loose(wmOperatorType *ot)
static bool select_linked_delimit_test(BMEdge *e, int delimit, const DelimitData *delimit_data)
bool EDBM_deselect_by_material(BMEditMesh *em, const short index, const bool select)
void MESH_OT_select_by_pole_count(wmOperatorType *ot)
void MESH_OT_select_by_attribute(wmOperatorType *ot)
static bool edbm_vert_or_edge_select_mode_poll(bContext *C)
void MESH_OT_edgering_select(wmOperatorType *ot)
static bool edbm_select_ungrouped_poll(bContext *C)
static void walker_deselect_nth_vertex_chain(BMEditMesh *em, const CheckerIntervalParams *op_params, BMVert *v_start)
static void edbm_select_linked_pick_ex(BMEditMesh *em, BMElem *ele, bool sel, int delimit)
void MESH_OT_select_face_by_sides(wmOperatorType *ot)
void MESH_OT_select_axis(wmOperatorType *ot)
static wmOperatorStatus edbm_select_face_by_sides_exec(bContext *C, wmOperator *op)
static wmOperatorStatus edbm_loop_multiselect_exec(bContext *C, wmOperator *op)
void MESH_OT_select_mirror(wmOperatorType *ot)
static wmOperatorStatus edbm_select_sharp_edges_exec(bContext *C, wmOperator *op)
static BMEdge * bm_step_over_vert_to_next_selected_edge_in_chain(const BMEdge *e_curr, BMVert *v)
static wmOperatorStatus edbm_select_mirror_exec(bContext *C, wmOperator *op)
static bool bm_verts_form_cyclic_chain(BMVert *v_start)
static void deselect_nth_active(BMEditMesh *em, BMVert **r_eve, BMEdge **r_eed, BMFace **r_efa)
void MESH_OT_faces_select_linked_flat(wmOperatorType *ot)
void MESH_OT_edges_select_sharp(wmOperatorType *ot)
static void mouse_mesh_loop_edge(BMEditMesh *em, BMEdge *eed, bool select, bool select_clear, bool select_cycle)
static int select_linked_delimit_default_from_op(wmOperator *op, const int select_mode)
bool EDBM_selectmode_disable_multi_ex(Scene *scene, const Span< Base * > bases, const short selectmode_disable, const short selectmode_fallback)
static wmOperatorStatus edbm_select_loop_invoke(bContext *C, wmOperator *op, const wmEvent *event)
bool EDBM_mesh_deselect_all_multi(bContext *C)
void EDBM_selectmode_set(BMEditMesh *em, const short selectmode)
static wmOperatorStatus edbm_select_random_exec(bContext *C, wmOperator *op)
static bool bm_edge_is_select_isolated(BMEdge *e)
void MESH_OT_select_interior_faces(wmOperatorType *ot)
bool EDBM_selectmode_disable_multi(bContext *C, const short selectmode_disable, const short selectmode_fallback)
void MESH_OT_select_linked(wmOperatorType *ot)
static wmOperatorStatus edbm_select_linked_exec(bContext *C, wmOperator *op)
static void select_linked_delimit_begin(BMesh *bm, int delimit)
static bool bm_edges_form_cyclic_chain(BMEdge *e_start)
static bool bm_interior_edge_is_manifold_except_face_index(BMEdge *e, int face_index, BMLoop *r_l_pair[2])
static void findnearestvert__doClosest(void *user_data, BMVert *eve, const float screen_co[2], int index)
void MESH_OT_select_all(wmOperatorType *ot)
void MESH_OT_select_more(wmOperatorType *ot)
#define FIND_NEAR_CYCLE_THRESHOLD_MIN
static std::string edbm_select_mode_get_description(bContext *, wmOperatorType *, PointerRNA *ptr)
bool EDBM_select_interior_faces(BMEditMesh *em)
void MESH_OT_region_to_loop(wmOperatorType *ot)
static void edbm_strip_selections(BMEditMesh *em)
void MESH_OT_loop_select(wmOperatorType *ot)
static wmOperatorStatus edbm_loop_to_region_exec(bContext *C, wmOperator *op)
static const EnumPropertyItem elem_count_compare_items[]
bool EDBM_selectmode_set_multi(bContext *C, const short selectmode)
static BMElem * edbm_select_id_bm_elem_get(const Span< Base * > bases, const uint sel_id, uint &r_base_index)
static bool bm_faces_form_cyclic_chain(BMFace *f_start)
static wmOperatorStatus edbm_select_nth_exec(bContext *C, wmOperator *op)
void MESH_OT_select_ungrouped(wmOperatorType *ot)
static wmOperatorStatus edbm_select_mode_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static std::optional< BMIterType > domain_to_iter_type(const blender::bke::AttrDomain domain)
bool EDBM_selectmode_disable(Scene *scene, BMEditMesh *em, const short selectmode_disable, const short selectmode_fallback)
bool EDBM_mesh_deselect_all_multi_ex(const Span< Base * > bases)
static wmOperatorStatus edbm_select_ungrouped_exec(bContext *C, wmOperator *op)
bool EDBM_select_pick(bContext *C, const int mval[2], const SelectPick_Params ¶ms)
bool EDBM_selectmode_set_multi_ex(Scene *scene, Span< Object * > objects, const short selectmode)
void MESH_OT_select_non_manifold(wmOperatorType *ot)
BMElem * EDBM_elem_from_selectmode(BMEditMesh *em, BMVert *eve, BMEdge *eed, BMFace *efa)
BMElem * EDBM_elem_from_index_any_multi(const Scene *scene, ViewLayer *view_layer, uint object_index, uint elem_index, Object **r_obedit)
int EDBM_elem_to_index_any_multi(const Scene *scene, ViewLayer *view_layer, BMEditMesh *em, BMElem *ele, int *r_object_index)
void * MEM_mallocN(size_t len, const char *str)
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
void base_activate(bContext *C, Base *base)
bool material_active_index_set(Object *ob, int index)
VecBase< float, 3 > float3
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value)
bool RNA_property_is_set(PointerRNA *ptr, PropertyRNA *prop)
void RNA_int_set(PointerRNA *ptr, const char *name, int value)
void RNA_property_enum_set(PointerRNA *ptr, PropertyRNA *prop, int value)
int RNA_int_get(PointerRNA *ptr, const char *name)
float RNA_float_get(PointerRNA *ptr, const char *name)
int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)
bool RNA_struct_property_is_set(PointerRNA *ptr, const char *identifier)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
void RNA_def_property_float_default(PropertyRNA *prop, float value)
PropertyRNA * RNA_def_float_rotation(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_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_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_enum_flag(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
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_flag(PropertyRNA *prop, PropertyFlag flag)
PropertyRNA * RNA_def_int(StructOrFunctionRNA *cont_, const char *identifier, const int default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
const EnumPropertyItem rna_enum_mesh_delimit_mode_items[]
const EnumPropertyItem rna_enum_axis_flag_xyz_items[]
const EnumPropertyItem rna_enum_axis_xyz_items[]
const EnumPropertyItem rna_enum_mesh_select_mode_items[]
const EnumPropertyItem rna_enum_transform_orientation_items[]
struct BMEditSelection * next
struct BMLoop * radial_next
bool uv_select_sync_valid
eCustomDataType cd_loop_type
float dist_center_px_manhattan
NearestEdgeUserData_Hit hit
NearestEdgeUserData_Hit hit_cycle
NearestFaceUserData_Hit hit
NearestFaceUserData_Hit hit_cycle
NearestVertUserData_Hit hit_cycle
NearestVertUserData_Hit hit
struct ToolSettings * toolsettings
wmEventModifierFlag modifier
struct ReportList * reports
bool WM_cursor_test_motion_and_update(const int mval[2])
void WM_main_add_notifier(uint type, void *reference)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
void WM_operator_properties_checker_interval_from_op(wmOperator *op, CheckerIntervalParams *op_params)
int WM_operator_properties_select_random_seed_increment_get(wmOperator *op)
void WM_operator_properties_select_random(wmOperatorType *ot)
void WM_operator_properties_select_all(wmOperatorType *ot)
void WM_operator_properties_checker_interval(wmOperatorType *ot, bool nth_can_disable)
bool WM_operator_properties_checker_interval_test(const CheckerIntervalParams *op_params, int depth)