Blender V5.0
grease_pencil_intern.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
7#include <functional>
8
9#include "BLI_index_mask.hh"
10#include "BLI_task.hh"
11
12#include "DNA_scene_types.h"
13
14#include "ED_grease_pencil.hh"
15
16#include "paint_intern.hh"
17
19class Drawing;
20class Layer;
21} // namespace blender::bke::greasepencil
24}
25
27
34 std::function<float3(const float3 position, const float2 &screen_delta)>;
35
40
42 public:
43 virtual void on_stroke_begin(const bContext &C, const InputSample &start_sample) = 0;
44 virtual void on_stroke_extended(const bContext &C, const InputSample &extension_sample) = 0;
45 virtual void on_stroke_done(const bContext &C) = 0;
46};
47
48namespace greasepencil {
49
50/* Get list of drawings the tool should be operating on. */
53 const bContext &C);
54/* Get the brush radius accounting for pen pressure. */
55float brush_radius(const Paint &paint, const Brush &brush, float pressure);
56
57/* Make sure the brush has all necessary grease pencil settings. */
58void init_brush(Brush &brush);
59
60/* Index mask of all points within the brush radius. */
62 const Brush &brush,
63 const float2 &mouse_position,
64 float pressure,
65 float multi_frame_falloff,
66 const IndexMask &selection,
67 Span<float2> view_positions,
68 Vector<float> &influences,
69 IndexMaskMemory &memory);
70
71/* Influence value at point co for the brush. */
73 const Brush &brush,
74 const float2 &co,
75 const InputSample &sample,
76 float multi_frame_falloff);
83/* Influence value for an entire fill. */
85 const Brush &brush,
86 Span<float2> fill_positions,
87 const InputSample &sample,
88 float multi_frame_falloff);
89
90/* Based on pinning status, decide whether to use vertex color or material mode for brush. */
91bool brush_using_vertex_color(const GpPaint *gp_paint, const Brush *brush);
92
93/* True if influence of the brush should be inverted. */
94bool is_brush_inverted(const Brush &brush, BrushStrokeMode stroke_mode);
95
96/* Common parameters for stroke callbacks that can be passed to utility functions. */
101 const Scene &scene;
109
110 /* NOTE: accessing region in worker threads will return null,
111 * this has to be done on the main thread and passed explicitly. */
113 Depsgraph &depsgraph,
116 Object &object,
117 int layer_index,
118 int frame_number,
121};
122
123/* Point index mask for a drawing based on selection tool settings. */
125 bool use_selection_masking,
126 IndexMaskMemory &memory);
128 bool use_selection_masking,
129 IndexMaskMemory &memory);
131 bool use_selection_masking,
132 IndexMaskMemory &memory);
133
136
137/* Project points from layer space into 2D view space. */
139 const IndexMask &selection);
141 const IndexMask &selection);
142
143/* Get an appropriate projection function from screen space to layer space.
144 * This is an alternative to using the DrawingPlacement. */
146 const Object &object,
147 const bke::greasepencil::Layer &layer);
148
156 const bke::crazyspace::GeometryDeformation &deformation,
157 int index,
158 const float2 &screen_delta);
159
160bool do_vertex_color_points(const Brush &brush);
161bool do_vertex_color_fill(const Brush &brush);
162
163/* Stroke operation base class that performs various common initializations. */
165 public:
168
170
175
176 /* When auto-masking is used, this contains the index mask of the elements that are affected. */
182
187
188 bool is_inverted(const Brush &brush) const;
189 float2 mouse_delta(const InputSample &input_sample) const;
190
191 void init_stroke(const bContext &C, const InputSample &start_sample);
192 void init_auto_masking(const bContext &C, const InputSample &start_sample);
193 void stroke_extended(const InputSample &extension_sample);
194
196 const bContext &C,
197 FunctionRef<bool(const GreasePencilStrokeParams &params, const IndexMask &points)> fn) const;
199 const bContext &C,
201 const IndexMask &points,
202 const DeltaProjectionFunc &projection_fn)> fn) const;
203
205 const bContext &C,
207 const DeltaProjectionFunc &projection_fn)> fn) const;
208
211 const bContext &C, FunctionRef<bool(const GreasePencilStrokeParams &params)> fn) const;
213 const bContext &C,
214 GrainSize grain_size,
215 FunctionRef<bool(const GreasePencilStrokeParams &params)> fn) const;
216};
217
218/* Operations */
219
220std::unique_ptr<GreasePencilStrokeOperation> new_paint_operation(bool do_fill_guides = false);
221std::unique_ptr<GreasePencilStrokeOperation> new_erase_operation(bool temp_eraser = false);
222std::unique_ptr<GreasePencilStrokeOperation> new_tint_operation(bool temp_eraser = false);
223std::unique_ptr<GreasePencilStrokeOperation> new_weight_paint_draw_operation(
224 const BrushStrokeMode &stroke_mode);
225std::unique_ptr<GreasePencilStrokeOperation> new_weight_paint_blur_operation();
226std::unique_ptr<GreasePencilStrokeOperation> new_weight_paint_average_operation();
227std::unique_ptr<GreasePencilStrokeOperation> new_weight_paint_smear_operation();
228std::unique_ptr<GreasePencilStrokeOperation> new_smooth_operation(BrushStrokeMode stroke_mode,
229 bool temp_smooth = false);
230std::unique_ptr<GreasePencilStrokeOperation> new_thickness_operation(BrushStrokeMode stroke_mode);
231std::unique_ptr<GreasePencilStrokeOperation> new_strength_operation(BrushStrokeMode stroke_mode);
232std::unique_ptr<GreasePencilStrokeOperation> new_randomize_operation(BrushStrokeMode stroke_mode);
233std::unique_ptr<GreasePencilStrokeOperation> new_grab_operation(BrushStrokeMode stroke_mode);
234std::unique_ptr<GreasePencilStrokeOperation> new_push_operation(BrushStrokeMode stroke_mode);
235std::unique_ptr<GreasePencilStrokeOperation> new_pinch_operation(BrushStrokeMode stroke_mode);
236std::unique_ptr<GreasePencilStrokeOperation> new_twist_operation(BrushStrokeMode stroke_mode);
237std::unique_ptr<GreasePencilStrokeOperation> new_clone_operation(BrushStrokeMode stroke_mode);
238std::unique_ptr<GreasePencilStrokeOperation> new_vertex_average_operation();
239std::unique_ptr<GreasePencilStrokeOperation> new_vertex_blur_operation();
240std::unique_ptr<GreasePencilStrokeOperation> new_vertex_paint_operation(
241 BrushStrokeMode stroke_mode);
242std::unique_ptr<GreasePencilStrokeOperation> new_vertex_replace_operation();
243std::unique_ptr<GreasePencilStrokeOperation> new_vertex_smear_operation();
244
245} // namespace greasepencil
246
247} // namespace blender::ed::sculpt_paint
#define C
Definition RandGen.cpp:29
BPy_StructRNA * depsgraph
virtual void on_stroke_extended(const bContext &C, const InputSample &extension_sample)=0
virtual void on_stroke_begin(const bContext &C, const InputSample &start_sample)=0
virtual void on_stroke_done(const bContext &C)=0
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 foreach_editable_drawing(const bContext &C, FunctionRef< bool(const GreasePencilStrokeParams &params, const DeltaProjectionFunc &projection_fn)> fn) const
void foreach_editable_drawing_with_automask(const bContext &C, FunctionRef< bool(const GreasePencilStrokeParams &params, const IndexMask &points, const DeltaProjectionFunc &projection_fn)> fn) const
static float verts[][3]
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
IndexMask curve_mask_for_stroke_operation(const GreasePencilStrokeParams &params, bool use_selection_masking, IndexMaskMemory &memory)
std::unique_ptr< GreasePencilStrokeOperation > new_vertex_replace_operation()
Vector< ed::greasepencil::MutableDrawingInfo > get_drawings_for_stroke_operation(const bContext &C)
std::unique_ptr< GreasePencilStrokeOperation > new_erase_operation(const bool temp_eraser)
bool is_brush_inverted(const Brush &brush, BrushStrokeMode stroke_mode)
std::unique_ptr< GreasePencilStrokeOperation > new_weight_paint_average_operation()
float closest_distance_to_surface_2d(const float2 pt, const Span< float2 > verts)
std::unique_ptr< GreasePencilStrokeOperation > new_strength_operation(BrushStrokeMode stroke_mode)
IndexMask fill_mask_for_stroke_operation(const GreasePencilStrokeParams &params, bool use_selection_masking, IndexMaskMemory &memory)
std::unique_ptr< GreasePencilStrokeOperation > new_grab_operation(BrushStrokeMode stroke_mode)
Array< float > calculate_view_radii(const GreasePencilStrokeParams &params, const IndexMask &selection)
std::unique_ptr< GreasePencilStrokeOperation > new_weight_paint_blur_operation()
std::unique_ptr< GreasePencilStrokeOperation > new_tint_operation(bool temp_eraser=false)
std::unique_ptr< GreasePencilStrokeOperation > new_vertex_paint_operation(BrushStrokeMode stroke_mode)
IndexMask point_mask_for_stroke_operation(const GreasePencilStrokeParams &params, bool use_selection_masking, IndexMaskMemory &memory)
std::unique_ptr< GreasePencilStrokeOperation > new_paint_operation(bool do_fill_guides=false)
IndexMask brush_point_influence_mask(const Paint &paint, const Brush &brush, const float2 &mouse_position, float pressure, float multi_frame_falloff, const IndexMask &selection, Span< float2 > view_positions, Vector< float > &influences, IndexMaskMemory &memory)
float brush_point_influence(const Paint &paint, const Brush &brush, const float2 &co, const InputSample &sample, float multi_frame_falloff)
std::unique_ptr< GreasePencilStrokeOperation > new_clone_operation(BrushStrokeMode stroke_mode)
std::unique_ptr< GreasePencilStrokeOperation > new_randomize_operation(BrushStrokeMode stroke_mode)
Array< float2 > calculate_view_positions(const GreasePencilStrokeParams &params, const IndexMask &selection)
std::unique_ptr< GreasePencilStrokeOperation > new_vertex_blur_operation()
bool brush_using_vertex_color(const GpPaint *gp_paint, const Brush *brush)
std::unique_ptr< GreasePencilStrokeOperation > new_weight_paint_draw_operation(const BrushStrokeMode &stroke_mode)
Vector< ed::greasepencil::MutableDrawingInfo > get_drawings_with_masking_for_stroke_operation(const bContext &C)
std::unique_ptr< GreasePencilStrokeOperation > new_thickness_operation(BrushStrokeMode stroke_mode)
std::unique_ptr< GreasePencilStrokeOperation > new_pinch_operation(BrushStrokeMode stroke_mode)
std::unique_ptr< GreasePencilStrokeOperation > new_push_operation(BrushStrokeMode stroke_mode)
float brush_fill_influence(const Paint &paint, const Brush &brush, Span< float2 > fill_positions, const InputSample &sample, float multi_frame_falloff)
bke::crazyspace::GeometryDeformation get_drawing_deformation(const GreasePencilStrokeParams &params)
std::unique_ptr< GreasePencilStrokeOperation > new_weight_paint_smear_operation()
DeltaProjectionFunc get_screen_projection_fn(const GreasePencilStrokeParams &params, const Object &object, const bke::greasepencil::Layer &layer)
std::unique_ptr< GreasePencilStrokeOperation > new_vertex_average_operation()
std::unique_ptr< GreasePencilStrokeOperation > new_twist_operation(BrushStrokeMode stroke_mode)
float3 compute_orig_delta(const DeltaProjectionFunc &projection_fn, const bke::crazyspace::GeometryDeformation &deformation, int index, const float2 &screen_delta)
std::unique_ptr< GreasePencilStrokeOperation > new_vertex_smear_operation()
float brush_radius(const Paint &paint, const Brush &brush, float pressure)
std::function< float3(const float3 position, const float2 &screen_delta)> DeltaProjectionFunc
std::unique_ptr< CurvesSculptStrokeOperation > new_smooth_operation()
VecBase< float, 2 > float2
VecBase< float, 3 > float3
BrushStrokeMode
static GreasePencilStrokeParams from_context(const Scene &scene, Depsgraph &depsgraph, ARegion &region, RegionView3D &rv3d, Object &object, int layer_index, int frame_number, float multi_frame_falloff, bke::greasepencil::Drawing &drawing)