114 attributes.
remove(
".sculpt_persistent_co");
115 attributes.remove(
".sculpt_persistent_no");
116 attributes.remove(
".sculpt_persistent_disp");
119 if (positions.sharing_info && positions.varray.is_span()) {
120 attributes.add<
float3>(
".sculpt_persistent_co",
123 *positions.sharing_info));
126 attributes.add<
float3>(
".sculpt_persistent_co",
132 attributes.add<
float3>(
".sculpt_persistent_no",
141 ot->
name =
"Set Persistent Base";
142 ot->
idname =
"SCULPT_OT_set_persistent_base";
143 ot->
description =
"Reset the copy of the mesh that is being sculpted on";
177 ot->
description =
"Recalculate the sculpt BVH to improve performance";
228 switch (pbvh->
type()) {
245 "symmetrize input=%avef direction=%i dist=%f use_shapekey=%b",
288 ot->
idname =
"SCULPT_OT_symmetrize";
298 std::numeric_limits<float>::max(),
300 "Distance within which symmetrical vertices are merged",
319 if (ob.
sculpt !=
nullptr) {
322 ob.
sculpt = MEM_new<SculptSession>(__func__);
337 if (mesh.attributes().contains(
".sculpt_face_set")) {
381 const bool force_dyntopo,
389 mesh->runtime->corner_tris_cache.freeze();
392 ob.
mode |= mode_flag;
398 reports,
RPT_WARNING,
"Object has non-uniform scale, sculpting may be unpredictable");
414 const char *message_unsupported =
nullptr;
415 if (mesh->corners_num != mesh->faces_num * 3) {
416 message_unsupported =
RPT_(
"non-triangle face");
418 else if (mmd !=
nullptr) {
419 message_unsupported =
RPT_(
"multi-res modifier");
427 message_unsupported =
RPT_(
"vertex data");
430 message_unsupported =
RPT_(
"edge data");
433 message_unsupported =
RPT_(
"face data");
436 message_unsupported =
RPT_(
"constructive modifier");
443 if ((message_unsupported ==
nullptr) || force_dyntopo) {
446 const bool has_undo = wm->
undo_stack !=
nullptr;
459 reports,
RPT_WARNING,
"Dynamic Topology found: %s, disabled", message_unsupported);
460 mesh->flag &= ~ME_SCULPT_DYNAMIC_TOPOLOGY;
485 mesh->runtime->corner_tris_cache.unfreeze();
492 const int flush_recalc = ed_object_sculptmode_flush_recalc_flag(scene, ob, mmd);
512 ob.
mode &= ~mode_flag;
546 const bool is_mode_set = (ob.
mode & mode_flag) != 0;
564 if (ob.
mode & mode_flag) {
591 ot->
idname =
"SCULPT_OT_sculptmode_toggle";
628 const Span<int> corner_verts = mesh.corner_verts();
632 float4 active_vertex_color;
633 if (!color_attribute || std::holds_alternative<std::monostate>(ss.
active_vert())) {
634 active_vertex_color =
float4(1.0f);
657 ot->
name =
"Sample Color";
658 ot->
idname =
"SCULPT_OT_sample_color";
659 ot->
description =
"Sample the vertex color of the active vertex";
684#define MASK_BY_COLOR_SLOPE 0.25f
688 const float threshold,
698 else if (
len >= threshold) {
712 const float new_mask,
714 const bool preserve_mask)
718 return std::min(current_mask, new_mask);
720 return std::max(current_mask, new_mask);
728 const float threshold,
730 const bool preserve_mask)
733 const Mesh &mesh = *
static_cast<const Mesh *
>(
object.data);
743 flood.add_initial(vert);
745 flood.execute(
object, vert_to_face_map, [&](
int ,
int to_v) {
749 current_color.
xyz(), active_color.
xyz(), threshold,
invert);
750 new_mask[to_v] = new_vertex_mask;
754 return len <= threshold;
762 for (
const int i :
verts.index_range()) {
771 const float threshold,
773 const bool preserve_mask)
776 const Mesh &mesh = *
static_cast<const Mesh *
>(
object.data);
787 for (
const int i :
verts.index_range()) {
789 const float current_mask = node_masks[i];
791 active_color.xyz(), current_color.
xyz(), threshold,
invert);
836 const int active_vert = std::get<int>(ss.
active_vert());
854 ot->
name =
"Mask by Color";
855 ot->
idname =
"SCULPT_OT_mask_by_color";
856 ot->
description =
"Creates a mask based on the active color attribute";
864 ot->
srna,
"contiguous",
false,
"Contiguous",
"Mask only contiguous color areas");
869 "preserve_previous_mask",
871 "Preserve Previous Mask",
872 "Preserve the previous mask and add or subtract the new one generated by the colors");
880 "How much changes in color affect the mask generation",
905 {0,
nullptr, 0,
nullptr,
nullptr},
915 "Use settings from operator properties"},
918 {0,
nullptr, 0,
nullptr,
nullptr}};
935 new_mask[i] = node_mask[i] * new_mask[i];
940 new_mask[i] = new_mask[i] > 0.00001f ? node_mask[i] / new_mask[i] : 0.0f;
945 new_mask[i] = node_mask[i] + new_mask[i];
950 new_mask[i] = node_mask[i] - new_mask[i];
963 const bool invert_automask,
980 if (invert_automask) {
999 const bool invert_automask,
1017 new_mask.
fill(1.0f);
1020 if (invert_automask) {
1039 const float invert_automask,
1053 new_mask.
fill(1.0f);
1056 if (invert_automask) {
1077 const bool invert_automask)
1080 switch (pbvh.
type()) {
1082 Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
1106 SubdivCCG &subdiv_ccg = *
object.sculpt->subdiv_ccg;
1113 depsgraph,
object, automasking, mode, factor, invert_automask, nodes[i], tls);
1125 depsgraph,
object, automasking, mode, factor, invert_automask, nodes[i], tls);
1215 Brush brush_copy = dna::shallow_copy(*brush);
1223 *
depsgraph, scene_copy, &brush_copy, ob);
1247 Sculpt *sd = scene->toolsettings ? scene->toolsettings->sculpt :
nullptr;
1269 layout, &sculpt_ptr,
"automasking_cavity_curve_op",
'v',
false,
false,
false,
false);
1284 ot->
name =
"Mask From Cavity";
1285 ot->
idname =
"SCULPT_OT_mask_from_cavity";
1286 ot->
description =
"Creates a mask based on the curvature of the surface";
1301 "Use settings from here");
1308 "The contrast of the cavity mask",
1317 "The number of times the cavity mask is blurred",
1362 switch (boundary_mode) {
1371 "propagation_steps");
1398 Brush brush_copy = dna::shallow_copy(*brush);
1405 *
depsgraph, scene_copy, &brush_copy, ob);
1429 Sculpt *sd = scene->toolsettings ? scene->toolsettings->sculpt :
nullptr;
1457 ot->
name =
"Mask From Boundary";
1458 ot->
idname =
"SCULPT_OT_mask_from_boundary";
1459 ot->
description =
"Creates a mask based on the boundaries of the surface";
1474 "Use settings from here");
1481 "Calculate the boundary mask based on disconnected mesh topology islands"},
1486 "Calculate the boundary mask between face sets"},
1487 {0,
nullptr, 0,
nullptr,
nullptr}};
1491 mask_boundary_modes,
1494 "Boundary type to mask");
1495 RNA_def_int(
ot->
srna,
"propagation_steps", 1, 1, 20,
"Propagation Steps",
"", 1, 20);
void BKE_brush_color_set(Scene *scene, const Paint *paint, Brush *brush, const float color[3])
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
Object * CTX_data_active_object(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Base * CTX_data_active_base(const bContext *C)
Main * CTX_data_main(const bContext *C)
ToolSettings * CTX_data_tool_settings(const bContext *C)
Depsgraph * CTX_data_depsgraph_on_load(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
wmMsgBus * CTX_wm_message_bus(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
int CustomData_get_offset_named(const CustomData *data, eCustomDataType type, blender::StringRef name)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
bool BKE_base_is_visible(const View3D *v3d, const Base *base)
Object * BKE_view_layer_active_object_get(const ViewLayer *view_layer)
void BKE_mesh_batch_cache_dirty_tag(Mesh *mesh, eMeshBatchDirtyMode mode)
Mesh * BKE_mesh_from_object(Object *ob)
@ BKE_MESH_BATCH_DIRTY_ALL
void BKE_mesh_mirror_apply_mirror_on_axis(Main *bmain, Mesh *mesh, int axis, float dist)
void multires_flush_sculpt_updates(Object *object)
General operations, lookup, etc. for blender objects.
void BKE_object_free_derived_caches(Object *ob)
void BKE_sculptsession_free(Object *ob)
const Brush * BKE_paint_brush_for_read(const Paint *paint)
Paint * BKE_paint_get_active_from_paintmode(Scene *sce, PaintMode mode)
void BKE_paint_init(Main *bmain, Scene *sce, PaintMode mode, const uchar col[3], bool ensure_brushes=true)
MultiresModifierData * BKE_sculpt_multires_active(const Scene *scene, Object *ob)
void BKE_sculpt_update_object_for_edit(Depsgraph *depsgraph, Object *ob_orig, bool is_paint_tool)
void BKE_sculpt_color_layer_create_if_needed(Object *object)
const uchar PAINT_CURSOR_SCULPT[3]
void BKE_sculptsession_free_pbvh(Object &object)
Brush * BKE_paint_brush(Paint *paint)
void BKE_sculpt_toolsettings_data_ensure(Main *bmain, Scene *scene)
void BKE_sculpt_mask_layers_ensure(Depsgraph *depsgraph, Main *bmain, Object *ob, MultiresModifierData *mmd)
void BKE_paint_brushes_validate(Main *bmain, Paint *paint)
A BVH for high poly meshes.
const blender::Set< BMVert *, 0 > & BKE_pbvh_bmesh_node_unique_verts(blender::bke::pbvh::BMeshNode *node)
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_report(ReportList *reports, eReportType type, const char *message)
void BKE_scene_graph_evaluated_ensure(Depsgraph *depsgraph, Main *bmain)
CCGKey BKE_subdiv_ccg_key_top_level(const SubdivCCG &subdiv_ccg)
#define BLI_assert_unreachable()
bool is_negative_m4(const float mat[4][4])
MINLINE void copy_v3_v3(float r[3], const float a[3])
void DEG_id_tag_update(ID *id, unsigned int flags)
@ BRUSH_AUTOMASKING_CAVITY_NORMAL
@ BRUSH_AUTOMASKING_BOUNDARY_EDGES
@ BRUSH_AUTOMASKING_CAVITY_USE_CURVE
@ BRUSH_AUTOMASKING_BOUNDARY_FACE_SETS
@ BRUSH_AUTOMASKING_CAVITY_ALL
@ BRUSH_AUTOMASKING_CAVITY_INVERTED
@ SCULPT_BRUSH_TYPE_SMOOTH
These structs are the foundation for all linked lists in the library system.
@ ME_SCULPT_DYNAMIC_TOPOLOGY
Object is a sort of wrapper for general info.
@ V3D_SHADING_VERTEX_COLOR
void ED_paint_cursor_start(Paint *paint, bool(*poll)(bContext *C))
bool ED_operator_object_active_editable_mesh(bContext *C)
BLI_INLINE void IMB_colormanagement_scene_linear_to_srgb_v3(float srgb[3], const float scene_linear[3])
Read Guarded memory(de)allocation.
void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, const char *propname, int type, bool levels, bool brush, bool neg_slope, bool tone)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
@ OPTYPE_DEPENDS_ON_CURSOR
void BM_log_all_added(BMesh *bm, BMLog *log)
void BM_log_before_all_removed(BMesh *bm, BMLog *log)
void BM_mesh_elem_hflag_disable_all(BMesh *bm, const char htype, const char hflag, const bool respecthide)
void BM_mesh_toolflags_set(BMesh *bm, bool use_toolflags)
bool BMO_op_callf(BMesh *bm, int flag, const char *fmt,...)
#define BMO_FLAG_DEFAULTS
constexpr void fill(const T &value) const
constexpr Span< T > as_span() const
constexpr int64_t size() const
constexpr IndexRange index_range() const
void resize(const int64_t new_size)
bool remove(const StringRef attribute_id)
Span< NodeT > nodes() const
void tag_masks_changed(const IndexMask &node_mask)
void foreach_index(Fn &&fn) const
const Depsgraph * depsgraph
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
CCL_NAMESPACE_BEGIN ccl_device float invert(float color, float factor)
pbvh::Tree * pbvh_get(Object &object)
IndexMask all_leaf_nodes(const Tree &pbvh, IndexMaskMemory &memory)
void node_update_mask_bmesh(int mask_offset, BMeshNode &node)
void node_update_mask_mesh(Span< float > mask, MeshNode &node)
void node_update_mask_grids(const CCGKey &key, Span< float > masks, GridsNode &node)
Bounds< float3 > bounds_get(const Tree &pbvh)
Span< float3 > vert_normals_eval(const Depsgraph &depsgraph, const Object &object_orig)
bool mode_compat_set(bContext *C, Object *ob, eObjectMode mode, ReportList *reports)
void calc_grids_factors(const Depsgraph &depsgraph, const Object &object, const Cache &cache, const bke::pbvh::GridsNode &node, Span< int > grids, MutableSpan< float > factors)
std::unique_ptr< Cache > cache_init(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob)
void calc_vert_factors(const Depsgraph &depsgraph, const Object &object, const Cache &cache, const bke::pbvh::MeshNode &node, Span< int > verts, MutableSpan< float > factors)
void SCULPT_OT_cloth_filter(wmOperatorType *ot)
float4 color_vert_get(OffsetIndices< int > faces, Span< int > corner_verts, GroupedSpan< int > vert_to_face_map, GSpan color_attribute, bke::AttrDomain color_domain, int vert)
void SCULPT_OT_color_filter(wmOperatorType *ot)
bke::GAttributeReader active_color_attribute(const Mesh &mesh)
void enable_ex(Main &bmain, Depsgraph &depsgraph, Object &ob)
void SCULPT_OT_detail_flood_fill(wmOperatorType *ot)
void disable_with_undo(Main &bmain, Depsgraph &depsgraph, Scene &scene, Object &ob)
void SCULPT_OT_sample_detail_size(wmOperatorType *ot)
void triangulate(BMesh *bm)
WarnFlag check_attribute_warning(Scene &scene, Object &ob)
void SCULPT_OT_dynamic_topology_toggle(wmOperatorType *ot)
void SCULPT_OT_dyntopo_detail_size_edit(wmOperatorType *ot)
void SCULPT_OT_expand(wmOperatorType *ot)
int find_next_available_id(Object &object)
void SCULPT_OT_face_set_lasso_gesture(wmOperatorType *ot)
void initialize_none_to_id(Mesh *mesh, int new_id)
void SCULPT_OT_face_set_line_gesture(wmOperatorType *ot)
void SCULPT_OT_face_set_polyline_gesture(wmOperatorType *ot)
void SCULPT_OT_face_sets_init(wmOperatorType *ot)
void SCULPT_OT_face_sets_create(wmOperatorType *ot)
void SCULPT_OT_face_set_change_visibility(wmOperatorType *ot)
void SCULPT_OT_face_sets_randomize_colors(wmOperatorType *ot)
void SCULPT_OT_face_sets_edit(wmOperatorType *ot)
void SCULPT_OT_face_set_box_gesture(wmOperatorType *ot)
void SCULPT_OT_mesh_filter(wmOperatorType *ot)
wmKeyMap * modal_keymap(wmKeyConfig *keyconf)
static float color_delta_get(const float3 &color_a, const float3 &color_b, const float threshold, const bool invert)
static void apply_mask_from_settings(const Depsgraph &depsgraph, Object &object, bke::pbvh::Tree &pbvh, const IndexMask &node_mask, const auto_mask::Cache &automasking, const ApplyMaskMode mode, const float factor, const bool invert_automask)
void SCULPT_OT_mask_filter(wmOperatorType *ot)
void scatter_mask_grids(const Span< float > mask, SubdivCCG &subdiv_ccg, const Span< int > grids)
static void apply_mask_mesh(const Depsgraph &depsgraph, const Object &object, const Span< bool > hide_vert, const auto_mask::Cache &automasking, const ApplyMaskMode mode, const float factor, const bool invert_automask, const bke::pbvh::MeshNode &node, LocalData &tls, const MutableSpan< float > mask)
static void apply_mask_grids(const Depsgraph &depsgraph, Object &object, const auto_mask::Cache &automasking, const ApplyMaskMode mode, const float factor, const bool invert_automask, const bke::pbvh::GridsNode &node, LocalData &tls)
static EnumPropertyItem mix_modes[]
static void mask_from_cavity_ui(bContext *C, wmOperator *op)
static int mask_from_cavity_exec(bContext *C, wmOperator *op)
void mix_new_masks(const Span< float > new_masks, const Span< float > factors, const MutableSpan< float > masks)
static int mask_from_boundary_exec(bContext *C, wmOperator *op)
void update_mask_mesh(const Depsgraph &depsgraph, Object &object, const IndexMask &node_mask, FunctionRef< void(MutableSpan< float >, Span< int >)> update_fn)
void SCULPT_OT_mask_init(wmOperatorType *ot)
static int mask_by_color_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void SCULPT_OT_mask_by_color(wmOperatorType *ot)
void scatter_mask_bmesh(const Span< float > mask, const BMesh &bm, const Set< BMVert *, 0 > &verts)
void gather_mask_bmesh(const BMesh &bm, const Set< BMVert *, 0 > &verts, const MutableSpan< float > r_mask)
static void mask_by_color_full_mesh(const Depsgraph &depsgraph, Object &object, const int vert, const float threshold, const bool invert, const bool preserve_mask)
static void calc_new_masks(const ApplyMaskMode mode, const Span< float > node_mask, const MutableSpan< float > new_mask)
static void mask_from_boundary_ui(bContext *C, wmOperator *op)
static void apply_mask_bmesh(const Depsgraph &depsgraph, Object &object, const auto_mask::Cache &automasking, const ApplyMaskMode mode, const float factor, const float invert_automask, bke::pbvh::BMeshNode &node, LocalData &tls)
static void mask_by_color_contiguous_mesh(const Depsgraph &depsgraph, Object &object, const int vert, const float threshold, const bool invert, const bool preserve_mask)
void invert_mask(const MutableSpan< float > masks)
void gather_mask_grids(const SubdivCCG &subdiv_ccg, const Span< int > grids, const MutableSpan< float > r_mask)
static void SCULPT_OT_mask_from_cavity(wmOperatorType *ot)
static EnumPropertyItem settings_sources[]
static void SCULPT_OT_mask_from_boundary(wmOperatorType *ot)
static float final_mask_get(const float current_mask, const float new_mask, const bool invert, const bool preserve_mask)
void clamp_mask(const MutableSpan< float > masks)
void SCULPT_OT_project_line_gesture(wmOperatorType *ot)
void SCULPT_OT_trim_lasso_gesture(wmOperatorType *ot)
void SCULPT_OT_trim_box_gesture(wmOperatorType *ot)
void SCULPT_OT_trim_line_gesture(wmOperatorType *ot)
void SCULPT_OT_trim_polyline_gesture(wmOperatorType *ot)
void push_end(Object &ob)
void push_nodes(const Depsgraph &depsgraph, Object &object, const IndexMask &node_mask, const Type type)
void push_node(const Depsgraph &depsgraph, const Object &object, const bke::pbvh::Node *node, Type type)
void push_begin_ex(const Scene &, Object &ob, const char *name)
void geometry_begin(const Scene &scene, Object &ob, const wmOperator *op)
void geometry_end(Object &ob)
void push_begin(const Scene &scene, Object &ob, const wmOperator *op)
void object_sculpt_mode_enter(Main &bmain, Depsgraph &depsgraph, Scene &scene, Object &ob, bool force_dyntopo, ReportList *reports)
static bool no_multires_poll(bContext *C)
static void init_sculpt_mode_session(Main &bmain, Depsgraph &depsgraph, Scene &scene, Object &ob)
static void SCULPT_OT_symmetrize(wmOperatorType *ot)
void keymap_sculpt(wmKeyConfig *keyconf)
void flush_update_done(const bContext *C, Object &ob, UpdateType update_type)
static void SCULPT_OT_sculptmode_toggle(wmOperatorType *ot)
void ensure_valid_pivot(const Object &ob, Scene &scene)
void operatortypes_sculpt()
void scale_factors(MutableSpan< float > factors, float strength)
static void SCULPT_OT_sample_color(wmOperatorType *ot)
void object_sculpt_mode_exit(Main &bmain, Depsgraph &depsgraph, Scene &scene, Object &ob)
static void SCULPT_OT_set_persistent_base(wmOperatorType *ot)
static void SCULPT_OT_optimize(wmOperatorType *ot)
static int symmetrize_exec(bContext *C, wmOperator *op)
void scatter_data_mesh(Span< T > src, Span< int > indices, MutableSpan< T > dst)
void SCULPT_OT_brush_stroke(wmOperatorType *ot)
static int set_persistent_base_exec(bContext *C, wmOperator *)
void gather_data_mesh(Span< T > src, Span< int > indices, MutableSpan< T > dst)
static int sculpt_mode_toggle_exec(bContext *C, wmOperator *op)
static int sample_color_invoke(bContext *C, wmOperator *op, const wmEvent *)
static int optimize_exec(bContext *C, wmOperator *)
void fill_factor_from_hide(Span< bool > hide_vert, Span< int > verts, MutableSpan< float > r_factors)
void SCULPT_OT_set_pivot_position(wmOperatorType *ot)
T distance(const T &a, const T &b)
T midpoint(const T &a, const T &b)
VecBase< T, 3 > transform_point(const CartesianBasis &basis, const VecBase< T, 3 > &v)
VecBase< float, 4 > float4
void paint_cursor_delete_textures()
int RNA_int_get(PointerRNA *ptr, const char *name)
float RNA_float_get(PointerRNA *ptr, const char *name)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_float(StructOrFunctionRNA *cont_, const char *identifier, const float default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_ui_range(PropertyRNA *prop, double min, double max, double step, int precision)
PropertyRNA * RNA_def_int(StructOrFunctionRNA *cont_, const char *identifier, const int default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
bool SCULPT_brush_cursor_poll(bContext *C)
bool SCULPT_cursor_geometry_info_update(bContext *C, SculptCursorGeometryInfo *out, const float mval[2], bool use_sampled_normal)
void SCULPT_vertex_random_access_ensure(Object &object)
bool SCULPT_mode_poll(bContext *C)
bool SCULPT_handles_colors_report(const Object &object, ReportList *reports)
void SCULPT_tag_update_overlays(bContext *C)
#define MASK_BY_COLOR_SLOPE
float automasking_cavity_factor
int automasking_cavity_blur_steps
int automasking_boundary_edges_propagation_steps
struct CurveMapping * automasking_cavity_curve
struct SculptSession * sculpt
ActiveVert active_vert() const
int automasking_boundary_edges_propagation_steps
float automasking_cavity_factor
int automasking_cavity_blur_steps
struct CurveMapping * automasking_cavity_curve_op
struct CurveMapping * automasking_cavity_curve
blender::Array< float > masks
float average_stroke_accum[3]
int average_stroke_counter
VecBase< T, 3 > xyz() const
bool(* poll)(bContext *C) ATTR_WARN_UNUSED_RESULT
int(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
int(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
void(* ui)(bContext *C, wmOperator *op)
struct ReportList * reports
struct UndoStack * undo_stack
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
#define WM_msg_publish_rna_prop(mbus, id_, data_, type_, prop_)
void WM_operatortype_append(void(*opfunc)(wmOperatorType *))