139 if (angle > limit_lower && angle < limit_upper) {
140 float t = 1.0f - (angle - limit_lower) / (limit_upper - limit_lower);
143 t = t * t * (3.0 - 2.0 * t);
147 if (angle > limit_upper) {
198 if (automasking_flags &
253 const float3 &vert_position)
265 float sign =
signf(factor);
269 factor = factor * sign * 0.5f + 0.5f;
270 CLAMP(factor, 0.0f, 1.0f);
278 float distance = 0.0f;
284 const Cache &automasking,
289 struct CavityBlurVert {
294 const Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
297 const Span<int> corner_verts = mesh.corner_verts();
311 const int num_steps =
steps + 1;
313 std::queue<CavityBlurVert> queue;
316 const CavityBlurVert initial{vert, 0};
320 const float3 starting_position = positions_eval[vert];
323 while (!queue.empty()) {
324 const CavityBlurVert blurvert = queue.front();
327 const int current_vert = blurvert.vertex;
329 const float3 &blur_vert_position = positions_eval[current_vert];
330 const float3 &blur_vert_normal = normals_eval[current_vert];
332 const float dist_to_start =
math::distance(blur_vert_position, starting_position);
334 all_verts.
position += blur_vert_position;
335 all_verts.
distance += dist_to_start;
338 if (blurvert.depth < num_steps) {
339 verts_in_range.
position += blur_vert_position;
340 verts_in_range.
normal += blur_vert_normal;
341 verts_in_range.
count++;
346 if (blurvert.depth >= num_steps) {
351 faces, corner_verts, vert_to_face_map, hide_poly, current_vert, neighbors))
353 if (visited_verts.
contains(neighbor)) {
357 visited_verts.
add_new(neighbor);
358 queue.push({neighbor, blurvert.depth + 1});
364 if (all_verts.
count == 0) {
365 all_verts.
position = positions_eval[vert];
372 if (verts_in_range.
count == 0) {
373 verts_in_range.
position = positions_eval[vert];
381 verts_in_range.
normal = normals_eval[vert];
390 const Cache &automasking,
395 struct CavityBlurVert {
411 const int num_steps =
steps + 1;
413 std::queue<CavityBlurVert> queue;
416 const CavityBlurVert initial{vert.
to_index(key), 0};
417 visited_verts.
add_new(initial.vert);
423 while (!queue.empty()) {
424 const CavityBlurVert blurvert = queue.front();
427 const int current_vert = blurvert.vert;
429 const float3 &blur_vert_position = positions[current_vert];
430 const float3 &blur_vert_normal = normals[current_vert];
432 const float dist_to_start =
math::distance(blur_vert_position, starting_position);
434 all_verts.
position += blur_vert_position;
435 all_verts.
distance += dist_to_start;
438 if (blurvert.depth < num_steps) {
439 verts_in_range.
position += blur_vert_position;
440 verts_in_range.
normal += blur_vert_normal;
441 verts_in_range.
count++;
446 if (blurvert.depth >= num_steps) {
453 const int neighbor_idx = neighbor.to_index(key);
454 if (visited_verts.
contains(neighbor_idx)) {
458 visited_verts.
add_new(neighbor_idx);
459 queue.push({neighbor_idx, blurvert.depth + 1});
465 if (all_verts.
count == 0) {
473 if (verts_in_range.
count == 0) {
495 struct CavityBlurVert {
506 const int num_steps =
steps + 1;
508 std::queue<CavityBlurVert> queue;
512 visited_verts.
add_new(initial.index);
515 const float3 starting_position = vert->
co;
518 while (!queue.empty()) {
519 const CavityBlurVert blurvert = queue.front();
522 BMVert *current_vert = blurvert.vertex;
524 const float3 blur_vert_position = current_vert->
co;
525 const float3 blur_vert_normal = current_vert->
no;
527 const float dist_to_start =
math::distance(blur_vert_position, starting_position);
529 all_verts.
position += blur_vert_position;
530 all_verts.
distance += dist_to_start;
533 if (blurvert.depth < num_steps) {
534 verts_in_range.
position += blur_vert_position;
535 verts_in_range.
normal += blur_vert_normal;
536 verts_in_range.
count++;
541 if (blurvert.depth >= num_steps) {
547 if (visited_verts.
contains(neighbor_idx)) {
551 visited_verts.
add_new(neighbor_idx);
552 queue.push({neighbor, neighbor_idx, blurvert.depth + 1});
558 if (all_verts.
count == 0) {
566 if (verts_in_range.
count == 0) {
590 factor = inverted ? 1.0f - factor : factor;
592 factor = inverted ? 1.0f - factor : factor;
599 const Cache &automasking,
615 const Cache &automasking,
642 const Cache &automasking,
648 const Mesh &mesh = *
static_cast<const Mesh *
>(
object.data);
661 orig_normals = orig_data->normals;
665 for (
const int i :
verts.index_range()) {
666 const int vert =
verts[i];
667 const float3 &normal = orig_normals.is_empty() ? vert_normals[vert] : orig_normals[i];
681 float cached_factor = automasking.
factor[vert];
687 factors[i] *= cached_factor;
696 depsgraph,
const_cast<Cache &
>(automasking),
object, vert, vert_positions[vert]);
755 const Cache &automasking,
761 const Mesh &mesh = *
static_cast<const Mesh *
>(
object.data);
770 const Span<int> face_verts = corner_verts.
slice(faces[face_indices[i]]);
772 for (
const int vert : face_verts) {
788 float cached_factor = automasking.
factor[vert];
794 factor *= cached_factor;
803 depsgraph,
const_cast<Cache &
>(automasking),
object, vert, vert_positions[vert]);
862 const Cache &automasking,
868 const Mesh &base_mesh = *
static_cast<const Mesh *
>(
object.data);
870 const Span<int> corner_verts = base_mesh.corner_verts();
884 orig_normals = orig_data->normals;
889 const int grid_face_set = face_sets.
is_empty() ?
891 face_sets[subdiv_ccg.grid_to_face_map[grids[i]]];
892 const int node_start = i * key.
grid_area;
893 const int grids_start = grids[i] * key.
grid_area;
895 const int node_vert = node_start + offset;
896 const int vert = grids_start + offset;
897 const float3 &normal = orig_normals.
is_empty() ? subdiv_ccg.normals[vert] :
898 orig_normals[node_vert];
912 float cached_factor = automasking.
factor[vert];
918 factors[node_vert] *= cached_factor;
927 depsgraph,
const_cast<Cache &
>(automasking),
object, vert, subdiv_ccg.positions[vert]);
929 factors[node_vert] = 0.0f;
938 factors[node_vert] = 0.0f;
944 factors[node_vert] = 0.0f;
953 factors[node_vert] = 0.0f;
970 factors[node_vert] = 0.0f;
990 const Cache &automasking,
1025 float cached_factor = automasking.
factor[vert_i];
1031 factors[i] *= cached_factor;
1040 depsgraph,
const_cast<Cache &
>(automasking),
object, vert_i, vert->co);
1103 const Mesh &mesh = *
static_cast<const Mesh *
>(ob.
data);
1106 const float radius = ss.
cache ? ss.
cache->
radius : std::numeric_limits<float>::max();
1107 const int active_vert = std::get<int>(ss.
active_vert());
1115 float3 location = vert_positions[active_vert];
1118 flood.
execute(ob, vert_to_face_map, [&](
int from_v,
int to_v) {
1119 factors[from_v] = 1.0f;
1120 factors[to_v] = 1.0f;
1122 vert_positions[to_v], location, radius, symm);
1126 flood.
execute(ob, vert_to_face_map, [&](
int from_v,
int to_v) {
1127 factors[from_v] = 1.0f;
1128 factors[to_v] = 1.0f;
1143 const float radius = ss.
cache ? ss.
cache->
radius : std::numeric_limits<float>::max();
1156 float3 location = positions[active_vert];
1161 factors[from_v.
to_index(key)] = 1.0f;
1162 factors[to_v.
to_index(key)] = 1.0f;
1164 positions[to_v.
to_index(key)], location, radius, symm);
1170 factors[from_v.
to_index(key)] = 1.0f;
1171 factors[to_v.
to_index(key)] = 1.0f;
1185 const float radius = ss.
cache ? ss.
cache->
radius : std::numeric_limits<float>::max();
1247 const Mesh &mesh = *
static_cast<const Mesh *
>(ob.
data);
1250 const VArraySpan face_sets = *attributes.lookup<
int>(
".sculpt_face_set",
1256 for (const int vert : range) {
1257 if (!face_set::vert_has_face_set(vert_to_face_map, face_sets, vert, active_face_set)) {
1258 factors[vert] = 0.0f;
1265 const Mesh &base_mesh = *
static_cast<const Mesh *
>(ob.
data);
1268 const VArraySpan face_sets = *attributes.lookup<
int>(
".sculpt_face_set",
1275 const int grid_area = subdiv_ccg.
grid_area;
1277 for (const int face : range) {
1278 if (face_sets[face] != active_face_set) {
1279 factors.slice(bke::ccg::face_range(faces, grid_area, face)).fill(0.0f);
1291 if (face_set_offset == -1) {
1295 for (const int i : range) {
1296 const BMVert *vert = BM_vert_at_index(&const_cast<BMesh &>(bm), i);
1297 if (!face_set::vert_has_face_set(face_set_offset, *vert, active_face_set)) {
1317 const int propagation_steps,
1321 Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
1324 const Span<int> corner_verts = mesh.corner_verts();
1327 const VArraySpan hide_poly = *attributes.lookup<
bool>(
".hide_poly", bke::AttrDomain::Face);
1328 const VArraySpan face_sets = *attributes.lookup<
int>(
".sculpt_face_set", bke::AttrDomain::Face);
1330 const int num_verts = bke::pbvh::vert_positions_eval(
depsgraph,
object).
size();
1335 case BoundaryAutomaskMode::Edges:
1336 if (boundary::vert_is_boundary(vert_to_face_map, hide_poly, ss.
vertex_info.
boundary, i)) {
1337 edge_distance[i] = 0;
1340 case BoundaryAutomaskMode::FaceSets:
1341 if (!face_set::vert_has_unique_face_set(vert_to_face_map, face_sets, i)) {
1342 edge_distance[i] = 0;
1349 for (
const int propagation_it :
IndexRange(propagation_steps)) {
1355 for (
const int neighbor :
1358 if (edge_distance[neighbor] == propagation_it) {
1359 edge_distance[i] = propagation_it + 1;
1370 const float p = 1.0f - (
float(edge_distance[i]) /
float(propagation_steps));
1371 const float edge_boundary_automask =
pow2f(p);
1373 factors[i] *= (1.0f - edge_boundary_automask);
1379 const int propagation_steps,
1384 Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
1390 const Span<int> corner_verts = mesh.corner_verts();
1393 const VArraySpan face_sets = *attributes.lookup<
int>(
".sculpt_face_set", bke::AttrDomain::Face);
1396 for (
const int i : positions.index_range()) {
1399 case BoundaryAutomaskMode::Edges:
1400 if (boundary::vert_is_boundary(
1403 edge_distance[i] = 0;
1406 case BoundaryAutomaskMode::FaceSets:
1407 if (!face_set::vert_has_unique_face_set(
1408 faces, corner_verts, vert_to_face_map, face_sets, subdiv_ccg, coord))
1410 edge_distance[i] = 0;
1417 for (
const int propagation_it :
IndexRange(propagation_steps)) {
1418 for (
const int i : positions.index_range()) {
1427 const int neighbor_idx = neighbor.to_index(key);
1428 if (edge_distance[neighbor_idx] == propagation_it) {
1429 edge_distance[i] = propagation_it + 1;
1435 for (
const int i : positions.index_range()) {
1440 const float p = 1.0f - (
float(edge_distance[i]) /
float(propagation_steps));
1441 const float edge_boundary_automask =
pow2f(p);
1443 factors[i] *= (1.0f - edge_boundary_automask);
1449 const int propagation_steps,
1463 case BoundaryAutomaskMode::Edges:
1464 if (boundary::vert_is_boundary(vert)) {
1465 edge_distance[i] = 0;
1468 case BoundaryAutomaskMode::FaceSets:
1469 if (!face_set::vert_has_unique_face_set(face_set_offset, *vert)) {
1470 edge_distance[i] = 0;
1476 for (
const int propagation_it :
IndexRange(propagation_steps)) {
1486 if (edge_distance[neighbor_idx] == propagation_it) {
1487 edge_distance[i] = propagation_it + 1;
1498 const float p = 1.0f - (
float(edge_distance[i]) /
float(propagation_steps));
1499 const float edge_boundary_automask =
pow2f(p);
1501 factors[i] *= (1.0f - edge_boundary_automask);
1508 const int propagation_steps,
1511 switch (bke::object::pbvh_get(
object)->type()) {
1512 case bke::pbvh::Type::Mesh:
1515 case bke::pbvh::Type::Grids:
1518 case bke::pbvh::Type::BMesh:
1571 switch (bke::object::pbvh_get(ob)->type()) {
1572 case bke::pbvh::Type::Mesh: {
1576 for (
const int vert :
range) {
1577 float f = factors[vert];
1582 depsgraph, automasking, ob, vert, vert_positions[vert]);
1593 case bke::pbvh::Type::Grids: {
1597 for (
const int vert :
range) {
1598 float f = factors[vert];
1614 case bke::pbvh::Type::BMesh: {
1618 for (const int i : range) {
1619 const BMVert *vert = BM_vert_at_index(&bm, i);
1620 float f = factors[i];
1622 if (int(mode) & BRUSH_AUTOMASKING_VIEW_NORMAL) {
1623 if (int(mode) & BRUSH_AUTOMASKING_VIEW_OCCLUSION) {
1624 f *= calc_view_occlusion_factor(depsgraph, automasking, ob, i, vert->co);
1627 f *= calc_view_normal_factor(automasking, ob, vert->no);
1640 return ELEM(sculpt_brush_type,
1663 std::unique_ptr<Cache> automasking = std::make_unique<Cache>();
1665 boundary::ensure_boundary_info(ob);
1671 islands::ensure_cache(ob);
1672 automasking->settings.initial_island_nr = islands::vert_id_get(ss, ss.
active_vert_index());
1679 Cache::OcclusionValue::Unknown);
1690 automasking->cavity_factor =
Array<float>(verts_num, -1.0f);
1702 automasking->factor =
Array<float>(verts_num, initial_value);
int CustomData_get_offset_named(const CustomData *data, eCustomDataType type, blender::StringRef name)
#define SCULPT_FACE_SET_NONE
const Brush * BKE_paint_brush_for_read(const Paint *paint)
A BVH for high poly meshes.
CCGKey BKE_subdiv_ccg_key_top_level(const SubdivCCG &subdiv_ccg)
void BKE_subdiv_ccg_neighbor_coords_get(const SubdivCCG &subdiv_ccg, const SubdivCCGCoord &coord, bool include_duplicates, SubdivCCGNeighbors &r_neighbors)
MINLINE float pow2f(float x)
MINLINE float signf(float f)
#define BLI_SCOPED_DEFER(function_to_defer)
@ BRUSH_AUTOMASKING_BRUSH_NORMAL
@ BRUSH_AUTOMASKING_CAVITY_NORMAL
@ BRUSH_AUTOMASKING_VIEW_OCCLUSION
@ BRUSH_AUTOMASKING_BOUNDARY_EDGES
@ BRUSH_AUTOMASKING_CAVITY_USE_CURVE
@ BRUSH_AUTOMASKING_BOUNDARY_FACE_SETS
@ BRUSH_AUTOMASKING_FACE_SETS
@ BRUSH_AUTOMASKING_VIEW_NORMAL
@ BRUSH_AUTOMASKING_TOPOLOGY
@ BRUSH_AUTOMASKING_CAVITY_ALL
@ BRUSH_AUTOMASKING_CAVITY_INVERTED
@ SCULPT_BRUSH_TYPE_THUMB
@ SCULPT_BRUSH_TYPE_DRAW_FACE_SETS
@ SCULPT_BRUSH_TYPE_SMEAR
@ SCULPT_BRUSH_TYPE_PAINT
@ SCULPT_BRUSH_TYPE_ROTATE
@ PAINT_FALLOFF_SHAPE_TUBE
Read Guarded memory(de)allocation.
#define BM_elem_index_get(ele)
ATTR_WARN_UNUSED_RESULT BMesh * bm
int BM_mesh_elem_count(BMesh *bm, const char htype)
BLI_INLINE BMVert * BM_vert_at_index(BMesh *bm, const int index)
static T sum(const btAlignedObjectArray< T > &items)
bool contains(const Key &key) const
void add_new(const Key &key)
constexpr Span slice(int64_t start, int64_t size) const
constexpr int64_t size() const
constexpr IndexRange index_range() const
constexpr bool is_empty() const
const Depsgraph * depsgraph
draw_view in_light_buf[] float
pbvh::Tree * pbvh_get(Object &object)
Span< float3 > vert_normals_eval(const Depsgraph &depsgraph, const Object &object_orig)
Span< float3 > vert_positions_eval(const Depsgraph &depsgraph, const Object &object_orig)
void calc_grids_factors(const Depsgraph &depsgraph, const Object &object, const Cache &cache, const bke::pbvh::GridsNode &node, Span< int > grids, MutableSpan< float > factors)
static void calc_blurred_cavity_mesh(const Depsgraph &depsgraph, const Object &object, const Cache &automasking, const int steps, const int vert, MutableSpan< float > cavity_factors)
static int calc_effective_bits(const Sculpt &sd, const Brush *brush)
static float calc_brush_normal_factor(const Cache &automasking, const Object &object, const float3 &normal)
static float normal_calc(const float3 &compare_normal, const float3 &normal, float limit_lower, float limit_upper)
bool needs_normal(const SculptSession &ss, const Sculpt &sd, const Brush *brush)
std::unique_ptr< Cache > cache_init(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob)
static bool calc_view_occlusion_factor(const Depsgraph &depsgraph, Cache &automasking, const Object &object, const int vert, const float3 &vert_position)
static void init_face_sets_masking(const Sculpt &sd, Object &ob, MutableSpan< float > factors)
static void init_boundary_masking(Object &object, const Depsgraph &depsgraph, const BoundaryAutomaskMode mode, const int propagation_steps, MutableSpan< float > factors)
bool brush_type_can_reuse_automask(int sculpt_brush_type)
const Cache * active_cache_get(const SculptSession &ss)
static float calc_view_normal_factor(const Cache &automasking, const Object &object, const float3 &normal)
static void fill_topology_automasking_factors_grids(const Sculpt &sd, Object &ob, const SubdivCCG &subdiv_ccg, MutableSpan< float > factors)
static void init_boundary_masking_bmesh(Object &object, const BoundaryAutomaskMode mode, const int propagation_steps, MutableSpan< float > factors)
static float calc_cavity_factor_bmesh(const Cache &automasking, BMVert *vert, const int vert_i)
static bool needs_factors_cache(const Sculpt &sd, const Brush *brush)
static void normal_occlusion_automasking_fill(const Depsgraph &depsgraph, Cache &automasking, Object &ob, eAutomasking_flag mode, MutableSpan< float > factors)
static void calc_blurred_cavity_grids(const Object &object, const Cache &automasking, const int steps, const SubdivCCGCoord vert, MutableSpan< float > cavity_factors)
static void fill_topology_automasking_factors_mesh(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob, const Span< float3 > vert_positions, MutableSpan< float > factors)
static void init_boundary_masking_mesh(Object &object, const Depsgraph &depsgraph, const BoundaryAutomaskMode mode, const int propagation_steps, MutableSpan< float > factors)
static float calc_cavity_factor_grids(const CCGKey &key, const Cache &automasking, const Object &object, const int vert)
void calc_face_factors(const Depsgraph &depsgraph, const Object &object, OffsetIndices< int > faces, Span< int > corner_verts, const Cache &cache, const bke::pbvh::MeshNode &node, Span< int > face_indices, MutableSpan< float > factors)
static void fill_topology_automasking_factors_bmesh(const Sculpt &sd, Object &ob, BMesh &bm, MutableSpan< float > factors)
static void cache_settings_update(Cache &automasking, Object &object, const Sculpt &sd, const Brush *brush)
static constexpr int EDGE_DISTANCE_INF
static void init_boundary_masking_grids(Object &object, const BoundaryAutomaskMode mode, const int propagation_steps, MutableSpan< float > factors)
static float calc_cavity_factor_mesh(const Depsgraph &depsgraph, const Cache &automasking, const Object &object, const int vert)
static void calc_blurred_cavity_bmesh(const Cache &automasking, const int steps, BMVert *vert, MutableSpan< float > cavity_factors)
bool is_enabled(const Sculpt &sd, const Object &object, const Brush *br)
static void fill_topology_automasking_factors(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob, MutableSpan< float > factors)
static int boundary_propagation_steps(const Sculpt &sd, const Brush *brush)
static float calc_cavity_factor(const Cache &automasking, float factor)
static bool is_constrained_by_radius(const Brush *br)
bool mode_enabled(const Sculpt &sd, const Brush *br, eAutomasking_flag mode)
void calc_vert_factors(const Depsgraph &depsgraph, const Object &object, const Cache &cache, const bke::pbvh::MeshNode &node, Span< int > verts, MutableSpan< float > factors)
static float process_cavity_factor(const Cache &automasking, float factor)
bool vert_is_boundary(const GroupedSpan< int > vert_to_face_map, const Span< bool > hide_poly, const BitSpan boundary, const int vert)
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)
int active_face_set_get(const Object &object)
int vert_id_get(const SculptSession &ss, const int vert)
Vector< int > find_symm_verts_grids(const Object &object, const int original_vert, const float max_distance)
std::optional< OrigPositionData > orig_position_data_lookup_grids(const Object &object, const bke::pbvh::GridsNode &node)
void orig_position_data_gather_bmesh(const BMLog &bm_log, const Set< BMVert *, 0 > &verts, MutableSpan< float3 > positions, MutableSpan< float3 > normals)
Vector< int > find_symm_verts_mesh(const Depsgraph &depsgraph, const Object &object, const int original_vert, const float max_distance)
Span< BMVert * > vert_neighbors_get_bmesh(BMVert &vert, Vector< BMVert *, 64 > &r_neighbors)
std::optional< OrigPositionData > orig_position_data_lookup_mesh(const Object &object, const bke::pbvh::MeshNode &node)
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)
Vector< int > find_symm_verts_bmesh(const Object &object, const int original_vert, const float max_distance)
T distance(const T &a, const T &b)
T dot(const QuaternionBase< T > &a, const QuaternionBase< T > &b)
MatBase< T, NumCol, NumRow > normalize(const MatBase< T, NumCol, NumRow > &a)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
VecBase< float, 3 > float3
ePaintSymmetryFlags SCULPT_mesh_symmetry_xyz_get(const Object &object)
void SCULPT_vertex_random_access_ensure(Object &object)
bool SCULPT_vertex_is_occluded(const Depsgraph &depsgraph, const Object &object, const float3 &position, bool original)
int SCULPT_vertex_count_get(const Object &object)
bool SCULPT_is_vertex_inside_brush_radius_symm(const float vertex[3], const float br_co[3], float radius, char symm)
float automasking_cavity_factor
float automasking_view_normal_limit
int automasking_cavity_blur_steps
int automasking_boundary_edges_propagation_steps
struct CurveMapping * automasking_cavity_curve
float automasking_start_normal_limit
float automasking_start_normal_falloff
float automasking_view_normal_falloff
struct SculptSession * sculpt
blender::ed::sculpt_paint::StrokeCache * cache
blender::ed::sculpt_paint::filter::Cache * filter_cache
SculptVertexInfo vertex_info
ActiveVert active_vert() const
int active_vert_index() const
blender::BitVector boundary
float automasking_start_normal_falloff
int automasking_boundary_edges_propagation_steps
float automasking_view_normal_limit
float automasking_cavity_factor
int automasking_cavity_blur_steps
float automasking_start_normal_limit
struct CurveMapping * automasking_cavity_curve
float automasking_view_normal_falloff
int to_index(const CCGKey &key) const
static SubdivCCGCoord from_index(const CCGKey &key, int index)
blender::Vector< SubdivCCGCoord, 256 > coords
blender::Array< blender::float3 > normals
blender::Array< blender::float3 > positions
float3 initial_normal_symm
std::unique_ptr< auto_mask::Cache > automasking
Array< OcclusionValue > occlusion
Array< float > cavity_factor
float start_normal_falloff
CurveMapping * cavity_curve
float view_normal_falloff
bool topology_use_brush_limit
std::unique_ptr< auto_mask::Cache > automasking
void add_initial(BMVert *vertex)
void execute(Object &object, FunctionRef< bool(BMVert *from_v, BMVert *to_v)> func)
void execute(Object &object, const SubdivCCG &subdiv_ccg, FunctionRef< bool(SubdivCCGCoord from_v, SubdivCCGCoord to_v, bool is_duplicate)> func)
void add_initial(SubdivCCGCoord vertex)
void execute(Object &object, GroupedSpan< int > vert_to_face_map, FunctionRef< bool(int from_v, int to_v)> func)
void add_initial(int vertex)