58 joined.
area_cos[0] = a.area_cos[0] +
b.area_cos[0];
59 joined.
area_cos[1] = a.area_cos[1] +
b.area_cos[1];
61 joined.
area_nos[0] = a.area_nos[0] +
b.area_nos[0];
62 joined.
area_nos[1] = a.area_nos[1] +
b.area_nos[1];
64 joined.
area_count[0] = a.area_count[0] +
b.area_count[0];
65 joined.
area_count[1] = a.area_count[1] +
b.area_count[1];
71 const std::array<float4, 2> &scrape_planes,
78 const bool plane_index = local_positions[i][0] <= 0.0f;
93 float3 local = local_positions[i];
101 const std::array<float4, 2> &scrape_planes,
104 for (
const int i : positions.index_range()) {
105 const bool plane_index = local_positions[i][0] <= 0.0f;
108 translations[i] = closest - positions[i];
118 for (
const int i : positions.index_range()) {
119 if (factors[i] <= 0.0f) {
122 const bool plane_index = local_positions[i].x <= 0.0f;
123 sample.area_nos[plane_index] += normals[i] * factors[i];
124 sample.area_cos[plane_index] += positions[i];
125 sample.area_count[plane_index]++;
212 tls.
normals.resize(positions.size());
273 switch (pbvh.
type()) {
275 Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
285 LocalData &tls = all_tls.local();
286 node_mask.slice(range).foreach_index([&](const int i) {
287 sample_node_surface_mesh(depsgraph,
310 LocalData &tls = all_tls.local();
311 node_mask.slice(range).foreach_index([&](const int i) {
312 sample_node_surface_grids(depsgraph, object, brush, mat, nodes[i], sample, tls);
322 node_mask.index_range(),
326 LocalData &tls = all_tls.local();
327 node_mask.slice(range).foreach_index([&](const int i) {
328 sample_node_surface_bmesh(depsgraph, object, brush, mat, nodes[i], sample, tls);
344 const std::array<float4, 2> &scrape_planes,
346 const float strength,
405 const std::array<float4, 2> &scrape_planes,
407 const float strength,
426 auto_mask::calc_grids_factors(
depsgraph,
object, cache.
automasking.get(), node, grids, factors);
464 const std::array<float4, 2> &scrape_planes,
466 const float strength,
530 const float displace = -radius * offset;
541 area_no = area_no_sp;
554 area_co = area_no_sp * ss.
cache->
scale * displace;
557 float4x4 mat = float4x4::identity();
578 const std::array<float3, 2> sampled_plane_co{
584 const std::array<float3, 2> sampled_plane_normals{
588 float sampled_angle =
angle_v3v3(sampled_plane_normals[0], sampled_plane_normals[1]);
594 if (
math::dot(sampled_cv[0], sampled_cv[1]) < 0.0f) {
595 sampled_angle = -sampled_angle;
601 sampled_angle = 0.0f;
624 const float3 y_axis(0.0f, 1.0f, 0.0f);
627 std::array<float4, 2> multiplane_scrape_planes;
646 switch (pbvh.
type()) {
647 case bke::pbvh::Type::Mesh: {
648 Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
659 multiplane_scrape_planes,
668 bke::pbvh::update_node_bounds_mesh(position_data.eval, nodes[i]);
672 case bke::pbvh::Type::Grids: {
673 SubdivCCG &subdiv_ccg = *
object.sculpt->subdiv_ccg;
682 multiplane_scrape_planes,
688 bke::pbvh::update_node_bounds_grids(subdiv_ccg.
grid_area, positions, nodes[i]);
692 case bke::pbvh::Type::BMesh: {
700 multiplane_scrape_planes,
706 bke::pbvh::update_node_bounds_bmesh(nodes[i]);
712 bke::pbvh::flush_bounds_to_parents(pbvh);
718 const float outline_col[3],
719 const float outline_alpha)
735 const float3 y_axis{0.0f, 1.0f, 0.0f};
738 const float3 area_center(0);
743 immVertex3f(gpuattr, area_center[0], area_center[1] + offset, area_center[2]);
744 immVertex3f(gpuattr, p_r[0], p_r[1] + offset, p_r[2]);
745 immVertex3f(gpuattr, area_center[0], area_center[1] + offset, area_center[2]);
746 immVertex3f(gpuattr, p_l[0], p_l[1] + offset, p_l[2]);
748 immVertex3f(gpuattr, area_center[0], area_center[1] - offset, area_center[2]);
749 immVertex3f(gpuattr, p_r[0], p_r[1] - offset, p_r[2]);
750 immVertex3f(gpuattr, area_center[0], area_center[1] - offset, area_center[2]);
751 immVertex3f(gpuattr, p_l[0], p_l[1] - offset, p_l[2]);
753 immVertex3f(gpuattr, area_center[0], area_center[1] - offset, area_center[2]);
754 immVertex3f(gpuattr, area_center[0], area_center[1] + offset, area_center[2]);
756 immVertex3f(gpuattr, p_r[0], p_r[1] - offset, p_r[2]);
757 immVertex3f(gpuattr, p_r[0], p_r[1] + offset, p_r[2]);
759 immVertex3f(gpuattr, p_l[0], p_l[1] - offset, p_l[2]);
760 immVertex3f(gpuattr, p_l[0], p_l[1] + offset, p_l[2]);
766 immVertex3f(gpuattr, area_center[0], area_center[1] + offset, area_center[2]);
767 immVertex3f(gpuattr, p_r[0], p_r[1] + offset, p_r[2]);
768 immVertex3f(gpuattr, p_r[0], p_r[1] - offset, p_r[2]);
769 immVertex3f(gpuattr, area_center[0], area_center[1] + offset, area_center[2]);
770 immVertex3f(gpuattr, area_center[0], area_center[1] - offset, area_center[2]);
771 immVertex3f(gpuattr, p_r[0], p_r[1] - offset, p_r[2]);
773 immVertex3f(gpuattr, area_center[0], area_center[1] + offset, area_center[2]);
774 immVertex3f(gpuattr, p_l[0], p_l[1] + offset, p_l[2]);
775 immVertex3f(gpuattr, p_l[0], p_l[1] - offset, p_l[2]);
776 immVertex3f(gpuattr, area_center[0], area_center[1] + offset, area_center[2]);
777 immVertex3f(gpuattr, area_center[0], area_center[1] - offset, area_center[2]);
778 immVertex3f(gpuattr, p_l[0], p_l[1] - offset, p_l[2]);
void BKE_brush_calc_curve_factors(eBrushCurvePreset preset, const CurveMapping *cumap, blender::Span< float > distances, float brush_radius, blender::MutableSpan< float > factors)
const Brush * BKE_paint_brush_for_read(const Paint *paint)
A BVH for high poly meshes.
const blender::Set< BMVert *, 0 > & BKE_pbvh_bmesh_node_unique_verts(blender::bke::pbvh::BMeshNode *node)
#define BLI_assert_unreachable()
void plane_from_point_normal_v3(float r_plane[4], const float plane_co[3], const float plane_no[3])
MINLINE float plane_point_side_v3(const float plane[4], const float co[3])
void closest_to_plane_normalized_v3(float r_close[3], const float plane[4], const float pt[3])
void mul_v3_mat3_m4v3(float r[3], const float mat[4][4], const float vec[3])
void normalize_m4(float R[4][4]) ATTR_NONNULL()
void rotate_v3_v3v3fl(float r[3], const float p[3], const float axis[3], float angle)
float angle_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE bool is_zero_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float normalize_v3(float n[3])
@ BRUSH_MULTIPLANE_SCRAPE_PLANES_PREVIEW
@ BRUSH_MULTIPLANE_SCRAPE_DYNAMIC
Object is a sort of wrapper for general info.
#define GPU_matrix_mul(x)
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
bool closest(btVector3 &v)
constexpr int64_t size() const
constexpr int64_t size() const
constexpr IndexRange index_range() const
void resize(const int64_t new_size)
void tag_positions_changed(const IndexMask &node_mask)
Span< NodeT > nodes() const
IndexRange index_range() const
void foreach_index(Fn &&fn) const
local_group_size(16, 16) .push_constant(Type b
const Depsgraph * depsgraph
draw_view in_light_buf[] float
static void transform_positions(const Span< blender::float3 > src, const blender::float4x4 &transform, blender::MutableSpan< blender::float3 > dst)
pbvh::Tree * pbvh_get(Object &object)
Span< float3 > vert_normals_eval(const Depsgraph &depsgraph, const Object &object_orig)
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 BLI_NOINLINE void calc_translations(const Set< BMVert *, 0 > &verts, const float3 &direction, const MutableSpan< float3 > translations)
static BLI_NOINLINE void fill_factor_from_hide_and_mask(const Mesh &mesh, const Span< int > face_indices, const MutableSpan< float > r_factors)
void fill_factor_from_hide_and_mask(Span< bool > hide_vert, Span< float > mask, Span< int > verts, MutableSpan< float > r_factors)
static void calc_bmesh(const Depsgraph &depsgraph, const Sculpt &sd, const Brush &brush, const float4x4 &mat, const std::array< float4, 2 > &scrape_planes, const float angle, const float strength, bke::pbvh::BMeshNode &node, Object &object, LocalData &tls)
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 gather_bmesh_normals(const Set< BMVert *, 0 > &verts, MutableSpan< float3 > normals)
void filter_distances_with_radius(float radius, Span< float > distances, MutableSpan< float > factors)
void do_multiplane_scrape_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
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)
static BLI_NOINLINE void calc_translations(const Span< float3 > positions, const Span< float3 > local_positions, const std::array< float4, 2 > &scrape_planes, const MutableSpan< float3 > translations)
void scale_translations(MutableSpan< float3 > translations, Span< float > factors)
static void sample_node_surface_bmesh(const Depsgraph &depsgraph, const Object &object, const Brush &brush, const float4x4 &mat, const bke::pbvh::BMeshNode &node, ScrapeSampleData &sample, LocalData &tls)
static BLI_NOINLINE void filter_plane_side_factors(const Span< float3 > positions, const Span< float3 > local_positions, const std::array< float4, 2 > &scrape_planes, const MutableSpan< float > factors)
void transform_positions(Span< float3 > src, const float4x4 &transform, MutableSpan< float3 > dst)
static BLI_NOINLINE void accumulate_samples(const Span< float3 > positions, const Span< float3 > local_positions, const Span< float3 > normals, const Span< float > factors, ScrapeSampleData &sample)
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)
static void calc_grids(const Depsgraph &depsgraph, const Sculpt &sd, const Brush &brush, const float4x4 &mat, const std::array< float4, 2 > &scrape_planes, const float angle, const float strength, const bke::pbvh::GridsNode &node, Object &object, LocalData &tls)
void calc_brush_plane(const Depsgraph &depsgraph, const Brush &brush, Object &ob, const IndexMask &node_mask, float3 &r_area_no, float3 &r_area_co)
std::optional< float3 > calc_area_normal(const Depsgraph &depsgraph, const Brush &brush, const Object &ob, const IndexMask &node_mask)
void filter_plane_trim_limit_factors(const Brush &brush, const StrokeCache &cache, Span< float3 > translations, MutableSpan< float > factors)
void apply_translations(Span< float3 > translations, Span< int > verts, MutableSpan< float3 > positions)
void gather_data_mesh(Span< T > src, Span< int > indices, MutableSpan< T > dst)
static void calc_faces(const Depsgraph &depsgraph, const Sculpt &sd, const Brush &brush, const float4x4 &mat, const std::array< float4, 2 > &scrape_planes, const float angle, const float strength, const Span< float3 > vert_normals, const MeshAttributeData &attribute_data, const bke::pbvh::MeshNode &node, Object &object, LocalData &tls, const PositionDeformData &position_data)
static void sample_node_surface_grids(const Depsgraph &depsgraph, const Object &object, const Brush &brush, const float4x4 &mat, const bke::pbvh::GridsNode &node, ScrapeSampleData &sample, LocalData &tls)
void calc_front_face(const float3 &view_normal, Span< float3 > normals, MutableSpan< float > factors)
void gather_grids_normals(const SubdivCCG &subdiv_ccg, Span< int > grids, MutableSpan< float3 > normals)
static ScrapeSampleData join_samples(const ScrapeSampleData &a, const ScrapeSampleData &b)
static void sample_node_surface_mesh(const Depsgraph &depsgraph, const Object &object, const Brush &brush, const float4x4 &mat, const Span< float3 > vert_positions, const Span< float3 > vert_normals, const MeshAttributeData &attribute_data, const bke::pbvh::MeshNode &node, ScrapeSampleData &sample, LocalData &tls)
void multiplane_scrape_preview_draw(const uint gpuattr, const Brush &brush, const SculptSession &ss, const float outline_col[3], const float outline_alpha)
static ScrapeSampleData sample_surface(const Depsgraph &depsgraph, const Object &object, const Brush &brush, const float4x4 &mat, const IndexMask &node_mask)
static BLI_NOINLINE void calc_distances(const Span< float3 > local_positions, const MutableSpan< float > distances)
T length(const VecBase< T, Size > &a)
T dot(const QuaternionBase< T > &a, const QuaternionBase< T > &b)
CartesianBasis invert(const CartesianBasis &basis)
T midpoint(const T &a, const T &b)
AxisSigned cross(const AxisSigned a, const AxisSigned b)
T interpolate(const T &a, const T &b, const FactorT &t)
MatBase< T, NumCol, NumRow > normalize(const MatBase< T, NumCol, NumRow > &a)
Value parallel_reduce(IndexRange range, int64_t grain_size, const Value &identity, const Function &function, const Reduction &reduction)
bool SCULPT_stroke_is_first_brush_step_of_symmetry_pass(const blender::ed::sculpt_paint::StrokeCache &cache)
float SCULPT_brush_plane_offset_get(const Sculpt &sd, const SculptSession &ss)
float multiplane_scrape_angle
float normal_radius_factor
struct CurveMapping * curve
blender::ed::sculpt_paint::StrokeCache * cache
blender::Array< blender::float3 > positions
const c_style_mat & ptr() const
Vector< float > distances
Vector< float3 > translations
Vector< float3 > positions
Vector< float3 > local_positions
VArraySpan< bool > hide_vert
std::array< int, 2 > area_count
std::array< float3, 2 > area_nos
std::array< float3, 2 > area_cos
std::unique_ptr< auto_mask::Cache > automasking
float multiplane_scrape_angle
float4x4 stroke_local_mat
ePaintSymmetryFlags mirror_symmetry_pass