Blender V5.0
grease_pencil_sculpt_strength.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_index_mask.hh"
6#include "BLI_task.hh"
7
8#include "BKE_context.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
33{
34 this->init_stroke(C, start_sample);
35 this->init_auto_masking(C, start_sample);
36}
37
38void StrengthOperation::on_stroke_extended(const bContext &C, const InputSample &extension_sample)
39{
41 const Brush &brush = *BKE_paint_brush(&paint);
42 const bool invert = this->is_inverted(brush);
43
45 C, [&](const GreasePencilStrokeParams &params, const IndexMask &point_mask) {
46 Array<float2> view_positions = calculate_view_positions(params, point_mask);
47 MutableSpan<float> opacities = params.drawing.opacities_for_write();
48
49 point_mask.foreach_index(GrainSize(4096), [&](const int64_t point_i) {
50 float &opacity = opacities[point_i];
51 const float influence = brush_point_influence(
52 paint, brush, view_positions[point_i], extension_sample, params.multi_frame_falloff);
53 /* Brush influence mapped to opacity by a factor of 0.125. */
54 const float delta_opacity = (invert ? -influence : influence) * 0.125f;
55 opacity = std::clamp(opacity + delta_opacity, 0.0f, 1.0f);
56 });
57
58 return true;
59 });
60 this->stroke_extended(extension_sample);
61}
62
63std::unique_ptr<GreasePencilStrokeOperation> new_strength_operation(
64 const BrushStrokeMode stroke_mode)
65{
66 return std::make_unique<StrengthOperation>(stroke_mode);
67}
68
69} // namespace blender::ed::sculpt_paint::greasepencil
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
std::unique_ptr< GreasePencilStrokeOperation > new_strength_operation(BrushStrokeMode stroke_mode)
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)
BrushStrokeMode