Blender V5.0
grease_pencil_vertex_blur.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_brush.hh"
6#include "BKE_context.hh"
7#include "BKE_curves.hh"
9#include "BKE_paint.hh"
10
12
14
15class VertexBlurOperation : public GreasePencilStrokeOperationCommon {
17
18 public:
19 void on_stroke_begin(const bContext &C, const InputSample &start_sample) override;
20 void on_stroke_extended(const bContext &C, const InputSample &extension_sample) override;
21 void on_stroke_done(const bContext &C) override;
22};
23
25{
26 this->init_stroke(C, start_sample);
27 this->on_stroke_extended(C, start_sample);
28}
29
31 const InputSample &extension_sample)
32{
33 const Scene &scene = *CTX_data_scene(&C);
35 const Brush &brush = *BKE_paint_brush(&paint);
36 const float radius = brush_radius(paint, brush, extension_sample.pressure);
37 const float radius_squared = radius * radius;
38
39 const bool use_selection_masking = ED_grease_pencil_any_vertex_mask_selection(
40 scene.toolsettings);
41
43 IndexMaskMemory memory;
44 const IndexMask stroke_selection = curve_mask_for_stroke_operation(
45 params, use_selection_masking, memory);
46 if (stroke_selection.is_empty()) {
47 return false;
48 }
49 const IndexMask point_selection = point_mask_for_stroke_operation(
50 params, use_selection_masking, memory);
51 const Array<float2> view_positions = calculate_view_positions(params, point_selection);
52 const OffsetIndices<int> points_by_curve = params.drawing.strokes().points_by_curve();
53 MutableSpan<ColorGeometry4f> vertex_colors = params.drawing.vertex_colors_for_write();
54 stroke_selection.foreach_index(GrainSize(1024), [&](const int64_t curve) {
55 const IndexRange points = points_by_curve[curve];
56
57 float3 average_color(0.0f);
58 int color_count = 0;
59 for (const int point : points) {
60 const ColorGeometry4f color = vertex_colors[point];
61 const float distance = math::distance_squared(extension_sample.mouse_position,
62 view_positions[point]);
63 if (color.a > 0.0f && distance < radius_squared) {
64 average_color += float3(color.r, color.g, color.b);
65 color_count++;
66 }
67 }
68
69 if (color_count == 0) {
70 return;
71 }
72 average_color = average_color / color_count;
73 const ColorGeometry4f mix_color(average_color.x, average_color.y, average_color.z, 1.0f);
74
75 for (const int point : points) {
76 const float influence = brush_point_influence(
77 paint, brush, view_positions[point], extension_sample, params.multi_frame_falloff);
78 ColorGeometry4f &color = vertex_colors[point];
79 if (color.a > 0.0f && influence > 0.0f) {
80 color = math::interpolate(color, mix_color, influence);
81 }
82 }
83 });
84 return true;
85 });
86}
87
89
90std::unique_ptr<GreasePencilStrokeOperation> new_vertex_blur_operation()
91{
92 return std::make_unique<VertexBlurOperation>();
93}
94
95} // 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: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(const bContext &C, FunctionRef< bool(const GreasePencilStrokeParams &params, const DeltaProjectionFunc &projection_fn)> 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
void foreach_index(Fn &&fn) const
float distance(VecOp< float, D >, VecOp< float, D >) RET
bool ED_grease_pencil_any_vertex_mask_selection(const ToolSettings *tool_settings)
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
IndexMask curve_mask_for_stroke_operation(const GreasePencilStrokeParams &params, bool use_selection_masking, IndexMaskMemory &memory)
IndexMask point_mask_for_stroke_operation(const GreasePencilStrokeParams &params, bool use_selection_masking, IndexMaskMemory &memory)
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_vertex_blur_operation()
float brush_radius(const Paint &paint, const Brush &brush, float pressure)
T interpolate(const T &a, const T &b, const FactorT &t)
T distance_squared(const VecBase< T, Size > &a, const VecBase< T, Size > &b)
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
VecBase< float, 3 > float3
struct ToolSettings * toolsettings