Blender V4.3
mesh_brush_common.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
7#include "BLI_array.hh"
8#include "BLI_bit_span.hh"
11#include "BLI_offset_indices.hh"
12#include "BLI_set.hh"
13#include "BLI_span.hh"
14#include "BLI_vector.hh"
15
16#include "BKE_subdiv_ccg.hh"
17
18#include "DNA_brush_enums.h"
19
20#include "sculpt_intern.hh"
21
37struct BMesh;
38struct BMVert;
39struct BMFace;
40struct Brush;
41struct Mesh;
42struct Object;
43struct Sculpt;
44struct SculptSession;
45struct SubdivCCG;
46struct SubdivCCGCoord;
47namespace blender {
48namespace bke::pbvh {
49class Node;
50class Tree;
51} // namespace bke::pbvh
52} // namespace blender
53
55struct StrokeCache;
56
57namespace auto_mask {
58struct Cache;
59};
60
61void scale_translations(MutableSpan<float3> translations, Span<float> factors);
62void scale_translations(MutableSpan<float3> translations, float factor);
63void scale_factors(MutableSpan<float> factors, float strength);
64void scale_factors(MutableSpan<float> factors, Span<float> strengths);
66 Span<float> factors,
67 MutableSpan<float3> r_translations);
68
75 Span<float3> old_positions,
76 MutableSpan<float3> translations);
78 Span<float3> old_positions,
79 MutableSpan<float3> translations);
80
81void transform_positions(Span<float3> src, const float4x4 &transform, MutableSpan<float3> dst);
82void transform_positions(const float4x4 &transform, MutableSpan<float3> positions);
83
85template<typename T> void gather_data_mesh(Span<T> src, Span<int> indices, MutableSpan<T> dst);
86template<typename T>
88{
89 dst.resize(indices.size());
90 gather_data_mesh(src, indices, dst.as_mutable_span());
91 return dst;
92}
93template<typename T>
94void gather_data_grids(const SubdivCCG &subdiv_ccg,
95 Span<T> src,
96 Span<int> grids,
97 MutableSpan<T> node_data);
98template<typename T>
100 const Span<T> src,
101 const Span<int> grids,
102 Vector<T> &dst)
103{
104 const CCGKey key = BKE_subdiv_ccg_key_top_level(subdiv_ccg);
105 dst.resize(grids.size() * key.grid_area);
106 gather_data_grids(subdiv_ccg, src, grids, dst.as_mutable_span());
107 return dst;
108}
109
110template<typename T>
112template<typename T>
114{
115 dst.resize(verts.size());
117 return dst;
118}
119
121template<typename T> void scatter_data_mesh(Span<T> src, Span<int> indices, MutableSpan<T> dst);
122template<typename T>
123void scatter_data_grids(const SubdivCCG &subdiv_ccg,
124 Span<T> node_data,
125 Span<int> grids,
126 MutableSpan<T> dst);
127template<typename T>
129
132 const Span<int> grids,
133 Vector<float3> &positions)
134{
135 const CCGKey key = BKE_subdiv_ccg_key_top_level(subdiv_ccg);
136 positions.resize(key.grid_area * grids.size());
137 gather_data_grids(subdiv_ccg, subdiv_ccg.positions.as_span(), grids, positions);
138 return positions;
139}
142 Vector<float3> &positions)
143{
144 positions.resize(verts.size());
145 gather_bmesh_positions(verts, positions.as_mutable_span());
146 return positions;
147}
148
150void gather_grids_normals(const SubdivCCG &subdiv_ccg,
151 Span<int> grids,
152 MutableSpan<float3> normals);
154
159 /* Point Domain */
162
163 /* Face Domain */
166
167 explicit MeshAttributeData(const bke::AttributeAccessor &attributes)
168 {
169 this->mask = *attributes.lookup<float>(".sculpt_mask", bke::AttrDomain::Point);
170 this->hide_vert = *attributes.lookup<bool>(".hide_vert", bke::AttrDomain::Point);
171 this->hide_poly = *attributes.lookup<bool>(".hide_poly", bke::AttrDomain::Face);
172 this->face_sets = *attributes.lookup<int>(".sculpt_face_set", bke::AttrDomain::Face);
173 }
174};
175
176void calc_factors_common_mesh(const Depsgraph &depsgraph,
177 const Brush &brush,
178 const Object &object,
179 const MeshAttributeData &attribute_data,
180 Span<float3> positions,
181 Span<float3> vert_normals,
182 const bke::pbvh::MeshNode &node,
183 Vector<float> &r_factors,
184 Vector<float> &r_distances);
185void calc_factors_common_mesh_indexed(const Depsgraph &depsgraph,
186 const Brush &brush,
187 const Object &object,
188 const MeshAttributeData &attribute_data,
189 Span<float3> vert_positions,
190 Span<float3> vert_normals,
191 const bke::pbvh::MeshNode &node,
192 Vector<float> &r_factors,
193 Vector<float> &r_distances);
194void calc_factors_common_grids(const Depsgraph &depsgraph,
195 const Brush &brush,
196 const Object &object,
197 Span<float3> positions,
198 const bke::pbvh::GridsNode &node,
199 Vector<float> &r_factors,
200 Vector<float> &r_distances);
201void calc_factors_common_bmesh(const Depsgraph &depsgraph,
202 const Brush &brush,
203 const Object &object,
204 Span<float3> positions,
206 Vector<float> &r_factors,
207 Vector<float> &r_distances);
209 const Brush &brush,
210 const Object &object,
211 const MeshAttributeData &attribute_data,
212 Span<float3> positions,
213 Span<float3> normals,
214 const bke::pbvh::MeshNode &node,
215 Vector<float> &r_factors,
216 Vector<float> &r_distances);
218 const Brush &brush,
219 const Object &object,
220 Span<float3> positions,
221 Span<float3> normals,
222 const bke::pbvh::GridsNode &node,
223 Vector<float> &r_factors,
224 Vector<float> &r_distances);
226 const Brush &brush,
227 const Object &object,
228 Span<float3> positions,
229 Span<float3> normals,
231 Vector<float> &r_factors,
232 Vector<float> &r_distances);
233
238void fill_factor_from_hide(const SubdivCCG &subdiv_ccg,
239 Span<int> grids,
240 MutableSpan<float> r_factors);
242
247 Span<float> mask,
249 MutableSpan<float> r_factors);
250void fill_factor_from_hide_and_mask(const SubdivCCG &subdiv_ccg,
251 Span<int> grids,
252 MutableSpan<float> r_factors);
254 const Set<BMVert *, 0> &verts,
255 MutableSpan<float> r_factors);
256
260void calc_front_face(const float3 &view_normal, Span<float3> normals, MutableSpan<float> factors);
261void calc_front_face(const float3 &view_normal,
262 Span<float3> vert_normals,
263 Span<int> vert_indices,
264 MutableSpan<float> factors);
265void calc_front_face(const float3 &view_normal,
266 const SubdivCCG &subdiv_ccg,
267 Span<int> grids,
268 MutableSpan<float> factors);
269void calc_front_face(const float3 &view_normal,
270 const Set<BMVert *, 0> &verts,
271 MutableSpan<float> factors);
272void calc_front_face(const float3 &view_normal,
273 const Set<BMFace *, 0> &faces,
274 MutableSpan<float> factors);
275
282 Span<float3> vert_positions,
284 MutableSpan<float> factors);
286 Span<float3> positions,
287 MutableSpan<float> factors);
288
294 Span<float3> vert_positions,
295 Span<int> vert_indices,
296 eBrushFalloffShape falloff_shape,
297 MutableSpan<float> r_distances);
299 Span<float3> positions,
300 eBrushFalloffShape falloff_shape,
301 MutableSpan<float> r_distances);
303 Span<float3> vert_positions,
304 Span<int> vert_indices,
305 eBrushFalloffShape falloff_shape,
306 MutableSpan<float> r_distances);
308 Span<float3> positions,
309 eBrushFalloffShape falloff_shape,
310 MutableSpan<float> r_distances);
311
313void filter_distances_with_radius(float radius, Span<float> distances, MutableSpan<float> factors);
314
319void calc_brush_cube_distances(const Brush &brush,
320 const float4x4 &mat,
321 Span<float3> positions,
323 MutableSpan<float> r_distances,
324 MutableSpan<float> factors);
325void calc_brush_cube_distances(const Brush &brush,
326 const float4x4 &mat,
327 Span<float3> positions,
328 MutableSpan<float> r_distances,
329 MutableSpan<float> factors);
330
335void apply_hardness_to_distances(float radius, float hardness, MutableSpan<float> distances);
337 const MutableSpan<float> distances)
338{
339 apply_hardness_to_distances(cache.radius, cache.hardness, distances);
340}
341
345void calc_brush_strength_factors(const StrokeCache &cache,
346 const Brush &brush,
347 Span<float> distances,
348 MutableSpan<float> factors);
349
354 const Brush &brush,
355 Span<float3> vert_positions,
356 Span<int> vert_indices,
357 MutableSpan<float> factors);
359 const Brush &brush,
360 Span<float3> positions,
361 MutableSpan<float> factors);
362
370void apply_translations(Span<float3> translations, Span<int> grids, SubdivCCG &subdiv_ccg);
371void apply_translations(Span<float3> translations, const Set<BMVert *, 0> &verts);
372
374void project_translations(MutableSpan<float3> translations, const float3 &plane);
375
384 Span<float3> positions,
385 Span<float3> orig_positions);
386
396 MutableSpan<float3> translations);
397
402 const SculptSession &ss,
403 Span<float3> positions,
405 MutableSpan<float3> translations);
407 const SculptSession &ss,
408 Span<float3> positions,
409 MutableSpan<float3> translations);
410
416void update_shape_keys(Object &object,
417 const Mesh &mesh,
418 const KeyBlock &active_key,
420 Span<float3> translations,
421 Span<float3> positions_orig);
422
428 const IndexMask &nodes_mask,
429 Array<int> &node_data);
431 const Span<bke::pbvh::GridsNode> nodes,
432 const IndexMask &nodes_mask,
433 Array<int> &node_data);
435 const IndexMask &nodes_mask,
436 Array<int> &node_data);
437
453 Span<int> corner_verts,
454 GroupedSpan<int> vert_to_face,
455 Span<bool> hide_poly,
457 MutableSpan<Vector<int>> result);
458void calc_vert_neighbors(const SubdivCCG &subdiv_ccg,
459 Span<int> grids,
462
471 Span<int> corner_verts,
472 GroupedSpan<int> vert_to_face,
473 BitSpan boundary_verts,
474 Span<bool> hide_poly,
476 MutableSpan<Vector<int>> result);
478 Span<int> corner_verts,
479 BitSpan boundary_verts,
480 const SubdivCCG &subdiv_ccg,
481 Span<int> grids,
485
487void calc_translations_to_plane(Span<float3> vert_positions,
489 const float4 &plane,
490 MutableSpan<float3> translations);
492 const float4 &plane,
493 MutableSpan<float3> translations);
494
497 const float3 &pivot,
499 MutableSpan<float> factors);
500
502void filter_plane_trim_limit_factors(const Brush &brush,
503 const StrokeCache &cache,
504 Span<float3> translations,
505 MutableSpan<float> factors);
506
508void filter_below_plane_factors(Span<float3> vert_positions,
510 const float4 &plane,
511 MutableSpan<float> factors);
513 const float4 &plane,
514 MutableSpan<float> factors);
515
516/* Ignore points above the plane. */
517void filter_above_plane_factors(Span<float3> vert_positions,
519 const float4 &plane,
520 MutableSpan<float> factors);
522 const float4 &plane,
523 MutableSpan<float> factors);
524
525} // namespace blender::ed::sculpt_paint
CCGKey BKE_subdiv_ccg_key_top_level(const SubdivCCG &subdiv_ccg)
eBrushFalloffShape
ePaintSymmetryFlags
ATTR_WARN_UNUSED_RESULT BMesh * bm
constexpr int64_t size() const
Definition BLI_span.hh:253
void resize(const int64_t new_size)
MutableSpan< T > as_mutable_span()
const Depsgraph * depsgraph
static float verts[][3]
static BLI_NOINLINE void fill_factor_from_hide_and_mask(const Mesh &mesh, const Span< int > face_indices, const MutableSpan< float > r_factors)
void update_shape_keys(Object &object, const Mesh &mesh, const KeyBlock &active_key, Span< int > verts, Span< float3 > translations, Span< float3 > positions_orig)
Definition sculpt.cc:7180
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)
Definition sculpt.cc:6148
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)
Definition sculpt.cc:6373
void gather_bmesh_positions(const Set< BMVert *, 0 > &verts, MutableSpan< float3 > positions)
Definition sculpt.cc:6054
void calc_brush_strength_factors(const StrokeCache &cache, const Brush &brush, Span< float > distances, MutableSpan< float > factors)
Definition sculpt.cc:6889
void gather_data_grids(const SubdivCCG &subdiv_ccg, Span< T > src, Span< int > grids, MutableSpan< T > node_data)
Definition sculpt.cc:6092
void 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, MutableSpan< Vector< int > > result)
Definition sculpt.cc:7385
void filter_below_plane_factors(Span< float3 > vert_positions, Span< int > verts, const float4 &plane, MutableSpan< float > factors)
Definition sculpt.cc:7534
void apply_hardness_to_distances(float radius, float hardness, MutableSpan< float > distances)
Definition sculpt.cc:6862
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)
Definition sculpt.cc:6270
void gather_bmesh_normals(const Set< BMVert *, 0 > &verts, MutableSpan< float3 > normals)
Definition sculpt.cc:6072
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)
Definition sculpt.cc:6199
void filter_distances_with_radius(float radius, Span< float > distances, MutableSpan< float > factors)
Definition sculpt.cc:6772
OffsetIndices< int > create_node_vert_offsets_bmesh(const Span< bke::pbvh::BMeshNode > nodes, const IndexMask &nodes_mask, Array< int > &node_data)
Definition sculpt.cc:7318
void filter_region_clip_factors(const SculptSession &ss, Span< float3 > vert_positions, Span< int > verts, MutableSpan< float > factors)
Definition sculpt.cc:6639
void gather_data_bmesh(Span< T > src, const Set< BMVert *, 0 > &verts, MutableSpan< T > node_data)
Definition sculpt.cc:6108
void reset_translations_to_original(MutableSpan< float3 > translations, Span< float3 > positions, Span< float3 > orig_positions)
Definition sculpt.cc:6946
void calc_brush_distances(const SculptSession &ss, Span< float3 > vert_positions, Span< int > vert_indices, eBrushFalloffShape falloff_shape, MutableSpan< float > r_distances)
Definition sculpt.cc:6722
void scale_translations(MutableSpan< float3 > translations, Span< float > factors)
Definition sculpt.cc:7210
void transform_positions(Span< float3 > src, const float4x4 &transform, MutableSpan< float3 > dst)
Definition sculpt.cc:7278
void filter_verts_outside_symmetry_area(Span< float3 > positions, const float3 &pivot, ePaintSymmetryFlags symm, MutableSpan< float > factors)
Definition sculpt.cc:7504
void calc_translations_to_plane(Span< float3 > vert_positions, Span< int > verts, const float4 &plane, MutableSpan< float3 > translations)
Definition sculpt.cc:7479
void scale_factors(MutableSpan< float > factors, float strength)
Definition sculpt.cc:7227
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)
Definition sculpt.cc:6337
void translations_from_new_positions(Span< float3 > new_positions, Span< int > verts, Span< float3 > old_positions, MutableSpan< float3 > translations)
Definition sculpt.cc:7257
void clip_and_lock_translations(const Sculpt &sd, const SculptSession &ss, Span< float3 > positions, Span< int > verts, MutableSpan< float3 > translations)
Definition sculpt.cc:7022
void scatter_data_mesh(Span< T > src, Span< int > indices, MutableSpan< T > dst)
Definition sculpt.cc:6122
void project_translations(MutableSpan< float3 > translations, const float3 &plane)
Definition sculpt.cc:6998
void filter_plane_trim_limit_factors(const Brush &brush, const StrokeCache &cache, Span< float3 > translations, MutableSpan< float > factors)
Definition sculpt.cc:7518
void apply_translations(Span< float3 > translations, Span< int > verts, MutableSpan< float3 > positions)
Definition sculpt.cc:6958
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)
Definition sculpt.cc:6235
void gather_data_mesh(Span< T > src, Span< int > indices, MutableSpan< T > dst)
Definition sculpt.cc:6082
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)
Definition sculpt.cc:7330
void filter_above_plane_factors(Span< float3 > vert_positions, Span< int > verts, const float4 &plane, MutableSpan< float > factors)
Definition sculpt.cc:7557
void calc_brush_cube_distances(const Brush &brush, const float4x4 &mat, Span< float3 > positions, Span< int > verts, MutableSpan< float > r_distances, MutableSpan< float > factors)
Definition sculpt.cc:6783
void apply_crazyspace_to_translations(Span< float3x3 > deform_imats, Span< int > verts, MutableSpan< float3 > translations)
Definition sculpt.cc:7011
void calc_front_face(const float3 &view_normal, Span< float3 > normals, MutableSpan< float > factors)
Definition sculpt.cc:6581
OffsetIndices< int > create_node_vert_offsets(const Span< bke::pbvh::MeshNode > nodes, const IndexMask &nodes_mask, Array< int > &node_data)
Definition sculpt.cc:7296
void gather_grids_normals(const SubdivCCG &subdiv_ccg, Span< int > grids, MutableSpan< float3 > normals)
Definition sculpt.cc:6065
void translations_from_offset_and_factors(const float3 &offset, Span< float > factors, MutableSpan< float3 > r_translations)
Definition sculpt.cc:7246
void calc_brush_texture_factors(const SculptSession &ss, const Brush &brush, Span< float3 > vert_positions, Span< int > vert_indices, MutableSpan< float > factors)
Definition sculpt.cc:6898
void fill_factor_from_hide(Span< bool > hide_vert, Span< int > verts, MutableSpan< float > r_factors)
Definition sculpt.cc:6442
void scatter_data_grids(const SubdivCCG &subdiv_ccg, Span< T > node_data, Span< int > grids, MutableSpan< T > dst)
Definition sculpt.cc:6132
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)
Definition sculpt.cc:6304
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)
Definition sculpt.cc:6408
void calc_brush_distances_squared(const SculptSession &ss, Span< float3 > vert_positions, Span< int > vert_indices, eBrushFalloffShape falloff_shape, MutableSpan< float > r_distances)
Definition sculpt.cc:6694
int grid_area
Definition BKE_ccg.hh:35
blender::Array< blender::float3 > positions
MeshAttributeData(const bke::AttributeAccessor &attributes)