75 const std::array<float4, 2> &scrape_planes,
82 const bool plane_index = local_positions[
i][0] <= 0.0f;
97 float3 local = local_positions[
i];
105 const std::array<float4, 2> &scrape_planes,
109 const bool plane_index = local_positions[
i][0] <= 0.0f;
112 translations[
i] =
closest - positions[
i];
123 if (factors[
i] <= 0.0f) {
126 const bool plane_index = local_positions[
i].x <= 0.0f;
128 sample.area_cos[plane_index] += positions[
i];
129 sample.area_count[plane_index]++;
293 switch (pbvh.
type()) {
305 LocalData &tls = all_tls.local();
306 node_mask.slice(range).foreach_index([&](const int i) {
307 sample_node_surface_mesh(depsgraph,
330 LocalData &tls = all_tls.local();
331 node_mask.slice(range).foreach_index([&](const int i) {
332 sample_node_surface_grids(depsgraph, object, brush, mat, nodes[i], sample, tls);
342 node_mask.index_range(),
346 LocalData &tls = all_tls.local();
347 node_mask.slice(range).foreach_index([&](const int i) {
348 sample_node_surface_bmesh(depsgraph, object, brush, mat, nodes[i], sample, tls);
357 return result.has_samples() ? std::make_optional(
result) : std::nullopt;
364 const std::array<float4, 2> &scrape_planes,
366 const float strength,
421 position_data.deform(translations,
verts);
428 const std::array<float4, 2> &scrape_planes,
430 const float strength,
490 const std::array<float4, 2> &scrape_planes,
492 const float strength,
559 const float displace = -radius * offset;
561 float3 sculpt_plane_normal;
565 float3 area_normal = sculpt_plane_normal;
581 area_position += area_normal * ss.
cache->
scale * displace;
587 mat.
z_axis() = area_normal;
603 depsgraph,
object, brush, mat, node_mask);
611 const std::array<float3, 2> sampled_plane_co{
617 const std::array<float3, 2> sampled_plane_normals{
621 float sampled_angle =
angle_v3v3(sampled_plane_normals[0], sampled_plane_normals[1]);
622 const std::array<float3, 2> sampled_cv{area_normal, ss.
cache->
location_symm - mid_co};
627 if (
math::dot(sampled_cv[0], sampled_cv[1]) < 0.0f) {
628 sampled_angle = -sampled_angle;
634 sampled_angle = 0.0f;
657 const float3 y_axis(0.0f, 1.0f, 0.0f);
660 std::array<float4, 2> multiplane_scrape_planes;
679 switch (pbvh.
type()) {
692 multiplane_scrape_planes,
706 SubdivCCG &subdiv_ccg = *
object.sculpt->subdiv_ccg;
715 multiplane_scrape_planes,
733 multiplane_scrape_planes,
751 const float outline_col[3],
752 const float outline_alpha)
768 const float3 y_axis{0.0f, 1.0f, 0.0f};
771 const float3 area_center(0);
776 immVertex3f(gpuattr, area_center[0], area_center[1] + offset, area_center[2]);
777 immVertex3f(gpuattr, p_r[0], p_r[1] + offset, p_r[2]);
778 immVertex3f(gpuattr, area_center[0], area_center[1] + offset, area_center[2]);
779 immVertex3f(gpuattr, p_l[0], p_l[1] + offset, p_l[2]);
781 immVertex3f(gpuattr, area_center[0], area_center[1] - offset, area_center[2]);
782 immVertex3f(gpuattr, p_r[0], p_r[1] - offset, p_r[2]);
783 immVertex3f(gpuattr, area_center[0], area_center[1] - offset, area_center[2]);
784 immVertex3f(gpuattr, p_l[0], p_l[1] - offset, p_l[2]);
786 immVertex3f(gpuattr, area_center[0], area_center[1] - offset, area_center[2]);
787 immVertex3f(gpuattr, area_center[0], area_center[1] + offset, area_center[2]);
789 immVertex3f(gpuattr, p_r[0], p_r[1] - offset, p_r[2]);
790 immVertex3f(gpuattr, p_r[0], p_r[1] + offset, p_r[2]);
792 immVertex3f(gpuattr, p_l[0], p_l[1] - offset, p_l[2]);
793 immVertex3f(gpuattr, p_l[0], p_l[1] + offset, p_l[2]);
799 immVertex3f(gpuattr, area_center[0], area_center[1] + offset, area_center[2]);
800 immVertex3f(gpuattr, p_r[0], p_r[1] + offset, p_r[2]);
801 immVertex3f(gpuattr, p_r[0], p_r[1] - offset, p_r[2]);
802 immVertex3f(gpuattr, area_center[0], area_center[1] + offset, area_center[2]);
803 immVertex3f(gpuattr, area_center[0], area_center[1] - offset, area_center[2]);
804 immVertex3f(gpuattr, p_r[0], p_r[1] - offset, p_r[2]);
806 immVertex3f(gpuattr, area_center[0], area_center[1] + offset, area_center[2]);
807 immVertex3f(gpuattr, p_l[0], p_l[1] + offset, p_l[2]);
808 immVertex3f(gpuattr, p_l[0], p_l[1] - offset, p_l[2]);
809 immVertex3f(gpuattr, area_center[0], area_center[1] + offset, area_center[2]);
810 immVertex3f(gpuattr, area_center[0], area_center[1] - offset, area_center[2]);
811 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)
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)
BPy_StructRNA * depsgraph
bool closest(btVector3 &v)
void resize(const int64_t new_size)
constexpr int64_t size() const
constexpr int64_t size() const
constexpr IndexRange index_range() const
void tag_positions_changed(const IndexMask &node_mask)
Span< NodeT > nodes() const
void flush_bounds_to_parents()
IndexRange index_range() const
void foreach_index(Fn &&fn) const
static float normals[][3]
VecBase< float, 3 > float3
pbvh::Tree * pbvh_get(Object &object)
void update_node_bounds_bmesh(BMeshNode &node)
void update_node_bounds_mesh(Span< float3 > positions, MeshNode &node)
Span< float3 > vert_normals_eval(const Depsgraph &depsgraph, const Object &object_orig)
void update_node_bounds_grids(int grid_area, Span< float3 > positions, GridsNode &node)
Span< float3 > vert_positions_eval(const Depsgraph &depsgraph, const Object &object_orig)
void calc_vert_factors(const Depsgraph &depsgraph, const Object &object, const Cache &automasking, const bke::pbvh::MeshNode &node, Span< int > verts, MutableSpan< float > factors)
void calc_grids_factors(const Depsgraph &depsgraph, const Object &object, const Cache &automasking, const bke::pbvh::GridsNode &node, Span< int > grids, MutableSpan< float > factors)
static BLI_NOINLINE void calc_translations(const Set< BMVert *, 0 > &verts, const float3 &direction, const MutableSpan< float3 > translations)
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)
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)
static BLI_NOINLINE void fill_factor_from_hide_and_mask(const Mesh &mesh, const Span< int > face_indices, const MutableSpan< float > r_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)
void multiplane_scrape_preview_draw(uint gpuattr, const Brush &brush, const SculptSession &ss, const float outline_col[3], float outline_alpha)
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)
static BLI_NOINLINE void calc_distances(const Span< float3 > local_positions, const MutableSpan< float > distances)
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)
static ScrapeSampleData join_samples(const ScrapeSampleData &a, const ScrapeSampleData &b)
void do_multiplane_scrape_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &object, const IndexMask &node_mask)
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)
static std::optional< ScrapeSampleData > sample_surface(const Depsgraph &depsgraph, const Object &object, const Brush &brush, const float4x4 &mat, const IndexMask &node_mask)
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)
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 filter_region_clip_factors(const SculptSession &ss, Span< float3 > vert_positions, Span< int > verts, MutableSpan< float > factors)
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 calc_brush_distances(const SculptSession &ss, Span< float3 > vert_positions, Span< int > vert, eBrushFalloffShape falloff_shape, MutableSpan< float > r_distances)
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)
float brush_plane_offset_get(const Brush &brush, const SculptSession &ss)
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)
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)
void transform_points(const float4x4 &transform, MutableSpan< float3 > points, bool use_threading=true)
Value parallel_reduce(IndexRange range, int64_t grain_size, const Value &identity, const Function &function, const Reduction &reduction)
MatBase< float, 4, 4 > float4x4
VecBase< float, 3 > float3
bool SCULPT_stroke_is_first_brush_step_of_symmetry_pass(const blender::ed::sculpt_paint::StrokeCache &cache)
float multiplane_scrape_angle
float normal_radius_factor
struct CurveMapping * curve_distance_falloff
int curve_distance_falloff_preset
blender::ed::sculpt_paint::StrokeCache * cache
blender::Array< blender::float3 > positions
const c_style_mat & ptr() const
static MatBase identity()
Span< int > grids() const
Span< int > verts() const
VArraySpan< bool > hide_vert
std::unique_ptr< auto_mask::Cache > automasking
float multiplane_scrape_angle
float4x4 stroke_local_mat
ePaintSymmetryFlags mirror_symmetry_pass
Vector< float > distances
Vector< float3 > positions
Vector< float3 > local_positions
Vector< float3 > translations
std::array< float3, 2 > area_cos
std::array< int, 2 > area_count
std::array< float3, 2 > area_nos