Blender V4.3
inflate.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
6
7#include "DNA_brush_types.h"
8#include "DNA_mesh_types.h"
9#include "DNA_object_types.h"
10#include "DNA_scene_types.h"
11
12#include "BKE_key.hh"
13#include "BKE_mesh.hh"
14#include "BKE_paint.hh"
15#include "BKE_pbvh.hh"
16#include "BKE_subdiv_ccg.hh"
17
18#include "BLI_array.hh"
20#include "BLI_math_matrix.hh"
21#include "BLI_math_vector.hh"
22#include "BLI_task.h"
23#include "BLI_task.hh"
24
28
30
31inline namespace inflate_cc {
32
39
40BLI_NOINLINE static void apply_scale(const MutableSpan<float3> translations, const float3 &scale)
41{
42 for (const int i : translations.index_range()) {
43 translations[i] *= scale;
44 }
45}
46
47static void calc_faces(const Depsgraph &depsgraph,
48 const Sculpt &sd,
49 const Brush &brush,
50 const float3 &scale,
51 const MeshAttributeData &attribute_data,
52 const Span<float3> vert_normals,
53 const bke::pbvh::MeshNode &node,
54 Object &object,
55 LocalData &tls,
56 const PositionDeformData &position_data)
57{
58 SculptSession &ss = *object.sculpt;
59
60 const Span<int> verts = node.verts();
61
63 brush,
64 object,
65 attribute_data,
66 position_data.eval,
67 vert_normals,
68 node,
69 tls.factors,
70 tls.distances);
71
72 const MutableSpan translations = gather_data_mesh(vert_normals, verts, tls.translations);
73 apply_scale(translations, scale);
74 scale_translations(translations, tls.factors);
75
76 clip_and_lock_translations(sd, ss, position_data.eval, verts, translations);
77 position_data.deform(translations, verts);
78}
79
80static void calc_grids(const Depsgraph &depsgraph,
81 const Sculpt &sd,
82 Object &object,
83 const Brush &brush,
84 const float3 &scale,
86 LocalData &tls)
87{
88 SculptSession &ss = *object.sculpt;
89 SubdivCCG &subdiv_ccg = *ss.subdiv_ccg;
90
91 const Span<int> grids = node.grids();
92 const MutableSpan positions = gather_grids_positions(subdiv_ccg, grids, tls.positions);
93
94 calc_factors_common_grids(depsgraph, brush, object, positions, node, tls.factors, tls.distances);
95
96 tls.translations.resize(positions.size());
97 const MutableSpan<float3> translations = tls.translations;
98 gather_grids_normals(subdiv_ccg, grids, translations);
99 apply_scale(translations, scale);
100 scale_translations(translations, tls.factors);
101
102 clip_and_lock_translations(sd, ss, positions, translations);
103 apply_translations(translations, grids, subdiv_ccg);
104}
105
106static void calc_bmesh(const Depsgraph &depsgraph,
107 const Sculpt &sd,
108 Object &object,
109 const Brush &brush,
110 const float3 &scale,
112 LocalData &tls)
113{
114 SculptSession &ss = *object.sculpt;
115
117 const MutableSpan positions = gather_bmesh_positions(verts, tls.positions);
118
119 calc_factors_common_bmesh(depsgraph, brush, object, positions, node, tls.factors, tls.distances);
120
121 tls.translations.resize(verts.size());
122 const MutableSpan<float3> translations = tls.translations;
123 gather_bmesh_normals(verts, translations);
124 apply_scale(translations, scale);
125 scale_translations(translations, tls.factors);
126
127 clip_and_lock_translations(sd, ss, positions, translations);
128 apply_translations(translations, verts);
129}
130
131} // namespace inflate_cc
132
133void do_inflate_brush(const Depsgraph &depsgraph,
134 const Sculpt &sd,
135 Object &object,
136 const IndexMask &node_mask)
137{
138 const SculptSession &ss = *object.sculpt;
139 bke::pbvh::Tree &pbvh = *bke::object::pbvh_get(object);
140 const Brush &brush = *BKE_paint_brush_for_read(&sd.paint);
141
142 const float3 scale = ss.cache->scale * ss.cache->radius * ss.cache->bstrength;
143
145 switch (pbvh.type()) {
147 const Mesh &mesh = *static_cast<Mesh *>(object.data);
148 const MeshAttributeData attribute_data(mesh.attributes());
149 const PositionDeformData position_data(depsgraph, object);
150 const Span<float3> vert_normals = bke::pbvh::vert_normals_eval(depsgraph, object);
152 node_mask.foreach_index(GrainSize(1), [&](const int i) {
153 LocalData &tls = all_tls.local();
155 sd,
156 brush,
157 scale,
158 attribute_data,
159 vert_normals,
160 nodes[i],
161 object,
162 tls,
163 position_data);
164 bke::pbvh::update_node_bounds_mesh(position_data.eval, nodes[i]);
165 });
166 break;
167 }
169 SubdivCCG &subdiv_ccg = *object.sculpt->subdiv_ccg;
170 MutableSpan<float3> positions = subdiv_ccg.positions;
172 node_mask.foreach_index(GrainSize(1), [&](const int i) {
173 LocalData &tls = all_tls.local();
174 calc_grids(depsgraph, sd, object, brush, scale, nodes[i], tls);
175 bke::pbvh::update_node_bounds_grids(subdiv_ccg.grid_area, positions, nodes[i]);
176 });
177 break;
178 }
181 node_mask.foreach_index(GrainSize(1), [&](const int i) {
182 LocalData &tls = all_tls.local();
183 calc_bmesh(depsgraph, sd, object, brush, scale, nodes[i], tls);
185 });
186 break;
187 }
188 }
189 pbvh.tag_positions_changed(node_mask);
191}
192
193} // namespace blender::ed::sculpt_paint
const Brush * BKE_paint_brush_for_read(const Paint *paint)
Definition paint.cc:654
const blender::Set< BMVert *, 0 > & BKE_pbvh_bmesh_node_unique_verts(blender::bke::pbvh::BMeshNode *node)
#define BLI_NOINLINE
Object is a sort of wrapper for general info.
constexpr IndexRange index_range() const
Definition BLI_span.hh:671
void tag_positions_changed(const IndexMask &node_mask)
Definition pbvh.cc:549
Span< NodeT > nodes() const
void deform(MutableSpan< float3 > translations, Span< int > verts) const
Definition sculpt.cc:7139
void foreach_index(Fn &&fn) const
const Depsgraph * depsgraph
static float verts[][3]
pbvh::Tree * pbvh_get(Object &object)
Definition paint.cc:2846
void update_node_bounds_bmesh(BMeshNode &node)
Definition pbvh.cc:1095
void update_node_bounds_mesh(Span< float3 > positions, MeshNode &node)
Definition pbvh.cc:1075
Span< float3 > vert_normals_eval(const Depsgraph &depsgraph, const Object &object_orig)
Definition pbvh.cc:2502
void update_node_bounds_grids(int grid_area, Span< float3 > positions, GridsNode &node)
Definition pbvh.cc:1084
void flush_bounds_to_parents(Tree &pbvh)
Definition pbvh.cc:1132
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)
static void calc_faces(const Depsgraph &depsgraph, const Sculpt &sd, const Brush &brush, const float4 &test_plane, const float strength, const MeshAttributeData &attribute_data, const Span< float3 > vert_normals, const bke::pbvh::MeshNode &node, Object &object, LocalData &tls, const PositionDeformData &position_data)
Definition clay.cc:58
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)
Definition clay.cc:95
static void calc_faces(const Depsgraph &depsgraph, const Sculpt &sd, const Brush &brush, const float3 &scale, const MeshAttributeData &attribute_data, const Span< float3 > vert_normals, const bke::pbvh::MeshNode &node, Object &object, LocalData &tls, const PositionDeformData &position_data)
Definition inflate.cc:47
static void calc_bmesh(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const Brush &brush, const float3 &scale, bke::pbvh::BMeshNode &node, LocalData &tls)
Definition inflate.cc:106
static BLI_NOINLINE void apply_scale(const MutableSpan< float3 > translations, const float3 &scale)
Definition inflate.cc:40
static void calc_grids(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const Brush &brush, const float3 &scale, bke::pbvh::GridsNode &node, LocalData &tls)
Definition inflate.cc:80
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)
Definition sculpt.cc:6054
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 scale_translations(MutableSpan< float3 > translations, Span< float > factors)
Definition sculpt.cc:7210
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 apply_translations(Span< float3 > translations, Span< int > verts, MutableSpan< float3 > positions)
Definition sculpt.cc:6958
void gather_data_mesh(Span< T > src, Span< int > indices, MutableSpan< T > dst)
Definition sculpt.cc:6082
void gather_grids_normals(const SubdivCCG &subdiv_ccg, Span< int > grids, MutableSpan< float3 > normals)
Definition sculpt.cc:6065
void do_inflate_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
Definition inflate.cc:133
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
blender::ed::sculpt_paint::StrokeCache * cache
Definition BKE_paint.hh:427
SubdivCCG * subdiv_ccg
Definition BKE_paint.hh:405
blender::Array< blender::float3 > positions