57 float2 last_mouse_position_re_;
140 if (brush_3d.has_value()) {
141 self_->brush_3d_ = *brush_3d;
167 for (
const float4x4 &brush_transform : symmetry_brush_transforms) {
184 const float brush_radius_sq_re =
pow2f(brush_radius_re);
188 for (
const int curve_i : segment) {
189 const IndexRange points = points_by_curve[curve_i];
190 const int last_point_i = points.last();
191 const float3 old_pos_cu = deformation.positions[last_point_i];
199 if (distance_to_brush_sq_re > brush_radius_sq_re) {
204 brush_, std::sqrt(distance_to_brush_sq_re), brush_radius_re);
216 const float3 translation_eval = new_pos_cu - old_pos_cu;
217 const float3 translation_orig = deformation.translation_from_deformed_to_original(
218 last_point_i, translation_eval);
220 const float3 last_point_cu = positions_cu[last_point_i] + translation_orig;
228 float3 brush_start_wo, brush_end_wo;
249 for (
const float4x4 &brush_transform : symmetry_brush_transforms) {
257 const float3 &brush_end_cu,
258 const float brush_radius_cu)
265 const float3 brush_diff_cu = brush_end_cu - brush_start_cu;
266 const float brush_radius_sq_cu =
pow2f(brush_radius_cu);
270 for (
const int curve_i : segment) {
271 const IndexRange points = points_by_curve[curve_i];
272 const int last_point_i = points.last();
273 const float3 old_pos_cu = deformation.positions[last_point_i];
276 old_pos_cu, brush_start_cu, brush_end_cu);
277 if (distance_to_brush_sq_cu > brush_radius_sq_cu) {
281 const float distance_to_brush_cu = std::sqrt(distance_to_brush_sq_cu);
284 brush_, distance_to_brush_cu, brush_radius_cu);
287 const float3 translation_eval = weight * brush_diff_cu;
288 const float3 translation_orig = deformation.translation_from_deformed_to_original(
289 last_point_i, translation_eval);
291 const float3 last_point_cu = positions_cu[last_point_i] + translation_orig;
302 executor.
execute(*
this, C, stroke_extension);
307 return std::make_unique<SnakeHookOperation>();
int BKE_brush_size_get(const Scene *scene, const Brush *brush)
float BKE_brush_curve_strength(eBrushCurvePreset preset, const CurveMapping *cumap, float distance, float brush_radius)
Object * CTX_data_active_object(const bContext *C)
Low-level operations for curves.
const Brush * BKE_paint_brush_for_read(const Paint *paint)
#define BLI_assert_unreachable()
A KD-tree for nearest neighbor search.
MINLINE float pow2f(float x)
float dist_squared_to_line_segment_v3(const float p[3], const float l1[3], const float l2[3])
#define BLI_SCOPED_DEFER(function_to_defer)
void DEG_id_tag_update(ID *id, unsigned int flags)
@ PAINT_FALLOFF_SHAPE_SPHERE
@ PAINT_FALLOFF_SHAPE_TUBE
Object is a sort of wrapper for general info.
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 MutableSpan slice(const int64_t start, const int64_t size) const
GAttributeReader lookup_or_default(StringRef attribute_id, AttrDomain domain, eCustomDataType data_type, const void *default_value=nullptr) const
MutableSpan< float3 > positions_for_write()
OffsetIndices< int > points_by_curve() const
void tag_positions_changed()
AttributeAccessor attributes() const
const Depsgraph * depsgraph
void on_stroke_extended(const bContext &C, const StrokeExtension &stroke_extension) override
void foreach_segment(Fn &&fn) const
GeometryDeformation get_evaluated_curves_deformation(const Object *ob_eval, const Object &ob_orig)
IndexMask retrieve_selected_curves(const bke::CurvesGeometry &curves, IndexMaskMemory &memory)
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)
std::unique_ptr< CurvesSculptStrokeOperation > new_snake_hook_operation()
float brush_strength_get(const Scene &scene, const Brush &brush, const StrokeExtension &stroke_extension)
Vector< float4x4 > get_symmetry_brush_transforms(const eCurvesSymmetryType symmetry)
float brush_radius_factor(const Brush &brush, const StrokeExtension &stroke_extension)
void move_last_point_and_resample(MoveAndResampleBuffers &buffer, MutableSpan< float3 > positions, const float3 &new_last_position)
CartesianBasis invert(const CartesianBasis &basis)
T distance_squared(const VecBase< T, Size > &a, const VecBase< T, Size > &b)
VecBase< T, 3 > transform_point(const CartesianBasis &basis, const VecBase< T, 3 > &v)
struct ToolSettings * toolsettings
SnakeHookOperatorExecutor(const bContext &C)
void spherical_snake_hook(const float3 &brush_start_cu, const float3 &brush_end_cu, const float brush_radius_cu)
void spherical_snake_hook_with_symmetry()
void execute(SnakeHookOperation &self, const bContext &C, const StrokeExtension &stroke_extension)
const CurvesSculpt * curves_sculpt_
void projected_snake_hook_with_symmetry()
CurvesSculptCommonContext ctx_
IndexMask curve_selection_
SnakeHookOperation * self_
VArray< float > curve_factors_
float brush_radius_base_re_
float2 brush_pos_diff_re_
void projected_snake_hook(const float4x4 &brush_transform)
float brush_radius_factor_
CurvesSurfaceTransforms transforms_
IndexMaskMemory selected_curve_memory_
float2 brush_pos_prev_re_
void WM_main_add_notifier(uint type, void *reference)