11 # define _USE_MATH_DEFINES
67 #define USE_NET_ISLAND_CONNECT
69 #define KMAXDIST (10 * U.dpi_fac)
74 #define KNIFE_FLT_EPS 0.00001f
75 #define KNIFE_FLT_EPS_SQUARED (KNIFE_FLT_EPS * KNIFE_FLT_EPS)
76 #define KNIFE_FLT_EPSBIG 0.0005f
78 #define KNIFE_FLT_EPS_PX_VERT 0.5f
79 #define KNIFE_FLT_EPS_PX_EDGE 0.05f
80 #define KNIFE_FLT_EPS_PX_FACE 0.05f
82 #define KNIFE_DEFAULT_ANGLE_SNAPPING_INCREMENT 30.0f
83 #define KNIFE_MIN_ANGLE_SNAPPING_INCREMENT 0.0f
84 #define KNIFE_MAX_ANGLE_SNAPPING_INCREMENT 180.0f
232 #ifdef USE_NET_ISLAND_CONNECT
383 float lambda_best[2] = {-FLT_MAX, FLT_MAX};
387 float curr_cage_adjust[3];
396 for (i = 0; i < 4; i++) {
404 if (lambda_test < 0.0f) {
405 if (lambda_test > lambda_best[0]) {
407 lambda_best[0] = lambda_test;
411 if (lambda_test < lambda_best[1]) {
413 lambda_best[1] = lambda_test;
496 float numstr_size[2];
498 const float bg_margin = 4.0f *
U.dpi_fac;
499 const float font_size = 14.0f *
U.pixelsize;
500 const int distance_precision = 4;
507 BLI_snprintf(numstr,
sizeof(numstr),
"%.*f", distance_precision, cut_len);
526 posit[0] -= numstr_size[0] / 2.0f;
527 posit[1] -= numstr_size[1] / 2.0f;
530 float color_back[4] = {0.0f, 0.0f, 0.0f, 0.5f};
535 posit[0] - bg_margin,
536 posit[1] - bg_margin,
537 posit[0] + bg_margin + numstr_size[0],
538 posit[1] + bg_margin + numstr_size[1]);
556 const float start[3],
559 const float start_ss[2],
560 const float mid_ss[2],
561 const float end_ss[2],
565 const int arc_steps = 24;
566 const float arc_size = 64.0f *
U.dpi_fac;
567 const float bg_margin = 4.0f *
U.dpi_fac;
568 const float cap_size = 4.0f *
U.dpi_fac;
569 const float font_size = 14.0f *
U.pixelsize;
570 const int angle_precision = 3;
589 const float inverse_average_scale = 1 /
593 const float px_scale =
594 3.0f * inverse_average_scale *
614 for (
int j = 0; j <= arc_steps; j++) {
637 float numstr_size[2];
654 posit[0] = mid_ss[0] + (cap_size * 2.0f);
655 posit[1] = mid_ss[1] - (numstr_size[1] / 2.0f);
658 float color_back[4] = {0.0f, 0.0f, 0.0f, 0.5f};
663 posit[0] - bg_margin,
664 posit[1] - bg_margin,
665 posit[0] + bg_margin + numstr_size[0],
666 posit[1] + bg_margin + numstr_size[1]);
697 float min_angle = FLT_MAX;
704 if (tempkfe->
v1 != kfv) {
705 tempkfv = tempkfe->
v1;
708 tempkfv = tempkfe->
v2;
711 if (
angle < min_angle) {
745 if (angle1 < angle2) {
765 float min_angle = FLT_MAX;
772 if (kfe->
v1 != kfv) {
786 if (tempkfe->
v1 != kfv) {
787 tempkfv = tempkfe->
v1;
790 tempkfv = tempkfe->
v2;
793 if (
angle < min_angle) {
835 if (angle1 < angle2) {
898 if (kcd->
mode == MODE_DRAGGING) {
1019 int i, snapped_verts_count, other_verts_count;
1028 for (i = 0, snapped_verts_count = 0, other_verts_count = 0; i < kcd->
totlinehit; i++, lh++) {
1044 if (snapped_verts_count > 0) {
1052 if (other_verts_count > 0) {
1065 if (kcd->
mode == MODE_DRAGGING) {
1096 int available_len =
sizeof(buf);
1098 #define WM_MODALKEY(_id) \
1099 WM_modalkeymap_operator_items_to_string_buf( \
1100 op->type, (_id), true, UI_MAX_SHORTCUT_STR, &available_len, &p)
1105 TIP_(
"%s: confirm, %s: cancel, %s: undo, "
1106 "%s: start/define cut, %s: close cut, %s: new cut, "
1107 "%s: midpoint snap (%s), %s: ignore snap (%s), "
1108 "%s: angle constraint %.2f(%.2f) (%s%s%s%s), %s: cut through (%s), "
1109 "%s: panning, %s%s%s: orientation lock (%s), "
1110 "%s: distance/angle measurements (%s), "
1164 int tri_index_buf[3])
1170 for (
int i = 0; i < 3; i++) {
1173 return tri_index_buf;
1184 for (
int i = 0; i < 3; i++) {
1196 for (
int i = 0; i < 3; i++) {
1232 const float epsilon = FLT_EPSILON * 2.0f;
1237 bool test_fn_ret =
false;
1245 for (
int i = 0; i < em->
tottri; i++) {
1247 if (f_test != f_test_prev) {
1248 test_fn_ret = test_fn(f_test);
1249 f_test_prev = f_test;
1257 tottri += ob_tottri;
1263 test_fn_ret =
false;
1277 for (
int i = 0; i < em->
tottri; i++) {
1279 f_test = looptris[i][0]->
f;
1280 if (f_test != f_test_prev) {
1281 test_fn_ret = test_fn(f_test);
1282 f_test_prev = f_test;
1289 float tri_cos[3][3];
1334 if (index < tottri) {
1346 float tri_cos[3][3];
1348 isect = (ray->
radius > 0.0f ?
1351 #ifdef USE_KDOPBVH_WATERTIGHT
1358 if (isect && dist < hit->dist) {
1390 const float dist = r_dist ? *r_dist : FLT_MAX;
1397 if (hit.
index != -1 && hit.
dist != dist) {
1402 float tri_cos[3][3];
1433 bool (*filter_cb)(
BMFace *f,
void *userdata),
1434 void *filter_userdata)
1441 const float dist = r_dist ? *r_dist : FLT_MAX;
1451 if (hit.
index != -1 && hit.
dist != dist) {
1456 float tri_cos[3][3];
1491 const float mval[2],
1494 float r_origin_ofs[3])
1507 float origin_ofs[3];
1508 float ray[3], ray_normal[3];
1521 bool v1_inside, v2_inside;
1522 bool v1_inface, v2_inface;
1525 if (!f || !
v1 || !
v2) {
1538 v1_inface = (l1 !=
NULL);
1539 v2_inface = (l2 !=
NULL);
1544 if ((v1_inface && v2_inside) || (v2_inface && v1_inside) || (v1_inside && v2_inside)) {
1548 if (v1_inface && v2_inface) {
1582 if (r_kfe || ele_test ==
NULL) {
1583 if (kfv->
v ==
NULL) {
1598 if (ele_test ==
NULL) {
1605 if (ele_test ==
NULL) {
1655 for (ref1 = lb->
first; ref1; ref1 = ref1->
next) {
1656 if (ref1->
ref == ref) {
1694 for (ref1 = faces1->
first; ref1; ref1 = ref1->
next) {
1695 for (ref2 = faces2->
first; ref2; ref2 = ref2->
next) {
1696 if (ref1->
ref == ref2->
ref) {
1733 const float *cageco;
1820 const float cageco[3],
1827 newkfe->
v1 = kfe->
v1;
1849 kfe->
v1 = newkfe->
v2;
1881 kfe->
v1 = newkfe->
v1;
1903 float origin[3], origin_ofs[3];
1940 if (lh1->
l < lh2->
l) {
1943 if (lh1->
l > lh2->
l) {
1946 if (lh1->
m < lh2->
m) {
1949 if (lh1->
m > lh2->
m) {
1952 if (lh1->
v < lh2->
v) {
1955 if (lh1->
v > lh2->
v) {
1968 bool is_double =
false;
1982 for (
int i = 0; i < n; i++) {
1984 if (lhi->
v ==
NULL) {
1988 for (
int j = i - 1; j >= 0; j--) {
1995 if (lhi->
kfe == lhj->
kfe) {
2000 for (
int j = i + 1; j < n; j++) {
2005 if ((lhj->
kfe && (lhi->
kfe == lhj->
kfe)) || (lhi->
v == lhj->
v)) {
2019 if (lhj->
l == -1.0f) {
2024 if (lhi->
l == -1.0f) {
2026 memcpy(&linehits[i], &linehits[j],
sizeof(
KnifeLineHit));
2030 memcpy(&linehits[i + 1], &linehits[j],
sizeof(
KnifeLineHit));
2065 if (lh->
v && lh->
v->
v) {
2072 else if ((lh->
kfe && lh->
kfe->
e)) {
2091 if ((lh1->
v && lh1->
v == lh2->
v) || (lh1->
kfe && lh1->
kfe == lh2->
kfe)) {
2096 if ((lh1->
v && lh2->
v) && (lh1->
v->
v && lh2->
v && lh2->
v->
v) &&
2106 if ((lh1->
v && !lh1->
kfe) && (lh2->
v && !lh2->
kfe)) {
2119 else if (lh1->
kfe) {
2137 else if (lh2->
kfe) {
2174 for (
r = hits->
first;
r->next;
r =
r->next) {
2194 for (ref = kfedges->
first; ref; ref = ref->
next) {
2195 bool is_new_edge =
false;
2202 if (kfe->
e ==
NULL) {
2203 if (kfe->
v1->
v && kfe->
v2->
v) {
2234 kfe_array[i] = is_new_edge ? kfe : 0;
2235 edge_array[i] = kfe->
e;
2241 const int edge_array_len_orig = i;
2244 #ifdef USE_NET_ISLAND_CONNECT
2245 uint edge_array_holes_len;
2246 BMEdge **edge_array_holes;
2254 &edge_array_holes_len)) {
2256 for (i = edge_array_len; i < edge_array_holes_len; i++) {
2261 edge_array_len = edge_array_holes_len;
2262 edge_array = edge_array_holes;
2278 for (i = 0; i < edge_array_len_orig; i++) {
2279 if (kfe_array[i] ==
NULL) {
2284 kfe_array[i]->
e =
NULL;
2288 #ifdef USE_NET_ISLAND_CONNECT
2300 const float *co = co_p;
2388 for (ref = list->
first; ref; ref = ref->
next) {
2532 BLI_assert(index >= 0 && index < em->tottri);
2534 for (i = index - 1; i >= 0; i--) {
2573 const float face_tol_sq,
2575 float hit_cageco[3])
2581 float tri_norm[3], tri_plane[4];
2582 float se1[2], se2[2];
2595 for (; tri_i < tottri; tri_i++) {
2596 float tri_cos[3][3];
2597 float ray_tri_uv[2];
2600 if (tri[0]->f != f) {
2622 for (ref = list->
first; ref; ref = ref->
next) {
2630 if (d < face_tol_sq) {
2661 for (
int i = 0; i < em->
bm->
totvert; i++) {
2683 const float *co11, *co12, *co21, *co22;
2759 float view[3], p_ofs[3];
2775 float view_clip[2][3];
2786 dist =
len_v3v3(p_ofs, view_clip[1]);
2843 float v1[3],
v2[3], v3[3], v4[3], s1[2], s2[2];
2857 float s[2], se1[2], se2[2], sint[2];
2859 float d1, d2, lambda;
2860 float vert_tol, vert_tol_sq;
2861 float line_tol, line_tol_sq;
2862 float face_tol, face_tol_sq;
2911 float v1_v2[3], v1_v3[3];
2936 for (i = 0,
result = results; i < tot; i++,
result++) {
2940 if (*
result >= 0 && *result < em->tottri) {
2963 for (ref = list->
first; ref; ref = ref->
next) {
2993 vert_tol = line_tol = face_tol = 0.5f;
2996 vert_tol_sq = vert_tol * vert_tol;
2997 line_tol_sq = line_tol * line_tol;
2998 face_tol_sq = face_tol * face_tol;
3007 bool kfv_is_in_cut =
false;
3014 kfv_is_in_cut =
true;
3019 if ((d <= vert_tol_sq) &&
3021 kfv_is_in_cut =
true;
3025 if (kfv_is_in_cut) {
3026 memset(&hit, 0,
sizeof(hit));
3075 if (isect_kind == -1) {
3089 if (isect_kind == 1) {
3092 if (!(d1 <= line_tol || d2 <= line_tol ||
fabsf(d1 - d2) <= line_tol)) {
3093 float p_cage[3], p_cage_tmp[3];
3102 memset(&hit, 0,
sizeof(hit));
3128 if (use_hit_prev || use_hit_curr) {
3131 float p[3], p_cage[3];
3134 ob = kcd->
objects[base_index];
3139 memset(&hit, 0,
sizeof(hit));
3154 memset(&hit, 0,
sizeof(hit));
3217 float origin_ofs[3];
3218 float ray[3], ray_normal[3];
3236 *r_ob = kcd->
objects[*r_base_index];
3273 const float cageco[3])
3275 const float radius_sq = radius * radius;
3285 for (ref = list->
first; ref; ref = ref->
next) {
3293 for (i = 0; i < 2; i++) {
3304 if (dis_sq < radius_sq) {
3343 const float kfv1_sco[2],
3344 const float kfv2_sco[2],
3359 if (dis_sq < *r_dist_sq) {
3360 *r_dist_sq = dis_sq;
3379 float v1_ss[3], v2_ss[3];
3408 const float maxdist_sq = maxdist * maxdist;
3413 float dis_sq, curdis_sq = maxdist_sq;
3419 for (ref = list->
first; ref; ref = ref->
next) {
3421 float kfv1_sco[2], kfv2_sco[2], test_cagep[3];
3435 (kcd->
mode == MODE_DRAGGING)) {
3443 if (dis_sq < curdis_sq) {
3509 const float maxdist_sq = maxdist * maxdist;
3511 float cur_kfv_sco[2];
3512 float dis_sq, curdis_sq = FLT_MAX;
3516 for (
int i = 0; i < 2; i++) {
3532 if (dis_sq < curdis_sq && dis_sq < maxdist_sq) {
3557 static float snap_v2_angle(
float r[2],
const float v[2],
const float v_ref[2],
float angle_snap)
3561 float angle, angle_delta;
3567 angle_delta = (roundf(
angle / angle_snap) * angle_snap) -
angle;
3571 return angle + angle_delta;
3577 const float dvec_ref[2] = {1.0f, 0.0f};
3578 float dvec[2], dvec_snap[2];
3608 float r[3],
const float v[3],
const float v_ref[3],
const float plane_no[3],
float snap_step)
3611 float angle, angle_delta;
3614 angle_delta = (roundf(
angle / snap_step) * snap_step) -
angle;
3618 return angle + angle_delta;
3631 float curr_origin[3];
3632 float curr_origin_ofs[3];
3633 float curr_ray[3], curr_ray_normal[3];
3634 float curr_co[3], curr_cage[3];
3641 sub_v3_v3v3(curr_ray, curr_origin_ofs, curr_origin);
3645 kcd, curr_origin, curr_ray_normal, 0.0f,
NULL, curr_co, curr_cage,
NULL);
3705 float prev_origin[3];
3706 float prev_origin_ofs[3];
3707 float prev_ray[3], prev_ray_normal[3];
3708 float prev_co[3], prev_cage[3];
3712 sub_v3_v3v3(prev_ray, prev_origin_ofs, prev_origin);
3717 kcd, prev_origin, prev_ray_normal, 0.0f,
NULL, prev_co, prev_cage,
NULL);
3720 if (!fprev || fprev != fcurr) {
3747 float rotated_vec[3];
3767 float curr_origin[3];
3768 float curr_origin_ofs[3];
3769 float curr_ray[3], curr_ray_normal[3];
3770 float curr_co[3], curr_cage[3];
3773 sub_v3_v3v3(curr_ray, curr_origin_ofs, curr_origin);
3777 kcd, curr_origin, curr_ray_normal, 0.0f,
NULL, curr_co, curr_cage,
NULL);
3822 float curr_cage_adjusted[3];
3833 const short orientation_type = scene_orientation ? scene_orientation :
3838 scene, view_layer, kcd->
vc.
v3d, rv3d, obedit, obedit, orientation_type, pivot_point, mat);
3846 for (
int i = 0; i <= 2; i++) {
3849 co[2][i] = co[0][i];
3858 float curr_screenspace[2];
3859 float prev_screenspace[2];
3889 if (kcd->
mode == MODE_DRAGGING) {
3952 for (
int i = 0; i < undo->
splits; i++) {
3958 for (
int i = 0; i < undo->
cuts; i++) {
3976 if (!
v1->is_invalid && !
v1->is_splitting) {
3977 v1->is_invalid =
true;
3979 for (ref =
v1->edges.first; ref; ref = ref->
next) {
3982 v1->is_invalid =
false;
3989 if (!
v2->is_invalid && !
v2->is_splitting) {
3990 v2->is_invalid =
true;
3992 for (ref =
v2->edges.first; ref; ref = ref->
next) {
3995 v2->is_invalid =
false;
4003 if (kcd->
mode == MODE_DRAGGING) {
4023 bool use_tri_indices)
4033 obinfo->
em = em_eval;
4037 if (use_tri_indices) {
4040 for (
int i = 0; i < em_eval->
tottri; i++) {
4041 BMLoop **tri = looptris[i];
4087 const int objects_len,
4088 const bool only_select,
4089 const bool cut_through,
4091 const int visible_measurements,
4092 const int angle_snapping,
4093 const float angle_snapping_increment,
4094 const bool is_interactive)
4098 bool use_tri_indices = !is_interactive;
4144 #ifdef USE_NET_ISLAND_CONNECT
4171 if (is_interactive) {
4219 #ifdef USE_NET_ISLAND_CONNECT
4270 float origin_ofs[3];
4283 if (kcd->
mode == MODE_DRAGGING) {
4301 const float mval[2] = {
UNPACK2(mval_i)};
4326 .calc_looptri = true,
4327 .calc_normals = true,
4328 .is_destructive = true,
4378 "CYCLE_ANGLE_SNAP_EDGE",
4380 "Cycle Angle Snapping Relative Edge",
4384 "SHOW_DISTANCE_ANGLE_TOGGLE",
4386 "Toggle Distance and Angle Measurements",
4432 bool do_refresh =
false;
4444 if (kcd->
mode == MODE_PANNING) {
4448 bool handled =
false;
4449 float snapping_increment_temp;
4475 switch (event->
val) {
4485 const bool changed = (kcd->
totkvert != 0);
4613 kcd->
mode = MODE_IDLE;
4622 if (kcd->
mode == MODE_DRAGGING) {
4625 else if (kcd->
mode != MODE_PANNING) {
4627 kcd->
mode = MODE_DRAGGING;
4651 if (kcd->
mode == MODE_DRAGGING) {
4670 kcd->
mode = MODE_IDLE;
4676 if (kcd->
mode != MODE_PANNING) {
4678 kcd->
mode = MODE_PANNING;
4690 switch (event->
type) {
4699 if (kcd->
mode != MODE_PANNING) {
4773 if (kcd->
mode == MODE_DRAGGING) {
4796 const int visible_measurements =
RNA_enum_get(op->
ptr,
"visible_measurements");
4799 const float angle_snapping_increment =
RAD2DEGF(
4817 visible_measurements,
4819 angle_snapping_increment,
4825 bool faces_selected =
false;
4831 faces_selected =
true;
4835 if (!faces_selected) {
4850 if (wait_for_input ==
false) {
4870 ot->
name =
"Knife Topology Tool";
4900 "Angle snapping relative to the previous cut edge"},
4905 "use_occlude_geometry",
4908 "Only cut the front most geometry");
4913 "visible_measurements",
4914 visible_measurements_items,
4917 "Visible distance and angle measurements");
4920 angle_snapping_items,
4923 "Angle snapping mode");
4926 "angle_snapping_increment",
4930 "Angle Snap Increment",
4931 "The angle snap increment used when in constrained angle mode",
4968 const int objects_len,
4977 const bool only_select =
false;
4978 const bool is_interactive =
false;
4979 const bool xray =
false;
4993 visible_measurements,
4995 angle_snapping_increment,
5013 for (i = 0; i < mval_tot; i++) {
5017 kcd->
mode = MODE_DRAGGING;
5024 kcd->
mode = MODE_IDLE;
5055 #define F_ISECT_IS_UNKNOWN(f) BM_elem_flag_test(BM_FACE_FIRST_LOOP(f), BM_ELEM_TAG)
5056 #define F_ISECT_SET_UNKNOWN(f) BM_elem_flag_enable(BM_FACE_FIRST_LOOP(f), BM_ELEM_TAG)
5057 #define F_ISECT_SET_OUTSIDE(f) BM_elem_flag_disable(BM_FACE_FIRST_LOOP(f), BM_ELEM_TAG)
5076 float cent[3], cent_ss[2];
5089 keep_search =
false;
5098 BMLoop *l_iter = l_first;
5105 if (l_radial_iter != l_iter) {
5110 }
while ((l_radial_iter = l_radial_iter->
radial_next) != l_iter &&
5114 }
while ((l_iter = l_iter->
next) != l_first && (found ==
false));
5117 float cent[3], cent_ss[2];
5132 }
while (keep_search);
5134 #undef F_ISECT_IS_UNKNOWN
5135 #undef F_ISECT_SET_UNKNOWN
5136 #undef F_ISECT_SET_OUTSIDE
typedef float(TangentPoint)[2]
struct wmWindow * CTX_wm_window(const bContext *C)
float(* BKE_editmesh_vert_coords_alloc(struct Depsgraph *depsgraph, struct BMEditMesh *em, struct Scene *scene, struct Object *ob, int *r_vert_len))[3]
BMEditMesh * BKE_editmesh_from_object(struct Object *ob)
Return the BMEditMesh for a given object.
#define BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, v3d, r_len)
void BKE_report(ReportList *reports, eReportType type, const char *message)
int BKE_scene_orientation_get_index(struct Scene *scene, int slot_index)
size_t BKE_unit_value_as_string(char *str, int len_max, double value, int prec, int type, const struct UnitSettings *settings, bool pad)
void BLF_color3ubv(int fontid, const unsigned char rgb[3])
void BLF_width_and_height(int fontid, const char *str, size_t str_len, float *r_width, float *r_height) ATTR_NONNULL()
void BLF_disable(int fontid, int option)
void BLF_rotation(int fontid, float angle)
void BLF_draw(int fontid, const char *str, size_t str_len) ATTR_NONNULL(2)
void BLF_enable(int fontid, int option)
void BLF_size(int fontid, float size, int dpi)
void BLF_position(int fontid, float x, float y, float z)
#define BLI_array_alloca(arr, realsize)
A (mainly) macro array library.
#define BLI_array_append(arr, item)
#define BLI_array_declare(arr)
#define BLI_array_len(arr)
BLI_INLINE void * BLI_ghashIterator_getKey(GHashIterator *ghi) ATTR_WARN_UNUSED_RESULT
BLI_INLINE void * BLI_ghashIterator_getValue(GHashIterator *ghi) ATTR_WARN_UNUSED_RESULT
#define GHASH_ITER(gh_iter_, ghash_)
GSet * BLI_gset_ptr_new(const char *info)
void BLI_gset_clear(GSet *gs, GSetKeyFreeFP keyfreefp)
unsigned int BLI_gset_len(const GSet *gs) ATTR_WARN_UNUSED_RESULT
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_insert(GHash *gh, void *key, void *val)
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
void BLI_gset_free(GSet *gs, GSetKeyFreeFP keyfreefp)
GHash * BLI_ghash_ptr_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
bool BLI_gset_add(GSet *gs, void *key)
void BLI_bvhtree_balance(BVHTree *tree)
BVHTree * BLI_bvhtree_new(int maxsize, float epsilon, char tree_type, char axis)
void BLI_bvhtree_free(BVHTree *tree)
void BLI_bvhtree_insert(BVHTree *tree, int index, const float co[3], int numpoints)
int * BLI_bvhtree_intersect_plane(BVHTree *tree, float plane[4], uint *r_intersect_num)
int BLI_bvhtree_ray_cast(BVHTree *tree, const float co[3], const float dir[3], float radius, BVHTreeRayHit *hit, BVHTree_RayCastCallback callback, void *userdata)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
int BLI_listbase_count_at_most(const struct ListBase *listbase, int count_max) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void BLI_INLINE bool BLI_listbase_is_single(const struct ListBase *lb)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void void void BLI_listbase_sort_r(ListBase *listbase, int(*cmp)(void *, const void *, const void *), void *thunk) ATTR_NONNULL(1
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define BLI_ASSERT_UNIT_V2(v)
MINLINE float min_ff(float a, float b)
MINLINE float min_fff(float a, float b, float c)
void rgba_uchar_to_float(float r_col[4], const unsigned char col_ub[4])
void plane_from_point_normal_v3(float r_plane[4], const float plane_co[3], const float plane_no[3])
bool clip_segment_v3_plane_n(const float p1[3], const float p2[3], const float plane_array[][4], int plane_num, float r_p1[3], float r_p2[3])
bool isect_ray_plane_v3(const float ray_origin[3], const float ray_direction[3], const float plane[4], float *r_lambda, bool clip)
int isect_line_line_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3], float r_i1[3], float r_i2[3])
float dist_squared_to_plane_v3(const float p[3], const float plane[4])
void transform_point_by_seg_v3(float p_dst[3], const float p_src[3], const float l_dst_p1[3], const float l_dst_p2[3], const float l_src_p1[3], const float l_src_p2[3])
bool isect_ray_tri_v3(const float ray_origin[3], const float ray_direction[3], const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float r_uv[2])
bool isect_ray_tri_watertight_v3(const float ray_origin[3], const struct IsectRayPrecalc *isect_precalc, const float v0[3], const float v1[3], const float v2[3], float *r_dist, float r_uv[2])
float line_point_factor_v2(const float p[2], const float l1[2], const float l2[2])
float closest_to_line_segment_v2(float r_close[2], const float p[2], const float l1[2], const float l2[2])
float line_point_factor_v3(const float p[3], const float l1[3], const float l2[3])
int isect_line_line_v2_point(const float v0[2], const float v1[2], const float v2[2], const float v3[2], float r_vi[2])
float closest_to_line_v2(float r_close[2], const float p[2], const float l1[2], const float l2[2])
bool isect_line_plane_v3(float r_isect_co[3], const float l1[3], const float l2[3], const float plane_co[3], const float plane_no[3]) ATTR_WARN_UNUSED_RESULT
float normal_tri_v3(float n[3], const float v1[3], const float v2[3], const float v3[3])
bool isect_ray_tri_epsilon_v3(const float ray_origin[3], const float ray_direction[3], const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float r_uv[2], float epsilon)
bool isect_point_poly_v2(const float pt[2], const float verts[][2], unsigned int nr, bool use_holes)
void planes_from_projmat(const float mat[4][4], float left[4], float right[4], float bottom[4], float top[4], float near[4], float far[4])
int isect_seg_seg_v2_point_ex(const float v0[2], const float v1[2], const float v2[2], const float v3[2], float endpoint_bias, float vi[2])
float dist_squared_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2])
void mul_project_m4_v3(const float M[4][4], float vec[3])
void mul_v3_project_m4_v3(float r[3], const float mat[4][4], const float vec[3])
void mul_m3_m3_pre(float R[3][3], const float A[3][3])
void mul_v2_m2v2(float r[2], const float M[2][2], const float v[2])
void mul_m4_v3(const float M[4][4], float r[3])
void mul_transposed_mat3_m4_v3(const float M[4][4], float r[3])
void mul_v3_m4v3(float r[3], const float M[4][4], const float v[3])
bool invert_m3(float R[3][3])
void axis_angle_to_quat(float r[4], const float axis[3], float angle)
void mul_qt_v3(const float q[4], float r[3])
void angle_to_mat2(float R[2][2], float angle)
MINLINE bool compare_v3v3(const float a[3], const float b[3], float limit) ATTR_WARN_UNUSED_RESULT
void rotate_v3_v3v3fl(float r[3], const float p[3], const float axis[3], float angle)
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
void minmax_v3v3_v3(float min[3], float max[3], const float vec[3])
MINLINE float len_squared_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE float normalize_v3(float r[3])
MINLINE void sub_v3_v3(float r[3], const float a[3])
MINLINE float len_squared_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void negate_v3_v3(float r[3], const float a[3])
void project_plane_normalized_v3_v3v3(float out[3], const float p[3], const float v_plane[3])
void interp_v3_v3v3(float r[3], const float a[3], const float b[3], float t)
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
float angle_signed_on_axis_v3v3_v3(const float v1[3], const float v2[3], const float axis[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float dot_m4_v3_row_z(const float M[4][4], const float a[3]) ATTR_WARN_UNUSED_RESULT
float angle_signed_v2v2(const float v1[2], const float v2[2]) ATTR_WARN_UNUSED_RESULT
void mid_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE float normalize_v3_v3(float r[3], const float a[3])
MINLINE void add_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE void zero_v2(float r[2])
MINLINE bool equals_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
void mid_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE bool is_zero_v2(const float a[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f)
MINLINE float len_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void zero_v3(float r[3])
float angle_v3v3v3(const float a[3], const float b[3], const float c[3]) ATTR_WARN_UNUSED_RESULT
float angle_normalized_v3v3(const float v1[3], const float v2[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void add_v3_v3(float r[3], const float a[3])
MINLINE float normalize_v2_v2(float r[2], const float a[2])
void interp_v3_v3v3v3_uv(float p[3], const float v1[3], const float v2[3], const float v3[3], const float uv[2])
void BLI_memarena_free(struct MemArena *ma) ATTR_NONNULL(1)
struct 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_alloc(struct MemArena *ma, size_t size) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC ATTR_ALLOC_SIZE(2)
void void BLI_memarena_clear(MemArena *ma) ATTR_NONNULL(1)
void BLI_mempool_iternew(BLI_mempool *pool, BLI_mempool_iter *iter) ATTR_NONNULL()
void * BLI_mempool_iterstep(BLI_mempool_iter *iter) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
int BLI_mempool_len(const BLI_mempool *pool) ATTR_NONNULL(1)
BLI_mempool * BLI_mempool_create(unsigned int esize, unsigned int elem_num, unsigned int pchunk, unsigned int flag) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL
void BLI_mempool_destroy(BLI_mempool *pool) ATTR_NONNULL(1)
void * BLI_mempool_calloc(BLI_mempool *pool) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(1)
void ** BLI_smallhash_iternew_p(const SmallHash *sh, SmallHashIter *iter, uintptr_t *key) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
void * BLI_smallhash_iternext(SmallHashIter *iter, uintptr_t *key) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
bool BLI_smallhash_haskey(const SmallHash *sh, uintptr_t key) ATTR_NONNULL(1)
void BLI_smallhash_init(SmallHash *sh) ATTR_NONNULL(1)
void ** BLI_smallhash_iternext_p(SmallHashIter *iter, uintptr_t *key) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
void BLI_smallhash_insert(SmallHash *sh, uintptr_t key, void *item) ATTR_NONNULL(1)
void BLI_smallhash_release(SmallHash *sh) ATTR_NONNULL(1)
void * BLI_smallhash_lookup(const SmallHash *sh, uintptr_t key) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
bool BLI_smallhash_reinsert(SmallHash *sh, uintptr_t key, void *item) ATTR_NONNULL(1)
void * BLI_smallhash_iternew(const SmallHash *sh, SmallHashIter *iter, uintptr_t *key) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
void BLI_stack_pop(BLI_Stack *stack, void *dst) ATTR_NONNULL()
void * BLI_stack_push_r(BLI_Stack *stack) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void * BLI_stack_peek(BLI_Stack *stack) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BLI_stack_push(BLI_Stack *stack, const void *src) ATTR_NONNULL()
bool BLI_stack_is_empty(const BLI_Stack *stack) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BLI_stack_free(BLI_Stack *stack) ATTR_NONNULL()
void BLI_stack_discard(BLI_Stack *stack) ATTR_NONNULL()
#define BLI_stack_new(esize, descr)
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
#define UNUSED_FUNCTION(x)
#define INIT_MINMAX(min, max)
#define POINTER_FROM_INT(i)
#define UNUSED_VARS_NDEBUG(...)
#define POINTER_AS_INT(i)
struct ID * DEG_get_evaluated_id(const struct Depsgraph *depsgraph, struct ID *id)
Object is a sort of wrapper for general info.
#define RV3D_CLIPPING_ENABLED(v3d, rv3d)
@ OP_IS_MODAL_CURSOR_REGION
void EDBM_update(struct Mesh *me, const struct EDBMUpdate_Params *params)
void em_setup_viewcontext(struct bContext *C, struct ViewContext *vc)
struct BMFace * EDBM_face_find_nearest(struct ViewContext *vc, float *dist_px_manhattan_p)
void EDBM_flag_disable_all(struct BMEditMesh *em, char hflag)
void EDBM_selectmode_flush(struct BMEditMesh *em)
bool ED_operator_editmesh_view3d(struct bContext *C)
void ED_region_tag_redraw(struct ARegion *region)
void ED_workspace_status_text(struct bContext *C, const char *str)
#define REGION_DRAW_POST_VIEW
void * ED_region_draw_cb_activate(struct ARegionType *art, void(*draw)(const struct bContext *, struct ARegion *, void *), void *customdata, int type)
bool ED_region_draw_cb_exit(struct ARegionType *art, void *handle)
bool ED_view3d_win_to_segment_clipped(const struct Depsgraph *depsgraph, const struct ARegion *region, const struct View3D *v3d, const float mval[2], float r_ray_start[3], float r_ray_end[3], bool do_clip_planes)
bool ED_view3d_clip_range_get(const struct Depsgraph *depsgraph, const struct View3D *v3d, const struct RegionView3D *rv3d, float *r_clipsta, float *r_clipend, bool use_ortho_factor)
eV3DProjStatus ED_view3d_project_float_global(const struct ARegion *region, const float co[3], float r_co[2], eV3DProjTest flag)
float ED_view3d_pixel_size_no_ui_scale(const struct RegionView3D *rv3d, const float co[3])
bool ED_view3d_unproject_v3(const struct ARegion *region, float regionx, float regiony, float regionz, float world[3])
bool ED_view3d_clipping_test(const struct RegionView3D *rv3d, const float co[3], bool is_local)
void ED_view3d_win_to_3d(const struct View3D *v3d, const struct ARegion *region, const float depth_pt[3], const float mval[2], float r_out[3])
void ED_view3d_init_mats_rv3d(const struct Object *ob, struct RegionView3D *rv3d)
NSNotificationCenter * center
void GPU_batch_draw_range(GPUBatch *batch, int v_first, int v_count)
void GPU_batch_discard(GPUBatch *)
void GPU_batch_program_set_builtin(GPUBatch *batch, eGPUBuiltinShader shader_id)
GPUBatch * GPU_batch_create_ex(GPUPrimType prim, GPUVertBuf *vert, GPUIndexBuf *elem, eGPUBatchFlag owns_flag)
void GPU_batch_draw(GPUBatch *batch)
#define GPU_batch_uniform_4fv(batch, name, val)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble GLdouble r _GL_VOID_RET _GL_VOID GLfloat GLfloat r _GL_VOID_RET _GL_VOID GLint GLint r _GL_VOID_RET _GL_VOID GLshort GLshort r _GL_VOID_RET _GL_VOID GLdouble GLdouble r
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
void GPU_matrix_pop(void)
void GPU_matrix_pop_projection(void)
void GPU_matrix_push(void)
void GPU_polygon_offset(float viewdist, float dist)
void GPU_matrix_identity_set(void)
void GPU_matrix_push_projection(void)
@ GPU_SHADER_2D_UNIFORM_COLOR
@ GPU_SHADER_3D_UNIFORM_COLOR
void GPU_blend(eGPUBlend blend)
void GPU_line_width(float width)
void GPU_point_size(float size)
void GPU_depth_test(eGPUDepthTest test)
#define GPU_vertbuf_create_with_format(format)
struct GPUVertBuf GPUVertBuf
void GPU_vertbuf_data_alloc(GPUVertBuf *, uint v_len)
void GPU_vertbuf_attr_set(GPUVertBuf *, uint a_idx, uint v_idx, const void *data)
Read Guarded memory(de)allocation.
#define MEM_SIZE_OPTIMAL(size)
void UI_GetThemeColorType3ubv(int colorid, int spacetype, unsigned char col[3])
void UI_GetThemeColor3ubv(int colorid, unsigned char col[3])
#define BM_FACE_FIRST_LOOP(p)
BMVert * BM_vert_create(BMesh *bm, const float co[3], const BMVert *v_example, const eBMCreateFlag create_flag)
Main function for creating a new vertex.
void BM_edge_kill(BMesh *bm, BMEdge *e)
BMEdge * BM_edge_create(BMesh *bm, BMVert *v1, BMVert *v2, const BMEdge *e_example, const eBMCreateFlag create_flag)
Main function for creating a new edge.
#define BM_elem_index_get(ele)
#define BM_elem_flag_disable(ele, hflag)
#define BM_elem_flag_test(ele, hflag)
#define BM_elem_flag_enable(ele, hflag)
#define BM_ITER_ELEM(ele, iter, data, itype)
#define BM_ITER_MESH(ele, iter, bm, itype)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_mesh_elem_hflag_enable_all(BMesh *bm, const char htype, const char hflag, const bool respecthide)
void BM_edge_select_set(BMesh *bm, BMEdge *e, const bool select)
Select Edge.
void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
BMVert * BM_edge_split(BMesh *bm, BMEdge *e, BMVert *v, BMEdge **r_e, float fac)
Edge Split.
void BM_face_calc_point_in_face(const BMFace *f, float r_co[3])
bool BM_face_point_inside_test(const BMFace *f, const float co[3])
bool BM_face_split_edgenet_connect_islands(BMesh *bm, BMFace *f, BMEdge **edge_net_init, const uint edge_net_init_len, bool use_partial_connect, MemArena *mem_arena, BMEdge ***r_edge_net_new, uint *r_edge_net_new_len)
bool BM_face_split_edgenet(BMesh *bm, BMFace *f, BMEdge **edge_net, const int edge_net_len, BMFace ***r_face_arr, int *r_face_arr_len)
BMEdge * BM_edge_exists(BMVert *v_a, BMVert *v_b)
float BM_loop_point_side_of_loop_test(const BMLoop *l, const float co[3])
bool BM_edge_in_face(const BMEdge *e, const BMFace *f)
BMLoop * BM_face_edge_share_loop(BMFace *f, BMEdge *e)
Return the Loop Shared by Face and Edge.
bool BM_vert_in_face(BMVert *v, BMFace *f)
BMLoop * BM_face_vert_share_loop(BMFace *f, BMVert *v)
Return the Loop Shared by Face and Vertex.
float BM_loop_point_side_of_edge_test(const BMLoop *l, const float co[3])
BLI_INLINE bool BM_edge_is_boundary(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
BLI_INLINE bool BM_loop_is_adjacent(const BMLoop *l_a, const BMLoop *l_b) 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 BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE btScalar angle(const btVector3 &v) const
Return the angle between this and another vector.
bool closest(btVector3 &v)
static void knife_bvh_init(KnifeTool_OpData *kcd)
static void knifetool_disable_angle_snapping(KnifeTool_OpData *kcd)
static void knife_edge_append_face(KnifeTool_OpData *kcd, KnifeEdge *kfe, BMFace *f)
static void knife_find_line_hits(KnifeTool_OpData *kcd)
static KnifeEdge * get_bm_knife_edge(KnifeTool_OpData *kcd, BMEdge *e, Object *ob, uint base_index)
static void knifetool_draw_angle(const KnifeTool_OpData *kcd, const float start[3], const float mid[3], const float end[3], const float start_ss[2], const float mid_ss[2], const float end_ss[2], const float angle)
static int knife_calculate_snap_ref_edges(KnifeTool_OpData *kcd)
static void knife_input_ray_segment(KnifeTool_OpData *kcd, const float mval[2], const float ofs, float r_origin[3], float r_origin_ofs[3])
static bool knife_snap_angle_screen(KnifeTool_OpData *kcd)
#define KNIFE_FLT_EPS_PX_VERT
static void knife_constrain_axis(KnifeTool_OpData *kcd)
static void UNUSED_FUNCTION() knifetool_recast_cageco(KnifeTool_OpData *kcd, float mval[3], float r_cage[3])
static void knife_make_cuts(KnifeTool_OpData *kcd, Object *ob)
static void knifetool_init(ViewContext *vc, KnifeTool_OpData *kcd, Object **objects, const int objects_len, const bool only_select, const bool cut_through, const bool xray, const int visible_measurements, const int angle_snapping, const float angle_snapping_increment, const bool is_interactive)
static void knife_bvh_free(KnifeTool_OpData *kcd)
static void calc_ortho_extent(KnifeTool_OpData *kcd)
static bool knife_snap_angle_relative(KnifeTool_OpData *kcd)
static void knifetool_init_obinfo(KnifeTool_OpData *kcd, Object *ob, uint base_index, bool use_tri_indices)
static void knife_bm_tri_cagecos_get(const KnifeTool_OpData *kcd, int base_index, int tri_index, float cos[3][3])
static float snap_v3_angle_plane(float r[3], const float v[3], const float v_ref[3], const float plane_no[3], float snap_step)
struct KnifePosData KnifePosData
static void knifetool_draw_visible_distances(const KnifeTool_OpData *kcd)
static ListBase * knife_empty_list(KnifeTool_OpData *kcd)
static void knifetool_draw_orientation_locking(const KnifeTool_OpData *kcd)
static void knife_project_v2(const KnifeTool_OpData *kcd, const float co[3], float sco[2])
static void knifetool_draw_dist_angle(const KnifeTool_OpData *kcd)
@ KNF_MODAL_DEPTH_TEST_TOGGLE
@ KNF_MODAL_CYCLE_ANGLE_SNAP_EDGE
@ KNF_MODAL_SHOW_DISTANCE_ANGLE_TOGGLE
@ KNF_MODAL_ANGLE_SNAP_TOGGLE
@ KNF_MODAL_IGNORE_SNAP_OFF
@ KNF_MODAL_ADD_CUT_CLOSED
@ KNF_MODAL_IGNORE_SNAP_ON
@ KNF_MODAL_CUT_THROUGH_TOGGLE
static void linehit_to_knifepos(KnifePosData *kpos, KnifeLineHit *lh)
void EDBM_mesh_knife(ViewContext *vc, Object **objects, const int objects_len, LinkNode *polys, bool use_tag, bool cut_through)
static int knife_sample_screen_density_from_closest_face(KnifeTool_OpData *kcd, const float radius, Object *ob, uint base_index, BMFace *f, const float cageco[3])
static bool knife_verts_edge_in_face(KnifeVert *v1, KnifeVert *v2, BMFace *f)
static void knifetool_undo(KnifeTool_OpData *kcd)
static void knifetool_update_mval_i(KnifeTool_OpData *kcd, const int mval_i[2])
static void knifetool_draw(const bContext *UNUSED(C), ARegion *UNUSED(region), void *arg)
#define KNIFE_FLT_EPS_PX_EDGE
wmKeyMap * knifetool_modal_keymap(wmKeyConfig *keyconf)
static void knifetool_finish_ex(KnifeTool_OpData *kcd)
static int linehit_compare(const void *vlh1, const void *vlh2)
static void knife_append_list(KnifeTool_OpData *kcd, ListBase *lst, void *elem)
static KnifeVert * knife_split_edge(KnifeTool_OpData *kcd, KnifeEdge *kfe, const float co[3], const float cageco[3], KnifeEdge **r_kfe)
static KnifeEdge * knife_find_closest_edge_of_face(KnifeTool_OpData *kcd, Object *ob, uint base_index, BMFace *f, float p[3], float cagep[3])
static void prepare_linehits_for_cut(KnifeTool_OpData *kcd)
static void knifetool_cancel(bContext *UNUSED(C), wmOperator *op)
#define F_ISECT_SET_UNKNOWN(f)
static void knife_make_face_cuts(KnifeTool_OpData *kcd, BMesh *bm, BMFace *f, ListBase *kfedges)
static int knifetool_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static KnifeVert * get_bm_knife_vert(KnifeTool_OpData *kcd, BMVert *v, Object *ob, uint base_index)
static bool knife_snap_edge_constrained(KnifeTool_OpData *kcd, const float sco[3], const float kfv1_sco[2], const float kfv2_sco[2], float *r_dist_sq, float *r_lambda)
static void knifetool_update_mval(KnifeTool_OpData *kcd, const float mval[2])
static BMFace * knife_bvh_raycast(KnifeTool_OpData *kcd, const float co[3], const float dir[3], const float radius, float *r_dist, float r_hitout[3], float r_cagehit[3], uint *r_base_index)
static bool knife_bm_face_is_not_hidden(BMFace *f)
static void knifetool_exit(wmOperator *op)
static ListBase * knife_get_face_kedges(KnifeTool_OpData *kcd, Object *ob, uint base_index, BMFace *f)
static BMFace * knife_find_closest_face(KnifeTool_OpData *kcd, Object **r_ob, uint *r_base_index, bool *is_space, float r_co[3], float r_cageco[3])
static void knifetool_finish_single_post(KnifeTool_OpData *UNUSED(kcd), Object *ob)
static void knife_finish_cut(KnifeTool_OpData *kcd)
static BMElem * bm_elem_from_knife_vert(KnifeVert *kfv, KnifeEdge **r_kfe)
#define F_ISECT_SET_OUTSIDE(f)
static void knife_add_to_vert_edges(KnifeTool_OpData *kcd, KnifeEdge *kfe)
void MESH_OT_knife_tool(wmOperatorType *ot)
static void clip_to_ortho_planes(float v1[3], float v2[3], const float center[3], const float d)
static void knife_bvh_raycast_cb(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
static void knifetool_finish_single_pre(KnifeTool_OpData *kcd, Object *ob)
struct KnifeColors KnifeColors
static void knife_recalc_ortho(KnifeTool_OpData *kcd)
struct KnifeVert KnifeVert
static KnifeEdge * new_knife_edge(KnifeTool_OpData *kcd)
struct KnifeUndoFrame KnifeUndoFrame
#define KNIFE_MAX_ANGLE_SNAPPING_INCREMENT
static void knife_join_edge(KnifeEdge *newkfe, KnifeEdge *kfe)
static KnifeVert * knife_find_closest_vert_of_edge(KnifeTool_OpData *kcd, KnifeEdge *kfe, float p[3], float cagep[3])
static void add_hit_to_facehits(KnifeTool_OpData *kcd, GHash *facehits, BMFace *f, KnifeLineHit *hit)
static int get_lowest_face_tri(KnifeTool_OpData *kcd, BMFace *f)
#define KNIFE_DEFAULT_ANGLE_SNAPPING_INCREMENT
static void knifetool_raycast_planes(const KnifeTool_OpData *kcd, float r_v1[3], float r_v2[3])
static void knife_pos_data_clear(KnifePosData *kpd)
static Ref * find_ref(ListBase *lb, void *ref)
static BMFace * knife_bvh_raycast_filter(KnifeTool_OpData *kcd, const float co[3], const float dir[3], const float radius, float *r_dist, float r_hitout[3], float r_cagehit[3], uint *r_base_index, bool(*filter_cb)(BMFace *f, void *userdata), void *filter_userdata)
static void knifetool_draw_visible_angles(const KnifeTool_OpData *kcd)
struct KnifeObjectInfo KnifeObjectInfo
static KnifeVert * new_knife_vert(KnifeTool_OpData *kcd, const float co[3], const float cageco[3])
static bool knife_add_single_cut__is_linehit_outside_face(BMFace *f, const KnifeLineHit *lh, const float co[3])
static void knifetool_draw_angle_snapping(const KnifeTool_OpData *kcd)
@ KNF_CONSTRAIN_AXIS_MODE_LOCAL
@ KNF_CONSTRAIN_AXIS_MODE_GLOBAL
@ KNF_CONSTRAIN_AXIS_MODE_NONE
static float snap_v2_angle(float r[2], const float v[2], const float v_ref[2], float angle_snap)
static void knife_reset_snap_angle_input(KnifeTool_OpData *kcd)
static void knife_cut_face(KnifeTool_OpData *kcd, BMFace *f, ListBase *hits)
static bool bm_ray_cast_cb_elem_not_in_face_check(BMFace *f, void *user_data)
@ KNF_CONSTRAIN_ANGLE_MODE_NONE
@ KNF_CONSTRAIN_ANGLE_MODE_SCREEN
@ KNF_CONSTRAIN_ANGLE_MODE_RELATIVE
static void knife_start_cut(KnifeTool_OpData *kcd)
static void knife_add_single_cut(KnifeTool_OpData *kcd, KnifeLineHit *lh1, KnifeLineHit *lh2, BMFace *f)
static int knife_update_active(KnifeTool_OpData *kcd)
static const int * knife_bm_tri_index_get(const KnifeTool_OpData *kcd, int base_index, int tri_index, int tri_index_buf[3])
#define KNIFE_FLT_EPS_PX_FACE
static float knife_snap_size(KnifeTool_OpData *kcd, float maxsize)
#define KNIFE_MIN_ANGLE_SNAPPING_INCREMENT
static BMElem * bm_elem_from_knife_edge(KnifeEdge *kfe)
static bool point_is_visible(KnifeTool_OpData *kcd, const float p[3], const float s[2], BMElem *ele_test)
static void knife_add_cut(KnifeTool_OpData *kcd)
static bool knife_snap_update_from_mval(KnifeTool_OpData *kcd, const float mval[2])
static void knifetool_finish(wmOperator *op)
static void knife_update_header(bContext *C, wmOperator *op, KnifeTool_OpData *kcd)
static void knife_append_list_no_dup(KnifeTool_OpData *kcd, ListBase *lst, void *elem)
static BMFace * knife_find_common_face(ListBase *faces1, ListBase *faces2)
struct KnifeEdge KnifeEdge
#define KNIFE_FLT_EPS_SQUARED
@ KNF_MEASUREMENT_DISTANCE
static bool knife_ray_intersect_face(KnifeTool_OpData *kcd, const float s[2], const float v1[3], const float v2[3], Object *ob, uint base_index, BMFace *f, const float face_tol_sq, float hit_co[3], float hit_cageco[3])
static int knifetool_modal(bContext *C, wmOperator *op, const wmEvent *event)
struct KnifeTool_OpData KnifeTool_OpData
static void knifetool_free_obinfo(KnifeTool_OpData *kcd, uint base_index)
static void knife_interp_v3_v3v3(const KnifeTool_OpData *kcd, float r_co[3], const float v1[3], const float v2[3], float lambda_ss)
struct KnifeMeasureData KnifeMeasureData
static int sort_verts_by_dist_cb(void *co_p, const void *cur_a_p, const void *cur_b_p)
@ KNF_CONSTRAIN_AXIS_NONE
static void knifetool_disable_orientation_locking(KnifeTool_OpData *kcd)
static void knife_add_edge_faces_to_vert(KnifeTool_OpData *kcd, KnifeVert *kfv, BMEdge *e)
static bool coinciding_edges(BMEdge *e1, BMEdge *e2)
static bool knife_bm_face_is_select(BMFace *f)
static bool edbm_mesh_knife_point_isect(LinkNode *polys, const float cent_ss[2])
static void knife_init_colors(KnifeColors *colors)
static void set_linehit_depth(KnifeTool_OpData *kcd, KnifeLineHit *lh)
struct KnifeLineHit KnifeLineHit
static void knifetool_exit_ex(KnifeTool_OpData *kcd)
static void set_lowest_face_tri(KnifeTool_OpData *kcd, BMEditMesh *em, BMFace *f, int index)
static void knife_bm_tri_cagecos_get_worldspace(const KnifeTool_OpData *kcd, int base_index, int tri_index, float cos[3][3])
#define F_ISECT_IS_UNKNOWN(f)
void(* MEM_freeN)(void *vmemh)
size_t(* MEM_allocN_len)(const void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
Intersection< segment > intersection
INLINE Rall1d< T, V, S > cos(const Rall1d< T, V, S > &arg)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
static const pxr::TfToken density("density", pxr::TfToken::Immortal)
float RNA_float_get(PointerRNA *ptr, const char *name)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_float(StructOrFunctionRNA *cont_, const char *identifier, float default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_property_subtype(PropertyRNA *prop, PropertySubType subtype)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description)
_W64 unsigned int uintptr_t
struct ARegionType * type
struct BMLoop *(* looptris)[3]
struct BMLoop * radial_next
struct IsectRayPrecalc * isect_precalc
bool(* filter_cb)(BMFace *f, void *userdata)
const float(* cagecos)[3]
const int(* tri_indices)[3]
struct ToolSettings * toolsettings
struct Depsgraph * depsgraph
struct ViewLayer * view_layer
struct RegionView3D * rv3d
int(* invoke)(struct bContext *, struct wmOperator *, const struct wmEvent *) ATTR_WARN_UNUSED_RESULT
int(* modal)(struct bContext *, struct wmOperator *, const struct wmEvent *) ATTR_WARN_UNUSED_RESULT
bool(* poll)(struct bContext *) ATTR_WARN_UNUSED_RESULT
void(* cancel)(struct bContext *, struct wmOperator *)
struct ReportList * reports
void WM_cursor_modal_set(wmWindow *win, int val)
void WM_cursor_modal_restore(wmWindow *win)
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
wmKeyMap * WM_modalkeymap_find(wmKeyConfig *keyconf, const char *idname)
void WM_modalkeymap_assign(wmKeyMap *km, const char *opname)
const char * WM_bool_as_string(bool test)
wmKeyMap * WM_modalkeymap_ensure(wmKeyConfig *keyconf, const char *idname, const EnumPropertyItem *items)
void wmOrtho2_region_pixelspace(const ARegion *region)