Blender V5.0
grease_pencil_sculpt_pinch.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
5#include "BKE_context.hh"
6#include "BKE_crazyspace.hh"
7#include "BKE_curves.hh"
9#include "BKE_paint.hh"
10
11#include "ED_grease_pencil.hh"
12#include "ED_view3d.hh"
13
14#include "WM_api.hh"
15#include "WM_types.hh"
16
18#include "paint_intern.hh"
19
21
23 public:
25
26 void on_stroke_begin(const bContext &C, const InputSample &start_sample) override;
27 void on_stroke_extended(const bContext &C, const InputSample &extension_sample) override;
28 void on_stroke_done(const bContext & /*C*/) override {}
29};
30
31void PinchOperation::on_stroke_begin(const bContext &C, const InputSample &start_sample)
32{
33 this->init_stroke(C, start_sample);
34 this->init_auto_masking(C, start_sample);
35}
36
37void PinchOperation::on_stroke_extended(const bContext &C, const InputSample &extension_sample)
38{
40 const Brush &brush = *BKE_paint_brush(&paint);
41 const bool invert = this->is_inverted(brush);
42
44 C,
46 const IndexMask &point_mask,
47 const DeltaProjectionFunc &projection_fn) {
49 Array<float2> view_positions = calculate_view_positions(params, point_mask);
50 bke::CurvesGeometry &curves = params.drawing.strokes_for_write();
51 MutableSpan<float3> positions = curves.positions_for_write();
52
53 const float2 target = extension_sample.mouse_position;
54
55 point_mask.foreach_index(GrainSize(4096), [&](const int64_t point_i) {
56 const float2 &co = view_positions[point_i];
57 const float influence = brush_point_influence(
58 paint, brush, co, extension_sample, params.multi_frame_falloff);
59 if (influence <= 0.0f) {
60 return;
61 }
62
63 const float influence_squared = influence * influence / 25.0f;
64 const float influence_final = invert ? 1.0 + influence_squared :
65 1.0f - influence_squared;
66 positions[point_i] += compute_orig_delta(
67 projection_fn, deformation, point_i, (target - co) * (1.0f - influence_final));
68 });
69
70 params.drawing.tag_positions_changed();
71 return true;
72 });
73 this->stroke_extended(extension_sample);
74}
75
76std::unique_ptr<GreasePencilStrokeOperation> new_pinch_operation(const BrushStrokeMode stroke_mode)
77{
78 return std::make_unique<PinchOperation>(stroke_mode);
79}
80
81} // namespace blender::ed::sculpt_paint::greasepencil
Low-level operations for curves.
Low-level operations for grease pencil.
Paint * BKE_paint_get_active_from_context(const bContext *C)
Definition paint.cc:476
Brush * BKE_paint_brush(Paint *paint)
Definition paint.cc:645
#define C
Definition RandGen.cpp:29
long long int int64_t
void foreach_editable_drawing_with_automask(const bContext &C, FunctionRef< bool(const GreasePencilStrokeParams &params, const IndexMask &points)> fn) const
void init_auto_masking(const bContext &C, const InputSample &start_sample)
void on_stroke_extended(const bContext &C, const InputSample &extension_sample) override
void on_stroke_begin(const bContext &C, const InputSample &start_sample) override
void foreach_index(Fn &&fn) const
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
CCL_NAMESPACE_BEGIN ccl_device float invert(const float color, const float factor)
Definition invert.h:11
float brush_point_influence(const Paint &paint, const Brush &brush, const float2 &co, const InputSample &sample, float multi_frame_falloff)
Array< float2 > calculate_view_positions(const GreasePencilStrokeParams &params, const IndexMask &selection)
std::unique_ptr< GreasePencilStrokeOperation > new_pinch_operation(BrushStrokeMode stroke_mode)
bke::crazyspace::GeometryDeformation get_drawing_deformation(const GreasePencilStrokeParams &params)
float3 compute_orig_delta(const DeltaProjectionFunc &projection_fn, const bke::crazyspace::GeometryDeformation &deformation, int index, const float2 &screen_delta)
std::function< float3(const float3 position, const float2 &screen_delta)> DeltaProjectionFunc
VecBase< float, 2 > float2
BrushStrokeMode