26inline namespace smooth_mask_cc {
41 constexpr int max_iterations = 4;
44 "The smooth brush expects a non-negative strength to behave properly");
45 const float clamped_strength = std::min(strength, 1.0f);
47 const int count =
int(clamped_strength * max_iterations);
48 const float last = max_iterations * (clamped_strength -
float(
count) / max_iterations);
64 tls.vert_neighbors.resize(
verts.size());
110 tls.new_masks.resize(
verts.size());
128 Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
130 const Span<int> corner_verts = mesh.corner_verts();
140 nodes, node_mask, node_vert_offset_data);
176 new_masks.
as_span().slice(node_vert_offsets[
pos]),
188 const float strength,
223 tls.masks.resize(positions.size());
227 tls.new_masks.resize(positions.size());
239 const int mask_offset,
241 const float strength,
275 tls.masks.resize(
verts.size());
279 tls.new_masks.resize(
verts.size());
301 switch (pbvh.
type()) {
int CustomData_get_offset_named(const CustomData *data, eCustomDataType type, blender::StringRef name)
const Brush * BKE_paint_brush_for_read(const Paint *paint)
const blender::Set< BMVert *, 0 > & BKE_pbvh_bmesh_node_unique_verts(blender::bke::pbvh::BMeshNode *node)
#define BLI_assert_msg(a, msg)
void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
Span< T > as_span() const
MutableSpan< T > as_mutable_span()
constexpr Span< T > as_span() const
void resize(const int64_t new_size)
void append_n_times(const T &value, const int64_t n)
GSpanAttributeWriter lookup_for_write_span(StringRef attribute_id)
Span< NodeT > nodes() const
void tag_masks_changed(const IndexMask &node_mask)
void foreach_index(Fn &&fn) const
const Depsgraph * depsgraph
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
pbvh::Tree * pbvh_get(Object &object)
void update_mask_bmesh(const BMesh &bm, const IndexMask &node_mask, Tree &pbvh)
void update_mask_mesh(const Mesh &mesh, const IndexMask &node_mask, Tree &pbvh)
Span< float3 > vert_normals_eval(const Depsgraph &depsgraph, const Object &object_orig)
void update_mask_grids(const SubdivCCG &subdiv_ccg, const IndexMask &node_mask, Tree &pbvh)
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)
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 void calc_bmesh(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const Brush &brush, const float3 &direction, const float strength, bke::pbvh::BMeshNode &node, LocalData &tls)
void ensure_boundary_info(Object &object)
static void calc_grids(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const Brush &brush, const float4 &test_plane, const float strength, bke::pbvh::GridsNode &node, LocalData &tls)
void scatter_mask_grids(const Span< float > mask, SubdivCCG &subdiv_ccg, const Span< int > grids)
void mix_new_masks(const Span< float > new_masks, const Span< float > factors, const MutableSpan< float > masks)
void scatter_mask_bmesh(const Span< float > mask, const BMesh &bm, const Set< BMVert *, 0 > &verts)
void gather_mask_bmesh(const BMesh &bm, const Set< BMVert *, 0 > &verts, const MutableSpan< float > r_mask)
void gather_mask_grids(const SubdivCCG &subdiv_ccg, const Span< int > grids, const MutableSpan< float > r_mask)
void clamp_mask(const MutableSpan< float > masks)
void average_neighbor_mask_bmesh(const int mask_offset, const Set< BMVert *, 0 > &verts, const MutableSpan< float > new_masks)
static std::array< float, 4 > iteration_strengths(const float strength, const int stroke_iteration)
static BLI_NOINLINE void do_smooth_brush_mesh(const Depsgraph &depsgraph, const Sculpt &sd, const Brush &brush, Object &object, const IndexMask &node_mask, const float brush_strength)
static void calc_grids(const Depsgraph &depsgraph, Object &object, const Brush &brush, const float strength, const bke::pbvh::GridsNode &node, LocalData &tls)
static void calc_smooth_masks_faces(const OffsetIndices< int > faces, const Span< int > corner_verts, const GroupedSpan< int > vert_to_face_map, const Span< bool > hide_poly, const Span< int > verts, const Span< float > masks, LocalData &tls, const MutableSpan< float > new_masks)
static void calc_bmesh(const Depsgraph &depsgraph, Object &object, const int mask_offset, const Brush &brush, const float strength, bke::pbvh::BMeshNode &node, LocalData &tls)
static Vector< float > iteration_strengths(const float strength)
static void apply_masks_faces(const Depsgraph &depsgraph, const Brush &brush, const Span< float3 > positions_eval, const Span< float3 > vert_normals, const Span< bool > hide_vert, const bke::pbvh::MeshNode &node, const float strength, Object &object, LocalData &tls, const Span< float > mask_averages, MutableSpan< float > mask)
static void do_smooth_brush_mesh(const Depsgraph &depsgraph, const Brush &brush, Object &object, const IndexMask &node_mask, const float brush_strength)
void neighbor_data_average_mesh(const Span< T > src, const Span< Vector< int > > vert_neighbors, const MutableSpan< T > dst)
void average_data_grids(const SubdivCCG &subdiv_ccg, const Span< T > src, const Span< int > grids, const MutableSpan< T > dst)
MutableSpan< float3 > gather_grids_positions(const SubdivCCG &subdiv_ccg, const Span< int > grids, Vector< float3 > &positions)
void gather_bmesh_positions(const Set< BMVert *, 0 > &verts, MutableSpan< float3 > positions)
void calc_brush_strength_factors(const StrokeCache &cache, const Brush &brush, Span< float > distances, MutableSpan< float > factors)
void apply_hardness_to_distances(float radius, float hardness, MutableSpan< float > distances)
void filter_distances_with_radius(float radius, Span< float > distances, MutableSpan< float > factors)
void filter_region_clip_factors(const SculptSession &ss, Span< float3 > vert_positions, Span< int > verts, MutableSpan< float > factors)
void calc_brush_distances(const SculptSession &ss, Span< float3 > vert_positions, Span< int > vert_indices, eBrushFalloffShape falloff_shape, MutableSpan< float > r_distances)
void scale_factors(MutableSpan< float > factors, float strength)
void scatter_data_mesh(Span< T > src, Span< int > indices, MutableSpan< T > dst)
void do_smooth_mask_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask, float brush_strength)
void gather_data_mesh(Span< T > src, Span< int > indices, MutableSpan< T > dst)
void calc_vert_neighbors(OffsetIndices< int > faces, Span< int > corner_verts, GroupedSpan< int > vert_to_face, Span< bool > hide_poly, Span< int > verts, MutableSpan< Vector< int > > result)
void calc_front_face(const float3 &view_normal, Span< float3 > normals, MutableSpan< float > factors)
OffsetIndices< int > create_node_vert_offsets(const Span< bke::pbvh::MeshNode > nodes, const IndexMask &nodes_mask, Array< int > &node_data)
void calc_brush_texture_factors(const SculptSession &ss, const Brush &brush, Span< float3 > vert_positions, Span< int > vert_indices, MutableSpan< float > factors)
void fill_factor_from_hide(Span< bool > hide_vert, Span< int > verts, MutableSpan< float > r_factors)
static float brush_strength(const Sculpt &sd, const blender::ed::sculpt_paint::StrokeCache &cache, const float feather, const UnifiedPaintSettings &ups, const PaintModeSettings &)
blender::ed::sculpt_paint::StrokeCache * cache
blender::Array< float > masks
Vector< float > distances
Vector< float3 > positions
std::unique_ptr< auto_mask::Cache > automasking
Vector< Vector< int > > vert_neighbors
Vector< float > distances
Vector< float3 > positions
Vector< float > new_masks