140 return mverts[index].
co;
148 const int grid_index = index / key->
grid_area;
149 const int vertex_index = index - grid_index * key->
grid_area;
190 const int grid_index = index / key->
grid_area;
191 const int vertex_index = index - grid_index * key->
grid_area;
212 return mverts[index].
co;
233 const int grid_index = index / key->
grid_area;
234 const int vertex_index = index - grid_index * key->
grid_area;
260 return ss->
vmask[index];
267 const int grid_index = index / key->
grid_area;
268 const int vertex_index = index - grid_index * key->
grid_area;
311 const int deform_target,
314 switch (deform_target) {
371 const int grid_index = index / key->
grid_area;
372 const int vertex_index = index - grid_index * key->
grid_area;
374 if (grid_hidden && grid_hidden[grid_index]) {
387 for (
int i = 0; i < ss->
totfaces; i++) {
409 for (
int i = 0; i < ss->
totfaces; i++) {
423 for (
int i = 0; i < ss->
totfaces; i++) {
450 for (
int j = 0; j < ss->
pmap[index].
count; j++) {
470 for (
int j = 0; j < ss->
pmap[index].
count; j++) {
481 const int grid_index = index / key->
grid_area;
494 for (
int j = 0; j < ss->
pmap[index].
count; j++) {
504 const int grid_index = index / key->
grid_area;
520 for (
int i = 0; i < ss->
pmap[index].
count; i++) {
531 const int grid_index = index / key->
grid_area;
544 for (
int i = 0; i < ss->
pmap[index].
count; i++) {
555 const int grid_index = index / key->
grid_area;
557 return ss->
face_sets[face_index] == face_set;
587 for (
int i = 0; i < ss->pmap[index].count; i++) {
601 for (
int i = 0; i < ss->
totfaces; i++) {
603 bool poly_visible =
true;
607 poly_visible =
false;
624 for (
int i = 0; i < ss->
pmap[index].
count; i++) {
625 if (face_set == -1) {
644 int p1 = -1, p2 = -1;
663 if (p1 != -1 && p2 != -1) {
679 const int grid_index = index / key->
grid_area;
680 const int vertex_index = index - grid_index * key->
grid_area;
705 int next_face_set = 0;
706 for (
int i = 0; i < ss->
totfaces; i++) {
712 return next_face_set;
722 #define SCULPT_VERTEX_NEIGHBOR_FIXED_CAPACITY 256
726 for (
int i = 0; i < iter->
size; i++) {
727 if (iter->
neighbors[i] == neighbor_index) {
764 const BMVert *v_other = adj_v[i];
782 for (
int i = 0; i < ss->
pmap[index].
count; i++) {
786 for (
int j = 0; j <
ARRAY_SIZE(f_adj_v); j += 1) {
787 if (f_adj_v[j] != index) {
804 const bool include_duplicates,
811 const int grid_index = index / key->
grid_area;
812 const int vertex_index = index - grid_index * key->
grid_area;
826 for (
int i = 0; i < neighbors.
size; i++) {
846 const bool include_duplicates,
884 const int grid_index = index / key->
grid_area;
885 const int vertex_index = index - grid_index * key->
grid_area;
942 bool is_in_symmetry_area =
true;
943 for (
int i = 0; i < 3; i++) {
944 char symm_it = 1 << i;
945 if (symm & symm_it) {
946 if (pco[i] == 0.0f) {
948 is_in_symmetry_area =
false;
951 if (vco[i] * pco[i] < 0.0f) {
952 is_in_symmetry_area =
false;
956 return is_in_symmetry_area;
975 if (distance_squared < nvtd->nearest_vertex_distance_squared &&
976 distance_squared < data->max_distance_squared) {
985 void *__restrict chunk_join,
986 void *__restrict chunk)
1001 Sculpt *sd,
Object *ob,
const float co[3],
float max_distance,
bool use_original)
1009 .radius_squared = max_distance * max_distance,
1010 .original = use_original,
1022 .max_distance_squared = max_distance * max_distance,
1044 return i == 0 || (symm & i && (symm != 5 || i != 3) && (symm != 6 || (i != 3 && i != 5)));
1049 const float br_co[3],
1053 for (
char i = 0; i <= symm; ++i) {
1110 for (
char i = 0; i <= symm; ++i) {
1118 else if (radius > 0.0f) {
1119 float radius_squared = (radius == FLT_MAX) ? FLT_MAX : radius * radius;
1136 for (
char i = 0; i <= symm; ++i) {
1144 else if (radius > 0.0f) {
1145 float radius_squared = (radius == FLT_MAX) ? FLT_MAX : radius * radius;
1160 bool (*func)(
SculptSession *ss,
int from_v,
int to_v,
bool is_duplicate,
void *userdata),
1168 const int to_v = ni.
index;
1180 if (func(ss, from_v, to_v, ni.
is_duplicate, userdata)) {
1205 return ELEM(sculpt_tool,
1219 return ELEM(sculpt_tool,
1283 data->unode = unode;
1317 orig_data->
co = orig_data->
coords[iter->
i];
1343 const float sculpt_co[3],
1344 const float v_co[3],
1377 const float normal_weight,
1378 float grab_delta[3])
1385 float len_view_scale;
1387 float view_aligned_normal[3];
1391 len_view_scale = (len_view_scale > FLT_EPSILON) ? 1.0f / len_view_scale : 1.0f;
1394 mul_v3_fl(grab_delta, 1.0f - normal_weight);
1576 float bb_min[3], bb_max[3];
1693 test->
dist = distsq;
1719 test->
dist = distsq;
1725 const float local[4][4],
1726 const float roundness)
1737 local_co[0] =
fabsf(local_co[0]);
1738 local_co[1] =
fabsf(local_co[1]);
1739 local_co[2] =
fabsf(local_co[2]);
1742 side += (1.0f - side) * roundness;
1744 const float hardness = 1.0f - roundness;
1745 const float constant_side = hardness * side;
1746 const float falloff_side = roundness * side;
1748 if (!(local_co[0] <= side && local_co[1] <= side && local_co[2] <= side)) {
1752 if (
min_ff(local_co[0], local_co[1]) > constant_side) {
1756 test->
dist =
len_v2v2(r_point, local_co) / falloff_side;
1759 if (
max_ff(local_co[0], local_co[1]) > constant_side) {
1761 test->
dist = (
max_ff(local_co[0], local_co[1]) - constant_side) / falloff_side;
1784 return sculpt_brush_test_sq_fn;
1798 const float sculpt_normal[3],
1816 return dot > 0.0f ?
dot : 0.0f;
1824 const float area_no[3])
1826 if (sculpt_brush_test_sphere_fast(test, co)) {
1827 float t1[3], t2[3], t3[3], dist;
1884 float overlap = 0.0f;
1886 for (
int i = 1; i < sd->
radial_symm[axis -
'X']; i++) {
1903 for (
int i = 0; i <= symm; i++) {
1914 return 1.0f / overlap;
1946 const bool use_area_nos =
data->use_area_nos;
1947 const bool use_area_cos =
data->use_area_cos;
1952 bool use_original =
false;
1953 bool normal_test_r, area_test_r;
1957 use_original = (unode->
co || unode->
bm_entry);
1962 ss, &normal_test,
data->brush->falloff_shape);
1967 test_radius *=
data->brush->normal_radius_factor;
1968 normal_test.
radius = test_radius;
1974 ss, &area_test,
data->brush->falloff_shape);
1981 data->brush->area_radius_factor > 0.0f) {
1982 test_radius *=
data->brush->area_radius_factor;
1988 test_radius *=
data->brush->normal_radius_factor;
1990 area_test.
radius = test_radius;
1996 if (use_original &&
data->has_bm_orco) {
1997 float(*orco_coords)[3];
2003 for (
int i = 0; i < orco_tris_num; i++) {
2004 const float *co_tri[3] = {
2005 orco_coords[orco_tris[i][0]],
2006 orco_coords[orco_tris[i][1]],
2007 orco_coords[orco_tris[i][2]],
2013 normal_test_r = sculpt_brush_normal_test_sq_fn(&normal_test, co);
2014 area_test_r = sculpt_brush_area_test_sq_fn(&area_test, co);
2016 if (!normal_test_r && !area_test_r) {
2026 if (use_area_cos && area_test_r) {
2029 const float afactor =
clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f);
2039 if (use_area_nos && normal_test_r) {
2042 const float nfactor =
clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f);
2059 const float *temp_co;
2060 const short *temp_no_s;
2074 normal_test_r = sculpt_brush_normal_test_sq_fn(&normal_test, co);
2075 area_test_r = sculpt_brush_area_test_sq_fn(&area_test, co);
2077 if (!normal_test_r && !area_test_r) {
2084 data->any_vertex_sampled =
true;
2101 if (use_area_cos && area_test_r) {
2104 const float afactor =
clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f);
2114 if (use_area_nos && normal_test_r) {
2117 const float nfactor =
clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f);
2129 void *__restrict chunk_join,
2130 void *__restrict chunk)
2163 .has_bm_orco = has_bm_orco,
2164 .use_area_cos =
true,
2222 .has_bm_orco = has_bm_orco,
2223 .use_area_nos =
true,
2224 .any_vertex_sampled =
false,
2243 return data.any_vertex_sampled;
2263 .has_bm_orco = has_bm_orco,
2264 .use_area_cos =
true,
2265 .use_area_nos =
true,
2314 const float feather,
2322 const float alpha = root_alpha * root_alpha;
2325 const float pen_flip = cache->
pen_flip ? -1.0f : 1.0f;
2331 float flip = dir *
invert * pen_flip;
2337 float final_pressure;
2341 final_pressure =
pow4f(pressure);
2342 overlap = (1.0f + overlap) / 2.0f;
2343 return 0.25f *
alpha * flip * final_pressure * overlap * feather;
2347 return alpha * flip * pressure * overlap * feather;
2349 return alpha * pressure * overlap * feather;
2353 return root_alpha * feather;
2356 return root_alpha * feather * pressure * overlap;
2361 return 0.1f *
alpha * flip * pressure * overlap * feather;
2366 return 10.0f *
alpha * flip * pressure * overlap * feather;
2369 return alpha * pressure * overlap * feather;
2371 return alpha * pressure * overlap * feather * 2.0f;
2373 final_pressure = pressure * pressure;
2374 return final_pressure * overlap * feather;
2377 return alpha * pressure * overlap * feather;
2380 final_pressure =
powf(pressure, 1.5f);
2381 return alpha * flip * final_pressure * overlap * feather * 0.3f;
2383 final_pressure = pressure * pressure;
2384 return alpha * flip * final_pressure * overlap * feather * 1.3f;
2387 overlap = (1.0f + overlap) / 2.0f;
2390 return alpha * flip * pressure * overlap * feather;
2392 return alpha * pressure * feather;
2399 return alpha * flip * pressure * overlap * feather;
2403 return 0.250f *
alpha * flip * pressure * overlap * feather;
2406 return 0.125f *
alpha * flip * pressure * overlap * feather;
2410 overlap = (1.0f + overlap) / 2.0f;
2411 return alpha * flip * pressure * overlap * feather;
2417 overlap = (1.0f + overlap) / 2.0f;
2418 return alpha * flip * pressure * overlap * feather;
2422 return 0.5f *
alpha * flip * pressure * overlap * feather;
2426 return flip *
alpha * pressure * feather;
2430 return alpha * flip * pressure * overlap * feather;
2433 return 0.25f *
alpha * flip * pressure * overlap * feather;
2437 overlap = (1.0f + overlap) / 2.0f;
2438 return alpha * pressure * overlap * feather;
2441 return alpha * pressure * feather;
2444 return root_alpha * feather;
2447 return root_alpha * feather;
2450 return alpha * pressure * feather;
2455 return root_alpha * feather;
2465 const float brush_point[3],
2470 const int vertex_index,
2471 const int thread_id)
2490 float symm_point[3], point_2d[2];
2492 float x = 0.0f,
y = 0.0f;
2527 const float point_3d[3] = {point_2d[0], point_2d[1], 0.0f};
2533 float final_len =
len;
2539 else if (hardness == 1.0f) {
2540 final_len = cache->
radius;
2543 p = (p - hardness) / (1.0f - hardness);
2544 final_len = p * cache->
radius;
2572 float t[3], bb_min[3], bb_max[3];
2574 if (
data->ignore_fully_ineffective) {
2583 if (
data->original) {
2590 for (
int i = 0; i < 3; i++) {
2591 if (bb_min[i] >
center[i]) {
2592 nearest[i] = bb_min[i];
2594 else if (bb_max[i] <
center[i]) {
2595 nearest[i] = bb_max[i];
2611 float bb_min[3], bb_max[3];
2613 if (
data->ignore_fully_ineffective) {
2619 if (
data->original) {
2626 float dummy_co[3], dummy_depth;
2628 data->dist_ray_to_aabb_precalc, bb_min, bb_max, dummy_co, &dummy_depth);
2632 return dist_sq <
data->radius_squared ||
true;
2640 for (
int i = 0; i < 3; i++) {
2645 bool do_clip =
false;
2680 .original = use_original,
2681 .ignore_fully_ineffective =
false,
2705 .original = use_original,
2720 .original = use_original,
2721 .dist_ray_to_aabb_precalc = &dist_ray_to_aabb_precalc,
2767 const bool update_normal =
2792 float loc[3], mval_f[2] = {0.0f, 1.0f};
2848 #define SCULPT_TILT_SENSITIVITY 0.7f
2851 if (!
U.experimental.use_sculpt_tools_tilt) {
2856 float normal_tilt_y[3];
2858 float normal_tilt_xy[3];
2928 const float bstrength =
clamp_f(
data->strength, 0.0f, 1.0f);
2932 ss, &test,
data->brush->falloff_shape);
2937 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
2946 float avg[3], val[3];
2967 const float strength =
clamp_f(bstrength, 0.0f, 1.0f);
2970 const int iterations = 3;
2973 const int count = iterations * strength + 1;
2974 const float factor = iterations * strength /
count;
2976 for (iteration = 0; iteration <=
count; iteration++) {
3005 ss, &test,
data->brush->falloff_shape);
3009 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
3016 if (bstrength > 0.0f) {
3080 ss, &test,
data->brush->falloff_shape);
3085 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
3145 ss, &test,
data->brush->falloff_shape);
3150 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
3163 float current_disp[3];
3164 float current_disp_norm[3];
3165 float interp_limit_surface_disp[3];
3184 float weights_accum = 1.0f;
3188 float vertex_disp[3];
3189 float vertex_disp_norm[3];
3190 float neighbor_limit_co[3];
3198 if (
dot_v3v3(current_disp_norm, vertex_disp_norm) >= 0.0f) {
3202 const float disp_interp =
clamp_f(
3203 -
dot_v3v3(current_disp_norm, vertex_disp_norm), 0.0f, 1.0f);
3204 madd_v3_v3fl(interp_limit_surface_disp, neighbor_limit_surface_disp, disp_interp);
3205 weights_accum += disp_interp;
3209 mul_v3_fl(interp_limit_surface_disp, 1.0f / weights_accum);
3247 totvert,
sizeof(
float[3]),
"prev displacement");
3249 for (
int i = 0; i < totvert; i++) {
3280 const float *offset =
data->offset;
3289 ss, &test,
data->brush->falloff_shape);
3293 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
3324 float effective_normal[3];
3355 const float *offset =
data->offset;
3367 ss, &test,
data->brush->falloff_shape);
3372 if (!sculpt_brush_test_sq_fn(&test, orig_data.
co)) {
3403 float effective_normal[3];
3449 ss, &test,
data->brush->falloff_shape);
3454 if (!sculpt_brush_test_sq_fn(&test, orig_data.
co)) {
3466 float current_disp[3];
3467 float current_disp_norm[3];
3468 float final_disp[3] = {0.0f, 0.0f, 0.0f};
3487 float vertex_disp[3];
3488 float vertex_disp_norm[3];
3491 if (
dot_v3v3(current_disp_norm, vertex_disp_norm) > 0.0f) {
3509 bool filter_boundary_face_sets,
3512 float smooth_pos[3];
3513 float final_disp[3];
3514 float boundary_normal[3];
3516 int neighbor_count = 0;
3524 if (!filter_boundary_face_sets ||
3537 float to_neighbor[3];
3540 add_v3_v3(boundary_normal, to_neighbor);
3551 if (neighbor_count <= 2) {
3556 if (avg_count > 0) {
3557 mul_v3_fl(smooth_pos, 1.0f / avg_count);
3565 float smooth_closest_plane[3];
3568 if (is_boundary && avg_count == 2) {
3606 ss, &test,
data->brush->falloff_shape);
3611 if (!sculpt_brush_test_sq_fn(&test, orig_data.
co)) {
3654 for (
int i = 0; i < 4; i++) {
3762 const float flippedbstrength =
data->flippedbstrength;
3763 const float *offset =
data->offset;
3772 ss, &test,
data->brush->falloff_shape);
3776 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
3821 float flippedbstrength, crease_correction;
3835 if (brush_alpha > 0.0f) {
3836 crease_correction /= brush_alpha * brush_alpha;
3840 flippedbstrength = (bstrength < 0.0f) ? -crease_correction * bstrength :
3841 crease_correction * bstrength;
3844 flippedbstrength *= -1.0f;
3859 .flippedbstrength = flippedbstrength,
3884 ss, &test,
data->brush->falloff_shape);
3887 float x_object_space[3];
3888 float z_object_space[3];
3893 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
3905 float disp_center[3];
3964 float stroke_xz[2][3];
3973 .stroke_xz = stroke_xz,
3988 const float *grab_delta =
data->grab_delta;
4001 ss, &test,
data->brush->falloff_shape);
4009 if (!sculpt_brush_test_sq_fn(&test, orig_data.
co)) {
4022 if (grab_silhouette) {
4023 float silhouette_test_dir[3];
4046 float grab_delta[3];
4059 .grab_delta = grab_delta,
4074 const float *grab_delta =
data->grab_delta;
4097 if (
ELEM(symm, 1, 2, 4, 7)) {
4103 float force =
len_v3(grab_delta) * dir * bstrength;
4109 float final_disp[3];
4113 mul_v3_fl(final_disp, bstrength * 20.0f);
4117 mul_v3_fl(final_disp, bstrength * 20.0f);
4122 mul_v3_fl(final_disp, bstrength * 20.0f);
4154 float grab_delta[3];
4167 .grab_delta = grab_delta,
4193 const float pivot[3])
4195 for (
int i = 0; i < 3; i++) {
4197 if (!(symm & symm_it)) {
4200 if (symmarea & symm_it) {
4203 if (pivot[i] < 0.0f) {
4212 const float pivot[3])
4214 for (
int i = 0; i < 3; i++) {
4216 if (!(symm & symm_it)) {
4219 if (symmarea & symm_it) {
4222 if (pivot[i] < 0.0f) {
4324 const float *cono =
data->cono;
4334 ss, &test,
data->brush->falloff_shape);
4338 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
4364 float grab_delta[3];
4365 float tmp[3], cono[3];
4393 const float *grab_delta =
data->grab_delta;
4410 ss, &test,
data->brush->falloff_shape);
4417 if (!do_elastic && !sculpt_brush_test_sq_fn(&test, vd.
co)) {
4441 float delta_pinch_init[3], delta_pinch[3];
4456 float pinch_fade = pinch *
fade;
4463 mul_v3_fl(delta_pinch, 1.0f + pinch_fade);
4464 sub_v3_v3v3(delta_pinch, delta_pinch_init, delta_pinch);
4468 if (do_rake_rotation) {
4469 float delta_rotate[3];
4497 float grab_delta[3];
4503 if (bstrength < 0.0f) {
4522 .grab_delta = grab_delta,
4537 const float *cono =
data->cono;
4550 ss, &test,
data->brush->falloff_shape);
4556 if (!sculpt_brush_test_sq_fn(&test, orig_data.
co)) {
4582 float grab_delta[3];
4583 float tmp[3], cono[3];
4623 ss, &test,
data->brush->falloff_shape);
4629 if (!sculpt_brush_test_sq_fn(&test, orig_data.
co)) {
4632 float vec[3],
rot[3][3];
4661 static const int flip[8] = {1, -1, -1, 1, -1, 1, 1, -1};
4695 ss, &test,
data->brush->falloff_shape);
4701 if (!sculpt_brush_test_sq_fn(&test, orig_data.
co)) {
4714 const int vi = vd.
index;
4716 if (use_persistent_base) {
4729 (*disp_factor) +=
fabsf(
fade * bstrength * (*disp_factor)) *
4730 ((*disp_factor) > 0.0f ? -1.0f : 1.0f);
4733 (*disp_factor) +=
fade * bstrength * (1.05f -
fabsf(*disp_factor));
4736 const float clamp_mask = 1.0f - *vd.
mask;
4737 *disp_factor =
clamp_f(*disp_factor, -clamp_mask, clamp_mask);
4740 *disp_factor =
clamp_f(*disp_factor, -1.0f, 1.0f);
4746 if (use_persistent_base) {
4778 "layer displacement factor");
4809 ss, &test,
data->brush->falloff_shape);
4813 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
4901 const float *area_no =
data->area_no;
4902 const float *area_co =
data->area_co;
4912 ss, &test,
data->brush->falloff_shape);
4918 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
4967 displace = radius * offset;
5003 const float *area_no =
data->area_no;
5004 const float *area_co =
data->area_co;
5024 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
5029 float plane_dist_abs =
fabsf(plane_dist);
5030 if (plane_dist > 0.0f) {
5041 void *__restrict chunk_join,
5042 void *__restrict chunk)
5057 const float *area_no =
data->area_no;
5058 const float *area_co =
data->area_co;
5068 ss, &test,
data->brush->falloff_shape);
5074 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
5142 d_offset =
min_ff(radius, d_offset);
5143 d_offset = d_offset / radius;
5144 d_offset = 1.0f - d_offset;
5145 displace =
fabsf(initial_radius * (0.25f + offset + (d_offset * 0.15f)));
5147 displace = -displace;
5177 const float *area_no_sp =
data->area_no_sp;
5178 const float *area_co =
data->area_co;
5237 const float displace = radius * (0.18f + offset);
5240 float area_no_sp[3];
5282 float area_co_displaced[3];
5283 madd_v3_v3v3fl(area_co_displaced, area_co, area_no, -radius * 0.7f);
5312 .area_no_sp = area_no_sp,
5329 const float *area_no =
data->area_no;
5330 const float *area_co =
data->area_co;
5340 ss, &test,
data->brush->falloff_shape);
5346 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
5401 displace = radius * offset;
5428 const float *area_no =
data->area_no;
5429 const float *area_co =
data->area_co;
5439 ss, &test,
data->brush->falloff_shape);
5444 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
5499 displace = -radius * offset;
5531 const float *area_no_sp =
data->area_no_sp;
5532 const float *area_co =
data->area_co;
5536 const float bstrength =
data->clay_strength;
5542 ss, &test,
data->brush->falloff_shape);
5545 float plane_tilt[4];
5546 float normal_tilt[3];
5558 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
5563 float intr[3], intr_tilt[3];
5573 const float tilt_mix = local_co[1] > 0.0f ? 0.0f : 1.0f;
5598 float final_pressure = 0.0f;
5612 const float displace = radius * (0.25f + offset);
5615 float area_no_sp[3];
5680 .area_no_sp = area_no_sp,
5683 .clay_strength = clay_strength,
5700 float *offset =
data->offset;
5709 ss, &test,
data->brush->falloff_shape);
5713 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
5741 float gravity_vector[3];
5766 float(*ofs)[3] =
NULL;
5768 const int kb_act_idx = ob->
shapenr - 1;
5782 if ((currkey != kb) && (currkey->
relative == kb_act_idx)) {
5819 const float radius_scale = 1.25f;
5821 ob, sd, brush, use_original, radius_scale, &totnode);
5846 for (n = 0; n < totnode; n++) {
5934 float radius_scale = 1.0f;
5938 radius_scale = 2.0f;
6018 ss, 1.0f, 0.0f, 0.0f,
false,
true);
6187 float disp[3], newco[3];
6212 const bool use_orco =
ELEM(
data->brush->sculpt_tool,
6225 if (use_orco && !ss->
bm) {
6246 for (
int p = 0; p < proxy_count; p++) {
6352 float(*vertCos)[3] =
NULL;
6414 float frac = 1.0f / max_overlap_count(sd);
6415 float reduce = (feather -
frac) / (1.0f -
frac);
6417 printf(
"feather: %f frac: %f reduce: %f\n", feather,
frac, reduce);
6455 const float radius = cache->
radius;
6457 const float *bbMin = bb->
vec[0];
6458 const float *bbMax = bb->
vec[6];
6469 float original_initial_location[3];
6473 for (
int dim = 0; dim < 3; dim++) {
6475 start[dim] = (bbMin[dim] - orgLoc[dim] - radius) / step[dim];
6476 end[dim] = (bbMax[dim] - orgLoc[dim] + radius) / step[dim];
6479 start[dim] = end[dim] = 0;
6485 action(sd, ob, brush, ups);
6489 for (cur[0] = start[0]; cur[0] <= end[0]; cur[0]++) {
6490 for (cur[1] = start[1]; cur[1] <= end[1]; cur[1]++) {
6491 for (cur[2] = start[2]; cur[2] <= end[2]; cur[2]++) {
6492 if (!cur[0] && !cur[1] && !cur[2]) {
6499 for (
int dim = 0; dim < 3; dim++) {
6500 cache->
location[dim] = cur[dim] * step[dim] + orgLoc[dim];
6502 cache->
initial_location[dim] = cur[dim] * step[dim] + original_initial_location[dim];
6504 action(sd, ob, brush, ups);
6517 const float UNUSED(feather))
6521 for (
int i = 1; i < sd->
radial_symm[axis -
'X']; i++) {
6525 do_tiled(sd, ob, brush, ups, action);
6561 for (
int i = 0; i <= symm; i++) {
6569 do_tiled(sd, ob, brush, ups, action);
6609 if (!
U.experimental.use_sculpt_vertex_colors) {
6636 return "Draw Brush";
6638 return "Smooth Brush";
6640 return "Crease Brush";
6642 return "Blob Brush";
6644 return "Pinch Brush";
6646 return "Inflate Brush";
6648 return "Grab Brush";
6650 return "Nudge Brush";
6652 return "Thumb Brush";
6654 return "Layer Brush";
6656 return "Flatten Brush";
6658 return "Clay Brush";
6660 return "Clay Strips Brush";
6662 return "Clay Thumb Brush";
6664 return "Fill Brush";
6666 return "Scrape Brush";
6668 return "Snake Hook Brush";
6670 return "Rotate Brush";
6672 return "Mask Brush";
6674 return "Simplify Brush";
6676 return "Draw Sharp Brush";
6678 return "Elastic Deform Brush";
6680 return "Pose Brush";
6682 return "Multi-plane Scrape Brush";
6684 return "Slide/Relax Brush";
6686 return "Boundary Brush";
6688 return "Cloth Brush";
6690 return "Draw Face Sets";
6692 return "Multires Displacement Eraser";
6694 return "Multires Displacement Smear";
6696 return "Paint Brush";
6698 return "Smear Brush";
6752 for (
int i = 0; i < 3; i++) {
6766 float imtx_mirror_ob[4][4];
6786 float viewDir[3] = {0.0f, 0.0f, 1.0f};
6794 for (
int i = 0; i < 3; i++) {
6884 cache->
brush = brush;
6942 #define PIXEL_INPUT_THRESHHOLD 5
6947 #undef PIXEL_INPUT_THRESHHOLD
6959 return initial_size * clay_stabilized_pressure;
6962 return initial_size * cache->
pressure;
7005 const float mouse[2] = {
7028 float grab_location[3], imat[4][4], delta[3], loc[3];
7124 const float eps = 0.00001f;
7141 float axis[3],
angle;
7348 bool use_origco =
false;
7357 origco = (unode) ? unode->
co :
NULL;
7358 use_origco = origco ?
true :
false;
7385 bool use_origco =
false;
7394 origco = (unode) ? unode->
co :
NULL;
7395 use_origco = origco ?
true :
false;
7413 const float mouse[2],
7416 float ray_normal[3],
7454 const float mouse[2],
7455 bool use_sampled_normal)
7464 float ray_start[3], ray_end[3], ray_normal[3], depth, face_normal[3], sampled_normal[3],
7466 float viewDir[3] = {0.0f, 0.0f, 1.0f};
7468 bool original =
false;
7490 .ray_start = ray_start,
7491 .ray_normal = ray_normal,
7493 .face_normal = face_normal,
7531 if (!use_sampled_normal) {
7590 float ray_start[3], ray_end[3], ray_normal[3], depth, face_normal[3];
7600 original = (cache) ? cache->
original :
false;
7646 .ray_start = ray_start,
7647 .ray_normal = ray_normal,
7649 .dist_sq_to_ray = FLT_MAX,
7687 bool is_smooth, needs_colors;
7688 bool need_mask =
false;
7735 for (
int i = 0; i < ss->
totfaces; i++) {
7752 float bb_min[3], bb_max[3];
7844 if (v3d != current_v3d) {
7894 float mouse[2], co[3];
8069 int ignore_background_click;
8088 if (ignore_background_click && !
over_mesh(
C, op, event->
x, event->
y)) {
8152 ot->
idname =
"SCULPT_OT_brush_stroke";
8170 "ignore_background_click",
8172 "Ignore Background Click",
8173 "Clicks on the background do not start the stroke");
8194 "layer persistent base");
8196 for (
int i = 0; i < totvert; i++) {
8208 ot->
name =
"Set Persistent Base";
8209 ot->
idname =
"SCULPT_OT_set_persistent_base";
8210 ot->
description =
"Reset the copy of the mesh that is being sculpted on";
8238 ot->
name =
"Rebuild BVH";
8240 ot->
description =
"Recalculate the sculpt BVH to improve performance";
8290 "symmetrize input=%avef direction=%i dist=%f use_shapekey=%b",
8333 ot->
idname =
"SCULPT_OT_symmetrize";
8346 "Distance within which symmetrical vertices are merged",
8384 for (
int i = 0; i < ss->
totfaces; i++) {
8395 const bool force_dyntopo,
8402 ob->
mode |= mode_flag;
8409 reports,
RPT_WARNING,
"Object has non-uniform scale, sculpting may be unpredictable");
8425 const char *message_unsupported =
NULL;
8427 message_unsupported =
TIP_(
"non-triangle face");
8429 else if (mmd !=
NULL) {
8430 message_unsupported =
TIP_(
"multi-res modifier");
8438 message_unsupported =
TIP_(
"vertex data");
8441 message_unsupported =
TIP_(
"edge data");
8444 message_unsupported =
TIP_(
"face data");
8447 message_unsupported =
TIP_(
"constructive modifier");
8454 if ((message_unsupported ==
NULL) || force_dyntopo) {
8470 reports,
RPT_WARNING,
"Dynamic Topology found: %s, disabled", message_unsupported);
8498 const int flush_recalc = ed_object_sculptmode_flush_recalc_flag(
scene, ob, mmd);
8518 ob->
mode &= ~mode_flag;
8550 const bool is_mode_set = (ob->
mode & mode_flag) != 0;
8568 if (ob->
mode & mode_flag) {
8594 ot->
name =
"Sculpt Mode";
8595 ot->
idname =
"SCULPT_OT_sculptmode_toggle";
8653 if (totpoints + (ni.
size * 2) < max_preview_vertices) {
8654 int to_v = ni.
index;
8696 if (mloopcol_layer_n == -1) {
8702 if (MPropCol_layer_n == -1) {
8711 MPoly *c_poly = &polys[i];
8712 for (
int j = 0; j < c_poly->
totloop; j++) {
8715 loopcols[loop_index].
r = (char)(vertcols[c_loop->
v].
color[0] * 255);
8716 loopcols[loop_index].
g = (char)(vertcols[c_loop->
v].
color[1] * 255);
8717 loopcols[loop_index].
b = (char)(vertcols[c_loop->
v].
color[2] * 255);
8718 loopcols[loop_index].
a = (char)(vertcols[c_loop->
v].
color[3] * 255);
8731 ot->
name =
"Sculpt Vertex Color to Vertex Color";
8732 ot->
description =
"Copy the Sculpt Vertex Color to a regular color layer";
8733 ot->
idname =
"SCULPT_OT_vertex_to_loop_colors";
8759 if (mloopcol_layer_n == -1) {
8765 if (MPropCol_layer_n == -1) {
8774 MPoly *c_poly = &polys[i];
8775 for (
int j = 0; j < c_poly->
totloop; j++) {
8778 vertcols[c_loop->
v].
color[0] = (loopcols[loop_index].
r / 255.0f);
8779 vertcols[c_loop->
v].
color[1] = (loopcols[loop_index].
g / 255.0f);
8780 vertcols[c_loop->
v].
color[2] = (loopcols[loop_index].
b / 255.0f);
8781 vertcols[c_loop->
v].
color[3] = (loopcols[loop_index].
a / 255.0f);
8794 ot->
name =
"Vertex Color to Sculpt Vertex Color";
8795 ot->
description =
"Copy the active loop color layer to the vertex color";
8796 ot->
idname =
"SCULPT_OT_loop_to_vertex_colors";
8816 if (!active_vertex_color) {
8820 float color_srgb[3];
8833 ot->
name =
"Sample Color";
8834 ot->
idname =
"SCULPT_OT_sample_color";
8835 ot->
description =
"Sample the vertex color of the active vertex";
8883 totvert,
sizeof(
int),
"fake neighbor");
8884 for (
int i = 0; i < totvert; i++) {
8924 if (distance_squared < nvtd->nearest_vertex_distance_squared &&
8925 distance_squared < data->max_distance_squared) {
8935 void *__restrict chunk_join,
8936 void *__restrict chunk)
8958 .radius_squared = max_distance * max_distance,
8972 .max_distance_squared = max_distance * max_distance,
9020 for (
int i = 0; i < totvert; i++) {
9025 for (
int i = 0; i < totvert; i++) {
9031 data.next_id = next_id;
9049 base_mesh->
totedge,
sizeof(
int),
"Adjacent face edge count");
9051 for (
int p = 0; p < base_mesh->
totpoly; p++) {
9055 adjacent_faces_edge_count[loop->
e]++;
9059 for (
int e = 0;
e < base_mesh->
totedge;
e++) {
9060 if (adjacent_faces_edge_count[
e] < 2) {
9085 for (
int i = 0; i < totvert; i++) {
9086 const int from_v = i;
9128 #define MASK_BY_COLOR_SLOPE 0.25f
9131 const float *color_b,
9132 const float threshold,
9142 else if (
len >= threshold) {
9156 const float new_mask,
9158 const bool preserve_mask)
9160 if (preserve_mask) {
9162 return min_ff(current_mask, new_mask);
9164 return max_ff(current_mask, new_mask);
9183 bool update_node =
false;
9185 const bool invert =
data->mask_by_color_invert;
9186 const bool preserve_mask =
data->mask_by_color_preserve_mask;
9190 const float current_mask = *vd.
mask;
9191 const float new_mask =
data->mask_by_color_floodfill[vd.
index];
9193 if (current_mask == *vd.
mask) {
9208 SculptSession *ss,
int from_v,
int to_v,
bool is_duplicate,
void *userdata)
9213 current_color,
data->initial_color,
data->threshold,
data->invert);
9214 data->new_mask[to_v] = new_vertex_mask;
9217 data->new_mask[to_v] =
data->new_mask[from_v];
9222 return len <=
data->threshold;
9227 const float threshold,
9229 const bool preserve_mask)
9237 for (
int i = 0; i < totvert; i++) {
9262 .mask_by_color_floodfill = new_mask,
9263 .mask_by_color_vertex = vertex,
9264 .mask_by_color_threshold = threshold,
9265 .mask_by_color_invert =
invert,
9266 .mask_by_color_preserve_mask = preserve_mask,
9287 bool update_node =
false;
9289 const float threshold =
data->mask_by_color_threshold;
9290 const bool invert =
data->mask_by_color_invert;
9291 const bool preserve_mask =
data->mask_by_color_preserve_mask;
9296 const float current_mask = *vd.
mask;
9300 if (current_mask == *vd.
mask) {
9316 const float threshold,
9318 const bool preserve_mask)
9329 .mask_by_color_vertex = vertex,
9330 .mask_by_color_threshold = threshold,
9331 .mask_by_color_invert =
invert,
9332 .mask_by_color_preserve_mask = preserve_mask,
9365 mouse[0] =
event->mval[0];
9366 mouse[1] =
event->mval[1];
9394 ot->
name =
"Mask by Color";
9395 ot->
idname =
"SCULPT_OT_mask_by_color";
9396 ot->
description =
"Creates a mask based on the sculpt vertex colors";
9405 ot->
srna,
"contiguous",
false,
"Contiguous",
"Mask only contiguous color areas");
9410 "preserve_previous_mask",
9412 "Preserve Previous Mask",
9413 "Preserve the previous mask and add or subtract the new one generated by the colors");
9421 "How much changes in color affect the mask generation",
typedef float(TangentPoint)[2]
unsigned int * BKE_brush_gen_texture_cache(struct Brush *br, int half_side, bool use_secondary)
void BKE_brush_size_set(struct Scene *scene, struct Brush *brush, int size)
bool BKE_brush_use_size_pressure(const struct Brush *brush)
float BKE_brush_alpha_get(const struct Scene *scene, const struct Brush *brush)
float BKE_brush_curve_strength(const struct Brush *br, float p, const float len)
int BKE_brush_size_get(const struct Scene *scene, const struct Brush *brush)
float BKE_brush_unprojected_radius_get(const struct Scene *scene, const struct Brush *brush)
void BKE_brush_unprojected_radius_set(struct Scene *scene, struct Brush *brush, float unprojected_radius)
bool BKE_brush_use_locked_size(const struct Scene *scene, const struct Brush *brush)
void BKE_brush_color_set(struct Scene *scene, struct Brush *brush, const float color[3])
float BKE_brush_sample_tex_3d(const struct Scene *scene, const struct Brush *br, const float point[3], float rgba[4], const int thread, struct ImagePool *pool)
bool BKE_brush_use_alpha_pressure(const struct Brush *brush)
BLI_INLINE float * CCG_elem_mask(const CCGKey *key, CCGElem *elem)
BLI_INLINE CCGElem * CCG_elem_offset(const CCGKey *key, CCGElem *elem, int offset)
BLI_INLINE float * CCG_elem_no(const CCGKey *key, CCGElem *elem)
BLI_INLINE float * CCG_elem_co(const CCGKey *key, CCGElem *elem)
struct Scene * CTX_data_scene(const bContext *C)
struct wmWindowManager * CTX_wm_manager(const bContext *C)
struct ViewLayer * CTX_data_view_layer(const bContext *C)
struct Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
struct Depsgraph * CTX_data_depsgraph_on_load(const bContext *C)
struct Object * CTX_data_active_object(const bContext *C)
struct View3D * CTX_wm_view3d(const bContext *C)
struct wmMsgBus * CTX_wm_message_bus(const bContext *C)
struct ARegion * CTX_wm_region(const bContext *C)
struct Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
struct Main * CTX_data_main(const bContext *C)
struct ToolSettings * CTX_data_tool_settings(const bContext *C)
struct RegionView3D * CTX_wm_region_view3d(const bContext *C)
int CustomData_get_active_layer(const struct CustomData *data, int type)
void * CustomData_get_layer_n(const struct CustomData *data, int type, int n)
void * CustomData_get_layer(const struct CustomData *data, int type)
int CustomData_get_offset(const struct CustomData *data, int type)
struct ImagePool * BKE_image_pool_new(void)
void BKE_image_pool_free(struct ImagePool *pool)
void BKE_kelvinlet_grab(float radius_elem_disp[3], const KelvinletParams *params, const float elem_orig_co[3], const float brush_location[3], const float brush_delta[3])
void BKE_kelvinlet_grab_triscale(float radius_elem_disp[3], const KelvinletParams *params, const float elem_orig_co[3], const float brush_location[3], const float brush_delta[3])
void BKE_kelvinlet_init_params(KelvinletParams *params, float radius, float force, float shear_modulus, float poisson_ratio)
void BKE_kelvinlet_grab_biscale(float radius_elem_disp[3], const KelvinletParams *params, const float elem_orig_co[3], const float brush_location[3], const float brush_delta[3])
void BKE_kelvinlet_scale(float radius_elem_disp[3], const KelvinletParams *params, const float elem_orig_co[3], const float brush_location[3], const float surface_normal[3])
void BKE_kelvinlet_twist(float radius_elem_disp[3], const KelvinletParams *params, const float elem_orig_co[3], const float brush_location[3], const float surface_normal[3])
float(* BKE_keyblock_convert_to_vertcos(struct Object *ob, struct KeyBlock *kb))[3]
void BKE_keyblock_update_from_offset(struct Object *ob, struct KeyBlock *kb, const float(*ofs)[3])
bool BKE_keyblock_is_basis(struct Key *key, const int index)
void BKE_keyblock_update_from_vertcos(struct Object *ob, struct KeyBlock *kb, const float(*vertCos)[3])
struct ID * BKE_libblock_find_name(struct Main *bmain, const short type, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
int poly_get_adj_loops_from_vert(const struct MPoly *poly, const struct MLoop *mloop, unsigned int vert, unsigned int r_adj[2])
struct Mesh * BKE_mesh_from_object(struct Object *ob)
void BKE_mesh_calc_normals(struct Mesh *me)
void BKE_mesh_batch_cache_dirty_tag(struct Mesh *me, eMeshBatchDirtyMode mode)
void BKE_mesh_mirror_apply_mirror_on_axis(struct Main *bmain, struct Mesh *mesh, const int axis, const float dist)
@ BKE_MESH_BATCH_DIRTY_ALL
void multires_stitch_grids(struct Object *)
void multires_flush_sculpt_updates(struct Object *object)
void multires_mark_as_modified(struct Depsgraph *depsgraph, struct Object *object, enum MultiresModifiedFlags flags)
void ntreeTexEndExecTree(struct bNodeTreeExec *exec)
struct bNodeTreeExec * ntreeTexBeginExecTree(struct bNodeTree *ntree)
General operations, lookup, etc. for blender objects.
struct Mesh * BKE_object_get_original_mesh(struct Object *object)
void BKE_boundbox_init_from_minmax(struct BoundBox *bb, const float min[3], const float max[3])
void BKE_object_free_derived_caches(struct Object *ob)
struct BoundBox * BKE_object_boundbox_get(struct Object *ob)
void BKE_paint_brush_set(struct Paint *paint, struct Brush *br)
#define PAINT_SYMM_AREA_DEFAULT
void BKE_sculpt_sync_face_sets_visibility_to_base_mesh(struct Mesh *mesh)
struct Paint * BKE_paint_get_active_from_paintmode(struct Scene *sce, ePaintMode mode)
void BKE_sculpt_sync_face_sets_visibility_to_grids(struct Mesh *mesh, struct SubdivCCG *subdiv_ccg)
void BKE_sculpt_toolsettings_data_ensure(struct Scene *scene)
void BKE_sculpt_update_object_for_edit(struct Depsgraph *depsgraph, struct Object *ob_orig, bool need_pmap, bool need_mask, bool need_colors)
const char PAINT_CURSOR_SCULPT[3]
struct Brush * BKE_paint_brush(struct Paint *paint)
void BKE_paint_init(struct Main *bmain, struct Scene *sce, ePaintMode mode, const char col[3])
#define SCULPT_FACE_SET_NONE
void BKE_sculptsession_free(struct Object *ob)
struct Paint * BKE_paint_get_active_from_context(const struct bContext *C)
void BKE_paint_toolslots_brush_validate(struct Main *bmain, struct Paint *paint)
void BKE_sculpt_color_layer_create_if_needed(struct Object *object)
struct MultiresModifierData * BKE_sculpt_multires_active(struct Scene *scene, struct Object *ob)
bool BKE_sculptsession_use_pbvh_draw(const struct Object *ob, const struct View3D *v3d)
void BKE_sculpt_ensure_orig_mesh_data(struct Scene *scene, struct Object *object)
A BVH for high poly meshes.
bool BKE_pbvh_node_fully_masked_get(PBVHNode *node)
void BKE_pbvh_node_free_proxies(PBVHNode *node)
void BKE_pbvh_node_mark_update(PBVHNode *node)
BLI_bitmap ** BKE_pbvh_get_grid_visibility(const PBVH *pbvh)
void BKE_pbvh_node_get_bm_orco_data(PBVHNode *node, int(**r_orco_tris)[3], int *r_orco_tris_num, float(**r_orco_coords)[3])
#define BKE_pbvh_vertex_iter_begin(pbvh, node, vi, mode)
void BKE_pbvh_node_get_original_BB(PBVHNode *node, float bb_min[3], float bb_max[3])
struct CCGElem ** BKE_pbvh_get_grids(const PBVH *pbvh)
void BKE_pbvh_node_mark_update_color(PBVHNode *node)
void BKE_pbvh_raycast_project_ray_root(PBVH *pbvh, bool original, float ray_start[3], float ray_end[3], float ray_normal[3])
void BKE_pbvh_gather_proxies(PBVH *pbvh, PBVHNode ***r_array, int *r_tot)
void BKE_pbvh_redraw_BB(PBVH *pbvh, float bb_min[3], float bb_max[3])
void BKE_pbvh_find_nearest_to_ray(PBVH *pbvh, BKE_pbvh_HitOccludedCallback cb, void *data, const float ray_start[3], const float ray_normal[3], bool original)
void BKE_pbvh_bmesh_node_save_orig(struct BMesh *bm, PBVHNode *node)
float(* BKE_pbvh_vert_coords_alloc(struct PBVH *pbvh))[3]
void BKE_pbvh_node_get_BB(PBVHNode *node, float bb_min[3], float bb_max[3])
void BKE_pbvh_node_color_buffer_free(PBVH *pbvh)
PBVHType BKE_pbvh_type(const PBVH *pbvh)
float BKE_pbvh_node_get_tmin(PBVHNode *node)
bool BKE_pbvh_bmesh_update_topology(PBVH *pbvh, PBVHTopologyUpdateMode mode, const float center[3], const float view_normal[3], float radius, const bool use_frontface, const bool use_projected)
struct BMesh * BKE_pbvh_get_bmesh(PBVH *pbvh)
bool BKE_pbvh_node_raycast(PBVH *pbvh, PBVHNode *node, float(*origco)[3], bool use_origco, const float ray_start[3], const float ray_normal[3], struct IsectRayPrecalc *isect_precalc, float *depth, int *active_vertex_index, int *active_face_grid_index, float *face_normal)
void BKE_pbvh_raycast(PBVH *pbvh, BKE_pbvh_HitOccludedCallback cb, void *data, const float ray_start[3], const float ray_normal[3], bool original)
#define BKE_pbvh_vertex_iter_end
int BKE_pbvh_get_grid_num_vertices(const PBVH *pbvh)
const struct CCGKey * BKE_pbvh_get_grid_key(const PBVH *pbvh)
bool BKE_pbvh_node_find_nearest_to_ray(PBVH *pbvh, PBVHNode *node, float(*origco)[3], bool use_origco, const float ray_start[3], const float ray_normal[3], float *depth, float *dist_sq)
PBVHProxyNode * BKE_pbvh_node_add_proxy(PBVH *pbvh, PBVHNode *node)
bool BKE_pbvh_node_fully_hidden_get(PBVHNode *node)
void BKE_pbvh_parallel_range_settings(struct TaskParallelSettings *settings, bool use_threading, int totnode)
struct MVert * BKE_pbvh_get_verts(const PBVH *pbvh)
void BKE_pbvh_update_vertex_data(PBVH *pbvh, int flags)
void BKE_pbvh_bmesh_after_stroke(PBVH *pbvh)
void BKE_pbvh_node_mark_update_mask(PBVHNode *node)
void BKE_pbvh_update_bounds(PBVH *pbvh, int flags)
void BKE_pbvh_bounding_box(const PBVH *pbvh, float min[3], float max[3])
void BKE_pbvh_node_mark_redraw(PBVHNode *node)
void BKE_pbvh_bmesh_detail_size_set(PBVH *pbvh, float detail_size)
void BKE_pbvh_node_get_proxies(PBVHNode *node, PBVHProxyNode **proxies, int *proxy_count)
void BKE_pbvh_node_mark_topology_update(PBVHNode *node)
void BKE_pbvh_search_gather(PBVH *pbvh, BKE_pbvh_SearchCallback scb, void *search_data, PBVHNode ***array, int *tot)
void BKE_report(ReportList *reports, ReportType type, const char *message)
void BKE_reportf(ReportList *reports, ReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_scene_graph_evaluated_ensure(struct Depsgraph *depsgraph, struct Main *bmain)
SubdivCCGAdjacencyType BKE_subdiv_ccg_coarse_mesh_adjacency_info_get(const SubdivCCG *subdiv_ccg, const SubdivCCGCoord *coord, const MLoop *mloop, const MPoly *mpoly, int *r_v1, int *r_v2)
void BKE_subdiv_ccg_neighbor_coords_get(const SubdivCCG *subdiv_ccg, const SubdivCCGCoord *coord, const bool include_duplicates, SubdivCCGNeighbors *r_neighbors)
void BKE_subdiv_ccg_eval_limit_point(const SubdivCCG *subdiv_ccg, const SubdivCCGCoord *coord, float r_point[3])
@ SUBDIV_CCG_ADJACENT_EDGE
@ SUBDIV_CCG_ADJACENT_VERTEX
@ SUBDIV_CCG_ADJACENT_NONE
int BKE_subdiv_ccg_grid_to_face_index(const SubdivCCG *subdiv_ccg, const int grid_index)
@ MULTIRES_COORDS_MODIFIED
#define BLI_BITMAP_TEST(_bitmap, _index)
#define BLI_BITMAP_ENABLE(_bitmap, _index)
#define BLI_BITMAP_NEW(_tot, _alloc_string)
#define BLI_BITMAP_SET(_bitmap, _index, _set)
Dial * BLI_dial_init(const float start_position[2], float threshold)
float BLI_dial_angle(Dial *dial, const float current_position[2])
void BLI_gsqueue_free(GSQueue *queue)
void BLI_gsqueue_push(GSQueue *queue, const void *item)
GSQueue * BLI_gsqueue_new(const size_t elem_size)
void BLI_gsqueue_pop(GSQueue *queue, void *r_item)
bool BLI_gsqueue_is_empty(const GSQueue *queue)
#define LISTBASE_FOREACH(type, var, list)
MINLINE float max_ff(float a, float b)
MINLINE float pow2f(float x)
MINLINE float clamp_f(float value, float min, float max)
MINLINE float min_ff(float a, float b)
MINLINE float square_f(float a)
MINLINE float pow3f(float x)
MINLINE float pow4f(float x)
void plane_from_point_normal_v3(float r_plane[4], const float plane_co[3], const float plane_no[3])
void isect_ray_tri_watertight_v3_precalc(struct IsectRayPrecalc *isect_precalc, const float ray_direction[3])
MINLINE float plane_point_side_v3(const float plane[4], const float co[3])
void closest_to_plane_normalized_v3(float r_close[3], const float plane[4], const float pt[3])
void dist_squared_ray_to_aabb_v3_precalc(struct DistRayAABB_Precalc *neasrest_precalc, const float ray_origin[3], const float ray_direction[3])
void closest_on_tri_to_point_v3(float r[3], const float p[3], const float v1[3], const float v2[3], const float v3[3])
float dist_signed_to_plane_v3(const float p[3], const float plane[4])
float dist_squared_ray_to_aabb_v3(const struct DistRayAABB_Precalc *data, const float bb_min[3], const float bb_max[3], float r_point[3], float *r_depth)
void closest_to_plane_v3(float r_close[3], const float plane[4], const float pt[3])
float normal_tri_v3(float n[3], const float v1[3], const float v2[3], const float v3[3])
void mul_m3_v3(const float M[3][3], float r[3])
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void copy_m3_m4(float m1[3][3], const float m2[4][4])
void unit_m4(float m[4][4])
void mul_mat3_m4_v3(const float M[4][4], float r[3])
bool invert_m4_m4(float R[4][4], const float A[4][4])
void mul_m4_v3(const float M[4][4], float r[3])
void scale_m4_fl(float R[4][4], float scale)
void copy_m4_m4(float m1[4][4], const float m2[4][4])
bool is_negative_m4(const float mat[4][4])
float mat4_to_scale(const float M[4][4])
void mul_v3_m4v3(float r[3], const float M[4][4], const float v[3])
void mul_v3_m3v3(float r[3], const float M[3][3], const float a[3])
void mul_v3_mat3_m4v3(float r[3], const float M[4][4], const float v[3])
void rotate_m4(float mat[4][4], const char axis, const float angle)
void normalize_m4(float R[4][4]) ATTR_NONNULL()
void rotation_between_vecs_to_quat(float q[4], const float v1[3], const float v2[3])
void axis_angle_to_mat3_single(float R[3][3], const char axis, const float angle)
void mul_qt_v3(const float q[4], float r[3])
void axis_angle_normalized_to_mat3(float R[3][3], const float axis[3], const float angle)
void axis_angle_normalized_to_quat(float r[4], const float axis[3], const float angle)
void quat_to_axis_angle(float axis[3], float *angle, const float q[4])
void copy_qt_qt(float q[4], const float a[4])
void pow_qt_fl_normalized(float q[4], const float f)
MINLINE void copy_v4_v4(float r[4], const float a[4])
void interp_v3_v3v3(float r[3], const float a[3], const float b[3], const float t)
MINLINE float len_squared_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void mul_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE float normalize_v3(float r[3])
MINLINE void mul_v3_v3(float r[3], const float a[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 normal_short_to_float_v3(float r[3], const short n[3])
MINLINE bool is_zero_v4(const float a[4]) ATTR_WARN_UNUSED_RESULT
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE bool is_zero_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void copy_v3_v3_int(int r[3], const int a[3])
void project_plane_v3_v3v3(float out[3], const float p[3], const float v_plane[3])
MINLINE float dot_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
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])
void rotate_v3_v3v3fl(float r[3], const float p[3], const float axis[3], const float angle)
MINLINE void copy_v3_v3_short(short r[3], const short a[3])
MINLINE void negate_v3(float r[3])
MINLINE void zero_v4(float r[4])
MINLINE float normalize_v3_v3(float r[3], const float a[3])
MINLINE void zero_v2(float r[2])
MINLINE void copy_v3_fl(float r[3], float f)
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])
MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void add_v2_v2_int(int r[2], const int a[2])
MINLINE void add_v3_v3(float r[3], const float a[3])
MINLINE float len_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
void BLI_rcti_union(struct rcti *rct1, const struct rcti *rct2)
bool BLI_rcti_is_empty(const struct rcti *rect)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, const size_t maxncpy) ATTR_NONNULL()
void BLI_task_parallel_range(const int start, const int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
int BLI_task_parallel_thread_id(const TaskParallelTLS *tls)
#define UNUSED_FUNCTION(x)
#define ARRAY_SET_ITEMS(...)
#define SET_FLAG_FROM_TEST(value, test, flag)
struct Depsgraph Depsgraph
void DEG_id_tag_update(struct ID *id, int flag)
@ ID_RECALC_COPY_ON_WRITE
#define ID_IS_LINKED(_id)
#define ID_REAL_USERS(id)
#define SCULPT_TOOL_HAS_DYNTOPO(t)
#define SCULPT_TOOL_HAS_ACCUMULATE(t)
@ BRUSH_DEFORM_TARGET_CLOTH_SIM
@ BRUSH_DEFORM_TARGET_GEOMETRY
@ BRUSH_SMEAR_DEFORM_PINCH
@ BRUSH_SMEAR_DEFORM_EXPAND
@ BRUSH_SMEAR_DEFORM_DRAG
#define SCULPT_TOOL_HAS_TOPOLOGY_RAKE(t)
@ BRUSH_GRAB_ACTIVE_VERTEX
@ BRUSH_INVERSE_SMOOTH_PRESSURE
@ BRUSH_INVERT_TO_SCRAPE_FILL
@ BRUSH_CLOTH_DEFORM_EXPAND
@ BRUSH_CLOTH_DEFORM_GRAB
@ BRUSH_CLOTH_DEFORM_SNAKE_HOOK
@ BRUSH_SNAKE_HOOK_DEFORM_ELASTIC
@ SCULPT_TOOL_DRAW_FACE_SETS
@ SCULPT_TOOL_DISPLACEMENT_ERASER
@ SCULPT_TOOL_SLIDE_RELAX
@ SCULPT_TOOL_DISPLACEMENT_SMEAR
@ SCULPT_TOOL_MULTIPLANE_SCRAPE
@ SCULPT_TOOL_ELASTIC_DEFORM
@ SCULPT_TOOL_CLAY_STRIPS
@ BRUSH_ELASTIC_DEFORM_SCALE
@ BRUSH_ELASTIC_DEFORM_GRAB
@ BRUSH_ELASTIC_DEFORM_TWIST
@ BRUSH_ELASTIC_DEFORM_GRAB_BISCALE
@ BRUSH_ELASTIC_DEFORM_GRAB_TRISCALE
@ BRUSH_SMOOTH_DEFORM_SURFACE
@ BRUSH_SMOOTH_DEFORM_LAPLACIAN
@ BRUSH_PAINT_WET_MIX_PRESSURE
@ BRUSH_PAINT_HARDNESS_PRESSURE
@ BRUSH_PAINT_FLOW_PRESSURE
@ BRUSH_PAINT_DENSITY_PRESSURE
@ BRUSH_PAINT_WET_PERSISTENCE_PRESSURE
@ BRUSH_PAINT_WET_MIX_PRESSURE_INVERT
@ BRUSH_PAINT_HARDNESS_PRESSURE_INVERT
@ BRUSH_PAINT_FLOW_PRESSURE_INVERT
@ BRUSH_PAINT_DENSITY_PRESSURE_INVERT
@ BRUSH_PAINT_WET_PERSISTENCE_PRESSURE_INVERT
@ PAINT_FALLOFF_SHAPE_SPHERE
@ PAINT_FALLOFF_SHAPE_TUBE
@ BRUSH_AREA_RADIUS_PRESSURE
#define SCULPT_TOOL_HAS_NORMAL_WEIGHT(t)
#define SCULPT_TOOL_HAS_RAKE(t)
@ BRUSH_SLIDE_DEFORM_DRAG
@ BRUSH_SLIDE_DEFORM_EXPAND
@ BRUSH_SLIDE_DEFORM_PINCH
@ ME_SCULPT_DYNAMIC_TOPOLOGY
Object is a sort of wrapper for general info.
@ SCULPT_DYNTOPO_SUBDIVIDE
@ SCULPT_DYNTOPO_DETAIL_MANUAL
@ SCULPT_DYNTOPO_DETAIL_CONSTANT
@ SCULPT_DYNTOPO_COLLAPSE
@ SCULPT_DYNTOPO_DETAIL_BRUSH
#define OBACT(_view_layer)
#define MTEX_MAP_MODE_AREA
#define RV3D_CLIPPING_ENABLED(v3d, rv3d)
#define OPERATOR_RETVAL_CHECK(ret)
bool ED_object_mode_compat_set(struct bContext *C, struct Object *ob, eObjectMode mode, struct ReportList *reports)
void ED_region_tag_redraw_partial(struct ARegion *region, const struct rcti *rct, bool rebuild)
bool ED_operator_object_active_editable_mesh(struct bContext *C)
void ED_region_tag_redraw(struct ARegion *region)
void ED_sculpt_undo_geometry_begin(struct Object *ob, const char *name)
void ED_sculpt_undo_geometry_end(struct Object *ob)
bool ED_view3d_win_to_segment_clipped(struct Depsgraph *depsgraph, const struct ARegion *region, struct View3D *v3d, const float mval[2], float r_ray_start[3], float r_ray_end[3], const bool do_clip)
void ED_view3d_init_mats_rv3d(struct Object *ob, struct RegionView3D *rv3d)
void ED_view3d_ob_project_mat_get(const struct RegionView3D *v3d, struct Object *ob, float r_pmat[4][4])
void ED_view3d_viewcontext_init(struct bContext *C, struct ViewContext *vc, struct Depsgraph *depsgraph)
void ED_view3d_win_to_delta(const struct ARegion *region, const float mval[2], float out[3], const float zfac)
void ED_view3d_project_float_v2_m4(const struct ARegion *region, const float co[3], float r_co[2], float mat[4][4])
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 view3d_operator_needs_opengl(const struct bContext *C)
bool ED_view3d_clipping_test(const struct RegionView3D *rv3d, const float co[3], const bool is_local)
float ED_view3d_calc_zfac(const struct RegionView3D *rv3d, const float co[3], bool *r_flip)
NSNotificationCenter * center
_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 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 x2
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble t
_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 IMB_colormanagement_scene_linear_to_srgb_v3(float pixel[3])
Read Guarded memory(de)allocation.
Group RGB to Bright Vector Camera Vector Combine Material Light Line Style Layer Add Ambient Diffuse Glossy Refraction Transparent Toon Principled Hair Volume Principled Light Particle Volume Image Sky TEX_NOISE
Platform independent time functions.
#define BM_ELEM_CD_GET_VOID_P(ele, offset)
#define BM_elem_index_get(ele)
#define BM_elem_flag_set(ele, hflag, val)
#define BM_elem_flag_test(ele, hflag)
#define BM_ITER_ELEM(ele, iter, data, itype)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_log_all_added(BMesh *bm, BMLog *log)
void BM_log_original_vert_data(BMLog *log, BMVert *v, const float **r_co, const short **r_no)
float BM_log_original_mask(BMLog *log, BMVert *v)
const float * BM_log_original_vert_co(BMLog *log, BMVert *v)
void BM_log_before_all_removed(BMesh *bm, BMLog *log)
void BM_mesh_elem_hflag_disable_all(BMesh *bm, const char htype, const char hflag, const bool respecthide)
void BM_mesh_toolflags_set(BMesh *bm, bool use_toolflags)
int BM_mesh_elem_count(BMesh *bm, const char htype)
void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
BLI_INLINE BMVert * BM_vert_at_index(BMesh *bm, const int index)
#define BMO_FLAG_DEFAULTS
bool BMO_op_callf(BMesh *bm, const int flag, const char *fmt,...)
bool BM_vert_is_boundary(const BMVert *v)
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
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
SIMD_FORCE_INLINE btScalar angle(const btVector3 &v) const
Return the angle between this and another vector.
const Depsgraph * depsgraph
static CCL_NAMESPACE_BEGIN const double alpha
IconTextureDrawCall normal
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
void *(* MEM_reallocN_id)(void *vmemh, size_t len, const char *str)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
ccl_device_inline float frac(float x, int *ix)
static void area(int d1, int d2, int e1, int e2, float weights[2])
void paint_cursor_delete_textures(void)
void paint_cursor_start(Paint *p, bool(*poll)(bContext *C))
bool paint_poll(struct bContext *C)
struct PaintStroke * paint_stroke_new(struct bContext *C, struct wmOperator *op, StrokeGetLocation get_location, StrokeTestStart test_start, StrokeUpdateStep update_step, StrokeRedraw redraw, StrokeDone done, int event_type)
int paint_stroke_modal(struct bContext *C, struct wmOperator *op, const struct wmEvent *event)
void flip_qt_qt(float out[3], const float in[3], const enum ePaintSymmetryFlags symm)
bool paint_convert_bb_to_rect(struct rcti *rect, const float bb_min[3], const float bb_max[3], const struct ARegion *region, struct RegionView3D *rv3d, struct Object *ob)
int paint_stroke_exec(struct bContext *C, struct wmOperator *op)
void paint_stroke_free(struct bContext *C, struct wmOperator *op)
float paint_calc_object_space_radius(struct ViewContext *vc, const float center[3], float pixel_radius)
void paint_calc_redraw_planes(float planes[4][4], const struct ARegion *region, struct Object *ob, const struct rcti *screen_rect)
bool paint_supports_dynamic_size(struct Brush *br, enum ePaintMode mode)
float paint_get_tex_pixel(const struct MTex *mtex, float u, float v, struct ImagePool *pool, int thread)
void flip_v3_v3(float out[3], const float in[3], const enum ePaintSymmetryFlags symm)
struct ViewContext * paint_stroke_view_context(struct PaintStroke *stroke)
void paint_stroke_cancel(struct bContext *C, struct wmOperator *op)
void paint_stroke_operator_properties(struct wmOperatorType *ot)
void SCULPT_OT_trim_box_gesture(wmOperatorType *ot)
void SCULPT_OT_face_set_box_gesture(wmOperatorType *ot)
void SCULPT_OT_project_line_gesture(wmOperatorType *ot)
void SCULPT_OT_trim_lasso_gesture(wmOperatorType *ot)
void SCULPT_OT_face_set_lasso_gesture(wmOperatorType *ot)
void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
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)
static const char * sculpt_tool_name(Sculpt *sd)
const float * SCULPT_vertex_co_get(SculptSession *ss, int index)
static void sculpt_project_v3_normal_align(SculptSession *ss, const float normal_weight, float grab_delta[3])
static void sculpt_project_v3(const SculptProjectVector *spvc, const float vec[3], float r_vec[3])
bool SCULPT_brush_test_sphere(SculptBrushTest *test, const float co[3])
static bool sculpt_mask_by_color_contiguous_floodfill_cb(SculptSession *ss, int from_v, int to_v, bool is_duplicate, void *userdata)
static void do_slide_relax_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
int SCULPT_vertex_count_get(SculptSession *ss)
static void do_fill_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void do_rotate_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void do_mask_brush_draw_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void flip_qt(float quat[3], const ePaintSymmetryFlags symm)
void SCULPT_orig_vert_data_update(SculptOrigVertData *orig_data, PBVHVertexIter *iter)
void SCULPT_floodfill_add_and_skip_initial(SculptFloodFill *flood, int index)
static void flip_v3(float v[3], const ePaintSymmetryFlags symm)
static bool plane_point_side_flip(const float co[3], const float plane[4], const bool flip)
void SCULPT_floodfill_add_initial_with_symmetry(Sculpt *sd, Object *ob, SculptSession *ss, SculptFloodFill *flood, int index, float radius)
static void sculpt_update_cache_invariants(bContext *C, Sculpt *sd, SculptSession *ss, wmOperator *op, const float mouse[2])
static bool sculpt_no_multires_poll(bContext *C)
void SCULPT_boundary_info_ensure(Object *object)
void SCULPT_vertcos_to_key(Object *ob, KeyBlock *kb, const float(*vertCos)[3])
static void do_displacement_eraser_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void calc_area_normal_and_center(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, float r_area_no[3], float r_area_co[3])
bool SCULPT_stroke_get_location(bContext *C, float out[3], const float mouse[2])
void ED_sculpt_redraw_planes_get(float planes[4][4], ARegion *region, Object *ob)
static void sculpt_extend_redraw_rect_previous(Object *ob, rcti *rect)
int SCULPT_active_vertex_get(SculptSession *ss)
static void SCULPT_OT_mask_by_color(wmOperatorType *ot)
static void do_elastic_deform_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
int SCULPT_nearest_vertex_get(Sculpt *sd, Object *ob, const float co[3], float max_distance, bool use_original)
static void do_nudge_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void sculpt_stroke_update_step(bContext *C, struct PaintStroke *UNUSED(stroke), PointerRNA *itemptr)
bool SCULPT_cursor_geometry_info_update(bContext *C, SculptCursorGeometryInfo *out, const float mouse[2], bool use_sampled_normal)
static int sculpt_optimize_exec(bContext *C, wmOperator *UNUSED(op))
static void do_gravity(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, float bstrength)
bool SCULPT_pbvh_calc_area_normal(const Brush *brush, Object *ob, PBVHNode **nodes, int totnode, bool use_threading, float r_area_no[3])
void SCULPT_floodfill_init(SculptSession *ss, SculptFloodFill *flood)
int SCULPT_plane_point_side(const float co[3], const float plane[4])
void SCULPT_face_set_visibility_set(SculptSession *ss, int face_set, bool visible)
static int SCULPT_fake_neighbor_search(Sculpt *sd, Object *ob, const int index, float max_distance)
void SCULPT_fake_neighbors_ensure(Sculpt *sd, Object *ob, const float max_dist)
static void fake_neighbor_search_reduce(const void *__restrict UNUSED(userdata), void *__restrict chunk_join, void *__restrict chunk)
bool SCULPT_vertex_has_face_set(SculptSession *ss, int index, int face_set)
void SCULPT_vertex_persistent_normal_get(SculptSession *ss, int index, float no[3])
static void calc_area_normal_and_center_reduce(const void *__restrict UNUSED(userdata), void *__restrict chunk_join, void *__restrict chunk)
static int SCULPT_vertex_get_connected_component(SculptSession *ss, int index)
struct NearestVertexTLSData NearestVertexTLSData
static void sculpt_mask_by_color_contiguous(Object *object, const int vertex, const float threshold, const bool invert, const bool preserve_mask)
static bool sculpt_brush_use_topology_rake(const SculptSession *ss, const Brush *brush)
static void do_clay_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void SCULPT_OT_set_persistent_base(wmOperatorType *ot)
static void SCULPT_OT_sculptmode_toggle(wmOperatorType *ot)
static void do_thumb_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void sculpt_combine_proxies(Sculpt *sd, Object *ob)
static void do_snake_hook_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static int sculpt_brush_needs_normal(const SculptSession *ss, const Brush *brush)
bool SCULPT_vertex_has_unique_face_set(SculptSession *ss, int index)
void SCULPT_cache_calc_brushdata_symm(StrokeCache *cache, const char symm, const char axis, const float angle)
void SCULPT_relax_vertex(SculptSession *ss, PBVHVertexIter *vd, float factor, bool filter_boundary_face_sets, float *r_final_pos)
static void do_topology_slide_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static int sculpt_symmetrize_exec(bContext *C, wmOperator *op)
const float * SCULPT_brush_frontface_normal_from_falloff_shape(SculptSession *ss, char falloff_shape)
static void do_nearest_vertex_get_task_cb(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
SculptBrushTestFn SCULPT_brush_test_init_with_falloff_shape(SculptSession *ss, SculptBrushTest *test, char falloff_shape)
void SCULPT_tilt_effective_normal_get(const SculptSession *ss, const Brush *brush, float r_no[3])
static void do_clay_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void sculpt_project_v3_cache_init(SculptProjectVector *spvc, const float plane[3])
static void do_clay_strips_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static float sculpt_clay_thumb_get_stabilized_pressure(StrokeCache *cache)
struct NearestVertexFakeNeighborTLSData NearestVertexFakeNeighborTLSData
static void do_brush_action_task_cb(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict UNUSED(tls))
void SCULPT_fake_neighbors_free(Object *ob)
static void do_rotate_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
bool SCULPT_vertex_any_face_set_visible_get(SculptSession *ss, int index)
const float * SCULPT_vertex_co_for_grab_active_get(SculptSession *ss, int index)
BLI_INLINE bool sculpt_brush_test_clipping(const SculptBrushTest *test, const float co[3])
static void sculpt_vertex_neighbor_add(SculptVertexNeighborIter *iter, int neighbor_index)
static void do_displacement_smear_store_prev_disp_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict UNUSED(tls))
void SCULPT_vertex_face_set_set(SculptSession *ss, int index, int face_set)
bool SCULPT_brush_test_circle_sq(SculptBrushTest *test, const float co[3])
static void do_pinch_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
void SCULPT_floodfill_add_initial(SculptFloodFill *flood, int index)
static void sculpt_rake_rotate(const SculptSession *ss, const float sculpt_co[3], const float v_co[3], float factor, float r_delta[3])
void(* BrushActionFunc)(Sculpt *sd, Object *ob, Brush *brush, UnifiedPaintSettings *ups)
static void SCULPT_OT_loop_to_vertex_colors(wmOperatorType *ot)
static void do_elastic_deform_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict UNUSED(tls))
bool SCULPT_is_symmetry_iteration_valid(char i, char symm)
static void sculpt_flush_pbvhvert_deform(Object *ob, PBVHVertexIter *vd)
void SCULPT_connected_components_ensure(Object *ob)
static void do_crease_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
const float * SCULPT_active_vertex_co_get(SculptSession *ss)
static bool sculpt_stroke_test_start(bContext *C, struct wmOperator *op, const float mouse[2])
static void calc_area_normal_and_center_task_cb(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void SCULPT_OT_sample_color(wmOperatorType *ot)
void SCULPT_vertex_random_access_ensure(SculptSession *ss)
void SCULPT_geometry_preview_lines_update(bContext *C, SculptSession *ss, float radius)
static void do_crease_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void do_nudge_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void do_grab_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_flush_update_done(const bContext *C, Object *ob, SculptUpdateType update_flags)
struct SculptProjectVector SculptProjectVector
static int sculpt_brush_stroke_exec(bContext *C, wmOperator *op)
bool SCULPT_brush_test_cube(SculptBrushTest *test, const float co[3], const float local[4][4], const float roundness)
bool SCULPT_search_sphere_cb(PBVHNode *node, void *data_v)
static void sculpt_combine_proxies_task_cb(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict UNUSED(tls))
void SCULPT_stroke_modifiers_check(const bContext *C, Object *ob, const Brush *brush)
void SCULPT_vertex_visible_set(SculptSession *ss, int index, bool visible)
static void sculpt_vertex_neighbors_get_grids(SculptSession *ss, const int index, const bool include_duplicates, SculptVertexNeighborIter *iter)
bool SCULPT_vertex_visible_get(SculptSession *ss, int index)
static void calc_clay_surface_reduce(const void *__restrict UNUSED(userdata), void *__restrict chunk_join, void *__restrict chunk)
static void SCULPT_flush_stroke_deform_task_cb(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict UNUSED(tls))
static void do_brush_action(Sculpt *sd, Object *ob, Brush *brush, UnifiedPaintSettings *ups)
static void UNUSED_FUNCTION() sculpt_visibility_sync_vertex_to_face_sets(SculptSession *ss, int index)
void ED_object_sculptmode_exit(bContext *C, Depsgraph *depsgraph)
static int sculpt_sample_color_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *UNUSED(e))
void SCULPT_face_sets_visibility_all_set(SculptSession *ss, bool visible)
static void paint_mesh_restore_co_task_cb(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict UNUSED(tls))
float * SCULPT_brush_deform_target_vertex_co_get(SculptSession *ss, const int deform_target, PBVHVertexIter *iter)
static void sculpt_init_session(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob)
static void do_scrape_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static bool over_mesh(bContext *C, struct wmOperator *UNUSED(op), float x, float y)
static void SCULPT_OT_optimize(wmOperatorType *ot)
static bool sculpt_check_unique_face_set_for_edge_in_base_mesh(SculptSession *ss, int v1, int v2)
static void do_grab_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void do_draw_sharp_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void sculpt_raycast_cb(PBVHNode *node, void *data_v, float *tmin)
void SCULPT_face_sets_visibility_invert(SculptSession *ss)
static void sculpt_restore_mesh(Sculpt *sd, Object *ob)
static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, Object *ob, PointerRNA *ptr)
static void do_flatten_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_orig_vert_data_unode_init(SculptOrigVertData *data, Object *ob, SculptUndoNode *unode)
static int sculpt_brush_stroke_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void do_layer_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
void SCULPT_flush_update_step(bContext *C, SculptUpdateType update_flags)
static void do_layer_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_vertex_normal_get(SculptSession *ss, int index, float no[3])
static void sculpt_update_keyblock(Object *ob)
static void do_fill_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void calc_sculpt_plane(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, float r_area_no[3], float r_area_co[3])
void SCULPT_vertex_limit_surface_get(SculptSession *ss, int index, float r_co[3])
static PBVHNode ** sculpt_pbvh_gather_cursor_update(Object *ob, Sculpt *sd, bool use_original, int *r_totnode)
struct SculptTopologyIDFloodFillData SculptTopologyIDFloodFillData
static void do_thumb_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void bmesh_topology_rake(Sculpt *sd, Object *ob, PBVHNode **nodes, const int totnode, float bstrength)
bool SCULPT_stroke_is_dynamic_topology(const SculptSession *ss, const Brush *brush)
bool SCULPT_vertex_is_boundary(const SculptSession *ss, const int index)
static void sculpt_fix_noise_tear(Sculpt *sd, Object *ob)
static int sculpt_set_persistent_base_exec(bContext *C, wmOperator *UNUSED(op))
void SCULPT_flip_v3_by_symm_area(float v[3], const ePaintSymmetryFlags symm, const ePaintSymmetryAreas symmarea, const float pivot[3])
static void SCULPT_OT_vertex_to_loop_colors(wmOperatorType *ot)
bool SCULPT_vertex_colors_poll(bContext *C)
static void do_clay_strips_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void SCULPT_OT_brush_stroke(wmOperatorType *ot)
static bool sculpt_tool_is_proxy_used(const char sculpt_tool)
static void sculpt_brush_stroke_cancel(bContext *C, wmOperator *op)
static void do_draw_sharp_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
bool SCULPT_mode_poll_view3d(bContext *C)
float SCULPT_brush_plane_offset_get(Sculpt *sd, SculptSession *ss)
void SCULPT_floodfill_free(SculptFloodFill *flood)
static float calc_radial_symmetry_feather(Sculpt *sd, StrokeCache *cache, const char symm, const char axis)
void ED_object_sculptmode_exit_ex(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob)
static float sculpt_mask_by_color_delta_get(const float *color_a, const float *color_b, const float threshold, const bool invert)
static int vertex_to_loop_colors_exec(bContext *C, wmOperator *UNUSED(op))
bool SCULPT_mode_poll(bContext *C)
void SCULPT_fake_neighbors_enable(Object *ob)
bool SCULPT_stroke_is_main_symmetry_pass(StrokeCache *cache)
static float brush_strength(const Sculpt *sd, const StrokeCache *cache, const float feather, const UnifiedPaintSettings *ups)
static void sculpt_update_cache_paint_variants(StrokeCache *cache, const Brush *brush)
static void sculpt_mask_by_color_full_mesh(Object *object, const int vertex, const float threshold, const bool invert, const bool preserve_mask)
#define SCULPT_VERTEX_NEIGHBOR_FIXED_CAPACITY
static void do_topology_rake_bmesh_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void do_pinch_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void do_mask_by_color_task_cb(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict UNUSED(tls))
void SCULPT_active_vertex_normal_get(SculptSession *ss, float normal[3])
static bool sculpt_needs_delta_from_anchored_origin(Brush *brush)
static void do_mask_by_color_contiguous_update_nodes_cb(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict UNUSED(tls))
static void SCULPT_fake_neighbor_add(SculptSession *ss, int v_index_a, int v_index_b)
float SCULPT_brush_strength_factor(SculptSession *ss, const Brush *br, const float brush_point[3], const float len, const short vno[3], const float fno[3], const float mask, const int vertex_index, const int thread_id)
void SCULPT_flip_quat_by_symm_area(float quat[3], const ePaintSymmetryFlags symm, const ePaintSymmetryAreas symmarea, const float pivot[3])
bool SCULPT_vertex_all_face_sets_visible_get(const SculptSession *ss, int index)
static void do_displacement_smear_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void do_displacement_smear_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
const float * SCULPT_vertex_color_get(SculptSession *ss, int index)
#define SCULPT_TILT_SENSITIVITY
static void calc_brush_local_mat(const Brush *brush, Object *ob, float local_mat[4][4])
static bool sculpt_needs_connectivity_info(const Sculpt *sd, const Brush *brush, SculptSession *ss, int stroke_mode)
void SCULPT_brush_test_init(SculptSession *ss, SculptBrushTest *test)
bool SCULPT_brush_test_sphere_sq(SculptBrushTest *test, const float co[3])
static void calc_area_center(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, float r_area_co[3])
void SCULPT_tilt_apply_to_normal(float r_normal[3], StrokeCache *cache, const float tilt_strength)
int SCULPT_vertex_face_set_get(SculptSession *ss, int index)
static void calc_local_y(ViewContext *vc, const float center[3], float y[3])
static PBVHNode ** sculpt_pbvh_gather_generic(Object *ob, Sculpt *sd, const Brush *brush, bool use_original, float radius_scale, int *r_totnode)
static void paint_mesh_restore_co(Sculpt *sd, Object *ob)
static bool sculpt_needs_delta_for_tip_orientation(Brush *brush)
static int sculpt_mode_toggle_exec(bContext *C, wmOperator *op)
static void sculpt_pose_fake_neighbors_free(SculptSession *ss)
static void do_displacement_eraser_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
void SCULPT_visibility_sync_all_vertex_to_face_sets(SculptSession *ss)
bool SCULPT_stroke_is_first_brush_step_of_symmetry_pass(StrokeCache *cache)
static void do_topology_relax_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void sculpt_rake_data_update(struct SculptRakeData *srd, const float co[3])
static void sculpt_vertex_neighbors_get_bmesh(SculptSession *ss, int index, SculptVertexNeighborIter *iter)
float SCULPT_vertex_mask_get(SculptSession *ss, int index)
static void update_brush_local_mat(Sculpt *sd, Object *ob)
static void sculpt_update_brush_delta(UnifiedPaintSettings *ups, Object *ob, Brush *brush)
static float calc_symmetry_feather(Sculpt *sd, StrokeCache *cache)
void SCULPT_fake_neighbors_disable(Object *ob)
static void do_inflate_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static int sculpt_mask_by_color_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static float frontface(const Brush *br, const float sculpt_normal[3], const short no[3], const float fno[3])
static void do_draw_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void sculpt_find_nearest_to_ray_cb(PBVHNode *node, void *data_v, float *tmin)
#define MASK_BY_COLOR_SLOPE
static void do_snake_hook_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
int SCULPT_face_set_next_available_get(SculptSession *ss)
static void do_symmetrical_brush_actions(Sculpt *sd, Object *ob, BrushActionFunc action, UnifiedPaintSettings *ups)
static bool sculpt_check_unique_face_set_in_base_mesh(SculptSession *ss, int index)
static void do_radial_symmetry(Sculpt *sd, Object *ob, Brush *brush, UnifiedPaintSettings *ups, BrushActionFunc action, const char symm, const int axis, const float UNUSED(feather))
static void SCULPT_fake_neighbor_init(SculptSession *ss, const float max_dist)
static void sculpt_init_mirror_clipping(Object *ob, SculptSession *ss)
int SCULPT_plane_trim(const StrokeCache *cache, const Brush *brush, const float val[3])
static void sculpt_topology_update(Sculpt *sd, Object *ob, Brush *brush, UnifiedPaintSettings *UNUSED(ups))
static void sculpt_brush_exit_tex(Sculpt *sd)
char SCULPT_mesh_symmetry_xyz_get(Object *object)
void SCULPT_calc_brush_plane(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, float r_area_no[3], float r_area_co[3])
static bool sculpt_tool_needs_original(const char sculpt_tool)
bool SCULPT_is_vertex_inside_brush_radius_symm(const float vertex[3], const float br_co[3], float radius, char symm)
static void do_clay_thumb_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
void SCULPT_vertex_neighbors_get(SculptSession *ss, const int index, const bool include_duplicates, SculptVertexNeighborIter *iter)
bool SCULPT_search_circle_cb(PBVHNode *node, void *data_v)
void SCULPT_update_object_bounding_box(Object *ob)
bool SCULPT_check_vertex_pivot_symmetry(const float vco[3], const float pco[3], const char symm)
static void do_fake_neighbor_search_task_cb(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void update_sculpt_normal(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_cache_free(StrokeCache *cache)
void SCULPT_floodfill_add_active(Sculpt *sd, Object *ob, SculptSession *ss, SculptFloodFill *flood, float radius)
void SCULPT_flush_stroke_deform(Sculpt *sd, Object *ob, bool is_proxy_used)
static float sculpt_brush_dynamic_size_get(Brush *brush, StrokeCache *cache, float initial_size)
void SCULPT_calc_area_normal(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, float r_area_no[3])
bool SCULPT_stroke_is_first_brush_step(StrokeCache *cache)
void ED_object_sculptmode_enter_ex(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob, const bool force_dyntopo, ReportList *reports)
void ED_operatortypes_sculpt(void)
static void sculpt_brush_init_tex(const Scene *scene, Sculpt *sd, SculptSession *ss)
const float * SCULPT_vertex_persistent_co_get(SculptSession *ss, int index)
bool SCULPT_get_redraw_rect(ARegion *region, RegionView3D *rv3d, Object *ob, rcti *rect)
MVert * SCULPT_mesh_deformed_mverts_get(SculptSession *ss)
static void nearest_vertex_get_reduce(const void *__restrict UNUSED(userdata), void *__restrict chunk_join, void *__restrict chunk)
static void do_inflate_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
bool SCULPT_poll_view3d(bContext *C)
static int loop_to_vertex_colors_exec(bContext *C, wmOperator *UNUSED(op))
@ SCULPT_TOPOLOGY_ID_DEFAULT
@ SCULPT_TOPOLOGY_ID_NONE
static void SCULPT_OT_symmetrize(wmOperatorType *ot)
static bool sculpt_brush_needs_rake_rotation(const Brush *brush)
bool SCULPT_poll(bContext *C)
ePaintSymmetryAreas SCULPT_get_vertex_symm_area(const float co[3])
static float calc_overlap(StrokeCache *cache, const char symm, const char axis, const float angle)
void ED_object_sculptmode_enter(struct bContext *C, Depsgraph *depsgraph, ReportList *reports)
static void do_gravity_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void do_flatten_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
int SCULPT_active_face_set_get(SculptSession *ss)
static bool SCULPT_connected_components_floodfill_cb(SculptSession *ss, int from_v, int to_v, bool UNUSED(is_duplicate), void *userdata)
static void calc_clay_surface_task_cb(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void do_mask_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_floodfill_execute(SculptSession *ss, SculptFloodFill *flood, bool(*func)(SculptSession *ss, int from_v, int to_v, bool is_duplicate, void *userdata), void *userdata)
struct ClaySampleData ClaySampleData
static void do_draw_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void sculpt_stroke_done(const bContext *C, struct PaintStroke *UNUSED(stroke))
struct MaskByColorContiguousFloodFillData MaskByColorContiguousFloodFillData
void SCULPT_clip(Sculpt *sd, SculptSession *ss, float co[3], const float val[3])
static bool sculpt_check_boundary_vertex_in_base_mesh(const SculptSession *ss, const int index)
void SCULPT_orig_vert_data_init(SculptOrigVertData *data, Object *ob, PBVHNode *node)
void SCULPT_visibility_sync_all_face_sets_to_vertices(Object *ob)
static void do_clay_thumb_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void do_mask_brush_draw(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void sculpt_update_tex(const Scene *scene, Sculpt *sd, SculptSession *ss)
static void sculpt_brush_stroke_init(bContext *C, wmOperator *op)
static float sculpt_mask_by_color_final_mask_get(const float current_mask, const float new_mask, const bool invert, const bool preserve_mask)
static void calc_sculpt_normal(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, float r_area_no[3])
static void do_scrape_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
struct AreaNormalCenterTLSData AreaNormalCenterTLSData
#define PIXEL_INPUT_THRESHHOLD
static void do_tiled(Sculpt *sd, Object *ob, Brush *brush, UnifiedPaintSettings *ups, BrushActionFunc action)
void SCULPT_tag_update_overlays(bContext *C)
bool SCULPT_brush_test_sphere_fast(const SculptBrushTest *test, const float co[3])
static void sculpt_vertex_neighbors_get_faces(SculptSession *ss, int index, SculptVertexNeighborIter *iter)
float SCULPT_raycast_init(ViewContext *vc, const float mouse[2], float ray_start[3], float ray_end[3], float ray_normal[3], bool original)
void SCULPT_automasking_cache_free(AutomaskingCache *automasking)
float SCULPT_automasking_factor_get(AutomaskingCache *automasking, SculptSession *ss, int vert)
AutomaskingCache * SCULPT_automasking_cache_init(Sculpt *sd, Brush *brush, Object *ob)
bool SCULPT_is_automasking_enabled(const Sculpt *sd, const SculptSession *ss, const Brush *br)
void SCULPT_boundary_data_free(SculptBoundary *boundary)
void SCULPT_do_boundary_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_cloth_brush_ensure_nodes_constraints(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, SculptClothSimulation *cloth_sim, float initial_location[3], const float radius)
PBVHNode ** SCULPT_cloth_brush_affected_nodes_gather(SculptSession *ss, Brush *brush, int *r_totnode)
void SCULPT_cloth_sim_activate_nodes(SculptClothSimulation *cloth_sim, PBVHNode **nodes, int totnode)
SculptClothSimulation * SCULPT_cloth_brush_simulation_create(SculptSession *ss, const float cloth_mass, const float cloth_damping, const float cloth_softbody_strength, const bool use_collisions, const bool needs_deform_coords)
void SCULPT_cloth_simulation_free(struct SculptClothSimulation *cloth_sim)
void SCULPT_cloth_brush_store_simulation_state(SculptSession *ss, SculptClothSimulation *cloth_sim)
void SCULPT_cloth_brush_do_simulation_step(Sculpt *sd, Object *ob, SculptClothSimulation *cloth_sim, PBVHNode **nodes, int totnode)
void SCULPT_OT_cloth_filter(struct wmOperatorType *ot)
void SCULPT_cloth_brush_simulation_init(SculptSession *ss, SculptClothSimulation *cloth_sim)
void SCULPT_do_cloth_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_OT_sample_detail_size(wmOperatorType *ot)
void SCULPT_OT_detail_flood_fill(wmOperatorType *ot)
void SCULPT_OT_set_detail_size(wmOperatorType *ot)
void SCULPT_OT_dyntopo_detail_size_edit(wmOperatorType *ot)
enum eDynTopoWarnFlag SCULPT_dynamic_topology_check(Scene *scene, Object *ob)
void SCULPT_pbvh_clear(Object *ob)
void SCULPT_OT_dynamic_topology_toggle(wmOperatorType *ot)
void sculpt_dynamic_topology_disable_with_undo(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob)
void SCULPT_dynamic_topology_enable_ex(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob)
void SCULPT_dynamic_topology_triangulate(BMesh *bm)
void SCULPT_OT_expand(wmOperatorType *ot)
void SCULPT_OT_face_sets_change_visibility(wmOperatorType *ot)
void SCULPT_OT_face_sets_init(wmOperatorType *ot)
void SCULPT_OT_face_sets_create(wmOperatorType *ot)
void SCULPT_OT_face_sets_edit(struct wmOperatorType *ot)
void SCULPT_OT_face_sets_randomize_colors(wmOperatorType *ot)
void SCULPT_do_draw_face_sets_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_OT_color_filter(struct wmOperatorType *ot)
void SCULPT_OT_mask_filter(struct wmOperatorType *ot)
void SCULPT_OT_dirty_mask(struct wmOperatorType *ot)
void SCULPT_OT_mesh_filter(struct wmOperatorType *ot)
void SCULPT_undo_push_begin(struct Object *ob, const char *name)
#define SCULPT_RAKE_BRUSH_FACTOR
#define FAKE_NEIGHBOR_NONE
void SCULPT_do_smear_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
#define SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN(ss, v_index, neighbor_iterator)
SculptUndoNode * SCULPT_undo_get_node(PBVHNode *node)
void SCULPT_pose_brush_init(struct Sculpt *sd, struct Object *ob, struct SculptSession *ss, struct Brush *br)
BLI_INLINE bool SCULPT_is_cloth_deform_brush(const Brush *brush)
void SCULPT_OT_set_pivot_position(struct wmOperatorType *ot)
BLI_INLINE bool SCULPT_tool_needs_all_pbvh_nodes(const Brush *brush)
void SCULPT_do_smooth_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_smooth(Sculpt *sd, Object *ob, PBVHNode **nodes, const int totnode, float bstrength, const bool smooth_mask)
void SCULPT_do_multiplane_scrape_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
bool(* SculptBrushTestFn)(SculptBrushTest *test, const float co[3])
SculptUndoNode * SCULPT_undo_get_first_node(void)
#define SCULPT_CLAY_STABILIZER_LEN
void SCULPT_bmesh_four_neighbor_average(float avg[3], float direction[3], struct BMVert *v)
#define SCULPT_VERTEX_NEIGHBORS_ITER_END(neighbor_iterator)
void SCULPT_do_pose_brush(struct Sculpt *sd, struct Object *ob, struct PBVHNode **nodes, int totnode)
void SCULPT_undo_push_end(void)
void SCULPT_do_surface_smooth_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
SculptUndoNode * SCULPT_undo_push_node(Object *ob, PBVHNode *node, SculptUndoType type)
void SCULPT_do_paint_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
#define SCULPT_VERTEX_DUPLICATES_AND_NEIGHBORS_ITER_BEGIN(ss, v_index, neighbor_iterator)
void SCULPT_OT_mask_init(struct wmOperatorType *ot)
void SCULPT_pose_ik_chain_free(struct SculptPoseIKChain *ik_chain)
@ SCULPT_UNDO_DYNTOPO_SYMMETRIZE
@ SCULPT_UNDO_DYNTOPO_BEGIN
void SCULPT_OT_mask_expand(struct wmOperatorType *ot)
float topology_rake_factor
int snake_hook_deform_type
float normal_radius_factor
float elastic_deform_volume_preservation
struct CurveMapping * curve
float texture_sample_bias
float tilt_strength_factor
float crease_pinch_factor
struct CustomData pdata ldata
struct Object * mirror_ob
struct ModifierData * next
float nearest_vertex_distance_squared
float nearest_vertex_distance_squared
struct SculptSession * sculpt
struct ToolSettings * toolsettings
struct RegionView3D * clip_rv3d
float symm_rot_mat_inv[4][4]
float(* deformation_pos)[3]
float active_vertex_co[3]
int * fake_neighbor_index
float current_max_distance
BLI_bitmap * visited_vertices
struct SculptUndoNode * unode
int active_face_grid_index
struct IsectRayPrecalc isect_precalc
unsigned int texcache_side
struct SubdivCCG * subdiv_ccg
struct ImagePool * tex_pool
float cursor_view_normal[3]
int preview_vert_index_count
SculptVertexInfo vertex_info
struct RegionView3D * rv3d
struct KeyBlock * shapekey_active
int * preview_vert_index_list
struct MeshElemMap * pmap
struct MultiresModifierData * modifier
float(* deform_imats)[3][3]
float cursor_sampled_normal[3]
struct StrokeCache * cache
struct SculptSession::@53 multires
unsigned int texcache_actual
SculptFakeNeighbors fake_neighbors
SculptPersistentBase * persistent_base
bool deform_modifiers_active
float nearest_vertex_search_co[3]
struct BMLogEntry * bm_entry
int * connected_component
int neighbors_fixed[SCULPT_VERTEX_NEIGHBOR_FIXED_CAPACITY]
struct Object * gravity_object
float orig_grab_location[3]
float old_grab_location[3]
const struct Brush * brush
float brush_local_mat[4][4]
float symm_rot_mat_inv[4][4]
float initial_location[3]
float clip_mirror_mtx[4][4]
float true_view_normal[3]
float projection_mat[4][4]
float anchored_location[3]
char saved_active_brush_name[MAX_ID_NAME]
struct SculptPoseIKChain * pose_ik_chain
struct SculptBoundary * boundaries[PAINT_SYMM_AREAS]
float sculpt_normal_symm[3]
float(* limit_surface_co)[3]
struct SculptRakeData rake_data
float(* surface_smooth_laplacian_disp)[3]
float true_initial_location[3]
float grab_delta_symmetry[3]
AutomaskingCache * automasking
struct SculptClothSimulation * cloth_sim
float true_last_location[3]
float true_initial_normal[3]
struct StrokeCache::@489 paint_brush
float(* prev_displacement)[3]
bool is_rake_rotation_valid
float gravity_direction[3]
float(* detail_directions)[3]
float true_gravity_direction[3]
float * layer_displacement_factor
char saved_mask_brush_tool
float clay_pressure_stabilizer[SCULPT_CLAY_STABILIZER_LEN]
int clay_pressure_stabilizer_index
float clay_thumb_front_angle
float rake_rotation_symmetry[4]
float dyntopo_pixel_radius
SubdivCCGCoord coords_fixed[256]
TaskParallelReduceFunc func_reduce
size_t userdata_chunk_size
struct bNodeTree * nodetree
float average_stroke_accum[3]
float anchored_initial_mouse[2]
float initial_pixel_radius
int average_stroke_counter
struct Depsgraph * depsgraph
struct RegionView3D * rv3d
struct bNodeTreeExec * execdata
int(* invoke)(struct bContext *, struct wmOperator *, const struct wmEvent *) ATTR_WARN_UNUSED_RESULT
int(* modal)(struct bContext *, struct wmOperator *, const struct wmEvent *) ATTR_WARN_UNUSED_RESULT
bool(* poll)(struct bContext *) ATTR_WARN_UNUSED_RESULT
void(* cancel)(struct bContext *, struct wmOperator *)
int(* exec)(struct bContext *, struct wmOperator *) ATTR_WARN_UNUSED_RESULT
struct ReportList * reports
struct wmOperatorType * type
struct UndoStack * undo_stack
CCL_NAMESPACE_BEGIN ccl_device float invert(float color, float factor)
CCL_NAMESPACE_BEGIN ccl_device float fade(float t)
__forceinline const avxi abs(const avxi &a)
ccl_device_inline float dot(const float2 &a, const float2 &b)
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
#define WM_msg_publish_rna_prop(mbus, id_, data_, type_, prop_)
void WM_operatortype_append(void(*opfunc)(wmOperatorType *))
bScreen * WM_window_get_active_screen(const wmWindow *win)