30inline namespace surface_smooth_cc {
44 for (
float &factor : factors) {
45 factor = std::clamp(factor, 0.0f, 1.0f);
63 Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
65 const Span<int> corner_verts = mesh.corner_verts();
113 tls.vert_neighbors.resize(
verts.size());
121 tls.average_positions.resize(
verts.size());
124 position_data.
eval, tls.vert_neighbors, average_positions);
126 tls.laplacian_disp.resize(
verts.size());
131 positions, orig_data.
positions, average_positions, alpha, laplacian_disp, translations);
146 all_laplacian_disp.
as_span(),
verts, tls.laplacian_disp);
148 tls.vert_neighbors.resize(
verts.size());
156 tls.average_positions.resize(
verts.size());
159 all_laplacian_disp.
as_span(), tls.vert_neighbors, average_laplacian_disps);
164 laplacian_disp, average_laplacian_disps,
beta, translations);
198 const Span<int> grids = nodes[i].grids();
227 const Span<int> grids = nodes[i].grids();
232 tls.average_positions.resize(positions.size());
235 subdiv_ccg, subdiv_ccg.positions.as_span(), grids, average_positions);
237 tls.laplacian_disp.resize(positions.size());
242 positions, orig_data.
positions, average_positions, alpha, laplacian_disp, translations);
253 const Span<int> grids = nodes[i].grids();
258 subdiv_ccg, all_laplacian_disp.
as_span(), grids, tls.laplacian_disp);
260 tls.average_positions.resize(positions.size());
263 subdiv_ccg, all_laplacian_disp.
as_span(), grids, average_laplacian_disps);
268 laplacian_disp, average_laplacian_disps,
beta, translations);
294 nodes, node_mask, node_offset_data);
336 tls.average_positions.resize(positions.size());
340 tls.laplacian_disp.resize(positions.size());
345 positions, orig_positions, average_positions, alpha, laplacian_disp, translations);
361 all_laplacian_disp.
as_span(),
verts, tls.laplacian_disp);
363 tls.average_positions.resize(positions.size());
370 laplacian_disp, average_laplacian_disps,
beta, translations);
390 switch (pbvh.
type()) {
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)
CCGKey BKE_subdiv_ccg_key_top_level(const SubdivCCG &subdiv_ccg)
Object is a sort of wrapper for general info.
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 tag_positions_changed(const IndexMask &node_mask)
Span< NodeT > nodes() const
void foreach_index(Fn &&fn) const
const Depsgraph * depsgraph
pbvh::Tree * pbvh_get(Object &object)
void update_bounds(const Depsgraph &depsgraph, const Object &object, Tree &pbvh)
Span< float3 > vert_normals_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 BLI_NOINLINE void fill_factor_from_hide_and_mask(const Mesh &mesh, const Span< int > face_indices, const MutableSpan< float > r_factors)
void average_data_bmesh(const Span< T > src, const Set< BMVert *, 0 > &verts, const MutableSpan< T > dst)
void surface_smooth_laplacian_step(const Span< float3 > positions, const Span< float3 > orig_positions, const Span< float3 > average_positions, const float alpha, MutableSpan< float3 > laplacian_disp, MutableSpan< float3 > translations)
void surface_smooth_displace_step(const Span< float3 > laplacian_disp, const Span< float3 > average_laplacian_disp, const float beta, const MutableSpan< float3 > translations)
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)
void neighbor_position_average_bmesh(const Set< BMVert *, 0 > &verts, const MutableSpan< float3 > new_positions)
static BLI_NOINLINE void do_surface_smooth_brush_bmesh(const Depsgraph &depsgraph, const Sculpt &sd, const Brush &brush, const IndexMask &node_mask, Object &object, const MutableSpan< float3 > all_laplacian_disp)
static BLI_NOINLINE void do_surface_smooth_brush_grids(const Depsgraph &depsgraph, const Sculpt &sd, const Brush &brush, const IndexMask &node_mask, Object &object, const MutableSpan< float3 > all_laplacian_disp)
static BLI_NOINLINE void clamp_factors(const MutableSpan< float > factors)
static BLI_NOINLINE void do_surface_smooth_brush_mesh(const Depsgraph &depsgraph, const Sculpt &sd, const Brush &brush, const IndexMask &node_mask, Object &object, const MutableSpan< float3 > all_laplacian_disp)
MutableSpan< float3 > gather_grids_positions(const SubdivCCG &subdiv_ccg, const Span< int > grids, Vector< float3 > &positions)
void scatter_data_bmesh(Span< T > node_data, const Set< BMVert *, 0 > &verts, MutableSpan< T > dst)
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 gather_data_grids(const SubdivCCG &subdiv_ccg, Span< T > src, Span< int > grids, MutableSpan< T > node_data)
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 do_surface_smooth_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
OffsetIndices< int > create_node_vert_offsets_bmesh(const Span< bke::pbvh::BMeshNode > nodes, const IndexMask &nodes_mask, Array< int > &node_data)
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)
void calc_brush_distances(const SculptSession &ss, Span< float3 > vert_positions, Span< int > vert_indices, eBrushFalloffShape falloff_shape, MutableSpan< float > r_distances)
void orig_position_data_gather_bmesh(const BMLog &bm_log, const Set< BMVert *, 0 > &verts, MutableSpan< float3 > positions, MutableSpan< float3 > normals)
void scale_translations(MutableSpan< float3 > translations, Span< float > factors)
void scale_factors(MutableSpan< float > factors, float strength)
void clip_and_lock_translations(const Sculpt &sd, const SculptSession &ss, Span< float3 > positions, Span< int > verts, MutableSpan< float3 > translations)
void scatter_data_mesh(Span< T > src, Span< int > indices, MutableSpan< T > dst)
void apply_translations(Span< float3 > translations, Span< int > verts, MutableSpan< float3 > positions)
OrigPositionData orig_position_data_get_mesh(const Object &object, const bke::pbvh::MeshNode &node)
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)
OrigPositionData orig_position_data_get_grids(const Object &object, const bke::pbvh::GridsNode &node)
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 scatter_data_grids(const SubdivCCG &subdiv_ccg, Span< T > node_data, Span< int > grids, MutableSpan< T > dst)
int surface_smooth_iterations
float surface_smooth_current_vertex
float surface_smooth_shape_preservation
blender::ed::sculpt_paint::StrokeCache * cache
Vector< float > distances
Vector< float3 > translations
Vector< float3 > positions
VArraySpan< bool > hide_poly
VArraySpan< bool > hide_vert
std::unique_ptr< auto_mask::Cache > automasking
Array< float3 > surface_smooth_laplacian_disp
Vector< float3 > positions
Vector< float > distances
Vector< float3 > translations
Vector< float3 > laplacian_disp
Vector< float3 > average_positions
Vector< Vector< int > > vert_neighbors
ccl_device_inline float beta(float x, float y)