Blender V4.3
grease_pencil_sculpt_thickness.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 "BLI_task.hh"
6
7#include "BKE_context.hh"
8#include "BKE_curves.hh"
10#include "BKE_paint.hh"
11
12#include "ED_grease_pencil.hh"
13#include "ED_view3d.hh"
14
15#include "WM_api.hh"
16#include "WM_types.hh"
17
19#include "paint_intern.hh"
20
22
24 public:
26
27 void on_stroke_begin(const bContext &C, const InputSample &start_sample) override;
28 void on_stroke_extended(const bContext &C, const InputSample &extension_sample) override;
29 void on_stroke_done(const bContext & /*C*/) override {}
30};
31
32void ThicknessOperation::on_stroke_begin(const bContext &C, const InputSample &start_sample)
33{
34 this->init_stroke(C, start_sample);
35}
36
37void ThicknessOperation::on_stroke_extended(const bContext &C, const InputSample &extension_sample)
38{
39 const Scene &scene = *CTX_data_scene(&C);
41 const Brush &brush = *BKE_paint_brush(&paint);
42 const bool invert = this->is_inverted(brush);
43
44 const bool is_masking = GPENCIL_ANY_SCULPT_MASK(
45 eGP_Sculpt_SelectMaskFlag(scene.toolsettings->gpencil_selectmode_sculpt));
46
48 IndexMaskMemory selection_memory;
49 const IndexMask selection = point_selection_mask(params, is_masking, selection_memory);
50 if (selection.is_empty()) {
51 return false;
52 }
53
54 Array<float2> view_positions = calculate_view_positions(params, selection);
55 bke::CurvesGeometry &curves = params.drawing.strokes_for_write();
56 BLI_assert(view_positions.size() == curves.points_num());
57 MutableSpan<float> radii = params.drawing.radii_for_write();
58
59 selection.foreach_index(GrainSize(4096), [&](const int64_t point_i) {
60 float &radius = radii[point_i];
61 const float influence = brush_point_influence(
62 scene, brush, view_positions[point_i], extension_sample, params.multi_frame_falloff);
63 /* Factor 1/1000 is used to map arbitrary influence value to a sensible radius. */
64 const float delta_radius = (invert ? -influence : influence) * 0.001f;
65 radius = std::max(radius + delta_radius, 0.0f);
66 });
67
68 curves.tag_radii_changed();
69 return true;
70 });
71 this->stroke_extended(extension_sample);
72}
73
74std::unique_ptr<GreasePencilStrokeOperation> new_thickness_operation(
75 const BrushStrokeMode stroke_mode)
76{
77 return std::make_unique<ThicknessOperation>(stroke_mode);
78}
79
80} // namespace blender::ed::sculpt_paint::greasepencil
Scene * CTX_data_scene(const bContext *C)
Low-level operations for curves.
Low-level operations for grease pencil.
Paint * BKE_paint_get_active_from_context(const bContext *C)
Definition paint.cc:477
Brush * BKE_paint_brush(Paint *paint)
Definition paint.cc:649
#define BLI_assert(a)
Definition BLI_assert.h:50
#define GPENCIL_ANY_SCULPT_MASK(flag)
eGP_Sculpt_SelectMaskFlag
int64_t size() const
Definition BLI_array.hh:245
void foreach_editable_drawing(const bContext &C, FunctionRef< bool(const GreasePencilStrokeParams &params)> fn) const
void on_stroke_begin(const bContext &C, const InputSample &start_sample) override
void on_stroke_extended(const bContext &C, const InputSample &extension_sample) override
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
CCL_NAMESPACE_BEGIN ccl_device float invert(float color, float factor)
Definition invert.h:9
IndexMask point_selection_mask(const GreasePencilStrokeParams &params, const bool use_masking, IndexMaskMemory &memory)
Array< float2 > calculate_view_positions(const GreasePencilStrokeParams &params, const IndexMask &selection)
float brush_point_influence(const Scene &scene, const Brush &brush, const float2 &co, const InputSample &sample, float multi_frame_falloff)
std::unique_ptr< GreasePencilStrokeOperation > new_thickness_operation(BrushStrokeMode stroke_mode)
BrushStrokeMode
__int64 int64_t
Definition stdint.h:89