Blender V4.5
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#include "BLI_virtual_array.hh"
16
17#include "BKE_subdiv_ccg.hh"
18
19#include "DNA_brush_enums.h"
20
21#include "sculpt_intern.hh"
22
37
38struct BMesh;
39struct BMVert;
40struct BMFace;
41struct Brush;
42struct Mesh;
43struct Object;
44struct Sculpt;
45struct SculptSession;
46struct SubdivCCG;
47struct SubdivCCGCoord;
48namespace blender {
49namespace bke {
51}
52namespace bke::pbvh {
53class Node;
54class Tree;
55} // namespace bke::pbvh
56} // namespace blender
57
59struct StrokeCache;
60
61namespace auto_mask {
62struct Cache;
63};
64
65void filter_translations(MutableSpan<float3> translations, Span<float> factors);
66void scale_translations(MutableSpan<float3> translations, Span<float> factors);
67void scale_translations(MutableSpan<float3> translations, float factor);
68void scale_factors(MutableSpan<float> factors, float strength);
69void scale_factors(MutableSpan<float> factors, Span<float> strengths);
71 Span<float> factors,
72 MutableSpan<float3> r_translations);
73
80 Span<float3> old_positions,
81 MutableSpan<float3> translations);
83 Span<float3> old_positions,
84 MutableSpan<float3> translations);
85
88
90template<typename T> void gather_data_mesh(Span<T> src, Span<int> indices, MutableSpan<T> dst);
91template<typename T>
93{
94 dst.resize(indices.size());
96 return dst;
97}
98template<typename T>
99void gather_data_grids(const SubdivCCG &subdiv_ccg,
100 Span<T> src,
101 Span<int> grids,
102 MutableSpan<T> node_data);
103template<typename T>
105 const Span<T> src,
106 const Span<int> grids,
107 Vector<T> &dst)
108{
109 const CCGKey key = BKE_subdiv_ccg_key_top_level(subdiv_ccg);
110 dst.resize(grids.size() * key.grid_area);
111 gather_data_grids(subdiv_ccg, src, grids, dst.as_mutable_span());
112 return dst;
113}
114
115template<typename T>
117template<typename T>
119{
120 dst.resize(verts.size());
122 return dst;
123}
124
126template<typename T> void scatter_data_mesh(Span<T> src, Span<int> indices, MutableSpan<T> dst);
127template<typename T>
128void scatter_data_grids(const SubdivCCG &subdiv_ccg,
129 Span<T> node_data,
130 Span<int> grids,
131 MutableSpan<T> dst);
132template<typename T>
134
137 const Span<int> grids,
138 Vector<float3> &positions)
139{
140 const CCGKey key = BKE_subdiv_ccg_key_top_level(subdiv_ccg);
141 positions.resize(key.grid_area * grids.size());
142 gather_data_grids(subdiv_ccg, subdiv_ccg.positions.as_span(), grids, positions);
143 return positions;
144}
147 Vector<float3> &positions)
148{
149 positions.resize(verts.size());
151 return positions;
152}
153
155void gather_grids_normals(const SubdivCCG &subdiv_ccg,
156 Span<int> grids,
159
164 /* Point Domain */
167
168 /* Face Domain */
171
172 explicit MeshAttributeData(const Mesh &mesh);
173};
174
175void calc_factors_common_mesh(const Depsgraph &depsgraph,
176 const Brush &brush,
177 const Object &object,
178 const MeshAttributeData &attribute_data,
179 Span<float3> positions,
180 Span<float3> vert_normals,
181 const bke::pbvh::MeshNode &node,
182 Vector<float> &r_factors,
183 Vector<float> &r_distances);
184void calc_factors_common_mesh_indexed(const Depsgraph &depsgraph,
185 const Brush &brush,
186 const Object &object,
187 const MeshAttributeData &attribute_data,
188 Span<float3> vert_positions,
189 Span<float3> vert_normals,
190 const bke::pbvh::MeshNode &node,
191 Vector<float> &r_factors,
192 Vector<float> &r_distances);
193void calc_factors_common_mesh_indexed(const Depsgraph &depsgraph,
194 const Brush &brush,
195 const Object &object,
196 const MeshAttributeData &attribute_data,
197 Span<float3> vert_positions,
198 Span<float3> vert_normals,
199 const bke::pbvh::MeshNode &node,
200 MutableSpan<float> factors,
201 MutableSpan<float> distances);
202void calc_factors_common_grids(const Depsgraph &depsgraph,
203 const Brush &brush,
204 const Object &object,
205 Span<float3> positions,
206 const bke::pbvh::GridsNode &node,
207 Vector<float> &r_factors,
208 Vector<float> &r_distances);
209void calc_factors_common_bmesh(const Depsgraph &depsgraph,
210 const Brush &brush,
211 const Object &object,
212 Span<float3> positions,
214 Vector<float> &r_factors,
215 Vector<float> &r_distances);
217 const Brush &brush,
218 const Object &object,
219 const MeshAttributeData &attribute_data,
220 Span<float3> positions,
222 const bke::pbvh::MeshNode &node,
223 Vector<float> &r_factors,
224 Vector<float> &r_distances);
226 const Brush &brush,
227 const Object &object,
228 Span<float3> positions,
230 const bke::pbvh::GridsNode &node,
231 Vector<float> &r_factors,
232 Vector<float> &r_distances);
234 const Brush &brush,
235 const Object &object,
236 Span<float3> positions,
239 Vector<float> &r_factors,
240 Vector<float> &r_distances);
241
246void fill_factor_from_hide(const SubdivCCG &subdiv_ccg,
247 Span<int> grids,
248 MutableSpan<float> r_factors);
250
257 MutableSpan<float> r_factors);
258void fill_factor_from_hide_and_mask(const SubdivCCG &subdiv_ccg,
259 Span<int> grids,
260 MutableSpan<float> r_factors);
262 const Set<BMVert *, 0> &verts,
263 MutableSpan<float> r_factors);
264
268void calc_front_face(const float3 &view_normal, Span<float3> normals, MutableSpan<float> factors);
269void calc_front_face(const float3 &view_normal,
270 Span<float3> vert_normals,
272 MutableSpan<float> factors);
273void calc_front_face(const float3 &view_normal,
274 const SubdivCCG &subdiv_ccg,
275 Span<int> grids,
276 MutableSpan<float> factors);
277void calc_front_face(const float3 &view_normal,
278 const Set<BMVert *, 0> &verts,
279 MutableSpan<float> factors);
280void calc_front_face(const float3 &view_normal,
281 const Set<BMFace *, 0> &faces,
282 MutableSpan<float> factors);
283
290 Span<float3> vert_positions,
292 MutableSpan<float> factors);
294 Span<float3> positions,
295 MutableSpan<float> factors);
296
302 Span<float3> vert_positions,
303 Span<int> vert,
304 eBrushFalloffShape falloff_shape,
305 MutableSpan<float> r_distances);
307 Span<float3> positions,
308 eBrushFalloffShape falloff_shape,
309 MutableSpan<float> r_distances);
311 Span<float3> positions,
313 eBrushFalloffShape falloff_shape,
314 MutableSpan<float> r_distances);
316 Span<float3> positions,
317 eBrushFalloffShape falloff_shape,
318 MutableSpan<float> r_distances);
319
321void filter_distances_with_radius(float radius, Span<float> distances, MutableSpan<float> factors);
322
327template<typename T>
328void calc_brush_cube_distances(const Brush &brush,
329 const Span<T> positions,
330 const MutableSpan<float> r_distances);
331
336void apply_hardness_to_distances(float radius, float hardness, MutableSpan<float> distances);
338 const MutableSpan<float> distances)
339{
340 apply_hardness_to_distances(cache.radius, cache.hardness, distances);
341}
342
346void calc_brush_strength_factors(const StrokeCache &cache,
347 const Brush &brush,
348 Span<float> distances,
349 MutableSpan<float> factors);
350
355 const Brush &brush,
356 Span<float3> vert_positions,
357 Span<int> vert,
358 MutableSpan<float> factors);
360 const Brush &brush,
361 Span<float3> positions,
362 MutableSpan<float> factors);
363
371void apply_translations(Span<float3> translations, Span<int> grids, SubdivCCG &subdiv_ccg);
372void apply_translations(Span<float3> translations, const Set<BMVert *, 0> &verts);
373
375void project_translations(MutableSpan<float3> translations, const float3 &plane);
376
385 Span<float3> positions,
386 Span<float3> orig_positions);
387
397 MutableSpan<float3> translations);
398
403 const SculptSession &ss,
404 Span<float3> positions,
406 MutableSpan<float3> translations);
408 const SculptSession &ss,
409 Span<float3> positions,
410 MutableSpan<float3> translations);
411
417 const IndexMask &node_mask,
418 Array<int> &node_data);
421 const IndexMask &node_mask,
422 Array<int> &node_data);
424 const IndexMask &node_mask,
425 Array<int> &node_data);
426
434 Span<int> corner_verts,
435 GroupedSpan<int> vert_to_face,
436 Span<bool> hide_poly,
438 Vector<int> &r_offset_data,
439 Vector<int> &r_data);
441 Span<int> grids,
442 Vector<int> &r_offset_data,
443 Vector<int> &r_data);
445 Vector<int> &r_offset_data,
446 Vector<BMVert *> &r_data);
447
455 Span<int> corner_verts,
456 GroupedSpan<int> vert_to_face,
457 BitSpan boundary_verts,
458 Span<bool> hide_poly,
460 Vector<int> &r_offset_data,
461 Vector<int> &r_data);
463 Span<int> corner_verts,
464 GroupedSpan<int> vert_to_face,
465 BitSpan boundary_verts,
466 Span<bool> hide_poly,
468 Span<float> factors,
469 Vector<int> &r_offset_data,
470 Vector<int> &r_data);
472 Span<int> corner_verts,
473 BitSpan boundary_verts,
474 const SubdivCCG &subdiv_ccg,
475 Span<int> grids,
479
481void calc_translations_to_plane(Span<float3> vert_positions,
483 const float4 &plane,
484 MutableSpan<float3> translations);
486 const float4 &plane,
487 MutableSpan<float3> translations);
488
491 const float3 &pivot,
493 MutableSpan<float> factors);
494
496void filter_plane_trim_limit_factors(const Brush &brush,
497 const StrokeCache &cache,
498 Span<float3> translations,
499 MutableSpan<float> factors);
500
502void filter_below_plane_factors(Span<float3> vert_positions,
504 const float4 &plane,
505 MutableSpan<float> factors);
507 const float4 &plane,
508 MutableSpan<float> factors);
509
510/* Ignore points above the plane. */
511void filter_above_plane_factors(Span<float3> vert_positions,
513 const float4 &plane,
514 MutableSpan<float> factors);
516 const float4 &plane,
517 MutableSpan<float> factors);
518
519} // namespace blender::ed::sculpt_paint
CCGKey BKE_subdiv_ccg_key_top_level(const SubdivCCG &subdiv_ccg)
eBrushFalloffShape
ePaintSymmetryFlags
BMesh * bm
BPy_StructRNA * depsgraph
constexpr int64_t size() const
Definition BLI_span.hh:252
void resize(const int64_t new_size)
MutableSpan< T > as_mutable_span()
static ushort indices[]
static float verts[][3]
static float normals[][3]
static char faces[256]
void fill_factor_from_hide_and_mask(Span< bool > hide_vert, Span< float > mask, Span< int > verts, MutableSpan< float > r_factors)
Definition sculpt.cc:6809
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:6447
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:6692
void gather_bmesh_positions(const Set< BMVert *, 0 > &verts, MutableSpan< float3 > positions)
Definition sculpt.cc:6353
void calc_brush_strength_factors(const StrokeCache &cache, const Brush &brush, Span< float > distances, MutableSpan< float > factors)
Definition sculpt.cc:7169
void gather_data_grids(const SubdivCCG &subdiv_ccg, Span< T > src, Span< int > grids, MutableSpan< T > node_data)
Definition sculpt.cc:6391
void filter_below_plane_factors(Span< float3 > vert_positions, Span< int > verts, const float4 &plane, MutableSpan< float > factors)
Definition sculpt.cc:7886
void apply_hardness_to_distances(float radius, float hardness, MutableSpan< float > distances)
Definition sculpt.cc:7142
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:6589
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)
Definition sculpt.cc:7607
void gather_bmesh_normals(const Set< BMVert *, 0 > &verts, MutableSpan< float3 > normals)
Definition sculpt.cc:6371
void filter_translations(MutableSpan< float3 > translations, Span< float > factors)
Definition sculpt.cc:7478
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:6498
void filter_distances_with_radius(float radius, Span< float > distances, MutableSpan< float > factors)
Definition sculpt.cc:7091
void filter_region_clip_factors(const SculptSession &ss, Span< float3 > vert_positions, Span< int > verts, MutableSpan< float > factors)
Definition sculpt.cc:6958
void gather_data_bmesh(Span< T > src, const Set< BMVert *, 0 > &verts, MutableSpan< T > node_data)
Definition sculpt.cc:6407
void reset_translations_to_original(MutableSpan< float3 > translations, Span< float3 > positions, Span< float3 > orig_positions)
Definition sculpt.cc:7232
void scale_translations(MutableSpan< float3 > translations, Span< float > factors)
Definition sculpt.cc:7487
void transform_positions(Span< float3 > src, const float4x4 &transform, MutableSpan< float3 > dst)
Definition sculpt.cc:7555
void filter_verts_outside_symmetry_area(Span< float3 > positions, const float3 &pivot, ePaintSymmetryFlags symm, MutableSpan< float > factors)
Definition sculpt.cc:7856
void calc_translations_to_plane(Span< float3 > vert_positions, Span< int > verts, const float4 &plane, MutableSpan< float3 > translations)
Definition sculpt.cc:7831
void scale_factors(MutableSpan< float > factors, float strength)
Definition sculpt.cc:7504
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:6656
void translations_from_new_positions(Span< float3 > new_positions, Span< int > verts, Span< float3 > old_positions, MutableSpan< float3 > translations)
Definition sculpt.cc:7534
void clip_and_lock_translations(const Sculpt &sd, const SculptSession &ss, Span< float3 > positions, Span< int > verts, MutableSpan< float3 > translations)
Definition sculpt.cc:7318
void scatter_data_mesh(Span< T > src, Span< int > indices, MutableSpan< T > dst)
Definition sculpt.cc:6421
void calc_brush_distances(const SculptSession &ss, Span< float3 > vert_positions, Span< int > vert, eBrushFalloffShape falloff_shape, MutableSpan< float > r_distances)
Definition sculpt.cc:7041
void project_translations(MutableSpan< float3 > translations, const float3 &plane)
Definition sculpt.cc:7294
void filter_plane_trim_limit_factors(const Brush &brush, const StrokeCache &cache, Span< float3 > translations, MutableSpan< float > factors)
Definition sculpt.cc:7870
OffsetIndices< int > create_node_vert_offsets(Span< bke::pbvh::MeshNode > nodes, const IndexMask &node_mask, Array< int > &node_data)
Definition sculpt.cc:7573
void apply_translations(Span< float3 > translations, Span< int > verts, MutableSpan< float3 > positions)
Definition sculpt.cc:7251
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:6554
void gather_data_mesh(Span< T > src, Span< int > indices, MutableSpan< T > dst)
Definition sculpt.cc:6381
void calc_brush_texture_factors(const SculptSession &ss, const Brush &brush, Span< float3 > vert_positions, Span< int > vert, MutableSpan< float > factors)
Definition sculpt.cc:7178
void filter_above_plane_factors(Span< float3 > vert_positions, Span< int > verts, const float4 &plane, MutableSpan< float > factors)
Definition sculpt.cc:7909
void apply_crazyspace_to_translations(Span< float3x3 > deform_imats, Span< int > verts, MutableSpan< float3 > translations)
Definition sculpt.cc:7307
void calc_front_face(const float3 &view_normal, Span< float3 > normals, MutableSpan< float > factors)
Definition sculpt.cc:6900
void calc_brush_distances_squared(const SculptSession &ss, Span< float3 > positions, Span< int > verts, eBrushFalloffShape falloff_shape, MutableSpan< float > r_distances)
Definition sculpt.cc:7013
void gather_grids_normals(const SubdivCCG &subdiv_ccg, Span< int > grids, MutableSpan< float3 > normals)
Definition sculpt.cc:6364
void translations_from_offset_and_factors(const float3 &offset, Span< float > factors, MutableSpan< float3 > r_translations)
Definition sculpt.cc:7523
void calc_brush_cube_distances(const Brush &brush, const Span< T > positions, const MutableSpan< float > r_distances)
Definition sculpt.cc:7103
void fill_factor_from_hide(Span< bool > hide_vert, Span< int > verts, MutableSpan< float > r_factors)
Definition sculpt.cc:6761
void scatter_data_grids(const SubdivCCG &subdiv_ccg, Span< T > node_data, Span< int > grids, MutableSpan< T > dst)
Definition sculpt.cc:6431
OffsetIndices< int > create_node_vert_offsets_bmesh(Span< bke::pbvh::BMeshNode > nodes, const IndexMask &node_mask, Array< int > &node_data)
Definition sculpt.cc:7595
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:6623
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)
Definition sculpt.cc:7746
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:6727
MatBase< float, 4, 4 > float4x4
VecBase< float, 4 > float4
VecBase< float, 3 > float3
int grid_area
Definition BKE_ccg.hh:35
blender::Array< blender::float3 > positions