115 this->
smooth(point_smooth_factors);
116 curves_->tag_positions_changed();
126 for (
const float4x4 &brush_transform : symmetry_brush_transforms) {
137 const float brush_radius_sq_re =
pow2f(brush_radius_re);
146 const IndexRange points = points_by_curve[curve_i];
147 for (
const int point_i : points) {
152 if (dist_to_brush_sq_re > brush_radius_sq_re) {
156 const float dist_to_brush_re = std::sqrt(dist_to_brush_sq_re);
158 brush_, dist_to_brush_re, brush_radius_re);
161 const float weight_factor = 0.1f;
162 const float weight = weight_factor *
brush_strength_ * radius_falloff *
183 for (
const float4x4 &brush_transform : symmetry_brush_transforms) {
186 r_point_smooth_factors);
191 const float brush_radius_cu,
194 const float brush_radius_sq_cu =
pow2f(brush_radius_cu);
200 const IndexRange points = points_by_curve[curve_i];
201 for (
const int point_i : points) {
204 if (dist_to_brush_sq_cu > brush_radius_sq_cu) {
208 const float dist_to_brush_cu = std::sqrt(dist_to_brush_sq_cu);
210 brush_, dist_to_brush_cu, brush_radius_cu);
213 const float weight_factor = 0.1f;
214 const float weight = weight_factor *
brush_strength_ * radius_falloff *
228 for (
const int curve_i : segment) {
229 const IndexRange points = points_by_curve[curve_i];
230 old_positions.
clear();
233 const int point_i = points[
i];
234 const float smooth_factor = point_smooth_factors[point_i];
235 if (smooth_factor == 0.0f) {
239 const float3 old_pos = old_positions[
i];
240 const float3 &prev_pos = old_positions[
i - 1];
241 const float3 &next_pos = old_positions[
i + 1];
244 positions[point_i] = new_pos;
255 executor.
execute(*
this,
C, stroke_extension);
260 return std::make_unique<SmoothOperation>();
float BKE_brush_curve_strength(eBrushCurvePreset preset, const CurveMapping *cumap, float distance, float brush_radius)
float BKE_brush_radius_get(const Paint *paint, const Brush *brush)
Object * CTX_data_active_object(const bContext *C)
const Brush * BKE_paint_brush_for_read(const Paint *paint)
#define BLI_assert_unreachable()
MINLINE float pow2f(float x)
void DEG_id_tag_update(ID *id, unsigned int flags)
@ PAINT_FALLOFF_SHAPE_SPHERE
@ PAINT_FALLOFF_SHAPE_TUBE
void ED_region_tag_redraw(ARegion *region)
blender::float2 ED_view3d_project_float_v2_m4(const ARegion *region, const float co[3], const blender::float4x4 &mat)
void ED_view3d_win_to_3d(const View3D *v3d, const ARegion *region, const float depth_pt[3], const float mval[2], float r_out[3])
blender::float4x4 ED_view3d_ob_project_mat_get(const RegionView3D *rv3d, const Object *ob)
constexpr IndexRange drop_back(int64_t n) const
constexpr int64_t size() const
constexpr IndexRange drop_front(int64_t n) const
constexpr MutableSpan slice(const int64_t start, const int64_t size) const
void extend(Span< T > array)
void on_stroke_extended(const bContext &C, const StrokeExtension &stroke_extension) override
friend struct SmoothOperationExecutor
GeometryDeformation get_evaluated_curves_deformation(const Object *ob_eval, const Object &ob_orig)
IndexMask retrieve_selected_curves(const bke::CurvesGeometry &curves, IndexMaskMemory &memory)
float brush_strength_get(const Paint &paint, const Brush &brush, const StrokeExtension &stroke_extension)
std::optional< CurvesBrush3D > sample_curves_3d_brush(const Depsgraph &depsgraph, const ARegion ®ion, const View3D &v3d, const RegionView3D &rv3d, const Object &curves_object, const float2 &brush_pos_re, const float brush_radius_re)
void remember_stroke_position(CurvesSculpt &curves_sculpt, const float3 &brush_position_wo)
std::unique_ptr< CurvesSculptStrokeOperation > new_smooth_operation()
Vector< float4x4 > get_symmetry_brush_transforms(const eCurvesSymmetryType symmetry)
float brush_radius_factor(const Brush &brush, const StrokeExtension &stroke_extension)
CartesianBasis invert(const CartesianBasis &basis)
T midpoint(const T &a, const T &b)
T interpolate(const T &a, const T &b, const FactorT &t)
T distance_squared(const VecBase< T, Size > &a, const VecBase< T, Size > &b)
void max_inplace(T &a, const T &b)
VecBase< T, 3 > transform_point(const CartesianBasis &basis, const VecBase< T, 3 > &v)
MatBase< float, 4, 4 > float4x4
VecBase< float, 2 > float2
VecBase< float, 3 > float3
void find_spherical_smooth_factors(const float3 &brush_pos_cu, const float brush_radius_cu, MutableSpan< float > r_point_smooth_factors)
CurvesSculpt * curves_sculpt_
void find_projected_smooth_factors(const float4x4 &brush_transform, MutableSpan< float > r_point_smooth_factors)
VArray< float > point_factors_
float brush_radius_base_re_
IndexMaskMemory selected_curve_memory_
IndexMask curve_selection_
CurvesSculptCommonContext ctx_
CurvesSurfaceTransforms transforms_
void smooth(const Span< float > point_smooth_factors)
void execute(SmoothOperation &self, const bContext &C, const StrokeExtension &stroke_extension)
void find_spherical_smooth_factors_with_symmetry(MutableSpan< float > r_point_smooth_factors)
SmoothOperationExecutor(const bContext &C)
float brush_radius_factor_
void find_projected_smooth_factors_with_symmetry(MutableSpan< float > r_point_smooth_factors)
void WM_main_add_notifier(uint type, void *reference)