118 const float scale_factor)
157 return static_cast<const Mesh *
>(
object.data)->verts_num;
178 const Mesh &
mesh = *
static_cast<const Mesh *
>(
object.data);
179 return mesh.vert_positions();
186 const Mesh *mesh =
static_cast<const Mesh *
>(
object.data);
201 const Mesh &
mesh = *
static_cast<const Mesh *
>(
object.data);
210 const Mesh &
mesh = *
static_cast<const Mesh *
>(
object.data);
218 return face_sets[face_index];
235 for (
const int face : vert_to_face_map[vert]) {
244 return face_sets[face];
262 faces.begin(),
faces.end(), [&](
const int face) { return face_sets[face] == face_set; });
279 if (face_set_offset == -1) {
301 for (
const int face_index : vert_to_face_map[vert]) {
306 if (face_sets[face_index] !=
face_set) {
326 const Span<int> vert_map = vert_to_face_map[v1];
327 int p1 = -1, p2 = -1;
328 for (
int i = 0;
i < vert_map.
size();
i++) {
329 const int face_i = vert_map[
i];
330 for (
const int corner :
faces[face_i]) {
331 if (corner_verts[corner] ==
v2) {
345 if (p1 != -1 && p2 != -1) {
346 return face_sets[p1] == face_sets[p2];
364 subdiv_ccg, coord, corner_verts,
faces, v1,
v2);
370 vert_to_face_map, face_sets, corner_verts,
faces, v1,
v2);
393 for (
BMVert *other_vert : {
l->prev->v,
l->next->v}) {
394 if (other_vert != &vert) {
395 r_neighbors.
append(other_vert);
408 for (
BMVert *other_vert : {
l->prev->v,
l->next->v}) {
409 if (other_vert != &vert) {
410 r_neighbors.
append(other_vert);
416 if (r_neighbors.
size() == 2) {
438 for (
const int face : vert_to_face[vert]) {
439 if (!hide_poly.
is_empty() && hide_poly[face]) {
457 const int vert_start = r_data.
size();
458 for (
const int face : vert_to_face[vert]) {
459 if (!hide_poly.
is_empty() && hide_poly[face]) {
465 for (
const int neighbor : {neighbors[0], neighbors[1]}) {
467 for (
int i = r_data.
size() - 1;
i >= vert_start;
i--) {
468 if (r_data[
i] == neighbor) {
504 subdiv_ccg, vert, corner_verts,
faces, v1,
v2);
550 bool is_in_symmetry_area =
true;
551 for (
int i = 0;
i < 3;
i++) {
552 char symm_it = 1 <<
i;
553 if (symm & symm_it) {
554 if (pco[
i] == 0.0f) {
556 is_in_symmetry_area =
false;
559 if (vco[
i] * pco[
i] < 0.0f) {
560 is_in_symmetry_area =
false;
564 return is_in_symmetry_area;
568 const float normal_weight,
576 float len_view_scale;
578 float view_aligned_normal[3];
582 len_view_scale = (len_view_scale > FLT_EPSILON) ? 1.0f / len_view_scale : 1.0f;
585 mul_v3_fl(grab_delta, 1.0f - normal_weight);
596 const float max_distance,
597 const bool use_original)
599 const float max_distance_sq = max_distance * max_distance;
603 return node_in_sphere(node, location, max_distance_sq, use_original);
611 float distance_sq = std::numeric_limits<float>::max();
619 [&](
const IndexRange range, NearestData nearest) {
622 if (!hide_vert.
is_empty() && hide_vert[vert]) {
626 if (distance_sq < nearest.distance_sq) {
627 nearest = {vert, distance_sq};
633 [](
const NearestData a,
const NearestData
b) {
634 return a.distance_sq <
b.distance_sq ? a :
b;
642 const float max_distance,
643 const bool use_original)
645 const float max_distance_sq = max_distance * max_distance;
649 return node_in_sphere(node, location, max_distance_sq, use_original);
657 float distance_sq = std::numeric_limits<float>::max();
669 [&](
const IndexRange range, NearestData nearest) {
671 for (
const int grid :
nodes[
i].grids()) {
675 if (distance_sq < nearest.distance_sq) {
680 nearest = {coord, distance_sq};
687 [](
const NearestData a,
const NearestData
b) {
688 return a.distance_sq <
b.distance_sq ? a :
b;
690 return nearest.coord;
695 const float max_distance,
696 const bool use_original)
698 const float max_distance_sq = max_distance * max_distance;
702 return node_in_sphere(node, location, max_distance_sq, use_original);
710 float distance_sq = std::numeric_limits<float>::max();
718 [&](
const IndexRange range, NearestData nearest) {
727 if (distance_sq < nearest.distance_sq) {
728 nearest = {vert, distance_sq};
734 [](
const NearestData a,
const NearestData
b) {
735 return a.distance_sq <
b.distance_sq ? a :
b;
743 const float br_co[3],
747 for (
char i = 0;
i <= symm; ++
i) {
788 return ELEM(sculpt_brush_type,
880 switch (pbvh.
type()) {
894 node_changed[
i] =
true;
909 node_changed[
i] =
true;
927 for (
const int grid :
nodes[
i].grids()) {
930 if (grid_hidden.
is_empty() || !grid_hidden[grid][
i]) {
931 masks[grid_range[
i]] = (*orig_data)[index];
937 node_changed[
i] =
true;
965 for (
const int i :
verts.index_range()) {
972 color_attribute.
span);
988 switch (pbvh.
type()) {
998 node_changed[
i] =
true;
1008 *
static_cast<Mesh *
>(
object.
data));
1016 subdiv_ccg,
nodes[
i], tls);
1018 node_changed[
i] =
true;
1037 switch (pbvh.
type()) {
1054 const bool need_translations = !ss.
deform_imats.is_empty() || shape_key_data.has_value();
1059 LocalData &tls = all_tls.
local();
1063 if (need_translations) {
1065 tls.translations.resize(
verts.size());
1067 undo_positions,
verts, positions_eval, tls.translations);
1072 if (positions_eval.
data() == positions_orig.
data()) {
1081 if (shape_key_data) {
1086 if (shape_key_data->basis_key_active) {
1128 node_mask.foreach_index(
GrainSize(1), [&](
const int i) {
1131 for (
const int grid :
nodes[
i].grids()) {
1134 if (grid_hidden.
is_empty() || !grid_hidden[grid][
i]) {
1135 positions[grid_range[
i]] = orig_data.
positions[index];
1219 float overlap = 0.0f;
1221 for (
int i = 1;
i <
mesh.radial_symmetry[axis -
'X'];
i++) {
1222 const float angle = 2.0f *
M_PI *
i /
mesh.radial_symmetry[axis -
'X'];
1240 for (
int i = 0;
i <= symm;
i++) {
1251 return 1.0f / overlap;
1312 float p = 1.0f - (
distance * radius_inv);
1313 return std::clamp(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f);
1319 const float radius_inv,
1323 float p = 1.0f - (
distance * radius_inv);
1324 const float afactor = std::clamp(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f);
1326 const float3 disp = (co - test_location) * (1.0f - afactor);
1327 return test_location + disp;
1333 const float radius_inv,
1334 const int flip_index,
1338 test_location,
distance, radius_inv, position);
1344 const float radius_inv,
1345 const int flip_index,
1379 const float position_radius_sq = position_radius * position_radius;
1380 const float position_radius_inv =
math::rcp(position_radius);
1382 const float normal_radius_sq = normal_radius * normal_radius;
1383 const float normal_radius_inv =
math::rcp(normal_radius);
1391 const Span<float3> orig_positions = orig_data->positions;
1399 for (
const int i :
verts.index_range()) {
1400 const int vert =
verts[
i];
1401 if (!hide_vert.
is_empty() && hide_vert[vert]) {
1405 distances_sq[
i] <= normal_radius_sq;
1407 distances_sq[
i] <= position_radius_sq;
1408 if (!needs_normal && !needs_center) {
1411 const float3 &normal = orig_normals[
i];
1412 const float distance = std::sqrt(distances_sq[
i]);
1413 const int flip_index =
math::dot(view_normal, normal) <= 0.0f;
1416 location, orig_positions[
i],
distance, position_radius_inv, flip_index, anctd);
1431 for (
const int i :
verts.index_range()) {
1432 const int vert =
verts[
i];
1433 if (!hide_vert.
is_empty() && hide_vert[vert]) {
1437 distances_sq[
i] <= normal_radius_sq;
1439 distances_sq[
i] <= position_radius_sq;
1440 if (!needs_normal && !needs_center) {
1443 const float3 &normal = vert_normals[vert];
1444 const float distance = std::sqrt(distances_sq[
i]);
1445 const int flip_index =
math::dot(view_normal, normal) <= 0.0f;
1448 location, vert_positions[vert],
distance, position_radius_inv, flip_index, anctd);
1467 const float position_radius_sq = position_radius * position_radius;
1468 const float position_radius_inv =
math::rcp(position_radius);
1470 const float normal_radius_sq = normal_radius * normal_radius;
1471 const float normal_radius_inv =
math::rcp(normal_radius);
1483 const Span<float3> orig_positions = orig_data->positions;
1493 const int grid = grids[
i];
1495 if (!grid_hidden.
is_empty() && grid_hidden[grid][offset]) {
1498 const int node_vert = grid_range_node[offset];
1501 distances_sq[node_vert] <= normal_radius_sq;
1503 distances_sq[node_vert] <= position_radius_sq;
1504 if (!needs_normal && !needs_center) {
1507 const float3 &normal = orig_normals[node_vert];
1508 const float distance = std::sqrt(distances_sq[node_vert]);
1509 const int flip_index =
math::dot(view_normal, normal) <= 0.0f;
1512 orig_positions[node_vert],
1514 position_radius_inv,
1535 const int grid = grids[
i];
1538 if (!grid_hidden.
is_empty() && grid_hidden[grid][offset]) {
1541 const int node_vert = grid_range_node[offset];
1542 const int vert = grid_range[offset];
1545 distances_sq[node_vert] <= normal_radius_sq;
1547 distances_sq[node_vert] <= position_radius_sq;
1548 if (!needs_normal && !needs_center) {
1552 const float distance = std::sqrt(distances_sq[node_vert]);
1553 const int flip_index =
math::dot(view_normal, normal) <= 0.0f;
1556 location, positions[node_vert],
distance, position_radius_inv, flip_index, anctd);
1568 const bool has_bm_orco,
1577 const float position_radius_sq = position_radius * position_radius;
1578 const float position_radius_inv =
math::rcp(position_radius);
1580 const float normal_radius_sq = normal_radius * normal_radius;
1581 const float normal_radius_inv =
math::rcp(normal_radius);
1583 bool use_original =
false;
1590 if (use_original && has_bm_orco) {
1598 const float *co_tri[3] = {
1599 orig_positions[orig_tris[
i][0]],
1600 orig_positions[orig_tris[
i][1]],
1601 orig_positions[orig_tris[
i][2]],
1613 distances_sq[
i] <= normal_radius_sq;
1615 distances_sq[
i] <= position_radius_sq;
1616 if (!needs_normal && !needs_center) {
1620 float3(orig_positions[orig_tris[
i][1]]),
1621 float3(orig_positions[orig_tris[
i][2]]));
1623 const float distance = std::sqrt(distances_sq[
i]);
1624 const int flip_index =
math::dot(view_normal, normal) <= 0.0f;
1627 location, positions[
i],
distance, position_radius_inv, flip_index, anctd);
1656 distances_sq[
i] <= normal_radius_sq;
1658 distances_sq[
i] <= position_radius_sq;
1659 if (!needs_normal && !needs_center) {
1664 const float distance = std::sqrt(distances_sq[
i]);
1665 const int flip_index =
math::dot(view_normal, normal) <= 0.0f;
1668 location, positions[
i],
distance, position_radius_inv, flip_index, anctd);
1692 distances_sq[
i] <= normal_radius_sq;
1694 distances_sq[
i] <= position_radius_sq;
1695 if (!needs_normal && !needs_center) {
1699 const float3 normal = vert->no;
1700 const float distance = std::sqrt(distances_sq[
i]);
1701 const int flip_index =
math::dot(view_normal, normal) <= 0.0f;
1704 location, positions[
i],
distance, position_radius_inv, flip_index, anctd);
1743 switch (pbvh.
type()) {
1757 SampleLocalData &tls = all_tls.local();
1758 node_mask.slice(range).foreach_index([&](const int i) {
1759 calc_area_normal_and_center_node_mesh(ob,
1764 AverageDataFlags::Position,
1783 SampleLocalData &tls = all_tls.local();
1784 node_mask.slice(range).foreach_index([&](const int i) {
1785 calc_area_normal_and_center_node_bmesh(
1786 ob, brush, AverageDataFlags::Position, has_bm_orco, nodes[i], tls, anctd);
1796 node_mask.index_range(),
1800 SampleLocalData &tls = all_tls.local();
1801 node_mask.slice(range).foreach_index([&](const int i) {
1802 calc_area_normal_and_center_node_grids(
1803 ob, brush, AverageDataFlags::Position, nodes[i], tls, anctd);
1813 for (n = 0; n < anctd.area_cos.size(); n++) {
1814 if (anctd.count_co[n] == 0) {
1818 mul_v3_v3fl(r_area_co, anctd.area_cos[n], 1.0f / anctd.count_co[n]);
1826 if (anctd.count_co[0] == 0 && anctd.count_co[1] == 0) {
1828 copy_v3_v3(r_area_co, ss.cache->location_symm);
1843 switch (pbvh.
type()) {
1857 SampleLocalData &tls = all_tls.local();
1858 node_mask.slice(range).foreach_index([&](const int i) {
1859 calc_area_normal_and_center_node_mesh(ob,
1864 AverageDataFlags::Normal,
1883 SampleLocalData &tls = all_tls.local();
1884 node_mask.slice(range).foreach_index([&](const int i) {
1885 calc_area_normal_and_center_node_bmesh(
1888 AverageDataFlags::Normal,
1890 static_cast<const blender::bke::pbvh::BMeshNode &>(nodes[i]),
1902 node_mask.index_range(),
1906 SampleLocalData &tls = all_tls.local();
1907 node_mask.slice(range).foreach_index([&](const int i) {
1908 calc_area_normal_and_center_node_grids(
1909 ob, brush, AverageDataFlags::Normal, nodes[i], tls, anctd);
1918 for (
const int i : {0, 1}) {
1919 if (anctd.count_no[
i] != 0) {
1925 return std::nullopt;
1946 const float3 &plane_normal,
1947 const float3 &plane_center,
1948 float3 &r_stabilized_normal,
1949 float3 &r_stabilized_center)
1959 if (plane_cache.first_time) {
1960 new_plane_normal = plane_normal;
1961 new_plane_center = plane_center;
1963 const int max_normal_index = int(1 +
1965 const int max_center_index = int(1 +
1968 plane_cache.normals.reinitialize(max_normal_index);
1969 plane_cache.centers.reinitialize(max_center_index);
1970 plane_cache.normals.fill(plane_normal);
1971 plane_cache.centers.fill(plane_center);
1973 plane_cache.normal_index = 0;
1974 plane_cache.center_index = 0;
1975 plane_cache.first_time =
false;
1978 const float3 last_normal = plane_cache.last_normal.value();
1979 const float3 last_center = plane_cache.last_center.value();
1989 float3 projected_plane_center;
1992 new_plane_center =
math::interpolate(plane_center, projected_plane_center, center_weight);
1995 plane_cache.normals[plane_cache.normal_index] = new_plane_normal;
1996 plane_cache.centers[plane_cache.center_index] = new_plane_center;
1998 plane_cache.normal_index = (plane_cache.normal_index + 1) % plane_cache.normals.size();
1999 plane_cache.center_index = (plane_cache.center_index + 1) % plane_cache.centers.size();
2001 r_stabilized_normal =
float3(0.0f);
2003 for (
const int i : plane_cache.normals.index_range()) {
2004 r_stabilized_normal += plane_cache.normals[
i];
2010 float total_signed_distance = 0.0f;
2012 for (
const int i : plane_cache.centers.index_range()) {
2013 float signed_distance =
math::dot(r_stabilized_normal, plane_cache.centers[
i]) -
2015 total_signed_distance += signed_distance;
2018 const float avg_signed_distance = total_signed_distance / plane_cache.centers.size();
2019 const float new_center_signed_distance =
math::dot(r_stabilized_normal, new_plane_center) -
2021 const float adjusted_distance = new_center_signed_distance - avg_signed_distance;
2022 r_stabilized_center = new_plane_center - r_stabilized_normal * adjusted_distance;
2024 plane_cache.last_normal = r_stabilized_normal;
2025 plane_cache.last_center = r_stabilized_center;
2041 switch (pbvh.
type()) {
2055 SampleLocalData &tls = all_tls.local();
2056 node_mask.slice(range).foreach_index([&](const int i) {
2057 calc_area_normal_and_center_node_mesh(ob,
2062 AverageDataFlags::All,
2081 SampleLocalData &tls = all_tls.local();
2082 node_mask.slice(range).foreach_index([&](const int i) {
2083 calc_area_normal_and_center_node_bmesh(
2084 ob, brush, AverageDataFlags::All, has_bm_orco, nodes[i], tls, anctd);
2094 node_mask.index_range(),
2098 SampleLocalData &tls = all_tls.local();
2099 node_mask.slice(range).foreach_index([&](const int i) {
2100 calc_area_normal_and_center_node_grids(
2101 ob, brush, AverageDataFlags::All, nodes[i], tls, anctd);
2111 for (n = 0; n < anctd.area_cos.size(); n++) {
2112 if (anctd.count_co[n] == 0) {
2116 mul_v3_v3fl(r_area_co, anctd.area_cos[n], 1.0f / anctd.count_co[n]);
2124 if (anctd.count_co[0] == 0 && anctd.count_co[1] == 0) {
2126 copy_v3_v3(r_area_co, ss.cache->location_symm);
2131 for (n = 0; n < anctd.area_nos.size(); n++) {
2138 float3 stabilized_normal;
2139 float3 stabilized_center;
2142 brush, *ss.cache, r_area_no, r_area_co, stabilized_normal, stabilized_center);
2164 const float pen_flip = cache.
pen_flip ? -1.0f : 1.0f;
2167 return dir * pen_flip *
invert;
2177 const float feather,
2185 const float alpha = root_alpha * root_alpha;
2196 float final_pressure;
2200 final_pressure =
pow4f(pressure);
2201 overlap = (1.0f + overlap) / 2.0f;
2202 return 0.25f * alpha * flip * final_pressure * overlap * feather;
2206 return alpha * flip * pressure * overlap * feather;
2208 return alpha * pressure * overlap * feather;
2212 return root_alpha * feather;
2215 return root_alpha * feather * pressure * overlap;
2220 return 0.1f * alpha * flip * pressure * overlap * feather;
2225 return 10.0f * alpha * flip * pressure * overlap * feather;
2228 return alpha * pressure * overlap * feather;
2230 return alpha * pressure * overlap * feather * 2.0f;
2232 final_pressure = pressure * pressure;
2233 return final_pressure * overlap * feather;
2236 return alpha * pressure * overlap * feather;
2239 final_pressure =
powf(pressure, 1.5f);
2240 return alpha * flip * final_pressure * overlap * feather * 0.3f;
2242 final_pressure = pressure * pressure;
2243 return alpha * flip * final_pressure * overlap * feather * 1.3f;
2246 overlap = (1.0f + overlap) / 2.0f;
2249 return alpha * flip * pressure * overlap * feather;
2251 return alpha * pressure * feather;
2256 return alpha * flip * pressure * overlap * feather;
2260 return 0.250f * alpha * flip * pressure * overlap * feather;
2263 return 0.125f * alpha * flip * pressure * overlap * feather;
2267 overlap = (1.0f + overlap) / 2.0f;
2268 return alpha * flip * pressure * overlap * feather;
2272 overlap = (1.0f + overlap) / 2.0f;
2273 return alpha * pressure * overlap * feather;
2280 return 0.5f * alpha * pressure * overlap * feather;
2283 return flip * alpha * pressure * feather;
2287 return alpha * flip * pressure * overlap * feather;
2290 return 0.25f * alpha * flip * pressure * overlap * feather;
2294 overlap = (1.0f + overlap) / 2.0f;
2295 return alpha * pressure * overlap * feather;
2298 return alpha * pressure * feather;
2301 return root_alpha * feather;
2304 return root_alpha * feather;
2307 return alpha * pressure * feather;
2312 return root_alpha * feather;
2324 const float brush_point[3],
2325 const int thread_id,
2364 float x = symm_point[0];
2365 float y = symm_point[1];
2381 const float point_3d[3] = {point_2d[0], point_2d[1], 0.0f};
2383 cache.
paint, &brush, mtex, point_3d, r_rgba, 0, ss.
tex_pool);
2390 float translation[3])
2395 translation[0] *= -1;
2396 translation[1] *= -1;
2400 for (
int i = 0;
i < 3; ++
i) {
2431 const float radius_sq,
2432 const bool original)
2441 const float radius_sq,
2442 const bool original)
2446 float dummy_co[3], dummy_depth;
2448 &ray_dist_precalc,
bounds.min,
bounds.max, dummy_co, &dummy_depth);
2451 return dist_sq < radius_sq ||
true;
2467 const bool use_original,
2468 const float radius_scale,
2504 const bool use_original,
2506 const float radius_sq,
2507 const std::optional<float3> &ray_direction,
2510 switch (falloff_shape) {
2523 location, ray_direction.value_or(
float3(0.0f)));
2538 const bool use_original,
2539 const float radius_scale,
2607 const float center[3],
2608 const float screen_dir[2],
2609 float r_local_dir[3])
2614 mul_v3_m4v3(loc, ob.object_to_world().ptr(), center);
2621 mul_m4_v3(ob.world_to_object().ptr(), r_local_dir);
2626 float local_mat[4][4],
2627 float local_mat_inv[4][4])
2649 float motion_normal_screen[2];
2654 float motion_normal_local[3];
2656 *cache->
vc, cache->
location_symm, motion_normal_screen, motion_normal_local);
2678 float radius = cache->
radius;
2694 const float tilt_strength)
2700 constexpr float tilt_sensitivity = 0.7f;
2701 const float rot_max =
M_PI_2 * tilt_strength * tilt_sensitivity;
2703 world_space, view_inverse.
x_axis(), tilt.y * rot_max);
2705 normal_tilt_y, view_inverse.
y_axis(), tilt.x * rot_max);
2712 const float tilt_strength)
2842 float axis[3],
angle;
2874 for (
int i = 0;
i < 3;
i++) {
2876 if (!(symm & symm_it)) {
2879 if (symmarea & symm_it) {
2882 if (pivot[
i] < 0.0f) {
2892 const float pivot[3])
2894 for (
int i = 0;
i < 3;
i++) {
2896 if (!(symm & symm_it)) {
2899 if (symmarea & symm_it) {
2902 if (pivot[
i] < 0.0f) {
2919 r_area_no =
float3(0.0f);
2920 r_area_co =
float3(0.0f);
2928 !use_original_plane || !use_original_normal;
2937 r_area_no =
float3(1.0f, 0.0f, 0.0f);
2941 r_area_no =
float3(0.0f, 1.0f, 0.0f);
2945 r_area_no =
float3(0.0f, 0.0f, 1.0f);
3022 constexpr float radius_scale = 1.25f;
3137 return {all_leaf_nodes(pbvh, memory), std::nullopt, std::nullopt};
3149 float radius_scale = 1.0f;
3158 radius_scale = 2.0f;
3251 if (external_engine) {
3264 depsgraph, ob, 1.0f, 0.0f, 0.0f,
false,
true);
3272 std::numeric_limits<float>::max());
3483 float frac = 1.0f / max_overlap_count(sd);
3484 float reduce = (feather -
frac) / (1.0f -
frac);
3486 printf(
"feather: %f frac: %f reduce: %f\n", feather,
frac, reduce);
3489 mul_v3_fl(cache.grab_delta_symmetry, reduce);
3542 const float radius = cache->
radius;
3544 const float *bbMin = bb.
min;
3545 const float *bbMax = bb.
max;
3556 float original_initial_location[3];
3560 for (
int dim = 0; dim < 3; dim++) {
3562 start[dim] = (bbMin[dim] - orgLoc[dim] - radius) /
step[dim];
3563 end[dim] = (bbMax[dim] - orgLoc[dim] + radius) /
step[dim];
3566 start[dim] = end[dim] = 0;
3572 action(
depsgraph, scene, sd, ob, brush, paint_mode_settings);
3576 for (cur[0] = start[0]; cur[0] <= end[0]; cur[0]++) {
3577 for (cur[1] = start[1]; cur[1] <= end[1]; cur[1]++) {
3578 for (cur[2] = start[2]; cur[2] <= end[2]; cur[2]++) {
3579 if (!cur[0] && !cur[1] && !cur[2]) {
3586 for (
int dim = 0; dim < 3; dim++) {
3590 original_initial_location[dim];
3592 action(
depsgraph, scene, sd, ob, brush, paint_mode_settings);
3612 for (
int i = 1;
i <
mesh.radial_symmetry[axis -
'X'];
i++) {
3613 const float angle = 2.0f *
M_PI *
i /
mesh.radial_symmetry[axis -
'X'];
3655 for (
int i = 0;
i <= symm;
i++) {
3667 depsgraph, scene, sd, ob, brush, paint_mode_settings, action, symm,
'X', feather);
3669 depsgraph, scene, sd, ob, brush, paint_mode_settings, action, symm,
'Y', feather);
3671 depsgraph, scene, sd, ob, brush, paint_mode_settings, action, symm,
'Z', feather);
3715 std::array<wmOperatorType *, 7> trim_operators = {
3725 return std::any_of(trim_operators.begin(), trim_operators.end(), [tref](
wmOperatorType *
ot) {
3727 return WM_toolsystem_ref_properties_get_from_operator(tref, ot, &ptr);
3746 return "Draw Brush";
3748 return "Smooth Brush";
3750 return "Crease Brush";
3752 return "Blob Brush";
3754 return "Pinch Brush";
3756 return "Inflate Brush";
3758 return "Grab Brush";
3760 return "Nudge Brush";
3762 return "Thumb Brush";
3764 return "Layer Brush";
3766 return "Clay Brush";
3768 return "Clay Strips Brush";
3770 return "Clay Thumb Brush";
3772 return "Snake Hook Brush";
3774 return "Rotate Brush";
3776 return "Mask Brush";
3778 return "Simplify Brush";
3780 return "Draw Sharp Brush";
3782 return "Elastic Deform Brush";
3784 return "Pose Brush";
3786 return "Multi-plane Scrape Brush";
3788 return "Slide/Relax Brush";
3790 return "Boundary Brush";
3792 return "Cloth Brush";
3794 return "Draw Face Sets";
3796 return "Multires Displacement Eraser";
3798 return "Multires Displacement Smear";
3800 return "Paint Brush";
3802 return "Smear Brush";
3804 return "Plane Brush";
3829namespace blender::ed::sculpt_paint {
3846 for (
int i = 0;
i < 3;
i++) {
3861 mirror_ob_inv.
ptr(),
3862 ob.object_to_world().ptr());
3894 if (!smooth_brush) {
3896 CLOG_WARN(&
LOG,
"Switching to the smooth brush not possible, corresponding brush not");
3942 StrokeCache *cache = MEM_new<StrokeCache>(__func__);
3952 float max_scale = 0.0f;
3953 for (
int i = 0;
i < 3;
i++) {
4014 cache->
brush = brush;
4020 const float3 z_axis(0.0f, 0.0f, 1.0f);
4041 cache->
accum =
true;
4045 cache->
accum =
false;
4051 cache->
accum =
false;
4056 cache->
accum =
false;
4058 cache->
accum =
true;
4068 cache->
accum =
true;
4078 constexpr int pixel_input_threshold = 5;
4090 return max_ff(initial_size * 0.20f, initial_size *
pow3f(pressure_eval));
4092 return max_ff(initial_size * 0.30f, initial_size *
powf(pressure_eval, 1.5f));
4095 return initial_size *
4099 return initial_size * pressure_eval;
4153 const float mval[2] = {
4159 if (!
ELEM(brush_type,
4179 float grab_location[3], imat[4][4], delta[3], loc[3];
4266 const float eps = 0.00001f;
4485namespace blender::ed::sculpt_paint {
4493 bool use_origco =
false;
4496 switch (pbvh.
type()) {
4498 if (
const std::optional<OrigPositionData> orig_data =
4503 origco = orig_data->positions;
4511 origco = orig_data->positions;
4525 switch (pbvh.
type()) {
4527 int mesh_active_vert;
4566 BMVert *bmesh_active_vert;
4596 bool use_origco =
false;
4599 switch (pbvh.
type()) {
4601 if (
const std::optional<OrigPositionData> orig_data =
4606 origco = orig_data->positions;
4614 origco = orig_data->positions;
4659 const float4x4 &world_to_object = ob.world_to_object();
4688 const bool use_sampled_normal)
4693 bool original =
false;
4716 float depth =
raycast_init(&vc, mval, ray_start, ray_end, ray_normal, original);
4760 switch (pbvh->
type()) {
4775 out->location = ray_start + ray_normal * srd.
depth;
4778 if (!use_sampled_normal) {
4786 const float3 z_axis = {0.0f, 0.0f, 1.0f};
4812 out->normal = *sampled_normal;
4830 const bool force_original,
4831 const bool check_closest,
4832 const bool limit_closest_radius)
4842 const bool original = force_original || ((cache) ? !cache->
accum :
false);
4851 const float depth =
raycast_init(&vc, mval, ray_start, ray_end, ray_normal, original);
4888 out = ray_start + ray_normal * rd.
depth;
4892 if (hit || !check_closest) {
4915 fntrd.
depth = std::numeric_limits<float>::max();
4928 out = ray_start + ray_normal * fntrd.
depth;
4931 float closest_radius_sq = std::numeric_limits<float>::max();
4932 if (limit_closest_radius) {
4934 closest_radius_sq *= closest_radius_sq;
4942 const float mval[2],
4943 const bool force_original)
4950 C, location, mval, force_original, check_closest,
true);
4982 if (!
G.background) {
5051namespace blender::ed::sculpt_paint {
5066 if (!
mesh.runtime->corner_tris_cache.frozen) {
5067 mesh.runtime->corner_tris_cache.freeze();
5073 if (use_pbvh_draw) {
5079 mesh.tag_positions_changed_no_normals();
5081 mesh.runtime->corner_normals_cache.tag_dirty();
5087 mesh.tag_positions_changed();
5092 if (
object.runtime->bounds_eval) {
5093 object.runtime->bounds_eval =
mesh.bounds_min_max();
5110 if (mmd !=
nullptr) {
5130 if (!use_pbvh_draw) {
5175 if (other_rv3d != current_rv3d) {
5230 dst_attributes.
add(
name, domain, data_type,
init);
5234 dst_attributes.
add(
name, domain, data_type,
init);
5257 if (a.
runtime->face_offsets_sharing_info !=
b.runtime->face_offsets_sharing_info) {
5286 if (layer_index == -1) {
5289 return mesh.vert_data.layers[layer_index].sharing_info;
5302 bool entire_mesh_changed =
false;
5304 if (changed_topology) {
5306 entire_mesh_changed =
true;
5312 vertex_group_names.
add(vertex_group->name);
5317 if (
ELEM(iter.
name,
".edge_verts",
".corner_vert",
".corner_edge")) {
5328 changed_attributes.
add(iter.
name);
5333 changed_attributes.
add(iter.
name);
5341 if (vertex_groups_changed) {
5355 mesh.attributes_for_write().remove(
"position");
5364 const_cast<float3 *
>(position.
varray.get_internal_span().data()),
5370 mesh.vert_positions_for_write().copy_from(
VArraySpan(*position));
5387 mesh.attributes_for_write());
5400 mesh.attributes_for_write());
5410 entire_mesh_changed =
true;
5414 if (!use_pbvh_draw || entire_mesh_changed) {
5432 C, co_dummy, mval,
false, check_closest,
true);
5472namespace blender::ed::sculpt_paint {
5612 MEM_delete(ss.
cache);
5641 int ignore_background_click;
5698 if (ignore_background_click && !
over_mesh(
C, op, mval)) {
5754 MEM_delete(ss.
cache);
5770 ot->name =
"Sculpt";
5771 ot->idname =
"SCULPT_OT_brush_stroke";
5772 ot->description =
"Sculpt a stroke into the geometry";
5791 "override_location",
5793 "Override Location",
5794 "Override the given \"location\" array by recalculating object space positions from the "
5795 "provided \"mouse_event\" positions");
5799 "ignore_background_click",
5801 "Ignore Background Click",
5802 "Clicks on the background do not start the stroke");
5827 if (joined.
vert == -1) {
5828 joined.
vert =
b.vert;
5832 joined.
vert =
b.vert;
5843 const float max_distance_sq,
5844 const int island_id,
5848 for (
const int vert : node.
verts()) {
5849 if (!hide_vert.
is_empty() && hide_vert[vert]) {
5859 if (distance_sq < max_distance_sq && distance_sq < nvtd.
distance_sq) {
5871 const float max_distance_sq,
5872 const int island_id,
5876 for (
const int grid : node.
grids()) {
5879 const int vert = grid_range[offset];
5887 if (distance_sq < max_distance_sq && distance_sq < nvtd.
distance_sq) {
5897 const float max_distance_sq,
5898 const int island_id,
5902 for (
const BMVert *bm_vert :
5916 if (distance_sq < max_distance_sq && distance_sq < nvtd.
distance_sq) {
5925 const float max_distance_sq,
5933 switch (pbvh.
type()) {
5940 for (
const int vert : vert_positions.
index_range()) {
5945 const float3 &location = vert_positions[vert];
5974 if (nvtd.vert == -1) {
5977 fake_neighbors[vert] = nvtd.vert;
5978 fake_neighbors[nvtd.vert] = vert;
5992 const float3 &location = positions[vert];
6021 if (nvtd.vert == -1) {
6024 fake_neighbors[vert] = nvtd.vert;
6025 fake_neighbors[nvtd.vert] = vert;
6053 ss, location, max_distance_sq, island_id,
nodes[
i], nvtd);
6058 if (nvtd.vert == -1) {
6061 fake_neighbors[vert] = nvtd.vert;
6062 fake_neighbors[nvtd.vert] = vert;
6088 if (adjacent_faces_edge_count[
e] < 2) {
6089 const int2 &edge = edges[
e];
6100 const float max_dist)
6127namespace blender::ed::sculpt_paint {
6143 float depth =
raycast_init(vc, mouse, ray_end, ray_start, ray_normal, original);
6145 ray_normal = ray_normal * -1.0f;
6146 ray_start = position + ray_normal * 0.002f;
6159 const Mesh &
mesh = *
static_cast<const Mesh *
>(
object.data);
6205 const int verts_num)
6209 if (islands_num == 1) {
6215 for (const int i : range) {
6216 island_ids[i] = uint8_t(island_indices[i]);
6235 faces.index_range(), hide_poly, memory);
6241 disjoint_set.
join(face_verts.
first(), face_verts[
i]);
6257 for (const int grid : range) {
6258 SubdivCCGNeighbors neighbors;
6259 for (const short y : IndexRange(key.grid_size)) {
6260 for (const short x : IndexRange(key.grid_size)) {
6261 const SubdivCCGCoord coord{grid, x, y};
6262 SubdivCCGNeighbors neighbors;
6263 BKE_subdiv_ccg_neighbor_coords_get(subdiv_ccg, coord, true, neighbors);
6264 for (const SubdivCCGCoord neighbor : neighbors.coords) {
6265 disjoint_set.join(coord.to_index(key), neighbor.to_index(key));
6272 return vert_disjoint_set_to_islands(disjoint_set, subdiv_ccg.positions.size());
6287 for (
const BMFace *face :
6356namespace blender::ed::sculpt_paint {
6373 positions[
i] = vert->co;
6399 for (
const int i :
indices.index_range()) {
6439 for (
const int i :
indices.index_range()) {
6782 for (
const int i :
verts.index_range()) {
6783 r_factors[
i] = hide_vert[
verts[
i]] ? 0.0f : 1.0f;
6787 r_factors.
fill(1.0f);
6800 r_factors.
fill(1.0f);
6804 const BitSpan hidden = grid_hidden[grids[
i]];
6807 r_factors[start + offset] = hidden[offset] ? 0.0f : 1.0f;
6830 if (!
mask.is_empty()) {
6831 for (
const int i :
verts.index_range()) {
6836 r_factors.
fill(1.0f);
6840 for (
const int i :
verts.index_range()) {
6841 if (hide_vert[
verts[
i]]) {
6842 r_factors[
i] = 0.0f;
6860 r_factors[
i] = 0.0f;
6879 dst[offset] = 1.0f - src[offset];
6884 r_factors.
fill(1.0f);
6890 const BitSpan hidden = grid_hidden[grids[
i]];
6893 if (hidden[offset]) {
6894 r_factors[start + offset] = 0.0f;
6908 for (
const int i :
verts.index_range()) {
6910 factors[
i] *= std::max(
dot, 0.0f);
6920 for (
const int i :
normals.index_range()) {
6922 factors[
i] *= std::max(
dot, 0.0f);
6937 for (
const int offset : grid_factors.
index_range()) {
6938 const float dot =
math::dot(view_normal, grid_normals[offset]);
6939 grid_factors[offset] *= std::max(
dot, 0.0f);
6953 factors[
i] *= std::max(
dot, 0.0f);
6967 factors[
i] *= std::max(
dot, 0.0f);
6989 for (
const int i :
verts.index_range()) {
6991 if (radial_symmetry_pass) {
7018 if (radial_symmetry_pass) {
7042 for (
const int i :
verts.index_range()) {
7049 for (
const int i :
verts.index_range()) {
7062 for (
float &value : r_distances) {
7063 value = std::sqrt(value);
7100 for (
float &value : r_distances) {
7101 value = std::sqrt(value);
7110 if (distances[
i] >= radius) {
7125 const float hardness = 1.0f - roundness;
7131 r_distances[
i] = 1.0f;
7134 if (std::min(local.x, local.y) > hardness) {
7139 if (std::max(local.x, local.y) > hardness) {
7141 r_distances[
i] = (std::max(local.x, local.y) - hardness) * roundness_rcp;
7146 r_distances[
i] = 0.0f;
7157 const float hardness,
7160 if (hardness == 0.0f) {
7163 const float threshold = hardness * radius;
7164 if (hardness == 1.0f) {
7166 distances[
i] = distances[
i] < threshold ? 0.0f : radius;
7170 const float radius_inv =
math::rcp(radius);
7171 const float hardness_inv_rcp =
math::rcp(1.0f - hardness);
7173 if (distances[
i] < threshold) {
7174 distances[
i] = 0.0f;
7177 const float radius_factor = (distances[
i] * radius_inv - hardness) * hardness_inv_rcp;
7178 distances[
i] = radius_factor * radius;
7209 for (
const int i :
verts.index_range()) {
7210 if (factors[
i] == 0.0f) {
7213 float texture_value;
7217 ss, brush, vert_positions[
verts[
i]], thread_id, &texture_value, texture_rgba);
7219 factors[
i] *= texture_value;
7237 if (factors[
i] == 0.0f) {
7240 float texture_value;
7245 factors[
i] *= texture_value;
7256 const float3 prev_translation = positions[
i] - orig_positions[
i];
7257 translations[
i] -= prev_translation;
7264 return std::any_of(values.
begin(), values.
end(), [&](
const float v) { return std::isnan(v); });
7275 for (
const int i :
verts.index_range()) {
7276 const int vert =
verts[
i];
7277 positions[vert] += translations[
i];
7293 for (
const int offset : grid_positions.
index_range()) {
7294 grid_positions[offset] += grid_translations[offset];
7315 if (len_sq < std::numeric_limits<float>::epsilon()) {
7318 const float dot_factor = -
math::rcp(len_sq);
7320 translations[
i] += plane *
math::dot(translations[
i], plane) * dot_factor;
7330 for (
const int i :
verts.index_range()) {
7349 for (
float3 &translation : translations) {
7350 translation[axis] = 0.0f;
7361 for (
const int i :
verts.index_range()) {
7362 const int vert =
verts[
i];
7370 co_mirror[axis] = 0.0f;
7372 translations[
i][axis] = co_local[axis] - positions[vert][axis];
7390 for (
float3 &translation : translations) {
7391 translation[axis] = 0.0f;
7409 co_mirror[axis] = 0.0f;
7411 translations[
i][axis] = co_local[axis] - positions[
i][axis];
7421 return std::nullopt;
7423 const int active_index =
object.shapenr - 1;
7426 return std::nullopt;
7430 data.basis_key_active = active_key == keys->
refkey;
7436 if ((other_key != active_key) && (*dependent)[
i]) {
7437 data.dependent_keys.append({
static_cast<float3 *
>(other_key->data), other_key->totelem});
7452 orig_ =
mesh.vert_positions_for_write();
7455 if (eval_mut.
data() != orig_.data()) {
7456 eval_mut_ = eval_mut;
7471 if (deform_imats_) {
7477 if (shape_key_data_) {
7478 if (!shape_key_data_->dependent_keys.is_empty()) {
7484 if (shape_key_data_->basis_key_active) {
7498 translations[
i] *= factors[
i];
7504 if (factor == 1.0f) {
7508 translations[
i] *= factor;
7514 if (strength == 1.0f) {
7517 for (
float &factor : factors) {
7527 factors[
i] *= strengths[
i];
7538 r_translations[
i] = offset * factors[
i];
7548 for (
const int i :
verts.index_range()) {
7549 translations[
i] = new_positions[
i] - old_positions[
verts[
i]];
7559 translations[
i] = new_positions[
i] - old_positions[
i];
7569 [&](
const int i,
const int pos) { node_data[
pos] =
nodes[
i].verts().size(); });
7608 for (
const int i :
verts.index_range()) {
7609 r_offset_data[
i] = r_data.
size();
7612 r_offset_data.
last() = r_data.
size();
7628 const int grid = grids[
i];
7629 const int node_verts_start =
i * key.
grid_area;
7634 r_offset_data[node_verts_start + offset] = r_data.
size();
7647 r_offset_data.
last() = r_data.
size();
7661 r_offset_data[
i] = r_data.
size();
7665 r_offset_data.
last() = r_data.
size();
7669template<
bool use_factors>
7681 if constexpr (use_factors) {
7688 for (
const int i :
verts.index_range()) {
7689 const int vert =
verts[
i];
7690 const int vert_start = r_data.
size();
7691 r_offset_data[
i] = vert_start;
7692 if constexpr (use_factors) {
7693 if (factors[
i] == 0.0f) {
7699 if (boundary_verts[vert]) {
7701 if (r_data.
size() == vert_start + 2) {
7702 r_data.
resize(vert_start);
7706 for (
int neighbor_i = r_data.
size() - 1; neighbor_i >= vert_start; neighbor_i--) {
7707 if (!boundary_verts[r_data[neighbor_i]]) {
7714 r_offset_data.
last() = r_data.
size();
7771 const int grid = grids[
i];
7772 const int node_verts_start =
i * key.
grid_area;
7779 const int node_vert_index = node_verts_start + offset;
7790 faces, corner_verts, boundary_verts, subdiv_ccg, coord))
7800 faces, corner_verts, boundary_verts, subdiv_ccg, coord);
7829 for (
const int i :
verts.index_range()) {
7833 translations[
i] =
closest - position;
7842 const float3 &position = positions[
i];
7845 translations[
i] =
closest - position;
7884 for (
const int i :
verts.index_range()) {
7907 for (
const int i :
verts.index_range()) {
bool BKE_brush_use_alpha_pressure(const Brush *brush)
float BKE_brush_alpha_get(const Paint *paint, const Brush *brush)
float BKE_brush_sample_tex_3d(const Paint *paint, const Brush *br, const MTex *mtex, const float point[3], float rgba[4], int thread, ImagePool *pool)
bool BKE_brush_use_locked_size(const Paint *paint, const Brush *brush)
std::optional< BrushColorJitterSettings > BKE_brush_color_jitter_get_settings(const Paint *paint, const Brush *brush)
bool BKE_brush_use_size_pressure(const Brush *brush)
float BKE_brush_radius_get(const Paint *paint, const Brush *brush)
bool BKE_brush_has_cube_tip(const Brush *brush, PaintMode paint_mode)
float BKE_brush_unprojected_radius_get(const Paint *paint, const Brush *brush)
void BKE_brush_size_set(Paint *paint, Brush *brush, int size)
void BKE_brush_unprojected_size_set(Paint *paint, Brush *brush, float unprojected_size)
void BKE_brush_calc_curve_factors(eBrushCurvePreset preset, const CurveMapping *cumap, blender::Span< float > distances, float brush_radius, blender::MutableSpan< float > factors)
int BKE_brush_size_get(const Paint *paint, const Brush *brush)
const MTex * BKE_brush_mask_texture_get(const Brush *brush, eObjectMode object_mode)
int CCG_grid_xy_to_index(const int grid_size, const int x, const int y)
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
Object * CTX_data_active_object(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Base * CTX_data_active_base(const bContext *C)
Main * CTX_data_main(const bContext *C)
ToolSettings * CTX_data_tool_settings(const bContext *C)
RegionView3D * CTX_wm_region_view3d(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
CustomData interface, see also DNA_customdata_types.h.
int CustomData_get_offset_named(const CustomData *data, eCustomDataType type, blender::StringRef name)
int CustomData_get_layer_index(const CustomData *data, eCustomDataType type)
const void * CustomData_add_layer_named_with_data(CustomData *data, eCustomDataType type, void *layer_data, int totelem, blender::StringRef name, const blender::ImplicitSharingInfo *sharing_info)
bool CustomData_free_layer_named(CustomData *data, blender::StringRef name)
ImagePool * BKE_image_pool_new()
KeyBlock * BKE_keyblock_find_by_index(Key *key, int index)
std::optional< blender::Array< bool > > BKE_keyblock_get_dependent_keys(const Key *key, int index)
bool BKE_base_is_visible(const View3D *v3d, const Base *base)
void BKE_id_free(Main *bmain, void *idv)
void BKE_mesh_nomain_to_mesh(Mesh *mesh_src, Mesh *mesh_dst, Object *ob, bool process_shape_keys=true)
void BKE_mesh_copy_parameters(Mesh *me_dst, const Mesh *me_src)
Mesh * BKE_mesh_from_object(Object *ob)
@ MULTIRES_COORDS_MODIFIED
void multires_stitch_grids(Object *)
void multires_mark_as_modified(Depsgraph *depsgraph, Object *object, MultiresModifiedFlags flags)
General operations, lookup, etc. for blender objects.
std::optional< blender::Bounds< blender::float3 > > BKE_object_boundbox_get(const Object *ob)
bool BKE_paint_brush_set_essentials(Main *bmain, Paint *paint, const char *name)
std::variant< std::monostate, int, BMVert * > ActiveVert
#define PAINT_SYMM_AREA_DEFAULT
bool BKE_paint_brush_set(Paint *paint, Brush *brush)
bool BKE_sculptsession_use_pbvh_draw(const Object *ob, const RegionView3D *rv3d)
blender::float3 seed_hsv_jitter()
#define SCULPT_FACE_SET_NONE
const Brush * BKE_paint_brush_for_read(const Paint *paint)
MultiresModifierData * BKE_sculpt_multires_active(const Scene *scene, Object *ob)
void BKE_sculpt_update_object_for_edit(Depsgraph *depsgraph, Object *ob_orig, bool is_paint_tool)
void BKE_sculpt_color_layer_create_if_needed(Object *object)
Paint * BKE_paint_get_active_from_context(const bContext *C)
void BKE_sculptsession_free_pbvh(Object &object)
Brush * BKE_paint_brush(Paint *paint)
void BKE_sculpt_mask_layers_ensure(Depsgraph *depsgraph, Main *bmain, Object *ob, MultiresModifierData *mmd)
A BVH for high poly meshes.
bool BKE_pbvh_node_fully_hidden_get(const blender::bke::pbvh::Node &node)
void BKE_pbvh_node_mark_topology_update(blender::bke::pbvh::Node &node)
int BKE_pbvh_get_grid_num_verts(const Object &object)
float BKE_pbvh_node_get_tmin(const blender::bke::pbvh::Node *node)
bool BKE_pbvh_node_fully_masked_get(const blender::bke::pbvh::Node &node)
void BKE_pbvh_bmesh_after_stroke(BMesh &bm, blender::bke::pbvh::Tree &pbvh)
const blender::Set< BMFace *, 0 > & BKE_pbvh_bmesh_node_faces(blender::bke::pbvh::BMeshNode *node)
const blender::Set< BMVert *, 0 > & BKE_pbvh_bmesh_node_unique_verts(blender::bke::pbvh::BMeshNode *node)
void BKE_pbvh_bmesh_node_save_orig(BMesh *bm, BMLog *log, blender::bke::pbvh::BMeshNode *node, bool use_original)
void BKE_pbvh_node_get_bm_orco_data(const blender::bke::pbvh::BMeshNode &node, blender::Span< blender::float3 > &r_orig_positions, blender::Span< blender::int3 > &r_orig_tris)
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_report(ReportList *reports, eReportType type, const char *message)
bool BKE_subdiv_ccg_coord_is_mesh_boundary(blender::OffsetIndices< int > faces, blender::Span< int > corner_verts, blender::BitSpan boundary_verts, const SubdivCCG &subdiv_ccg, SubdivCCGCoord coord)
int BKE_subdiv_ccg_grid_to_face_index(const SubdivCCG &subdiv_ccg, const int grid_index)
CCGKey BKE_subdiv_ccg_key_top_level(const SubdivCCG &subdiv_ccg)
void BKE_subdiv_ccg_foreach_visible_grid_vert(const CCGKey &key, const blender::BitGroupVector<> &grid_hidden, const int grid, const Fn &fn)
SubdivCCGAdjacencyType BKE_subdiv_ccg_coarse_mesh_adjacency_info_get(const SubdivCCG &subdiv_ccg, const SubdivCCGCoord &coord, blender::Span< int > corner_verts, blender::OffsetIndices< int > faces, int &r_v1, int &r_v2)
void BKE_subdiv_ccg_neighbor_coords_get(const SubdivCCG &subdiv_ccg, const SubdivCCGCoord &coord, bool include_duplicates, SubdivCCGNeighbors &r_neighbors)
#define BLI_assert_unreachable()
void BLI_dial_free(Dial *dial)
Dial * BLI_dial_init(const float start_position[2], float threshold)
float BLI_dial_angle(Dial *dial, const float current_position[2])
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
MINLINE float max_ff(float a, float b)
MINLINE float pow2f(float x)
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])
struct DistRayAABB_Precalc dist_squared_ray_to_aabb_v3_precalc(const float ray_origin[3], 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 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_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 mul_m3_v3(const float M[3][3], float r[3])
void zero_m4(float m[4][4])
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[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])
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
void rotate_m4(float mat[4][4], char axis, float angle)
void mul_mat3_m4_v3(const float mat[4][4], float r[3])
void normalize_m4(float R[4][4]) ATTR_NONNULL()
void axis_angle_to_mat3_single(float R[3][3], char axis, float angle)
void axis_angle_normalized_to_quat(float r[4], const float axis[3], float angle)
void quat_to_axis_angle(float axis[3], float *angle, const float q[4])
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 add_v3_fl(float r[3], float f)
MINLINE void sub_v3_v3(float r[3], const float a[3])
MINLINE float len_squared_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
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
void interp_v3_v3v3(float r[3], const float a[3], const float b[3], float t)
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE float normalize_v3_v3(float r[3], const float a[3])
MINLINE bool is_zero_v3(const float v[3]) 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_v3_v3(float r[3], const float a[3])
MINLINE void copy_v4_fl(float r[4], float f)
MINLINE float normalize_v3(float n[3])
int BLI_task_parallel_thread_id(const TaskParallelTLS *tls)
#define ENUM_OPERATORS(_type, _max)
#define CLOG_WARN(clg_ref,...)
void DEG_id_tag_update(ID *id, unsigned int flags)
#define ID_REAL_USERS(id)
@ BRUSH_PLANE_SWAP_HEIGHT_AND_DEPTH
@ BRUSH_AUTOMASKING_CAVITY_ALL
@ BRUSH_DEFORM_TARGET_CLOTH_SIM
@ SCULPT_BRUSH_TYPE_DRAW_SHARP
@ SCULPT_BRUSH_TYPE_THUMB
@ SCULPT_BRUSH_TYPE_BOUNDARY
@ SCULPT_BRUSH_TYPE_DISPLACEMENT_SMEAR
@ SCULPT_BRUSH_TYPE_DRAW_FACE_SETS
@ SCULPT_BRUSH_TYPE_NUDGE
@ SCULPT_BRUSH_TYPE_CLOTH
@ SCULPT_BRUSH_TYPE_PINCH
@ SCULPT_BRUSH_TYPE_SMEAR
@ SCULPT_BRUSH_TYPE_CLAY_THUMB
@ SCULPT_BRUSH_TYPE_MULTIPLANE_SCRAPE
@ SCULPT_BRUSH_TYPE_SIMPLIFY
@ SCULPT_BRUSH_TYPE_SNAKE_HOOK
@ SCULPT_BRUSH_TYPE_CREASE
@ SCULPT_BRUSH_TYPE_LAYER
@ SCULPT_BRUSH_TYPE_SLIDE_RELAX
@ SCULPT_BRUSH_TYPE_ELASTIC_DEFORM
@ SCULPT_BRUSH_TYPE_SMOOTH
@ SCULPT_BRUSH_TYPE_PAINT
@ SCULPT_BRUSH_TYPE_DISPLACEMENT_ERASER
@ SCULPT_BRUSH_TYPE_PLANE
@ SCULPT_BRUSH_TYPE_INFLATE
@ SCULPT_BRUSH_TYPE_ROTATE
@ SCULPT_BRUSH_TYPE_CLAY_STRIPS
@ BRUSH_GRAB_ACTIVE_VERTEX
@ BRUSH_INVERSE_SMOOTH_PRESSURE
@ BRUSH_CLOTH_DEFORM_EXPAND
@ BRUSH_CLOTH_DEFORM_GRAB
@ BRUSH_CLOTH_DEFORM_SNAKE_HOOK
@ BRUSH_SNAKE_HOOK_DEFORM_ELASTIC
@ PAINT_FALLOFF_SHAPE_SPHERE
@ PAINT_FALLOFF_SHAPE_TUBE
@ 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
@ BRUSH_AREA_RADIUS_PRESSURE
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 USER_EXPERIMENTAL_TEST(userdef, member)
@ V3D_SHADING_VERTEX_COLOR
#define RV3D_CLIPPING_ENABLED(v3d, rv3d)
#define OPERATOR_RETVAL_CHECK(ret)
void ED_image_undo_push_begin(const char *name, PaintMode paint_mode)
void ED_image_undo_push_end()
void ED_image_paint_brush_type_update_sticky_shading_color(bContext *C, Object *ob)
void ED_area_tag_redraw_regiontype(ScrArea *area, int regiontype)
void ED_region_tag_redraw(ARegion *region)
blender::float2 ED_view3d_project_float_v2_m4(const ARegion *region, const float co[3], const blender::float4x4 &mat)
void ED_view3d_win_to_delta(const ARegion *region, const float xy_delta[2], float zfac, float r_out[3], bool precise=false)
void ED_view3d_win_to_3d(const View3D *v3d, const ARegion *region, const float depth_pt[3], const float mval[2], float r_out[3])
void ED_view3d_init_mats_rv3d(const Object *ob, RegionView3D *rv3d)
ViewContext ED_view3d_viewcontext_init(bContext *C, Depsgraph *depsgraph)
blender::float4x4 ED_view3d_ob_project_mat_get(const RegionView3D *rv3d, const Object *ob)
bool ED_view3d_win_to_segment_clipped(const Depsgraph *depsgraph, const ARegion *region, const View3D *v3d, const float mval[2], float r_ray_start[3], float r_ray_end[3], bool do_clip_planes)
void ED_view3d_win_to_origin(const ARegion *region, const float mval[2], float r_out[3])
float ED_view3d_calc_zfac(const RegionView3D *rv3d, const float co[3])
void view3d_operator_needs_gpu(const bContext *C)
bool ED_view3d_clipping_test(const RegionView3D *rv3d, const float co[3], bool is_local)
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
Read Guarded memory(de)allocation.
void ntreeTexEndExecTree(struct bNodeTreeExec *exec)
struct bNodeTreeExec * ntreeTexBeginExecTree(struct bNodeTree *ntree)
#define BM_ELEM_CD_SET_FLOAT(ele, offset, f)
#define BM_ELEM_CD_GET_FLOAT(ele, offset)
#define BM_ELEM_CD_GET_INT(ele, offset)
#define BM_elem_index_get(ele)
#define BM_elem_flag_test(ele, hflag)
#define BM_elem_flag_test_bool(ele, hflag)
#define BM_ITER_ELEM(ele, iter, data, itype)
BMesh const char void * data
const float * BM_log_find_original_vert_mask(BMLog *log, BMVert *v)
const float * BM_log_find_original_vert_co(BMLog *log, BMVert *v)
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)
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
BPy_StructRNA * depsgraph
SIMD_FORCE_INLINE void invalidate()
bool closest(btVector3 &v)
void reinitialize(const int64_t new_size)
IndexRange index_range() const
void reinitialize(const int64_t new_size)
int calc_reduced_ids(MutableSpan< int > result) const
const void * data() const
GSpan get_internal_span() const
static IndexMask from_predicate(const IndexMask &universe, GrainSize grain_size, IndexMaskMemory &memory, Fn &&predicate)
static IndexMask from_bools(Span< bool > bools, IndexMaskMemory &memory)
static IndexMask from_bools_inverse(const VArray< bool > &bools, IndexMaskMemory &memory)
constexpr IndexRange drop_front(int64_t n) const
constexpr int64_t size() const
constexpr MutableSpan slice(const int64_t start, const int64_t size) const
constexpr T * data() const
constexpr void fill(const T &value) const
constexpr IndexRange index_range() const
constexpr void copy_from(Span< T > values) const
Span< NewT > constexpr cast() const
constexpr Span slice(int64_t start, int64_t size) const
constexpr const T & first() const
constexpr int64_t size() const
constexpr const T * end() const
constexpr IndexRange index_range() const
constexpr const T * begin() const
constexpr bool is_empty() const
void add_multiple(Span< Key > keys)
bool contains(const Key &key) const
Span< Key > as_span() const
void remove_and_reorder(const int64_t index)
int64_t remove_if(Predicate &&predicate)
void append(const T &value)
const T & last(const int64_t n=0) const
void resize(const int64_t new_size)
MutableSpan< T > as_mutable_span()
void extend(Span< T > array)
void append_non_duplicates(const T &value)
Span< T > as_span() const
void resize(const int64_t new_size_in_bits, const bool value=false)
GAttributeReader lookup(const StringRef attribute_id) const
GAttributeReader get() const
bool add(const StringRef attribute_id, const AttrDomain domain, const AttrType data_type, const AttributeInit &initializer)
GSpanAttributeWriter lookup_or_add_for_write_span(StringRef attribute_id, AttrDomain domain, AttrType data_type, const AttributeInit &initializer=AttributeInitDefaultValue())
bool remove(const StringRef attribute_id)
const Bounds< float3 > & bounds() const
const Bounds< float3 > & bounds_orig() const
void tag_attribute_changed(const IndexMask &node_mask, StringRef attribute_name)
void tag_positions_changed(const IndexMask &node_mask)
Span< NodeT > nodes() const
void update_bounds(const Depsgraph &depsgraph, const Object &object)
void tag_face_sets_changed(const IndexMask &node_mask)
void tag_masks_changed(const IndexMask &node_mask)
void tag_topology_changed(const IndexMask &node_mask)
IndexMask slice(IndexRange range) const
int64_t min_array_size() const
IndexRange index_range() const
void foreach_index(Fn &&fn) const
dot(value.rgb, luminance_coefficients)") DEFINE_VALUE("REDUCE(lhs
CCL_NAMESPACE_BEGIN ccl_device_inline float frac(const float x, ccl_private int *ix)
static float normals[][3]
VecBase< float, D > step(VecOp< float, D >, VecOp< float, D >) RET
float distance(VecOp< float, D >, VecOp< float, D >) RET
VecBase< float, 2 > float2
CCL_NAMESPACE_BEGIN ccl_device float invert(const float color, const float factor)
void count_indices(Span< int > indices, MutableSpan< int > counts)
bool supports_auto_smooth_pressure(const Brush &brush)
bool supports_rake_factor(const Brush &brush)
bool supports_accumulate(const Brush &brush)
bool supports_gravity(const Brush &brush)
bool supports_hardness_pressure(const Brush &brush)
bool supports_dyntopo(const Brush &brush)
bool supports_topology_rake(const Brush &brush)
bool supports_normal_weight(const Brush &brush)
IndexRange grid_range(const int grid_area, const int grid)
int2 face_find_adjacent_verts(const IndexRange face, const Span< int > corner_verts, const int vert)
pbvh::Tree * pbvh_get(Object &object)
void raycast(Tree &pbvh, FunctionRef< void(Node &node, float *tmin)> hit_fn, const float3 &ray_start, const float3 &ray_normal, bool original)
IndexMask search_nodes(const Tree &pbvh, IndexMaskMemory &memory, FunctionRef< bool(const Node &)> filter_fn)
void update_normals(const Depsgraph &depsgraph, Object &object_orig, Tree &pbvh)
IndexMask all_leaf_nodes(const Tree &pbvh, IndexMaskMemory &memory)
void clip_ray_ortho(Tree &pbvh, bool original, float ray_start[3], float ray_end[3], float ray_normal[3])
bool node_raycast_mesh(const MeshNode &node, Span< float3 > node_positions, Span< float3 > vert_positions, OffsetIndices< int > faces, Span< int > corner_verts, Span< int3 > corner_tris, Span< bool > hide_poly, const float3 &ray_start, const float3 &ray_normal, IsectRayPrecalc *isect_precalc, float *depth, int &r_active_vertex, int &r_active_face_index, float3 &r_face_normal)
void node_update_mask_bmesh(int mask_offset, BMeshNode &node)
void node_update_mask_mesh(Span< float > mask, MeshNode &node)
bool node_raycast_bmesh(BMeshNode &node, const float3 &ray_start, const float3 &ray_normal, const IsectRayPrecalc *isect_precalc, float *depth, bool use_original, BMVert **r_active_vertex, float3 &r_face_normal)
void node_update_mask_grids(const CCGKey &key, Span< float > masks, GridsNode &node)
bool node_raycast_grids(const SubdivCCG &subdiv_ccg, GridsNode &node, Span< float3 > node_positions, const float3 &ray_start, const float3 &ray_normal, const IsectRayPrecalc *isect_precalc, float *depth, SubdivCCGCoord &r_active_vertex, int &r_active_grid_index, float3 &r_face_normal)
Bounds< float3 > bounds_get(const Tree &pbvh)
Span< float3 > vert_normals_eval(const Depsgraph &depsgraph, const Object &object_orig)
MutableSpan< float3 > vert_positions_eval_for_write(const Depsgraph &depsgraph, Object &object_orig)
bool bmesh_update_topology(BMesh &bm, Tree &pbvh, BMLog &bm_log, PBVHTopologyUpdateMode mode, float min_edge_len, float max_edge_len, const float3 ¢er, const std::optional< float3 > &view_normal, float radius, bool use_frontface, bool use_projected)
void build_pixels(const Depsgraph &depsgraph, Object &object, Image &image, ImageUser &image_user)
bool find_nearest_to_ray_node(Tree &pbvh, Node &node, Span< float3 > node_positions, bool use_origco, Span< float3 > vert_positions, const OffsetIndices< int > faces, Span< int > corner_verts, Span< int3 > corner_tris, Span< bool > hide_poly, const SubdivCCG *subdiv_ccg, const float ray_start[3], const float ray_normal[3], float *depth, float *dist_sq)
void store_bounds_orig(Tree &pbvh)
Span< int > node_face_indices_calc_grids(const SubdivCCG &subdiv_ccg, const GridsNode &node, Vector< int > &faces)
Span< float3 > vert_positions_eval(const Depsgraph &depsgraph, const Object &object_orig)
void find_nearest_to_ray(Tree &pbvh, const FunctionRef< void(Node &node, float *tmin)> fn, const float3 &ray_start, const float3 &ray_normal, bool original)
Cache & stroke_cache_ensure(const Depsgraph &depsgraph, const Sculpt &sd, const Brush *brush, Object &ob)
void calc_vert_factors(const Depsgraph &depsgraph, const Object &object, const Cache &automasking, const bke::pbvh::MeshNode &node, Span< int > verts, MutableSpan< float > factors)
void calc_grids_factors(const Depsgraph &depsgraph, const Object &object, const Cache &automasking, const bke::pbvh::GridsNode &node, Span< int > grids, MutableSpan< float > factors)
bool is_enabled(const Sculpt &sd, const Object &object, const Brush *br)
bool vert_is_boundary(const GroupedSpan< int > vert_to_face_map, const Span< bool > hide_poly, const BitSpan boundary, const int vert)
void do_boundary_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob, const IndexMask &node_mask)
void ensure_boundary_info(Object &object)
CursorSampleResult calc_node_mask(const Depsgraph &depsgraph, Object &ob, const Brush &brush, IndexMaskMemory &memory)
CursorSampleResult calc_node_mask(const Depsgraph &depsgraph, Object &ob, const Brush &brush, IndexMaskMemory &memory)
void do_snake_hook_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
void do_smooth_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask, float brush_strength)
void do_mask_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
void do_draw_face_sets_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
void do_blob_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob, const IndexMask &node_mask)
void do_draw_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
void do_displacement_eraser_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob, const IndexMask &node_mask)
void do_elastic_deform_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
void do_draw_vector_displacement_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
void do_crease_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob, const IndexMask &node_mask)
void do_topology_relax_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
void do_thumb_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
void do_clay_thumb_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob, const IndexMask &node_mask)
void do_rotate_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
void do_topology_slide_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
void do_displacement_smear_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob, const IndexMask &node_mask)
void do_clay_strips_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob, const IndexMask &node_mask, const float3 &plane_normal, const float3 &plane_center)
void do_surface_smooth_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
void do_plane_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask, const float3 &plane_normal, const float3 &plane_center)
void do_enhance_details_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
void do_bmesh_topology_rake_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask, const float input_strength)
void do_layer_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
void do_nudge_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
void do_inflate_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob, const IndexMask &node_mask)
void do_relax_face_sets_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
void do_draw_sharp_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
void do_multiplane_scrape_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
void do_pinch_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
void do_smooth_mask_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask, float brush_strength)
void do_gravity_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob, const IndexMask &node_mask)
float clay_thumb_get_stabilized_pressure(const StrokeCache &cache)
void do_clay_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob, const IndexMask &node_mask)
void do_grab_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob, const IndexMask &node_mask)
bool is_cloth_deform_brush(const Brush &brush)
void brush_store_simulation_state(const Depsgraph &depsgraph, const Object &object, SimulationData &cloth_sim)
void ensure_nodes_constraints(const Sculpt &sd, Object &object, const IndexMask &node_mask, SimulationData &cloth_sim, const float3 &initial_location, const float radius)
void sim_activate_nodes(Object &object, SimulationData &cloth_sim, const IndexMask &node_mask)
IndexMask brush_affected_nodes_gather(const Object &object, const Brush &brush, IndexMaskMemory &memory)
void do_simulation_step(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, SimulationData &cloth_sim, const IndexMask &node_mask)
std::unique_ptr< SimulationData > brush_simulation_create(const Depsgraph &depsgraph, Object &ob, const float cloth_mass, const float cloth_damping, const float cloth_softbody_strength, const bool use_collisions, const bool needs_deform_coords)
void do_cloth_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob, const IndexMask &node_mask)
bke::GSpanAttributeWriter active_color_attribute_for_write(Mesh &mesh)
void do_smear_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob, const IndexMask &node_mask)
void color_vert_set(OffsetIndices< int > faces, Span< int > corner_verts, GroupedSpan< int > vert_to_face_map, bke::AttrDomain color_domain, int vert, const float4 &color, GMutableSpan color_attribute)
void do_paint_brush(const Depsgraph &depsgraph, PaintModeSettings &paint_mode_settings, const Sculpt &sd, Object &ob, const IndexMask &node_mask, const IndexMask &texnode_mask)
float relative_to_detail_size(const float relative_detail, const float brush_radius, const float pixel_radius, const float pixel_size)
float constant_to_detail_size(const float constant_detail, const Object &ob)
float brush_to_detail_size(const float brush_percent, const float brush_radius)
constexpr float EDGE_LENGTH_MIN_FACTOR
bool stroke_is_dyntopo(const Object &object, const Brush &brush)
int vert_face_set_get(const GroupedSpan< int > vert_to_face_map, const Span< int > face_sets, const int vert)
bool vert_has_unique_face_set(const GroupedSpan< int > vert_to_face_map, const Span< int > face_sets, int vert)
bool vert_has_face_set(const GroupedSpan< int > vert_to_face_map, const Span< int > face_sets, const int vert, const int face_set)
bke::SpanAttributeWriter< int > ensure_face_sets_mesh(Mesh &mesh)
int active_face_set_get(const Object &object)
static bool sculpt_check_unique_face_set_for_edge_in_base_mesh(const GroupedSpan< int > vert_to_face_map, const Span< int > face_sets, const Span< int > corner_verts, const OffsetIndices< int > faces, int v1, int v2)
bool vert_all_faces_visible_get(const Span< bool > hide_poly, const GroupedSpan< int > vert_to_face_map, const int vert)
void ensure_cache(Object &object)
static SculptTopologyIslandCache calc_topology_islands_grids(const Object &object)
static SculptTopologyIslandCache vert_disjoint_set_to_islands(const AtomicDisjointSet &vert_sets, const int verts_num)
static SculptTopologyIslandCache calc_topology_islands_mesh(const Mesh &mesh)
static SculptTopologyIslandCache calculate_cache(const Object &object)
static SculptTopologyIslandCache calc_topology_islands_bmesh(const Object &object)
int vert_id_get(const SculptSession &ss, const int vert)
void do_pose_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob, const IndexMask &node_mask)
void push_end(Object &ob)
bool has_bmesh_log_entry()
void push_nodes(const Depsgraph &depsgraph, Object &object, const IndexMask &node_mask, const Type type)
static void restore_from_undo_step(const Depsgraph &depsgraph, const Sculpt &sd, Object &object)
static void restore_color_from_undo_step(Object &object)
static void restore_face_set_from_undo_step(Object &object)
void push_begin_ex(const Scene &, Object &ob, const char *name)
void restore_position_from_undo_step(const Depsgraph &depsgraph, Object &object)
void geometry_begin(const Scene &scene, Object &ob, const wmOperator *op)
void geometry_end(Object &ob)
static void restore_mask_from_undo_step(Object &object)
void push_begin(const Scene &scene, Object &ob, const wmOperator *op)
bool stroke_get_location_bvh(bContext *C, float out[3], const float mval[2], const bool force_original)
void fill_factor_from_hide_and_mask(Span< bool > hide_vert, Span< float > mask, Span< int > verts, MutableSpan< float > r_factors)
static void calc_local_from_screen(const ViewContext &vc, const float center[3], const float screen_dir[2], float r_local_dir[3])
std::optional< Span< float > > orig_mask_data_lookup_grids(const Object &object, const bke::pbvh::GridsNode &node)
static brushes::CursorSampleResult calc_brush_node_mask(const Depsgraph &depsgraph, Object &ob, const Brush &brush, IndexMaskMemory &memory)
static bool stroke_test_start(bContext *C, wmOperator *op, const float mouse[2])
static bool brush_needs_rake_rotation(const Brush &brush)
MutableSpan< float3 > gather_grids_positions(const SubdivCCG &subdiv_ccg, const Span< int > grids, Vector< float3 > &positions)
static float brush_dynamic_size_get(const Brush &brush, const StrokeCache &cache, float initial_size)
static void fake_neighbor_search_mesh(const SculptSession &ss, const Span< float3 > vert_positions, const Span< bool > hide_vert, const float3 &location, const float max_distance_sq, const int island_id, const bke::pbvh::MeshNode &node, NearestVertData &nvtd)
static bool attribute_matches(const bke::AttributeAccessor a, const bke::AttributeAccessor b, const StringRef name)
bool node_in_sphere(const bke::pbvh::Node &node, const float3 &location, const float radius_sq, const bool original)
void scatter_data_bmesh(Span< T > node_data, const Set< BMVert *, 0 > &verts, MutableSpan< T > dst)
bool node_in_cylinder(const DistRayAABB_Precalc &ray_dist_precalc, const bke::pbvh::Node &node, const float radius_sq, const bool original)
void calc_factors_common_from_orig_data_grids(const Depsgraph &depsgraph, const Brush &brush, const Object &object, Span< float3 > positions, Span< float3 > normals, const bke::pbvh::GridsNode &node, Vector< float > &r_factors, Vector< float > &r_distances)
void gather_bmesh_positions(const Set< BMVert *, 0 > &verts, MutableSpan< float3 > positions)
static void smooth_brush_toggle_off(Paint *paint, StrokeCache *cache)
static void tag_mesh_positions_changed(Object &object, const bool use_pbvh_draw)
void calc_brush_strength_factors(const StrokeCache &cache, const Brush &brush, Span< float > distances, MutableSpan< float > factors)
std::optional< Span< int > > orig_face_set_data_lookup_mesh(const Object &object, const bke::pbvh::MeshNode &node)
void gather_data_grids(const SubdivCCG &subdiv_ccg, Span< T > src, Span< int > grids, MutableSpan< T > node_data)
static void redo_empty_ui(bContext *, wmOperator *)
void vert_random_access_ensure(Object &object)
std::optional< int > nearest_vert_calc_mesh(const bke::pbvh::Tree &pbvh, const Span< float3 > vert_positions, const Span< bool > hide_vert, const float3 &location, const float max_distance, const bool use_original)
void filter_below_plane_factors(Span< float3 > vert_positions, Span< int > verts, const float4 &plane, MutableSpan< float > factors)
wmOperatorStatus paint_stroke_exec(bContext *C, wmOperator *op, PaintStroke *stroke)
static void stroke_update_step(bContext *C, wmOperator *op, PaintStroke *, PointerRNA *stroke_element)
static void do_radial_symmetry(const Depsgraph &depsgraph, const Scene &scene, Sculpt &sd, Object &ob, const Brush &brush, PaintModeSettings &paint_mode_settings, const BrushActionFunc action, const ePaintSymmetryFlags symm, const int axis, const float)
void apply_hardness_to_distances(float radius, float hardness, MutableSpan< float > distances)
void calc_factors_common_grids(const Depsgraph &depsgraph, const Brush &brush, const Object &object, Span< float3 > positions, const bke::pbvh::GridsNode &node, Vector< float > &r_factors, Vector< float > &r_distances)
GroupedSpan< int > calc_vert_neighbors(OffsetIndices< int > faces, Span< int > corner_verts, GroupedSpan< int > vert_to_face, Span< bool > hide_poly, Span< int > verts, Vector< int > &r_offset_data, Vector< int > &r_data)
void gather_bmesh_normals(const Set< BMVert *, 0 > &verts, MutableSpan< float3 > normals)
static void pose_fake_neighbors_free(SculptSession &ss)
static GroupedSpan< int > calc_vert_neighbors_interior_impl(const OffsetIndices< int > faces, const Span< int > corner_verts, const GroupedSpan< int > vert_to_face, const BitSpan boundary_verts, const Span< bool > hide_poly, const Span< int > verts, const Span< float > factors, Vector< int > &r_offset_data, Vector< int > &r_data)
bool node_fully_masked_or_hidden(const bke::pbvh::Node &node)
float3 tilt_effective_normal_get(const SculptSession &ss, const Brush &brush)
Vector< BMVert *, 64 > BMeshNeighborVerts
void calc_factors_common_mesh_indexed(const Depsgraph &depsgraph, const Brush &brush, const Object &object, const MeshAttributeData &attribute_data, Span< float3 > vert_positions, Span< float3 > vert_normals, const bke::pbvh::MeshNode &node, Vector< float > &r_factors, Vector< float > &r_distances)
void filter_distances_with_radius(float radius, Span< float > distances, MutableSpan< float > factors)
std::optional< OrigPositionData > orig_position_data_lookup_grids(const Object &object, const bke::pbvh::GridsNode &node)
static const ImplicitSharingInfo * get_vertex_group_sharing_info(const Mesh &mesh)
static void cache_paint_invariants_update(StrokeCache &cache, const Brush &brush)
void filter_region_clip_factors(const SculptSession &ss, Span< float3 > vert_positions, Span< int > verts, MutableSpan< float > factors)
void gather_data_bmesh(Span< T > src, const Set< BMVert *, 0 > &verts, MutableSpan< T > node_data)
static void fake_neighbor_init(Object &object, const float max_dist)
void reset_translations_to_original(MutableSpan< float3 > translations, Span< float3 > positions, Span< float3 > orig_positions)
float3 symmetry_flip(const float3 &src, const ePaintSymmetryFlags symm)
static int sculpt_brush_needs_normal(const SculptSession &ss, const Brush &brush)
void orig_position_data_gather_bmesh(const BMLog &bm_log, const Set< BMVert *, 0 > &verts, MutableSpan< float3 > positions, MutableSpan< float3 > normals)
static float area_normal_calc_weight(const float distance, const float radius_inv)
void scale_translations(MutableSpan< float3 > translations, Span< float > factors)
void paint_stroke_cancel(bContext *C, wmOperator *op, PaintStroke *stroke)
static bool brush_type_needs_original(const char sculpt_brush_type)
bool paint_supports_dynamic_size(const Brush &br, PaintMode mode)
static void sculpt_init_mirror_clipping(const Object &ob, const SculptSession &ss)
static IndexMask pbvh_gather_texpaint(Object &ob, const Brush &brush, const bool use_original, const float radius_scale, IndexMaskMemory &memory)
static void stroke_done(const bContext *C, PaintStroke *stroke)
static void brush_exit_tex(Sculpt &sd)
bool color_supported_check(const Scene &scene, Object &object, ReportList *reports)
static bool need_delta_from_anchored_origin(const Brush &brush)
static void calc_area_normal_and_center_node_grids(const Object &object, const Brush &brush, const AverageDataFlags flag, const bke::pbvh::GridsNode &node, SampleLocalData &tls, AreaNormalCenterData &anctd)
static wmOperatorStatus brush_stroke_modal(bContext *C, wmOperator *op, const wmEvent *event)
static bool sculpt_needs_connectivity_info(const Sculpt &sd, const Brush &brush, const Object &object, int stroke_mode)
bool report_if_shape_key_is_locked(const Object &ob, ReportList *reports)
static void store_sculpt_entire_mesh(const wmOperator &op, const Scene &scene, Object &object, Mesh *new_mesh)
float raycast_init(ViewContext *vc, const float2 &mval, float3 &r_ray_start, float3 &r_ray_end, float3 &r_ray_normal, bool original)
static bool brush_type_needs_all_pbvh_nodes(const Brush &brush)
void filter_verts_outside_symmetry_area(Span< float3 > positions, const float3 &pivot, ePaintSymmetryFlags symm, MutableSpan< float > factors)
static void do_brush_action(const Depsgraph &depsgraph, const Scene &, Sculpt &sd, Object &ob, const Brush &brush, PaintModeSettings &paint_mode_settings)
static void accumulate_area_center(const float3 &test_location, const float3 &position, const float distance, const float radius_inv, const int flip_index, AreaNormalCenterData &anctd)
static void rake_data_update(SculptRakeData *srd, const float co[3])
void calc_translations_to_plane(Span< float3 > vert_positions, Span< int > verts, const float4 &plane, MutableSpan< float3 > translations)
void scale_factors(MutableSpan< float > factors, float strength)
void calc_factors_common_from_orig_data_mesh(const Depsgraph &depsgraph, const Brush &brush, const Object &object, const MeshAttributeData &attribute_data, Span< float3 > positions, Span< float3 > normals, const bke::pbvh::MeshNode &node, Vector< float > &r_factors, Vector< float > &r_distances)
static void do_symmetrical_brush_actions(const Depsgraph &depsgraph, const Scene &scene, Sculpt &sd, Object &ob, const BrushActionFunc action, PaintModeSettings &paint_mode_settings)
static void brush_delta_update(const Depsgraph &depsgraph, Paint &paint, const Object &ob, const Brush &brush)
static void smooth_brush_toggle_on(const bContext *C, Paint *paint, StrokeCache *cache)
static float3 calc_sculpt_normal(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob, const IndexMask &node_mask)
bool brush_type_is_paint(const int tool)
void translations_from_new_positions(Span< float3 > new_positions, Span< int > verts, Span< float3 > old_positions, MutableSpan< float3 > translations)
static bool need_delta_for_tip_orientation(const Brush &brush)
void clip_and_lock_translations(const Sculpt &sd, const SculptSession &ss, Span< float3 > positions, Span< int > verts, MutableSpan< float3 > translations)
bool cursor_geometry_info_update(bContext *C, CursorGeometryInfo *out, const float2 &mval, const bool use_sampled_normal)
static void sculpt_brush_stroke_cancel(bContext *C, wmOperator *op)
IndexMask gather_nodes(const bke::pbvh::Tree &pbvh, const eBrushFalloffShape falloff_shape, const bool use_original, const float3 &location, const float radius_sq, const std::optional< float3 > &ray_direction, IndexMaskMemory &memory)
static void push_undo_nodes(const Depsgraph &depsgraph, Object &ob, const Brush &brush, const IndexMask &node_mask)
void flush_update_done(const bContext *C, Object &ob, const UpdateType update_type)
std::optional< Span< float4 > > orig_color_data_lookup_mesh(const Object &object, const bke::pbvh::MeshNode &node)
void scatter_data_mesh(Span< T > src, Span< int > indices, MutableSpan< T > dst)
static bool contains_nan(const Span< float > values)
wmOperatorStatus paint_stroke_modal(bContext *C, wmOperator *op, const wmEvent *event, PaintStroke **stroke_p)
void calc_brush_distances(const SculptSession &ss, Span< float3 > vert_positions, Span< int > vert, eBrushFalloffShape falloff_shape, MutableSpan< float > r_distances)
void SCULPT_OT_brush_stroke(wmOperatorType *ot)
void project_translations(MutableSpan< float3 > translations, const float3 &plane)
void calc_brush_plane(const Depsgraph &depsgraph, const Brush &brush, Object &ob, const IndexMask &node_mask, float3 &r_area_no, float3 &r_area_co)
Span< BMVert * > vert_neighbors_get_interior_bmesh(BMVert &vert, BMeshNeighborVerts &r_neighbors)
static void calc_brush_local_mat(const float rotation, const Object &ob, float local_mat[4][4], float local_mat_inv[4][4])
void(*)(const Depsgraph &depsgraph, const Scene &scene, Sculpt &sd, Object &ob, const Brush &brush, PaintModeSettings &paint_mode_settings) BrushActionFunc
std::optional< float3 > calc_area_normal(const Depsgraph &depsgraph, const Brush &brush, const Object &ob, const IndexMask &node_mask)
void filter_plane_trim_limit_factors(const Brush &brush, const StrokeCache &cache, Span< float3 > translations, MutableSpan< float > factors)
OffsetIndices< int > create_node_vert_offsets(Span< bke::pbvh::MeshNode > nodes, const IndexMask &node_mask, Array< int > &node_data)
Span< BMVert * > vert_neighbors_get_bmesh(BMVert &vert, BMeshNeighborVerts &r_neighbors)
void apply_translations(Span< float3 > translations, Span< int > verts, MutableSpan< float3 > positions)
void calc_factors_common_mesh(const Depsgraph &depsgraph, const Brush &brush, const Object &object, const MeshAttributeData &attribute_data, Span< float3 > positions, Span< float3 > vert_normals, const bke::pbvh::MeshNode &node, Vector< float > &r_factors, Vector< float > &r_distances)
bool vertex_is_occluded(const Depsgraph &depsgraph, const Object &object, const float3 &position, bool original)
ViewContext * paint_stroke_view_context(PaintStroke *stroke)
void gather_data_mesh(Span< T > src, Span< int > indices, MutableSpan< T > dst)
void calc_brush_texture_factors(const SculptSession &ss, const Brush &brush, Span< float3 > vert_positions, Span< int > vert, MutableSpan< float > factors)
static void fake_neighbor_search_bmesh(const SculptSession &ss, const float3 &location, const float max_distance_sq, const int island_id, const bke::pbvh::BMeshNode &node, NearestVertData &nvtd)
static void calc_area_normal_and_center_node_mesh(const Object &object, const Span< float3 > vert_positions, const Span< float3 > vert_normals, const Span< bool > hide_vert, const Brush &brush, const AverageDataFlags flag, const bke::pbvh::MeshNode &node, SampleLocalData &tls, AreaNormalCenterData &anctd)
bool paint_brush_cursor_poll(bContext *C)
static void sculpt_fix_noise_tear(const Sculpt &sd, Object &ob)
static AreaNormalCenterData calc_area_normal_and_center_reduce(const AreaNormalCenterData &a, const AreaNormalCenterData &b)
void filter_above_plane_factors(Span< float3 > vert_positions, Span< int > verts, const float4 &plane, MutableSpan< float > factors)
void calc_area_center(const Depsgraph &depsgraph, const Brush &brush, const Object &ob, const IndexMask &node_mask, float r_area_co[3])
float object_space_radius_get(const ViewContext &vc, const Paint &paint, const Brush &brush, const float3 &location, const float scale_factor)
void flush_update_step(const bContext *C, const UpdateType update_type)
BLI_INLINE bool brush_type_is_attribute_only(const int tool)
static void sculpt_update_cache_variants(bContext *C, Sculpt &sd, Object &ob, PointerRNA *ptr)
static constexpr int plane_brush_max_rolling_average_num
float brush_plane_offset_get(const Brush &brush, const SculptSession &ss)
static wmOperatorStatus sculpt_brush_stroke_exec(bContext *C, wmOperator *op)
static void calc_stabilized_plane(const Brush &brush, StrokeCache &cache, const float3 &plane_normal, const float3 &plane_center, float3 &r_stabilized_normal, float3 &r_stabilized_center)
void apply_crazyspace_to_translations(Span< float3x3 > deform_imats, Span< int > verts, MutableSpan< float3 > translations)
static void sculpt_find_nearest_to_ray_cb(bke::pbvh::Node &node, FindNearestToRayData &fntrd, float *tmin)
static bool topology_matches(const Mesh &a, const Mesh &b)
std::optional< BMVert * > nearest_vert_calc_bmesh(const bke::pbvh::Tree &pbvh, const float3 &location, const float max_distance, const bool use_original)
static void sculpt_raycast_cb(bke::pbvh::Node &node, RaycastData &rd, float *tmin)
static void fake_neighbor_search(const Depsgraph &depsgraph, const Object &ob, const float max_distance_sq, MutableSpan< int > fake_neighbors)
static wmOperatorStatus sculpt_brush_stroke_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void calc_front_face(const float3 &view_normal, Span< float3 > normals, MutableSpan< float > factors)
float paint_stroke_distance_get(PaintStroke *stroke)
static void replace_attribute(const bke::AttributeAccessor src_attributes, const StringRef name, const bke::AttrDomain domain, const bke::AttrType data_type, bke::MutableAttributeAccessor dst_attributes)
static float3 area_center_calc_weighted(const float3 &test_location, const float distance, const float radius_inv, const float3 &co)
static void fake_neighbor_search_grids(const SculptSession &ss, const CCGKey &key, const Span< float3 > positions, const BitGroupVector<> &grid_hidden, const float3 &location, const float max_distance_sq, const int island_id, const bke::pbvh::GridsNode &node, NearestVertData &nvtd)
std::optional< Span< float > > orig_mask_data_lookup_mesh(const Object &object, const bke::pbvh::MeshNode &node)
static void calc_area_normal_and_center_node_bmesh(const Object &object, const Brush &brush, const AverageDataFlags flag, const bool has_bm_orco, const bke::pbvh::BMeshNode &node, SampleLocalData &tls, AreaNormalCenterData &anctd)
std::optional< SubdivCCGCoord > nearest_vert_calc_grids(const bke::pbvh::Tree &pbvh, const SubdivCCG &subdiv_ccg, const float3 &location, const float max_distance, const bool use_original)
std::optional< OrigPositionData > orig_position_data_lookup_mesh_all_verts(const Object &object, const bke::pbvh::MeshNode &node)
static IndexMask pbvh_gather_cursor_update(Object &ob, bool use_original, IndexMaskMemory &memory)
static bool brush_uses_topology_rake(const SculptSession &ss, const Brush &brush)
void calc_brush_distances_squared(const SculptSession &ss, Span< float3 > positions, Span< int > verts, eBrushFalloffShape falloff_shape, MutableSpan< float > r_distances)
void gather_grids_normals(const SubdivCCG &subdiv_ccg, Span< int > grids, MutableSpan< float3 > normals)
static void sculpt_update_cache_invariants(bContext *C, Sculpt &sd, SculptSession &ss, const wmOperator &op, const float mval[2])
void calc_area_normal_and_center(const Depsgraph &depsgraph, const Brush &brush, const Object &ob, const IndexMask &node_mask, float r_area_no[3], float r_area_co[3])
void paint_stroke_free(bContext *C, wmOperator *op, PaintStroke *stroke)
PaintStroke * paint_stroke_new(bContext *C, wmOperator *op, StrokeGetLocation get_location, StrokeTestStart test_start, StrokeUpdateStep update_step, StrokeRedraw redraw, StrokeDone done, int event_type)
void translations_from_offset_and_factors(const float3 &offset, Span< float > factors, MutableSpan< float3 > r_translations)
void calc_brush_cube_distances(const Brush &brush, const Span< T > positions, const MutableSpan< float > r_distances)
static float area_normal_and_center_get_normal_radius(const SculptSession &ss, const Brush &brush)
std::optional< OrigPositionData > orig_position_data_lookup_mesh(const Object &object, const bke::pbvh::MeshNode &node)
void store_mesh_from_eval(const wmOperator &op, const Scene &scene, const Depsgraph &depsgraph, const RegionView3D *rv3d, Object &object, Mesh *new_mesh)
void append_neighbors_to_vector(const OffsetIndices< int > faces, const Span< int > corner_verts, const GroupedSpan< int > vert_to_face, const Span< bool > hide_poly, const int vert, Vector< int > &r_data)
std::optional< Span< int > > orig_face_set_data_lookup_grids(const Object &object, const bke::pbvh::GridsNode &node)
static void dynamic_topology_update(const Depsgraph &depsgraph, const Scene &, Sculpt &sd, Object &ob, const Brush &brush, PaintModeSettings &)
Span< int > vert_neighbors_get_mesh(const OffsetIndices< int > faces, const Span< int > corner_verts, const GroupedSpan< int > vert_to_face, const Span< bool > hide_poly, const int vert, Vector< int > &r_neighbors)
void fill_factor_from_hide(Span< bool > hide_vert, Span< int > verts, MutableSpan< float > r_factors)
void scatter_data_grids(const SubdivCCG &subdiv_ccg, Span< T > node_data, Span< int > grids, MutableSpan< T > dst)
bool brush_uses_vector_displacement(const Brush &brush)
OffsetIndices< int > create_node_vert_offsets_bmesh(Span< bke::pbvh::BMeshNode > nodes, const IndexMask &node_mask, Array< int > &node_data)
void calc_factors_common_bmesh(const Depsgraph &depsgraph, const Brush &brush, const Object &object, Span< float3 > positions, bke::pbvh::BMeshNode &node, Vector< float > &r_factors, Vector< float > &r_distances)
GroupedSpan< int > calc_vert_neighbors_interior(OffsetIndices< int > faces, Span< int > corner_verts, GroupedSpan< int > vert_to_face, BitSpan boundary_verts, Span< bool > hide_poly, Span< int > verts, Vector< int > &r_offset_data, Vector< int > &r_data)
static void update_sculpt_normal(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob, const brushes::CursorSampleResult &cursor_sample_result)
bool brush_type_is_mask(const int tool)
static void accumulate_area_normal(const float3 &normal, const float distance, const float radius_inv, const int flip_index, AreaNormalCenterData &anctd)
bool paint_brush_tool_poll(bContext *C)
static void do_tiled(const Depsgraph &depsgraph, const Scene &scene, Sculpt &sd, Object &ob, const Brush &brush, PaintModeSettings &paint_mode_settings, const BrushActionFunc action)
void calc_factors_common_from_orig_data_bmesh(const Depsgraph &depsgraph, const Brush &brush, const Object &object, Span< float3 > positions, Span< float3 > normals, bke::pbvh::BMeshNode &node, Vector< float > &r_factors, Vector< float > &r_distances)
static bool stroke_get_location_bvh_ex(bContext *C, float3 &out, const float2 &mval, const bool force_original, const bool check_closest, const bool limit_closest_radius)
Span< float3 > vert_positions_for_grab_active_get(const Depsgraph &depsgraph, const Object &object)
float3 tilt_apply_to_normal(const Object &object, const float4x4 &view_inverse, const float3 &normal, const float2 &tilt, const float tilt_strength)
static float area_normal_and_center_get_position_radius(const SculptSession &ss, const Brush &brush)
static IndexMask pbvh_gather_generic(Object &ob, const Brush &brush, const bool use_original, const float radius_scale, IndexMaskMemory &memory)
bool is_symmetry_iteration_valid(const char i, const char symm)
QuaternionBase< float > Quaternion
T length_squared(const VecBase< T, Size > &a)
VecBase< T, 3 > normal_tri(const VecBase< T, 3 > &v1, const VecBase< T, 3 > &v2, const VecBase< T, 3 > &v3)
T clamp(const T &a, const T &min, const T &max)
QuaternionBase< T > to_quaternion(const AxisAngleBase< T, AngleT > &axis_angle)
T safe_divide(const T &a, const T &b)
T reduce_max(const VecBase< T, Size > &a)
T distance(const T &a, const T &b)
AxisAngleBase< float, AngleRadianBase< float > > AxisAngle
QuaternionBase< T > normalize_and_get_length(const QuaternionBase< T > &q, T &out_length)
T dot(const QuaternionBase< T > &a, const QuaternionBase< T > &b)
CartesianBasis invert(const CartesianBasis &basis)
float3 rotate_direction_around_axis(const float3 &direction, const float3 &axis, float angle)
VectorT project_point(const MatT &mat, const VectorT &point)
T interpolate(const T &a, const T &b, const FactorT &t)
MatBase< T, NumCol, NumRow > normalize(const MatBase< T, NumCol, NumRow > &a)
T distance_squared(const VecBase< T, Size > &a, const VecBase< T, Size > &b)
VecBase< T, 3 > transform_direction(const MatBase< T, 3, 3 > &mat, const VecBase< T, 3 > &direction)
VecBase< T, 3 > transform_point(const CartesianBasis &basis, const VecBase< T, 3 > &v)
OffsetIndices< int > accumulate_counts_to_offsets(MutableSpan< int > counts_to_offsets, int start_offset=0)
void isolate_task(const Function &function)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
Value parallel_reduce(IndexRange range, int64_t grain_size, const Value &identity, const Function &function, const Reduction &reduction)
MatBase< float, 4, 4 > float4x4
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
VecBase< float, 3 > float3
static void init(bNodeTree *, bNode *node)
float paint_calc_object_space_radius(const ViewContext &vc, const blender::float3 ¢er, float pixel_radius)
bool paint_get_tex_pixel(const MTex *mtex, float u, float v, ImagePool *pool, int thread, float *r_intensity, float r_rgba[4])
void paint_stroke_operator_properties(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_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
static void stroke_undo_end(const bContext *C, Brush *brush)
bool SCULPT_stroke_is_first_brush_step_of_symmetry_pass(const blender::ed::sculpt_paint::StrokeCache &cache)
bool SCULPT_brush_cursor_poll(bContext *C)
ePaintSymmetryFlags SCULPT_mesh_symmetry_xyz_get(const Object &object)
static void restore_from_undo_step_if_necessary(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob)
static void brush_stroke_init(bContext *C)
const float * SCULPT_brush_frontface_normal_from_falloff_shape(const SculptSession &ss, char falloff_shape)
Span< int > SCULPT_fake_neighbors_ensure(const Depsgraph &depsgraph, Object &ob, const float max_dist)
static void brush_init_tex(const Sculpt &sd, SculptSession &ss)
static bool sculpt_needs_pbvh_pixels(PaintModeSettings &paint_mode_settings, const Brush &brush, Object &ob)
static bool over_mesh(bContext *C, wmOperator *, const float mval[2])
void SCULPT_stroke_modifiers_check(const bContext *C, Object &ob, const Brush &brush)
void sculpt_apply_texture(const SculptSession &ss, const Brush &brush, const float brush_point[3], const int thread_id, float *r_value, float r_rgba[4])
static float calc_symmetry_feather(const Sculpt &sd, const Mesh &mesh, const blender::ed::sculpt_paint::StrokeCache &cache)
static void sculpt_pbvh_update_pixels(const Depsgraph &depsgraph, PaintModeSettings &paint_mode_settings, Object &ob)
static const char * sculpt_brush_type_name(const Sculpt &sd)
void SCULPT_cache_calc_brushdata_symm(blender::ed::sculpt_paint::StrokeCache &cache, const ePaintSymmetryFlags symm, const char axis, const float angle)
bool SCULPT_mode_poll_view3d(bContext *C)
static float brush_flip(const Brush &brush, const blender::ed::sculpt_paint::StrokeCache &cache)
float3 SCULPT_flip_v3_by_symm_area(const float3 &vector, const ePaintSymmetryFlags symm, const ePaintSymmetryAreas symmarea, const float3 &pivot)
bool SCULPT_mode_poll(bContext *C)
static void stroke_undo_begin(const bContext *C, wmOperator *op)
static float calc_radial_symmetry_feather(const Mesh &mesh, const blender::ed::sculpt_paint::StrokeCache &cache, const ePaintSymmetryFlags symm, const char axis)
void SCULPT_calc_vertex_displacement(const SculptSession &ss, const Brush &brush, float translation[3])
static bool is_brush_related_tool(bContext *C)
bool SCULPT_stroke_is_main_symmetry_pass(const blender::ed::sculpt_paint::StrokeCache &cache)
static void flip_qt(float quat[4], const ePaintSymmetryFlags symm)
static void flip_qt_qt(float out[4], const float in[4], const ePaintSymmetryFlags symm)
int SCULPT_vertex_count_get(const Object &object)
void sculpt_project_v3_normal_align(const SculptSession &ss, const float normal_weight, float grab_delta[3])
static void update_brush_local_mat(const Sculpt &sd, Object &ob)
void SCULPT_cube_tip_init(const Sculpt &, const Object &ob, const Brush &brush, float mat[4][4])
void SCULPT_fake_neighbors_free(Object &ob)
bool SCULPT_is_vertex_inside_brush_radius_symm(const float vertex[3], const float br_co[3], float radius, char symm)
bool SCULPT_check_vertex_pivot_symmetry(const float vco[3], const float pco[3], const char symm)
static float brush_strength(const Sculpt &sd, const blender::ed::sculpt_paint::StrokeCache &cache, const float feather, const PaintModeSettings &)
bool SCULPT_poll(bContext *C)
ePaintSymmetryAreas SCULPT_get_vertex_symm_area(const float co[3])
static float calc_overlap(const blender::ed::sculpt_paint::StrokeCache &cache, const ePaintSymmetryFlags symm, const char axis, const float angle)
void SCULPT_flip_quat_by_symm_area(float quat[4], const ePaintSymmetryFlags symm, const ePaintSymmetryAreas symmarea, const float pivot[3])
bool SCULPT_stroke_is_first_brush_step(const blender::ed::sculpt_paint::StrokeCache &cache)
void SCULPT_tag_update_overlays(bContext *C)
#define SCULPT_RAKE_BRUSH_FACTOR
#define FAKE_NEIGHBOR_NONE
bool SCULPT_use_image_paint_brush(PaintModeSettings &settings, Object &ob)
bool SCULPT_paint_image_canvas_get(PaintModeSettings &paint_mode_settings, Object &ob, Image **r_image, ImageUser **r_image_user) ATTR_NONNULL()
Get the image canvas for painting on the given object.
float topology_rake_factor
int snake_hook_deform_type
float normal_radius_factor
float texture_sample_bias
float tilt_strength_factor
struct CurveMapping * curve_distance_falloff
int curve_distance_falloff_preset
struct CurveMapping * curve_size
struct CurveMapping * curve_strength
MeshRuntimeHandle * runtime
struct Object * mirror_ob
ObjectRuntimeHandle * runtime
struct SculptSession * sculpt
PaintRuntimeHandle * runtime
struct ViewRender * view_render
blender::Array< int > fake_neighbor_index
float current_max_distance
blender::float3 follow_co
blender::ed::sculpt_paint::StrokeCache * cache
std::optional< int > active_grid_index
blender::ed::sculpt_paint::filter::Cache * filter_cache
std::optional< int > active_face_index
KeyBlock * shapekey_active
blender::float3 cursor_normal
SculptVertexInfo vertex_info
blender::float3 cursor_view_normal
ActiveVert active_vert() const
blender::float3 cursor_location
blender::float3 active_vert_position(const Depsgraph &depsgraph, const Object &object) const
struct SculptSession::@300305335361021334214041350300054316061376210174 multires
std::unique_ptr< SculptTopologyIslandCache > topology_island_cache
std::optional< blender::float3 > cursor_sampled_normal
blender::Array< blender::float3x3, 0 > deform_imats
MultiresModifierData * modifier
SculptFakeNeighbors fake_neighbors
bool deform_modifiers_active
void set_active_vert(ActiveVert vert)
void clear_active_elements(bool persist_last_active)
blender::Array< uint8_t > vert_island_ids
blender::BitVector boundary
struct Object * gravity_object
int to_index(const CCGKey &key) const
SubdivCCGNeighborCoords coords
blender::Array< blender::float3 > normals
blender::BitGroupVector grid_hidden
blender::Array< float > masks
blender::Array< blender::float3 > positions
struct bNodeTree * nodetree
bNodeTreeRuntimeHandle * runtime
const c_style_mat & ptr() const
static MatBase identity()
VecBase< T, 3 > xyz() const
const ImplicitSharingInfo * sharing_info
const ImplicitSharingInfo * sharing_info
float initial_pixel_radius
blender::float2 anchored_initial_mouse
blender::float2 tex_mouse
blender::float3 average_stroke_accum
int average_stroke_counter
Span< int > grids() const
Span< int > verts() const
std::array< float3, 2 > area_cos
std::array< int, 2 > count_no
std::array< int, 2 > count_co
std::array< float3, 2 > area_nos
OffsetIndices< int > faces
Span< float3 > vert_positions
VArraySpan< bool > hide_poly
const SubdivCCG * subdiv_ccg
MeshAttributeData(const Mesh &mesh)
VArraySpan< bool > hide_poly
VArraySpan< int > face_sets
VArraySpan< bool > hide_vert
static NearestVertData join(const NearestVertData &a, const NearestVertData &b)
int active_face_grid_index
VArraySpan< bool > hide_poly
const SubdivCCG * subdiv_ccg
IsectRayPrecalc isect_precalc
OffsetIndices< int > faces
Span< float3 > vert_positions
Vector< float3 > positions
Vector< float > distances
static std::optional< ShapeKeyData > from_object(Object &object)
std::optional< math::Quaternion > rake_rotation
float3 initial_normal_symm
Array< float > layer_displacement_factor
struct blender::ed::sculpt_paint::StrokeCache::@216032235377206062040134367360200004271263147147 paint_brush
struct blender::ed::sculpt_paint::StrokeCache::@177302106234056170131152043023217207016132071266 clay_thumb_brush
float3 gravity_direction_symm
float4x4 brush_local_mat_inv
float3 sculpt_normal_symm
std::unique_ptr< auto_mask::Cache > automasking
struct blender::ed::sculpt_paint::StrokeCache::@341056124057116163146344066210332230262122242125 plane_brush
float dyntopo_pixel_radius
struct blender::ed::sculpt_paint::StrokeCache::@120056277040371114166010206352311170205127263324 mirror_modifier_clip
float3 initial_location_symm
float4x4 symm_rot_mat_inv
std::optional< math::Quaternion > rake_rotation_symm
float3 last_location_symm
char saved_mask_brush_tool
ePaintSymmetryFlags mirror_symmetry_pass
Array< float4 > mix_colors
std::unique_ptr< cloth::SimulationData > cloth_sim
std::array< float, 10 > pressure_stabilizer
std::optional< blender::float3 > initial_hsv_jitter
float3 orig_grab_location
bool initial_direction_flipped
Brush * saved_active_brush
void calc_cavity_factor(const Depsgraph &depsgraph, const Object &object, const IndexMask &node_mask)
std::optional< float3 > plane_normal
std::optional< float3 > plane_center
const AngleT & angle() const
const vec3_type & axis() const
wmOperatorStatus(* modal)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
struct ReportList * reports
struct wmOperatorType * type
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
bScreen * WM_window_get_active_screen(const wmWindow *win)