56 if (active_layer_masking) {
58 if (!grease_pencil.has_active_layer()) {
61 const Layer &active_layer = *grease_pencil.get_active_layer();
63 scene, grease_pencil, active_layer);
72 if (
brush.gpencil_settings ==
nullptr) {
101 const float multi_frame_falloff)
114 return influence_base * brush_falloff;
119 int j =
verts.size() - 1;
122 for (
int i = 0;
i <
verts.size();
i++) {
140 const float multi_frame_falloff)
153 return influence_base * brush_falloff;
158 const float2 &mouse_position,
159 const float pressure,
160 const float multi_frame_falloff,
171 const float radius_squared = radius * radius;
179 selection,
GrainSize(4096), memory, [&](
const int point) {
182 if (distance_squared > radius_squared) {
183 all_influences[point] = 0.0f;
189 all_influences[point] = influence_base * brush_falloff;
190 return all_influences[point] > 0.0f;
195 return influence_mask;
200 const int brush_draw_mode =
brush->gpencil_settings->brush_draw_mode;
202 if (brush_use_pinned_mode) {
223 auto screen_to_world = [=](
const float3 &world_pos,
const float2 &screen_delta) {
231 switch (
params.toolsettings.gp_sculpt.lock_axis) {
233 world_normal = view_to_world.
z_axis();
237 world_normal = layer_to_world.
x_axis();
241 world_normal = layer_to_world.
y_axis();
245 world_normal = layer_to_world.
z_axis();
258 return [=](
const float3 &position,
const float2 &screen_delta) {
260 const float3 world_delta = screen_to_world(world_pos, screen_delta);
262 world_to_layer, world_delta - world_normal *
math::dot(world_delta, world_normal));
263 return position + layer_delta;
270 const float2 &screen_delta)
273 const float3 new_position_eval = projection_fn(old_position_eval, screen_delta);
274 const float3 translation_eval = new_position_eval - old_position_eval;
276 index, translation_eval);
277 return translation_orig;
295 return {*
scene.toolsettings,
309 const bool use_selection_masking,
319 const bool use_selection_masking,
329 const bool use_selection_masking,
334 params.drawing.strokes().curves_range();
357 view_positions[point_i],
360 view_positions[point_i] =
float2(0);
364 return view_positions;
380 view_radii[point_i] = radii[point_i] / pixel_size;
388 return brush.gpencil_settings !=
nullptr &&
394 return brush.gpencil_settings !=
nullptr &&
422 std::atomic<bool> changed =
false;
438 if (
fn(
params, auto_mask_info.point_mask)) {
465 std::atomic<bool> changed =
false;
468 const MutableDrawingInfo &info = drawings[i];
469 const Layer &layer = grease_pencil.layer(info.layer_index);
470 const AutoMaskingInfo &auto_mask_info = this->auto_masking_info_per_drawing[i];
471 const GreasePencilStrokeParams params = GreasePencilStrokeParams::from_context(
479 info.multi_frame_falloff,
482 const DeltaProjectionFunc projection_fn = get_screen_projection_fn(params, object_eval, layer);
483 if (fn(params, auto_mask_info.point_mask, projection_fn)) {
506 bool changed =
false;
546 bool changed =
false;
588 std::atomic<bool> changed =
false;
591 for (const int64_t i : range) {
592 const MutableDrawingInfo &info = drawings[i];
593 GreasePencilStrokeParams params = GreasePencilStrokeParams::from_context(
601 info.multi_frame_falloff,
638 const bool use_sculpt_selection_masking = (sculpt_selection_flag &
646 const bool use_auto_mask_layer = (sculpt_settings_flag &
648 const bool use_auto_mask_material = (sculpt_settings_flag &
650 const bool use_auto_mask_active_material = (sculpt_settings_flag &
653 const float stroke_distance_threshold = 20.0f;
655 const int active_material_index =
math::max(
object.actcol - 1, 0);
662 for (
const int drawing_i : drawings.
index_range()) {
676 params, use_sculpt_selection_masking, automask_info.
memory);
685 if (use_auto_mask_active_material) {
691 return active_material_index == materials[point_i];
700 if (use_auto_mask_layer || use_auto_mask_stroke || use_auto_mask_material) {
705 params, use_sculpt_selection_masking, memory);
707 stroke_selection,
GrainSize(512), memory, [&](
const int curve_i) {
708 for (
const int point_i : points_by_curve[curve_i]) {
710 if (
distance <= stroke_distance_threshold) {
717 if (use_auto_mask_layer && !strokes_under_brush.
is_empty()) {
721 if (use_auto_mask_stroke) {
728 if (use_auto_mask_material) {
732 [&](
const int curve_i) { masked_material_indices.
add(material_indices[curve_i]); });
739 if (use_auto_mask_stroke) {
744 const MutableDrawingInfo &drawing_info = drawings[drawing_i];
745 AutoMaskingInfo &automask_info = this->auto_masking_info_per_drawing[drawing_i];
747 if (use_auto_mask_layer && !masked_layer_indices.contains(drawing_info.layer_index)) {
748 automask_info.point_mask = {};
752 if (use_auto_mask_material) {
758 curves.curves_range(),
GrainSize(1024), memory, [&](
const int curve_i) {
759 return masked_material_indices.
contains(material_indices[curve_i]);
763 automask_info.point_mask,
765 automask_info.memory);
bool BKE_brush_use_alpha_pressure(const Brush *brush)
float BKE_brush_alpha_get(const Paint *paint, const Brush *brush)
float BKE_brush_curve_strength(eBrushCurvePreset preset, const CurveMapping *cumap, float distance, float brush_radius)
bool BKE_brush_use_size_pressure(const Brush *brush)
float BKE_brush_radius_get(const Paint *paint, const Brush *brush)
void BKE_brush_init_gpencil_settings(Brush *brush)
Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
Object * CTX_data_active_object(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
ToolSettings * CTX_data_tool_settings(const bContext *C)
RegionView3D * CTX_wm_region_view3d(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
Low-level operations for curves.
Low-level operations for grease pencil.
Paint * BKE_paint_get_active_from_context(const bContext *C)
Brush * BKE_paint_brush(Paint *paint)
#define BLI_assert_unreachable()
void DEG_id_tag_update(ID *id, unsigned int flags)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
@ GP_BRUSH_MODE_VERTEXCOLOR
@ GPPAINT_FLAG_USE_VERTEXCOLOR
@ GP_SCULPT_SETT_FLAG_AUTOMASK_LAYER_ACTIVE
@ GP_SCULPT_SETT_FLAG_AUTOMASK_STROKE
@ GP_SCULPT_SETT_FLAG_AUTOMASK_MATERIAL_STROKE
@ GP_SCULPT_SETT_FLAG_AUTOMASK_MATERIAL_ACTIVE
@ GP_SCULPT_SETT_FLAG_AUTOMASK_LAYER_STROKE
eGP_Sculpt_SelectMaskFlag
@ GP_SCULPT_MASK_SELECTMODE_POINT
@ GP_SCULPT_MASK_SELECTMODE_STROKE
@ GP_SCULPT_MASK_SELECTMODE_SEGMENT
void ED_view3d_win_to_delta(const ARegion *region, const float xy_delta[2], float zfac, float r_out[3], bool precise=false)
float ED_view3d_pixel_size(const RegionView3D *rv3d, const float co[3])
float ED_view3d_calc_zfac(const RegionView3D *rv3d, const float co[3])
eV3DProjStatus ED_view3d_project_float_global(const ARegion *region, const float co[3], float r_co[2], eV3DProjTest flag)
BPy_StructRNA * depsgraph
IndexRange index_range() const
Span< T > as_span() const
static IndexMask from_predicate(const IndexMask &universe, GrainSize grain_size, IndexMaskMemory &memory, Fn &&predicate)
static IndexMask from_ranges(OffsetIndices< T > offsets, const IndexMask &mask, IndexMaskMemory &memory)
static IndexMask from_intersection(const IndexMask &mask_a, const IndexMask &mask_b, IndexMaskMemory &memory)
bool contains(const Key &key) const
IndexRange index_range() const
void resize(const int64_t new_size)
MutableSpan< T > as_mutable_span()
GAttributeReader lookup_or_default(StringRef attribute_id, AttrDomain domain, AttrType data_type, const void *default_value=nullptr) const
const bke::CurvesGeometry & strokes() const
float4x4 to_world_space(const Object &object) const
Array< AutoMaskingInfo > auto_masking_info_per_drawing
float2 prev_mouse_position
bool is_inverted(const Brush &brush) const
float2 mouse_delta(const InputSample &input_sample) const
blender::ed::greasepencil::MutableDrawingInfo MutableDrawingInfo
void foreach_editable_drawing_with_automask(const bContext &C, FunctionRef< bool(const GreasePencilStrokeParams ¶ms, const IndexMask &points)> fn) const
void stroke_extended(const InputSample &extension_sample)
void init_stroke(const bContext &C, const InputSample &start_sample)
float2 start_mouse_position
void init_auto_masking(const bContext &C, const InputSample &start_sample)
void foreach_editable_drawing(const bContext &C, FunctionRef< bool(const GreasePencilStrokeParams ¶ms, const DeltaProjectionFunc &projection_fn)> fn) const
BrushStrokeMode stroke_mode
int64_t min_array_size() const
void foreach_index(Fn &&fn) const
float distance(VecOp< float, D >, VecOp< float, D >) RET
void gather(const GVArray &src, const IndexMask &indices, GMutableSpan dst, int64_t grain_size=4096)
GeometryDeformation get_evaluated_grease_pencil_drawing_deformation(const Object *ob_eval, const Object &ob_orig, const bke::greasepencil::Drawing &drawing_orig)
IndexMask retrieve_editable_and_selected_strokes(Object &object, const bke::greasepencil::Drawing &drawing, int layer_index, IndexMaskMemory &memory)
IndexMask retrieve_editable_points(Object &object, const bke::greasepencil::Drawing &drawing, int layer_index, IndexMaskMemory &memory)
IndexMask retrieve_editable_and_selected_fill_strokes(Object &object, const bke::greasepencil::Drawing &drawing, int layer_index, IndexMaskMemory &memory)
IndexMask retrieve_editable_and_selected_points(Object &object, const bke::greasepencil::Drawing &drawing, int layer_index, IndexMaskMemory &memory)
Vector< MutableDrawingInfo > retrieve_editable_drawings_from_layer_with_falloff(const Scene &scene, GreasePencil &grease_pencil, const blender::bke::greasepencil::Layer &layer)
Vector< MutableDrawingInfo > retrieve_editable_drawings_with_falloff(const Scene &scene, GreasePencil &grease_pencil)
IndexMask retrieve_editable_strokes(Object &object, const bke::greasepencil::Drawing &drawing, int layer_index, IndexMaskMemory &memory)
IndexMask curve_mask_for_stroke_operation(const GreasePencilStrokeParams ¶ms, bool use_selection_masking, IndexMaskMemory &memory)
Vector< ed::greasepencil::MutableDrawingInfo > get_drawings_for_stroke_operation(const bContext &C)
bool is_brush_inverted(const Brush &brush, BrushStrokeMode stroke_mode)
float closest_distance_to_surface_2d(const float2 pt, const Span< float2 > verts)
IndexMask fill_mask_for_stroke_operation(const GreasePencilStrokeParams ¶ms, bool use_selection_masking, IndexMaskMemory &memory)
Array< float > calculate_view_radii(const GreasePencilStrokeParams ¶ms, const IndexMask &selection)
bool do_vertex_color_fill(const Brush &brush)
IndexMask point_mask_for_stroke_operation(const GreasePencilStrokeParams ¶ms, bool use_selection_masking, IndexMaskMemory &memory)
void init_brush(Brush &brush)
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)
Array< float2 > calculate_view_positions(const GreasePencilStrokeParams ¶ms, const IndexMask &selection)
bool brush_using_vertex_color(const GpPaint *gp_paint, const Brush *brush)
Vector< ed::greasepencil::MutableDrawingInfo > get_drawings_with_masking_for_stroke_operation(const bContext &C)
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 ¶ms)
DeltaProjectionFunc get_screen_projection_fn(const GreasePencilStrokeParams ¶ms, const Object &object, const bke::greasepencil::Layer &layer)
bool do_vertex_color_points(const Brush &brush)
float3 compute_orig_delta(const DeltaProjectionFunc &projection_fn, const bke::crazyspace::GeometryDeformation &deformation, int index, const float2 &screen_delta)
float brush_radius(const Paint &paint, const Brush &brush, float pressure)
std::function< float3(const float3 position, const float2 &screen_delta)> DeltaProjectionFunc
T distance(const T &a, const T &b)
T dot(const QuaternionBase< T > &a, const QuaternionBase< T > &b)
T min(const T &a, const T &b)
CartesianBasis invert(const CartesianBasis &basis)
T distance_squared(const VecBase< T, Size > &a, const VecBase< T, Size > &b)
T max(const T &a, const T &b)
VecBase< T, 3 > transform_direction(const MatBase< T, 3, 3 > &mat, const VecBase< T, 3 > &direction)
VecBase< T, 3 > transform_point(const CartesianBasis &basis, const VecBase< T, 3 > &v)
void parallel_for_each(Range &&range, const Function &function)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
MatBase< float, 4, 4 > float4x4
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
MatBase< float, 3, 3 > float3x3
VecBase< float, 3 > float3
struct ToolSettings * toolsettings
const float multi_frame_falloff
bke::greasepencil::Drawing & drawing
float multi_frame_falloff
const RegionView3D & rv3d
const bke::greasepencil::Layer & layer
static GreasePencilStrokeParams from_context(const Scene &scene, Depsgraph &depsgraph, ARegion ®ion, RegionView3D &rv3d, Object &object, int layer_index, int frame_number, float multi_frame_falloff, bke::greasepencil::Drawing &drawing)
bke::greasepencil::Drawing & drawing
void WM_event_add_notifier(const bContext *C, uint type, void *reference)